From baee1a4d6b365a3055e44ce7d68166fc3f1cff7e Mon Sep 17 00:00:00 2001 From: richardbarry Date: Tue, 5 Jun 2007 09:43:26 +0000 Subject: [PATCH] Update to V4.3.0 as described in http://www.FreeRTOS.org/History.txt git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@84 1d2547de-c912-0410-9cb9-b8ca96c0e9e2 --- Demo/CORTEX_LM3S2965_GCC/FreeRTOSConfig.h | 80 + .../LuminaryDrivers/LM3Sxxx.h | 64 + .../LuminaryDrivers/LM3Sxxxx.h | 70 + .../LuminaryDrivers/_flash.h | 78 + .../LuminaryDrivers/_timer.h | 137 ++ .../CORTEX_LM3S2965_GCC/LuminaryDrivers/adc.h | 130 ++ .../CORTEX_LM3S2965_GCC/LuminaryDrivers/can.h | 441 +++++ .../LuminaryDrivers/comp.h | 122 ++ .../CORTEX_LM3S2965_GCC/LuminaryDrivers/cpu.h | 40 + .../LuminaryDrivers/debug.h | 56 + .../LuminaryDrivers/ethernet.h | 254 +++ .../LuminaryDrivers/gpio.h | 138 ++ .../LuminaryDrivers/hibernate.h | 107 + .../LuminaryDrivers/hw_adc.h | 343 ++++ .../LuminaryDrivers/hw_can.h | 379 ++++ .../LuminaryDrivers/hw_comp.h | 118 ++ .../LuminaryDrivers/hw_ethernet.h | 205 ++ .../LuminaryDrivers/hw_flash.h | 147 ++ .../LuminaryDrivers/hw_gpio.h | 115 ++ .../LuminaryDrivers/hw_hibernate.h | 145 ++ .../LuminaryDrivers/hw_i2c.h | 197 ++ .../LuminaryDrivers/hw_ints.h | 113 ++ .../LuminaryDrivers/hw_memmap.h | 80 + .../LuminaryDrivers/hw_nvic.h | 1050 ++++++++++ .../LuminaryDrivers/hw_pwm.h | 260 +++ .../LuminaryDrivers/hw_qei.h | 176 ++ .../LuminaryDrivers/hw_ssi.h | 120 ++ .../LuminaryDrivers/hw_sysctl.h | 659 ++++++ .../LuminaryDrivers/hw_timer.h | 235 +++ .../LuminaryDrivers/hw_types.h | 129 ++ .../LuminaryDrivers/hw_uart.h | 241 +++ .../LuminaryDrivers/hw_watchdog.h | 116 ++ .../CORTEX_LM3S2965_GCC/LuminaryDrivers/i2c.h | 137 ++ .../LuminaryDrivers/interrupt.h | 57 + .../LuminaryDrivers/libdriver.a | Bin 0 -> 88936 bytes .../LuminaryDrivers/lmi_flash.h | 78 + .../LuminaryDrivers/lmi_timer.h | 137 ++ .../LuminaryDrivers/osram128x64x4.c | 933 +++++++++ .../LuminaryDrivers/osram128x64x4.h | 63 + .../CORTEX_LM3S2965_GCC/LuminaryDrivers/pwm.h | 161 ++ .../CORTEX_LM3S2965_GCC/LuminaryDrivers/qei.h | 104 + .../CORTEX_LM3S2965_GCC/LuminaryDrivers/ssi.h | 89 + .../LuminaryDrivers/sysctl.h | 301 +++ .../LuminaryDrivers/systick.h | 55 + .../LuminaryDrivers/uart.h | 104 + .../LuminaryDrivers/ustdlib.c | 418 ++++ .../LuminaryDrivers/ustdlib.h | 46 + .../LuminaryDrivers/watchdog.h | 63 + Demo/CORTEX_LM3S2965_GCC/Makefile | 85 + Demo/CORTEX_LM3S2965_GCC/ParTest/ParTest.c | 83 + Demo/CORTEX_LM3S2965_GCC/bitmap.h | 171 ++ Demo/CORTEX_LM3S2965_GCC/lcd_message.h | 9 + Demo/CORTEX_LM3S2965_GCC/main.c | 313 +++ Demo/CORTEX_LM3S2965_GCC/makedefs | 208 ++ Demo/CORTEX_LM3S2965_GCC/standalone.ld | 60 + Demo/CORTEX_LM3S2965_GCC/startup.c | 234 +++ Demo/CORTEX_LM3S2965_GCC/timertest.c | 133 ++ Demo/CORTEX_LM3S2965_IAR/FreeRTOSConfig.h | 80 + .../LuminaryDrivers/LM3Sxxx.h | 64 + .../LuminaryDrivers/LM3Sxxxx.h | 70 + .../LuminaryDrivers/_flash.h | 78 + .../LuminaryDrivers/_timer.h | 137 ++ .../CORTEX_LM3S2965_IAR/LuminaryDrivers/adc.h | 130 ++ .../CORTEX_LM3S2965_IAR/LuminaryDrivers/can.h | 441 +++++ .../LuminaryDrivers/comp.h | 122 ++ .../CORTEX_LM3S2965_IAR/LuminaryDrivers/cpu.h | 40 + .../LuminaryDrivers/debug.h | 56 + .../LuminaryDrivers/driverlib.r79 | Bin 0 -> 192492 bytes .../LuminaryDrivers/ethernet.h | 254 +++ .../LuminaryDrivers/gpio.h | 138 ++ .../LuminaryDrivers/hibernate.h | 107 + .../LuminaryDrivers/hw_adc.h | 343 ++++ .../LuminaryDrivers/hw_can.h | 379 ++++ .../LuminaryDrivers/hw_comp.h | 118 ++ .../LuminaryDrivers/hw_ethernet.h | 205 ++ .../LuminaryDrivers/hw_flash.h | 147 ++ .../LuminaryDrivers/hw_gpio.h | 115 ++ .../LuminaryDrivers/hw_hibernate.h | 145 ++ .../LuminaryDrivers/hw_i2c.h | 197 ++ .../LuminaryDrivers/hw_ints.h | 113 ++ .../LuminaryDrivers/hw_memmap.h | 80 + .../LuminaryDrivers/hw_nvic.h | 1050 ++++++++++ .../LuminaryDrivers/hw_pwm.h | 260 +++ .../LuminaryDrivers/hw_qei.h | 176 ++ .../LuminaryDrivers/hw_ssi.h | 120 ++ .../LuminaryDrivers/hw_sysctl.h | 659 ++++++ .../LuminaryDrivers/hw_timer.h | 235 +++ .../LuminaryDrivers/hw_types.h | 129 ++ .../LuminaryDrivers/hw_uart.h | 241 +++ .../LuminaryDrivers/hw_watchdog.h | 116 ++ .../CORTEX_LM3S2965_IAR/LuminaryDrivers/i2c.h | 137 ++ .../LuminaryDrivers/interrupt.h | 57 + .../LuminaryDrivers/lmi_flash.h | 78 + .../LuminaryDrivers/lmi_timer.h | 137 ++ .../LuminaryDrivers/osram128x64x4.c | 933 +++++++++ .../LuminaryDrivers/osram128x64x4.h | 63 + .../CORTEX_LM3S2965_IAR/LuminaryDrivers/pwm.h | 161 ++ .../CORTEX_LM3S2965_IAR/LuminaryDrivers/qei.h | 104 + .../CORTEX_LM3S2965_IAR/LuminaryDrivers/ssi.h | 89 + .../LuminaryDrivers/sysctl.h | 301 +++ .../LuminaryDrivers/systick.h | 55 + .../LuminaryDrivers/uart.h | 104 + .../LuminaryDrivers/watchdog.h | 63 + Demo/CORTEX_LM3S2965_IAR/ParTest/ParTest.c | 83 + Demo/CORTEX_LM3S2965_IAR/RTOSDemo.dep | 856 ++++++++ Demo/CORTEX_LM3S2965_IAR/RTOSDemo.ewd | 1133 +++++++++++ Demo/CORTEX_LM3S2965_IAR/RTOSDemo.ewp | 1728 ++++++++++++++++ Demo/CORTEX_LM3S2965_IAR/RTOSDemo.eww | 10 + Demo/CORTEX_LM3S2965_IAR/RTOSDemo.xcl | 56 + Demo/CORTEX_LM3S2965_IAR/bitmap.h | 171 ++ Demo/CORTEX_LM3S2965_IAR/lcd_message.h | 9 + Demo/CORTEX_LM3S2965_IAR/main.c | 307 +++ Demo/CORTEX_LM3S2965_IAR/startup_ewarm.c | 265 +++ Demo/CORTEX_LM3S2965_IAR/timertest.c | 133 ++ Demo/CORTEX_LM3S2965_KEIL/FreeRTOSConfig.h | 80 + .../LuminaryDrivers/DriverLib.lib | Bin 0 -> 1019382 bytes .../LuminaryDrivers/LM3Sxxx.h | 64 + .../LuminaryDrivers/LM3Sxxxx.h | 70 + .../LuminaryDrivers/_flash.h | 78 + .../LuminaryDrivers/_timer.h | 137 ++ .../LuminaryDrivers/adc.h | 130 ++ .../LuminaryDrivers/can.h | 441 +++++ .../LuminaryDrivers/comp.h | 122 ++ .../LuminaryDrivers/cpu.h | 40 + .../LuminaryDrivers/debug.h | 56 + .../LuminaryDrivers/ethernet.h | 254 +++ .../LuminaryDrivers/gpio.h | 138 ++ .../LuminaryDrivers/hibernate.h | 107 + .../LuminaryDrivers/hw_adc.h | 343 ++++ .../LuminaryDrivers/hw_can.h | 379 ++++ .../LuminaryDrivers/hw_comp.h | 118 ++ .../LuminaryDrivers/hw_ethernet.h | 205 ++ .../LuminaryDrivers/hw_flash.h | 147 ++ .../LuminaryDrivers/hw_gpio.h | 115 ++ .../LuminaryDrivers/hw_hibernate.h | 145 ++ .../LuminaryDrivers/hw_i2c.h | 197 ++ .../LuminaryDrivers/hw_ints.h | 113 ++ .../LuminaryDrivers/hw_memmap.h | 80 + .../LuminaryDrivers/hw_nvic.h | 1050 ++++++++++ .../LuminaryDrivers/hw_pwm.h | 260 +++ .../LuminaryDrivers/hw_qei.h | 176 ++ .../LuminaryDrivers/hw_ssi.h | 120 ++ .../LuminaryDrivers/hw_sysctl.h | 659 ++++++ .../LuminaryDrivers/hw_timer.h | 235 +++ .../LuminaryDrivers/hw_types.h | 129 ++ .../LuminaryDrivers/hw_uart.h | 241 +++ .../LuminaryDrivers/hw_watchdog.h | 116 ++ .../LuminaryDrivers/i2c.h | 137 ++ .../LuminaryDrivers/interrupt.h | 57 + .../LuminaryDrivers/lmi_flash.h | 78 + .../LuminaryDrivers/lmi_timer.h | 137 ++ .../LuminaryDrivers/osram128x64x4.c | 933 +++++++++ .../LuminaryDrivers/osram128x64x4.h | 63 + .../LuminaryDrivers/pwm.h | 161 ++ .../LuminaryDrivers/qei.h | 104 + .../LuminaryDrivers/ssi.h | 89 + .../LuminaryDrivers/sysctl.h | 301 +++ .../LuminaryDrivers/systick.h | 55 + .../LuminaryDrivers/uart.h | 104 + .../LuminaryDrivers/watchdog.h | 63 + Demo/CORTEX_LM3S2965_KEIL/ParTest/ParTest.c | 83 + Demo/CORTEX_LM3S2965_KEIL/RTOSDemo.Opt | 55 + Demo/CORTEX_LM3S2965_KEIL/RTOSDemo.Uv2 | 118 ++ Demo/CORTEX_LM3S2965_KEIL/bitmap.h | 171 ++ Demo/CORTEX_LM3S2965_KEIL/lcd_message.h | 9 + Demo/CORTEX_LM3S2965_KEIL/main.c | 313 +++ Demo/CORTEX_LM3S2965_KEIL/startup_rvmdk.S | 247 +++ Demo/CORTEX_LM3S2965_KEIL/timertest.c | 133 ++ Demo/CORTEX_LM3S6965_GCC/FreeRTOSConfig.h | 80 + .../LuminaryDrivers/LM3Sxxx.h | 64 + .../LuminaryDrivers/LM3Sxxxx.h | 70 + .../LuminaryDrivers/_flash.h | 78 + .../LuminaryDrivers/_timer.h | 137 ++ .../CORTEX_LM3S6965_GCC/LuminaryDrivers/adc.h | 130 ++ .../CORTEX_LM3S6965_GCC/LuminaryDrivers/can.h | 441 +++++ .../LuminaryDrivers/comp.h | 122 ++ .../CORTEX_LM3S6965_GCC/LuminaryDrivers/cpu.h | 40 + .../LuminaryDrivers/debug.h | 56 + .../LuminaryDrivers/ethernet.h | 254 +++ .../LuminaryDrivers/gpio.h | 138 ++ .../LuminaryDrivers/hibernate.h | 107 + .../LuminaryDrivers/hw_adc.h | 343 ++++ .../LuminaryDrivers/hw_can.h | 379 ++++ .../LuminaryDrivers/hw_comp.h | 118 ++ .../LuminaryDrivers/hw_ethernet.h | 205 ++ .../LuminaryDrivers/hw_flash.h | 147 ++ .../LuminaryDrivers/hw_gpio.h | 115 ++ .../LuminaryDrivers/hw_hibernate.h | 145 ++ .../LuminaryDrivers/hw_i2c.h | 197 ++ .../LuminaryDrivers/hw_ints.h | 113 ++ .../LuminaryDrivers/hw_memmap.h | 80 + .../LuminaryDrivers/hw_nvic.h | 1050 ++++++++++ .../LuminaryDrivers/hw_pwm.h | 260 +++ .../LuminaryDrivers/hw_qei.h | 176 ++ .../LuminaryDrivers/hw_ssi.h | 120 ++ .../LuminaryDrivers/hw_sysctl.h | 659 ++++++ .../LuminaryDrivers/hw_timer.h | 235 +++ .../LuminaryDrivers/hw_types.h | 129 ++ .../LuminaryDrivers/hw_uart.h | 241 +++ .../LuminaryDrivers/hw_watchdog.h | 116 ++ .../CORTEX_LM3S6965_GCC/LuminaryDrivers/i2c.h | 137 ++ .../LuminaryDrivers/interrupt.h | 57 + .../LuminaryDrivers/libdriver.a | Bin 0 -> 88936 bytes .../LuminaryDrivers/lmi_flash.h | 78 + .../LuminaryDrivers/lmi_timer.h | 137 ++ .../LuminaryDrivers/osram128x64x4.c | 933 +++++++++ .../LuminaryDrivers/osram128x64x4.h | 63 + .../CORTEX_LM3S6965_GCC/LuminaryDrivers/pwm.h | 161 ++ .../CORTEX_LM3S6965_GCC/LuminaryDrivers/qei.h | 104 + .../CORTEX_LM3S6965_GCC/LuminaryDrivers/ssi.h | 89 + .../LuminaryDrivers/sysctl.h | 301 +++ .../LuminaryDrivers/systick.h | 55 + .../LuminaryDrivers/uart.h | 104 + .../LuminaryDrivers/ustdlib.c | 620 ++++++ .../LuminaryDrivers/ustdlib.h | 46 + .../LuminaryDrivers/watchdog.h | 63 + Demo/CORTEX_LM3S6965_GCC/Makefile | 101 + Demo/CORTEX_LM3S6965_GCC/ParTest/ParTest.c | 83 + Demo/CORTEX_LM3S6965_GCC/bitmap.h | 171 ++ Demo/CORTEX_LM3S6965_GCC/lcd_message.h | 9 + Demo/CORTEX_LM3S6965_GCC/main.c | 331 ++++ Demo/CORTEX_LM3S6965_GCC/makedefs | 208 ++ Demo/CORTEX_LM3S6965_GCC/standalone.ld | 60 + Demo/CORTEX_LM3S6965_GCC/startup.c | 248 +++ Demo/CORTEX_LM3S6965_GCC/timertest.c | 133 ++ .../webserver/Makefile.webserver | 1 + .../webserver/clock-arch.h | 42 + Demo/CORTEX_LM3S6965_GCC/webserver/emac.c | 281 +++ Demo/CORTEX_LM3S6965_GCC/webserver/emac.h | 322 +++ .../webserver/http-strings | 35 + .../webserver/http-strings.c | 102 + .../webserver/http-strings.h | 34 + .../CORTEX_LM3S6965_GCC/webserver/httpd-cgi.c | 269 +++ .../CORTEX_LM3S6965_GCC/webserver/httpd-cgi.h | 84 + Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fs.c | 132 ++ Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fs.h | 57 + .../webserver/httpd-fs/404.html | 8 + .../webserver/httpd-fs/index.html | 13 + .../webserver/httpd-fs/index.shtml | 20 + .../webserver/httpd-fs/io.shtml | 28 + .../webserver/httpd-fs/stats.shtml | 41 + .../webserver/httpd-fs/tcp.shtml | 21 + .../webserver/httpd-fsdata.c | 470 +++++ .../webserver/httpd-fsdata.h | 64 + Demo/CORTEX_LM3S6965_GCC/webserver/httpd.c | 346 ++++ Demo/CORTEX_LM3S6965_GCC/webserver/httpd.h | 62 + Demo/CORTEX_LM3S6965_GCC/webserver/makefsdata | 78 + .../CORTEX_LM3S6965_GCC/webserver/makestrings | 40 + Demo/CORTEX_LM3S6965_GCC/webserver/uIP_Task.c | 300 +++ Demo/CORTEX_LM3S6965_GCC/webserver/uip-conf.h | 159 ++ .../CORTEX_LM3S6965_GCC/webserver/webserver.h | 49 + Demo/CORTEX_LM3S6965_IAR/FreeRTOSConfig.h | 80 + .../LuminaryDrivers/LM3Sxxx.h | 64 + .../LuminaryDrivers/LM3Sxxxx.h | 70 + .../LuminaryDrivers/_flash.h | 78 + .../LuminaryDrivers/_timer.h | 137 ++ .../CORTEX_LM3S6965_IAR/LuminaryDrivers/adc.h | 130 ++ .../CORTEX_LM3S6965_IAR/LuminaryDrivers/can.h | 441 +++++ .../LuminaryDrivers/comp.h | 122 ++ .../CORTEX_LM3S6965_IAR/LuminaryDrivers/cpu.h | 40 + .../LuminaryDrivers/debug.h | 56 + .../LuminaryDrivers/driverlib.r79 | Bin 0 -> 192492 bytes .../LuminaryDrivers/ethernet.h | 254 +++ .../LuminaryDrivers/gpio.h | 138 ++ .../LuminaryDrivers/hibernate.h | 107 + .../LuminaryDrivers/hw_adc.h | 343 ++++ .../LuminaryDrivers/hw_can.h | 379 ++++ .../LuminaryDrivers/hw_comp.h | 118 ++ .../LuminaryDrivers/hw_ethernet.h | 205 ++ .../LuminaryDrivers/hw_flash.h | 147 ++ .../LuminaryDrivers/hw_gpio.h | 115 ++ .../LuminaryDrivers/hw_hibernate.h | 145 ++ .../LuminaryDrivers/hw_i2c.h | 197 ++ .../LuminaryDrivers/hw_ints.h | 113 ++ .../LuminaryDrivers/hw_memmap.h | 80 + .../LuminaryDrivers/hw_nvic.h | 1050 ++++++++++ .../LuminaryDrivers/hw_pwm.h | 260 +++ .../LuminaryDrivers/hw_qei.h | 176 ++ .../LuminaryDrivers/hw_ssi.h | 120 ++ .../LuminaryDrivers/hw_sysctl.h | 659 ++++++ .../LuminaryDrivers/hw_timer.h | 235 +++ .../LuminaryDrivers/hw_types.h | 129 ++ .../LuminaryDrivers/hw_uart.h | 241 +++ .../LuminaryDrivers/hw_watchdog.h | 116 ++ .../CORTEX_LM3S6965_IAR/LuminaryDrivers/i2c.h | 137 ++ .../LuminaryDrivers/interrupt.h | 57 + .../LuminaryDrivers/lmi_flash.h | 78 + .../LuminaryDrivers/lmi_timer.h | 137 ++ .../LuminaryDrivers/osram128x64x4.c | 933 +++++++++ .../LuminaryDrivers/osram128x64x4.h | 63 + .../CORTEX_LM3S6965_IAR/LuminaryDrivers/pwm.h | 161 ++ .../CORTEX_LM3S6965_IAR/LuminaryDrivers/qei.h | 104 + .../CORTEX_LM3S6965_IAR/LuminaryDrivers/ssi.h | 89 + .../LuminaryDrivers/sysctl.h | 301 +++ .../LuminaryDrivers/systick.h | 55 + .../LuminaryDrivers/uart.h | 104 + .../LuminaryDrivers/watchdog.h | 63 + Demo/CORTEX_LM3S6965_IAR/ParTest/ParTest.c | 83 + Demo/CORTEX_LM3S6965_IAR/RTOSDemo.dep | 856 ++++++++ Demo/CORTEX_LM3S6965_IAR/RTOSDemo.ewd | 1133 +++++++++++ Demo/CORTEX_LM3S6965_IAR/RTOSDemo.ewp | 1761 +++++++++++++++++ Demo/CORTEX_LM3S6965_IAR/RTOSDemo.eww | 10 + Demo/CORTEX_LM3S6965_IAR/RTOSDemo.xcl | 56 + Demo/CORTEX_LM3S6965_IAR/bitmap.h | 171 ++ Demo/CORTEX_LM3S6965_IAR/lcd_message.h | 9 + Demo/CORTEX_LM3S6965_IAR/main.c | 325 +++ Demo/CORTEX_LM3S6965_IAR/startup_ewarm.c | 265 +++ Demo/CORTEX_LM3S6965_IAR/timertest.c | 133 ++ .../webserver/Makefile.webserver | 1 + .../webserver/clock-arch.h | 42 + Demo/CORTEX_LM3S6965_IAR/webserver/emac.c | 281 +++ Demo/CORTEX_LM3S6965_IAR/webserver/emac.h | 322 +++ .../webserver/http-strings | 35 + .../webserver/http-strings.c | 102 + .../webserver/http-strings.h | 34 + .../CORTEX_LM3S6965_IAR/webserver/httpd-cgi.c | 269 +++ .../CORTEX_LM3S6965_IAR/webserver/httpd-cgi.h | 84 + Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fs.c | 132 ++ Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fs.h | 57 + .../webserver/httpd-fs/404.html | 8 + .../webserver/httpd-fs/index.html | 13 + .../webserver/httpd-fs/index.shtml | 20 + .../webserver/httpd-fs/io.shtml | 28 + .../webserver/httpd-fs/stats.shtml | 41 + .../webserver/httpd-fs/tcp.shtml | 21 + .../webserver/httpd-fsdata.c | 470 +++++ .../webserver/httpd-fsdata.h | 64 + Demo/CORTEX_LM3S6965_IAR/webserver/httpd.c | 346 ++++ Demo/CORTEX_LM3S6965_IAR/webserver/httpd.h | 62 + Demo/CORTEX_LM3S6965_IAR/webserver/makefsdata | 78 + .../CORTEX_LM3S6965_IAR/webserver/makestrings | 40 + Demo/CORTEX_LM3S6965_IAR/webserver/uIP_Task.c | 300 +++ Demo/CORTEX_LM3S6965_IAR/webserver/uip-conf.h | 159 ++ .../CORTEX_LM3S6965_IAR/webserver/webserver.h | 49 + Demo/CORTEX_LM3S6965_KEIL/FreeRTOSConfig.h | 80 + .../LuminaryDrivers/DriverLib.lib | Bin 0 -> 1019382 bytes .../LuminaryDrivers/LM3Sxxx.h | 64 + .../LuminaryDrivers/LM3Sxxxx.h | 70 + .../LuminaryDrivers/_flash.h | 78 + .../LuminaryDrivers/_timer.h | 137 ++ .../LuminaryDrivers/adc.h | 130 ++ .../LuminaryDrivers/can.h | 441 +++++ .../LuminaryDrivers/comp.h | 122 ++ .../LuminaryDrivers/cpu.h | 40 + .../LuminaryDrivers/debug.h | 56 + .../LuminaryDrivers/ethernet.h | 254 +++ .../LuminaryDrivers/gpio.h | 138 ++ .../LuminaryDrivers/hibernate.h | 107 + .../LuminaryDrivers/hw_adc.h | 343 ++++ .../LuminaryDrivers/hw_can.h | 379 ++++ .../LuminaryDrivers/hw_comp.h | 118 ++ .../LuminaryDrivers/hw_ethernet.h | 205 ++ .../LuminaryDrivers/hw_flash.h | 147 ++ .../LuminaryDrivers/hw_gpio.h | 115 ++ .../LuminaryDrivers/hw_hibernate.h | 145 ++ .../LuminaryDrivers/hw_i2c.h | 197 ++ .../LuminaryDrivers/hw_ints.h | 113 ++ .../LuminaryDrivers/hw_memmap.h | 80 + .../LuminaryDrivers/hw_nvic.h | 1050 ++++++++++ .../LuminaryDrivers/hw_pwm.h | 260 +++ .../LuminaryDrivers/hw_qei.h | 176 ++ .../LuminaryDrivers/hw_ssi.h | 120 ++ .../LuminaryDrivers/hw_sysctl.h | 659 ++++++ .../LuminaryDrivers/hw_timer.h | 235 +++ .../LuminaryDrivers/hw_types.h | 129 ++ .../LuminaryDrivers/hw_uart.h | 241 +++ .../LuminaryDrivers/hw_watchdog.h | 116 ++ .../LuminaryDrivers/i2c.h | 137 ++ .../LuminaryDrivers/interrupt.h | 57 + .../LuminaryDrivers/lmi_flash.h | 78 + .../LuminaryDrivers/lmi_timer.h | 137 ++ .../LuminaryDrivers/osram128x64x4.c | 933 +++++++++ .../LuminaryDrivers/osram128x64x4.h | 63 + .../LuminaryDrivers/pwm.h | 161 ++ .../LuminaryDrivers/qei.h | 104 + .../LuminaryDrivers/ssi.h | 89 + .../LuminaryDrivers/sysctl.h | 301 +++ .../LuminaryDrivers/systick.h | 55 + .../LuminaryDrivers/uart.h | 104 + .../LuminaryDrivers/watchdog.h | 63 + Demo/CORTEX_LM3S6965_KEIL/ParTest/ParTest.c | 83 + Demo/CORTEX_LM3S6965_KEIL/RTOSDemo.Opt | 70 + Demo/CORTEX_LM3S6965_KEIL/RTOSDemo.Uv2 | 129 ++ Demo/CORTEX_LM3S6965_KEIL/bitmap.h | 171 ++ Demo/CORTEX_LM3S6965_KEIL/lcd_message.h | 9 + Demo/CORTEX_LM3S6965_KEIL/main.c | 331 ++++ Demo/CORTEX_LM3S6965_KEIL/startup_rvmdk.S | 248 +++ Demo/CORTEX_LM3S6965_KEIL/timertest.c | 133 ++ .../webserver/Makefile.webserver | 1 + .../webserver/clock-arch.h | 42 + Demo/CORTEX_LM3S6965_KEIL/webserver/emac.c | 281 +++ Demo/CORTEX_LM3S6965_KEIL/webserver/emac.h | 322 +++ .../webserver/http-strings | 35 + .../webserver/http-strings.c | 102 + .../webserver/http-strings.h | 34 + .../webserver/httpd-cgi.c | 269 +++ .../webserver/httpd-cgi.h | 84 + .../CORTEX_LM3S6965_KEIL/webserver/httpd-fs.c | 132 ++ .../CORTEX_LM3S6965_KEIL/webserver/httpd-fs.h | 57 + .../webserver/httpd-fs/404.html | 8 + .../webserver/httpd-fs/index.html | 13 + .../webserver/httpd-fs/index.shtml | 20 + .../webserver/httpd-fs/io.shtml | 28 + .../webserver/httpd-fs/stats.shtml | 41 + .../webserver/httpd-fs/tcp.shtml | 21 + .../webserver/httpd-fsdata.c | 470 +++++ .../webserver/httpd-fsdata.h | 64 + Demo/CORTEX_LM3S6965_KEIL/webserver/httpd.c | 346 ++++ Demo/CORTEX_LM3S6965_KEIL/webserver/httpd.h | 62 + .../CORTEX_LM3S6965_KEIL/webserver/makefsdata | 78 + .../webserver/makestrings | 40 + .../CORTEX_LM3S6965_KEIL/webserver/uIP_Task.c | 300 +++ .../CORTEX_LM3S6965_KEIL/webserver/uip-conf.h | 159 ++ .../webserver/webserver.h | 49 + 414 files changed, 77762 insertions(+) create mode 100644 Demo/CORTEX_LM3S2965_GCC/FreeRTOSConfig.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/LM3Sxxx.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/LM3Sxxxx.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/_flash.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/_timer.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/adc.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/can.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/comp.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/cpu.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/debug.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/ethernet.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/gpio.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hibernate.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_adc.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_can.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_comp.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_ethernet.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_flash.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_gpio.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_hibernate.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_i2c.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_ints.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_memmap.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_nvic.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_pwm.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_qei.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_ssi.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_sysctl.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_timer.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_types.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_uart.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_watchdog.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/i2c.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/interrupt.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/libdriver.a create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/lmi_flash.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/lmi_timer.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/osram128x64x4.c create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/osram128x64x4.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/pwm.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/qei.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/ssi.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/sysctl.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/systick.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/uart.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/ustdlib.c create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/ustdlib.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/watchdog.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/Makefile create mode 100644 Demo/CORTEX_LM3S2965_GCC/ParTest/ParTest.c create mode 100644 Demo/CORTEX_LM3S2965_GCC/bitmap.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/lcd_message.h create mode 100644 Demo/CORTEX_LM3S2965_GCC/main.c create mode 100644 Demo/CORTEX_LM3S2965_GCC/makedefs create mode 100644 Demo/CORTEX_LM3S2965_GCC/standalone.ld create mode 100644 Demo/CORTEX_LM3S2965_GCC/startup.c create mode 100644 Demo/CORTEX_LM3S2965_GCC/timertest.c create mode 100644 Demo/CORTEX_LM3S2965_IAR/FreeRTOSConfig.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/LM3Sxxx.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/LM3Sxxxx.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/_flash.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/_timer.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/adc.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/can.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/comp.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/cpu.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/debug.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/driverlib.r79 create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/ethernet.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/gpio.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hibernate.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_adc.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_can.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_comp.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_ethernet.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_flash.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_gpio.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_hibernate.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_i2c.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_ints.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_memmap.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_nvic.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_pwm.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_qei.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_ssi.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_sysctl.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_timer.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_types.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_uart.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_watchdog.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/i2c.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/interrupt.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/lmi_flash.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/lmi_timer.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/osram128x64x4.c create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/osram128x64x4.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/pwm.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/qei.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/ssi.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/sysctl.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/systick.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/uart.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/watchdog.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/ParTest/ParTest.c create mode 100644 Demo/CORTEX_LM3S2965_IAR/RTOSDemo.dep create mode 100644 Demo/CORTEX_LM3S2965_IAR/RTOSDemo.ewd create mode 100644 Demo/CORTEX_LM3S2965_IAR/RTOSDemo.ewp create mode 100644 Demo/CORTEX_LM3S2965_IAR/RTOSDemo.eww create mode 100644 Demo/CORTEX_LM3S2965_IAR/RTOSDemo.xcl create mode 100644 Demo/CORTEX_LM3S2965_IAR/bitmap.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/lcd_message.h create mode 100644 Demo/CORTEX_LM3S2965_IAR/main.c create mode 100644 Demo/CORTEX_LM3S2965_IAR/startup_ewarm.c create mode 100644 Demo/CORTEX_LM3S2965_IAR/timertest.c create mode 100644 Demo/CORTEX_LM3S2965_KEIL/FreeRTOSConfig.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/DriverLib.lib create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/LM3Sxxx.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/LM3Sxxxx.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/_flash.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/_timer.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/adc.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/can.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/comp.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/cpu.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/debug.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/ethernet.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/gpio.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hibernate.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_adc.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_can.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_comp.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_ethernet.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_flash.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_gpio.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_hibernate.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_i2c.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_ints.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_memmap.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_nvic.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_pwm.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_qei.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_ssi.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_sysctl.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_timer.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_types.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_uart.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_watchdog.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/i2c.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/interrupt.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/lmi_flash.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/lmi_timer.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/osram128x64x4.c create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/osram128x64x4.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/pwm.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/qei.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/ssi.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/sysctl.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/systick.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/uart.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/watchdog.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/ParTest/ParTest.c create mode 100644 Demo/CORTEX_LM3S2965_KEIL/RTOSDemo.Opt create mode 100644 Demo/CORTEX_LM3S2965_KEIL/RTOSDemo.Uv2 create mode 100644 Demo/CORTEX_LM3S2965_KEIL/bitmap.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/lcd_message.h create mode 100644 Demo/CORTEX_LM3S2965_KEIL/main.c create mode 100644 Demo/CORTEX_LM3S2965_KEIL/startup_rvmdk.S create mode 100644 Demo/CORTEX_LM3S2965_KEIL/timertest.c create mode 100644 Demo/CORTEX_LM3S6965_GCC/FreeRTOSConfig.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/LM3Sxxx.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/LM3Sxxxx.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/_flash.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/_timer.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/adc.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/can.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/comp.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/cpu.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/debug.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/ethernet.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/gpio.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hibernate.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_adc.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_can.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_comp.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_ethernet.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_flash.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_gpio.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_hibernate.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_i2c.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_ints.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_memmap.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_nvic.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_pwm.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_qei.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_ssi.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_sysctl.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_timer.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_types.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_uart.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_watchdog.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/i2c.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/interrupt.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/libdriver.a create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/lmi_flash.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/lmi_timer.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/osram128x64x4.c create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/osram128x64x4.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/pwm.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/qei.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/ssi.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/sysctl.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/systick.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/uart.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/ustdlib.c create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/ustdlib.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/watchdog.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/Makefile create mode 100644 Demo/CORTEX_LM3S6965_GCC/ParTest/ParTest.c create mode 100644 Demo/CORTEX_LM3S6965_GCC/bitmap.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/lcd_message.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/main.c create mode 100644 Demo/CORTEX_LM3S6965_GCC/makedefs create mode 100644 Demo/CORTEX_LM3S6965_GCC/standalone.ld create mode 100644 Demo/CORTEX_LM3S6965_GCC/startup.c create mode 100644 Demo/CORTEX_LM3S6965_GCC/timertest.c create mode 100644 Demo/CORTEX_LM3S6965_GCC/webserver/Makefile.webserver create mode 100644 Demo/CORTEX_LM3S6965_GCC/webserver/clock-arch.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/webserver/emac.c create mode 100644 Demo/CORTEX_LM3S6965_GCC/webserver/emac.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/webserver/http-strings create mode 100644 Demo/CORTEX_LM3S6965_GCC/webserver/http-strings.c create mode 100644 Demo/CORTEX_LM3S6965_GCC/webserver/http-strings.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/webserver/httpd-cgi.c create mode 100644 Demo/CORTEX_LM3S6965_GCC/webserver/httpd-cgi.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fs.c create mode 100644 Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fs.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fs/404.html create mode 100644 Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fs/index.html create mode 100644 Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fs/index.shtml create mode 100644 Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fs/io.shtml create mode 100644 Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fs/stats.shtml create mode 100644 Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fs/tcp.shtml create mode 100644 Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fsdata.c create mode 100644 Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fsdata.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/webserver/httpd.c create mode 100644 Demo/CORTEX_LM3S6965_GCC/webserver/httpd.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/webserver/makefsdata create mode 100644 Demo/CORTEX_LM3S6965_GCC/webserver/makestrings create mode 100644 Demo/CORTEX_LM3S6965_GCC/webserver/uIP_Task.c create mode 100644 Demo/CORTEX_LM3S6965_GCC/webserver/uip-conf.h create mode 100644 Demo/CORTEX_LM3S6965_GCC/webserver/webserver.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/FreeRTOSConfig.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/LM3Sxxx.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/LM3Sxxxx.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/_flash.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/_timer.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/adc.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/can.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/comp.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/cpu.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/debug.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/driverlib.r79 create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/ethernet.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/gpio.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hibernate.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_adc.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_can.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_comp.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_ethernet.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_flash.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_gpio.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_hibernate.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_i2c.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_ints.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_memmap.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_nvic.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_pwm.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_qei.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_ssi.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_sysctl.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_timer.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_types.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_uart.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_watchdog.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/i2c.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/interrupt.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/lmi_flash.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/lmi_timer.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/osram128x64x4.c create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/osram128x64x4.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/pwm.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/qei.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/ssi.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/sysctl.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/systick.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/uart.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/watchdog.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/ParTest/ParTest.c create mode 100644 Demo/CORTEX_LM3S6965_IAR/RTOSDemo.dep create mode 100644 Demo/CORTEX_LM3S6965_IAR/RTOSDemo.ewd create mode 100644 Demo/CORTEX_LM3S6965_IAR/RTOSDemo.ewp create mode 100644 Demo/CORTEX_LM3S6965_IAR/RTOSDemo.eww create mode 100644 Demo/CORTEX_LM3S6965_IAR/RTOSDemo.xcl create mode 100644 Demo/CORTEX_LM3S6965_IAR/bitmap.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/lcd_message.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/main.c create mode 100644 Demo/CORTEX_LM3S6965_IAR/startup_ewarm.c create mode 100644 Demo/CORTEX_LM3S6965_IAR/timertest.c create mode 100644 Demo/CORTEX_LM3S6965_IAR/webserver/Makefile.webserver create mode 100644 Demo/CORTEX_LM3S6965_IAR/webserver/clock-arch.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/webserver/emac.c create mode 100644 Demo/CORTEX_LM3S6965_IAR/webserver/emac.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/webserver/http-strings create mode 100644 Demo/CORTEX_LM3S6965_IAR/webserver/http-strings.c create mode 100644 Demo/CORTEX_LM3S6965_IAR/webserver/http-strings.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/webserver/httpd-cgi.c create mode 100644 Demo/CORTEX_LM3S6965_IAR/webserver/httpd-cgi.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fs.c create mode 100644 Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fs.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fs/404.html create mode 100644 Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fs/index.html create mode 100644 Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fs/index.shtml create mode 100644 Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fs/io.shtml create mode 100644 Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fs/stats.shtml create mode 100644 Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fs/tcp.shtml create mode 100644 Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fsdata.c create mode 100644 Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fsdata.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/webserver/httpd.c create mode 100644 Demo/CORTEX_LM3S6965_IAR/webserver/httpd.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/webserver/makefsdata create mode 100644 Demo/CORTEX_LM3S6965_IAR/webserver/makestrings create mode 100644 Demo/CORTEX_LM3S6965_IAR/webserver/uIP_Task.c create mode 100644 Demo/CORTEX_LM3S6965_IAR/webserver/uip-conf.h create mode 100644 Demo/CORTEX_LM3S6965_IAR/webserver/webserver.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/FreeRTOSConfig.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/DriverLib.lib create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/LM3Sxxx.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/LM3Sxxxx.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/_flash.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/_timer.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/adc.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/can.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/comp.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/cpu.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/debug.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/ethernet.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/gpio.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hibernate.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_adc.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_can.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_comp.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_ethernet.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_flash.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_gpio.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_hibernate.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_i2c.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_ints.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_memmap.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_nvic.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_pwm.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_qei.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_ssi.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_sysctl.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_timer.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_types.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_uart.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_watchdog.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/i2c.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/interrupt.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/lmi_flash.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/lmi_timer.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/osram128x64x4.c create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/osram128x64x4.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/pwm.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/qei.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/ssi.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/sysctl.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/systick.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/uart.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/watchdog.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/ParTest/ParTest.c create mode 100644 Demo/CORTEX_LM3S6965_KEIL/RTOSDemo.Opt create mode 100644 Demo/CORTEX_LM3S6965_KEIL/RTOSDemo.Uv2 create mode 100644 Demo/CORTEX_LM3S6965_KEIL/bitmap.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/lcd_message.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/main.c create mode 100644 Demo/CORTEX_LM3S6965_KEIL/startup_rvmdk.S create mode 100644 Demo/CORTEX_LM3S6965_KEIL/timertest.c create mode 100644 Demo/CORTEX_LM3S6965_KEIL/webserver/Makefile.webserver create mode 100644 Demo/CORTEX_LM3S6965_KEIL/webserver/clock-arch.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/webserver/emac.c create mode 100644 Demo/CORTEX_LM3S6965_KEIL/webserver/emac.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/webserver/http-strings create mode 100644 Demo/CORTEX_LM3S6965_KEIL/webserver/http-strings.c create mode 100644 Demo/CORTEX_LM3S6965_KEIL/webserver/http-strings.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-cgi.c create mode 100644 Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-cgi.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fs.c create mode 100644 Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fs.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fs/404.html create mode 100644 Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fs/index.html create mode 100644 Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fs/index.shtml create mode 100644 Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fs/io.shtml create mode 100644 Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fs/stats.shtml create mode 100644 Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fs/tcp.shtml create mode 100644 Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fsdata.c create mode 100644 Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fsdata.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/webserver/httpd.c create mode 100644 Demo/CORTEX_LM3S6965_KEIL/webserver/httpd.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/webserver/makefsdata create mode 100644 Demo/CORTEX_LM3S6965_KEIL/webserver/makestrings create mode 100644 Demo/CORTEX_LM3S6965_KEIL/webserver/uIP_Task.c create mode 100644 Demo/CORTEX_LM3S6965_KEIL/webserver/uip-conf.h create mode 100644 Demo/CORTEX_LM3S6965_KEIL/webserver/webserver.h diff --git a/Demo/CORTEX_LM3S2965_GCC/FreeRTOSConfig.h b/Demo/CORTEX_LM3S2965_GCC/FreeRTOSConfig.h new file mode 100644 index 000000000..e41bcd6a6 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/FreeRTOSConfig.h @@ -0,0 +1,80 @@ +/* + FreeRTOS.org V4.3.0 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + + Also see http://www.SafeRTOS.com for an IEC 61508 compliant version along + with commercial development and support options. + *************************************************************************** +*/ + +#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. + *----------------------------------------------------------*/ + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 0 +#define configUSE_TICK_HOOK 0 +#define configCPU_CLOCK_HZ ( ( unsigned portLONG ) 50000000 ) +#define configTICK_RATE_HZ ( ( portTickType ) 1000 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned portSHORT ) 70 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 12000 ) ) +#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 configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 ) +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +/* 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 0 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 + + +#define configKERNEL_INTERRUPT_PRIORITY 255 + + +#endif /* FREERTOS_CONFIG_H */ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/LM3Sxxx.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/LM3Sxxx.h new file mode 100644 index 000000000..11952d416 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/LM3Sxxx.h @@ -0,0 +1,64 @@ +//***************************************************************************** +// +// LM3Sxxx.h - Header file for Luminary Micro LM3Sxxx microcontrollers. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __LM3SXXX_H__ +#define __LM3SXXX_H__ + +#include "hw_adc.h" +#include "hw_comp.h" +#include "hw_flash.h" +#include "hw_gpio.h" +#include "hw_i2c.h" +#include "hw_ints.h" +#include "hw_memmap.h" +#include "hw_nvic.h" +#include "hw_pwm.h" +#include "hw_qei.h" +#include "hw_ssi.h" +#include "hw_sysctl.h" +#include "hw_timer.h" +#include "hw_types.h" +#include "hw_uart.h" +#include "hw_watchdog.h" +#include "adc.h" +#include "comp.h" +#include "cpu.h" +#include "debug.h" +#include "flash.h" +#include "gpio.h" +#include "i2c.h" +#include "interrupt.h" +#include "pwm.h" +#include "qei.h" +#include "ssi.h" +#include "sysctl.h" +#include "systick.h" +#include "timer.h" +#include "uart.h" +#include "watchdog.h" + +#endif // __LM3SXXX_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/LM3Sxxxx.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/LM3Sxxxx.h new file mode 100644 index 000000000..bafb07cda --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/LM3Sxxxx.h @@ -0,0 +1,70 @@ +//***************************************************************************** +// +// LM3Sxxxx.h - Header file for Luminary Micro LM3Sxxxx microcontrollers. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __LM3SXXXX_H__ +#define __LM3SXXXX_H__ + +#include "hw_adc.h" +#include "hw_can.h" +#include "hw_comp.h" +#include "hw_ethernet.h" +#include "hw_flash.h" +#include "hw_gpio.h" +#include "hw_hibernate.h" +#include "hw_i2c.h" +#include "hw_ints.h" +#include "hw_memmap.h" +#include "hw_nvic.h" +#include "hw_pwm.h" +#include "hw_qei.h" +#include "hw_ssi.h" +#include "hw_sysctl.h" +#include "hw_timer.h" +#include "hw_types.h" +#include "hw_uart.h" +#include "hw_watchdog.h" +#include "adc.h" +#include "can.h" +#include "comp.h" +#include "cpu.h" +#include "debug.h" +#include "ethernet.h" +#include "flash.h" +#include "gpio.h" +#include "hibernate.h" +#include "i2c.h" +#include "interrupt.h" +#include "pwm.h" +#include "qei.h" +#include "ssi.h" +#include "sysctl.h" +#include "systick.h" +#include "timer.h" +#include "uart.h" +#include "watchdog.h" + +#endif // __LM3SXXXX_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/_flash.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/_flash.h new file mode 100644 index 000000000..75d30c41c --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/_flash.h @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// flash.h - Prototypes for the flash driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __FLASH_H__ +#define __FLASH_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to FlashProtectSet(), and returned by +// FlashProtectGet(). +// +//***************************************************************************** +typedef enum +{ + FlashReadWrite, // Flash can be read and written + FlashReadOnly, // Flash can only be read + FlashExecuteOnly // Flash can only be executed +} +tFlashProtection; + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern unsigned long FlashUsecGet(void); +extern void FlashUsecSet(unsigned long ulClocks); +extern long FlashErase(unsigned long ulAddress); +extern long FlashProgram(unsigned long *pulData, unsigned long ulAddress, + unsigned long ulCount); +extern tFlashProtection FlashProtectGet(unsigned long ulAddress); +extern long FlashProtectSet(unsigned long ulAddress, + tFlashProtection eProtect); +extern long FlashProtectSave(void); +extern long FlashUserGet(unsigned long *pulUser0, unsigned long *pulUser1); +extern long FlashUserSet(unsigned long ulUser0, unsigned long ulUser1); +extern long FlashUserSave(void); +extern void FlashIntRegister(void (*pfnHandler)(void)); +extern void FlashIntUnregister(void); +extern void FlashIntEnable(unsigned long ulIntFlags); +extern void FlashIntDisable(unsigned long ulIntFlags); +extern unsigned long FlashIntGetStatus(tBoolean bMasked); +extern void FlashIntClear(unsigned long ulIntFlags); + +#ifdef __cplusplus +} +#endif + +#endif // __FLASH_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/_timer.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/_timer.h new file mode 100644 index 000000000..85b3160ab --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/_timer.h @@ -0,0 +1,137 @@ +//***************************************************************************** +// +// timer.h - Prototypes for the timer module +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __TIMER_H__ +#define __TIMER_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to TimerConfigure as the ulConfig parameter. +// +//***************************************************************************** +#define TIMER_CFG_32_BIT_OS 0x00000001 // 32-bit one-shot timer +#define TIMER_CFG_32_BIT_PER 0x00000002 // 32-bit periodic timer +#define TIMER_CFG_32_RTC 0x01000000 // 32-bit RTC timer +#define TIMER_CFG_16_BIT_PAIR 0x04000000 // Two 16-bit timers +#define TIMER_CFG_A_ONE_SHOT 0x00000001 // Timer A one-shot timer +#define TIMER_CFG_A_PERIODIC 0x00000002 // Timer A periodic timer +#define TIMER_CFG_A_CAP_COUNT 0x00000003 // Timer A event counter +#define TIMER_CFG_A_CAP_TIME 0x00000007 // Timer A event timer +#define TIMER_CFG_A_PWM 0x0000000A // Timer A PWM output +#define TIMER_CFG_B_ONE_SHOT 0x00000100 // Timer B one-shot timer +#define TIMER_CFG_B_PERIODIC 0x00000200 // Timer B periodic timer +#define TIMER_CFG_B_CAP_COUNT 0x00000300 // Timer B event counter +#define TIMER_CFG_B_CAP_TIME 0x00000700 // Timer B event timer +#define TIMER_CFG_B_PWM 0x00000A00 // Timer B PWM output + +//***************************************************************************** +// +// Values that can be passed to TimerIntEnable, TimerIntDisable, and +// TimerIntClear as the ulIntFlags parameter, and returned from TimerIntStatus. +// +//***************************************************************************** +#define TIMER_CAPB_EVENT 0x00000400 // CaptureB event interrupt +#define TIMER_CAPB_MATCH 0x00000200 // CaptureB match interrupt +#define TIMER_TIMB_TIMEOUT 0x00000100 // TimerB time out interrupt +#define TIMER_RTC_MATCH 0x00000008 // RTC interrupt mask +#define TIMER_CAPA_EVENT 0x00000004 // CaptureA event interrupt +#define TIMER_CAPA_MATCH 0x00000002 // CaptureA match interrupt +#define TIMER_TIMA_TIMEOUT 0x00000001 // TimerA time out interrupt + +//***************************************************************************** +// +// Values that can be passed to TimerControlEvent as the ulEvent parameter. +// +//***************************************************************************** +#define TIMER_EVENT_POS_EDGE 0x00000000 // Count positive edges +#define TIMER_EVENT_NEG_EDGE 0x00000404 // Count negative edges +#define TIMER_EVENT_BOTH_EDGES 0x00000C0C // Count both edges + +//***************************************************************************** +// +// Values that can be passed to most of the timer APIs as the ulTimer +// parameter. +// +//***************************************************************************** +#define TIMER_A 0x000000ff // Timer A +#define TIMER_B 0x0000ff00 // Timer B +#define TIMER_BOTH 0x0000ffff // Timer Both + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void TimerEnable(unsigned long ulBase, unsigned long ulTimer); +extern void TimerDisable(unsigned long ulBase, unsigned long ulTimer); +extern void TimerConfigure(unsigned long ulBase, unsigned long ulConfig); +extern void TimerControlLevel(unsigned long ulBase, unsigned long ulTimer, + tBoolean bInvert); +extern void TimerControlTrigger(unsigned long ulBase, unsigned long ulTimer, + tBoolean bEnable); +extern void TimerControlEvent(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulEvent); +extern void TimerControlStall(unsigned long ulBase, unsigned long ulTimer, + tBoolean bStall); +extern void TimerRTCEnable(unsigned long ulBase); +extern void TimerRTCDisable(unsigned long ulBase); +extern void TimerPrescaleSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerPrescaleGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerPrescaleMatchSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerPrescaleMatchGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerLoadSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerLoadGet(unsigned long ulBase, unsigned long ulTimer); +extern unsigned long TimerValueGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerMatchSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerMatchGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerIntRegister(unsigned long ulBase, unsigned long ulTimer, + void (*pfnHandler)(void)); +extern void TimerIntUnregister(unsigned long ulBase, unsigned long ulTimer); +extern void TimerIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void TimerIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long TimerIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void TimerIntClear(unsigned long ulBase, unsigned long ulIntFlags); +extern void TimerQuiesce(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __TIMER_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/adc.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/adc.h new file mode 100644 index 000000000..7533ccfd8 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/adc.h @@ -0,0 +1,130 @@ +//***************************************************************************** +// +// adc.h - ADC headers for using the ADC driver functions. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __ADC_H__ +#define __ADC_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to ADCSequenceConfigure as the ulTrigger +// parameter. +// +//***************************************************************************** +#define ADC_TRIGGER_PROCESSOR 0x00000000 // Processor event +#define ADC_TRIGGER_COMP0 0x00000001 // Analog comparator 0 event +#define ADC_TRIGGER_COMP1 0x00000002 // Analog comparator 1 event +#define ADC_TRIGGER_COMP2 0x00000003 // Analog comparator 2 event +#define ADC_TRIGGER_EXTERNAL 0x00000004 // External event +#define ADC_TRIGGER_TIMER 0x00000005 // Timer event +#define ADC_TRIGGER_PWM0 0x00000006 // PWM0 event +#define ADC_TRIGGER_PWM1 0x00000007 // PWM1 event +#define ADC_TRIGGER_PWM2 0x00000008 // PWM2 event +#define ADC_TRIGGER_ALWAYS 0x0000000F // Always event + +//***************************************************************************** +// +// Values that can be passed to ADCSequenceStepConfigure as the ulConfig +// parameter. +// +//***************************************************************************** +#define ADC_CTL_TS 0x00000080 // Temperature sensor select +#define ADC_CTL_IE 0x00000040 // Interrupt enable +#define ADC_CTL_END 0x00000020 // Sequence end select +#define ADC_CTL_D 0x00000010 // Differential select +#define ADC_CTL_CH0 0x00000000 // Input channel 0 +#define ADC_CTL_CH1 0x00000001 // Input channel 1 +#define ADC_CTL_CH2 0x00000002 // Input channel 2 +#define ADC_CTL_CH3 0x00000003 // Input channel 3 +#define ADC_CTL_CH4 0x00000004 // Input channel 4 +#define ADC_CTL_CH5 0x00000005 // Input channel 5 +#define ADC_CTL_CH6 0x00000006 // Input channel 6 +#define ADC_CTL_CH7 0x00000007 // Input channel 7 + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void ADCIntRegister(unsigned long ulBase, unsigned long ulSequenceNum, + void (*pfnHandler)(void)); +extern void ADCIntUnregister(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCIntDisable(unsigned long ulBase, unsigned long ulSequenceNum); +extern void ADCIntEnable(unsigned long ulBase, unsigned long ulSequenceNum); +extern unsigned long ADCIntStatus(unsigned long ulBase, + unsigned long ulSequenceNum, + tBoolean bMasked); +extern void ADCIntClear(unsigned long ulBase, unsigned long ulSequenceNum); +extern void ADCSequenceEnable(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCSequenceDisable(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCSequenceConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulTrigger, + unsigned long ulPriority); +extern void ADCSequenceStepConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulStep, + unsigned long ulConfig); +extern long ADCSequenceOverflow(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCSequenceOverflowClear(unsigned long ulBase, + unsigned long ulSequenceNum); +extern long ADCSequenceUnderflow(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCSequenceUnderflowClear(unsigned long ulBase, + unsigned long ulSequenceNum); +extern long ADCSequenceDataGet(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long *pulBuffer); +extern void ADCProcessorTrigger(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCSoftwareOversampleConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulFactor); +extern void ADCSoftwareOversampleStepConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulStep, + unsigned long ulConfig); +extern void ADCSoftwareOversampleDataGet(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long *pulBuffer, + unsigned long ulCount); +extern void ADCHardwareOversampleConfigure(unsigned long ulBase, + unsigned long ulFactor); + +#ifdef __cplusplus +} +#endif + +#endif // __ADC_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/can.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/can.h new file mode 100644 index 000000000..bdd623304 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/can.h @@ -0,0 +1,441 @@ +//***************************************************************************** +// +// can.h - Defines and Macros for the CAN controller. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __CAN_H__ +#define __CAN_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup can_api +//! @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// Miscellaneous defines for Message ID Types +// +//***************************************************************************** + +//***************************************************************************** +// +//! These are the flags used by the tCANMsgObject variable when calling the +//! the CANMessageSet() and CANMessageGet() APIs. +// +//***************************************************************************** +typedef enum +{ + // + //! This indicates that transmit interrupts should be enabled, or are + //! enabled. + // + MSG_OBJ_TX_INT_ENABLE = 0x00000001, + + // + //! This indicates that receive interrupts should be enabled or are + //! enabled. + // + MSG_OBJ_RX_INT_ENABLE = 0x00000002, + + // + //! This indicates that a message object will use or is using an extended + //! identifier. + // + MSG_OBJ_EXTENDED_ID = 0x00000004, + + // + //! This indicates that a message object will use or is using filtering + //! based on the object's message Identifier. + // + MSG_OBJ_USE_ID_FILTER = 0x00000008, + + // + //! This indicates that new data was available in the message object. + // + MSG_OBJ_NEW_DATA = 0x00000080, + + // + //! This indicates that data was lost since this message object was last + //! read. + // + MSG_OBJ_DATA_LOST = 0x00000100, + + // + //! This indicates that a message object will use or is using filtering + //! based on the direction of the transfer. If the direction filtering is + //! used then ID filtering must also be enabled. + // + MSG_OBJ_USE_DIR_FILTER = (0x00000010 | MSG_OBJ_USE_ID_FILTER), + + // + //! This indicates that a message object will use or is using message + //! identifier filtering based of the the extended identifier. + //! If the extended identifier filtering is used then ID filtering must + //! also be enabled. + // + MSG_OBJ_USE_EXT_FILTER = (0x00000020 | MSG_OBJ_USE_ID_FILTER), + + // + //! This indicates that a message object is a remote frame. + // + MSG_OBJ_REMOTE_FRAME = 0x00000040, + + // + //! This indicates that a message object has no flags set. + // + MSG_OBJ_NO_FLAGS = 0x00000000 +} +tCANObjFlags; + +//***************************************************************************** +// +//! This define is used with the #tCANObjFlags enumerated values to allow +//! checking only status flags and not configuration flags. +// +//***************************************************************************** +#define MSG_OBJ_STATUS_MASK (MSG_OBJ_NEW_DATA | MSG_OBJ_DATA_LOST) + +//***************************************************************************** +// +//! This structure used for encapsulating all the items associated with a CAN +//! message object in the CAN controller. +// +//***************************************************************************** +typedef struct +{ + // + //! The CAN message identifier used for 11 or 29 bit identifiers. + // + unsigned long ulMsgID; + + // + //! The message identifier mask used when identifier filtering is enabled. + // + unsigned long ulMsgIDMask; + + // + //! This value holds various status flags and settings specified by + //! tCANObjFlags. + // + unsigned long ulFlags; + + // + //! This value is the number of bytes of data in the message object. + // + unsigned long ulMsgLen; + + // + //! This is a pointer to the message object's data. + // + unsigned char *pucMsgData; +} +tCANMsgObject; + +//***************************************************************************** +// +//! This structure is used for encapsulating the values associated with setting +//! up the bit timing for a CAN controller. The structure is used when calling +//! the CANGetBitTiming and CANSetBitTiming functions. +// +//***************************************************************************** +typedef struct +{ + // + //! This value holds the sum of the Synchronization, Propagation, and Phase + //! Buffer 1 segments, measured in time quanta. The valid values for this + //! setting range from 2 to 16. + // + unsigned int uSyncPropPhase1Seg; + + // + //! This value holds the Phase Buffer 2 segment in time quanta. The valid + //! values for this setting range from 1 to 8. + // + unsigned int uPhase2Seg; + + // + //! This value holds the Resynchronization Jump Width in time quanta. The + //! valid values for this setting range from 1 to 4. + // + unsigned int uSJW; + + // + //! This value holds the CAN_CLK divider used to determine time quanta. + //! The valid values for this setting range from 1 to 1023. + // + unsigned int uQuantumPrescaler; + +} +tCANBitClkParms; + +//***************************************************************************** +// +//! This data type is used to identify the interrupt status register. This is +//! used when calling the a CANIntStatus() function. +// +//***************************************************************************** +typedef enum +{ + // + //! Read the CAN interrupt status information. + // + CAN_INT_STS_CAUSE, + + // + //! Read a message object's interrupt status. + // + CAN_INT_STS_OBJECT +} +tCANIntStsReg; + +//***************************************************************************** +// +//! This data type is used to identify which of the several status registers +//! to read when calling the CANStatusGet() function. +// +//***************************************************************************** +typedef enum +{ + // + //! Read the full CAN controller status. + // + CAN_STS_CONTROL, + + // + //! Read the full 32 bit mask of message objects with a transmit request + //! set. + // + CAN_STS_TXREQUEST, + + // + //! Read the full 32 bit mask of message objects with a new data available. + // + CAN_STS_NEWDAT, + + // + //! Read the full 32 bit mask of message objects that are enabled. + // + CAN_STS_MSGVAL +} +tCANStsReg; + +//***************************************************************************** +// +//! These definitions are used to specify interrupt sources to CANIntEnable() +//! and CANIntDisable(). +// +//***************************************************************************** +typedef enum +{ + // + //! This flag is used to allow a CAN controller to generate error + //! interrupts. + // + CAN_INT_ERROR = 0x00000008, + + // + //! This flag is used to allow a CAN controller to generate status + //! interrupts. + // + CAN_INT_STATUS = 0x00000004, + + // + //! This flag is used to allow a CAN controller to generate any CAN + //! interrupts. If this is not set then no interrupts will be generated by + //! the CAN controller. + // + CAN_INT_MASTER = 0x00000002 +} +tCANIntFlags; + +//***************************************************************************** +// +//! This definition is used to determine the type of message object that will +//! be set up via a call to the CANMessageSet() API. +// +//***************************************************************************** +typedef enum +{ + // + //! Transmit message object. + // + MSG_OBJ_TYPE_TX, + + // + //! Transmit remote request message object + // + MSG_OBJ_TYPE_TX_REMOTE, + + // + //! Receive message object. + // + MSG_OBJ_TYPE_RX, + + // + //! Receive remote request message object. + // + MSG_OBJ_TYPE_RX_REMOTE, + + // + //! Remote frame receive remote, with auto-transmit message object. + // + MSG_OBJ_TYPE_RXTX_REMOTE +} +tMsgObjType; + +//***************************************************************************** +// +//! The following enumeration contains all error or status indicators that +//! can be returned when calling the CANStatusGet() API. +// +//***************************************************************************** +typedef enum +{ + // + //! CAN controller has entered a Bus Off state. + // + CAN_STATUS_BUS_OFF = 0x00000080, + + // + //! CAN controller error level has reached warning level. + // + CAN_STATUS_EWARN = 0x00000040, + + // + //! CAN controller error level has reached error passive level. + // + CAN_STATUS_EPASS = 0x00000020, + + // + //! A message was received successfully since the last read of this status. + // + CAN_STATUS_RXOK = 0x00000010, + + // + //! A message was transmitted successfully since the last read of this + //! status. + // + CAN_STATUS_TXOK = 0x00000008, + + // + //! This is the mask for the last error code field. + // + CAN_STATUS_LEC_MSK = 0x00000007, + + // + //! There was no error. + // + CAN_STATUS_LEC_NONE = 0x00000000, + + // + //! A bit stuffing error has occurred. + // + CAN_STATUS_LEC_STUFF = 0x00000001, + + // + //! A formatting error has occurred. + // + CAN_STATUS_LEC_FORM = 0x00000002, + + // + //! An acknowledge error has occurred. + // + CAN_STATUS_LEC_ACK = 0x00000003, + + // + //! The bus remained a bit level of 1 for longer than is allowed. + // + CAN_STATUS_LEC_BIT1 = 0x00000004, + + // + //! The bus remained a bit level of 0 for longer than is allowed. + // + CAN_STATUS_LEC_BIT0 = 0x00000005, + + // + //! A CRC error has occurred. + // + CAN_STATUS_LEC_CRC = 0x00000006, + + // + //! This is the mask for the CAN Last Error Code (LEC). + // + CAN_STATUS_LEC_MASK = 0x00000007 +} +tCANStatusCtrl; + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void CANInit(unsigned long ulBase); +extern void CANEnable(unsigned long ulBase); +extern void CANDisable(unsigned long ulBase); +extern void CANSetBitTiming(unsigned long ulBase, tCANBitClkParms *pClkParms); +extern void CANGetBitTiming(unsigned long ulBase, tCANBitClkParms *pClkParms); +extern unsigned long CANReadReg(unsigned long ulRegAddress); +extern void CANWriteReg(unsigned long ulRegAddress, unsigned long ulRegValue); +extern void CANMessageSet(unsigned long ulBase, unsigned long ulObjID, + tCANMsgObject *pMsgObject, tMsgObjType eMsgType); +extern void CANMessageGet(unsigned long ulBase, unsigned long ulObjID, + tCANMsgObject *pMsgObject, tBoolean bClrPendingInt); +extern unsigned long CANStatusGet(unsigned long ulBase, tCANStsReg eStatusReg); +extern void CANMessageClear(unsigned long ulBase, unsigned long ulObjID); +extern void CANIntRegister(unsigned long ulBase, void (*pfnHandler)(void)); +extern void CANIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void CANIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern void CANIntClear(unsigned long ulBase, unsigned long ulIntClr); +extern unsigned long CANIntStatus(unsigned long ulBase, + tCANIntStsReg eIntStsReg); +extern tBoolean CANRetryGet(unsigned long ulBase); +extern void CANRetrySet(unsigned long ulBase, tBoolean bAutoRetry); +extern tBoolean CANErrCntrGet(unsigned long ulBase, unsigned long *pulRxCount, + unsigned long *pulTxCount); +extern long CANGetIntNumber(unsigned long ulBase); +extern void CANReadDataReg(unsigned char *pucData, unsigned long *pulRegister, + int iSize); +extern void CANWriteDataReg(unsigned char *pucData, unsigned long *pulRegister, + int iSize); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +#ifdef __cplusplus +} +#endif + +#endif // __CAN_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/comp.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/comp.h new file mode 100644 index 000000000..60fa1e04e --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/comp.h @@ -0,0 +1,122 @@ +//***************************************************************************** +// +// comp.h - Prototypes for the analog comparator driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __COMP_H__ +#define __COMP_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to ComparatorConfigure() as the ulConfig +// parameter. For each group (i.e. COMP_TRIG_xxx, COMP_INT_xxx, etc.), one of +// the values may be selected and ORed together will values from the other +// groups. +// +//***************************************************************************** +#define COMP_TRIG_NONE 0x00000000 // No ADC trigger +#define COMP_TRIG_HIGH 0x00000880 // Trigger when high +#define COMP_TRIG_LOW 0x00000800 // Trigger when low +#define COMP_TRIG_FALL 0x00000820 // Trigger on falling edge +#define COMP_TRIG_RISE 0x00000840 // Trigger on rising edge +#define COMP_TRIG_BOTH 0x00000860 // Trigger on both edges +#define COMP_INT_HIGH 0x00000010 // Interrupt when high +#define COMP_INT_LOW 0x00000000 // Interrupt when low +#define COMP_INT_FALL 0x00000004 // Interrupt on falling edge +#define COMP_INT_RISE 0x00000008 // Interrupt on rising edge +#define COMP_INT_BOTH 0x0000000C // Interrupt on both edges +#define COMP_ASRCP_PIN 0x00000000 // Dedicated Comp+ pin +#define COMP_ASRCP_PIN0 0x00000200 // Comp0+ pin +#define COMP_ASRCP_REF 0x00000400 // Internal voltage reference +#ifndef DEPRECATED +#define COMP_OUTPUT_NONE 0x00000000 // No comparator output +#endif +#define COMP_OUTPUT_NORMAL 0x00000000 // Comparator output normal +#define COMP_OUTPUT_INVERT 0x00000002 // Comparator output inverted + +//***************************************************************************** +// +// Values that can be passed to ComparatorSetRef() as the ulRef parameter. +// +//***************************************************************************** +#define COMP_REF_OFF 0x00000000 // Turn off the internal reference +#define COMP_REF_0V 0x00000300 // Internal reference of 0V +#define COMP_REF_0_1375V 0x00000301 // Internal reference of 0.1375V +#define COMP_REF_0_275V 0x00000302 // Internal reference of 0.275V +#define COMP_REF_0_4125V 0x00000303 // Internal reference of 0.4125V +#define COMP_REF_0_55V 0x00000304 // Internal reference of 0.55V +#define COMP_REF_0_6875V 0x00000305 // Internal reference of 0.6875V +#define COMP_REF_0_825V 0x00000306 // Internal reference of 0.825V +#define COMP_REF_0_928125V 0x00000201 // Internal reference of 0.928125V +#define COMP_REF_0_9625V 0x00000307 // Internal reference of 0.9625V +#define COMP_REF_1_03125V 0x00000202 // Internal reference of 1.03125V +#define COMP_REF_1_134375V 0x00000203 // Internal reference of 1.134375V +#define COMP_REF_1_1V 0x00000308 // Internal reference of 1.1V +#define COMP_REF_1_2375V 0x00000309 // Internal reference of 1.2375V +#define COMP_REF_1_340625V 0x00000205 // Internal reference of 1.340625V +#define COMP_REF_1_375V 0x0000030A // Internal reference of 1.375V +#define COMP_REF_1_44375V 0x00000206 // Internal reference of 1.44375V +#define COMP_REF_1_5125V 0x0000030B // Internal reference of 1.5125V +#define COMP_REF_1_546875V 0x00000207 // Internal reference of 1.546875V +#define COMP_REF_1_65V 0x0000030C // Internal reference of 1.65V +#define COMP_REF_1_753125V 0x00000209 // Internal reference of 1.753125V +#define COMP_REF_1_7875V 0x0000030D // Internal reference of 1.7875V +#define COMP_REF_1_85625V 0x0000020A // Internal reference of 1.85625V +#define COMP_REF_1_925V 0x0000030E // Internal reference of 1.925V +#define COMP_REF_1_959375V 0x0000020B // Internal reference of 1.959375V +#define COMP_REF_2_0625V 0x0000030F // Internal reference of 2.0625V +#define COMP_REF_2_165625V 0x0000020D // Internal reference of 2.165625V +#define COMP_REF_2_26875V 0x0000020E // Internal reference of 2.26875V +#define COMP_REF_2_371875V 0x0000020F // Internal reference of 2.371875V + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void ComparatorConfigure(unsigned long ulBase, unsigned long ulComp, + unsigned long ulConfig); +extern void ComparatorRefSet(unsigned long ulBase, unsigned long ulRef); +extern tBoolean ComparatorValueGet(unsigned long ulBase, unsigned long ulComp); +extern void ComparatorIntRegister(unsigned long ulBase, unsigned long ulComp, + void (*pfnHandler)(void)); +extern void ComparatorIntUnregister(unsigned long ulBase, + unsigned long ulComp); +extern void ComparatorIntEnable(unsigned long ulBase, unsigned long ulComp); +extern void ComparatorIntDisable(unsigned long ulBase, unsigned long ulComp); +extern tBoolean ComparatorIntStatus(unsigned long ulBase, unsigned long ulComp, + tBoolean bMasked); +extern void ComparatorIntClear(unsigned long ulBase, unsigned long ulComp); + +#ifdef __cplusplus +} +#endif + +#endif // __COMP_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/cpu.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/cpu.h new file mode 100644 index 000000000..f21f82221 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/cpu.h @@ -0,0 +1,40 @@ +//***************************************************************************** +// +// cpu.h - Prototypes for the CPU instruction wrapper functions. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __CPU_H__ +#define __CPU_H__ + +//***************************************************************************** +// +// Prototypes. +// +//***************************************************************************** +extern void CPUcpsid(void); +extern void CPUcpsie(void); +extern void CPUwfi(void); + +#endif // __CPU_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/debug.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/debug.h new file mode 100644 index 000000000..c64b8fc2d --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/debug.h @@ -0,0 +1,56 @@ +//***************************************************************************** +// +// debug.h - Macros for assisting debug of the driver library. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __DEBUG_H__ +#define __DEBUG_H__ + +//***************************************************************************** +// +// Prototype for the function that is called when an invalid argument is passed +// to an API. This is only used when doing a DEBUG build. +// +//***************************************************************************** +extern void __error__(char *pcFilename, unsigned long ulLine); + +//***************************************************************************** +// +// The ASSERT macro, which does the actual assertion checking. Typically, this +// will be for procedure arguments. +// +//***************************************************************************** +#ifdef DEBUG +#define ASSERT(expr) { \ + if(!(expr)) \ + { \ + __error__(__FILE__, __LINE__); \ + } \ + } +#else +#define ASSERT(expr) +#endif + +#endif // __DEBUG_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/ethernet.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/ethernet.h new file mode 100644 index 000000000..127763f2c --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/ethernet.h @@ -0,0 +1,254 @@ +//***************************************************************************** +// +// ethernet.h - Defines and Macros for the ethernet module. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __ETHERNET_H__ +#define __ETHERNET_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to EthernetConfigSet as the ulConfig value, and +// returned from EthernetConfigGet. +// +//***************************************************************************** +#define ETH_CFG_RX_BADCRCDIS 0x000800 // Disable RX BAD CRC Packets +#define ETH_CFG_RX_PRMSEN 0x000400 // Enable RX Promiscuous +#define ETH_CFG_RX_AMULEN 0x000200 // Enable RX Multicast +#define ETH_CFG_TX_DPLXEN 0x000010 // Enable TX Duplex Mode +#define ETH_CFG_TX_CRCEN 0x000004 // Enable TX CRC Generation +#define ETH_CFG_TX_PADEN 0x000002 // Enable TX Padding + +//***************************************************************************** +// +// Values that can be passed to EthernetIntEnable, EthernetIntDisable, and +// EthernetIntClear as the ulIntFlags parameter, and returned from +// EthernetIntStatus. +// +//***************************************************************************** +#define ETH_INT_PHY 0x040 // PHY Event/Interrupt +#define ETH_INT_MDIO 0x020 // Management Transaction +#define ETH_INT_RXER 0x010 // RX Error +#define ETH_INT_RXOF 0x008 // RX FIFO Overrun +#define ETH_INT_TX 0x004 // TX Complete +#define ETH_INT_TXER 0x002 // TX Error +#define ETH_INT_RX 0x001 // RX Complete + +//***************************************************************************** +// +// The following define values that can be passed as register addresses to +// EthernetPHYRead and EthernetPHYWrite. +// +//***************************************************************************** +#define PHY_MR0 0 // Control +#define PHY_MR1 1 // Status +#define PHY_MR2 2 // PHY Identifier 1 +#define PHY_MR3 3 // PHY Identifier 2 +#define PHY_MR4 4 // Auto-Neg. Advertisement +#define PHY_MR5 5 // Auto-Neg. Link Partner Ability +#define PHY_MR6 6 // Auto-Neg. Expansion + // 7-15 Reserved/Not Implemented +#define PHY_MR16 16 // Vendor Specific +#define PHY_MR17 17 // Interrupt Control/Status +#define PHY_MR18 18 // Diagnostic Register +#define PHY_MR19 19 // Transceiver Control + // 20-22 Reserved +#define PHY_MR23 23 // LED Configuration Register +#define PHY_MR24 24 // MDI/MDIX Control Register + // 25-31 Reserved/Not Implemented + +//***************************************************************************** +// +// The following define bit fields in the ETH_MR0 register +// +//***************************************************************************** +#define PHY_MR0_RESET 0x8000 // Reset the PHY +#define PHY_MR0_LOOPBK 0x4000 // TXD to RXD Loopback +#define PHY_MR0_SPEEDSL 0x2000 // Speed Selection +#define PHY_MR0_SPEEDSL_10 0x0000 // Speed Selection 10BASE-T +#define PHY_MR0_SPEEDSL_100 0x2000 // Speed Selection 100BASE-T +#define PHY_MR0_ANEGEN 0x1000 // Auto-Negotiation Enable +#define PHY_MR0_PWRDN 0x0800 // Power Down +#define PHY_MR0_RANEG 0x0200 // Restart Auto-Negotiation +#define PHY_MR0_DUPLEX 0x0100 // Enable full duplex +#define PHY_MR0_DUPLEX_HALF 0x0000 // Enable half duplex mode +#define PHY_MR0_DUPLEX_FULL 0x0100 // Enable full duplex mode + +//***************************************************************************** +// +// The following define bit fields in the ETH_MR1 register +// +//***************************************************************************** +#define PHY_MR1_ANEGC 0x0020 // Auto-Negotiate Complete +#define PHY_MR1_RFAULT 0x0010 // Remove Fault Detected +#define PHY_MR1_LINK 0x0004 // Link Established +#define PHY_MR1_JAB 0x0002 // Jabber Condition Detected + +//***************************************************************************** +// +// The following define bit fields in the ETH_MR17 register +// +//***************************************************************************** +#define PHY_MR17_RXER_IE 0x4000 // Enable Receive Error Interrupt +#define PHY_MR17_LSCHG_IE 0x0400 // Enable Link Status Change Int. +#define PHY_MR17_ANEGCOMP_IE 0x0100 // Enable Auto-Negotiate Cmpl. Int. +#define PHY_MR17_RXER_INT 0x0040 // Receive Error Interrupt +#define PHY_MR17_LSCHG_INT 0x0004 // Link Status Change Interrupt +#define PHY_MR17_ANEGCOMP_INT 0x0001 // Auto-Negotiate Complete Int. + +//***************************************************************************** +// +// The following define bit fields in the ETH_MR18 register +// +//***************************************************************************** +#define PHY_MR18_ANEGF 0x1000 // Auto-Negotiate Failed +#define PHY_MR18_DPLX 0x0800 // Duplex Mode Negotiated +#define PHY_MR18_DPLX_HALF 0x0000 // Half Duplex Mode Negotiated +#define PHY_MR18_DPLX_FULL 0x0800 // Full Duplex Mode Negotiated +#define PHY_MR18_RATE 0x0400 // Rate Negotiated +#define PHY_MR18_RATE_10 0x0000 // Rate Negotiated is 10BASE-T +#define PHY_MR18_RATE_100 0x0400 // Rate Negotiated is 100BASE-TX + +//***************************************************************************** +// +// The following define bit fields in the ETH_MR23 register +// +//***************************************************************************** +#define PHY_MR23_LED1 0x00f0 // LED1 Configuration +#define PHY_MR23_LED1_LINK 0x0000 // LED1 is Link Status +#define PHY_MR23_LED1_RXTX 0x0010 // LED1 is RX or TX Activity +#define PHY_MR23_LED1_TX 0x0020 // LED1 is TX Activity +#define PHY_MR23_LED1_RX 0x0030 // LED1 is RX Activity +#define PHY_MR23_LED1_COL 0x0040 // LED1 is RX Activity +#define PHY_MR23_LED1_100 0x0050 // LED1 is RX Activity +#define PHY_MR23_LED1_10 0x0060 // LED1 is RX Activity +#define PHY_MR23_LED1_DUPLEX 0x0070 // LED1 is RX Activity +#define PHY_MR23_LED1_LINKACT 0x0080 // LED1 is Link Status + Activity +#define PHY_MR23_LED0 0x000f // LED0 Configuration +#define PHY_MR23_LED0_LINK 0x0000 // LED0 is Link Status +#define PHY_MR23_LED0_RXTX 0x0001 // LED0 is RX or TX Activity +#define PHY_MR23_LED0_TX 0x0002 // LED0 is TX Activity +#define PHY_MR23_LED0_RX 0x0003 // LED0 is RX Activity +#define PHY_MR23_LED0_COL 0x0004 // LED0 is RX Activity +#define PHY_MR23_LED0_100 0x0005 // LED0 is RX Activity +#define PHY_MR23_LED0_10 0x0006 // LED0 is RX Activity +#define PHY_MR23_LED0_DUPLEX 0x0007 // LED0 is RX Activity +#define PHY_MR23_LED0_LINKACT 0x0008 // LED0 is Link Status + Activity + +//***************************************************************************** +// +// The following define bit fields in the ETH_MR24 register +// +//***************************************************************************** +#define PHY_MR24_MDIX 0x0020 // Auto-Switching Configuration +#define PHY_MR24_MDIX_NORMAL 0x0000 // Auto-Switching in passthrough +#define PHY_MR23_MDIX_CROSSOVER 0x0020 // Auto-Switching in crossover + +//***************************************************************************** +// +// Helper Macros for Ethernet Processing +// +//***************************************************************************** +// +// htonl/ntohl - big endian/little endian byte swapping macros for +// 32-bit (long) values +// +//***************************************************************************** +#ifndef htonl + #define htonl(a) \ + ((((a) >> 24) & 0x000000ff) | \ + (((a) >> 8) & 0x0000ff00) | \ + (((a) << 8) & 0x00ff0000) | \ + (((a) << 24) & 0xff000000)) +#endif + +#ifndef ntohl + #define ntohl(a) htonl((a)) +#endif + +//***************************************************************************** +// +// htons/ntohs - big endian/little endian byte swapping macros for +// 16-bit (short) values +// +//***************************************************************************** +#ifndef htons + #define htons(a) \ + ((((a) >> 8) & 0x00ff) | \ + (((a) << 8) & 0xff00)) +#endif + +#ifndef ntohs + #define ntohs(a) htons((a)) +#endif + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void EthernetInit(unsigned long ulBase); +extern void EthernetConfigSet(unsigned long ulBase, unsigned long ulConfig); +extern unsigned long EthernetConfigGet(unsigned long ulBase); +extern void EthernetMACAddrSet(unsigned long ulBase, + unsigned char *pucMACAddr); +extern void EthernetMACAddrGet(unsigned long ulBase, + unsigned char *pucMACAddr); +extern void EthernetEnable(unsigned long ulBase); +extern void EthernetDisable(unsigned long ulBase); +extern tBoolean EthernetPacketAvail(unsigned long ulBase); +extern tBoolean EthernetSpaceAvail(unsigned long ulBase); +extern long EthernetPacketNonBlockingGet(unsigned long ulBase, + unsigned char *pucBuf, + long lBufLen); +extern long EthernetPacketGet(unsigned long ulBase, unsigned char *pucBuf, + long lBufLen); +extern long EthernetPacketNonBlockingPut(unsigned long ulBase, + unsigned char *pucBuf, + long lBufLen); +extern long EthernetPacketPut(unsigned long ulBase, unsigned char *pucBuf, + long lBufLen); +extern void EthernetIntRegister(unsigned long ulBase, + void (*pfnHandler)(void)); +extern void EthernetIntUnregister(unsigned long ulBase); +extern void EthernetIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void EthernetIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long EthernetIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void EthernetIntClear(unsigned long ulBase, unsigned long ulIntFlags); +extern void EthernetPHYWrite(unsigned long ulBase, unsigned char ucRegAddr, + unsigned long ulData); +extern unsigned long EthernetPHYRead(unsigned long ulBase, + unsigned char ucRegAddr); + +#ifdef __cplusplus +} +#endif + +#endif // __ETHERNET_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/gpio.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/gpio.h new file mode 100644 index 000000000..6e74f9d4f --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/gpio.h @@ -0,0 +1,138 @@ +//***************************************************************************** +// +// gpio.h - Defines and Macros for GPIO API. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __GPIO_H__ +#define __GPIO_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following values define the bit field for the ucPins argument to several +// of the APIs. +// +//***************************************************************************** +#define GPIO_PIN_0 0x00000001 // GPIO pin 0 +#define GPIO_PIN_1 0x00000002 // GPIO pin 1 +#define GPIO_PIN_2 0x00000004 // GPIO pin 2 +#define GPIO_PIN_3 0x00000008 // GPIO pin 3 +#define GPIO_PIN_4 0x00000010 // GPIO pin 4 +#define GPIO_PIN_5 0x00000020 // GPIO pin 5 +#define GPIO_PIN_6 0x00000040 // GPIO pin 6 +#define GPIO_PIN_7 0x00000080 // GPIO pin 7 + +//***************************************************************************** +// +// Values that can be passed to GPIODirModeSet as the ulPinIO parameter, and +// returned from GPIODirModeGet. +// +//***************************************************************************** +#define GPIO_DIR_MODE_IN 0x00000000 // Pin is a GPIO input +#define GPIO_DIR_MODE_OUT 0x00000001 // Pin is a GPIO output +#define GPIO_DIR_MODE_HW 0x00000002 // Pin is a peripheral function + +//***************************************************************************** +// +// Values that can be passed to GPIOIntTypeSet as the ulIntType parameter, and +// returned from GPIOIntTypeGet. +// +//***************************************************************************** +#define GPIO_FALLING_EDGE 0x00000000 // Interrupt on falling edge +#define GPIO_RISING_EDGE 0x00000004 // Interrupt on rising edge +#define GPIO_BOTH_EDGES 0x00000001 // Interrupt on both edges +#define GPIO_LOW_LEVEL 0x00000002 // Interrupt on low level +#define GPIO_HIGH_LEVEL 0x00000007 // Interrupt on high level + +//***************************************************************************** +// +// Values that can be passed to GPIOPadConfigSet as the ulStrength parameter, +// and returned by GPIOPadConfigGet in the *pulStrength parameter. +// +//***************************************************************************** +#define GPIO_STRENGTH_2MA 0x00000001 // 2mA drive strength +#define GPIO_STRENGTH_4MA 0x00000002 // 4mA drive strength +#define GPIO_STRENGTH_8MA 0x00000004 // 8mA drive strength +#define GPIO_STRENGTH_8MA_SC 0x0000000C // 8mA drive with slew rate control + +//***************************************************************************** +// +// Values that can be passed to GPIOPadConfigSet as the ulPadType parameter, +// and returned by GPIOPadConfigGet in the *pulPadType parameter. +// +//***************************************************************************** +#define GPIO_PIN_TYPE_STD 0x00000008 // Push-pull +#define GPIO_PIN_TYPE_STD_WPU 0x0000000A // Push-pull with weak pull-up +#define GPIO_PIN_TYPE_STD_WPD 0x0000000C // Push-pull with weak pull-down +#define GPIO_PIN_TYPE_OD 0x00000009 // Open-drain +#define GPIO_PIN_TYPE_OD_WPU 0x0000000B // Open-drain with weak pull-up +#define GPIO_PIN_TYPE_OD_WPD 0x0000000D // Open-drain with weak pull-down +#define GPIO_PIN_TYPE_ANALOG 0x00000000 // Analog comparator + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void GPIODirModeSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulPinIO); +extern unsigned long GPIODirModeGet(unsigned long ulPort, unsigned char ucPin); +extern void GPIOIntTypeSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulIntType); +extern unsigned long GPIOIntTypeGet(unsigned long ulPort, unsigned char ucPin); +extern void GPIOPadConfigSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulStrength, + unsigned long ulPadType); +extern void GPIOPadConfigGet(unsigned long ulPort, unsigned char ucPin, + unsigned long *pulStrength, + unsigned long *pulPadType); +extern void GPIOPinIntEnable(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinIntDisable(unsigned long ulPort, unsigned char ucPins); +extern long GPIOPinIntStatus(unsigned long ulPort, tBoolean bMasked); +extern void GPIOPinIntClear(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPortIntRegister(unsigned long ulPort, + void (*pfIntHandler)(void)); +extern void GPIOPortIntUnregister(unsigned long ulPort); +extern long GPIOPinRead(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinWrite(unsigned long ulPort, unsigned char ucPins, + unsigned char ucVal); +extern void GPIOPinTypeComparator(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeI2C(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypePWM(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeQEI(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeSSI(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeTimer(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeUART(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeCAN(unsigned long ulPort, unsigned char ucPins); + +#ifdef __cplusplus +} +#endif + +#endif // __GPIO_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hibernate.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hibernate.h new file mode 100644 index 000000000..69a8c144a --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hibernate.h @@ -0,0 +1,107 @@ +//***************************************************************************** +// +// hibernate.h - API definition for the Hibernation module. +// +// Copyright (c) 2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HIBERNATE_H__ +#define __HIBERNATE_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Macros needed for selecting the clock source for HibernateClockSelect() +// +//***************************************************************************** +#define HIBERNATE_CLOCK_SEL_RAW 0x04 +#define HIBERNATE_CLOCK_SEL_DIV128 0x00 + +//***************************************************************************** +// +// Macros need to configure wake events for HibernateWakeSet() +// +//***************************************************************************** +#define HIBERNATE_WAKE_PIN 0x10 +#define HIBERNATE_WAKE_RTC 0x08 + +//***************************************************************************** +// +// Macros needed to configure low battery detect for HibernateLowBatSet() +// +//***************************************************************************** +#define HIBERNATE_LOW_BAT_DETECT 0x20 +#define HIBERNATE_LOW_BAT_ABORT 0xA0 + +//***************************************************************************** +// +// Macros defining interrupt source bits for the interrupt functions. +// +//***************************************************************************** +#define HIBERNATE_INT_PIN_WAKE 0x08 +#define HIBERNATE_INT_LOW_BAT 0x04 +#define HIBERNATE_INT_RTC_MATCH_0 0x01 +#define HIBERNATE_INT_RTC_MATCH_1 0x02 + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void HibernateEnable(void); +extern void HibernateDisable(void); +extern void HibernateClockSelect(unsigned long ulClockInput); +extern void HibernateRTCEnable(void); +extern void HibernateRTCDisable(void); +extern void HibernateWakeSet(unsigned long ulWakeFlags); +extern unsigned long HibernateWakeGet(void); +extern void HibernateLowBatSet(unsigned long ulLowBatFlags); +extern unsigned long HibernateLowBatGet(void); +extern void HibernateRTCSet(unsigned long ulRTCValue); +extern unsigned long HibernateRTCGet(void); +extern void HibernateRTCMatch0Set(unsigned long ulMatch); +extern unsigned long HibernateRTCMatch0Get(void); +extern void HibernateRTCMatch1Set(unsigned long ulMatch); +extern unsigned long HibernateRTCMatch1Get(void); +extern void HibernateRTCTrimSet(unsigned long ulTrim); +extern unsigned long HibernateRTCTrimGet(void); +extern void HibernateDataSet(unsigned long *pulData, unsigned long ulCount); +extern void HibernateDataGet(unsigned long *pulData, unsigned long ulCount); +extern void HibernateRequest(void); +extern void HibernateIntEnable(unsigned long ulIntFlags); +extern void HibernateIntDisable(unsigned long ulIntFlags); +extern void HibernateIntRegister(void (*pfnHandler)(void)); +extern void HibernateIntUnregister(void); +extern unsigned long HibernateIntStatus(tBoolean bMasked); +extern void HibernateIntClear(unsigned long ulIntFlags); +extern unsigned int HibernateIsActive(void); + +#ifdef __cplusplus +} +#endif + +#endif // __HIBERNATE_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_adc.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_adc.h new file mode 100644 index 000000000..932d3f26e --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_adc.h @@ -0,0 +1,343 @@ +//***************************************************************************** +// +// hw_adc.h - Macros used when accessing the ADC hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_ADC_H__ +#define __HW_ADC_H__ + +//***************************************************************************** +// +// The following define the offsets of the ADC registers. +// +//***************************************************************************** +#define ADC_O_ACTSS 0x00000000 // Active sample register +#define ADC_O_RIS 0x00000004 // Raw interrupt status register +#define ADC_O_IM 0x00000008 // Interrupt mask register +#define ADC_O_ISC 0x0000000C // Interrupt status/clear register +#define ADC_O_OSTAT 0x00000010 // Overflow status register +#define ADC_O_EMUX 0x00000014 // Event multiplexer select reg. +#define ADC_O_USTAT 0x00000018 // Underflow status register +#define ADC_O_SSPRI 0x00000020 // Channel priority register +#define ADC_O_PSSI 0x00000028 // Processor sample initiate reg. +#define ADC_O_SAC 0x00000030 // Sample Averaging Control reg. +#define ADC_O_SSMUX0 0x00000040 // Multiplexer select 0 register +#define ADC_O_SSCTL0 0x00000044 // Sample sequence control 0 reg. +#define ADC_O_SSFIFO0 0x00000048 // Result FIFO 0 register +#define ADC_O_SSFSTAT0 0x0000004C // FIFO 0 status register +#define ADC_O_SSMUX1 0x00000060 // Multiplexer select 1 register +#define ADC_O_SSCTL1 0x00000064 // Sample sequence control 1 reg. +#define ADC_O_SSFIFO1 0x00000068 // Result FIFO 1 register +#define ADC_O_SSFSTAT1 0x0000006C // FIFO 1 status register +#define ADC_O_SSMUX2 0x00000080 // Multiplexer select 2 register +#define ADC_O_SSCTL2 0x00000084 // Sample sequence control 2 reg. +#define ADC_O_SSFIFO2 0x00000088 // Result FIFO 2 register +#define ADC_O_SSFSTAT2 0x0000008C // FIFO 2 status register +#define ADC_O_SSMUX3 0x000000A0 // Multiplexer select 3 register +#define ADC_O_SSCTL3 0x000000A4 // Sample sequence control 3 reg. +#define ADC_O_SSFIFO3 0x000000A8 // Result FIFO 3 register +#define ADC_O_SSFSTAT3 0x000000AC // FIFO 3 status register +#define ADC_O_TMLB 0x00000100 // Test mode loopback register + +//***************************************************************************** +// +// The following define the offsets of the ADC sequence registers. +// +//***************************************************************************** +#define ADC_O_SEQ 0x00000040 // Offset to the first sequence +#define ADC_O_SEQ_STEP 0x00000020 // Increment to the next sequence +#define ADC_O_X_SSMUX 0x00000000 // Multiplexer select register +#define ADC_O_X_SSCTL 0x00000004 // Sample sequence control register +#define ADC_O_X_SSFIFO 0x00000008 // Result FIFO register +#define ADC_O_X_SSFSTAT 0x0000000C // FIFO status register + +//***************************************************************************** +// +// The following define the bit fields in the ADC_ACTSS register. +// +//***************************************************************************** +#define ADC_ACTSS_ASEN3 0x00000008 // Sample sequence 3 enable +#define ADC_ACTSS_ASEN2 0x00000004 // Sample sequence 2 enable +#define ADC_ACTSS_ASEN1 0x00000002 // Sample sequence 1 enable +#define ADC_ACTSS_ASEN0 0x00000001 // Sample sequence 0 enable + +//***************************************************************************** +// +// The following define the bit fields in the ADC_RIS register. +// +//***************************************************************************** +#define ADC_RIS_INR3 0x00000008 // Sample sequence 3 interrupt +#define ADC_RIS_INR2 0x00000004 // Sample sequence 2 interrupt +#define ADC_RIS_INR1 0x00000002 // Sample sequence 1 interrupt +#define ADC_RIS_INR0 0x00000001 // Sample sequence 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the ADC_IM register. +// +//***************************************************************************** +#define ADC_IM_MASK3 0x00000008 // Sample sequence 3 mask +#define ADC_IM_MASK2 0x00000004 // Sample sequence 2 mask +#define ADC_IM_MASK1 0x00000002 // Sample sequence 1 mask +#define ADC_IM_MASK0 0x00000001 // Sample sequence 0 mask + +//***************************************************************************** +// +// The following define the bit fields in the ADC_ISC register. +// +//***************************************************************************** +#define ADC_ISC_IN3 0x00000008 // Sample sequence 3 interrupt +#define ADC_ISC_IN2 0x00000004 // Sample sequence 2 interrupt +#define ADC_ISC_IN1 0x00000002 // Sample sequence 1 interrupt +#define ADC_ISC_IN0 0x00000001 // Sample sequence 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the ADC_OSTAT register. +// +//***************************************************************************** +#define ADC_OSTAT_OV3 0x00000008 // Sample sequence 3 overflow +#define ADC_OSTAT_OV2 0x00000004 // Sample sequence 2 overflow +#define ADC_OSTAT_OV1 0x00000002 // Sample sequence 1 overflow +#define ADC_OSTAT_OV0 0x00000001 // Sample sequence 0 overflow + +//***************************************************************************** +// +// The following define the bit fields in the ADC_EMUX register. +// +//***************************************************************************** +#define ADC_EMUX_EM3_MASK 0x0000F000 // Event mux 3 mask +#define ADC_EMUX_EM3_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM3_COMP0 0x00001000 // Analog comparator 0 event +#define ADC_EMUX_EM3_COMP1 0x00002000 // Analog comparator 1 event +#define ADC_EMUX_EM3_COMP2 0x00003000 // Analog comparator 2 event +#define ADC_EMUX_EM3_EXTERNAL 0x00004000 // External event +#define ADC_EMUX_EM3_TIMER 0x00005000 // Timer event +#define ADC_EMUX_EM3_PWM0 0x00006000 // PWM0 event +#define ADC_EMUX_EM3_PWM1 0x00007000 // PWM1 event +#define ADC_EMUX_EM3_PWM2 0x00008000 // PWM2 event +#define ADC_EMUX_EM3_ALWAYS 0x0000F000 // Always event +#define ADC_EMUX_EM2_MASK 0x00000F00 // Event mux 2 mask +#define ADC_EMUX_EM2_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM2_COMP0 0x00000100 // Analog comparator 0 event +#define ADC_EMUX_EM2_COMP1 0x00000200 // Analog comparator 1 event +#define ADC_EMUX_EM2_COMP2 0x00000300 // Analog comparator 2 event +#define ADC_EMUX_EM2_EXTERNAL 0x00000400 // External event +#define ADC_EMUX_EM2_TIMER 0x00000500 // Timer event +#define ADC_EMUX_EM2_PWM0 0x00000600 // PWM0 event +#define ADC_EMUX_EM2_PWM1 0x00000700 // PWM1 event +#define ADC_EMUX_EM2_PWM2 0x00000800 // PWM2 event +#define ADC_EMUX_EM2_ALWAYS 0x00000F00 // Always event +#define ADC_EMUX_EM1_MASK 0x000000F0 // Event mux 1 mask +#define ADC_EMUX_EM1_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM1_COMP0 0x00000010 // Analog comparator 0 event +#define ADC_EMUX_EM1_COMP1 0x00000020 // Analog comparator 1 event +#define ADC_EMUX_EM1_COMP2 0x00000030 // Analog comparator 2 event +#define ADC_EMUX_EM1_EXTERNAL 0x00000040 // External event +#define ADC_EMUX_EM1_TIMER 0x00000050 // Timer event +#define ADC_EMUX_EM1_PWM0 0x00000060 // PWM0 event +#define ADC_EMUX_EM1_PWM1 0x00000070 // PWM1 event +#define ADC_EMUX_EM1_PWM2 0x00000080 // PWM2 event +#define ADC_EMUX_EM1_ALWAYS 0x000000F0 // Always event +#define ADC_EMUX_EM0_MASK 0x0000000F // Event mux 0 mask +#define ADC_EMUX_EM0_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM0_COMP0 0x00000001 // Analog comparator 0 event +#define ADC_EMUX_EM0_COMP1 0x00000002 // Analog comparator 1 event +#define ADC_EMUX_EM0_COMP2 0x00000003 // Analog comparator 2 event +#define ADC_EMUX_EM0_EXTERNAL 0x00000004 // External event +#define ADC_EMUX_EM0_TIMER 0x00000005 // Timer event +#define ADC_EMUX_EM0_PWM0 0x00000006 // PWM0 event +#define ADC_EMUX_EM0_PWM1 0x00000007 // PWM1 event +#define ADC_EMUX_EM0_PWM2 0x00000008 // PWM2 event +#define ADC_EMUX_EM0_ALWAYS 0x0000000F // Always event +#define ADC_EMUX_EM0_SHIFT 0 // The shift for the first event +#define ADC_EMUX_EM1_SHIFT 4 // The shift for the second event +#define ADC_EMUX_EM2_SHIFT 8 // The shift for the third event +#define ADC_EMUX_EM3_SHIFT 12 // The shift for the fourth event + +//***************************************************************************** +// +// The following define the bit fields in the ADC_USTAT register. +// +//***************************************************************************** +#define ADC_USTAT_UV3 0x00000008 // Sample sequence 3 underflow +#define ADC_USTAT_UV2 0x00000004 // Sample sequence 2 underflow +#define ADC_USTAT_UV1 0x00000002 // Sample sequence 1 underflow +#define ADC_USTAT_UV0 0x00000001 // Sample sequence 0 underflow + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSPRI register. +// +//***************************************************************************** +#define ADC_SSPRI_SS3_MASK 0x00003000 // Sequencer 3 priority mask +#define ADC_SSPRI_SS3_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS3_2ND 0x00001000 // Second priority +#define ADC_SSPRI_SS3_3RD 0x00002000 // Third priority +#define ADC_SSPRI_SS3_4TH 0x00003000 // Fourth priority +#define ADC_SSPRI_SS2_MASK 0x00000300 // Sequencer 2 priority mask +#define ADC_SSPRI_SS2_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS2_2ND 0x00000100 // Second priority +#define ADC_SSPRI_SS2_3RD 0x00000200 // Third priority +#define ADC_SSPRI_SS2_4TH 0x00000300 // Fourth priority +#define ADC_SSPRI_SS1_MASK 0x00000030 // Sequencer 1 priority mask +#define ADC_SSPRI_SS1_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS1_2ND 0x00000010 // Second priority +#define ADC_SSPRI_SS1_3RD 0x00000020 // Third priority +#define ADC_SSPRI_SS1_4TH 0x00000030 // Fourth priority +#define ADC_SSPRI_SS0_MASK 0x00000003 // Sequencer 0 priority mask +#define ADC_SSPRI_SS0_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS0_2ND 0x00000001 // Second priority +#define ADC_SSPRI_SS0_3RD 0x00000002 // Third priority +#define ADC_SSPRI_SS0_4TH 0x00000003 // Fourth priority + +//***************************************************************************** +// +// The following define the bit fields in the ADC_PSSI register. +// +//***************************************************************************** +#define ADC_PSSI_SS3 0x00000008 // Trigger sample sequencer 3 +#define ADC_PSSI_SS2 0x00000004 // Trigger sample sequencer 2 +#define ADC_PSSI_SS1 0x00000002 // Trigger sample sequencer 1 +#define ADC_PSSI_SS0 0x00000001 // Trigger sample sequencer 0 + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SAC register. +// +//***************************************************************************** +#define ADC_SAC_AVG_OFF 0x00000000 // No hardware oversampling +#define ADC_SAC_AVG_2X 0x00000001 // 2x hardware oversampling +#define ADC_SAC_AVG_4X 0x00000002 // 4x hardware oversampling +#define ADC_SAC_AVG_8X 0x00000003 // 8x hardware oversampling +#define ADC_SAC_AVG_16X 0x00000004 // 16x hardware oversampling +#define ADC_SAC_AVG_32X 0x00000005 // 32x hardware oversampling +#define ADC_SAC_AVG_64X 0x00000006 // 64x hardware oversampling + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSMUX0, ADC_SSMUX1, +// ADC_SSMUX2, and ADC_SSMUX3 registers. Not all fields are present in all +// registers. +// +//***************************************************************************** +#define ADC_SSMUX_MUX7_MASK 0x70000000 // 8th mux select mask +#define ADC_SSMUX_MUX6_MASK 0x07000000 // 7th mux select mask +#define ADC_SSMUX_MUX5_MASK 0x00700000 // 6th mux select mask +#define ADC_SSMUX_MUX4_MASK 0x00070000 // 5th mux select mask +#define ADC_SSMUX_MUX3_MASK 0x00007000 // 4th mux select mask +#define ADC_SSMUX_MUX2_MASK 0x00000700 // 3rd mux select mask +#define ADC_SSMUX_MUX1_MASK 0x00000070 // 2nd mux select mask +#define ADC_SSMUX_MUX0_MASK 0x00000007 // 1st mux select mask +#define ADC_SSMUX_MUX7_SHIFT 28 +#define ADC_SSMUX_MUX6_SHIFT 24 +#define ADC_SSMUX_MUX5_SHIFT 20 +#define ADC_SSMUX_MUX4_SHIFT 16 +#define ADC_SSMUX_MUX3_SHIFT 12 +#define ADC_SSMUX_MUX2_SHIFT 8 +#define ADC_SSMUX_MUX1_SHIFT 4 +#define ADC_SSMUX_MUX0_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSCTL0, ADC_SSCTL1, +// ADC_SSCTL2, and ADC_SSCTL3 registers. Not all fields are present in all +// registers. +// +//***************************************************************************** +#define ADC_SSCTL_TS7 0x80000000 // 8th temperature sensor select +#define ADC_SSCTL_IE7 0x40000000 // 8th interrupt enable +#define ADC_SSCTL_END7 0x20000000 // 8th sequence end select +#define ADC_SSCTL_D7 0x10000000 // 8th differential select +#define ADC_SSCTL_TS6 0x08000000 // 7th temperature sensor select +#define ADC_SSCTL_IE6 0x04000000 // 7th interrupt enable +#define ADC_SSCTL_END6 0x02000000 // 7th sequence end select +#define ADC_SSCTL_D6 0x01000000 // 7th differential select +#define ADC_SSCTL_TS5 0x00800000 // 6th temperature sensor select +#define ADC_SSCTL_IE5 0x00400000 // 6th interrupt enable +#define ADC_SSCTL_END5 0x00200000 // 6th sequence end select +#define ADC_SSCTL_D5 0x00100000 // 6th differential select +#define ADC_SSCTL_TS4 0x00080000 // 5th temperature sensor select +#define ADC_SSCTL_IE4 0x00040000 // 5th interrupt enable +#define ADC_SSCTL_END4 0x00020000 // 5th sequence end select +#define ADC_SSCTL_D4 0x00010000 // 5th differential select +#define ADC_SSCTL_TS3 0x00008000 // 4th temperature sensor select +#define ADC_SSCTL_IE3 0x00004000 // 4th interrupt enable +#define ADC_SSCTL_END3 0x00002000 // 4th sequence end select +#define ADC_SSCTL_D3 0x00001000 // 4th differential select +#define ADC_SSCTL_TS2 0x00000800 // 3rd temperature sensor select +#define ADC_SSCTL_IE2 0x00000400 // 3rd interrupt enable +#define ADC_SSCTL_END2 0x00000200 // 3rd sequence end select +#define ADC_SSCTL_D2 0x00000100 // 3rd differential select +#define ADC_SSCTL_TS1 0x00000080 // 2nd temperature sensor select +#define ADC_SSCTL_IE1 0x00000040 // 2nd interrupt enable +#define ADC_SSCTL_END1 0x00000020 // 2nd sequence end select +#define ADC_SSCTL_D1 0x00000010 // 2nd differential select +#define ADC_SSCTL_TS0 0x00000008 // 1st temperature sensor select +#define ADC_SSCTL_IE0 0x00000004 // 1st interrupt enable +#define ADC_SSCTL_END0 0x00000002 // 1st sequence end select +#define ADC_SSCTL_D0 0x00000001 // 1st differential select + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSFIFO0, ADC_SSFIFO1, +// ADC_SSFIFO2, and ADC_SSFIFO3 registers. +// +//***************************************************************************** +#define ADC_SSFIFO_DATA_MASK 0x000003FF // Sample data +#define ADC_SSFIFO_DATA_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSFSTAT0, ADC_SSFSTAT1, +// ADC_SSFSTAT2, and ADC_SSFSTAT3 registers. +// +//***************************************************************************** +#define ADC_SSFSTAT_FULL 0x00001000 // FIFO is full +#define ADC_SSFSTAT_EMPTY 0x00000100 // FIFO is empty +#define ADC_SSFSTAT_HPTR 0x000000F0 // FIFO head pointer +#define ADC_SSFSTAT_TPTR 0x0000000F // FIFO tail pointer + +//***************************************************************************** +// +// The following define the bit fields in the ADC_TMLB register. +// +//***************************************************************************** +#define ADC_TMLB_LB 0x00000001 // Loopback control signals + +//***************************************************************************** +// +// The following define the bit fields in the loopback ADC data. +// +//***************************************************************************** +#define ADC_LB_CNT_MASK 0x000003C0 // Sample counter mask +#define ADC_LB_CONT 0x00000020 // Continuation sample +#define ADC_LB_DIFF 0x00000010 // Differential sample +#define ADC_LB_TS 0x00000008 // Temperature sensor sample +#define ADC_LB_MUX_MASK 0x00000007 // Input channel number mask +#define ADC_LB_CNT_SHIFT 6 // Sample counter shift +#define ADC_LB_MUX_SHIFT 0 // Input channel number shift + +#endif // __HW_ADC_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_can.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_can.h new file mode 100644 index 000000000..02f7b7465 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_can.h @@ -0,0 +1,379 @@ +//***************************************************************************** +// +// hw_can.h - Defines and macros used when accessing the can. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_CAN_H__ +#define __HW_CAN_H__ + +//***************************************************************************** +// +// The following define the offsets of the can registers. +// +//***************************************************************************** +#define CAN_O_CTL 0x00000000 // Control register +#define CAN_O_STS 0x00000004 // Status register +#define CAN_O_ERR 0x00000008 // Error register +#define CAN_O_BIT 0x0000000C // Bit Timing register +#define CAN_O_INT 0x00000010 // Interrupt register +#define CAN_O_TST 0x00000014 // Test register +#define CAN_O_BRPE 0x00000018 // Baud Rate Prescaler register +#define CAN_O_IF1CRQ 0x00000020 // Interface 1 Command Request reg. +#define CAN_O_IF1CMSK 0x00000024 // Interface 1 Command Mask reg. +#define CAN_O_IF1MSK1 0x00000028 // Interface 1 Mask 1 register +#define CAN_O_IF1MSK2 0x0000002C // Interface 1 Mask 2 register +#define CAN_O_IF1ARB1 0x00000030 // Interface 1 Arbitration 1 reg. +#define CAN_O_IF1ARB2 0x00000034 // Interface 1 Arbitration 2 reg. +#define CAN_O_IF1MCTL 0x00000038 // Interface 1 Message Control reg. +#define CAN_O_IF1DA1 0x0000003C // Interface 1 DataA 1 register +#define CAN_O_IF1DA2 0x00000040 // Interface 1 DataA 2 register +#define CAN_O_IF1DB1 0x00000044 // Interface 1 DataB 1 register +#define CAN_O_IF1DB2 0x00000048 // Interface 1 DataB 2 register +#define CAN_O_IF2CRQ 0x00000080 // Interface 2 Command Request reg. +#define CAN_O_IF2CMSK 0x00000084 // Interface 2 Command Mask reg. +#define CAN_O_IF2MSK1 0x00000088 // Interface 2 Mask 1 register +#define CAN_O_IF2MSK2 0x0000008C // Interface 2 Mask 2 register +#define CAN_O_IF2ARB1 0x00000090 // Interface 2 Arbitration 1 reg. +#define CAN_O_IF2ARB2 0x00000094 // Interface 2 Arbitration 2 reg. +#define CAN_O_IF2MCTL 0x00000098 // Interface 2 Message Control reg. +#define CAN_O_IF2DA1 0x0000009C // Interface 2 DataA 1 register +#define CAN_O_IF2DA2 0x000000A0 // Interface 2 DataA 2 register +#define CAN_O_IF2DB1 0x000000A4 // Interface 2 DataB 1 register +#define CAN_O_IF2DB2 0x000000A8 // Interface 2 DataB 2 register +#define CAN_O_TXRQ1 0x00000100 // Transmission Request 1 register +#define CAN_O_TXRQ2 0x00000104 // Transmission Request 2 register +#define CAN_O_NWDA1 0x00000120 // New Data 1 register +#define CAN_O_NWDA2 0x00000124 // New Data 2 register +#define CAN_O_MSGINT1 0x00000140 // Intr. Pending in Msg Obj 1 reg. +#define CAN_O_MSGINT2 0x00000144 // Intr. Pending in Msg Obj 2 reg. +#define CAN_O_MSGVAL1 0x00000160 // Message Valid in Msg Obj 1 reg. +#define CAN_O_MSGVAL2 0x00000164 // Message Valid in Msg Obj 2 reg. + +//***************************************************************************** +// +// The following define the reset values of the can registers. +// +//***************************************************************************** +#define CAN_RV_CTL 0x00000001 +#define CAN_RV_STS 0x00000000 +#define CAN_RV_ERR 0x00000000 +#define CAN_RV_BIT 0x00002301 +#define CAN_RV_INT 0x00000000 +#define CAN_RV_TST 0x00000000 +#define CAN_RV_BRPE 0x00000000 +#define CAN_RV_IF1CRQ 0x00000001 +#define CAN_RV_IF1CMSK 0x00000000 +#define CAN_RV_IF1MSK1 0x0000FFFF +#define CAN_RV_IF1MSK2 0x0000FFFF +#define CAN_RV_IF1ARB1 0x00000000 +#define CAN_RV_IF1ARB2 0x00000000 +#define CAN_RV_IF1MCTL 0x00000000 +#define CAN_RV_IF1DA1 0x00000000 +#define CAN_RV_IF1DA2 0x00000000 +#define CAN_RV_IF1DB1 0x00000000 +#define CAN_RV_IF1DB2 0x00000000 +#define CAN_RV_IF2CRQ 0x00000001 +#define CAN_RV_IF2CMSK 0x00000000 +#define CAN_RV_IF2MSK1 0x0000FFFF +#define CAN_RV_IF2MSK2 0x0000FFFF +#define CAN_RV_IF2ARB1 0x00000000 +#define CAN_RV_IF2ARB2 0x00000000 +#define CAN_RV_IF2MCTL 0x00000000 +#define CAN_RV_IF2DA1 0x00000000 +#define CAN_RV_IF2DA2 0x00000000 +#define CAN_RV_IF2DB1 0x00000000 +#define CAN_RV_IF2DB2 0x00000000 +#define CAN_RV_TXRQ1 0x00000000 +#define CAN_RV_TXRQ2 0x00000000 +#define CAN_RV_NWDA1 0x00000000 +#define CAN_RV_NWDA2 0x00000000 +#define CAN_RV_MSGINT1 0x00000000 +#define CAN_RV_MSGINT2 0x00000000 +#define CAN_RV_MSGVAL1 0x00000000 +#define CAN_RV_MSGVAL2 0x00000000 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_CTL register. +// +//***************************************************************************** +#define CAN_CTL_TEST 0x00000080 // Test mode enable +#define CAN_CTL_CCE 0x00000040 // Configuration change enable +#define CAN_CTL_DAR 0x00000020 // Disable automatic retransmission +#define CAN_CTL_EIE 0x00000008 // Error interrupt enable +#define CAN_CTL_SIE 0x00000004 // Status change interrupt enable +#define CAN_CTL_IE 0x00000002 // Module interrupt enable +#define CAN_CTL_INIT 0x00000001 // Initialization + +//***************************************************************************** +// +// The following define the bit fields in the CAN_STS register. +// +//***************************************************************************** +#define CAN_STS_BOFF 0x00000080 // Bus Off status +#define CAN_STS_EWARN 0x00000040 // Error Warning status +#define CAN_STS_EPASS 0x00000020 // Error Passive status +#define CAN_STS_RXOK 0x00000010 // Received Message Successful +#define CAN_STS_TXOK 0x00000008 // Transmitted Message Successful +#define CAN_STS_LEC_MSK 0x00000007 // Last Error Code +#define CAN_STS_LEC_NONE 0x00000000 // No error +#define CAN_STS_LEC_STUFF 0x00000001 // Stuff error +#define CAN_STS_LEC_FORM 0x00000002 // Form(at) error +#define CAN_STS_LEC_ACK 0x00000003 // Ack error +#define CAN_STS_LEC_BIT1 0x00000004 // Bit 1 error +#define CAN_STS_LEC_BIT0 0x00000005 // Bit 0 error +#define CAN_STS_LEC_CRC 0x00000006 // CRC error + +//***************************************************************************** +// +// The following define the bit fields in the CAN_ERR register. +// +//***************************************************************************** +#define CAN_ERR_RP 0x00008000 // Receive error passive status +#define CAN_ERR_REC_MASK 0x00007F00 // Receive error counter status +#define CAN_ERR_REC_SHIFT 8 // Receive error counter bit pos +#define CAN_ERR_TEC_MASK 0x000000FF // Transmit error counter status +#define CAN_ERR_TEC_SHIFT 0 // Transmit error counter bit pos + +//***************************************************************************** +// +// The following define the bit fields in the CAN_BIT register. +// +//***************************************************************************** +#define CAN_BIT_TSEG2 0x00007000 // Time segment after sample point +#define CAN_BIT_TSEG1 0x00000F00 // Time segment before sample point +#define CAN_BIT_SJW 0x000000C0 // (Re)Synchronization jump width +#define CAN_BIT_BRP 0x0000003F // Baud rate prescaler + +//***************************************************************************** +// +// The following define the bit fields in the CAN_INT register. +// +//***************************************************************************** +#define CAN_INT_INTID_MSK 0x0000FFFF // Interrupt Identifier +#define CAN_INT_INTID_NONE 0x00000000 // No Interrupt Pending +#define CAN_INT_INTID_STATUS 0x00008000 // Status Interrupt + +//***************************************************************************** +// +// The following define the bit fields in the CAN_TST register. +// +//***************************************************************************** +#define CAN_TST_RX 0x00000080 // CAN_RX pin status +#define CAN_TST_TX_MSK 0x00000060 // Overide control of CAN_TX pin +#define CAN_TST_TX_CANCTL 0x00000000 // CAN core controls CAN_TX +#define CAN_TST_TX_SAMPLE 0x00000020 // Sample Point on CAN_TX +#define CAN_TST_TX_DOMINANT 0x00000040 // Dominant value on CAN_TX +#define CAN_TST_TX_RECESSIVE 0x00000060 // Recessive value on CAN_TX +#define CAN_TST_LBACK 0x00000010 // Loop back mode +#define CAN_TST_SILENT 0x00000008 // Silent mode +#define CAN_TST_BASIC 0x00000004 // Basic mode + +//***************************************************************************** +// +// The following define the bit fields in the CAN_BRPE register. +// +//***************************************************************************** +#define CAN_BRPE_BRPE 0x0000000F // Baud rate prescaler extension + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1CRQ and CAN_IF1CRQ +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFCRQ_BUSY 0x00008000 // Busy flag status +#define CAN_IFCRQ_MNUM_MSK 0x0000003F // Message Number + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1CMSK and CAN_IF2CMSK +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFCMSK_WRNRD 0x00000080 // Write, not Read +#define CAN_IFCMSK_MASK 0x00000040 // Access Mask Bits +#define CAN_IFCMSK_ARB 0x00000020 // Access Arbitration Bits +#define CAN_IFCMSK_CONTROL 0x00000010 // Access Control Bits +#define CAN_IFCMSK_CLRINTPND 0x00000008 // Clear interrupt pending Bit +#define CAN_IFCMSK_TXRQST 0x00000004 // Access Tx request bit (WRNRD=1) +#define CAN_IFCMSK_NEWDAT 0x00000004 // Access New Data bit (WRNRD=0) +#define CAN_IFCMSK_DATAA 0x00000002 // DataA access - bytes 0 to 3 +#define CAN_IFCMSK_DATAB 0x00000001 // DataB access - bytes 4 to 7 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1MSK1 and CAN_IF2MSK1 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFMSK1_MSK 0x0000FFFF // Identifier Mask + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1MSK2 and CAN_IF2MSK2 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFMSK2_MXTD 0x00008000 // Mask extended identifier +#define CAN_IFMSK2_MDIR 0x00004000 // Mask message direction +#define CAN_IFMSK2_MSK 0x00001FFF // Mask identifier + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1ARB1 and CAN_IF2ARB1 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFARB1_ID 0x0000FFFF // Identifier + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1ARB2 and CAN_IF2ARB2 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFARB2_MSGVAL 0x00008000 // Message valid +#define CAN_IFARB2_XTD 0x00004000 // Extended identifier +#define CAN_IFARB2_DIR 0x00002000 // Message direction +#define CAN_IFARB2_ID 0x00001FFF // Message identifier + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1MCTL and CAN_IF2MCTL +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFMCTL_NEWDAT 0x00008000 // New Data +#define CAN_IFMCTL_MSGLST 0x00004000 // Message lost +#define CAN_IFMCTL_INTPND 0x00002000 // Interrupt pending +#define CAN_IFMCTL_UMASK 0x00001000 // Use acceptance mask +#define CAN_IFMCTL_TXIE 0x00000800 // Transmit interrupt enable +#define CAN_IFMCTL_RXIE 0x00000400 // Receive interrupt enable +#define CAN_IFMCTL_RMTEN 0x00000200 // Remote enable +#define CAN_IFMCTL_TXRQST 0x00000100 // Transmit request +#define CAN_IFMCTL_EOB 0x00000080 // End of buffer +#define CAN_IFMCTL_DLC 0x0000000F // Data length code + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1DA1 and CAN_IF2DA1 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFDA1_DATA 0x0000FFFF // Data - bytes 1 and 0 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1DA2 and CAN_IF2DA2 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFDA2_DATA 0x0000FFFF // Data - bytes 3 and 2 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1DB1 and CAN_IF2DB1 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFDB1_DATA 0x0000FFFF // Data - bytes 5 and 4 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1DB2 and CAN_IF2DB2 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFDB2_DATA 0x0000FFFF // Data - bytes 7 and 6 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_TXRQ1 register. +// +//***************************************************************************** +#define CAN_TXRQ1_TXRQST 0x0000FFFF // Transmission Request Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_TXRQ2 register. +// +//***************************************************************************** +#define CAN_TXRQ2_TXRQST 0x0000FFFF // Transmission Request Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_NWDA1 register. +// +//***************************************************************************** +#define CAN_NWDA1_NEWDATA 0x0000FFFF // New Data Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_NWDA2 register. +// +//***************************************************************************** +#define CAN_NWDA2_NEWDATA 0x0000FFFF // New Data Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_MSGINT1 register. +// +//***************************************************************************** +#define CAN_MSGINT1_INTPND 0x0000FFFF // Interrupt Pending Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_MSGINT2 register. +// +//***************************************************************************** +#define CAN_MSGINT2_INTPND 0x0000FFFF // Interrupt Pending Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_MSGVAL1 register. +// +//***************************************************************************** +#define CAN_MSGVAL1_MSGVAL 0x0000FFFF // Message Valid Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_MSGVAL2 register. +// +//***************************************************************************** +#define CAN_MSGVAL2_MSGVAL 0x0000FFFF // Message Valid Bits + +#endif // __HW_CAN_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_comp.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_comp.h new file mode 100644 index 000000000..d8b355ea9 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_comp.h @@ -0,0 +1,118 @@ +//***************************************************************************** +// +// hw_comp.h - Macros used when accessing the comparator hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_COMP_H__ +#define __HW_COMP_H__ + +//***************************************************************************** +// +// The following define the offsets of the comparator registers. +// +//***************************************************************************** +#define COMP_O_MIS 0x00000000 // Interrupt status register +#define COMP_O_RIS 0x00000004 // Raw interrupt status register +#define COMP_O_INTEN 0x00000008 // Interrupt enable register +#define COMP_O_REFCTL 0x00000010 // Reference voltage control reg. +#define COMP_O_ACSTAT0 0x00000020 // Comp0 status register +#define COMP_O_ACCTL0 0x00000024 // Comp0 control register +#define COMP_O_ACSTAT1 0x00000040 // Comp1 status register +#define COMP_O_ACCTL1 0x00000044 // Comp1 control register +#define COMP_O_ACSTAT2 0x00000060 // Comp2 status register +#define COMP_O_ACCTL2 0x00000064 // Comp2 control register + +//***************************************************************************** +// +// The following define the bit fields in the COMP_MIS, COMP_RIS, and +// COMP_INTEN registers. +// +//***************************************************************************** +#define COMP_INT_2 0x00000004 // Comp2 interrupt +#define COMP_INT_1 0x00000002 // Comp1 interrupt +#define COMP_INT_0 0x00000001 // Comp0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the COMP_REFCTL register. +// +//***************************************************************************** +#define COMP_REFCTL_EN 0x00000200 // Reference voltage enable +#define COMP_REFCTL_RNG 0x00000100 // Reference voltage range +#define COMP_REFCTL_VREF_MASK 0x0000000F // Reference voltage select mask +#define COMP_REFCTL_VREF_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the COMP_ACSTAT0, COMP_ACSTAT1, and +// COMP_ACSTAT2 registers. +// +//***************************************************************************** +#define COMP_ACSTAT_OVAL 0x00000002 // Comparator output value + +//***************************************************************************** +// +// The following define the bit fields in the COMP_ACCTL0, COMP_ACCTL1, and +// COMP_ACCTL2 registers. +// +//***************************************************************************** +#define COMP_ACCTL_TMASK 0x00000800 // Trigger enable +#define COMP_ACCTL_ASRCP_MASK 0x00000600 // Vin+ source select mask +#define COMP_ACCTL_ASRCP_PIN 0x00000000 // Dedicated Comp+ pin +#define COMP_ACCTL_ASRCP_PIN0 0x00000200 // Comp0+ pin +#define COMP_ACCTL_ASRCP_REF 0x00000400 // Internal voltage reference +#define COMP_ACCTL_ASRCP_RES 0x00000600 // Reserved +#define COMP_ACCTL_OEN 0x00000100 // Comparator output enable +#define COMP_ACCTL_TSVAL 0x00000080 // Trigger polarity select +#define COMP_ACCTL_TSEN_MASK 0x00000060 // Trigger sense mask +#define COMP_ACCTL_TSEN_LEVEL 0x00000000 // Trigger is level sense +#define COMP_ACCTL_TSEN_FALL 0x00000020 // Trigger is falling edge +#define COMP_ACCTL_TSEN_RISE 0x00000040 // Trigger is rising edge +#define COMP_ACCTL_TSEN_BOTH 0x00000060 // Trigger is both edges +#define COMP_ACCTL_ISLVAL 0x00000010 // Interrupt polarity select +#define COMP_ACCTL_ISEN_MASK 0x0000000C // Interrupt sense mask +#define COMP_ACCTL_ISEN_LEVEL 0x00000000 // Interrupt is level sense +#define COMP_ACCTL_ISEN_FALL 0x00000004 // Interrupt is falling edge +#define COMP_ACCTL_ISEN_RISE 0x00000008 // Interrupt is rising edge +#define COMP_ACCTL_ISEN_BOTH 0x0000000C // Interrupt is both edges +#define COMP_ACCTL_CINV 0x00000002 // Comparator output invert + +//***************************************************************************** +// +// The following define the reset values for the comparator registers. +// +//***************************************************************************** +#define COMP_RV_MIS 0x00000000 // Interrupt status register +#define COMP_RV_RIS 0x00000000 // Raw interrupt status register +#define COMP_RV_INTEN 0x00000000 // Interrupt enable register +#define COMP_RV_REFCTL 0x00000000 // Reference voltage control reg. +#define COMP_RV_ACSTAT0 0x00000000 // Comp0 status register +#define COMP_RV_ACCTL0 0x00000000 // Comp0 control register +#define COMP_RV_ACSTAT1 0x00000000 // Comp1 status register +#define COMP_RV_ACCTL1 0x00000000 // Comp1 control register +#define COMP_RV_ACSTAT2 0x00000000 // Comp2 status register +#define COMP_RV_ACCTL2 0x00000000 // Comp2 control register + +#endif // __HW_COMP_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_ethernet.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_ethernet.h new file mode 100644 index 000000000..7a8d224cd --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_ethernet.h @@ -0,0 +1,205 @@ +//***************************************************************************** +// +// hw_ethernet.h - Macros used when accessing the ethernet hardware. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_ETHERNET_H__ +#define __HW_ETHERNET_H__ + +//***************************************************************************** +// +// The following define the offsets of the MAC registers in the Ethernet +// Controller. +// +//***************************************************************************** +#define MAC_O_IS 0x00000000 // Interrupt Status Register +#define MAC_O_IACK 0x00000000 // Interrupt Acknowledge Register +#define MAC_O_IM 0x00000004 // Interrupt Mask Register +#define MAC_O_RCTL 0x00000008 // Receive Control Register +#define MAC_O_TCTL 0x0000000C // Transmit Control Register +#define MAC_O_DATA 0x00000010 // Data Register +#define MAC_O_IA0 0x00000014 // Individual Address Register 0 +#define MAC_O_IA1 0x00000018 // Individual Address Register 1 +#define MAC_O_THR 0x0000001C // Threshold Register +#define MAC_O_MCTL 0x00000020 // Management Control Register +#define MAC_O_MDV 0x00000024 // Management Divider Register +#define MAC_O_MADD 0x00000028 // Management Address Register +#define MAC_O_MTXD 0x0000002C // Management Transmit Data Reg +#define MAC_O_MRXD 0x00000030 // Management Receive Data Reg +#define MAC_O_NP 0x00000034 // Number of Packets Register +#define MAC_O_TR 0x00000038 // Transmission Request Register + +//***************************************************************************** +// +// The following define the reset values of the MAC registers. +// +//***************************************************************************** +#define MAC_RV_IS 0x00000000 +#define MAC_RV_IACK 0x00000000 +#define MAC_RV_IM 0x0000007F +#define MAC_RV_RCTL 0x00000008 +#define MAC_RV_TCTL 0x00000000 +#define MAC_RV_DATA 0x00000000 +#define MAC_RV_IA0 0x00000000 +#define MAC_RV_IA1 0x00000000 +#define MAC_RV_THR 0x0000003F +#define MAC_RV_MCTL 0x00000000 +#define MAC_RV_MDV 0x00000080 +#define MAC_RV_MADD 0x00000000 +#define MAC_RV_MTXD 0x00000000 +#define MAC_RV_MRXD 0x00000000 +#define MAC_RV_NP 0x00000000 +#define MAC_RV_TR 0x00000000 + +//***************************************************************************** +// +// The following define the bit fields in the MAC_IS register. +// +//***************************************************************************** +#define MAC_IS_PHYINT 0x00000040 // PHY Interrupt +#define MAC_IS_MDINT 0x00000020 // MDI Transaction Complete +#define MAC_IS_RXER 0x00000010 // RX Error +#define MAC_IS_FOV 0x00000008 // RX FIFO Overrun +#define MAC_IS_TXEMP 0x00000004 // TX FIFO Empy +#define MAC_IS_TXER 0x00000002 // TX Error +#define MAC_IS_RXINT 0x00000001 // RX Packet Available + +//***************************************************************************** +// +// The following define the bit fields in the MAC_IACK register. +// +//***************************************************************************** +#define MAC_IACK_PHYINT 0x00000040 // Clear PHY Interrupt +#define MAC_IACK_MDINT 0x00000020 // Clear MDI Transaction Complete +#define MAC_IACK_RXER 0x00000010 // Clear RX Error +#define MAC_IACK_FOV 0x00000008 // Clear RX FIFO Overrun +#define MAC_IACK_TXEMP 0x00000004 // Clear TX FIFO Empy +#define MAC_IACK_TXER 0x00000002 // Clear TX Error +#define MAC_IACK_RXINT 0x00000001 // Clear RX Packet Available + +//***************************************************************************** +// +// The following define the bit fields in the MAC_IM register. +// +//***************************************************************************** +#define MAC_IM_PHYINTM 0x00000040 // Mask PHY Interrupt +#define MAC_IM_MDINTM 0x00000020 // Mask MDI Transaction Complete +#define MAC_IM_RXERM 0x00000010 // Mask RX Error +#define MAC_IM_FOVM 0x00000008 // Mask RX FIFO Overrun +#define MAC_IM_TXEMPM 0x00000004 // Mask TX FIFO Empy +#define MAC_IM_TXERM 0x00000002 // Mask TX Error +#define MAC_IM_RXINTM 0x00000001 // Mask RX Packet Available + +//***************************************************************************** +// +// The following define the bit fields in the MAC_RCTL register. +// +//***************************************************************************** +#define MAC_RCTL_RSTFIFO 0x00000010 // Clear the Receive FIFO +#define MAC_RCTL_BADCRC 0x00000008 // Reject Packets With Bad CRC +#define MAC_RCTL_PRMS 0x00000004 // Enable Promiscuous Mode +#define MAC_RCTL_AMUL 0x00000002 // Enable Multicast Packets +#define MAC_RCTL_RXEN 0x00000001 // Enable Ethernet Receiver + +//***************************************************************************** +// +// The following define the bit fields in the MAC_TCTL register. +// +//***************************************************************************** +#define MAC_TCTL_DUPLEX 0x00000010 // Enable Duplex mode +#define MAC_TCTL_CRC 0x00000004 // Enable CRC Generation +#define MAC_TCTL_PADEN 0x00000002 // Enable Automatic Padding +#define MAC_TCTL_TXEN 0x00000001 // Enable Ethernet Transmitter + +//***************************************************************************** +// +// The following define the bit fields in the MAC_IA0 register. +// +//***************************************************************************** +#define MAC_IA0_MACOCT4 0xFF000000 // 4th Octet of MAC address +#define MAC_IA0_MACOCT3 0x00FF0000 // 3rd Octet of MAC address +#define MAC_IA0_MACOCT2 0x0000FF00 // 2nd Octet of MAC address +#define MAC_IA0_MACOCT1 0x000000FF // 1st Octet of MAC address + +//***************************************************************************** +// +// The following define the bit fields in the MAC_IA1 register. +// +//***************************************************************************** +#define MAC_IA1_MACOCT6 0x0000FF00 // 6th Octet of MAC address +#define MAC_IA1_MACOCT5 0x000000FF // 5th Octet of MAC address + +//***************************************************************************** +// +// The following define the bit fields in the MAC_TXTH register. +// +//***************************************************************************** +#define MAC_THR_THRESH 0x0000003F // Transmit Threshold Value + +//***************************************************************************** +// +// The following define the bit fields in the MAC_MCTL register. +// +//***************************************************************************** +#define MAC_MCTL_REGADR 0x000000F8 // Address for Next MII Transaction +#define MAC_MCTL_WRITE 0x00000002 // Next MII Transaction is Write +#define MAC_MCTL_START 0x00000001 // Start MII Transaction + +//***************************************************************************** +// +// The following define the bit fields in the MAC_MDV register. +// +//***************************************************************************** +#define MAC_MDV_DIV 0x000000FF // Clock Divider for MDC for TX + +//***************************************************************************** +// +// The following define the bit fields in the MAC_MTXD register. +// +//***************************************************************************** +#define MAC_MTXD_MDTX 0x0000FFFF // Data for Next MII Transaction + +//***************************************************************************** +// +// The following define the bit fields in the MAC_MRXD register. +// +//***************************************************************************** +#define MAC_MRXD_MDRX 0x0000FFFF // Data Read from Last MII Trans. + +//***************************************************************************** +// +// The following define the bit fields in the MAC_NP register. +// +//***************************************************************************** +#define MAC_NP_NPR 0x0000003F // Number of RX Frames in FIFO + +//***************************************************************************** +// +// The following define the bit fields in the MAC_TXRQ register. +// +//***************************************************************************** +#define MAC_TR_NEWTX 0x00000001 // Start an Ethernet Transmission + +#endif // __HW_ETHERNET_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_flash.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_flash.h new file mode 100644 index 000000000..c5bea3b26 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_flash.h @@ -0,0 +1,147 @@ +//***************************************************************************** +// +// hw_flash.h - Macros used when accessing the flash controller. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_FLASH_H__ +#define __HW_FLASH_H__ + +//***************************************************************************** +// +// The following define the offsets of the FLASH registers. +// +//***************************************************************************** +#define FLASH_FMA 0x400FD000 // Memory address register +#define FLASH_FMD 0x400FD004 // Memory data register +#define FLASH_FMC 0x400FD008 // Memory control register +#define FLASH_FCRIS 0x400FD00c // Raw interrupt status register +#define FLASH_FCIM 0x400FD010 // Interrupt mask register +#define FLASH_FCMISC 0x400FD014 // Interrupt status register +#define FLASH_FMPRE 0x400FE130 // FLASH read protect register +#define FLASH_FMPPE 0x400FE134 // FLASH program protect register +#define FLASH_USECRL 0x400FE140 // uSec reload register +#define FLASH_FMPRE0 0x400FE200 // FLASH read protect register 0 +#define FLASH_FMPRE1 0x400FE204 // FLASH read protect register 1 +#define FLASH_FMPRE2 0x400FE208 // FLASH read protect register 2 +#define FLASH_FMPRE3 0x400FE20C // FLASH read protect register 3 +#define FLASH_FMPPE0 0x400FE400 // FLASH program protect register 0 +#define FLASH_FMPPE1 0x400FE404 // FLASH program protect register 1 +#define FLASH_FMPPE2 0x400FE408 // FLASH program protect register 2 +#define FLASH_FMPPE3 0x400FE40C // FLASH program protect register 3 + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FMC register. +// +//***************************************************************************** +#define FLASH_FMC_WRKEY_MASK 0xFFFF0000 // FLASH write key mask +#define FLASH_FMC_WRKEY 0xA4420000 // FLASH write key +#define FLASH_FMC_COMT 0x00000008 // Commit user register +#define FLASH_FMC_MERASE 0x00000004 // Mass erase FLASH +#define FLASH_FMC_ERASE 0x00000002 // Erase FLASH page +#define FLASH_FMC_WRITE 0x00000001 // Write FLASH word + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FCRIS register. +// +//***************************************************************************** +#define FLASH_FCRIS_PROGRAM 0x00000002 // Programming status +#define FLASH_FCRIS_ACCESS 0x00000001 // Invalid access status + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FCIM register. +// +//***************************************************************************** +#define FLASH_FCIM_PROGRAM 0x00000002 // Programming mask +#define FLASH_FCIM_ACCESS 0x00000001 // Invalid access mask + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FMIS register. +// +//***************************************************************************** +#define FLASH_FCMISC_PROGRAM 0x00000002 // Programming status +#define FLASH_FCMISC_ACCESS 0x00000001 // Invalid access status + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FMPRE and FLASH_FMPPE +// registers. +// +//***************************************************************************** +#define FLASH_FMP_BLOCK_31 0x80000000 // Enable for block 31 +#define FLASH_FMP_BLOCK_30 0x40000000 // Enable for block 30 +#define FLASH_FMP_BLOCK_29 0x20000000 // Enable for block 29 +#define FLASH_FMP_BLOCK_28 0x10000000 // Enable for block 28 +#define FLASH_FMP_BLOCK_27 0x08000000 // Enable for block 27 +#define FLASH_FMP_BLOCK_26 0x04000000 // Enable for block 26 +#define FLASH_FMP_BLOCK_25 0x02000000 // Enable for block 25 +#define FLASH_FMP_BLOCK_24 0x01000000 // Enable for block 24 +#define FLASH_FMP_BLOCK_23 0x00800000 // Enable for block 23 +#define FLASH_FMP_BLOCK_22 0x00400000 // Enable for block 22 +#define FLASH_FMP_BLOCK_21 0x00200000 // Enable for block 21 +#define FLASH_FMP_BLOCK_20 0x00100000 // Enable for block 20 +#define FLASH_FMP_BLOCK_19 0x00080000 // Enable for block 19 +#define FLASH_FMP_BLOCK_18 0x00040000 // Enable for block 18 +#define FLASH_FMP_BLOCK_17 0x00020000 // Enable for block 17 +#define FLASH_FMP_BLOCK_16 0x00010000 // Enable for block 16 +#define FLASH_FMP_BLOCK_15 0x00008000 // Enable for block 15 +#define FLASH_FMP_BLOCK_14 0x00004000 // Enable for block 14 +#define FLASH_FMP_BLOCK_13 0x00002000 // Enable for block 13 +#define FLASH_FMP_BLOCK_12 0x00001000 // Enable for block 12 +#define FLASH_FMP_BLOCK_11 0x00000800 // Enable for block 11 +#define FLASH_FMP_BLOCK_10 0x00000400 // Enable for block 10 +#define FLASH_FMP_BLOCK_9 0x00000200 // Enable for block 9 +#define FLASH_FMP_BLOCK_8 0x00000100 // Enable for block 8 +#define FLASH_FMP_BLOCK_7 0x00000080 // Enable for block 7 +#define FLASH_FMP_BLOCK_6 0x00000040 // Enable for block 6 +#define FLASH_FMP_BLOCK_5 0x00000020 // Enable for block 5 +#define FLASH_FMP_BLOCK_4 0x00000010 // Enable for block 4 +#define FLASH_FMP_BLOCK_3 0x00000008 // Enable for block 3 +#define FLASH_FMP_BLOCK_2 0x00000004 // Enable for block 2 +#define FLASH_FMP_BLOCK_1 0x00000002 // Enable for block 1 +#define FLASH_FMP_BLOCK_0 0x00000001 // Enable for block 0 + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_USECRL register. +// +//***************************************************************************** +#define FLASH_USECRL_MASK 0x000000FF // Clock per uSec +#define FLASH_USECRL_SHIFT 0 + +//***************************************************************************** +// +// The erase size is the size of the FLASH block that is erased by an erase +// operation, and the protect size is the size of the FLASH block that is +// protected by each protection register. +// +//***************************************************************************** +#define FLASH_ERASE_SIZE 0x00000400 +#define FLASH_PROTECT_SIZE 0x00000800 + +#endif // __HW_FLASH_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_gpio.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_gpio.h new file mode 100644 index 000000000..3596325a7 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_gpio.h @@ -0,0 +1,115 @@ +//***************************************************************************** +// +// hw_gpio.h - Defines and Macros for GPIO hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_GPIO_H__ +#define __HW_GPIO_H__ + +//***************************************************************************** +// +// GPIO Register Offsets. +// +//***************************************************************************** +#define GPIO_O_DATA 0x00000000 // Data register. +#define GPIO_O_DIR 0x00000400 // Data direction register. +#define GPIO_O_IS 0x00000404 // Interrupt sense register. +#define GPIO_O_IBE 0x00000408 // Interrupt both edges register. +#define GPIO_O_IEV 0x0000040C // Intterupt event register. +#define GPIO_O_IM 0x00000410 // Interrupt mask register. +#define GPIO_O_RIS 0x00000414 // Raw interrupt status register. +#define GPIO_O_MIS 0x00000418 // Masked interrupt status reg. +#define GPIO_O_ICR 0x0000041C // Interrupt clear register. +#define GPIO_O_AFSEL 0x00000420 // Mode control select register. +#define GPIO_O_DR2R 0x00000500 // 2ma drive select register. +#define GPIO_O_DR4R 0x00000504 // 4ma drive select register. +#define GPIO_O_DR8R 0x00000508 // 8ma drive select register. +#define GPIO_O_ODR 0x0000050C // Open drain select register. +#define GPIO_O_PUR 0x00000510 // Pull up select register. +#define GPIO_O_PDR 0x00000514 // Pull down select register. +#define GPIO_O_SLR 0x00000518 // Slew rate control enable reg. +#define GPIO_O_DEN 0x0000051C // Digital input enable register. +#define GPIO_O_LOCK 0x00000520 // Lock register. +#define GPIO_O_CR 0x00000524 // Commit register. +#define GPIO_O_PeriphID4 0x00000FD0 // +#define GPIO_O_PeriphID5 0x00000FD4 // +#define GPIO_O_PeriphID6 0x00000FD8 // +#define GPIO_O_PeriphID7 0x00000FDC // +#define GPIO_O_PeriphID0 0x00000FE0 // +#define GPIO_O_PeriphID1 0x00000FE4 // +#define GPIO_O_PeriphID2 0x00000FE8 // +#define GPIO_O_PeriphID3 0x00000FEC // +#define GPIO_O_PCellID0 0x00000FF0 // +#define GPIO_O_PCellID1 0x00000FF4 // +#define GPIO_O_PCellID2 0x00000FF8 // +#define GPIO_O_PCellID3 0x00000FFC // + +//***************************************************************************** +// +// The following define the bit fields in the GPIO_LOCK register. +// +//***************************************************************************** +#define GPIO_LOCK_LOCKED 0x00000001 // GPIO_CR register is locked +#define GPIO_LOCK_UNLOCKED 0x00000000 // GPIO_CR register is unlocked +#define GPIO_LOCK_KEY 0x1ACCE551 // Unlocks the GPIO_CR register + +//***************************************************************************** +// +// GPIO Register reset values. +// +//***************************************************************************** +#define GPIO_RV_DATA 0x00000000 // Data register reset value. +#define GPIO_RV_DIR 0x00000000 // Data direction reg RV. +#define GPIO_RV_IS 0x00000000 // Interrupt sense reg RV. +#define GPIO_RV_IBE 0x00000000 // Interrupt both edges reg RV. +#define GPIO_RV_IEV 0x00000000 // Intterupt event reg RV. +#define GPIO_RV_IM 0x00000000 // Interrupt mask reg RV. +#define GPIO_RV_RIS 0x00000000 // Raw interrupt status reg RV. +#define GPIO_RV_MIS 0x00000000 // Masked interrupt status reg RV. +#define GPIO_RV_IC 0x00000000 // Interrupt clear reg RV. +#define GPIO_RV_AFSEL 0x00000000 // Mode control select reg RV. +#define GPIO_RV_DR2R 0x000000FF // 2ma drive select reg RV. +#define GPIO_RV_DR4R 0x00000000 // 4ma drive select reg RV. +#define GPIO_RV_DR8R 0x00000000 // 8ma drive select reg RV. +#define GPIO_RV_ODR 0x00000000 // Open drain select reg RV. +#define GPIO_RV_PUR 0x000000FF // Pull up select reg RV. +#define GPIO_RV_PDR 0x00000000 // Pull down select reg RV. +#define GPIO_RV_SLR 0x00000000 // Slew rate control enable reg RV. +#define GPIO_RV_DEN 0x000000FF // Digital input enable reg RV. +#define GPIO_RV_LOCK 0x00000001 // Lock register RV. +#define GPIO_RV_PeriphID4 0x00000000 // +#define GPIO_RV_PeriphID5 0x00000000 // +#define GPIO_RV_PeriphID6 0x00000000 // +#define GPIO_RV_PeriphID7 0x00000000 // +#define GPIO_RV_PeriphID0 0x00000061 // +#define GPIO_RV_PeriphID1 0x00000010 // +#define GPIO_RV_PeriphID2 0x00000004 // +#define GPIO_RV_PeriphID3 0x00000000 // +#define GPIO_RV_PCellID0 0x0000000D // +#define GPIO_RV_PCellID1 0x000000F0 // +#define GPIO_RV_PCellID2 0x00000005 // +#define GPIO_RV_PCellID3 0x000000B1 // + +#endif // __HW_GPIO_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_hibernate.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_hibernate.h new file mode 100644 index 000000000..ee730d4c5 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_hibernate.h @@ -0,0 +1,145 @@ +//***************************************************************************** +// +// hw_hibernate.h - Defines and Macros for the Hibernation module. +// +// Copyright (c) 2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_HIBERNATE_H__ +#define __HW_HIBERNATE_H__ + +//***************************************************************************** +// +// The following define the addresses of the hibernation module registers. +// +//***************************************************************************** +#define HIB_RTCC 0x400fc000 // Hibernate RTC counter +#define HIB_RTCM0 0x400fc004 // Hibernate RTC match 0 +#define HIB_RTCM1 0x400fc008 // Hibernate RTC match 1 +#define HIB_RTCLD 0x400fc00C // Hibernate RTC load +#define HIB_CTL 0x400fc010 // Hibernate RTC control +#define HIB_IM 0x400fc014 // Hibernate interrupt mask +#define HIB_RIS 0x400fc018 // Hibernate raw interrupt status +#define HIB_MIS 0x400fc01C // Hibernate masked interrupt stat +#define HIB_IC 0x400fc020 // Hibernate interrupt clear +#define HIB_RTCT 0x400fc024 // Hibernate RTC trim +#define HIB_DATA 0x400fc030 // Hibernate data area +#define HIB_DATA_END 0x400fc130 // end of data area, exclusive + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate RTC counter register. +// +//***************************************************************************** +#define HIB_RTCC_MASK 0xffffffff // RTC counter mask + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate RTC match 0 register. +// +//***************************************************************************** +#define HIB_RTCM0_MASK 0xffffffff // RTC match 0 mask + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate RTC match 1 register. +// +//***************************************************************************** +#define HIB_RTCM1_MASK 0xffffffff // RTC match 1 mask + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate RTC load register. +// +//***************************************************************************** +#define HIB_RTCLD_MASK 0xffffffff // RTC load mask + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate control register +// +//***************************************************************************** +#define HIB_CTL_VABORT 0x00000080 // low bat abort +#define HIB_CTL_CLK32EN 0x00000040 // enable clock/oscillator +#define HIB_CTL_LOWBATEN 0x00000020 // enable low battery detect +#define HIB_CTL_PINWEN 0x00000010 // enable wake on WAKE pin +#define HIB_CTL_RTCWEN 0x00000008 // enable wake on RTC match +#define HIB_CTL_CLKSEL 0x00000004 // clock input selection +#define HIB_CTL_HIBREQ 0x00000002 // request hibernation +#define HIB_CTL_RTCEN 0x00000001 // RTC enable + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate interrupt mask reg. +// +//***************************************************************************** +#define HIB_IM_EXTW 0x00000008 // wake from external pin interrupt +#define HIB_IM_LOWBAT 0x00000004 // low battery interrupt +#define HIB_IM_RTCALT1 0x00000002 // RTC match 1 interrupt +#define HIB_IM_RTCALT0 0x00000001 // RTC match 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate raw interrupt status. +// +//***************************************************************************** +#define HIB_RIS_EXTW 0x00000008 // wake from external pin interrupt +#define HIB_RIS_LOWBAT 0x00000004 // low battery interrupt +#define HIB_RIS_RTCALT1 0x00000002 // RTC match 1 interrupt +#define HIB_RID_RTCALT0 0x00000001 // RTC match 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate masked int status. +// +//***************************************************************************** +#define HIB_MIS_EXTW 0x00000008 // wake from external pin interrupt +#define HIB_MIS_LOWBAT 0x00000004 // low battery interrupt +#define HIB_MIS_RTCALT1 0x00000002 // RTC match 1 interrupt +#define HIB_MID_RTCALT0 0x00000001 // RTC match 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate interrupt clear reg. +// +//***************************************************************************** +#define HIB_IC_EXTW 0x00000008 // wake from external pin interrupt +#define HIB_IC_LOWBAT 0x00000004 // low battery interrupt +#define HIB_IC_RTCALT1 0x00000002 // RTC match 1 interrupt +#define HIB_IC_RTCALT0 0x00000001 // RTC match 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate RTC trim register. +// +//***************************************************************************** +#define HIB_RTCT_MASK 0x0000ffff // RTC trim mask + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate data register. +// +//***************************************************************************** +#define HIB_DATA_MASK 0xffffffff // NV memory data mask + +#endif // __HW_HIBERNATE_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_i2c.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_i2c.h new file mode 100644 index 000000000..b90edb7df --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_i2c.h @@ -0,0 +1,197 @@ +//***************************************************************************** +// +// hw_i2c.h - Macros used when accessing the I2C master and slave hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_I2C_H__ +#define __HW_I2C_H__ + +//***************************************************************************** +// +// The following defines the offset between the I2C master and slave registers. +// +//***************************************************************************** +#define I2C_O_SLAVE 0x00000800 // Offset from master to slave + +//***************************************************************************** +// +// The following define the offsets of the I2C master registers. +// +//***************************************************************************** +#define I2C_MASTER_O_SA 0x00000000 // Slave address register +#define I2C_MASTER_O_CS 0x00000004 // Control and Status register +#define I2C_MASTER_O_DR 0x00000008 // Data register +#define I2C_MASTER_O_TPR 0x0000000C // Timer period register +#define I2C_MASTER_O_IMR 0x00000010 // Interrupt mask register +#define I2C_MASTER_O_RIS 0x00000014 // Raw interrupt status register +#define I2C_MASTER_O_MIS 0x00000018 // Masked interrupt status reg +#define I2C_MASTER_O_MICR 0x0000001c // Interrupt clear register +#define I2C_MASTER_O_CR 0x00000020 // Configuration register + +//***************************************************************************** +// +// The following define the offsets of the I2C slave registers. +// +//***************************************************************************** +#define I2C_SLAVE_O_OAR 0x00000000 // Own address register +#define I2C_SLAVE_O_CSR 0x00000004 // Control/Status register +#define I2C_SLAVE_O_DR 0x00000008 // Data register +#define I2C_SLAVE_O_IM 0x0000000C // Interrupt mask register +#define I2C_SLAVE_O_RIS 0x00000010 // Raw interrupt status register +#define I2C_SLAVE_O_MIS 0x00000014 // Masked interrupt status reg +#define I2C_SLAVE_O_SICR 0x00000018 // Interrupt clear register + +//***************************************************************************** +// +// The followng define the bit fields in the I2C master slave address register. +// +//***************************************************************************** +#define I2C_MASTER_SA_SA_MASK 0x000000FE // Slave address +#define I2C_MASTER_SA_RS 0x00000001 // Receive/send +#define I2C_MASTER_SA_SA_SHIFT 1 + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Control and Status +// register. +// +//***************************************************************************** +#define I2C_MASTER_CS_ACK 0x00000008 // Acknowlegde +#define I2C_MASTER_CS_STOP 0x00000004 // Stop +#define I2C_MASTER_CS_START 0x00000002 // Start +#define I2C_MASTER_CS_RUN 0x00000001 // Run +#define I2C_MASTER_CS_BUS_BUSY 0x00000040 // Bus busy +#define I2C_MASTER_CS_IDLE 0x00000020 // Idle +#define I2C_MASTER_CS_ARB_LOST 0x00000010 // Lost arbitration +#define I2C_MASTER_CS_DATA_ACK 0x00000008 // Data byte not acknowledged +#define I2C_MASTER_CS_ADDR_ACK 0x00000004 // Address byte not acknowledged +#define I2C_MASTER_CS_ERROR 0x00000002 // Error occurred +#define I2C_MASTER_CS_BUSY 0x00000001 // Controller is TX/RX data +#define I2C_MASTER_CS_ERR_MASK 0x0000001C + +//***************************************************************************** +// +// The following define values used in determining the contents of the I2C +// Master Timer Period register. +// +//***************************************************************************** +#define I2C_MASTER_TPR_SCL_HP 0x00000004 // SCL high period +#define I2C_MASTER_TPR_SCL_LP 0x00000006 // SCL low period +#define I2C_MASTER_TPR_SCL (I2C_MASTER_TPR_SCL_HP + I2C_MASTER_TPR_SCL_LP) +#define I2C_SCL_STANDARD 100000 // SCL standard frequency +#define I2C_SCL_FAST 400000 // SCL fast frequency + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Interrupt Mask +// register. +// +//***************************************************************************** +#define I2C_MASTER_IMR_IM 0x00000001 // Master interrupt mask + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Raw Interrupt Status +// register. +// +//***************************************************************************** +#define I2C_MASTER_RIS_RIS 0x00000001 // Master raw interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Masked Interrupt +// Status register. +// +//***************************************************************************** +#define I2C_MASTER_MIS_MIS 0x00000001 // Master masked interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Interrupt Clear +// register. +// +//***************************************************************************** +#define I2C_MASTER_MICR_IC 0x00000001 // Master interrupt clear + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Configuration +// register. +// +//***************************************************************************** +#define I2C_MASTER_CR_SFE 0x00000020 // Slave function enable +#define I2C_MASTER_CR_MFE 0x00000010 // Master function enable +#define I2C_MASTER_CR_LPBK 0x00000001 // Loopback enable + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Own Address register. +// +//***************************************************************************** +#define I2C_SLAVE_SOAR_OAR_MASK 0x0000007F // Slave address + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Control/Status +// register. +// +//***************************************************************************** +#define I2C_SLAVE_CSR_DA 0x00000001 // Enable the device +#define I2C_SLAVE_CSR_TREQ 0x00000002 // Transmit request received +#define I2C_SLAVE_CSR_RREQ 0x00000001 // Receive data from I2C master + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Interrupt Mask +// register. +// +//***************************************************************************** +#define I2C_SLAVE_IMR_IM 0x00000001 // Slave interrupt mask + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Raw Interrupt Status +// register. +// +//***************************************************************************** +#define I2C_SLAVE_RIS_RIS 0x00000001 // Slave raw interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Masked Interrupt +// Status register. +// +//***************************************************************************** +#define I2C_SLAVE_MIS_MIS 0x00000001 // Slave masked interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Interrupt Clear +// register. +// +//***************************************************************************** +#define I2C_SLAVE_SICR_IC 0x00000001 // Slave interrupt clear + +#endif // __HW_I2C_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_ints.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_ints.h new file mode 100644 index 000000000..d2df4ee5b --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_ints.h @@ -0,0 +1,113 @@ +//***************************************************************************** +// +// hw_ints.h - Macros that define the interrupt assignment on Stellaris. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_INTS_H__ +#define __HW_INTS_H__ + +//***************************************************************************** +// +// The following define the fault assignments. +// +//***************************************************************************** +#define FAULT_NMI 2 // NMI fault +#define FAULT_HARD 3 // Hard fault +#define FAULT_MPU 4 // MPU fault +#define FAULT_BUS 5 // Bus fault +#define FAULT_USAGE 6 // Usage fault +#define FAULT_SVCALL 11 // SVCall +#define FAULT_DEBUG 12 // Debug monitor +#define FAULT_PENDSV 14 // PendSV +#define FAULT_SYSTICK 15 // System Tick + +//***************************************************************************** +// +// The following define the interrupt assignments. +// +//***************************************************************************** +#define INT_GPIOA 16 // GPIO Port A +#define INT_GPIOB 17 // GPIO Port B +#define INT_GPIOC 18 // GPIO Port C +#define INT_GPIOD 19 // GPIO Port D +#define INT_GPIOE 20 // GPIO Port E +#define INT_UART0 21 // UART0 Rx and Tx +#define INT_UART1 22 // UART1 Rx and Tx +#define INT_SSI 23 // SSI Rx and Tx +#define INT_SSI0 23 // SSI0 Rx and Tx +#define INT_I2C 24 // I2C Master and Slave +#define INT_I2C0 24 // I2C0 Master and Slave +#define INT_PWM_FAULT 25 // PWM Fault +#define INT_PWM0 26 // PWM Generator 0 +#define INT_PWM1 27 // PWM Generator 1 +#define INT_PWM2 28 // PWM Generator 2 +#define INT_QEI 29 // Quadrature Encoder +#define INT_QEI0 29 // Quadrature Encoder 0 +#define INT_ADC0 30 // ADC Sequence 0 +#define INT_ADC1 31 // ADC Sequence 1 +#define INT_ADC2 32 // ADC Sequence 2 +#define INT_ADC3 33 // ADC Sequence 3 +#define INT_WATCHDOG 34 // Watchdog timer +#define INT_TIMER0A 35 // Timer 0 subtimer A +#define INT_TIMER0B 36 // Timer 0 subtimer B +#define INT_TIMER1A 37 // Timer 1 subtimer A +#define INT_TIMER1B 38 // Timer 1 subtimer B +#define INT_TIMER2A 39 // Timer 2 subtimer A +#define INT_TIMER2B 40 // Timer 2 subtimer B +#define INT_COMP0 41 // Analog Comparator 0 +#define INT_COMP1 42 // Analog Comparator 1 +#define INT_COMP2 43 // Analog Comparator 2 +#define INT_SYSCTL 44 // System Control (PLL, OSC, BO) +#define INT_FLASH 45 // FLASH Control +#define INT_GPIOF 46 // GPIO Port F +#define INT_GPIOG 47 // GPIO Port G +#define INT_GPIOH 48 // GPIO Port H +#define INT_UART2 49 // UART2 Rx and Tx +#define INT_SSI1 50 // SSI1 Rx and Tx +#define INT_TIMER3A 51 // Timer 3 subtimer A +#define INT_TIMER3B 52 // Timer 3 subtimer B +#define INT_I2C1 53 // I2C1 Master and Slave +#define INT_QEI1 54 // Quadrature Encoder 1 +#define INT_CAN0 55 // CAN0 +#define INT_CAN1 56 // CAN1 +#define INT_ETH 58 // Ethernet +#define INT_HIBERNATE 59 // Hibernation module + +//***************************************************************************** +// +// The total number of interrupts. +// +//***************************************************************************** +#define NUM_INTERRUPTS 60 + +//***************************************************************************** +// +// The total number of priority levels. +// +//***************************************************************************** +#define NUM_PRIORITY 8 +#define NUM_PRIORITY_BITS 3 + +#endif // __HW_INTS_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_memmap.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_memmap.h new file mode 100644 index 000000000..8ae2a06cd --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_memmap.h @@ -0,0 +1,80 @@ +//***************************************************************************** +// +// hw_memmap.h - Macros defining the memory map of Stellaris. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_MEMMAP_H__ +#define __HW_MEMMAP_H__ + +//***************************************************************************** +// +// The following define the base address of the memories and peripherals. +// +//***************************************************************************** +#define FLASH_BASE 0x00000000 // FLASH memory +#define SRAM_BASE 0x20000000 // SRAM memory +#define WATCHDOG_BASE 0x40000000 // Watchdog +#define GPIO_PORTA_BASE 0x40004000 // GPIO Port A +#define GPIO_PORTB_BASE 0x40005000 // GPIO Port B +#define GPIO_PORTC_BASE 0x40006000 // GPIO Port C +#define GPIO_PORTD_BASE 0x40007000 // GPIO Port D +#define SSI_BASE 0x40008000 // SSI +#define SSI0_BASE 0x40008000 // SSI0 +#define SSI1_BASE 0x40009000 // SSI1 +#define UART0_BASE 0x4000C000 // UART0 +#define UART1_BASE 0x4000D000 // UART1 +#define UART2_BASE 0x4000E000 // UART2 +#define I2C_MASTER_BASE 0x40020000 // I2C Master +#define I2C_SLAVE_BASE 0x40020800 // I2C Slave +#define I2C0_MASTER_BASE 0x40020000 // I2C0 Master +#define I2C0_SLAVE_BASE 0x40020800 // I2C0 Slave +#define I2C1_MASTER_BASE 0x40021000 // I2C1 Master +#define I2C1_SLAVE_BASE 0x40021800 // I2C1 Slave +#define GPIO_PORTE_BASE 0x40024000 // GPIO Port E +#define GPIO_PORTF_BASE 0x40025000 // GPIO Port F +#define GPIO_PORTG_BASE 0x40026000 // GPIO Port G +#define GPIO_PORTH_BASE 0x40027000 // GPIO Port H +#define PWM_BASE 0x40028000 // PWM +#define QEI_BASE 0x4002C000 // QEI +#define QEI0_BASE 0x4002C000 // QEI0 +#define QEI1_BASE 0x4002D000 // QEI1 +#define TIMER0_BASE 0x40030000 // Timer0 +#define TIMER1_BASE 0x40031000 // Timer1 +#define TIMER2_BASE 0x40032000 // Timer2 +#define TIMER3_BASE 0x40033000 // Timer3 +#define ADC_BASE 0x40038000 // ADC +#define COMP_BASE 0x4003C000 // Analog comparators +#define CAN0_BASE 0x40040000 // CAN0 +#define CAN1_BASE 0x40041000 // CAN1 +#define ETH_BASE 0x40048000 // Ethernet +#define FLASH_CTRL_BASE 0x400FD000 // FLASH Controller +#define SYSCTL_BASE 0x400FE000 // System Control +#define ITM_BASE 0xE0000000 // Instrumentation Trace Macrocell +#define DWT_BASE 0xE0001000 // Data Watchpoint and Trace +#define FPB_BASE 0xE0002000 // FLASH Patch and Breakpoint +#define NVIC_BASE 0xE000E000 // Nested Vectored Interrupt Ctrl +#define TPIU_BASE 0xE0040000 // Trace Port Interface Unit + +#endif // __HW_MEMMAP_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_nvic.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_nvic.h new file mode 100644 index 000000000..68c8d7c7f --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_nvic.h @@ -0,0 +1,1050 @@ +//***************************************************************************** +// +// hw_nvic.h - Macros used when accessing the NVIC hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_NVIC_H__ +#define __HW_NVIC_H__ + +//***************************************************************************** +// +// The following define the addresses of the NVIC registers. +// +//***************************************************************************** +#define NVIC_INT_TYPE 0xE000E004 // Interrupt Controller Type Reg. +#define NVIC_ST_CTRL 0xE000E010 // SysTick Control and Status Reg. +#define NVIC_ST_RELOAD 0xE000E014 // SysTick Reload Value Register +#define NVIC_ST_CURRENT 0xE000E018 // SysTick Current Value Register +#define NVIC_ST_CAL 0xE000E01C // SysTick Calibration Value Reg. +#define NVIC_EN0 0xE000E100 // IRQ 0 to 31 Set Enable Register +#define NVIC_EN1 0xE000E104 // IRQ 32 to 63 Set Enable Register +#define NVIC_DIS0 0xE000E180 // IRQ 0 to 31 Clear Enable Reg. +#define NVIC_DIS1 0xE000E184 // IRQ 32 to 63 Clear Enable Reg. +#define NVIC_PEND0 0xE000E200 // IRQ 0 to 31 Set Pending Register +#define NVIC_PEND1 0xE000E204 // IRQ 32 to 63 Set Pending Reg. +#define NVIC_UNPEND0 0xE000E280 // IRQ 0 to 31 Clear Pending Reg. +#define NVIC_UNPEND1 0xE000E284 // IRQ 32 to 63 Clear Pending Reg. +#define NVIC_ACTIVE0 0xE000E300 // IRQ 0 to 31 Active Register +#define NVIC_ACTIVE1 0xE000E304 // IRQ 32 to 63 Active Register +#define NVIC_PRI0 0xE000E400 // IRQ 0 to 3 Priority Register +#define NVIC_PRI1 0xE000E404 // IRQ 4 to 7 Priority Register +#define NVIC_PRI2 0xE000E408 // IRQ 8 to 11 Priority Register +#define NVIC_PRI3 0xE000E40C // IRQ 12 to 15 Priority Register +#define NVIC_PRI4 0xE000E410 // IRQ 16 to 19 Priority Register +#define NVIC_PRI5 0xE000E414 // IRQ 20 to 23 Priority Register +#define NVIC_PRI6 0xE000E418 // IRQ 24 to 27 Priority Register +#define NVIC_PRI7 0xE000E41C // IRQ 28 to 31 Priority Register +#define NVIC_PRI8 0xE000E420 // IRQ 32 to 35 Priority Register +#define NVIC_PRI9 0xE000E424 // IRQ 36 to 39 Priority Register +#define NVIC_PRI10 0xE000E428 // IRQ 40 to 43 Priority Register +#define NVIC_CPUID 0xE000ED00 // CPUID Base Register +#define NVIC_INT_CTRL 0xE000ED04 // Interrupt Control State Register +#define NVIC_VTABLE 0xE000ED08 // Vector Table Offset Register +#define NVIC_APINT 0xE000ED0C // App. Int & Reset Control Reg. +#define NVIC_SYS_CTRL 0xE000ED10 // System Control Register +#define NVIC_CFG_CTRL 0xE000ED14 // Configuration Control Register +#define NVIC_SYS_PRI1 0xE000ED18 // Sys. Handlers 4 to 7 Priority +#define NVIC_SYS_PRI2 0xE000ED1C // Sys. Handlers 8 to 11 Priority +#define NVIC_SYS_PRI3 0xE000ED20 // Sys. Handlers 12 to 15 Priority +#define NVIC_SYS_HND_CTRL 0xE000ED24 // System Handler Control and State +#define NVIC_FAULT_STAT 0xE000ED28 // Configurable Fault Status Reg. +#define NVIC_HFAULT_STAT 0xE000ED2C // Hard Fault Status Register +#define NVIC_DEBUG_STAT 0xE000ED30 // Debug Status Register +#define NVIC_MM_ADDR 0xE000ED34 // Mem Manage Address Register +#define NVIC_FAULT_ADDR 0xE000ED38 // Bus Fault Address Register +#define NVIC_MPU_TYPE 0xE000ED90 // MPU Type Register +#define NVIC_MPU_CTRL 0xE000ED94 // MPU Control Register +#define NVIC_MPU_NUMBER 0xE000ED98 // MPU Region Number Register +#define NVIC_MPU_BASE 0xE000ED9C // MPU Region Base Address Register +#define NVIC_MPU_ATTR 0xE000EDA0 // MPU Region Attribute & Size Reg. +#define NVIC_DBG_CTRL 0xE000EDF0 // Debug Control and Status Reg. +#define NVIC_DBG_XFER 0xE000EDF4 // Debug Core Reg. Transfer Select +#define NVIC_DBG_DATA 0xE000EDF8 // Debug Core Register Data +#define NVIC_DBG_INT 0xE000EDFC // Debug Reset Interrupt Control +#define NVIC_SW_TRIG 0xE000EF00 // Software Trigger Interrupt Reg. + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_INT_TYPE register. +// +//***************************************************************************** +#define NVIC_INT_TYPE_LINES_M 0x0000001F // Number of interrupt lines (x32) +#define NVIC_INT_TYPE_LINES_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CTRL register. +// +//***************************************************************************** +#define NVIC_ST_CTRL_COUNT 0x00010000 // Count flag +#define NVIC_ST_CTRL_CLK_SRC 0x00000004 // Clock Source +#define NVIC_ST_CTRL_INTEN 0x00000002 // Interrupt enable +#define NVIC_ST_CTRL_ENABLE 0x00000001 // Counter mode + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_RELOAD register. +// +//***************************************************************************** +#define NVIC_ST_RELOAD_M 0x00FFFFFF // Counter load value +#define NVIC_ST_RELOAD_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CURRENT register. +// +//***************************************************************************** +#define NVIC_ST_CURRENT_M 0x00FFFFFF // Counter current value +#define NVIC_ST_CURRENT_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CAL register. +// +//***************************************************************************** +#define NVIC_ST_CAL_NOREF 0x80000000 // No reference clock +#define NVIC_ST_CAL_SKEW 0x40000000 // Clock skew +#define NVIC_ST_CAL_ONEMS_M 0x00FFFFFF // 1ms reference value +#define NVIC_ST_CAL_ONEMS_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EN0 register. +// +//***************************************************************************** +#define NVIC_EN0_INT31 0x80000000 // Interrupt 31 enable +#define NVIC_EN0_INT30 0x40000000 // Interrupt 30 enable +#define NVIC_EN0_INT29 0x20000000 // Interrupt 29 enable +#define NVIC_EN0_INT28 0x10000000 // Interrupt 28 enable +#define NVIC_EN0_INT27 0x08000000 // Interrupt 27 enable +#define NVIC_EN0_INT26 0x04000000 // Interrupt 26 enable +#define NVIC_EN0_INT25 0x02000000 // Interrupt 25 enable +#define NVIC_EN0_INT24 0x01000000 // Interrupt 24 enable +#define NVIC_EN0_INT23 0x00800000 // Interrupt 23 enable +#define NVIC_EN0_INT22 0x00400000 // Interrupt 22 enable +#define NVIC_EN0_INT21 0x00200000 // Interrupt 21 enable +#define NVIC_EN0_INT20 0x00100000 // Interrupt 20 enable +#define NVIC_EN0_INT19 0x00080000 // Interrupt 19 enable +#define NVIC_EN0_INT18 0x00040000 // Interrupt 18 enable +#define NVIC_EN0_INT17 0x00020000 // Interrupt 17 enable +#define NVIC_EN0_INT16 0x00010000 // Interrupt 16 enable +#define NVIC_EN0_INT15 0x00008000 // Interrupt 15 enable +#define NVIC_EN0_INT14 0x00004000 // Interrupt 14 enable +#define NVIC_EN0_INT13 0x00002000 // Interrupt 13 enable +#define NVIC_EN0_INT12 0x00001000 // Interrupt 12 enable +#define NVIC_EN0_INT11 0x00000800 // Interrupt 11 enable +#define NVIC_EN0_INT10 0x00000400 // Interrupt 10 enable +#define NVIC_EN0_INT9 0x00000200 // Interrupt 9 enable +#define NVIC_EN0_INT8 0x00000100 // Interrupt 8 enable +#define NVIC_EN0_INT7 0x00000080 // Interrupt 7 enable +#define NVIC_EN0_INT6 0x00000040 // Interrupt 6 enable +#define NVIC_EN0_INT5 0x00000020 // Interrupt 5 enable +#define NVIC_EN0_INT4 0x00000010 // Interrupt 4 enable +#define NVIC_EN0_INT3 0x00000008 // Interrupt 3 enable +#define NVIC_EN0_INT2 0x00000004 // Interrupt 2 enable +#define NVIC_EN0_INT1 0x00000002 // Interrupt 1 enable +#define NVIC_EN0_INT0 0x00000001 // Interrupt 0 enable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EN1 register. +// +//***************************************************************************** +#define NVIC_EN1_INT59 0x08000000 // Interrupt 59 enable +#define NVIC_EN1_INT58 0x04000000 // Interrupt 58 enable +#define NVIC_EN1_INT57 0x02000000 // Interrupt 57 enable +#define NVIC_EN1_INT56 0x01000000 // Interrupt 56 enable +#define NVIC_EN1_INT55 0x00800000 // Interrupt 55 enable +#define NVIC_EN1_INT54 0x00400000 // Interrupt 54 enable +#define NVIC_EN1_INT53 0x00200000 // Interrupt 53 enable +#define NVIC_EN1_INT52 0x00100000 // Interrupt 52 enable +#define NVIC_EN1_INT51 0x00080000 // Interrupt 51 enable +#define NVIC_EN1_INT50 0x00040000 // Interrupt 50 enable +#define NVIC_EN1_INT49 0x00020000 // Interrupt 49 enable +#define NVIC_EN1_INT48 0x00010000 // Interrupt 48 enable +#define NVIC_EN1_INT47 0x00008000 // Interrupt 47 enable +#define NVIC_EN1_INT46 0x00004000 // Interrupt 46 enable +#define NVIC_EN1_INT45 0x00002000 // Interrupt 45 enable +#define NVIC_EN1_INT44 0x00001000 // Interrupt 44 enable +#define NVIC_EN1_INT43 0x00000800 // Interrupt 43 enable +#define NVIC_EN1_INT42 0x00000400 // Interrupt 42 enable +#define NVIC_EN1_INT41 0x00000200 // Interrupt 41 enable +#define NVIC_EN1_INT40 0x00000100 // Interrupt 40 enable +#define NVIC_EN1_INT39 0x00000080 // Interrupt 39 enable +#define NVIC_EN1_INT38 0x00000040 // Interrupt 38 enable +#define NVIC_EN1_INT37 0x00000020 // Interrupt 37 enable +#define NVIC_EN1_INT36 0x00000010 // Interrupt 36 enable +#define NVIC_EN1_INT35 0x00000008 // Interrupt 35 enable +#define NVIC_EN1_INT34 0x00000004 // Interrupt 34 enable +#define NVIC_EN1_INT33 0x00000002 // Interrupt 33 enable +#define NVIC_EN1_INT32 0x00000001 // Interrupt 32 enable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DIS0 register. +// +//***************************************************************************** +#define NVIC_DIS0_INT31 0x80000000 // Interrupt 31 disable +#define NVIC_DIS0_INT30 0x40000000 // Interrupt 30 disable +#define NVIC_DIS0_INT29 0x20000000 // Interrupt 29 disable +#define NVIC_DIS0_INT28 0x10000000 // Interrupt 28 disable +#define NVIC_DIS0_INT27 0x08000000 // Interrupt 27 disable +#define NVIC_DIS0_INT26 0x04000000 // Interrupt 26 disable +#define NVIC_DIS0_INT25 0x02000000 // Interrupt 25 disable +#define NVIC_DIS0_INT24 0x01000000 // Interrupt 24 disable +#define NVIC_DIS0_INT23 0x00800000 // Interrupt 23 disable +#define NVIC_DIS0_INT22 0x00400000 // Interrupt 22 disable +#define NVIC_DIS0_INT21 0x00200000 // Interrupt 21 disable +#define NVIC_DIS0_INT20 0x00100000 // Interrupt 20 disable +#define NVIC_DIS0_INT19 0x00080000 // Interrupt 19 disable +#define NVIC_DIS0_INT18 0x00040000 // Interrupt 18 disable +#define NVIC_DIS0_INT17 0x00020000 // Interrupt 17 disable +#define NVIC_DIS0_INT16 0x00010000 // Interrupt 16 disable +#define NVIC_DIS0_INT15 0x00008000 // Interrupt 15 disable +#define NVIC_DIS0_INT14 0x00004000 // Interrupt 14 disable +#define NVIC_DIS0_INT13 0x00002000 // Interrupt 13 disable +#define NVIC_DIS0_INT12 0x00001000 // Interrupt 12 disable +#define NVIC_DIS0_INT11 0x00000800 // Interrupt 11 disable +#define NVIC_DIS0_INT10 0x00000400 // Interrupt 10 disable +#define NVIC_DIS0_INT9 0x00000200 // Interrupt 9 disable +#define NVIC_DIS0_INT8 0x00000100 // Interrupt 8 disable +#define NVIC_DIS0_INT7 0x00000080 // Interrupt 7 disable +#define NVIC_DIS0_INT6 0x00000040 // Interrupt 6 disable +#define NVIC_DIS0_INT5 0x00000020 // Interrupt 5 disable +#define NVIC_DIS0_INT4 0x00000010 // Interrupt 4 disable +#define NVIC_DIS0_INT3 0x00000008 // Interrupt 3 disable +#define NVIC_DIS0_INT2 0x00000004 // Interrupt 2 disable +#define NVIC_DIS0_INT1 0x00000002 // Interrupt 1 disable +#define NVIC_DIS0_INT0 0x00000001 // Interrupt 0 disable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DIS1 register. +// +//***************************************************************************** +#define NVIC_DIS1_INT59 0x08000000 // Interrupt 59 disable +#define NVIC_DIS1_INT58 0x04000000 // Interrupt 58 disable +#define NVIC_DIS1_INT57 0x02000000 // Interrupt 57 disable +#define NVIC_DIS1_INT56 0x01000000 // Interrupt 56 disable +#define NVIC_DIS1_INT55 0x00800000 // Interrupt 55 disable +#define NVIC_DIS1_INT54 0x00400000 // Interrupt 54 disable +#define NVIC_DIS1_INT53 0x00200000 // Interrupt 53 disable +#define NVIC_DIS1_INT52 0x00100000 // Interrupt 52 disable +#define NVIC_DIS1_INT51 0x00080000 // Interrupt 51 disable +#define NVIC_DIS1_INT50 0x00040000 // Interrupt 50 disable +#define NVIC_DIS1_INT49 0x00020000 // Interrupt 49 disable +#define NVIC_DIS1_INT48 0x00010000 // Interrupt 48 disable +#define NVIC_DIS1_INT47 0x00008000 // Interrupt 47 disable +#define NVIC_DIS1_INT46 0x00004000 // Interrupt 46 disable +#define NVIC_DIS1_INT45 0x00002000 // Interrupt 45 disable +#define NVIC_DIS1_INT44 0x00001000 // Interrupt 44 disable +#define NVIC_DIS1_INT43 0x00000800 // Interrupt 43 disable +#define NVIC_DIS1_INT42 0x00000400 // Interrupt 42 disable +#define NVIC_DIS1_INT41 0x00000200 // Interrupt 41 disable +#define NVIC_DIS1_INT40 0x00000100 // Interrupt 40 disable +#define NVIC_DIS1_INT39 0x00000080 // Interrupt 39 disable +#define NVIC_DIS1_INT38 0x00000040 // Interrupt 38 disable +#define NVIC_DIS1_INT37 0x00000020 // Interrupt 37 disable +#define NVIC_DIS1_INT36 0x00000010 // Interrupt 36 disable +#define NVIC_DIS1_INT35 0x00000008 // Interrupt 35 disable +#define NVIC_DIS1_INT34 0x00000004 // Interrupt 34 disable +#define NVIC_DIS1_INT33 0x00000002 // Interrupt 33 disable +#define NVIC_DIS1_INT32 0x00000001 // Interrupt 32 disable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PEND0 register. +// +//***************************************************************************** +#define NVIC_PEND0_INT31 0x80000000 // Interrupt 31 pend +#define NVIC_PEND0_INT30 0x40000000 // Interrupt 30 pend +#define NVIC_PEND0_INT29 0x20000000 // Interrupt 29 pend +#define NVIC_PEND0_INT28 0x10000000 // Interrupt 28 pend +#define NVIC_PEND0_INT27 0x08000000 // Interrupt 27 pend +#define NVIC_PEND0_INT26 0x04000000 // Interrupt 26 pend +#define NVIC_PEND0_INT25 0x02000000 // Interrupt 25 pend +#define NVIC_PEND0_INT24 0x01000000 // Interrupt 24 pend +#define NVIC_PEND0_INT23 0x00800000 // Interrupt 23 pend +#define NVIC_PEND0_INT22 0x00400000 // Interrupt 22 pend +#define NVIC_PEND0_INT21 0x00200000 // Interrupt 21 pend +#define NVIC_PEND0_INT20 0x00100000 // Interrupt 20 pend +#define NVIC_PEND0_INT19 0x00080000 // Interrupt 19 pend +#define NVIC_PEND0_INT18 0x00040000 // Interrupt 18 pend +#define NVIC_PEND0_INT17 0x00020000 // Interrupt 17 pend +#define NVIC_PEND0_INT16 0x00010000 // Interrupt 16 pend +#define NVIC_PEND0_INT15 0x00008000 // Interrupt 15 pend +#define NVIC_PEND0_INT14 0x00004000 // Interrupt 14 pend +#define NVIC_PEND0_INT13 0x00002000 // Interrupt 13 pend +#define NVIC_PEND0_INT12 0x00001000 // Interrupt 12 pend +#define NVIC_PEND0_INT11 0x00000800 // Interrupt 11 pend +#define NVIC_PEND0_INT10 0x00000400 // Interrupt 10 pend +#define NVIC_PEND0_INT9 0x00000200 // Interrupt 9 pend +#define NVIC_PEND0_INT8 0x00000100 // Interrupt 8 pend +#define NVIC_PEND0_INT7 0x00000080 // Interrupt 7 pend +#define NVIC_PEND0_INT6 0x00000040 // Interrupt 6 pend +#define NVIC_PEND0_INT5 0x00000020 // Interrupt 5 pend +#define NVIC_PEND0_INT4 0x00000010 // Interrupt 4 pend +#define NVIC_PEND0_INT3 0x00000008 // Interrupt 3 pend +#define NVIC_PEND0_INT2 0x00000004 // Interrupt 2 pend +#define NVIC_PEND0_INT1 0x00000002 // Interrupt 1 pend +#define NVIC_PEND0_INT0 0x00000001 // Interrupt 0 pend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PEND1 register. +// +//***************************************************************************** +#define NVIC_PEND1_INT59 0x08000000 // Interrupt 59 pend +#define NVIC_PEND1_INT58 0x04000000 // Interrupt 58 pend +#define NVIC_PEND1_INT57 0x02000000 // Interrupt 57 pend +#define NVIC_PEND1_INT56 0x01000000 // Interrupt 56 pend +#define NVIC_PEND1_INT55 0x00800000 // Interrupt 55 pend +#define NVIC_PEND1_INT54 0x00400000 // Interrupt 54 pend +#define NVIC_PEND1_INT53 0x00200000 // Interrupt 53 pend +#define NVIC_PEND1_INT52 0x00100000 // Interrupt 52 pend +#define NVIC_PEND1_INT51 0x00080000 // Interrupt 51 pend +#define NVIC_PEND1_INT50 0x00040000 // Interrupt 50 pend +#define NVIC_PEND1_INT49 0x00020000 // Interrupt 49 pend +#define NVIC_PEND1_INT48 0x00010000 // Interrupt 48 pend +#define NVIC_PEND1_INT47 0x00008000 // Interrupt 47 pend +#define NVIC_PEND1_INT46 0x00004000 // Interrupt 46 pend +#define NVIC_PEND1_INT45 0x00002000 // Interrupt 45 pend +#define NVIC_PEND1_INT44 0x00001000 // Interrupt 44 pend +#define NVIC_PEND1_INT43 0x00000800 // Interrupt 43 pend +#define NVIC_PEND1_INT42 0x00000400 // Interrupt 42 pend +#define NVIC_PEND1_INT41 0x00000200 // Interrupt 41 pend +#define NVIC_PEND1_INT40 0x00000100 // Interrupt 40 pend +#define NVIC_PEND1_INT39 0x00000080 // Interrupt 39 pend +#define NVIC_PEND1_INT38 0x00000040 // Interrupt 38 pend +#define NVIC_PEND1_INT37 0x00000020 // Interrupt 37 pend +#define NVIC_PEND1_INT36 0x00000010 // Interrupt 36 pend +#define NVIC_PEND1_INT35 0x00000008 // Interrupt 35 pend +#define NVIC_PEND1_INT34 0x00000004 // Interrupt 34 pend +#define NVIC_PEND1_INT33 0x00000002 // Interrupt 33 pend +#define NVIC_PEND1_INT32 0x00000001 // Interrupt 32 pend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_UNPEND0 register. +// +//***************************************************************************** +#define NVIC_UNPEND0_INT31 0x80000000 // Interrupt 31 unpend +#define NVIC_UNPEND0_INT30 0x40000000 // Interrupt 30 unpend +#define NVIC_UNPEND0_INT29 0x20000000 // Interrupt 29 unpend +#define NVIC_UNPEND0_INT28 0x10000000 // Interrupt 28 unpend +#define NVIC_UNPEND0_INT27 0x08000000 // Interrupt 27 unpend +#define NVIC_UNPEND0_INT26 0x04000000 // Interrupt 26 unpend +#define NVIC_UNPEND0_INT25 0x02000000 // Interrupt 25 unpend +#define NVIC_UNPEND0_INT24 0x01000000 // Interrupt 24 unpend +#define NVIC_UNPEND0_INT23 0x00800000 // Interrupt 23 unpend +#define NVIC_UNPEND0_INT22 0x00400000 // Interrupt 22 unpend +#define NVIC_UNPEND0_INT21 0x00200000 // Interrupt 21 unpend +#define NVIC_UNPEND0_INT20 0x00100000 // Interrupt 20 unpend +#define NVIC_UNPEND0_INT19 0x00080000 // Interrupt 19 unpend +#define NVIC_UNPEND0_INT18 0x00040000 // Interrupt 18 unpend +#define NVIC_UNPEND0_INT17 0x00020000 // Interrupt 17 unpend +#define NVIC_UNPEND0_INT16 0x00010000 // Interrupt 16 unpend +#define NVIC_UNPEND0_INT15 0x00008000 // Interrupt 15 unpend +#define NVIC_UNPEND0_INT14 0x00004000 // Interrupt 14 unpend +#define NVIC_UNPEND0_INT13 0x00002000 // Interrupt 13 unpend +#define NVIC_UNPEND0_INT12 0x00001000 // Interrupt 12 unpend +#define NVIC_UNPEND0_INT11 0x00000800 // Interrupt 11 unpend +#define NVIC_UNPEND0_INT10 0x00000400 // Interrupt 10 unpend +#define NVIC_UNPEND0_INT9 0x00000200 // Interrupt 9 unpend +#define NVIC_UNPEND0_INT8 0x00000100 // Interrupt 8 unpend +#define NVIC_UNPEND0_INT7 0x00000080 // Interrupt 7 unpend +#define NVIC_UNPEND0_INT6 0x00000040 // Interrupt 6 unpend +#define NVIC_UNPEND0_INT5 0x00000020 // Interrupt 5 unpend +#define NVIC_UNPEND0_INT4 0x00000010 // Interrupt 4 unpend +#define NVIC_UNPEND0_INT3 0x00000008 // Interrupt 3 unpend +#define NVIC_UNPEND0_INT2 0x00000004 // Interrupt 2 unpend +#define NVIC_UNPEND0_INT1 0x00000002 // Interrupt 1 unpend +#define NVIC_UNPEND0_INT0 0x00000001 // Interrupt 0 unpend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_UNPEND1 register. +// +//***************************************************************************** +#define NVIC_UNPEND1_INT59 0x08000000 // Interrupt 59 unpend +#define NVIC_UNPEND1_INT58 0x04000000 // Interrupt 58 unpend +#define NVIC_UNPEND1_INT57 0x02000000 // Interrupt 57 unpend +#define NVIC_UNPEND1_INT56 0x01000000 // Interrupt 56 unpend +#define NVIC_UNPEND1_INT55 0x00800000 // Interrupt 55 unpend +#define NVIC_UNPEND1_INT54 0x00400000 // Interrupt 54 unpend +#define NVIC_UNPEND1_INT53 0x00200000 // Interrupt 53 unpend +#define NVIC_UNPEND1_INT52 0x00100000 // Interrupt 52 unpend +#define NVIC_UNPEND1_INT51 0x00080000 // Interrupt 51 unpend +#define NVIC_UNPEND1_INT50 0x00040000 // Interrupt 50 unpend +#define NVIC_UNPEND1_INT49 0x00020000 // Interrupt 49 unpend +#define NVIC_UNPEND1_INT48 0x00010000 // Interrupt 48 unpend +#define NVIC_UNPEND1_INT47 0x00008000 // Interrupt 47 unpend +#define NVIC_UNPEND1_INT46 0x00004000 // Interrupt 46 unpend +#define NVIC_UNPEND1_INT45 0x00002000 // Interrupt 45 unpend +#define NVIC_UNPEND1_INT44 0x00001000 // Interrupt 44 unpend +#define NVIC_UNPEND1_INT43 0x00000800 // Interrupt 43 unpend +#define NVIC_UNPEND1_INT42 0x00000400 // Interrupt 42 unpend +#define NVIC_UNPEND1_INT41 0x00000200 // Interrupt 41 unpend +#define NVIC_UNPEND1_INT40 0x00000100 // Interrupt 40 unpend +#define NVIC_UNPEND1_INT39 0x00000080 // Interrupt 39 unpend +#define NVIC_UNPEND1_INT38 0x00000040 // Interrupt 38 unpend +#define NVIC_UNPEND1_INT37 0x00000020 // Interrupt 37 unpend +#define NVIC_UNPEND1_INT36 0x00000010 // Interrupt 36 unpend +#define NVIC_UNPEND1_INT35 0x00000008 // Interrupt 35 unpend +#define NVIC_UNPEND1_INT34 0x00000004 // Interrupt 34 unpend +#define NVIC_UNPEND1_INT33 0x00000002 // Interrupt 33 unpend +#define NVIC_UNPEND1_INT32 0x00000001 // Interrupt 32 unpend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ACTIVE0 register. +// +//***************************************************************************** +#define NVIC_ACTIVE0_INT31 0x80000000 // Interrupt 31 active +#define NVIC_ACTIVE0_INT30 0x40000000 // Interrupt 30 active +#define NVIC_ACTIVE0_INT29 0x20000000 // Interrupt 29 active +#define NVIC_ACTIVE0_INT28 0x10000000 // Interrupt 28 active +#define NVIC_ACTIVE0_INT27 0x08000000 // Interrupt 27 active +#define NVIC_ACTIVE0_INT26 0x04000000 // Interrupt 26 active +#define NVIC_ACTIVE0_INT25 0x02000000 // Interrupt 25 active +#define NVIC_ACTIVE0_INT24 0x01000000 // Interrupt 24 active +#define NVIC_ACTIVE0_INT23 0x00800000 // Interrupt 23 active +#define NVIC_ACTIVE0_INT22 0x00400000 // Interrupt 22 active +#define NVIC_ACTIVE0_INT21 0x00200000 // Interrupt 21 active +#define NVIC_ACTIVE0_INT20 0x00100000 // Interrupt 20 active +#define NVIC_ACTIVE0_INT19 0x00080000 // Interrupt 19 active +#define NVIC_ACTIVE0_INT18 0x00040000 // Interrupt 18 active +#define NVIC_ACTIVE0_INT17 0x00020000 // Interrupt 17 active +#define NVIC_ACTIVE0_INT16 0x00010000 // Interrupt 16 active +#define NVIC_ACTIVE0_INT15 0x00008000 // Interrupt 15 active +#define NVIC_ACTIVE0_INT14 0x00004000 // Interrupt 14 active +#define NVIC_ACTIVE0_INT13 0x00002000 // Interrupt 13 active +#define NVIC_ACTIVE0_INT12 0x00001000 // Interrupt 12 active +#define NVIC_ACTIVE0_INT11 0x00000800 // Interrupt 11 active +#define NVIC_ACTIVE0_INT10 0x00000400 // Interrupt 10 active +#define NVIC_ACTIVE0_INT9 0x00000200 // Interrupt 9 active +#define NVIC_ACTIVE0_INT8 0x00000100 // Interrupt 8 active +#define NVIC_ACTIVE0_INT7 0x00000080 // Interrupt 7 active +#define NVIC_ACTIVE0_INT6 0x00000040 // Interrupt 6 active +#define NVIC_ACTIVE0_INT5 0x00000020 // Interrupt 5 active +#define NVIC_ACTIVE0_INT4 0x00000010 // Interrupt 4 active +#define NVIC_ACTIVE0_INT3 0x00000008 // Interrupt 3 active +#define NVIC_ACTIVE0_INT2 0x00000004 // Interrupt 2 active +#define NVIC_ACTIVE0_INT1 0x00000002 // Interrupt 1 active +#define NVIC_ACTIVE0_INT0 0x00000001 // Interrupt 0 active + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ACTIVE1 register. +// +//***************************************************************************** +#define NVIC_ACTIVE1_INT59 0x08000000 // Interrupt 59 active +#define NVIC_ACTIVE1_INT58 0x04000000 // Interrupt 58 active +#define NVIC_ACTIVE1_INT57 0x02000000 // Interrupt 57 active +#define NVIC_ACTIVE1_INT56 0x01000000 // Interrupt 56 active +#define NVIC_ACTIVE1_INT55 0x00800000 // Interrupt 55 active +#define NVIC_ACTIVE1_INT54 0x00400000 // Interrupt 54 active +#define NVIC_ACTIVE1_INT53 0x00200000 // Interrupt 53 active +#define NVIC_ACTIVE1_INT52 0x00100000 // Interrupt 52 active +#define NVIC_ACTIVE1_INT51 0x00080000 // Interrupt 51 active +#define NVIC_ACTIVE1_INT50 0x00040000 // Interrupt 50 active +#define NVIC_ACTIVE1_INT49 0x00020000 // Interrupt 49 active +#define NVIC_ACTIVE1_INT48 0x00010000 // Interrupt 48 active +#define NVIC_ACTIVE1_INT47 0x00008000 // Interrupt 47 active +#define NVIC_ACTIVE1_INT46 0x00004000 // Interrupt 46 active +#define NVIC_ACTIVE1_INT45 0x00002000 // Interrupt 45 active +#define NVIC_ACTIVE1_INT44 0x00001000 // Interrupt 44 active +#define NVIC_ACTIVE1_INT43 0x00000800 // Interrupt 43 active +#define NVIC_ACTIVE1_INT42 0x00000400 // Interrupt 42 active +#define NVIC_ACTIVE1_INT41 0x00000200 // Interrupt 41 active +#define NVIC_ACTIVE1_INT40 0x00000100 // Interrupt 40 active +#define NVIC_ACTIVE1_INT39 0x00000080 // Interrupt 39 active +#define NVIC_ACTIVE1_INT38 0x00000040 // Interrupt 38 active +#define NVIC_ACTIVE1_INT37 0x00000020 // Interrupt 37 active +#define NVIC_ACTIVE1_INT36 0x00000010 // Interrupt 36 active +#define NVIC_ACTIVE1_INT35 0x00000008 // Interrupt 35 active +#define NVIC_ACTIVE1_INT34 0x00000004 // Interrupt 34 active +#define NVIC_ACTIVE1_INT33 0x00000002 // Interrupt 33 active +#define NVIC_ACTIVE1_INT32 0x00000001 // Interrupt 32 active + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI0 register. +// +//***************************************************************************** +#define NVIC_PRI0_INT3_M 0xFF000000 // Interrupt 3 priority mask +#define NVIC_PRI0_INT2_M 0x00FF0000 // Interrupt 2 priority mask +#define NVIC_PRI0_INT1_M 0x0000FF00 // Interrupt 1 priority mask +#define NVIC_PRI0_INT0_M 0x000000FF // Interrupt 0 priority mask +#define NVIC_PRI0_INT3_S 24 +#define NVIC_PRI0_INT2_S 16 +#define NVIC_PRI0_INT1_S 8 +#define NVIC_PRI0_INT0_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI1 register. +// +//***************************************************************************** +#define NVIC_PRI1_INT7_M 0xFF000000 // Interrupt 7 priority mask +#define NVIC_PRI1_INT6_M 0x00FF0000 // Interrupt 6 priority mask +#define NVIC_PRI1_INT5_M 0x0000FF00 // Interrupt 5 priority mask +#define NVIC_PRI1_INT4_M 0x000000FF // Interrupt 4 priority mask +#define NVIC_PRI1_INT7_S 24 +#define NVIC_PRI1_INT6_S 16 +#define NVIC_PRI1_INT5_S 8 +#define NVIC_PRI1_INT4_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI2 register. +// +//***************************************************************************** +#define NVIC_PRI2_INT11_M 0xFF000000 // Interrupt 11 priority mask +#define NVIC_PRI2_INT10_M 0x00FF0000 // Interrupt 10 priority mask +#define NVIC_PRI2_INT9_M 0x0000FF00 // Interrupt 9 priority mask +#define NVIC_PRI2_INT8_M 0x000000FF // Interrupt 8 priority mask +#define NVIC_PRI2_INT11_S 24 +#define NVIC_PRI2_INT10_S 16 +#define NVIC_PRI2_INT9_S 8 +#define NVIC_PRI2_INT8_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI3 register. +// +//***************************************************************************** +#define NVIC_PRI3_INT15_M 0xFF000000 // Interrupt 15 priority mask +#define NVIC_PRI3_INT14_M 0x00FF0000 // Interrupt 14 priority mask +#define NVIC_PRI3_INT13_M 0x0000FF00 // Interrupt 13 priority mask +#define NVIC_PRI3_INT12_M 0x000000FF // Interrupt 12 priority mask +#define NVIC_PRI3_INT15_S 24 +#define NVIC_PRI3_INT14_S 16 +#define NVIC_PRI3_INT13_S 8 +#define NVIC_PRI3_INT12_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI4 register. +// +//***************************************************************************** +#define NVIC_PRI4_INT19_M 0xFF000000 // Interrupt 19 priority mask +#define NVIC_PRI4_INT18_M 0x00FF0000 // Interrupt 18 priority mask +#define NVIC_PRI4_INT17_M 0x0000FF00 // Interrupt 17 priority mask +#define NVIC_PRI4_INT16_M 0x000000FF // Interrupt 16 priority mask +#define NVIC_PRI4_INT19_S 24 +#define NVIC_PRI4_INT18_S 16 +#define NVIC_PRI4_INT17_S 8 +#define NVIC_PRI4_INT16_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI5 register. +// +//***************************************************************************** +#define NVIC_PRI5_INT23_M 0xFF000000 // Interrupt 23 priority mask +#define NVIC_PRI5_INT22_M 0x00FF0000 // Interrupt 22 priority mask +#define NVIC_PRI5_INT21_M 0x0000FF00 // Interrupt 21 priority mask +#define NVIC_PRI5_INT20_M 0x000000FF // Interrupt 20 priority mask +#define NVIC_PRI5_INT23_S 24 +#define NVIC_PRI5_INT22_S 16 +#define NVIC_PRI5_INT21_S 8 +#define NVIC_PRI5_INT20_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI6 register. +// +//***************************************************************************** +#define NVIC_PRI6_INT27_M 0xFF000000 // Interrupt 27 priority mask +#define NVIC_PRI6_INT26_M 0x00FF0000 // Interrupt 26 priority mask +#define NVIC_PRI6_INT25_M 0x0000FF00 // Interrupt 25 priority mask +#define NVIC_PRI6_INT24_M 0x000000FF // Interrupt 24 priority mask +#define NVIC_PRI6_INT27_S 24 +#define NVIC_PRI6_INT26_S 16 +#define NVIC_PRI6_INT25_S 8 +#define NVIC_PRI6_INT24_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI7 register. +// +//***************************************************************************** +#define NVIC_PRI7_INT31_M 0xFF000000 // Interrupt 31 priority mask +#define NVIC_PRI7_INT30_M 0x00FF0000 // Interrupt 30 priority mask +#define NVIC_PRI7_INT29_M 0x0000FF00 // Interrupt 29 priority mask +#define NVIC_PRI7_INT28_M 0x000000FF // Interrupt 28 priority mask +#define NVIC_PRI7_INT31_S 24 +#define NVIC_PRI7_INT30_S 16 +#define NVIC_PRI7_INT29_S 8 +#define NVIC_PRI7_INT28_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI8 register. +// +//***************************************************************************** +#define NVIC_PRI8_INT35_M 0xFF000000 // Interrupt 35 priority mask +#define NVIC_PRI8_INT34_M 0x00FF0000 // Interrupt 34 priority mask +#define NVIC_PRI8_INT33_M 0x0000FF00 // Interrupt 33 priority mask +#define NVIC_PRI8_INT32_M 0x000000FF // Interrupt 32 priority mask +#define NVIC_PRI8_INT35_S 24 +#define NVIC_PRI8_INT34_S 16 +#define NVIC_PRI8_INT33_S 8 +#define NVIC_PRI8_INT32_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI9 register. +// +//***************************************************************************** +#define NVIC_PRI9_INT39_M 0xFF000000 // Interrupt 39 priority mask +#define NVIC_PRI9_INT38_M 0x00FF0000 // Interrupt 38 priority mask +#define NVIC_PRI9_INT37_M 0x0000FF00 // Interrupt 37 priority mask +#define NVIC_PRI9_INT36_M 0x000000FF // Interrupt 36 priority mask +#define NVIC_PRI9_INT39_S 24 +#define NVIC_PRI9_INT38_S 16 +#define NVIC_PRI9_INT37_S 8 +#define NVIC_PRI9_INT36_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI10 register. +// +//***************************************************************************** +#define NVIC_PRI10_INT43_M 0xFF000000 // Interrupt 43 priority mask +#define NVIC_PRI10_INT42_M 0x00FF0000 // Interrupt 42 priority mask +#define NVIC_PRI10_INT41_M 0x0000FF00 // Interrupt 41 priority mask +#define NVIC_PRI10_INT40_M 0x000000FF // Interrupt 40 priority mask +#define NVIC_PRI10_INT43_S 24 +#define NVIC_PRI10_INT42_S 16 +#define NVIC_PRI10_INT41_S 8 +#define NVIC_PRI10_INT40_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_CPUID register. +// +//***************************************************************************** +#define NVIC_CPUID_IMP_M 0xFF000000 // Implementer +#define NVIC_CPUID_VAR_M 0x00F00000 // Variant +#define NVIC_CPUID_PARTNO_M 0x0000FFF0 // Processor part number +#define NVIC_CPUID_REV_M 0x0000000F // Revision + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_INT_CTRL register. +// +//***************************************************************************** +#define NVIC_INT_CTRL_NMI_SET 0x80000000 // Pend a NMI +#define NVIC_INT_CTRL_PEND_SV 0x10000000 // Pend a PendSV +#define NVIC_INT_CTRL_UNPEND_SV 0x08000000 // Unpend a PendSV +#define NVIC_INT_CTRL_ISR_PRE 0x00800000 // Debug interrupt handling +#define NVIC_INT_CTRL_ISR_PEND 0x00400000 // Debug interrupt pending +#define NVIC_INT_CTRL_VEC_PEN_M 0x003FF000 // Highest pending exception +#define NVIC_INT_CTRL_RET_BASE 0x00000800 // Return to base +#define NVIC_INT_CTRL_VEC_ACT_M 0x000003FF // Current active exception +#define NVIC_INT_CTRL_VEC_PEN_S 12 +#define NVIC_INT_CTRL_VEC_ACT_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_VTABLE register. +// +//***************************************************************************** +#define NVIC_VTABLE_BASE 0x20000000 // Vector table base +#define NVIC_VTABLE_OFFSET_M 0x1FFFFF00 // Vector table offset +#define NVIC_VTABLE_OFFSET_S 8 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_APINT register. +// +//***************************************************************************** +#define NVIC_APINT_VECTKEY_M 0xFFFF0000 // Vector key mask +#define NVIC_APINT_VECTKEY 0x05FA0000 // Vector key +#define NVIC_APINT_ENDIANESS 0x00008000 // Data endianess +#define NVIC_APINT_PRIGROUP_M 0x00000700 // Priority group +#define NVIC_APINT_PRIGROUP_7_1 0x00000000 // Priority group 7.1 split +#define NVIC_APINT_PRIGROUP_6_2 0x00000100 // Priority group 6.2 split +#define NVIC_APINT_PRIGROUP_5_3 0x00000200 // Priority group 5.3 split +#define NVIC_APINT_PRIGROUP_4_4 0x00000300 // Priority group 4.4 split +#define NVIC_APINT_PRIGROUP_3_5 0x00000400 // Priority group 3.5 split +#define NVIC_APINT_PRIGROUP_2_6 0x00000500 // Priority group 2.6 split +#define NVIC_APINT_PRIGROUP_1_7 0x00000600 // Priority group 1.7 split +#define NVIC_APINT_PRIGROUP_0_8 0x00000700 // Priority group 0.8 split +#define NVIC_APINT_SYSRESETREQ 0x00000004 // System reset request +#define NVIC_APINT_VECT_CLR_ACT 0x00000002 // Clear active NMI/fault info +#define NVIC_APINT_VECT_RESET 0x00000001 // System reset + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_CTRL register. +// +//***************************************************************************** +#define NVIC_SYS_CTRL_SEVONPEND 0x00000010 // Wakeup on pend +#define NVIC_SYS_CTRL_SLEEPDEEP 0x00000004 // Deep sleep enable +#define NVIC_SYS_CTRL_SLEEPEXIT 0x00000002 // Sleep on ISR exit + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_CFG_CTRL register. +// +//***************************************************************************** +#define NVIC_CFG_CTRL_BFHFNMIGN 0x00000100 // Ignore bus fault in NMI/fault +#define NVIC_CFG_CTRL_DIV0 0x00000010 // Trap on divide by 0 +#define NVIC_CFG_CTRL_UNALIGNED 0x00000008 // Trap on unaligned access +#define NVIC_CFG_CTRL_DEEP_PEND 0x00000004 // Allow deep interrupt trigger +#define NVIC_CFG_CTRL_MAIN_PEND 0x00000002 // Allow main interrupt trigger +#define NVIC_CFG_CTRL_BASE_THR 0x00000001 // Thread state control + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI1 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI1_RES_M 0xFF000000 // Priority of reserved handler +#define NVIC_SYS_PRI1_USAGE_M 0x00FF0000 // Priority of usage fault handler +#define NVIC_SYS_PRI1_BUS_M 0x0000FF00 // Priority of bus fault handler +#define NVIC_SYS_PRI1_MEM_M 0x000000FF // Priority of mem manage handler +#define NVIC_SYS_PRI1_USAGE_S 16 +#define NVIC_SYS_PRI1_BUS_S 8 +#define NVIC_SYS_PRI1_MEM_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI2 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI2_SVC_M 0xFF000000 // Priority of SVCall handler +#define NVIC_SYS_PRI2_RES_M 0x00FFFFFF // Priority of reserved handlers +#define NVIC_SYS_PRI2_SVC_S 24 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI3 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI3_TICK_M 0xFF000000 // Priority of Sys Tick handler +#define NVIC_SYS_PRI3_PENDSV_M 0x00FF0000 // Priority of PendSV handler +#define NVIC_SYS_PRI3_RES_M 0x0000FF00 // Priority of reserved handler +#define NVIC_SYS_PRI3_DEBUG_M 0x000000FF // Priority of debug handler +#define NVIC_SYS_PRI3_TICK_S 24 +#define NVIC_SYS_PRI3_PENDSV_S 16 +#define NVIC_SYS_PRI3_DEBUG_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_HND_CTRL register. +// +//***************************************************************************** +#define NVIC_SYS_HND_CTRL_USAGE 0x00040000 // Usage fault enable +#define NVIC_SYS_HND_CTRL_BUS 0x00020000 // Bus fault enable +#define NVIC_SYS_HND_CTRL_MEM 0x00010000 // Mem manage fault enable +#define NVIC_SYS_HND_CTRL_SVC 0x00008000 // SVCall is pended +#define NVIC_SYS_HND_CTRL_BUSP 0x00004000 // Bus fault is pended +#define NVIC_SYS_HND_CTRL_TICK 0x00000800 // Sys tick is active +#define NVIC_SYS_HND_CTRL_PNDSV 0x00000400 // PendSV is active +#define NVIC_SYS_HND_CTRL_MON 0x00000100 // Monitor is active +#define NVIC_SYS_HND_CTRL_SVCA 0x00000080 // SVCall is active +#define NVIC_SYS_HND_CTRL_USGA 0x00000008 // Usage fault is active +#define NVIC_SYS_HND_CTRL_BUSA 0x00000002 // Bus fault is active +#define NVIC_SYS_HND_CTRL_MEMA 0x00000001 // Mem manage is active + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_FAULT_STAT register. +// +//***************************************************************************** +#define NVIC_FAULT_STAT_DIV0 0x02000000 // Divide by zero fault +#define NVIC_FAULT_STAT_UNALIGN 0x01000000 // Unaligned access fault +#define NVIC_FAULT_STAT_NOCP 0x00080000 // No coprocessor fault +#define NVIC_FAULT_STAT_INVPC 0x00040000 // Invalid PC fault +#define NVIC_FAULT_STAT_INVSTAT 0x00020000 // Invalid state fault +#define NVIC_FAULT_STAT_UNDEF 0x00010000 // Undefined instruction fault +#define NVIC_FAULT_STAT_BFARV 0x00008000 // BFAR is valid +#define NVIC_FAULT_STAT_BSTKE 0x00001000 // Stack bus fault +#define NVIC_FAULT_STAT_BUSTKE 0x00000800 // Unstack bus fault +#define NVIC_FAULT_STAT_IMPRE 0x00000400 // Imprecise data bus error +#define NVIC_FAULT_STAT_PRECISE 0x00000200 // Precise data bus error +#define NVIC_FAULT_STAT_IBUS 0x00000100 // Instruction bus fault +#define NVIC_FAULT_STAT_MMARV 0x00000080 // MMAR is valid +#define NVIC_FAULT_STAT_MSTKE 0x00000010 // Stack access violation +#define NVIC_FAULT_STAT_MUSTKE 0x00000008 // Unstack access violation +#define NVIC_FAULT_STAT_DERR 0x00000002 // Data access violation +#define NVIC_FAULT_STAT_IERR 0x00000001 // Instruction access violation + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_HFAULT_STAT register. +// +//***************************************************************************** +#define NVIC_HFAULT_STAT_DBG 0x80000000 // Debug event +#define NVIC_HFAULT_STAT_FORCED 0x40000000 // Cannot execute fault handler +#define NVIC_HFAULT_STAT_VECT 0x00000002 // Vector table read fault + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DEBUG_STAT register. +// +//***************************************************************************** +#define NVIC_DEBUG_STAT_EXTRNL 0x00000010 // EDBGRQ asserted +#define NVIC_DEBUG_STAT_VCATCH 0x00000008 // Vector catch +#define NVIC_DEBUG_STAT_DWTTRAP 0x00000004 // DWT match +#define NVIC_DEBUG_STAT_BKPT 0x00000002 // Breakpoint instruction +#define NVIC_DEBUG_STAT_HALTED 0x00000001 // Halt request + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MM_ADDR register. +// +//***************************************************************************** +#define NVIC_MM_ADDR_M 0xFFFFFFFF // Data fault address +#define NVIC_MM_ADDR_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_FAULT_ADDR register. +// +//***************************************************************************** +#define NVIC_FAULT_ADDR_M 0xFFFFFFFF // Data bus fault address +#define NVIC_FAULT_ADDR_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EXC_STACK register. +// +//***************************************************************************** +#define NVIC_EXC_STACK_DEEP 0x00000001 // Exception stack + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EXC_NUM register. +// +//***************************************************************************** +#define NVIC_EXC_NUM_M 0x000003FF // Exception number +#define NVIC_EXC_NUM_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_COPRO register. +// +//***************************************************************************** +#define NVIC_COPRO_15_M 0xC0000000 // Coprocessor 15 access mask +#define NVIC_COPRO_15_DENIED 0x00000000 // Coprocessor 15 access denied +#define NVIC_COPRO_15_PRIV 0x40000000 // Coprocessor 15 privileged addess +#define NVIC_COPRO_15_FULL 0xC0000000 // Coprocessor 15 full access +#define NVIC_COPRO_14_M 0x30000000 // Coprocessor 14 access mask +#define NVIC_COPRO_14_DENIED 0x00000000 // Coprocessor 14 access denied +#define NVIC_COPRO_14_PRIV 0x10000000 // Coprocessor 14 privileged addess +#define NVIC_COPRO_14_FULL 0x30000000 // Coprocessor 14 full access +#define NVIC_COPRO_13_M 0x0C000000 // Coprocessor 13 access mask +#define NVIC_COPRO_13_DENIED 0x00000000 // Coprocessor 13 access denied +#define NVIC_COPRO_13_PRIV 0x04000000 // Coprocessor 13 privileged addess +#define NVIC_COPRO_13_FULL 0x0C000000 // Coprocessor 13 full access +#define NVIC_COPRO_12_M 0x03000000 // Coprocessor 12 access mask +#define NVIC_COPRO_12_DENIED 0x00000000 // Coprocessor 12 access denied +#define NVIC_COPRO_12_PRIV 0x01000000 // Coprocessor 12 privileged addess +#define NVIC_COPRO_12_FULL 0x03000000 // Coprocessor 12 full access +#define NVIC_COPRO_11_M 0x00C00000 // Coprocessor 11 access mask +#define NVIC_COPRO_11_DENIED 0x00000000 // Coprocessor 11 access denied +#define NVIC_COPRO_11_PRIV 0x00400000 // Coprocessor 11 privileged addess +#define NVIC_COPRO_11_FULL 0x00C00000 // Coprocessor 11 full access +#define NVIC_COPRO_10_M 0x00300000 // Coprocessor 10 access mask +#define NVIC_COPRO_10_DENIED 0x00000000 // Coprocessor 10 access denied +#define NVIC_COPRO_10_PRIV 0x00100000 // Coprocessor 10 privileged addess +#define NVIC_COPRO_10_FULL 0x00300000 // Coprocessor 10 full access +#define NVIC_COPRO_9_M 0x000C0000 // Coprocessor 9 access mask +#define NVIC_COPRO_9_DENIED 0x00000000 // Coprocessor 9 access denied +#define NVIC_COPRO_9_PRIV 0x00040000 // Coprocessor 9 privileged addess +#define NVIC_COPRO_9_FULL 0x000C0000 // Coprocessor 9 full access +#define NVIC_COPRO_8_M 0x00030000 // Coprocessor 8 access mask +#define NVIC_COPRO_8_DENIED 0x00000000 // Coprocessor 8 access denied +#define NVIC_COPRO_8_PRIV 0x00010000 // Coprocessor 8 privileged addess +#define NVIC_COPRO_8_FULL 0x00030000 // Coprocessor 8 full access +#define NVIC_COPRO_7_M 0x0000C000 // Coprocessor 7 access mask +#define NVIC_COPRO_7_DENIED 0x00000000 // Coprocessor 7 access denied +#define NVIC_COPRO_7_PRIV 0x00004000 // Coprocessor 7 privileged addess +#define NVIC_COPRO_7_FULL 0x0000C000 // Coprocessor 7 full access +#define NVIC_COPRO_6_M 0x00003000 // Coprocessor 6 access mask +#define NVIC_COPRO_6_DENIED 0x00000000 // Coprocessor 6 access denied +#define NVIC_COPRO_6_PRIV 0x00001000 // Coprocessor 6 privileged addess +#define NVIC_COPRO_6_FULL 0x00003000 // Coprocessor 6 full access +#define NVIC_COPRO_5_M 0x00000C00 // Coprocessor 5 access mask +#define NVIC_COPRO_5_DENIED 0x00000000 // Coprocessor 5 access denied +#define NVIC_COPRO_5_PRIV 0x00000400 // Coprocessor 5 privileged addess +#define NVIC_COPRO_5_FULL 0x00000C00 // Coprocessor 5 full access +#define NVIC_COPRO_4_M 0x00000300 // Coprocessor 4 access mask +#define NVIC_COPRO_4_DENIED 0x00000000 // Coprocessor 4 access denied +#define NVIC_COPRO_4_PRIV 0x00000100 // Coprocessor 4 privileged addess +#define NVIC_COPRO_4_FULL 0x00000300 // Coprocessor 4 full access +#define NVIC_COPRO_3_M 0x000000C0 // Coprocessor 3 access mask +#define NVIC_COPRO_3_DENIED 0x00000000 // Coprocessor 3 access denied +#define NVIC_COPRO_3_PRIV 0x00000040 // Coprocessor 3 privileged addess +#define NVIC_COPRO_3_FULL 0x000000C0 // Coprocessor 3 full access +#define NVIC_COPRO_2_M 0x00000030 // Coprocessor 2 access mask +#define NVIC_COPRO_2_DENIED 0x00000000 // Coprocessor 2 access denied +#define NVIC_COPRO_2_PRIV 0x00000010 // Coprocessor 2 privileged addess +#define NVIC_COPRO_2_FULL 0x00000030 // Coprocessor 2 full access +#define NVIC_COPRO_1_M 0x0000000C // Coprocessor 1 access mask +#define NVIC_COPRO_1_DENIED 0x00000000 // Coprocessor 1 access denied +#define NVIC_COPRO_1_PRIV 0x00000004 // Coprocessor 1 privileged addess +#define NVIC_COPRO_1_FULL 0x0000000C // Coprocessor 1 full access +#define NVIC_COPRO_0_M 0x00000003 // Coprocessor 0 access mask +#define NVIC_COPRO_0_DENIED 0x00000000 // Coprocessor 0 access denied +#define NVIC_COPRO_0_PRIV 0x00000001 // Coprocessor 0 privileged addess +#define NVIC_COPRO_0_FULL 0x00000003 // Coprocessor 0 full access + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_TYPE register. +// +//***************************************************************************** +#define NVIC_MPU_TYPE_IREGION_M 0x00FF0000 // Number of I regions +#define NVIC_MPU_TYPE_DREGION_M 0x0000FF00 // Number of D regions +#define NVIC_MPU_TYPE_SEPARATE 0x00000001 // Separate or unified MPU +#define NVIC_MPU_TYPE_IREGION_S 16 +#define NVIC_MPU_TYPE_DREGION_S 8 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_CTRL register. +// +//***************************************************************************** +#define NVIC_MPU_CTRL_HFNMIENA 0x00000002 // MPU enabled during faults +#define NVIC_MPU_CTRL_ENABLE 0x00000001 // MPU enable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_NUMBER register. +// +//***************************************************************************** +#define NVIC_MPU_NUMBER_M 0x000000FF // MPU region to access +#define NVIC_MPU_NUMBER_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_BASE register. +// +//***************************************************************************** +#define NVIC_MPU_BASE_ADDR_M 0xFFFFFF00 // Base address +#define NVIC_MPU_BASE_VALID 0x00000010 // Region number valid +#define NVIC_MPU_BASE_REGION_M 0x0000000F // Region number +#define NVIC_MPU_BASE_ADDR_S 8 +#define NVIC_MPU_BASE_REGION_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_ATTR register. +// +//***************************************************************************** +#define NVIC_MPU_ATTR_ATTRS 0xFFFF0000 // Attributes +#define NVIC_MPU_ATTR_SRD 0x0000FF00 // Sub-region disable +#define NVIC_MPU_ATTR_SZENABLE 0x000000FF // Region size + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_CTRL register. +// +//***************************************************************************** +#define NVIC_DBG_CTRL_DBGKEY_M 0xFFFF0000 // Debug key mask +#define NVIC_DBG_CTRL_DBGKEY 0xA05F0000 // Debug key +#define NVIC_DBG_CTRL_MON_PEND 0x00008000 // Pend the monitor +#define NVIC_DBG_CTRL_MON_REQ 0x00004000 // Monitor request +#define NVIC_DBG_CTRL_MON_EN 0x00002000 // Debug monitor enable +#define NVIC_DBG_CTRL_MONSTEP 0x00001000 // Monitor step the core +#define NVIC_DBG_CTRL_S_SLEEP 0x00000400 // Core is sleeping +#define NVIC_DBG_CTRL_S_HALT 0x00000200 // Core status on halt +#define NVIC_DBG_CTRL_S_REGRDY 0x00000100 // Register read/write available +#define NVIC_DBG_CTRL_S_LOCKUP 0x00000080 // Core is locked up +#define NVIC_DBG_CTRL_C_RESET 0x00000010 // Reset the core +#define NVIC_DBG_CTRL_C_MASKINT 0x00000008 // Mask interrupts when stepping +#define NVIC_DBG_CTRL_C_STEP 0x00000004 // Step the core +#define NVIC_DBG_CTRL_C_HALT 0x00000002 // Halt the core +#define NVIC_DBG_CTRL_C_DEBUGEN 0x00000001 // Enable debug + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_XFER register. +// +//***************************************************************************** +#define NVIC_DBG_XFER_REG_WNR 0x00010000 // Write or not read +#define NVIC_DBG_XFER_REG_SEL_M 0x0000001F // Register +#define NVIC_DBG_XFER_REG_R0 0x00000000 // Register R0 +#define NVIC_DBG_XFER_REG_R1 0x00000001 // Register R1 +#define NVIC_DBG_XFER_REG_R2 0x00000002 // Register R2 +#define NVIC_DBG_XFER_REG_R3 0x00000003 // Register R3 +#define NVIC_DBG_XFER_REG_R4 0x00000004 // Register R4 +#define NVIC_DBG_XFER_REG_R5 0x00000005 // Register R5 +#define NVIC_DBG_XFER_REG_R6 0x00000006 // Register R6 +#define NVIC_DBG_XFER_REG_R7 0x00000007 // Register R7 +#define NVIC_DBG_XFER_REG_R8 0x00000008 // Register R8 +#define NVIC_DBG_XFER_REG_R9 0x00000009 // Register R9 +#define NVIC_DBG_XFER_REG_R10 0x0000000A // Register R10 +#define NVIC_DBG_XFER_REG_R11 0x0000000B // Register R11 +#define NVIC_DBG_XFER_REG_R12 0x0000000C // Register R12 +#define NVIC_DBG_XFER_REG_R13 0x0000000D // Register R13 +#define NVIC_DBG_XFER_REG_R14 0x0000000E // Register R14 +#define NVIC_DBG_XFER_REG_R15 0x0000000F // Register R15 +#define NVIC_DBG_XFER_REG_FLAGS 0x00000010 // xPSR/Flags register +#define NVIC_DBG_XFER_REG_MSP 0x00000011 // Main SP +#define NVIC_DBG_XFER_REG_PSP 0x00000012 // Process SP +#define NVIC_DBG_XFER_REG_DSP 0x00000013 // Deep SP +#define NVIC_DBG_XFER_REG_CFBP 0x00000014 // Control/Fault/BasePri/PriMask + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_DATA register. +// +//***************************************************************************** +#define NVIC_DBG_DATA_M 0xFFFFFFFF // Data temporary cache +#define NVIC_DBG_DATA_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_INT register. +// +//***************************************************************************** +#define NVIC_DBG_INT_HARDERR 0x00000400 // Debug trap on hard fault +#define NVIC_DBG_INT_INTERR 0x00000200 // Debug trap on interrupt errors +#define NVIC_DBG_INT_BUSERR 0x00000100 // Debug trap on bus error +#define NVIC_DBG_INT_STATERR 0x00000080 // Debug trap on usage fault state +#define NVIC_DBG_INT_CHKERR 0x00000040 // Debug trap on usage fault check +#define NVIC_DBG_INT_NOCPERR 0x00000020 // Debug trap on coprocessor error +#define NVIC_DBG_INT_MMERR 0x00000010 // Debug trap on mem manage fault +#define NVIC_DBG_INT_RESET 0x00000008 // Core reset status +#define NVIC_DBG_INT_RSTPENDCLR 0x00000004 // Clear pending core reset +#define NVIC_DBG_INT_RSTPENDING 0x00000002 // Core reset is pending +#define NVIC_DBG_INT_RSTVCATCH 0x00000001 // Reset vector catch + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SW_TRIG register. +// +//***************************************************************************** +#define NVIC_SW_TRIG_INTID_M 0x000003FF // Interrupt to trigger +#define NVIC_SW_TRIG_INTID_S 0 + +#endif // __HW_NVIC_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_pwm.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_pwm.h new file mode 100644 index 000000000..53609c6f9 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_pwm.h @@ -0,0 +1,260 @@ +//***************************************************************************** +// +// hw_pwm.h - Defines and Macros for Pulse Width Modulation (PWM) ports +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_PWM_H__ +#define __HW_PWM_H__ + +//***************************************************************************** +// +// PWM Module Register Offsets. +// +//***************************************************************************** +#define PWM_O_CTL 0x00000000 // PWM Master Control register +#define PWM_O_SYNC 0x00000004 // PWM Time Base Sync register +#define PWM_O_ENABLE 0x00000008 // PWM Output Enable register +#define PWM_O_INVERT 0x0000000C // PWM Output Inversion register +#define PWM_O_FAULT 0x00000010 // PWM Output Fault register +#define PWM_O_INTEN 0x00000014 // PWM Interrupt Enable register +#define PWM_O_RIS 0x00000018 // PWM Interrupt Raw Status reg. +#define PWM_O_ISC 0x0000001C // PWM Interrupt Status register +#define PWM_O_STATUS 0x00000020 // PWM Status register + +//***************************************************************************** +// +// The following define the bit fields in the PWM Master Control register. +// +//***************************************************************************** +#define PWM_CTL_GLOBAL_SYNC2 0x00000004 // Global sync generator 2 +#define PWM_CTL_GLOBAL_SYNC1 0x00000002 // Global sync generator 1 +#define PWM_CTL_GLOBAL_SYNC0 0x00000001 // Global sync generator 0 + +//***************************************************************************** +// +// The following define the bit fields in the PWM Time Base Sync register. +// +//***************************************************************************** +#define PWM_SYNC_SYNC2 0x00000004 // Reset generator 2 counter +#define PWM_SYNC_SYNC1 0x00000002 // Reset generator 1 counter +#define PWM_SYNC_SYNC0 0x00000001 // Reset generator 0 counter + +//***************************************************************************** +// +// The following define the bit fields in the PWM Output Enable register. +// +//***************************************************************************** +#define PWM_ENABLE_PWM5EN 0x00000020 // PWM5 pin enable +#define PWM_ENABLE_PWM4EN 0x00000010 // PWM4 pin enable +#define PWM_ENABLE_PWM3EN 0x00000008 // PWM3 pin enable +#define PWM_ENABLE_PWM2EN 0x00000004 // PWM2 pin enable +#define PWM_ENABLE_PWM1EN 0x00000002 // PWM1 pin enable +#define PWM_ENABLE_PWM0EN 0x00000001 // PWM0 pin enable + +//***************************************************************************** +// +// The following define the bit fields in the PWM Inversion register. +// +//***************************************************************************** +#define PWM_INVERT_PWM5INV 0x00000020 // PWM5 pin invert +#define PWM_INVERT_PWM4INV 0x00000010 // PWM4 pin invert +#define PWM_INVERT_PWM3INV 0x00000008 // PWM3 pin invert +#define PWM_INVERT_PWM2INV 0x00000004 // PWM2 pin invert +#define PWM_INVERT_PWM1INV 0x00000002 // PWM1 pin invert +#define PWM_INVERT_PWM0INV 0x00000001 // PWM0 pin invert + +//***************************************************************************** +// +// The following define the bit fields in the PWM Fault register. +// +//***************************************************************************** +#define PWM_FAULT_FAULT5 0x00000020 // PWM5 pin fault +#define PWM_FAULT_FAULT4 0x00000010 // PWM5 pin fault +#define PWM_FAULT_FAULT3 0x00000008 // PWM5 pin fault +#define PWM_FAULT_FAULT2 0x00000004 // PWM5 pin fault +#define PWM_FAULT_FAULT1 0x00000002 // PWM5 pin fault +#define PWM_FAULT_FAULT0 0x00000001 // PWM5 pin fault + +//***************************************************************************** +// +// PWM Interrupt Register bit definitions. +// +//***************************************************************************** +#define PWM_INT_INTFAULT 0x00010000 // Fault interrupt pending + +//***************************************************************************** +// +// The following define the bit fields in the PWM Status register. +// +//***************************************************************************** +#define PWM_STATUS_FAULT 0x00000001 // Fault status + +//***************************************************************************** +// +// PWM Generator standard offsets. +// +//***************************************************************************** +#define PWM_GEN_0_OFFSET 0x00000040 // PWM0 base +#define PWM_GEN_1_OFFSET 0x00000080 // PWM1 base +#define PWM_GEN_2_OFFSET 0x000000C0 // PWM2 base + +#define PWM_O_X_CTL 0x00000000 // Gen Control Reg +#define PWM_O_X_INTEN 0x00000004 // Gen Int/Trig Enable Reg +#define PWM_O_X_RIS 0x00000008 // Gen Raw Int Status Reg +#define PWM_O_X_ISC 0x0000000C // Gen Int Status Reg +#define PWM_O_X_LOAD 0x00000010 // Gen Load Reg +#define PWM_O_X_COUNT 0x00000014 // Gen Counter Reg +#define PWM_O_X_CMPA 0x00000018 // Gen Compare A Reg +#define PWM_O_X_CMPB 0x0000001C // Gen Compare B Reg +#define PWM_O_X_GENA 0x00000020 // Gen Generator A Ctrl Reg +#define PWM_O_X_GENB 0x00000024 // Gen Generator B Ctrl Reg +#define PWM_O_X_DBCTL 0x00000028 // Gen Dead Band Ctrl Reg +#define PWM_O_X_DBRISE 0x0000002C // Gen DB Rising Edge Delay Reg +#define PWM_O_X_DBFALL 0x00000030 // Gen DB Falling Edge Delay Reg + +//***************************************************************************** +// +// PWM_X Control Register bit definitions. +// +//***************************************************************************** +#define PWM_X_CTL_ENABLE 0x00000001 // Master enable for gen block +#define PWM_X_CTL_MODE 0x00000002 // Counter mode, down or up/down +#define PWM_X_CTL_DEBUG 0x00000004 // Debug mode +#define PWM_X_CTL_LOADUPD 0x00000008 // Update mode for the load reg +#define PWM_X_CTL_CMPAUPD 0x00000010 // Update mode for comp A reg +#define PWM_X_CTL_CMPBUPD 0x00000020 // Update mode for comp B reg + +//***************************************************************************** +// +// PWM_X Interrupt/Trigger Enable Register bit definitions. +// +//***************************************************************************** +#define PWM_X_INTEN_INTCNTZERO 0x00000001 // Int if COUNT = 0 +#define PWM_X_INTEN_INTCNTLOAD 0x00000002 // Int if COUNT = LOAD +#define PWM_X_INTEN_INTCMPAU 0x00000004 // Int if COUNT = CMPA U +#define PWM_X_INTEN_INTCMPAD 0x00000008 // Int if COUNT = CMPA D +#define PWM_X_INTEN_INTCMPBU 0x00000010 // Int if COUNT = CMPA U +#define PWM_X_INTEN_INTCMPBD 0x00000020 // Int if COUNT = CMPA D +#define PWM_X_INTEN_TRCNTZERO 0x00000100 // Trig if COUNT = 0 +#define PWM_X_INTEN_TRCNTLOAD 0x00000200 // Trig if COUNT = LOAD +#define PWM_X_INTEN_TRCMPAU 0x00000400 // Trig if COUNT = CMPA U +#define PWM_X_INTEN_TRCMPAD 0x00000800 // Trig if COUNT = CMPA D +#define PWM_X_INTEN_TRCMPBU 0x00001000 // Trig if COUNT = CMPA U +#define PWM_X_INTEN_TRCMPBD 0x00002000 // Trig if COUNT = CMPA D + +//***************************************************************************** +// +// PWM_X Raw Interrupt Status Register bit definitions. +// +//***************************************************************************** +#define PWM_X_RIS_INTCNTZERO 0x00000001 // PWM_X_COUNT = 0 int +#define PWM_X_RIS_INTCNTLOAD 0x00000002 // PWM_X_COUNT = PWM_X_LOAD int +#define PWM_X_RIS_INTCMPAU 0x00000004 // PWM_X_COUNT = PWM_X_CMPA U int +#define PWM_X_RIS_INTCMPAD 0x00000008 // PWM_X_COUNT = PWM_X_CMPA D int +#define PWM_X_RIS_INTCMPBU 0x00000010 // PWM_X_COUNT = PWM_X_CMPB U int +#define PWM_X_RIS_INTCMPBD 0x00000020 // PWM_X_COUNT = PWM_X_CMPB D int + +//***************************************************************************** +// +// PWM_X Interrupt Status Register bit definitions. +// +//***************************************************************************** +#define PWM_X_INT_INTCNTZERO 0x00000001 // PWM_X_COUNT = 0 received +#define PWM_X_INT_INTCNTLOAD 0x00000002 // PWM_X_COUNT = PWM_X_LOAD rcvd +#define PWM_X_INT_INTCMPAU 0x00000004 // PWM_X_COUNT = PWM_X_CMPA U rcvd +#define PWM_X_INT_INTCMPAD 0x00000008 // PWM_X_COUNT = PWM_X_CMPA D rcvd +#define PWM_X_INT_INTCMPBU 0x00000010 // PWM_X_COUNT = PWM_X_CMPB U rcvd +#define PWM_X_INT_INTCMPBD 0x00000020 // PWM_X_COUNT = PWM_X_CMPB D rcvd + +//***************************************************************************** +// +// PWM_X Generator A/B Control Register bit definitions. +// +//***************************************************************************** +#define PWM_X_GEN_Y_ACTZERO 0x00000003 // Act PWM_X_COUNT = 0 +#define PWM_X_GEN_Y_ACTLOAD 0x0000000C // Act PWM_X_COUNT = PWM_X_LOAD +#define PWM_X_GEN_Y_ACTCMPAU 0x00000030 // Act PWM_X_COUNT = PWM_X_CMPA U +#define PWM_X_GEN_Y_ACTCMPAD 0x000000C0 // Act PWM_X_COUNT = PWM_X_CMPA D +#define PWM_X_GEN_Y_ACTCMPBU 0x00000300 // Act PWM_X_COUNT = PWM_X_CMPB U +#define PWM_X_GEN_Y_ACTCMPBD 0x00000C00 // Act PWM_X_COUNT = PWM_X_CMPB D + +//***************************************************************************** +// +// PWM_X Generator A/B Control Register action definitions. +// +//***************************************************************************** +#define PWM_GEN_ACT_NONE 0x0 // Do nothing +#define PWM_GEN_ACT_INV 0x1 // Invert the output signal +#define PWM_GEN_ACT_ZERO 0x2 // Set the output signal to zero +#define PWM_GEN_ACT_ONE 0x3 // Set the output signal to one +#define PWM_GEN_ACT_ZERO_SHIFT 0 // Shift amount for the zero action +#define PWM_GEN_ACT_LOAD_SHIFT 2 // Shift amount for the load action +#define PWM_GEN_ACT_A_UP_SHIFT 4 // Shift amount for the A up action +#define PWM_GEN_ACT_A_DN_SHIFT 6 // Shift amount for the A dn action +#define PWM_GEN_ACT_B_UP_SHIFT 8 // Shift amount for the B up action +#define PWM_GEN_ACT_B_DN_SHIFT 10 // Shift amount for the B dn action + +//***************************************************************************** +// +// PWM_X Dead Band Control Register bit definitions. +// +//***************************************************************************** +#define PWM_DBCTL_ENABLE 0x00000001 // Enable dead band insertion + +//***************************************************************************** +// +// PWM Register reset values. +// +//***************************************************************************** +#define PWM_RV_CTL 0x00000000 // Master control of the PWM module +#define PWM_RV_SYNC 0x00000000 // Counter synch for PWM generators +#define PWM_RV_ENABLE 0x00000000 // Master enable for the PWM + // output pins +#define PWM_RV_INVERT 0x00000000 // Inversion control for + // PWM output pins +#define PWM_RV_FAULT 0x00000000 // Fault handling for the PWM + // output pins +#define PWM_RV_INTEN 0x00000000 // Interrupt enable +#define PWM_RV_RIS 0x00000000 // Raw interrupt status +#define PWM_RV_ISC 0x00000000 // Interrupt status and clearing +#define PWM_RV_STATUS 0x00000000 // Status +#define PWM_RV_X_CTL 0x00000000 // Master control of the PWM + // generator block +#define PWM_RV_X_INTEN 0x00000000 // Interrupt and trigger enable +#define PWM_RV_X_RIS 0x00000000 // Raw interrupt status +#define PWM_RV_X_ISC 0x00000000 // Interrupt status and clearing +#define PWM_RV_X_LOAD 0x00000000 // The load value for the counter +#define PWM_RV_X_COUNT 0x00000000 // The current counter value +#define PWM_RV_X_CMPA 0x00000000 // The comparator A value +#define PWM_RV_X_CMPB 0x00000000 // The comparator B value +#define PWM_RV_X_GENA 0x00000000 // Controls PWM generator A +#define PWM_RV_X_GENB 0x00000000 // Controls PWM generator B +#define PWM_RV_X_DBCTL 0x00000000 // Control the dead band generator +#define PWM_RV_X_DBRISE 0x00000000 // The dead band rising edge delay + // count +#define PWM_RV_X_DBFALL 0x00000000 // The dead band falling edge delay + // count + +#endif // __HW_PWM_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_qei.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_qei.h new file mode 100644 index 000000000..6d988ba95 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_qei.h @@ -0,0 +1,176 @@ +//***************************************************************************** +// +// hw_qei.h - Macros used when accessing the QEI hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_QEI_H__ +#define __HW_QEI_H__ + +//***************************************************************************** +// +// The following define the offsets of the QEI registers. +// +//***************************************************************************** +#define QEI_O_CTL 0x00000000 // Configuration and control reg. +#define QEI_O_STAT 0x00000004 // Status register +#define QEI_O_POS 0x00000008 // Current position register +#define QEI_O_MAXPOS 0x0000000C // Maximum position register +#define QEI_O_LOAD 0x00000010 // Velocity timer load register +#define QEI_O_TIME 0x00000014 // Velocity timer register +#define QEI_O_COUNT 0x00000018 // Velocity pulse count register +#define QEI_O_SPEED 0x0000001C // Velocity speed register +#define QEI_O_INTEN 0x00000020 // Interrupt enable register +#define QEI_O_RIS 0x00000024 // Raw interrupt status register +#define QEI_O_ISC 0x00000028 // Interrupt status register + +//***************************************************************************** +// +// The following define the bit fields in the QEI_CTL register. +// +//***************************************************************************** +#define QEI_CTL_STALLEN 0x00001000 // Stall enable +#define QEI_CTL_INVI 0x00000800 // Invert Index input +#define QEI_CTL_INVB 0x00000400 // Invert PhB input +#define QEI_CTL_INVA 0x00000200 // Invert PhA input +#define QEI_CTL_VELDIV_M 0x000001C0 // Velocity predivider mask +#define QEI_CTL_VELDIV_1 0x00000000 // Predivide by 1 +#define QEI_CTL_VELDIV_2 0x00000040 // Predivide by 2 +#define QEI_CTL_VELDIV_4 0x00000080 // Predivide by 4 +#define QEI_CTL_VELDIV_8 0x000000C0 // Predivide by 8 +#define QEI_CTL_VELDIV_16 0x00000100 // Predivide by 16 +#define QEI_CTL_VELDIV_32 0x00000140 // Predivide by 32 +#define QEI_CTL_VELDIV_64 0x00000180 // Predivide by 64 +#define QEI_CTL_VELDIV_128 0x000001C0 // Predivide by 128 +#define QEI_CTL_VELEN 0x00000020 // Velocity enable +#define QEI_CTL_RESMODE 0x00000010 // Position counter reset mode +#define QEI_CTL_CAPMODE 0x00000008 // Edge capture mode +#define QEI_CTL_SIGMODE 0x00000004 // Encoder signaling mode +#define QEI_CTL_SWAP 0x00000002 // Swap input signals +#define QEI_CTL_ENABLE 0x00000001 // QEI enable + +//***************************************************************************** +// +// The following define the bit fields in the QEI_STAT register. +// +//***************************************************************************** +#define QEI_STAT_DIRECTION 0x00000002 // Direction of rotation +#define QEI_STAT_ERROR 0x00000001 // Signalling error detected + +//***************************************************************************** +// +// The following define the bit fields in the QEI_POS register. +// +//***************************************************************************** +#define QEI_POS_M 0xFFFFFFFF // Current encoder position +#define QEI_POS_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_MAXPOS register. +// +//***************************************************************************** +#define QEI_MAXPOS_M 0xFFFFFFFF // Maximum encoder position +#define QEI_MAXPOS_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_LOAD register. +// +//***************************************************************************** +#define QEI_LOAD_M 0xFFFFFFFF // Velocity timer load value +#define QEI_LOAD_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_TIME register. +// +//***************************************************************************** +#define QEI_TIME_M 0xFFFFFFFF // Velocity timer current value +#define QEI_TIME_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_COUNT register. +// +//***************************************************************************** +#define QEI_COUNT_M 0xFFFFFFFF // Encoder running pulse count +#define QEI_COUNT_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_SPEED register. +// +//***************************************************************************** +#define QEI_SPEED_M 0xFFFFFFFF // Encoder pulse count +#define QEI_SPEED_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_INTEN register. +// +//***************************************************************************** +#define QEI_INTEN_ERROR 0x00000008 // Phase error detected +#define QEI_INTEN_DIR 0x00000004 // Direction change +#define QEI_INTEN_TIMER 0x00000002 // Velocity timer expired +#define QEI_INTEN_INDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// The following define the bit fields in the QEI_RIS register. +// +//***************************************************************************** +#define QEI_RIS_ERROR 0x00000008 // Phase error detected +#define QEI_RIS_DIR 0x00000004 // Direction change +#define QEI_RIS_TIMER 0x00000002 // Velocity timer expired +#define QEI_RIS_INDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// The following define the bit fields in the QEI_ISC register. +// +//***************************************************************************** +#define QEI_INT_ERROR 0x00000008 // Phase error detected +#define QEI_INT_DIR 0x00000004 // Direction change +#define QEI_INT_TIMER 0x00000002 // Velocity timer expired +#define QEI_INT_INDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// The following define the reset values for the QEI registers. +// +//***************************************************************************** +#define QEI_RV_CTL 0x00000000 // Configuration and control reg. +#define QEI_RV_STAT 0x00000000 // Status register +#define QEI_RV_POS 0x00000000 // Current position register +#define QEI_RV_MAXPOS 0x00000000 // Maximum position register +#define QEI_RV_LOAD 0x00000000 // Velocity timer load register +#define QEI_RV_TIME 0x00000000 // Velocity timer register +#define QEI_RV_COUNT 0x00000000 // Velocity pulse count register +#define QEI_RV_SPEED 0x00000000 // Velocity speed register +#define QEI_RV_INTEN 0x00000000 // Interrupt enable register +#define QEI_RV_RIS 0x00000000 // Raw interrupt status register +#define QEI_RV_ISC 0x00000000 // Interrupt status register + +#endif // __HW_QEI_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_ssi.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_ssi.h new file mode 100644 index 000000000..2af758095 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_ssi.h @@ -0,0 +1,120 @@ +//***************************************************************************** +// +// hw_ssi.h - Macros used when accessing the SSI hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_SSI_H__ +#define __HW_SSI_H__ + +//***************************************************************************** +// +// The following define the offsets of the SSI registers. +// +//***************************************************************************** +#define SSI_O_CR0 0x00000000 // Control register 0 +#define SSI_O_CR1 0x00000004 // Control register 1 +#define SSI_O_DR 0x00000008 // Data register +#define SSI_O_SR 0x0000000C // Status register +#define SSI_O_CPSR 0x00000010 // Clock prescale register +#define SSI_O_IM 0x00000014 // Int mask set and clear register +#define SSI_O_RIS 0x00000018 // Raw interrupt register +#define SSI_O_MIS 0x0000001C // Masked interrupt register +#define SSI_O_ICR 0x00000020 // Interrupt clear register + +//***************************************************************************** +// +// The following define the bit fields in the SSI Control register 0. +// +//***************************************************************************** +#define SSI_CR0_SCR 0x0000FF00 // Serial clock rate +#define SSI_CR0_SPH 0x00000080 // SSPCLKOUT phase +#define SSI_CR0_SPO 0x00000040 // SSPCLKOUT polarity +#define SSI_CR0_FRF_MASK 0x00000030 // Frame format mask +#define SSI_CR0_FRF_MOTO 0x00000000 // Motorola SPI frame format +#define SSI_CR0_FRF_TI 0x00000010 // TI sync serial frame format +#define SSI_CR0_FRF_NMW 0x00000020 // National Microwire frame format +#define SSI_CR0_DSS 0x0000000F // Data size select +#define SSI_CR0_DSS_4 0x00000003 // 4 bit data +#define SSI_CR0_DSS_5 0x00000004 // 5 bit data +#define SSI_CR0_DSS_6 0x00000005 // 6 bit data +#define SSI_CR0_DSS_7 0x00000006 // 7 bit data +#define SSI_CR0_DSS_8 0x00000007 // 8 bit data +#define SSI_CR0_DSS_9 0x00000008 // 9 bit data +#define SSI_CR0_DSS_10 0x00000009 // 10 bit data +#define SSI_CR0_DSS_11 0x0000000A // 11 bit data +#define SSI_CR0_DSS_12 0x0000000B // 12 bit data +#define SSI_CR0_DSS_13 0x0000000C // 13 bit data +#define SSI_CR0_DSS_14 0x0000000D // 14 bit data +#define SSI_CR0_DSS_15 0x0000000E // 15 bit data +#define SSI_CR0_DSS_16 0x0000000F // 16 bit data + +//***************************************************************************** +// +// The following define the bit fields in the SSI Control register 1. +// +//***************************************************************************** +#define SSI_CR1_SOD 0x00000008 // Slave mode output disable +#define SSI_CR1_MS 0x00000004 // Master or slave mode select +#define SSI_CR1_SSE 0x00000002 // Sync serial port enable +#define SSI_CR1_LBM 0x00000001 // Loopback mode + +//***************************************************************************** +// +// The following define the bit fields in the SSI Status register. +// +//***************************************************************************** +#define SSI_SR_BSY 0x00000010 // SSI busy +#define SSI_SR_RFF 0x00000008 // RX FIFO full +#define SSI_SR_RNE 0x00000004 // RX FIFO not empty +#define SSI_SR_TNF 0x00000002 // TX FIFO not full +#define SSI_SR_TFE 0x00000001 // TX FIFO empty + +//***************************************************************************** +// +// The following define the bit fields in the SSI clock prescale register. +// +//***************************************************************************** +#define SSI_CPSR_CPSDVSR_MASK 0x000000FF // Clock prescale + +//***************************************************************************** +// +// The following define information concerning the SSI Data register. +// +//***************************************************************************** +#define TX_FIFO_SIZE (8) // Number of entries in the TX FIFO +#define RX_FIFO_SIZE (8) // Number of entries in the RX FIFO + +//***************************************************************************** +// +// The following define the bit fields in the interrupt mask set and clear, +// raw interrupt, masked interrupt, and interrupt clear registers. +// +//***************************************************************************** +#define SSI_INT_TXFF 0x00000008 // TX FIFO interrupt +#define SSI_INT_RXFF 0x00000004 // RX FIFO interrupt +#define SSI_INT_RXTO 0x00000002 // RX timeout interrupt +#define SSI_INT_RXOR 0x00000001 // RX overrun interrupt + +#endif // __HW_SSI_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_sysctl.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_sysctl.h new file mode 100644 index 000000000..6a2d6312b --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_sysctl.h @@ -0,0 +1,659 @@ +//***************************************************************************** +// +// hw_sysctl.h - Macros used when accessing the system control hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_SYSCTL_H__ +#define __HW_SYSCTL_H__ + +//***************************************************************************** +// +// The following define the addresses of the system control registers. +// +//***************************************************************************** +#define SYSCTL_DID0 0x400fe000 // Device identification register 0 +#define SYSCTL_DID1 0x400fe004 // Device identification register 1 +#define SYSCTL_DC0 0x400fe008 // Device capabilities register 0 +#define SYSCTL_DC1 0x400fe010 // Device capabilities register 1 +#define SYSCTL_DC2 0x400fe014 // Device capabilities register 2 +#define SYSCTL_DC3 0x400fe018 // Device capabilities register 3 +#define SYSCTL_DC4 0x400fe01C // Device capabilities register 4 +#define SYSCTL_PBORCTL 0x400fe030 // POR/BOR reset control register +#define SYSCTL_LDOPCTL 0x400fe034 // LDO power control register +#define SYSCTL_SRCR0 0x400fe040 // Software reset control reg 0 +#define SYSCTL_SRCR1 0x400fe044 // Software reset control reg 1 +#define SYSCTL_SRCR2 0x400fe048 // Software reset control reg 2 +#define SYSCTL_RIS 0x400fe050 // Raw interrupt status register +#define SYSCTL_IMC 0x400fe054 // Interrupt mask/control register +#define SYSCTL_MISC 0x400fe058 // Interrupt status register +#define SYSCTL_RESC 0x400fe05c // Reset cause register +#define SYSCTL_RCC 0x400fe060 // Run-mode clock config register +#define SYSCTL_PLLCFG 0x400fe064 // PLL configuration register +#define SYSCTL_RCC2 0x400fe070 // Run-mode clock config register 2 +#define SYSCTL_RCGC0 0x400fe100 // Run-mode clock gating register 0 +#define SYSCTL_RCGC1 0x400fe104 // Run-mode clock gating register 1 +#define SYSCTL_RCGC2 0x400fe108 // Run-mode clock gating register 2 +#define SYSCTL_SCGC0 0x400fe110 // Sleep-mode clock gating reg 0 +#define SYSCTL_SCGC1 0x400fe114 // Sleep-mode clock gating reg 1 +#define SYSCTL_SCGC2 0x400fe118 // Sleep-mode clock gating reg 2 +#define SYSCTL_DCGC0 0x400fe120 // Deep Sleep-mode clock gate reg 0 +#define SYSCTL_DCGC1 0x400fe124 // Deep Sleep-mode clock gate reg 1 +#define SYSCTL_DCGC2 0x400fe128 // Deep Sleep-mode clock gate reg 2 +#define SYSCTL_DSLPCLKCFG 0x400fe144 // Deep Sleep-mode clock config reg +#define SYSCTL_CLKVCLR 0x400fe150 // Clock verifcation clear register +#define SYSCTL_LDOARST 0x400fe160 // LDO reset control register +#define SYSCTL_USER0 0x400fe1e0 // NV User Register 0 +#define SYSCTL_USER1 0x400fe1e4 // NV User Register 1 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DID0 register. +// +//***************************************************************************** +#define SYSCTL_DID0_VER_MASK 0x70000000 // DID0 version mask +#define SYSCTL_DID0_VER_0 0x00000000 // DID0 version 0 +#define SYSCTL_DID0_VER_1 0x10000000 // DID0 version 1 +#define SYSCTL_DID0_CLASS_MASK 0x00FF0000 // Device Class +#define SYSCTL_DID0_CLASS_SANDSTORM 0x00000000 // LM3Snnn Sandstorm Device +#define SYSCTL_DID0_CLASS_FURY 0x00010000 // LM3Snnnn Fury Device +#define SYSCTL_DID0_MAJ_MASK 0x0000FF00 // Major revision mask +#define SYSCTL_DID0_MAJ_A 0x00000000 // Major revision A +#define SYSCTL_DID0_MAJ_B 0x00000100 // Major revision B +#define SYSCTL_DID0_MAJ_C 0x00000200 // Major revision C +#define SYSCTL_DID0_MIN_MASK 0x000000FF // Minor revision mask +#define SYSCTL_DID0_MIN_0 0x00000000 // Minor revision 0 +#define SYSCTL_DID0_MIN_1 0x00000001 // Minor revision 1 +#define SYSCTL_DID0_MIN_2 0x00000002 // Minor revision 2 +#define SYSCTL_DID0_MIN_3 0x00000003 // Minor revision 3 +#define SYSCTL_DID0_MIN_4 0x00000004 // Minor revision 4 +#define SYSCTL_DID0_MIN_5 0x00000005 // Minor revision 5 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DID1 register. +// +//***************************************************************************** +#define SYSCTL_DID1_VER_MASK 0xF0000000 // Register version mask +#define SYSCTL_DID1_FAM_MASK 0x0F000000 // Family mask +#define SYSCTL_DID1_FAM_S 0x00000000 // Stellaris family +#define SYSCTL_DID1_PRTNO_MASK 0x00FF0000 // Part number mask +#define SYSCTL_DID1_PRTNO_101 0x00010000 // LM3S101 +#define SYSCTL_DID1_PRTNO_102 0x00020000 // LM3S102 +#define SYSCTL_DID1_PRTNO_301 0x00110000 // LM3S301 +#define SYSCTL_DID1_PRTNO_310 0x00120000 // LM3S310 +#define SYSCTL_DID1_PRTNO_315 0x00130000 // LM3S315 +#define SYSCTL_DID1_PRTNO_316 0x00140000 // LM3S316 +#define SYSCTL_DID1_PRTNO_317 0x00170000 // LM3S317 +#define SYSCTL_DID1_PRTNO_328 0x00150000 // LM3S328 +#define SYSCTL_DID1_PRTNO_601 0x00210000 // LM3S601 +#define SYSCTL_DID1_PRTNO_610 0x00220000 // LM3S610 +#define SYSCTL_DID1_PRTNO_611 0x00230000 // LM3S611 +#define SYSCTL_DID1_PRTNO_612 0x00240000 // LM3S612 +#define SYSCTL_DID1_PRTNO_613 0x00250000 // LM3S613 +#define SYSCTL_DID1_PRTNO_615 0x00260000 // LM3S615 +#define SYSCTL_DID1_PRTNO_617 0x00280000 // LM3S617 +#define SYSCTL_DID1_PRTNO_618 0x00290000 // LM3S618 +#define SYSCTL_DID1_PRTNO_628 0x00270000 // LM3S628 +#define SYSCTL_DID1_PRTNO_801 0x00310000 // LM3S801 +#define SYSCTL_DID1_PRTNO_811 0x00320000 // LM3S811 +#define SYSCTL_DID1_PRTNO_812 0x00330000 // LM3S812 +#define SYSCTL_DID1_PRTNO_815 0x00340000 // LM3S815 +#define SYSCTL_DID1_PRTNO_817 0x00360000 // LM3S817 +#define SYSCTL_DID1_PRTNO_818 0x00370000 // LM3S818 +#define SYSCTL_DID1_PRTNO_828 0x00350000 // LM3S828 +#define SYSCTL_DID1_PRTNO_2110 0x00510000 // LM3S2110 +#define SYSCTL_DID1_PRTNO_2139 0x00840000 // LM3S2139 +#define SYSCTL_DID1_PRTNO_2410 0x00A20000 // LM3S2410 +#define SYSCTL_DID1_PRTNO_2412 0x00590000 // LM3S2412 +#define SYSCTL_DID1_PRTNO_2432 0x00560000 // LM3S2432 +#define SYSCTL_DID1_PRTNO_2533 0x005A0000 // LM3S2533 +#define SYSCTL_DID1_PRTNO_2620 0x00570000 // LM3S2620 +#define SYSCTL_DID1_PRTNO_2637 0x00850000 // LM3S2637 +#define SYSCTL_DID1_PRTNO_2651 0x00530000 // LM3S2651 +#define SYSCTL_DID1_PRTNO_2730 0x00A40000 // LM3S2730 +#define SYSCTL_DID1_PRTNO_2739 0x00520000 // LM3S2739 +#define SYSCTL_DID1_PRTNO_2939 0x00540000 // LM3S2939 +#define SYSCTL_DID1_PRTNO_2948 0x008F0000 // LM3S2948 +#define SYSCTL_DID1_PRTNO_2950 0x00580000 // LM3S2950 +#define SYSCTL_DID1_PRTNO_2965 0x00550000 // LM3S2965 +#define SYSCTL_DID1_PRTNO_6100 0x00A10000 // LM3S6100 +#define SYSCTL_DID1_PRTNO_6110 0x00740000 // LM3S6110 +#define SYSCTL_DID1_PRTNO_6420 0x00A50000 // LM3S6420 +#define SYSCTL_DID1_PRTNO_6422 0x00820000 // LM3S6422 +#define SYSCTL_DID1_PRTNO_6432 0x00750000 // LM3S6432 +#define SYSCTL_DID1_PRTNO_6610 0x00710000 // LM3S6610 +#define SYSCTL_DID1_PRTNO_6633 0x00830000 // LM3S6633 +#define SYSCTL_DID1_PRTNO_6637 0x008B0000 // LM3S6637 +#define SYSCTL_DID1_PRTNO_6730 0x00A30000 // LM3S6730 +#define SYSCTL_DID1_PRTNO_6938 0x00890000 // LM3S6938 +#define SYSCTL_DID1_PRTNO_6952 0x00780000 // LM3S6952 +#define SYSCTL_DID1_PRTNO_6965 0x00730000 // LM3S6965 +#define SYSCTL_DID1_PINCNT_MASK 0x0000E000 // Pin count +#define SYSCTL_DID1_PINCNT_100 0x00004000 // 100 pin package +#define SYSCTL_DID1_TEMP_MASK 0x000000E0 // Temperature range mask +#define SYSCTL_DID1_TEMP_C 0x00000000 // Commercial temp range (0..70C) +#define SYSCTL_DID1_TEMP_I 0x00000020 // Industrial temp range (-40..85C) +#define SYSCTL_DID1_PKG_MASK 0x00000018 // Package mask +#define SYSCTL_DID1_PKG_28SOIC 0x00000000 // 28-pin SOIC +#define SYSCTL_DID1_PKG_48QFP 0x00000008 // 48-pin QFP +#define SYSCTL_DID1_ROHS 0x00000004 // Part is RoHS compliant +#define SYSCTL_DID1_QUAL_MASK 0x00000003 // Qualification status mask +#define SYSCTL_DID1_QUAL_ES 0x00000000 // Engineering sample (unqualified) +#define SYSCTL_DID1_QUAL_PP 0x00000001 // Pilot production (unqualified) +#define SYSCTL_DID1_QUAL_FQ 0x00000002 // Fully qualified +#define SYSCTL_DID1_PRTNO_SHIFT 16 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC0 register. +// +//***************************************************************************** +#define SYSCTL_DC0_SRAMSZ_MASK 0xFFFF0000 // SRAM size mask +#define SYSCTL_DC0_SRAMSZ_2KB 0x00070000 // 2 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_4KB 0x000F0000 // 4 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_8KB 0x001F0000 // 8 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_16KB 0x003F0000 // 16 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_32KB 0x007F0000 // 32 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_64KB 0x00FF0000 // 64 KB of SRAM +#define SYSCTL_DC0_FLASHSZ_MASK 0x0000FFFF // Flash size mask +#define SYSCTL_DC0_FLASHSZ_8KB 0x00000003 // 8 KB of flash +#define SYSCTL_DC0_FLASHSZ_16KB 0x00000007 // 16 KB of flash +#define SYSCTL_DC0_FLASHSZ_32KB 0x0000000F // 32 KB of flash +#define SYSCTL_DC0_FLASHSZ_64KB 0x0000001F // 64 KB of flash +#define SYSCTL_DC0_FLASHSZ_96KB 0x0000002F // 96 KB of flash +#define SYSCTL_DC0_FLASHSZ_128K 0x0000003F // 128 KB of flash +#define SYSCTL_DC0_FLASHSZ_256K 0x0000007F // 256 KB of flash + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC1 register. +// +//***************************************************************************** +#define SYSCTL_DC1_CAN1 0x02000000 // CAN1 module present +#define SYSCTL_DC1_CAN0 0x01000000 // CAN0 module present +#define SYSCTL_DC1_PWM 0x00100000 // PWM module present +#define SYSCTL_DC1_ADC 0x00010000 // ADC module present +#define SYSCTL_DC1_SYSDIV_MASK 0x0000F000 // Minimum system divider mask +#define SYSCTL_DC1_ADCSPD_MASK 0x00000F00 // ADC speed mask +#define SYSCTL_DC1_ADCSPD_1M 0x00000300 // 1Msps ADC +#define SYSCTL_DC1_ADCSPD_500K 0x00000200 // 500Ksps ADC +#define SYSCTL_DC1_ADCSPD_250K 0x00000100 // 250Ksps ADC +#define SYSCTL_DC1_ADCSPD_125K 0x00000000 // 125Ksps ADC +#define SYSCTL_DC1_MPU 0x00000080 // Cortex M3 MPU present +#define SYSCTL_DC1_HIB 0x00000040 // Hibernation module present +#define SYSCTL_DC1_TEMP 0x00000020 // Temperature sensor present +#define SYSCTL_DC1_PLL 0x00000010 // PLL present +#define SYSCTL_DC1_WDOG 0x00000008 // Watchdog present +#define SYSCTL_DC1_SWO 0x00000004 // Serial wire output present +#define SYSCTL_DC1_SWD 0x00000002 // Serial wire debug present +#define SYSCTL_DC1_JTAG 0x00000001 // JTAG debug present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC2 register. +// +//***************************************************************************** +#define SYSCTL_DC2_COMP2 0x04000000 // Analog comparator 2 present +#define SYSCTL_DC2_COMP1 0x02000000 // Analog comparator 1 present +#define SYSCTL_DC2_COMP0 0x01000000 // Analog comparator 0 present +#define SYSCTL_DC2_TIMER3 0x00080000 // Timer 3 present +#define SYSCTL_DC2_TIMER2 0x00040000 // Timer 2 present +#define SYSCTL_DC2_TIMER1 0x00020000 // Timer 1 present +#define SYSCTL_DC2_TIMER0 0x00010000 // Timer 0 present +#define SYSCTL_DC2_I2C1 0x00002000 // I2C 1 present +#define SYSCTL_DC2_I2C0 0x00001000 // I2C 0 present +#ifndef DEPRECATED +#define SYSCTL_DC2_I2C 0x00001000 // I2C present +#endif +#define SYSCTL_DC2_QEI1 0x00000200 // QEI 1 present +#define SYSCTL_DC2_QEI0 0x00000100 // QEI 0 present +#ifndef DEPRECATED +#define SYSCTL_DC2_QEI 0x00000100 // QEI present +#endif +#define SYSCTL_DC2_SSI1 0x00000020 // SSI 1 present +#define SYSCTL_DC2_SSI0 0x00000010 // SSI 0 present +#ifndef DEPRECATED +#define SYSCTL_DC2_SSI 0x00000010 // SSI present +#endif +#define SYSCTL_DC2_UART2 0x00000004 // UART 2 present +#define SYSCTL_DC2_UART1 0x00000002 // UART 1 present +#define SYSCTL_DC2_UART0 0x00000001 // UART 0 present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC3 register. +// +//***************************************************************************** +#define SYSCTL_DC3_32KHZ 0x80000000 // 32kHz pin present +#define SYSCTL_DC3_CCP5 0x20000000 // CCP5 pin present +#define SYSCTL_DC3_CCP4 0x10000000 // CCP4 pin present +#define SYSCTL_DC3_CCP3 0x08000000 // CCP3 pin present +#define SYSCTL_DC3_CCP2 0x04000000 // CCP2 pin present +#define SYSCTL_DC3_CCP1 0x02000000 // CCP1 pin present +#define SYSCTL_DC3_CCP0 0x01000000 // CCP0 pin present +#define SYSCTL_DC3_ADC7 0x00800000 // ADC7 pin present +#define SYSCTL_DC3_ADC6 0x00400000 // ADC6 pin present +#define SYSCTL_DC3_ADC5 0x00200000 // ADC5 pin present +#define SYSCTL_DC3_ADC4 0x00100000 // ADC4 pin present +#define SYSCTL_DC3_ADC3 0x00080000 // ADC3 pin present +#define SYSCTL_DC3_ADC2 0x00040000 // ADC2 pin present +#define SYSCTL_DC3_ADC1 0x00020000 // ADC1 pin present +#define SYSCTL_DC3_ADC0 0x00010000 // ADC0 pin present +#define SYSCTL_DC3_MC_FAULT0 0x00008000 // MC0 fault pin present +#define SYSCTL_DC3_C2O 0x00004000 // C2o pin present +#define SYSCTL_DC3_C2PLUS 0x00002000 // C2+ pin present +#define SYSCTL_DC3_C2MINUS 0x00001000 // C2- pin present +#define SYSCTL_DC3_C1O 0x00000800 // C1o pin present +#define SYSCTL_DC3_C1PLUS 0x00000400 // C1+ pin present +#define SYSCTL_DC3_C1MINUS 0x00000200 // C1- pin present +#define SYSCTL_DC3_C0O 0x00000100 // C0o pin present +#define SYSCTL_DC3_C0PLUS 0x00000080 // C0+ pin present +#define SYSCTL_DC3_C0MINUS 0x00000040 // C0- pin present +#define SYSCTL_DC3_PWM5 0x00000020 // PWM5 pin present +#define SYSCTL_DC3_PWM4 0x00000010 // PWM4 pin present +#define SYSCTL_DC3_PWM3 0x00000008 // PWM3 pin present +#define SYSCTL_DC3_PWM2 0x00000004 // PWM2 pin present +#define SYSCTL_DC3_PWM1 0x00000002 // PWM1 pin present +#define SYSCTL_DC3_PWM0 0x00000001 // PWM0 pin present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC4 register. +// +//***************************************************************************** +#define SYSCTL_DC4_ETH 0x50000000 // Ethernet present +#define SYSCTL_DC4_GPIOH 0x00000080 // GPIO port H present +#define SYSCTL_DC4_GPIOG 0x00000040 // GPIO port G present +#define SYSCTL_DC4_GPIOF 0x00000020 // GPIO port F present +#define SYSCTL_DC4_GPIOE 0x00000010 // GPIO port E present +#define SYSCTL_DC4_GPIOD 0x00000008 // GPIO port D present +#define SYSCTL_DC4_GPIOC 0x00000004 // GPIO port C present +#define SYSCTL_DC4_GPIOB 0x00000002 // GPIO port B present +#define SYSCTL_DC4_GPIOA 0x00000001 // GPIO port A present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_PBORCTL register. +// +//***************************************************************************** +#define SYSCTL_PBORCTL_BOR_MASK 0x0000FFFC // BOR wait timer +#define SYSCTL_PBORCTL_BORIOR 0x00000002 // BOR interrupt or reset +#define SYSCTL_PBORCTL_BORWT 0x00000001 // BOR wait and check for noise +#define SYSCTL_PBORCTL_BOR_SH 2 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_LDOPCTL register. +// +//***************************************************************************** +#define SYSCTL_LDOPCTL_MASK 0x0000003F // Voltage adjust mask +#define SYSCTL_LDOPCTL_2_25V 0x00000005 // LDO output of 2.25V +#define SYSCTL_LDOPCTL_2_30V 0x00000004 // LDO output of 2.30V +#define SYSCTL_LDOPCTL_2_35V 0x00000003 // LDO output of 2.35V +#define SYSCTL_LDOPCTL_2_40V 0x00000002 // LDO output of 2.40V +#define SYSCTL_LDOPCTL_2_45V 0x00000001 // LDO output of 2.45V +#define SYSCTL_LDOPCTL_2_50V 0x00000000 // LDO output of 2.50V +#define SYSCTL_LDOPCTL_2_55V 0x0000001F // LDO output of 2.55V +#define SYSCTL_LDOPCTL_2_60V 0x0000001E // LDO output of 2.60V +#define SYSCTL_LDOPCTL_2_65V 0x0000001D // LDO output of 2.65V +#define SYSCTL_LDOPCTL_2_70V 0x0000001C // LDO output of 2.70V +#define SYSCTL_LDOPCTL_2_75V 0x0000001B // LDO output of 2.75V + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR0, SYSCTL_RCGC0, +// SYSCTL_SCGC0, and SYSCTL_DCGC0 registers. +// +//***************************************************************************** +#define SYSCTL_SET0_CAN1 0x02000000 // CAN 1 module +#define SYSCTL_SET0_CAN0 0x01000000 // CAN 0 module +#define SYSCTL_SET0_PWM 0x00100000 // PWM module +#define SYSCTL_SET0_ADC 0x00010000 // ADC module +#define SYSCTL_SET0_ADCSPD_MASK 0x00000F00 // ADC speed mask +#define SYSCTL_SET0_ADCSPD_1M 0x00000300 // 1Msps ADC +#define SYSCTL_SET0_ADCSPD_500K 0x00000200 // 500Ksps ADC +#define SYSCTL_SET0_ADCSPD_250K 0x00000100 // 250Ksps ADC +#define SYSCTL_SET0_ADCSPD_125K 0x00000000 // 125Ksps ADC +#define SYSCTL_SET0_HIB 0x00000040 // Hibernation module +#define SYSCTL_SET0_WDOG 0x00000008 // Watchdog module + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR1, SYSCTL_RCGC1, +// SYSCTL_SCGC1, and SYSCTL_DCGC1 registers. +// +//***************************************************************************** +#define SYSCTL_SET1_COMP2 0x04000000 // Analog comparator module 2 +#define SYSCTL_SET1_COMP1 0x02000000 // Analog comparator module 1 +#define SYSCTL_SET1_COMP0 0x01000000 // Analog comparator module 0 +#define SYSCTL_SET1_TIMER3 0x00080000 // Timer module 3 +#define SYSCTL_SET1_TIMER2 0x00040000 // Timer module 2 +#define SYSCTL_SET1_TIMER1 0x00020000 // Timer module 1 +#define SYSCTL_SET1_TIMER0 0x00010000 // Timer module 0 +#define SYSCTL_SET1_I2C1 0x00002000 // I2C module 1 +#define SYSCTL_SET1_I2C0 0x00001000 // I2C module 0 +#ifndef DEPRECATED +#define SYSCTL_SET1_I2C 0x00001000 // I2C module +#endif +#define SYSCTL_SET1_QEI1 0x00000200 // QEI module 1 +#define SYSCTL_SET1_QEI0 0x00000100 // QEI module 0 +#ifndef DEPRECATED +#define SYSCTL_SET1_QEI 0x00000100 // QEI module +#endif +#define SYSCTL_SET1_SSI1 0x00000020 // SSI module 1 +#define SYSCTL_SET1_SSI0 0x00000010 // SSI module 0 +#ifndef DEPRECATED +#define SYSCTL_SET1_SSI 0x00000010 // SSI module +#endif +#define SYSCTL_SET1_UART2 0x00000004 // UART module 2 +#define SYSCTL_SET1_UART1 0x00000002 // UART module 1 +#define SYSCTL_SET1_UART0 0x00000001 // UART module 0 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR2, SYSCTL_RCGC2, +// SYSCTL_SCGC2, and SYSCTL_DCGC2 registers. +// +//***************************************************************************** +#define SYSCTL_SET2_ETH 0x50000000 // ETH module +#define SYSCTL_SET2_GPIOH 0x00000080 // GPIO H module +#define SYSCTL_SET2_GPIOG 0x00000040 // GPIO G module +#define SYSCTL_SET2_GPIOF 0x00000020 // GPIO F module +#define SYSCTL_SET2_GPIOE 0x00000010 // GPIO E module +#define SYSCTL_SET2_GPIOD 0x00000008 // GPIO D module +#define SYSCTL_SET2_GPIOC 0x00000004 // GPIO C module +#define SYSCTL_SET2_GPIOB 0x00000002 // GPIO B module +#define SYSCTL_SET2_GPIOA 0x00000001 // GIPO A module + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RIS, SYSCTL_IMC, and +// SYSCTL_IMS registers. +// +//***************************************************************************** +#define SYSCTL_INT_PLL_LOCK 0x00000040 // PLL lock interrupt +#define SYSCTL_INT_CUR_LIMIT 0x00000020 // Current limit interrupt +#define SYSCTL_INT_IOSC_FAIL 0x00000010 // Internal oscillator failure int +#define SYSCTL_INT_MOSC_FAIL 0x00000008 // Main oscillator failure int +#define SYSCTL_INT_POR 0x00000004 // Power on reset interrupt +#define SYSCTL_INT_BOR 0x00000002 // Brown out interrupt +#define SYSCTL_INT_PLL_FAIL 0x00000001 // PLL failure interrupt + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RESC register. +// +//***************************************************************************** +#define SYSCTL_RESC_LDO 0x00000020 // LDO power OK lost reset +#define SYSCTL_RESC_SW 0x00000010 // Software reset +#define SYSCTL_RESC_WDOG 0x00000008 // Watchdog reset +#define SYSCTL_RESC_BOR 0x00000004 // Brown-out reset +#define SYSCTL_RESC_POR 0x00000002 // Power on reset +#define SYSCTL_RESC_EXT 0x00000001 // External reset + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RCC register. +// +//***************************************************************************** +#define SYSCTL_RCC_ACG 0x08000000 // Automatic clock gating +#define SYSCTL_RCC_SYSDIV_MASK 0x07800000 // System clock divider +#define SYSCTL_RCC_SYSDIV_2 0x00800000 // System clock /2 +#define SYSCTL_RCC_SYSDIV_3 0x01000000 // System clock /3 +#define SYSCTL_RCC_SYSDIV_4 0x01800000 // System clock /4 +#define SYSCTL_RCC_SYSDIV_5 0x02000000 // System clock /5 +#define SYSCTL_RCC_SYSDIV_6 0x02800000 // System clock /6 +#define SYSCTL_RCC_SYSDIV_7 0x03000000 // System clock /7 +#define SYSCTL_RCC_SYSDIV_8 0x03800000 // System clock /8 +#define SYSCTL_RCC_SYSDIV_9 0x04000000 // System clock /9 +#define SYSCTL_RCC_SYSDIV_10 0x04800000 // System clock /10 +#define SYSCTL_RCC_SYSDIV_11 0x05000000 // System clock /11 +#define SYSCTL_RCC_SYSDIV_12 0x05800000 // System clock /12 +#define SYSCTL_RCC_SYSDIV_13 0x06000000 // System clock /13 +#define SYSCTL_RCC_SYSDIV_14 0x06800000 // System clock /14 +#define SYSCTL_RCC_SYSDIV_15 0x07000000 // System clock /15 +#define SYSCTL_RCC_SYSDIV_16 0x07800000 // System clock /16 +#define SYSCTL_RCC_USE_SYSDIV 0x00400000 // Use sytem clock divider +#define SYSCTL_RCC_USE_PWMDIV 0x00100000 // Use PWM clock divider +#define SYSCTL_RCC_PWMDIV_MASK 0x000E0000 // PWM clock divider +#define SYSCTL_RCC_PWMDIV_2 0x00000000 // PWM clock /2 +#define SYSCTL_RCC_PWMDIV_4 0x00020000 // PWM clock /4 +#define SYSCTL_RCC_PWMDIV_8 0x00040000 // PWM clock /8 +#define SYSCTL_RCC_PWMDIV_16 0x00060000 // PWM clock /16 +#define SYSCTL_RCC_PWMDIV_32 0x00080000 // PWM clock /32 +#define SYSCTL_RCC_PWMDIV_64 0x000A0000 // PWM clock /64 +#define SYSCTL_RCC_PWRDN 0x00002000 // PLL power down +#define SYSCTL_RCC_OE 0x00001000 // PLL output enable +#define SYSCTL_RCC_BYPASS 0x00000800 // PLL bypass +#define SYSCTL_RCC_PLLVER 0x00000400 // PLL verification timer enable +#define SYSCTL_RCC_XTAL_MASK 0x000003C0 // Crystal attached to main osc +#define SYSCTL_RCC_XTAL_3_57MHZ 0x00000100 // Using a 3.579545MHz crystal +#define SYSCTL_RCC_XTAL_3_68MHz 0x00000140 // Using a 3.6864MHz crystal +#define SYSCTL_RCC_XTAL_4MHz 0x00000180 // Using a 4MHz crystal +#define SYSCTL_RCC_XTAL_4_09MHZ 0x000001C0 // Using a 4.096MHz crystal +#define SYSCTL_RCC_XTAL_4_91MHZ 0x00000200 // Using a 4.9152MHz crystal +#define SYSCTL_RCC_XTAL_5MHZ 0x00000240 // Using a 5MHz crystal +#define SYSCTL_RCC_XTAL_5_12MHZ 0x00000280 // Using a 5.12MHz crystal +#define SYSCTL_RCC_XTAL_6MHZ 0x000002C0 // Using a 6MHz crystal +#define SYSCTL_RCC_XTAL_6_14MHZ 0x00000300 // Using a 6.144MHz crystal +#define SYSCTL_RCC_XTAL_7_37MHZ 0x00000340 // Using a 7.3728MHz crystal +#define SYSCTL_RCC_XTAL_8MHZ 0x00000380 // Using a 8MHz crystal +#define SYSCTL_RCC_XTAL_8_19MHZ 0x000003C0 // Using a 8.192MHz crystal +#define SYSCTL_RCC_OSCSRC_MASK 0x00000030 // Oscillator input select +#define SYSCTL_RCC_OSCSRC_MAIN 0x00000000 // Use the main oscillator +#define SYSCTL_RCC_OSCSRC_INT 0x00000010 // Use the internal oscillator +#define SYSCTL_RCC_OSCSRC_INT4 0x00000020 // Use the internal oscillator / 4 +#define SYSCTL_RCC_IOSCVER 0x00000008 // Int. osc. verification timer en +#define SYSCTL_RCC_MOSCVER 0x00000004 // Main osc. verification timer en +#define SYSCTL_RCC_IOSCDIS 0x00000002 // Internal oscillator disable +#define SYSCTL_RCC_MOSCDIS 0x00000001 // Main oscillator disable +#define SYSCTL_RCC_SYSDIV_SHIFT 23 // Shift to the SYSDIV field +#define SYSCTL_RCC_PWMDIV_SHIFT 17 // Shift to the PWMDIV field +#define SYSCTL_RCC_XTAL_SHIFT 6 // Shift to the XTAL field +#define SYSCTL_RCC_OSCSRC_SHIFT 4 // Shift to the OSCSRC field + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_PLLCFG register. +// +//***************************************************************************** +#define SYSCTL_PLLCFG_OD_MASK 0x0000C000 // Output divider +#define SYSCTL_PLLCFG_OD_1 0x00000000 // Output divider is 1 +#define SYSCTL_PLLCFG_OD_2 0x00004000 // Output divider is 2 +#define SYSCTL_PLLCFG_OD_4 0x00008000 // Output divider is 4 +#define SYSCTL_PLLCFG_F_MASK 0x00003FE0 // PLL multiplier +#define SYSCTL_PLLCFG_R_MASK 0x0000001F // Input predivider +#define SYSCTL_PLLCFG_F_SHIFT 5 +#define SYSCTL_PLLCFG_R_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RCC2 register. +// +//***************************************************************************** +#define SYSCTL_RCC2_USERCC2 0x80000000 // Use RCC2 +#define SYSCTL_RCC2_SYSDIV2_MSK 0x1F800000 // System clock divider +#define SYSCTL_RCC2_SYSDIV2_2 0x00800000 // System clock /2 +#define SYSCTL_RCC2_SYSDIV2_3 0x01000000 // System clock /3 +#define SYSCTL_RCC2_SYSDIV2_4 0x01800000 // System clock /4 +#define SYSCTL_RCC2_SYSDIV2_5 0x02000000 // System clock /5 +#define SYSCTL_RCC2_SYSDIV2_6 0x02800000 // System clock /6 +#define SYSCTL_RCC2_SYSDIV2_7 0x03000000 // System clock /7 +#define SYSCTL_RCC2_SYSDIV2_8 0x03800000 // System clock /8 +#define SYSCTL_RCC2_SYSDIV2_9 0x04000000 // System clock /9 +#define SYSCTL_RCC2_SYSDIV2_10 0x04800000 // System clock /10 +#define SYSCTL_RCC2_SYSDIV2_11 0x05000000 // System clock /11 +#define SYSCTL_RCC2_SYSDIV2_12 0x05800000 // System clock /12 +#define SYSCTL_RCC2_SYSDIV2_13 0x06000000 // System clock /13 +#define SYSCTL_RCC2_SYSDIV2_14 0x06800000 // System clock /14 +#define SYSCTL_RCC2_SYSDIV2_15 0x07000000 // System clock /15 +#define SYSCTL_RCC2_SYSDIV2_16 0x07800000 // System clock /16 +#define SYSCTL_RCC2_SYSDIV2_17 0x08000000 // System clock /17 +#define SYSCTL_RCC2_SYSDIV2_18 0x08800000 // System clock /18 +#define SYSCTL_RCC2_SYSDIV2_19 0x09000000 // System clock /19 +#define SYSCTL_RCC2_SYSDIV2_20 0x09800000 // System clock /20 +#define SYSCTL_RCC2_SYSDIV2_21 0x0A000000 // System clock /21 +#define SYSCTL_RCC2_SYSDIV2_22 0x0A800000 // System clock /22 +#define SYSCTL_RCC2_SYSDIV2_23 0x0B000000 // System clock /23 +#define SYSCTL_RCC2_SYSDIV2_24 0x0B800000 // System clock /24 +#define SYSCTL_RCC2_SYSDIV2_25 0x0C000000 // System clock /25 +#define SYSCTL_RCC2_SYSDIV2_26 0x0C800000 // System clock /26 +#define SYSCTL_RCC2_SYSDIV2_27 0x0D000000 // System clock /27 +#define SYSCTL_RCC2_SYSDIV2_28 0x0D800000 // System clock /28 +#define SYSCTL_RCC2_SYSDIV2_29 0x0E000000 // System clock /29 +#define SYSCTL_RCC2_SYSDIV2_30 0x0E800000 // System clock /30 +#define SYSCTL_RCC2_SYSDIV2_31 0x0F000000 // System clock /31 +#define SYSCTL_RCC2_SYSDIV2_32 0x0F800000 // System clock /32 +#define SYSCTL_RCC2_SYSDIV2_33 0x10000000 // System clock /33 +#define SYSCTL_RCC2_SYSDIV2_34 0x10800000 // System clock /34 +#define SYSCTL_RCC2_SYSDIV2_35 0x11000000 // System clock /35 +#define SYSCTL_RCC2_SYSDIV2_36 0x11800000 // System clock /36 +#define SYSCTL_RCC2_SYSDIV2_37 0x12000000 // System clock /37 +#define SYSCTL_RCC2_SYSDIV2_38 0x12800000 // System clock /38 +#define SYSCTL_RCC2_SYSDIV2_39 0x13000000 // System clock /39 +#define SYSCTL_RCC2_SYSDIV2_40 0x13800000 // System clock /40 +#define SYSCTL_RCC2_SYSDIV2_41 0x14000000 // System clock /41 +#define SYSCTL_RCC2_SYSDIV2_42 0x14800000 // System clock /42 +#define SYSCTL_RCC2_SYSDIV2_43 0x15000000 // System clock /43 +#define SYSCTL_RCC2_SYSDIV2_44 0x15800000 // System clock /44 +#define SYSCTL_RCC2_SYSDIV2_45 0x16000000 // System clock /45 +#define SYSCTL_RCC2_SYSDIV2_46 0x16800000 // System clock /46 +#define SYSCTL_RCC2_SYSDIV2_47 0x17000000 // System clock /47 +#define SYSCTL_RCC2_SYSDIV2_48 0x17800000 // System clock /48 +#define SYSCTL_RCC2_SYSDIV2_49 0x18000000 // System clock /49 +#define SYSCTL_RCC2_SYSDIV2_50 0x18800000 // System clock /50 +#define SYSCTL_RCC2_SYSDIV2_51 0x19000000 // System clock /51 +#define SYSCTL_RCC2_SYSDIV2_52 0x19800000 // System clock /52 +#define SYSCTL_RCC2_SYSDIV2_53 0x1A000000 // System clock /53 +#define SYSCTL_RCC2_SYSDIV2_54 0x1A800000 // System clock /54 +#define SYSCTL_RCC2_SYSDIV2_55 0x1B000000 // System clock /55 +#define SYSCTL_RCC2_SYSDIV2_56 0x1B800000 // System clock /56 +#define SYSCTL_RCC2_SYSDIV2_57 0x1C000000 // System clock /57 +#define SYSCTL_RCC2_SYSDIV2_58 0x1C800000 // System clock /58 +#define SYSCTL_RCC2_SYSDIV2_59 0x1D000000 // System clock /59 +#define SYSCTL_RCC2_SYSDIV2_60 0x1D800000 // System clock /60 +#define SYSCTL_RCC2_SYSDIV2_61 0x1E000000 // System clock /61 +#define SYSCTL_RCC2_SYSDIV2_62 0x1E800000 // System clock /62 +#define SYSCTL_RCC2_SYSDIV2_63 0x1F000000 // System clock /63 +#define SYSCTL_RCC2_SYSDIV2_64 0x1F800000 // System clock /64 +#define SYSCTL_RCC2_PWRDN2 0x00002000 // PLL power down +#define SYSCTL_RCC2_BYPASS2 0x00000800 // PLL bypass +#define SYSCTL_RCC2_OSCSRC2_MSK 0x00000070 // Oscillator input select +#define SYSCTL_RCC2_OSCSRC2_MO 0x00000000 // Use the main oscillator +#define SYSCTL_RCC2_OSCSRC2_IO 0x00000010 // Use the internal oscillator +#define SYSCTL_RCC2_OSCSRC2_IO4 0x00000020 // Use the internal oscillator / 4 +#define SYSCTL_RCC2_OSCSRC2_30 0x00000030 // Use the 30 KHz internal osc. +#define SYSCTL_RCC2_OSCSRC2_32 0x00000070 // Use the 32 KHz external osc. + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DSLPCLKCFG register. +// +//***************************************************************************** +#define SYSCTL_DSLPCLKCFG_D_MSK 0x1f800000 // Deep sleep system clock override +#define SYSCTL_DSLPCLKCFG_D_2 0x00800000 // System clock /2 +#define SYSCTL_DSLPCLKCFG_D_3 0x01000000 // System clock /3 +#define SYSCTL_DSLPCLKCFG_D_4 0x01800000 // System clock /4 +#define SYSCTL_DSLPCLKCFG_D_5 0x02000000 // System clock /5 +#define SYSCTL_DSLPCLKCFG_D_6 0x02800000 // System clock /6 +#define SYSCTL_DSLPCLKCFG_D_7 0x03000000 // System clock /7 +#define SYSCTL_DSLPCLKCFG_D_8 0x03800000 // System clock /8 +#define SYSCTL_DSLPCLKCFG_D_9 0x04000000 // System clock /9 +#define SYSCTL_DSLPCLKCFG_D_10 0x04800000 // System clock /10 +#define SYSCTL_DSLPCLKCFG_D_11 0x05000000 // System clock /11 +#define SYSCTL_DSLPCLKCFG_D_12 0x05800000 // System clock /12 +#define SYSCTL_DSLPCLKCFG_D_13 0x06000000 // System clock /13 +#define SYSCTL_DSLPCLKCFG_D_14 0x06800000 // System clock /14 +#define SYSCTL_DSLPCLKCFG_D_15 0x07000000 // System clock /15 +#define SYSCTL_DSLPCLKCFG_D_16 0x07800000 // System clock /16 +#define SYSCTL_DSLPCLKCFG_D_17 0x08000000 // System clock /17 +#define SYSCTL_DSLPCLKCFG_D_18 0x08800000 // System clock /18 +#define SYSCTL_DSLPCLKCFG_D_19 0x09000000 // System clock /19 +#define SYSCTL_DSLPCLKCFG_D_20 0x09800000 // System clock /20 +#define SYSCTL_DSLPCLKCFG_D_21 0x0A000000 // System clock /21 +#define SYSCTL_DSLPCLKCFG_D_22 0x0A800000 // System clock /22 +#define SYSCTL_DSLPCLKCFG_D_23 0x0B000000 // System clock /23 +#define SYSCTL_DSLPCLKCFG_D_24 0x0B800000 // System clock /24 +#define SYSCTL_DSLPCLKCFG_D_25 0x0C000000 // System clock /25 +#define SYSCTL_DSLPCLKCFG_D_26 0x0C800000 // System clock /26 +#define SYSCTL_DSLPCLKCFG_D_27 0x0D000000 // System clock /27 +#define SYSCTL_DSLPCLKCFG_D_28 0x0D800000 // System clock /28 +#define SYSCTL_DSLPCLKCFG_D_29 0x0E000000 // System clock /29 +#define SYSCTL_DSLPCLKCFG_D_30 0x0E800000 // System clock /30 +#define SYSCTL_DSLPCLKCFG_D_31 0x0F000000 // System clock /31 +#define SYSCTL_DSLPCLKCFG_D_32 0x0F800000 // System clock /32 +#define SYSCTL_DSLPCLKCFG_D_33 0x10000000 // System clock /33 +#define SYSCTL_DSLPCLKCFG_D_34 0x10800000 // System clock /34 +#define SYSCTL_DSLPCLKCFG_D_35 0x11000000 // System clock /35 +#define SYSCTL_DSLPCLKCFG_D_36 0x11800000 // System clock /36 +#define SYSCTL_DSLPCLKCFG_D_37 0x12000000 // System clock /37 +#define SYSCTL_DSLPCLKCFG_D_38 0x12800000 // System clock /38 +#define SYSCTL_DSLPCLKCFG_D_39 0x13000000 // System clock /39 +#define SYSCTL_DSLPCLKCFG_D_40 0x13800000 // System clock /40 +#define SYSCTL_DSLPCLKCFG_D_41 0x14000000 // System clock /41 +#define SYSCTL_DSLPCLKCFG_D_42 0x14800000 // System clock /42 +#define SYSCTL_DSLPCLKCFG_D_43 0x15000000 // System clock /43 +#define SYSCTL_DSLPCLKCFG_D_44 0x15800000 // System clock /44 +#define SYSCTL_DSLPCLKCFG_D_45 0x16000000 // System clock /45 +#define SYSCTL_DSLPCLKCFG_D_46 0x16800000 // System clock /46 +#define SYSCTL_DSLPCLKCFG_D_47 0x17000000 // System clock /47 +#define SYSCTL_DSLPCLKCFG_D_48 0x17800000 // System clock /48 +#define SYSCTL_DSLPCLKCFG_D_49 0x18000000 // System clock /49 +#define SYSCTL_DSLPCLKCFG_D_50 0x18800000 // System clock /50 +#define SYSCTL_DSLPCLKCFG_D_51 0x19000000 // System clock /51 +#define SYSCTL_DSLPCLKCFG_D_52 0x19800000 // System clock /52 +#define SYSCTL_DSLPCLKCFG_D_53 0x1A000000 // System clock /53 +#define SYSCTL_DSLPCLKCFG_D_54 0x1A800000 // System clock /54 +#define SYSCTL_DSLPCLKCFG_D_55 0x1B000000 // System clock /55 +#define SYSCTL_DSLPCLKCFG_D_56 0x1B800000 // System clock /56 +#define SYSCTL_DSLPCLKCFG_D_57 0x1C000000 // System clock /57 +#define SYSCTL_DSLPCLKCFG_D_58 0x1C800000 // System clock /58 +#define SYSCTL_DSLPCLKCFG_D_59 0x1D000000 // System clock /59 +#define SYSCTL_DSLPCLKCFG_D_60 0x1D800000 // System clock /60 +#define SYSCTL_DSLPCLKCFG_D_61 0x1E000000 // System clock /61 +#define SYSCTL_DSLPCLKCFG_D_62 0x1E800000 // System clock /62 +#define SYSCTL_DSLPCLKCFG_D_63 0x1F000000 // System clock /63 +#define SYSCTL_DSLPCLKCFG_D_64 0x1F800000 // System clock /64 +#define SYSCTL_DSLPCLKCFG_O_MSK 0x00000070 // Deep sleep oscillator override +#define SYSCTL_DSLPCLKCFG_O_IGN 0x00000000 // Do not override +#define SYSCTL_DSLPCLKCFG_O_IO 0x00000010 // Use the internal oscillator +#define SYSCTL_DSLPCLKCFG_O_30 0x00000030 // Use the 30 KHz internal osc. +#define SYSCTL_DSLPCLKCFG_O_32 0x00000070 // Use the 32 KHz external osc. + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_CLKVCLR register. +// +//***************************************************************************** +#define SYSCTL_CLKVCLR_CLR 0x00000001 // Clear clock verification fault + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_LDOARST register. +// +//***************************************************************************** +#define SYSCTL_LDOARST_ARST 0x00000001 // Allow LDO to reset device + +#endif // __HW_SYSCTL_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_timer.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_timer.h new file mode 100644 index 000000000..eb58abf65 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_timer.h @@ -0,0 +1,235 @@ +//***************************************************************************** +// +// hw_timer.h - Defines and macros used when accessing the timer. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_TIMER_H__ +#define __HW_TIMER_H__ + +//***************************************************************************** +// +// The following define the offsets of the timer registers. +// +//***************************************************************************** +#define TIMER_O_CFG 0x00000000 // Configuration register +#define TIMER_O_TAMR 0x00000004 // TimerA mode register +#define TIMER_O_TBMR 0x00000008 // TimerB mode register +#define TIMER_O_CTL 0x0000000C // Control register +#define TIMER_O_IMR 0x00000018 // Interrupt mask register +#define TIMER_O_RIS 0x0000001C // Interrupt status register +#define TIMER_O_MIS 0x00000020 // Masked interrupt status reg. +#define TIMER_O_ICR 0x00000024 // Interrupt clear register +#define TIMER_O_TAILR 0x00000028 // TimerA interval load register +#define TIMER_O_TBILR 0x0000002C // TimerB interval load register +#define TIMER_O_TAMATCHR 0x00000030 // TimerA match register +#define TIMER_O_TBMATCHR 0x00000034 // TimerB match register +#define TIMER_O_TAPR 0x00000038 // TimerA prescale register +#define TIMER_O_TBPR 0x0000003C // TimerB prescale register +#define TIMER_O_TAPMR 0x00000040 // TimerA prescale match register +#define TIMER_O_TBPMR 0x00000044 // TimerB prescale match register +#define TIMER_O_TAR 0x00000048 // TimerA register +#define TIMER_O_TBR 0x0000004C // TimerB register + +//***************************************************************************** +// +// The following define the reset values of the timer registers. +// +//***************************************************************************** +#define TIMER_RV_CFG 0x00000000 // Configuration register RV +#define TIMER_RV_TAMR 0x00000000 // TimerA mode register RV +#define TIMER_RV_TBMR 0x00000000 // TimerB mode register RV +#define TIMER_RV_CTL 0x00000000 // Control register RV +#define TIMER_RV_IMR 0x00000000 // Interrupt mask register RV +#define TIMER_RV_RIS 0x00000000 // Interrupt status register RV +#define TIMER_RV_MIS 0x00000000 // Masked interrupt status reg RV +#define TIMER_RV_ICR 0x00000000 // Interrupt clear register RV +#define TIMER_RV_TAILR 0xFFFFFFFF // TimerA interval load reg RV +#define TIMER_RV_TBILR 0x0000FFFF // TimerB interval load reg RV +#define TIMER_RV_TAMATCHR 0xFFFFFFFF // TimerA match register RV +#define TIMER_RV_TBMATCHR 0x0000FFFF // TimerB match register RV +#define TIMER_RV_TAPR 0x00000000 // TimerA prescale register RV +#define TIMER_RV_TBPR 0x00000000 // TimerB prescale register RV +#define TIMER_RV_TAPMR 0x00000000 // TimerA prescale match reg RV +#define TIMER_RV_TBPMR 0x00000000 // TimerB prescale match regi RV +#define TIMER_RV_TAR 0xFFFFFFFF // TimerA register RV +#define TIMER_RV_TBR 0x0000FFFF // TimerB register RV + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_CFG register. +// +//***************************************************************************** +#define TIMER_CFG_CFG_MSK 0x00000007 // Configuration options mask +#define TIMER_CFG_16_BIT 0x00000004 // Two 16 bit timers +#define TIMER_CFG_32_BIT_RTC 0x00000001 // 32 bit RTC +#define TIMER_CFG_32_BIT_TIMER 0x00000000 // 32 bit timer + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TnMR register. +// +//***************************************************************************** +#define TIMER_TNMR_TNAMS 0x00000008 // Alternate mode select +#define TIMER_TNMR_TNCMR 0x00000004 // Capture mode - count or time +#define TIMER_TNMR_TNTMR_MSK 0x00000003 // Timer mode mask +#define TIMER_TNMR_TNTMR_CAP 0x00000003 // Mode - capture +#define TIMER_TNMR_TNTMR_PERIOD 0x00000002 // Mode - periodic +#define TIMER_TNMR_TNTMR_1_SHOT 0x00000001 // Mode - one shot + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_CTL register. +// +//***************************************************************************** +#define TIMER_CTL_TBPWML 0x00004000 // TimerB PWM output level invert +#define TIMER_CTL_TBOTE 0x00002000 // TimerB output trigger enable +#define TIMER_CTL_TBEVENT_MSK 0x00000C00 // TimerB event mode mask +#define TIMER_CTL_TBEVENT_BOTH 0x00000C00 // TimerB event mode - both edges +#define TIMER_CTL_TBEVENT_NEG 0x00000400 // TimerB event mode - neg edge +#define TIMER_CTL_TBEVENT_POS 0x00000000 // TimerB event mode - pos edge +#define TIMER_CTL_TBSTALL 0x00000200 // TimerB stall enable +#define TIMER_CTL_TBEN 0x00000100 // TimerB enable +#define TIMER_CTL_TAPWML 0x00000040 // TimerA PWM output level invert +#define TIMER_CTL_TAOTE 0x00000020 // TimerA output trigger enable +#define TIMER_CTL_RTCEN 0x00000010 // RTC counter enable +#define TIMER_CTL_TAEVENT_MSK 0x0000000C // TimerA event mode mask +#define TIMER_CTL_TAEVENT_BOTH 0x0000000C // TimerA event mode - both edges +#define TIMER_CTL_TAEVENT_NEG 0x00000004 // TimerA event mode - neg edge +#define TIMER_CTL_TAEVENT_POS 0x00000000 // TimerA event mode - pos edge +#define TIMER_CTL_TASTALL 0x00000002 // TimerA stall enable +#define TIMER_CTL_TAEN 0x00000001 // TimerA enable + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_IMR register. +// +//***************************************************************************** +#define TIMER_IMR_CBEIM 0x00000400 // CaptureB event interrupt mask +#define TIMER_IMR_CBMIM 0x00000200 // CaptureB match interrupt mask +#define TIMER_IMR_TBTOIM 0x00000100 // TimerB time out interrupt mask +#define TIMER_IMR_RTCIM 0x00000008 // RTC interrupt mask +#define TIMER_IMR_CAEIM 0x00000004 // CaptureA event interrupt mask +#define TIMER_IMR_CAMIM 0x00000002 // CaptureA match interrupt mask +#define TIMER_IMR_TATOIM 0x00000001 // TimerA time out interrupt mask + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_RIS register. +// +//***************************************************************************** +#define TIMER_RIS_CBERIS 0x00000400 // CaptureB event raw int status +#define TIMER_RIS_CBMRIS 0x00000200 // CaptureB match raw int status +#define TIMER_RIS_TBTORIS 0x00000100 // TimerB time out raw int status +#define TIMER_RIS_RTCRIS 0x00000008 // RTC raw int status +#define TIMER_RIS_CAERIS 0x00000004 // CaptureA event raw int status +#define TIMER_RIS_CAMRIS 0x00000002 // CaptureA match raw int status +#define TIMER_RIS_TATORIS 0x00000001 // TimerA time out raw int status + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_MIS register. +// +//***************************************************************************** +#define TIMER_RIS_CBEMIS 0x00000400 // CaptureB event masked int status +#define TIMER_RIS_CBMMIS 0x00000200 // CaptureB match masked int status +#define TIMER_RIS_TBTOMIS 0x00000100 // TimerB time out masked int stat +#define TIMER_RIS_RTCMIS 0x00000008 // RTC masked int status +#define TIMER_RIS_CAEMIS 0x00000004 // CaptureA event masked int status +#define TIMER_RIS_CAMMIS 0x00000002 // CaptureA match masked int status +#define TIMER_RIS_TATOMIS 0x00000001 // TimerA time out masked int stat + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_ICR register. +// +//***************************************************************************** +#define TIMER_ICR_CBECINT 0x00000400 // CaptureB event interrupt clear +#define TIMER_ICR_CBMCINT 0x00000200 // CaptureB match interrupt clear +#define TIMER_ICR_TBTOCINT 0x00000100 // TimerB time out interrupt clear +#define TIMER_ICR_RTCCINT 0x00000008 // RTC interrupt clear +#define TIMER_ICR_CAECINT 0x00000004 // CaptureA event interrupt clear +#define TIMER_ICR_CAMCINT 0x00000002 // CaptureA match interrupt clear +#define TIMER_ICR_TATOCINT 0x00000001 // TimerA time out interrupt clear + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TAILR register. +// +//***************************************************************************** +#define TIMER_TAILR_TAILRH 0xFFFF0000 // TimerB load val in 32 bit mode +#define TIMER_TAILR_TAILRL 0x0000FFFF // TimerA interval load value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TBILR register. +// +//***************************************************************************** +#define TIMER_TBILR_TBILRL 0x0000FFFF // TimerB interval load value + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TAMATCHR register. +// +//***************************************************************************** +#define TIMER_TAMATCHR_TAMRH 0xFFFF0000 // TimerB match val in 32 bit mode +#define TIMER_TAMATCHR_TAMRL 0x0000FFFF // TimerA match value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TBMATCHR register. +// +//***************************************************************************** +#define TIMER_TBMATCHR_TBMRL 0x0000FFFF // TimerB match load value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TnPR register. +// +//***************************************************************************** +#define TIMER_TNPR_TNPSR 0x000000FF // TimerN prescale value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TnPMR register. +// +//***************************************************************************** +#define TIMER_TNPMR_TNPSMR 0x000000FF // TimerN prescale match value + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TAR register. +// +//***************************************************************************** +#define TIMER_TAR_TARH 0xFFFF0000 // TimerB val in 32 bit mode +#define TIMER_TAR_TARL 0x0000FFFF // TimerA value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TBR register. +// +//***************************************************************************** +#define TIMER_TBR_TBRL 0x0000FFFF // TimerB value + +#endif // __HW_TIMER_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_types.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_types.h new file mode 100644 index 000000000..974a85594 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_types.h @@ -0,0 +1,129 @@ +//***************************************************************************** +// +// hw_types.h - Common types and macros. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_TYPES_H__ +#define __HW_TYPES_H__ + +//***************************************************************************** +// +// Define a boolean type, and values for true and false. +// +//***************************************************************************** +typedef unsigned char tBoolean; + +#ifndef true +#define true 1 +#endif + +#ifndef false +#define false 0 +#endif + +//***************************************************************************** +// +// Macros for hardware access, both direct and via the bit-band region. +// +//***************************************************************************** +#define HWREG(x) \ + (*((volatile unsigned long *)(x))) +#define HWREGH(x) \ + (*((volatile unsigned short *)(x))) +#define HWREGB(x) \ + (*((volatile unsigned char *)(x))) +#define HWREGBITW(x, b) \ + HWREG(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) +#define HWREGBITH(x, b) \ + HWREGH(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) +#define HWREGBITB(x, b) \ + HWREGB(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) + +//***************************************************************************** +// +// Helper Macros for determining silicon revisions, etc. +// +// These macros will be used by Driverlib at "run-time" to create necessary +// conditional code blocks that will allow a single version of the Driverlib +// "binary" code to support multiple(all) Stellaris silicon revisions. +// +// It is expected that these macros will be used inside of a standard 'C' +// conditional block of code, e.g. +// +// if(DEVICE_IS_SANDSTORM()) +// { +// do some Sandstorm specific code here. +// } +// +// By default, these macros will be defined as run-time checks of the +// appropriate register(s) to allow creation of run-time conditional code +// blocks for a common DriverLib across the entire Stellaris family. +// +// However, if code-space optimization is required, these macros can be "hard- +// coded" for a specific version of Stellaris silicon. Many compilers will +// then detect the "hard-coded" conditionals, and appropriately optimize the +// code blocks, eliminating any "unreachable" code. This would result in +// a smaller Driverlib, thus producing a smaller final application size, but +// at the cost of limiting the Driverlib binary to a specific Stellaris +// silicon revision. +// +//***************************************************************************** +#ifndef DEVICE_IS_SANDSTORM +#define DEVICE_IS_SANDSTORM \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_VER_MASK) == SYSCTL_DID0_VER_0) || \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_VER_MASK) == SYSCTL_DID0_VER_1) && \ + ((HWREG(SYSCTL_DID0) & SYSCTL_DID0_CLASS_MASK) == \ + SYSCTL_DID0_CLASS_SANDSTORM))) +#endif + +#ifndef DEVICE_IS_FURY +#define DEVICE_IS_FURY \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_VER_MASK) == SYSCTL_DID0_VER_1) && \ + ((HWREG(SYSCTL_DID0) & SYSCTL_DID0_CLASS_MASK) == \ + SYSCTL_DID0_CLASS_FURY)) +#endif + +#ifndef DEVICE_IS_REVA2 +#define DEVICE_IS_REVA2 \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MAJ_MASK) == SYSCTL_DID0_MAJ_A) && \ + ((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MIN_MASK) == SYSCTL_DID0_MIN_2)) +#endif + +#ifndef DEVICE_IS_REVC1 +#define DEVICE_IS_REVC1 \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MAJ_MASK) == SYSCTL_DID0_MAJ_C) && \ + ((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MIN_MASK) == SYSCTL_DID0_MIN_1)) +#endif + +#ifndef DEVICE_IS_REVC2 +#define DEVICE_IS_REVC2 \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MAJ_MASK) == SYSCTL_DID0_MAJ_C) && \ + ((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MIN_MASK) == SYSCTL_DID0_MIN_2)) +#endif + +#endif // __HW_TYPES_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_uart.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_uart.h new file mode 100644 index 000000000..e5bb1c47e --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_uart.h @@ -0,0 +1,241 @@ +//***************************************************************************** +// +// hw_uart.h - Macros and defines used when accessing the UART hardware +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_UART_H__ +#define __HW_UART_H__ + +//***************************************************************************** +// +// UART Register Offsets. +// +//***************************************************************************** +#define UART_O_DR 0x00000000 // Data Register +#define UART_O_RSR 0x00000004 // Receive Status Register (read) +#define UART_O_ECR 0x00000004 // Error Clear Register (write) +#define UART_O_FR 0x00000018 // Flag Register (read only) +#define UART_O_IBRD 0x00000024 // Integer Baud Rate Divisor Reg +#define UART_O_FBRD 0x00000028 // Fractional Baud Rate Divisor Reg +#define UART_O_LCR_H 0x0000002C // Line Control Register, HIGH byte +#define UART_O_CTL 0x00000030 // Control Register +#define UART_O_IFLS 0x00000034 // Interrupt FIFO Level Select Reg +#define UART_O_IM 0x00000038 // Interrupt Mask Set/Clear Reg +#define UART_O_RIS 0x0000003C // Raw Interrupt Status Register +#define UART_O_MIS 0x00000040 // Masked Interrupt Status Register +#define UART_O_ICR 0x00000044 // Interrupt Clear Register +#define UART_O_PeriphID4 0x00000FD0 // +#define UART_O_PeriphID5 0x00000FD4 // +#define UART_O_PeriphID6 0x00000FD8 // +#define UART_O_PeriphID7 0x00000FDC // +#define UART_O_PeriphID0 0x00000FE0 // +#define UART_O_PeriphID1 0x00000FE4 // +#define UART_O_PeriphID2 0x00000FE8 // +#define UART_O_PeriphID3 0x00000FEC // +#define UART_O_PCellID0 0x00000FF0 // +#define UART_O_PCellID1 0x00000FF4 // +#define UART_O_PCellID2 0x00000FF8 // +#define UART_O_PCellID3 0x00000FFC // + +//***************************************************************************** +// +// Data Register bits +// +//***************************************************************************** +#define UART_DR_OE 0x00000800 // Overrun Error +#define UART_DR_BE 0x00000400 // Break Error +#define UART_DR_PE 0x00000200 // Parity Error +#define UART_DR_FE 0x00000100 // Framing Error +#define UART_DR_DATA_MASK 0x000000FF // UART data + +//***************************************************************************** +// +// Receive Status Register bits +// +//***************************************************************************** +#define UART_RSR_OE 0x00000008 // Overrun Error +#define UART_RSR_BE 0x00000004 // Break Error +#define UART_RSR_PE 0x00000002 // Parity Error +#define UART_RSR_FE 0x00000001 // Framing Error + +//***************************************************************************** +// +// Flag Register bits +// +//***************************************************************************** +#define UART_FR_TXFE 0x00000080 // TX FIFO Empty +#define UART_FR_RXFF 0x00000040 // RX FIFO Full +#define UART_FR_TXFF 0x00000020 // TX FIFO Full +#define UART_FR_RXFE 0x00000010 // RX FIFO Empty +#define UART_FR_BUSY 0x00000008 // UART Busy + +//***************************************************************************** +// +// Integer baud-rate divisor +// +//***************************************************************************** +#define UART_IBRD_DIVINT_MASK 0x0000FFFF // Integer baud-rate divisor + +//***************************************************************************** +// +// Fractional baud-rate divisor +// +//***************************************************************************** +#define UART_FBRD_DIVFRAC_MASK 0x0000003F // Fractional baud-rate divisor + +//***************************************************************************** +// +// Line Control Register High bits +// +//***************************************************************************** +#define UART_LCR_H_SPS 0x00000080 // Stick Parity Select +#define UART_LCR_H_WLEN 0x00000060 // Word length +#define UART_LCR_H_WLEN_8 0x00000060 // 8 bit data +#define UART_LCR_H_WLEN_7 0x00000040 // 7 bit data +#define UART_LCR_H_WLEN_6 0x00000020 // 6 bit data +#define UART_LCR_H_WLEN_5 0x00000000 // 5 bit data +#define UART_LCR_H_FEN 0x00000010 // Enable FIFO +#define UART_LCR_H_STP2 0x00000008 // Two Stop Bits Select +#define UART_LCR_H_EPS 0x00000004 // Even Parity Select +#define UART_LCR_H_PEN 0x00000002 // Parity Enable +#define UART_LCR_H_BRK 0x00000001 // Send Break + +//***************************************************************************** +// +// Control Register bits +// +//***************************************************************************** +#define UART_CTL_RXE 0x00000200 // Receive Enable +#define UART_CTL_TXE 0x00000100 // Transmit Enable +#define UART_CTL_LBE 0x00000080 // Loopback Enable +#define UART_CTL_SIRLP 0x00000004 // SIR (IrDA) Low Power Enable +#define UART_CTL_SIREN 0x00000002 // SIR (IrDA) Enable +#define UART_CTL_UARTEN 0x00000001 // UART Enable + +//***************************************************************************** +// +// Interrupt FIFO Level Select Register bits +// +//***************************************************************************** +#define UART_IFLS_RX1_8 0x00000000 // 1/8 Full +#define UART_IFLS_RX2_8 0x00000010 // 1/4 Full +#define UART_IFLS_RX4_8 0x00000020 // 1/2 Full +#define UART_IFLS_RX6_8 0x00000030 // 3/4 Full +#define UART_IFLS_RX7_8 0x00000040 // 7/8 Full +#define UART_IFLS_TX1_8 0x00000000 // 1/8 Full +#define UART_IFLS_TX2_8 0x00000001 // 1/4 Full +#define UART_IFLS_TX4_8 0x00000002 // 1/2 Full +#define UART_IFLS_TX6_8 0x00000003 // 3/4 Full +#define UART_IFLS_TX7_8 0x00000004 // 7/8 Full + +//***************************************************************************** +// +// Interrupt Mask Set/Clear Register bits +// +//***************************************************************************** +#define UART_IM_OEIM 0x00000400 // Overrun Error Interrupt Mask +#define UART_IM_BEIM 0x00000200 // Break Error Interrupt Mask +#define UART_IM_PEIM 0x00000100 // Parity Error Interrupt Mask +#define UART_IM_FEIM 0x00000080 // Framing Error Interrupt Mask +#define UART_IM_RTIM 0x00000040 // Receive Timeout Interrupt Mask +#define UART_IM_TXIM 0x00000020 // Transmit Interrupt Mask +#define UART_IM_RXIM 0x00000010 // Receive Interrupt Mask + +//***************************************************************************** +// +// Raw Interrupt Status Register +// +//***************************************************************************** +#define UART_RIS_OERIS 0x00000400 // Overrun Error Interrupt Status +#define UART_RIS_BERIS 0x00000200 // Break Error Interrupt Status +#define UART_RIS_PERIS 0x00000100 // Parity Error Interrupt Status +#define UART_RIS_FERIS 0x00000080 // Framing Error Interrupt Status +#define UART_RIS_RTRIS 0x00000040 // Receive Timeout Interrupt Status +#define UART_RIS_TXRIS 0x00000020 // Transmit Interrupt Status +#define UART_RIS_RXRIS 0x00000010 // Receive Interrupt Status + +//***************************************************************************** +// +// Masked Interrupt Status Register +// +//***************************************************************************** +#define UART_MIS_OEMIS 0x00000400 // Overrun Error Interrupt Status +#define UART_MIS_BEMIS 0x00000200 // Break Error Interrupt Status +#define UART_MIS_PEMIS 0x00000100 // Parity Error Interrupt Status +#define UART_MIS_FEMIS 0x00000080 // Framing Error Interrupt Status +#define UART_MIS_RTMIS 0x00000040 // Receive Timeout Interrupt Status +#define UART_MIS_TXMIS 0x00000020 // Transmit Interrupt Status +#define UART_MIS_RXMIS 0x00000010 // Receive Interrupt Status + +//***************************************************************************** +// +// Interrupt Clear Register bits +// +//***************************************************************************** +#define UART_ICR_OEIC 0x00000400 // Overrun Error Interrupt Clear +#define UART_ICR_BEIC 0x00000200 // Break Error Interrupt Clear +#define UART_ICR_PEIC 0x00000100 // Parity Error Interrupt Clear +#define UART_ICR_FEIC 0x00000080 // Framing Error Interrupt Clear +#define UART_ICR_RTIC 0x00000040 // Receive Timeout Interrupt Clear +#define UART_ICR_TXIC 0x00000020 // Transmit Interrupt Clear +#define UART_ICR_RXIC 0x00000010 // Receive Interrupt Clear + +#define UART_RSR_ANY (UART_RSR_OE | \ + UART_RSR_BE | \ + UART_RSR_PE | \ + UART_RSR_FE) + +//***************************************************************************** +// +// Reset Values for UART Registers. +// +//***************************************************************************** +#define UART_RV_DR 0x00000000 +#define UART_RV_RSR 0x00000000 +#define UART_RV_ECR 0x00000000 +#define UART_RV_FR 0x00000090 +#define UART_RV_IBRD 0x00000000 +#define UART_RV_FBRD 0x00000000 +#define UART_RV_LCR_H 0x00000000 +#define UART_RV_CTL 0x00000300 +#define UART_RV_IFLS 0x00000012 +#define UART_RV_IM 0x00000000 +#define UART_RV_RIS 0x00000000 +#define UART_RV_MIS 0x00000000 +#define UART_RV_ICR 0x00000000 +#define UART_RV_PeriphID4 0x00000000 +#define UART_RV_PeriphID5 0x00000000 +#define UART_RV_PeriphID6 0x00000000 +#define UART_RV_PeriphID7 0x00000000 +#define UART_RV_PeriphID0 0x00000011 +#define UART_RV_PeriphID1 0x00000000 +#define UART_RV_PeriphID2 0x00000018 +#define UART_RV_PeriphID3 0x00000001 +#define UART_RV_PCellID0 0x0000000D +#define UART_RV_PCellID1 0x000000F0 +#define UART_RV_PCellID2 0x00000005 +#define UART_RV_PCellID3 0x000000B1 + +#endif // __HW_UART_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_watchdog.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_watchdog.h new file mode 100644 index 000000000..7a3b5a8d9 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/hw_watchdog.h @@ -0,0 +1,116 @@ +//***************************************************************************** +// +// hw_watchdog.h - Macros used when accessing the Watchdog Timer hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_WATCHDOG_H__ +#define __HW_WATCHDOG_H__ + +//***************************************************************************** +// +// The following define the offsets of the Watchdog Timer registers. +// +//***************************************************************************** +#define WDT_O_LOAD 0x00000000 // Load register +#define WDT_O_VALUE 0x00000004 // Current value register +#define WDT_O_CTL 0x00000008 // Control register +#define WDT_O_ICR 0x0000000C // Interrupt clear register +#define WDT_O_RIS 0x00000010 // Raw interrupt status register +#define WDT_O_MIS 0x00000014 // Masked interrupt status register +#define WDT_O_TEST 0x00000418 // Test register +#define WDT_O_LOCK 0x00000C00 // Lock register +#define WDT_O_PeriphID4 0x00000FD0 // +#define WDT_O_PeriphID5 0x00000FD4 // +#define WDT_O_PeriphID6 0x00000FD8 // +#define WDT_O_PeriphID7 0x00000FDC // +#define WDT_O_PeriphID0 0x00000FE0 // +#define WDT_O_PeriphID1 0x00000FE4 // +#define WDT_O_PeriphID2 0x00000FE8 // +#define WDT_O_PeriphID3 0x00000FEC // +#define WDT_O_PCellID0 0x00000FF0 // +#define WDT_O_PCellID1 0x00000FF4 // +#define WDT_O_PCellID2 0x00000FF8 // +#define WDT_O_PCellID3 0x00000FFC // + +//***************************************************************************** +// +// The following define the bit fields in the WDT_CTL register. +// +//***************************************************************************** +#define WDT_CTL_RESEN 0x00000002 // Enable reset output +#define WDT_CTL_INTEN 0x00000001 // Enable the WDT counter and int + +//***************************************************************************** +// +// The following define the bit fields in the WDT_ISR, WDT_RIS, and WDT_MIS +// registers. +// +//***************************************************************************** +#define WDT_INT_TIMEOUT 0x00000001 // Watchdog timer expired + +//***************************************************************************** +// +// The following define the bit fields in the WDT_TEST register. +// +//***************************************************************************** +#define WDT_TEST_STALL 0x00000100 // Watchdog stall enable +#ifndef DEPRECATED +#define WDT_TEST_STALL_EN 0x00000100 // Watchdog stall enable +#endif + +//***************************************************************************** +// +// The following define the bit fields in the WDT_LOCK register. +// +//***************************************************************************** +#define WDT_LOCK_LOCKED 0x00000001 // Watchdog timer is locked +#define WDT_LOCK_UNLOCKED 0x00000000 // Watchdog timer is unlocked +#define WDT_LOCK_UNLOCK 0x1ACCE551 // Unlocks the watchdog timer + +//***************************************************************************** +// +// The following define the reset values for the WDT registers. +// +//***************************************************************************** +#define WDT_RV_LOAD 0xFFFFFFFF // Load register +#define WDT_RV_VALUE 0xFFFFFFFF // Current value register +#define WDT_RV_CTL 0x00000000 // Control register +#define WDT_RV_RIS 0x00000000 // Raw interrupt status register +#define WDT_RV_MIS 0x00000000 // Masked interrupt status register +#define WDT_RV_LOCK 0x00000000 // Lock register +#define WDT_RV_PeriphID4 0x00000000 // +#define WDT_RV_PeriphID5 0x00000000 // +#define WDT_RV_PeriphID6 0x00000000 // +#define WDT_RV_PeriphID7 0x00000000 // +#define WDT_RV_PeriphID0 0x00000005 // +#define WDT_RV_PeriphID1 0x00000018 // +#define WDT_RV_PeriphID2 0x00000018 // +#define WDT_RV_PeriphID3 0x00000001 // +#define WDT_RV_PCellID0 0x0000000D // +#define WDT_RV_PCellID1 0x000000F0 // +#define WDT_RV_PCellID2 0x00000005 // +#define WDT_RV_PCellID3 0x000000B1 // + +#endif // __HW_WATCHDOG_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/i2c.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/i2c.h new file mode 100644 index 000000000..46a28eeb5 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/i2c.h @@ -0,0 +1,137 @@ +//***************************************************************************** +// +// i2c.h - Prototypes for the I2C Driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __I2C_H__ +#define __I2C_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Defines for the API. +// +//***************************************************************************** +//***************************************************************************** +// +// Interrupt defines. +// +//***************************************************************************** +#define I2C_INT_MASTER 0x00000001 +#define I2C_INT_SLAVE 0x00000002 + +//***************************************************************************** +// +// I2C Master commands. +// +//***************************************************************************** +#define I2C_MASTER_CMD_SINGLE_SEND \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_SINGLE_RECEIVE \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_START \ + (I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_CONT \ + (I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_FINISH \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_ERROR_STOP \ + (I2C_MASTER_CS_STOP) +#define I2C_MASTER_CMD_BURST_RECEIVE_START \ + (I2C_MASTER_CS_ACK | I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_RECEIVE_CONT \ + (I2C_MASTER_CS_ACK | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_RECEIVE_FINISH \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_RUN) + +//***************************************************************************** +// +// I2C Master error status. +// +//***************************************************************************** +#define I2C_MASTER_ERR_NONE 0 +#define I2C_MASTER_ERR_ADDR_ACK 0x00000004 +#define I2C_MASTER_ERR_DATA_ACK 0x00000008 +#define I2C_MASTER_ERR_ARB_LOST 0x00000010 + +//***************************************************************************** +// +// I2C Slave action requests +// +//***************************************************************************** +#define I2C_SLAVE_ACT_NONE 0 +#define I2C_SLAVE_ACT_RREQ 0x00000001 // Master has sent data +#define I2C_SLAVE_ACT_TREQ 0x00000002 // Master has requested data + +//***************************************************************************** +// Miscellaneous I2C driver definitions. +//***************************************************************************** +#define I2C_MASTER_MAX_RETRIES 1000 // Number of retries + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void I2CIntRegister(unsigned long ulBase, void(fnHandler)(void)); +extern void I2CIntUnregister(unsigned long ulBase); +extern tBoolean I2CMasterBusBusy(unsigned long ulBase); +extern tBoolean I2CMasterBusy(unsigned long ulBase); +extern void I2CMasterControl(unsigned long ulBase, unsigned long ulCmd); +extern unsigned long I2CMasterDataGet(unsigned long ulBase); +extern void I2CMasterDataPut(unsigned long ulBase, unsigned char ucData); +extern void I2CMasterDisable(unsigned long ulBase); +extern void I2CMasterEnable(unsigned long ulBase); +extern unsigned long I2CMasterErr(unsigned long ulBase); +extern void I2CMasterInit(unsigned long ulBase, tBoolean bFast); +extern void I2CMasterIntClear(unsigned long ulBase); +extern void I2CMasterIntDisable(unsigned long ulBase); +extern void I2CMasterIntEnable(unsigned long ulBase); +extern tBoolean I2CMasterIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void I2CMasterSlaveAddrSet(unsigned long ulBase, + unsigned char ucSlaveAddr, + tBoolean bReceive); +extern unsigned long I2CSlaveDataGet(unsigned long ulBase); +extern void I2CSlaveDataPut(unsigned long ulBase, unsigned char ucData); +extern void I2CSlaveDisable(unsigned long ulBase); +extern void I2CSlaveEnable(unsigned long ulBase); +extern void I2CSlaveInit(unsigned long ulBase, unsigned char ucSlaveAddr); +extern void I2CSlaveIntClear(unsigned long ulBase); +extern void I2CSlaveIntDisable(unsigned long ulBase); +extern void I2CSlaveIntEnable(unsigned long ulBase); +extern tBoolean I2CSlaveIntStatus(unsigned long ulBase, tBoolean bMasked); +extern unsigned long I2CSlaveStatus(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __I2C_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/interrupt.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/interrupt.h new file mode 100644 index 000000000..1ce70f16b --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/interrupt.h @@ -0,0 +1,57 @@ +//***************************************************************************** +// +// interrupt.h - Prototypes for the NVIC Interrupt Controller Driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __INTERRUPT_H__ +#define __INTERRUPT_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void IntMasterEnable(void); +extern void IntMasterDisable(void); +extern void IntRegister(unsigned long ulInterrupt, void (*pfnHandler)(void)); +extern void IntUnregister(unsigned long ulInterrupt); +extern void IntPriorityGroupingSet(unsigned long ulBits); +extern unsigned long IntPriorityGroupingGet(void); +extern void IntPrioritySet(unsigned long ulInterrupt, + unsigned char ucPriority); +extern long IntPriorityGet(unsigned long ulInterrupt); +extern void IntEnable(unsigned long ulInterrupt); +extern void IntDisable(unsigned long ulInterrupt); + +#ifdef __cplusplus +} +#endif + +#endif // __INTERRUPT_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/libdriver.a b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/libdriver.a new file mode 100644 index 0000000000000000000000000000000000000000..b5de5a193bc316196a75daed3f28ddb1a0d16b1a GIT binary patch literal 88936 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 literal 0 HcmV?d00001 diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/lmi_flash.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/lmi_flash.h new file mode 100644 index 000000000..75d30c41c --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/lmi_flash.h @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// flash.h - Prototypes for the flash driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __FLASH_H__ +#define __FLASH_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to FlashProtectSet(), and returned by +// FlashProtectGet(). +// +//***************************************************************************** +typedef enum +{ + FlashReadWrite, // Flash can be read and written + FlashReadOnly, // Flash can only be read + FlashExecuteOnly // Flash can only be executed +} +tFlashProtection; + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern unsigned long FlashUsecGet(void); +extern void FlashUsecSet(unsigned long ulClocks); +extern long FlashErase(unsigned long ulAddress); +extern long FlashProgram(unsigned long *pulData, unsigned long ulAddress, + unsigned long ulCount); +extern tFlashProtection FlashProtectGet(unsigned long ulAddress); +extern long FlashProtectSet(unsigned long ulAddress, + tFlashProtection eProtect); +extern long FlashProtectSave(void); +extern long FlashUserGet(unsigned long *pulUser0, unsigned long *pulUser1); +extern long FlashUserSet(unsigned long ulUser0, unsigned long ulUser1); +extern long FlashUserSave(void); +extern void FlashIntRegister(void (*pfnHandler)(void)); +extern void FlashIntUnregister(void); +extern void FlashIntEnable(unsigned long ulIntFlags); +extern void FlashIntDisable(unsigned long ulIntFlags); +extern unsigned long FlashIntGetStatus(tBoolean bMasked); +extern void FlashIntClear(unsigned long ulIntFlags); + +#ifdef __cplusplus +} +#endif + +#endif // __FLASH_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/lmi_timer.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/lmi_timer.h new file mode 100644 index 000000000..85b3160ab --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/lmi_timer.h @@ -0,0 +1,137 @@ +//***************************************************************************** +// +// timer.h - Prototypes for the timer module +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __TIMER_H__ +#define __TIMER_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to TimerConfigure as the ulConfig parameter. +// +//***************************************************************************** +#define TIMER_CFG_32_BIT_OS 0x00000001 // 32-bit one-shot timer +#define TIMER_CFG_32_BIT_PER 0x00000002 // 32-bit periodic timer +#define TIMER_CFG_32_RTC 0x01000000 // 32-bit RTC timer +#define TIMER_CFG_16_BIT_PAIR 0x04000000 // Two 16-bit timers +#define TIMER_CFG_A_ONE_SHOT 0x00000001 // Timer A one-shot timer +#define TIMER_CFG_A_PERIODIC 0x00000002 // Timer A periodic timer +#define TIMER_CFG_A_CAP_COUNT 0x00000003 // Timer A event counter +#define TIMER_CFG_A_CAP_TIME 0x00000007 // Timer A event timer +#define TIMER_CFG_A_PWM 0x0000000A // Timer A PWM output +#define TIMER_CFG_B_ONE_SHOT 0x00000100 // Timer B one-shot timer +#define TIMER_CFG_B_PERIODIC 0x00000200 // Timer B periodic timer +#define TIMER_CFG_B_CAP_COUNT 0x00000300 // Timer B event counter +#define TIMER_CFG_B_CAP_TIME 0x00000700 // Timer B event timer +#define TIMER_CFG_B_PWM 0x00000A00 // Timer B PWM output + +//***************************************************************************** +// +// Values that can be passed to TimerIntEnable, TimerIntDisable, and +// TimerIntClear as the ulIntFlags parameter, and returned from TimerIntStatus. +// +//***************************************************************************** +#define TIMER_CAPB_EVENT 0x00000400 // CaptureB event interrupt +#define TIMER_CAPB_MATCH 0x00000200 // CaptureB match interrupt +#define TIMER_TIMB_TIMEOUT 0x00000100 // TimerB time out interrupt +#define TIMER_RTC_MATCH 0x00000008 // RTC interrupt mask +#define TIMER_CAPA_EVENT 0x00000004 // CaptureA event interrupt +#define TIMER_CAPA_MATCH 0x00000002 // CaptureA match interrupt +#define TIMER_TIMA_TIMEOUT 0x00000001 // TimerA time out interrupt + +//***************************************************************************** +// +// Values that can be passed to TimerControlEvent as the ulEvent parameter. +// +//***************************************************************************** +#define TIMER_EVENT_POS_EDGE 0x00000000 // Count positive edges +#define TIMER_EVENT_NEG_EDGE 0x00000404 // Count negative edges +#define TIMER_EVENT_BOTH_EDGES 0x00000C0C // Count both edges + +//***************************************************************************** +// +// Values that can be passed to most of the timer APIs as the ulTimer +// parameter. +// +//***************************************************************************** +#define TIMER_A 0x000000ff // Timer A +#define TIMER_B 0x0000ff00 // Timer B +#define TIMER_BOTH 0x0000ffff // Timer Both + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void TimerEnable(unsigned long ulBase, unsigned long ulTimer); +extern void TimerDisable(unsigned long ulBase, unsigned long ulTimer); +extern void TimerConfigure(unsigned long ulBase, unsigned long ulConfig); +extern void TimerControlLevel(unsigned long ulBase, unsigned long ulTimer, + tBoolean bInvert); +extern void TimerControlTrigger(unsigned long ulBase, unsigned long ulTimer, + tBoolean bEnable); +extern void TimerControlEvent(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulEvent); +extern void TimerControlStall(unsigned long ulBase, unsigned long ulTimer, + tBoolean bStall); +extern void TimerRTCEnable(unsigned long ulBase); +extern void TimerRTCDisable(unsigned long ulBase); +extern void TimerPrescaleSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerPrescaleGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerPrescaleMatchSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerPrescaleMatchGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerLoadSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerLoadGet(unsigned long ulBase, unsigned long ulTimer); +extern unsigned long TimerValueGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerMatchSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerMatchGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerIntRegister(unsigned long ulBase, unsigned long ulTimer, + void (*pfnHandler)(void)); +extern void TimerIntUnregister(unsigned long ulBase, unsigned long ulTimer); +extern void TimerIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void TimerIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long TimerIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void TimerIntClear(unsigned long ulBase, unsigned long ulIntFlags); +extern void TimerQuiesce(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __TIMER_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/osram128x64x4.c b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/osram128x64x4.c new file mode 100644 index 000000000..3353a82e6 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/osram128x64x4.c @@ -0,0 +1,933 @@ +//***************************************************************************** +// +// osram128x64x4.c - Driver for the OSRAM 128x64x4 graphical OLED display. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup ek_lm3sx965_api +//! @{ +// +//***************************************************************************** + +#include "hw_ssi.h" +#include "hw_memmap.h" +#include "hw_sysctl.h" +#include "hw_types.h" +#include "debug.h" +#include "gpio.h" +#include "ssi.h" +#include "sysctl.h" +#include "osram128x64x4.h" + +//***************************************************************************** +// +// Flag to indicate if SSI port is enabled for OSRAM usage. +// +//***************************************************************************** +static volatile tBoolean g_bSSIEnabled = false; + +//***************************************************************************** +// +// Define the OSRAM 128x64x4 Remap Setting(s). This will be used in +// several places in the code to switch between vertical and horizontal +// address incrementing. +// +// The Remap Command (0xA0) takes one 8-bit parameter. The parameter is +// defined as follows. +// +// Bit 7: Reserved +// Bit 6: Disable(0)/Enable(1) COM Split Odd Even +// When enabled, the COM signals are split Odd on one side, even on +// the other. Otherwise, they are split 0-39 on one side, 40-79 on +// the other. +// Bit 5: Reserved +// Bit 4: Disable(0)/Enable(1) COM Remap +// When Enabled, ROW 0-79 map to COM 79-0 (i.e. reverse row order) +// Bit 3: Reserved +// Bit 2: Horizontal(0)/Vertical(1) Address Increment +// When set, data RAM address will increment along the column rather +// than along the row. +// Bit 1: Disable(0)/Enable(1) Nibble Remap +// When enabled, the upper and lower nibbles in the DATA bus for access +// to the data RAM are swapped. +// Bit 0: Disable(0)/Enable(1) Column Address Remap +// When enabled, DATA RAM columns 0-63 are remapped to Segment Columns +// 127-0. +// +//***************************************************************************** +#define OSRAM_INIT_REMAP 0x52 +#define OSRAM_INIT_OFFSET 0x4C +static const unsigned char g_pucOSRAM128x64x4VerticalInc[] = { 0xA0, 0x56 }; +static const unsigned char g_pucOSRAM128x64x4HorizontalInc[] = { 0xA0, 0x52 }; + +//***************************************************************************** +// +// A 5x7 font (in a 6x8 cell, where the sixth column is omitted from this +// table) for displaying text on the OLED display. The data is organized as +// bytes from the left column to the right column, with each byte containing +// the top row in the LSB and the bottom row in the MSB. +// +// Note: This is the same font data that is used in the EK-LM3S811 +// osram96x16x1 driver. The single bit-per-pixel is expaned in the StringDraw +// function to the appropriate four bit-per-pixel gray scale format. +// +//***************************************************************************** +static const unsigned char g_pucFont[96][5] = +{ + { 0x00, 0x00, 0x00, 0x00, 0x00 }, // " " + { 0x00, 0x00, 0x4f, 0x00, 0x00 }, // ! + { 0x00, 0x07, 0x00, 0x07, 0x00 }, // " + { 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // # + { 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $ + { 0x23, 0x13, 0x08, 0x64, 0x62 }, // % + { 0x36, 0x49, 0x55, 0x22, 0x50 }, // & + { 0x00, 0x05, 0x03, 0x00, 0x00 }, // ' + { 0x00, 0x1c, 0x22, 0x41, 0x00 }, // ( + { 0x00, 0x41, 0x22, 0x1c, 0x00 }, // ) + { 0x14, 0x08, 0x3e, 0x08, 0x14 }, // * + { 0x08, 0x08, 0x3e, 0x08, 0x08 }, // + + { 0x00, 0x50, 0x30, 0x00, 0x00 }, // , + { 0x08, 0x08, 0x08, 0x08, 0x08 }, // - + { 0x00, 0x60, 0x60, 0x00, 0x00 }, // . + { 0x20, 0x10, 0x08, 0x04, 0x02 }, // / + { 0x3e, 0x51, 0x49, 0x45, 0x3e }, // 0 + { 0x00, 0x42, 0x7f, 0x40, 0x00 }, // 1 + { 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2 + { 0x21, 0x41, 0x45, 0x4b, 0x31 }, // 3 + { 0x18, 0x14, 0x12, 0x7f, 0x10 }, // 4 + { 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5 + { 0x3c, 0x4a, 0x49, 0x49, 0x30 }, // 6 + { 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7 + { 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8 + { 0x06, 0x49, 0x49, 0x29, 0x1e }, // 9 + { 0x00, 0x36, 0x36, 0x00, 0x00 }, // : + { 0x00, 0x56, 0x36, 0x00, 0x00 }, // ; + { 0x08, 0x14, 0x22, 0x41, 0x00 }, // < + { 0x14, 0x14, 0x14, 0x14, 0x14 }, // = + { 0x00, 0x41, 0x22, 0x14, 0x08 }, // > + { 0x02, 0x01, 0x51, 0x09, 0x06 }, // ? + { 0x32, 0x49, 0x79, 0x41, 0x3e }, // @ + { 0x7e, 0x11, 0x11, 0x11, 0x7e }, // A + { 0x7f, 0x49, 0x49, 0x49, 0x36 }, // B + { 0x3e, 0x41, 0x41, 0x41, 0x22 }, // C + { 0x7f, 0x41, 0x41, 0x22, 0x1c }, // D + { 0x7f, 0x49, 0x49, 0x49, 0x41 }, // E + { 0x7f, 0x09, 0x09, 0x09, 0x01 }, // F + { 0x3e, 0x41, 0x49, 0x49, 0x7a }, // G + { 0x7f, 0x08, 0x08, 0x08, 0x7f }, // H + { 0x00, 0x41, 0x7f, 0x41, 0x00 }, // I + { 0x20, 0x40, 0x41, 0x3f, 0x01 }, // J + { 0x7f, 0x08, 0x14, 0x22, 0x41 }, // K + { 0x7f, 0x40, 0x40, 0x40, 0x40 }, // L + { 0x7f, 0x02, 0x0c, 0x02, 0x7f }, // M + { 0x7f, 0x04, 0x08, 0x10, 0x7f }, // N + { 0x3e, 0x41, 0x41, 0x41, 0x3e }, // O + { 0x7f, 0x09, 0x09, 0x09, 0x06 }, // P + { 0x3e, 0x41, 0x51, 0x21, 0x5e }, // Q + { 0x7f, 0x09, 0x19, 0x29, 0x46 }, // R + { 0x46, 0x49, 0x49, 0x49, 0x31 }, // S + { 0x01, 0x01, 0x7f, 0x01, 0x01 }, // T + { 0x3f, 0x40, 0x40, 0x40, 0x3f }, // U + { 0x1f, 0x20, 0x40, 0x20, 0x1f }, // V + { 0x3f, 0x40, 0x38, 0x40, 0x3f }, // W + { 0x63, 0x14, 0x08, 0x14, 0x63 }, // X + { 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y + { 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z + { 0x00, 0x7f, 0x41, 0x41, 0x00 }, // [ + { 0x02, 0x04, 0x08, 0x10, 0x20 }, // "\" + { 0x00, 0x41, 0x41, 0x7f, 0x00 }, // ] + { 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^ + { 0x40, 0x40, 0x40, 0x40, 0x40 }, // _ + { 0x00, 0x01, 0x02, 0x04, 0x00 }, // ` + { 0x20, 0x54, 0x54, 0x54, 0x78 }, // a + { 0x7f, 0x48, 0x44, 0x44, 0x38 }, // b + { 0x38, 0x44, 0x44, 0x44, 0x20 }, // c + { 0x38, 0x44, 0x44, 0x48, 0x7f }, // d + { 0x38, 0x54, 0x54, 0x54, 0x18 }, // e + { 0x08, 0x7e, 0x09, 0x01, 0x02 }, // f + { 0x0c, 0x52, 0x52, 0x52, 0x3e }, // g + { 0x7f, 0x08, 0x04, 0x04, 0x78 }, // h + { 0x00, 0x44, 0x7d, 0x40, 0x00 }, // i + { 0x20, 0x40, 0x44, 0x3d, 0x00 }, // j + { 0x7f, 0x10, 0x28, 0x44, 0x00 }, // k + { 0x00, 0x41, 0x7f, 0x40, 0x00 }, // l + { 0x7c, 0x04, 0x18, 0x04, 0x78 }, // m + { 0x7c, 0x08, 0x04, 0x04, 0x78 }, // n + { 0x38, 0x44, 0x44, 0x44, 0x38 }, // o + { 0x7c, 0x14, 0x14, 0x14, 0x08 }, // p + { 0x08, 0x14, 0x14, 0x18, 0x7c }, // q + { 0x7c, 0x08, 0x04, 0x04, 0x08 }, // r + { 0x48, 0x54, 0x54, 0x54, 0x20 }, // s + { 0x04, 0x3f, 0x44, 0x40, 0x20 }, // t + { 0x3c, 0x40, 0x40, 0x20, 0x7c }, // u + { 0x1c, 0x20, 0x40, 0x20, 0x1c }, // v + { 0x3c, 0x40, 0x30, 0x40, 0x3c }, // w + { 0x44, 0x28, 0x10, 0x28, 0x44 }, // x + { 0x0c, 0x50, 0x50, 0x50, 0x3c }, // y + { 0x44, 0x64, 0x54, 0x4c, 0x44 }, // z + { 0x00, 0x08, 0x36, 0x41, 0x00 }, // { + { 0x00, 0x00, 0x7f, 0x00, 0x00 }, // | + { 0x00, 0x41, 0x36, 0x08, 0x00 }, // } + { 0x02, 0x01, 0x02, 0x04, 0x02 }, // ~ + { 0x02, 0x01, 0x02, 0x04, 0x02 }, // ~ +}; + +//***************************************************************************** +// +// The sequence of commands used to initialize the SSD0303 controller. Each +// command is described as follows: there is a byte specifying the number of +// bytes in the command sequence, followed by that many bytes of command data. +// Note: This initialization sequence is derived from OSRAM App Note AN018. +// +//***************************************************************************** +static const unsigned char g_pucOSRAM128x64x4Init[] = +{ + // + // Column Address + // + 4, 0x15, 0, 63, 0xe3, + + // + // Row Address + // + 4, 0x75, 0, 63, 0xe3, + + // + // Contrast Control + // + 3, 0x81, 50, 0xe3, + + // + // Half Current Range + // + 2, 0x85, 0xe3, + + // + // Display Re-map + // + 3, 0xA0, OSRAM_INIT_REMAP, 0xe3, + + // + // Display Start Line + // + 3, 0xA1, 0, 0xe3, + + // + // Display Offset + // + 3, 0xA2, OSRAM_INIT_OFFSET, 0xe3, + + // + // Display Mode Normal + // + 2, 0xA4, 0xe3, + + // + // Multiplex Ratio + // + 3, 0xA8, 63, 0xe3, + + // + // Phase Length + // + 3, 0xB1, 0x22, 0xe3, + + // + // Row Period + // + 3, 0xB2, 70, 0xe3, + + // + // Display Clock Divide + // + 3, 0xB3, 0xF1, 0xe3, + + // + // VSL + // + 3, 0xBF, 0x0D, 0xe3, + + // + // VCOMH + // + 3, 0xBE, 0x02, 0xe3, + + // + // VP + // + 3, 0xBC, 0x10, 0xe3, + + // + // Gamma + // + 10, 0xB8, 0x01, 0x11, 0x22, 0x32, 0x43, 0x54, 0x65, 0x76, 0xe3, + + // + // Set DC-DC + 3, 0xAD, 0x03, 0xe3, + + // + // Display ON/OFF + // + 2, 0xAF, 0xe3, +}; + +//***************************************************************************** +// +//! \internal +//! +//! Write a sequence of command bytes to the SSD0323 controller. +//! +//! The data is written in a polled fashion; this function will not return +//! until the entire byte sequence has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +OSRAMWriteCommand(const unsigned char *pucBuffer, unsigned long ulCount) +{ + unsigned long ulTemp; + + // + // Return iff SSI port is not enabled for OSRAM. + // + if(!g_bSSIEnabled) + { + return; + } + + // + // Clear the command/control bit to enable command mode. + // + GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_7, 0); + + // + // Loop while there are more bytes left to be transferred. + // + while(ulCount != 0) + { + // + // Write the next byte to the controller. + // + SSIDataPut(SSI0_BASE, *pucBuffer++); + + // + // Dummy read to drain the fifo and time the GPIO signal. + // + SSIDataGet(SSI0_BASE, &ulTemp); + + // + // Decrement the BYTE counter. + // + ulCount--; + } +} + +//***************************************************************************** +// +//! \internal +//! +//! Write a sequence of data bytes to the SSD0323 controller. +//! +//! The data is written in a polled fashion; this function will not return +//! until the entire byte sequence has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +OSRAMWriteData(const unsigned char *pucBuffer, unsigned long ulCount) +{ + unsigned long ulTemp; + + // + // Return iff SSI port is not enabled for OSRAM. + // + if(!g_bSSIEnabled) + { + return; + } + + // + // Set the command/control bit to enable data mode. + // + GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_PIN_7); + + // + // Loop while there are more bytes left to be transferred. + // + while(ulCount != 0) + { + // + // Write the next byte to the controller. + // + SSIDataPut(SSI0_BASE, *pucBuffer++); + + // + // Dummy read to drain the fifo and time the GPIO signal. + // + SSIDataGet(SSI0_BASE, &ulTemp); + + // + // Decrement the BYTE counter. + // + ulCount--; + } +} + +//***************************************************************************** +// +//! Clears the OLED display. +//! +//! This function will clear the display RAM. All pixels in the display will +//! be turned off. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Clear(void) +{ + static const unsigned char pucCommand1[] = { 0x15, 0, 63 }; + static const unsigned char pucCommand2[] = { 0x75, 0, 79 }; + unsigned long ulRow, ulColumn; + static unsigned char pucZeroBuffer[8] = { 0, 0, 0, 0, 0, 0, 0, 0}; + + // + // Set the window to fill the entire display. + // + OSRAMWriteCommand(pucCommand1, sizeof(pucCommand1)); + OSRAMWriteCommand(pucCommand2, sizeof(pucCommand2)); + OSRAMWriteCommand(g_pucOSRAM128x64x4VerticalInc, + sizeof(g_pucOSRAM128x64x4VerticalInc)); + + // + // In vertical address increment mode, loop through each column, filling + // each row with 0. + // + for(ulColumn = 0; ulColumn < (128/2); ulColumn++) + { + // + // 8 rows (bytes) per row of text. + // + for(ulRow = 0; ulRow < 80; ulRow += 8) + { + OSRAMWriteData(pucZeroBuffer, sizeof(pucZeroBuffer)); + } + } +} + +//***************************************************************************** +// +//! Displays a string on the OLED display. +//! +//! \param pcStr is a pointer to the string to display. +//! \param ulX is the horizontal position to display the string, specified in +//! columns from the left edge of the display. +//! \param ulY is the vertical position to display the string, specified in +//! rows from the top edge of the display. +//! \param ucLevel is the 4-bit grey scale value to be used for displayed text. +//! +//! This function will draw a string on the display. Only the ASCII characters +//! between 32 (space) and 126 (tilde) are supported; other characters will +//! result in random data being draw on the display (based on whatever appears +//! before/after the font in memory). The font is mono-spaced, so characters +//! such as "i" and "l" have more white space around them than characters such +//! as "m" or "w". +//! +//! If the drawing of the string reaches the right edge of the display, no more +//! characters will be drawn. Therefore, special care is not required to avoid +//! supplying a string that is "too long" to display. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \note Because the OLED display packs 2 pixels of data in a single byte, the +//! parameter \e ulX must be an even column number (e.g. 0, 2, 4, etc). +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4StringDraw(const char *pcStr, unsigned long ulX, + unsigned long ulY, unsigned char ucLevel) +{ + static unsigned char pucBuffer[8]; + unsigned long ulIdx1, ulIdx2; + unsigned char ucTemp; + + // + // Check the arguments. + // + ASSERT(ulX < 128); + ASSERT((ulX & 1) == 0); + ASSERT(ulY < 64); + ASSERT(ucLevel < 16); + + // + // Setup a window starting at the specified column and row, ending + // at the right edge of the display and 8 rows down (single character row). + // + pucBuffer[0] = 0x15; + pucBuffer[1] = ulX / 2; + pucBuffer[2] = 63; + OSRAMWriteCommand(pucBuffer, 3); + pucBuffer[0] = 0x75; + pucBuffer[1] = ulY; + pucBuffer[2] = ulY + 7; + OSRAMWriteCommand(pucBuffer, 3); + OSRAMWriteCommand(g_pucOSRAM128x64x4VerticalInc, + sizeof(g_pucOSRAM128x64x4VerticalInc)); + + // + // Loop while there are more characters in the string. + // + while(*pcStr != 0) + { + // + // Get a working copy of the current character and convert to an + // index into the character bit-map array. + // + ucTemp = *pcStr; + ucTemp &= 0x7F; + if(ucTemp < ' ') + { + ucTemp = ' '; + } + else + { + ucTemp -= ' '; + } + + // + // Build and display the character buffer. + // + for(ulIdx1 = 0; ulIdx1 < 3; ulIdx1++) + { + // + // Convert two columns of 1-bit font data into a single data + // byte column of 4-bit font data. + // + for(ulIdx2 = 0; ulIdx2 < 8; ulIdx2++) + { + pucBuffer[ulIdx2] = 0; + if(g_pucFont[ucTemp][ulIdx1*2] & (1 << ulIdx2)) + { + pucBuffer[ulIdx2] = ((ucLevel << 4) & 0xf0); + } + if((ulIdx1 < 2) && + (g_pucFont[ucTemp][ulIdx1*2+1] & (1 << ulIdx2))) + { + pucBuffer[ulIdx2] |= ((ucLevel << 0) & 0x0f); + } + } + + // + // If there is room, dump the single data byte column to the + // display. Otherwise, bail out. + // + if(ulX < 126) + { + OSRAMWriteData(pucBuffer, 8); + ulX += 2; + } + else + { + return; + } + } + + // + // Advance to the next character. + // + pcStr++; + } +} + +//***************************************************************************** +// +//! Displays an image on the OLED display. +//! +//! \param pucImage is a pointer to the image data. +//! \param ulX is the horizontal position to display this image, specified in +//! columns from the left edge of the display. +//! \param ulY is the vertical position to display this image, specified in +//! rows from the top of the display. +//! \param ulWidth is the width of the image, specified in columns. +//! \param ulHeight is the height of the image, specified in rows. +//! +//! This function will display a bitmap graphic on the display. Because of the +//! format of the display RAM, the starting column (/e ulX) and the number of +//! columns (/e ulWidth) must be an integer multiple of two. +//! +//! The image data is organized with the first row of image data appearing left +//! to right, followed immediately by the second row of image data. Each byte +//! contains the data for two columns in the current row, with the leftmost +//! column being contained in bits 7:4 and the rightmost column being contained +//! in bits 3:0. +//! +//! For example, an image six columns wide and seven scan lines tall would +//! be arranged as follows (showing how the twenty one bytes of the image would +//! appear on the display): +//! +//! \verbatim +//! +-------------------+-------------------+-------------------+ +//! | Byte 0 | Byte 1 | Byte 2 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 3 | Byte 4 | Byte 5 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 6 | Byte 7 | Byte 8 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 9 | Byte 10 | Byte 11 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 12 | Byte 13 | Byte 14 | +//! +---------+---------+---------+--3------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 15 | Byte 16 | Byte 17 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 18 | Byte 19 | Byte 20 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! \endverbatim +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by` +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4ImageDraw(const unsigned char *pucImage, unsigned long ulX, + unsigned long ulY, unsigned long ulWidth, + unsigned long ulHeight) +{ + static unsigned char pucBuffer[8]; + + // + // Check the arguments. + // + ASSERT(ulX < 128); + ASSERT((ulX & 1) == 0); + ASSERT(ulY < 64); + ASSERT((ulX + ulWidth) <= 128); + ASSERT((ulY + ulHeight) <= 64); + ASSERT((ulWidth & 1) == 0); + + // + // Setup a window starting at the specified column and row, and ending + // at the column + width and row+height. + // + pucBuffer[0] = 0x15; + pucBuffer[1] = ulX / 2; + pucBuffer[2] = (ulX + ulWidth - 2) / 2; + OSRAMWriteCommand(pucBuffer, 3); + pucBuffer[0] = 0x75; + pucBuffer[1] = ulY; + pucBuffer[2] = ulY + ulHeight - 1; + OSRAMWriteCommand(pucBuffer, 3); + OSRAMWriteCommand(g_pucOSRAM128x64x4HorizontalInc, + sizeof(g_pucOSRAM128x64x4HorizontalInc)); + + // + // Loop while there are more rows to display. + // + while(ulHeight--) + { + // + // Write this row of image data. + // + OSRAMWriteData(pucImage, (ulWidth / 2)); + + // + // Advance to the next row of the image. + // + pucImage += (ulWidth / 2); + } +} + +//***************************************************************************** +// +//! Enable the SSI component of the OLED display driver. +//! +//! \param ulFrequency specifies the SSI Clock Frequency to be used. +//! +//! This function initializes the SSI interface to the OLED display. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Enable(unsigned long ulFrequency) +{ + unsigned long ulTemp; + + // + // Disable the SSI port. + // + SSIDisable(SSI0_BASE); + + // + // Configure the SSI0 port for master mode. + // + SSIConfig(SSI0_BASE, SSI_FRF_MOTO_MODE_2, SSI_MODE_MASTER, ulFrequency, 8); + + // + // (Re)Enable SSI control of the FSS pin. + // + GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_3); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + + // + // Enable the SSI port. + // + SSIEnable(SSI0_BASE); + + // + // Drain the receive fifo. + // + while(SSIDataNonBlockingGet(SSI0_BASE, &ulTemp) != 0) + { + } + + // + // Indicate that the OSRAM driver can use the SSI Port. + // + g_bSSIEnabled = true; +} + +//***************************************************************************** +// +//! Enable the SSI component of the OLED display driver. +//! +//! \param ulFrequency specifies the SSI Clock Frequency to be used. +//! +//! This function initializes the SSI interface to the OLED display. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Disable(void) +{ + unsigned long ulTemp; + + // + // Indicate that the OSRAM driver can no longer use the SSI Port. + // + g_bSSIEnabled = false; + + // + // Drain the receive fifo. + // + while(SSIDataNonBlockingGet(SSI0_BASE, &ulTemp) != 0) + { + } + + // + // Disable the SSI port. + // + SSIDisable(SSI0_BASE); + + // + // Disable SSI control of the FSS pin. + // + GPIODirModeSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_DIR_MODE_OUT); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_PIN_3); + +} + +//***************************************************************************** +// +//! Initialize the OLED display. +//! +//! \param ulFrequency specifies the SSI Clock Frequency to be used. +//! +//! This function initializes the SSI interface to the OLED display and +//! configures the SSD0323 controller on the panel. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Init(unsigned long ulFrequency) +{ + unsigned long ulIdx; + + // + // Enable the SSI0 and GPIO port blocks as they are needed by this driver. + // + SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); + + // + // Configure the SSI0CLK and SSIOTX pins for SSI operation. + // + GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_5); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_2, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_5, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + + // + // Configure the PC7 pin as a D/Cn signal for OLED device. + // + GPIODirModeSet(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_DIR_MODE_OUT); + GPIOPadConfigSet(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD); + GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_PIN_7); + + // + // Configure and enable the SSI0 port for master mode. + // + OSRAM128x64x4Enable(ulFrequency); + + // + // Clear the frame buffer. + // + OSRAM128x64x4Clear(); + + // + // Initialize the SSD0323 controller. Loop through the initialization + // sequence array, sending each command "string" to the controller. + // + for(ulIdx = 0; ulIdx < sizeof(g_pucOSRAM128x64x4Init); + ulIdx += g_pucOSRAM128x64x4Init[ulIdx] + 1) + { + // + // Send this command. + // + OSRAMWriteCommand(g_pucOSRAM128x64x4Init + ulIdx + 1, + g_pucOSRAM128x64x4Init[ulIdx] - 1); + } +} + +//***************************************************************************** +// +//! Turns on the OLED display. +//! +//! This function will turn on the OLED display, causing it to display the +//! contents of its internal frame buffer. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4DisplayOn(void) +{ + unsigned long ulIdx; + + // + // Initialize the SSD0323 controller. Loop through the initialization + // sequence array, sending each command "string" to the controller. + // + for(ulIdx = 0; ulIdx < sizeof(g_pucOSRAM128x64x4Init); + ulIdx += g_pucOSRAM128x64x4Init[ulIdx] + 1) + { + // + // Send this command. + // + OSRAMWriteCommand(g_pucOSRAM128x64x4Init + ulIdx + 1, + g_pucOSRAM128x64x4Init[ulIdx] - 1); + } +} + +//***************************************************************************** +// +//! Turns off the OLED display. +//! +//! This function will turn off the OLED display. This will stop the scanning +//! of the panel and turn off the on-chip DC-DC converter, preventing damage to +//! the panel due to burn-in (it has similar characters to a CRT in this +//! respect). +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4DisplayOff(void) +{ + static const unsigned char pucCommand1[] = + { + 0xAE, 0xAD, 0x02 + }; + + // + // Turn off the DC-DC converter and the display. + // + OSRAMWriteCommand(pucCommand1, sizeof(pucCommand1)); +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/osram128x64x4.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/osram128x64x4.h new file mode 100644 index 000000000..2ba7cb956 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/osram128x64x4.h @@ -0,0 +1,63 @@ +//***************************************************************************** +// +// osram128x64x4.h - Prototypes for the driver for the OSRAM 128x64x4 graphical +// OLED display. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __OSRAM128X64X4_H__ +#define __OSRAM128X64X4_H__ + +//***************************************************************************** +// +// Prototypes for the driver APIs. +// +//***************************************************************************** +extern void OSRAM128x64x4Clear(void); +extern void OSRAM128x64x4StringDraw(const char *pcStr, + unsigned long ulX, + unsigned long ulY, + unsigned char ucLevel); +extern void OSRAM128x64x4ImageDraw(const unsigned char *pucImage, + unsigned long ulX, + unsigned long ulY, + unsigned long ulWidth, + unsigned long ulHeight); +extern void OSRAM128x64x4Init(unsigned long ulFrequency); +extern void OSRAM128x64x4Enable(unsigned long ulFrequency); +extern void OSRAM128x64x4Disable(void); +extern void OSRAM128x64x4DisplayOn(void); +extern void OSRAM128x64x4DisplayOff(void); + +//***************************************************************************** +// +// The following macro(s) map old names for the OSRAM functions to the new +// names. In new code, the new names should be used in favor of the old names. +// +//***************************************************************************** +#ifndef DEPRECATED +#define OSRAM128x64x1InitSSI OSRAM128x64x4Enable +#endif + +#endif // __OSRAM128X64X4_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/pwm.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/pwm.h new file mode 100644 index 000000000..bb67fda19 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/pwm.h @@ -0,0 +1,161 @@ +//***************************************************************************** +// +// pwm.h - API function protoypes for Pulse Width Modulation (PWM) ports +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __PWM_H__ +#define __PWM_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following defines are passed to PWMGenConfigure() as the ulConfig +// parameter and specify the configuration of the PWM generator. +// +//***************************************************************************** +#define PWM_GEN_MODE_DOWN 0x00000000 // Down count mode +#define PWM_GEN_MODE_UP_DOWN 0x00000002 // Up/Down count mode +#define PWM_GEN_MODE_SYNC 0x00000038 // Synchronous updates +#define PWM_GEN_MODE_NO_SYNC 0x00000000 // Immediate updates +#define PWM_GEN_MODE_DBG_RUN 0x00000004 // Continue running in debug mode +#define PWM_GEN_MODE_DBG_STOP 0x00000000 // Stop running in debug mode + +//***************************************************************************** +// +// Defines for enabling, disabling, and clearing PWM generator interrupts and +// triggers. +// +//***************************************************************************** +#define PWM_INT_CNT_ZERO 0x00000001 // Int if COUNT = 0 +#define PWM_INT_CNT_LOAD 0x00000002 // Int if COUNT = LOAD +#define PWM_INT_CNT_AU 0x00000004 // Int if COUNT = CMPA U +#define PWM_INT_CNT_AD 0x00000008 // Int if COUNT = CMPA D +#define PWM_INT_CNT_BU 0x00000010 // Int if COUNT = CMPA U +#define PWM_INT_CNT_BD 0x00000020 // Int if COUNT = CMPA D +#define PWM_TR_CNT_ZERO 0x00000100 // Trig if COUNT = 0 +#define PWM_TR_CNT_LOAD 0x00000200 // Trig if COUNT = LOAD +#define PWM_TR_CNT_AU 0x00000400 // Trig if COUNT = CMPA U +#define PWM_TR_CNT_AD 0x00000800 // Trig if COUNT = CMPA D +#define PWM_TR_CNT_BU 0x00001000 // Trig if COUNT = CMPA U +#define PWM_TR_CNT_BD 0x00002000 // Trig if COUNT = CMPA D + +//***************************************************************************** +// +// Defines for enabling, disabling, and clearing PWM interrupts. +// +//***************************************************************************** +#define PWM_INT_GEN_0 0x00000001 // Generator 0 interrupt +#define PWM_INT_GEN_1 0x00000002 // Generator 1 interrupt +#define PWM_INT_GEN_2 0x00000004 // Generator 2 interrupt +#define PWM_INT_FAULT 0x00010000 // Fault interrupt + +//***************************************************************************** +// +// Defines to identify the generators within a module. +// +//***************************************************************************** +#define PWM_GEN_0 0x00000040 // Offset address of Gen0 +#define PWM_GEN_1 0x00000080 // Offset address of Gen1 +#define PWM_GEN_2 0x000000C0 // Offset address of Gen2 + +#define PWM_GEN_0_BIT 0x00000001 // Bit-wise ID for Gen0 +#define PWM_GEN_1_BIT 0x00000002 // Bit-wise ID for Gen1 +#define PWM_GEN_2_BIT 0x00000004 // Bit-wise ID for Gen2 + +//***************************************************************************** +// +// Defines to identify the outputs within a module. +// +//***************************************************************************** +#define PWM_OUT_0 0x00000040 // Encoded offset address of PWM0 +#define PWM_OUT_1 0x00000041 // Encoded offset address of PWM1 +#define PWM_OUT_2 0x00000082 // Encoded offset address of PWM2 +#define PWM_OUT_3 0x00000083 // Encoded offset address of PWM3 +#define PWM_OUT_4 0x000000C4 // Encoded offset address of PWM4 +#define PWM_OUT_5 0x000000C5 // Encoded offset address of PWM5 + +#define PWM_OUT_0_BIT 0x00000001 // Bit-wise ID for PWM0 +#define PWM_OUT_1_BIT 0x00000002 // Bit-wise ID for PWM1 +#define PWM_OUT_2_BIT 0x00000004 // Bit-wise ID for PWM2 +#define PWM_OUT_3_BIT 0x00000008 // Bit-wise ID for PWM3 +#define PWM_OUT_4_BIT 0x00000010 // Bit-wise ID for PWM4 +#define PWM_OUT_5_BIT 0x00000020 // Bit-wise ID for PWM5 + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void PWMGenConfigure(unsigned long ulBase, unsigned long ulGen, + unsigned long ulConfig); +extern void PWMGenPeriodSet(unsigned long ulBase, unsigned long ulGen, + unsigned long ulPeriod); +extern unsigned long PWMGenPeriodGet(unsigned long ulBase, + unsigned long ulGen); +extern void PWMGenEnable(unsigned long ulBase, unsigned long ulGen); +extern void PWMGenDisable(unsigned long ulBase, unsigned long ulGen); +extern void PWMPulseWidthSet(unsigned long ulBase, unsigned long ulPWMOut, + unsigned long ulWidth); +extern unsigned long PWMPulseWidthGet(unsigned long ulBase, + unsigned long ulPWMOut); +extern void PWMDeadBandEnable(unsigned long ulBase, unsigned long ulGen, + unsigned short usRise, unsigned short usFall); +extern void PWMDeadBandDisable(unsigned long ulBase, unsigned long ulGen); +extern void PWMSyncUpdate(unsigned long ulBase, unsigned long ulGenBits); +extern void PWMSyncTimeBase(unsigned long ulBase, unsigned long ulGenBits); +extern void PWMOutputState(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bEnable); +extern void PWMOutputInvert(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bInvert); +extern void PWMOutputFault(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bFaultKill); +extern void PWMGenIntRegister(unsigned long ulBase, unsigned long ulGen, + void (*pfnIntHandler)(void)); +extern void PWMGenIntUnregister(unsigned long ulBase, unsigned long ulGen); +extern void PWMFaultIntRegister(unsigned long ulBase, + void (*pfnIntHandler)(void)); +extern void PWMFaultIntUnregister(unsigned long ulBase); +extern void PWMGenIntTrigEnable(unsigned long ulBase, unsigned long ulGen, + unsigned long ulIntTrig); +extern void PWMGenIntTrigDisable(unsigned long ulBase, unsigned long ulGen, + unsigned long ulIntTrig); +extern unsigned long PWMGenIntStatus(unsigned long ulBase, unsigned long ulGen, + tBoolean bMasked); +extern void PWMGenIntClear(unsigned long ulBase, unsigned long ulGen, + unsigned long ulInts); +extern void PWMIntEnable(unsigned long ulBase, unsigned long ulGenFault); +extern void PWMIntDisable(unsigned long ulBase, unsigned long ulGenFault); +extern void PWMFaultIntClear(unsigned long ulBase); +extern unsigned long PWMIntStatus(unsigned long ulBase, tBoolean bMasked); + +#ifdef __cplusplus +} +#endif + +#endif // __PWM_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/qei.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/qei.h new file mode 100644 index 000000000..89d5b20bc --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/qei.h @@ -0,0 +1,104 @@ +//***************************************************************************** +// +// qei.h - Prototypes for the Quadrature Encoder Driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __QEI_H__ +#define __QEI_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to QEIConfigure as the ulConfig paramater. +// +//***************************************************************************** +#define QEI_CONFIG_CAPTURE_A 0x00000000 // Count on ChA edges only +#define QEI_CONFIG_CAPTURE_A_B 0x00000008 // Count on ChA and ChB edges +#define QEI_CONFIG_NO_RESET 0x00000000 // Do not reset on index pulse +#define QEI_CONFIG_RESET_IDX 0x00000010 // Reset position on index pulse +#define QEI_CONFIG_QUADRATURE 0x00000000 // ChA and ChB are quadrature +#define QEI_CONFIG_CLOCK_DIR 0x00000004 // ChA and ChB are clock and dir +#define QEI_CONFIG_NO_SWAP 0x00000000 // Do not swap ChA and ChB +#define QEI_CONFIG_SWAP 0x00000002 // Swap ChA and ChB + +//***************************************************************************** +// +// Values that can be passed to QEIVelocityConfigure as the ulPreDiv parameter. +// +//***************************************************************************** +#define QEI_VELDIV_1 0x00000000 // Predivide by 1 +#define QEI_VELDIV_2 0x00000040 // Predivide by 2 +#define QEI_VELDIV_4 0x00000080 // Predivide by 4 +#define QEI_VELDIV_8 0x000000C0 // Predivide by 8 +#define QEI_VELDIV_16 0x00000100 // Predivide by 16 +#define QEI_VELDIV_32 0x00000140 // Predivide by 32 +#define QEI_VELDIV_64 0x00000180 // Predivide by 64 +#define QEI_VELDIV_128 0x000001C0 // Predivide by 128 + +//***************************************************************************** +// +// Values that can be passed to QEIEnableInts, QEIDisableInts, and QEIClearInts +// as the ulIntFlags parameter, and returned by QEIGetIntStatus. +// +//***************************************************************************** +#define QEI_INTERROR 0x00000008 // Phase error detected +#define QEI_INTDIR 0x00000004 // Direction change +#define QEI_INTTIMER 0x00000002 // Velocity timer expired +#define QEI_INTINDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void QEIEnable(unsigned long ulBase); +extern void QEIDisable(unsigned long ulBase); +extern void QEIConfigure(unsigned long ulBase, unsigned long ulConfig, + unsigned long ulMaxPosition); +extern unsigned long QEIPositionGet(unsigned long ulBase); +extern void QEIPositionSet(unsigned long ulBase, unsigned long ulPosition); +extern long QEIDirectionGet(unsigned long ulBase); +extern tBoolean QEIErrorGet(unsigned long ulBase); +extern void QEIVelocityEnable(unsigned long ulBase); +extern void QEIVelocityDisable(unsigned long ulBase); +extern void QEIVelocityConfigure(unsigned long ulBase, unsigned long ulPreDiv, + unsigned long ulPeriod); +extern unsigned long QEIVelocityGet(unsigned long ulBase); +extern void QEIIntRegister(unsigned long ulBase, void (*pfnHandler)(void)); +extern void QEIIntUnregister(unsigned long ulBase); +extern void QEIIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void QEIIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long QEIIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void QEIIntClear(unsigned long ulBase, unsigned long ulIntFlags); + +#ifdef __cplusplus +} +#endif + +#endif // __QEI_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/ssi.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/ssi.h new file mode 100644 index 000000000..227b6bd9b --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/ssi.h @@ -0,0 +1,89 @@ +//***************************************************************************** +// +// ssi.h - Prototypes for the Synchronous Serial Interface Driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __SSI_H__ +#define __SSI_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to SSIIntEnable, SSIIntDisable, and SSIIntClear +// as the ulIntFlags parameter, and returned by SSIIntStatus. +// +//***************************************************************************** +#define SSI_TXFF 0x00000008 // TX FIFO half empty or less +#define SSI_RXFF 0x00000004 // RX FIFO half full or less +#define SSI_RXTO 0x00000002 // RX timeout +#define SSI_RXOR 0x00000001 // RX overrun + +//***************************************************************************** +// +// Values that can be passed to SSIConfig. +// +//***************************************************************************** +#define SSI_FRF_MOTO_MODE_0 0x00000000 // Moto fmt, polarity 0, phase 0 +#define SSI_FRF_MOTO_MODE_1 0x00000002 // Moto fmt, polarity 0, phase 1 +#define SSI_FRF_MOTO_MODE_2 0x00000001 // Moto fmt, polarity 1, phase 0 +#define SSI_FRF_MOTO_MODE_3 0x00000003 // Moto fmt, polarity 1, phase 1 +#define SSI_FRF_TI 0x00000010 // TI frame format +#define SSI_FRF_NMW 0x00000020 // National MicroWire frame format + +#define SSI_MODE_MASTER 0x00000000 // SSI master +#define SSI_MODE_SLAVE 0x00000001 // SSI slave +#define SSI_MODE_SLAVE_OD 0x00000002 // SSI slave with output disabled + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void SSIConfig(unsigned long ulBase, unsigned long ulProtocol, + unsigned long ulMode, unsigned long ulBitRate, + unsigned long ulDataWidth); +extern void SSIDataGet(unsigned long ulBase, unsigned long *pulData); +extern long SSIDataNonBlockingGet(unsigned long ulBase, + unsigned long *pulData); +extern void SSIDataPut(unsigned long ulBase, unsigned long ulData); +extern long SSIDataNonBlockingPut(unsigned long ulBase, unsigned long ulData); +extern void SSIDisable(unsigned long ulBase); +extern void SSIEnable(unsigned long ulBase); +extern void SSIIntClear(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntRegister(unsigned long ulBase, void(*pfnHandler)(void)); +extern unsigned long SSIIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void SSIIntUnregister(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __SSI_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/sysctl.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/sysctl.h new file mode 100644 index 000000000..d2efbca0d --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/sysctl.h @@ -0,0 +1,301 @@ +//***************************************************************************** +// +// sysctl.h - Prototypes for the system control driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __SYSCTL_H__ +#define __SYSCTL_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following are values that can be passed to the +// SysCtlPeripheralPresent(), SysCtlPeripheralEnable(), +// SysCtlPeripheralDisable(), and SysCtlPeripheralReset() APIs as the +// ulPeripheral parameter. The peripherals in the fourth group (upper nibble +// is 3) can only be used with the SysCtlPeripheralPresent() API. +// +//***************************************************************************** +#define SYSCTL_PERIPH_PWM 0x00100010 // PWM +#define SYSCTL_PERIPH_ADC 0x00100001 // ADC +#define SYSCTL_PERIPH_HIBERNATE 0x00000040 // Hibernation module +#define SYSCTL_PERIPH_WDOG 0x00000008 // Watchdog +#define SYSCTL_PERIPH_CAN0 0x00100100 // CAN 0 +#define SYSCTL_PERIPH_CAN1 0x00100200 // CAN 1 +#define SYSCTL_PERIPH_UART0 0x10000001 // UART 0 +#define SYSCTL_PERIPH_UART1 0x10000002 // UART 1 +#define SYSCTL_PERIPH_UART2 0x10000004 // UART 2 +#define SYSCTL_PERIPH_SSI 0x10000010 // SSI +#define SYSCTL_PERIPH_SSI0 0x10000010 // SSI 0 +#define SYSCTL_PERIPH_SSI1 0x10000020 // SSI 1 +#define SYSCTL_PERIPH_QEI 0x10000100 // QEI +#define SYSCTL_PERIPH_QEI0 0x10000100 // QEI 0 +#define SYSCTL_PERIPH_QEI1 0x10000200 // QEI 1 +#define SYSCTL_PERIPH_I2C 0x10001000 // I2C +#define SYSCTL_PERIPH_I2C0 0x10001000 // I2C 0 +#define SYSCTL_PERIPH_I2C1 0x10004000 // I2C 1 +#define SYSCTL_PERIPH_TIMER0 0x10100001 // Timer 0 +#define SYSCTL_PERIPH_TIMER1 0x10100002 // Timer 1 +#define SYSCTL_PERIPH_TIMER2 0x10100004 // Timer 2 +#define SYSCTL_PERIPH_TIMER3 0x10100008 // Timer 3 +#define SYSCTL_PERIPH_COMP0 0x10100100 // Analog comparator 0 +#define SYSCTL_PERIPH_COMP1 0x10100200 // Analog comparator 1 +#define SYSCTL_PERIPH_COMP2 0x10100400 // Analog comparator 2 +#define SYSCTL_PERIPH_GPIOA 0x20000001 // GPIO A +#define SYSCTL_PERIPH_GPIOB 0x20000002 // GPIO B +#define SYSCTL_PERIPH_GPIOC 0x20000004 // GPIO C +#define SYSCTL_PERIPH_GPIOD 0x20000008 // GPIO D +#define SYSCTL_PERIPH_GPIOE 0x20000010 // GPIO E +#define SYSCTL_PERIPH_GPIOF 0x20000020 // GPIO F +#define SYSCTL_PERIPH_GPIOG 0x20000040 // GPIO G +#define SYSCTL_PERIPH_GPIOH 0x20000080 // GPIO H +#define SYSCTL_PERIPH_ETH 0x20105000 // ETH +#define SYSCTL_PERIPH_MPU 0x30000080 // Cortex M3 MPU +#define SYSCTL_PERIPH_TEMP 0x30000020 // Temperature sensor +#define SYSCTL_PERIPH_PLL 0x30000010 // PLL + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlPinPresent() API +// as the ulPin parameter. +// +//***************************************************************************** +#define SYSCTL_PIN_PWM0 0x00000001 // PWM0 pin +#define SYSCTL_PIN_PWM1 0x00000002 // PWM1 pin +#define SYSCTL_PIN_PWM2 0x00000004 // PWM2 pin +#define SYSCTL_PIN_PWM3 0x00000008 // PWM3 pin +#define SYSCTL_PIN_PWM4 0x00000010 // PWM4 pin +#define SYSCTL_PIN_PWM5 0x00000020 // PWM5 pin +#define SYSCTL_PIN_C0MINUS 0x00000040 // C0- pin +#define SYSCTL_PIN_C0PLUS 0x00000080 // C0+ pin +#define SYSCTL_PIN_C0O 0x00000100 // C0o pin +#define SYSCTL_PIN_C1MINUS 0x00000200 // C1- pin +#define SYSCTL_PIN_C1PLUS 0x00000400 // C1+ pin +#define SYSCTL_PIN_C1O 0x00000800 // C1o pin +#define SYSCTL_PIN_C2MINUS 0x00001000 // C2- pin +#define SYSCTL_PIN_C2PLUS 0x00002000 // C2+ pin +#define SYSCTL_PIN_C2O 0x00004000 // C2o pin +#define SYSCTL_PIN_MC_FAULT0 0x00008000 // MC0 Fault pin +#define SYSCTL_PIN_ADC0 0x00010000 // ADC0 pin +#define SYSCTL_PIN_ADC1 0x00020000 // ADC1 pin +#define SYSCTL_PIN_ADC2 0x00040000 // ADC2 pin +#define SYSCTL_PIN_ADC3 0x00080000 // ADC3 pin +#define SYSCTL_PIN_ADC4 0x00100000 // ADC4 pin +#define SYSCTL_PIN_ADC5 0x00200000 // ADC5 pin +#define SYSCTL_PIN_ADC6 0x00400000 // ADC6 pin +#define SYSCTL_PIN_ADC7 0x00800000 // ADC7 pin +#define SYSCTL_PIN_CCP0 0x01000000 // CCP0 pin +#define SYSCTL_PIN_CCP1 0x02000000 // CCP1 pin +#define SYSCTL_PIN_CCP2 0x04000000 // CCP2 pin +#define SYSCTL_PIN_CCP3 0x08000000 // CCP3 pin +#define SYSCTL_PIN_CCP4 0x10000000 // CCP4 pin +#define SYSCTL_PIN_CCP5 0x20000000 // CCP5 pin +#define SYSCTL_PIN_32KHZ 0x80000000 // 32kHz pin + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlLDOSet() API as +// the ulVoltage value, or returned by the SysCtlLDOGet() API. +// +//***************************************************************************** +#define SYSCTL_LDO_2_25V 0x00000005 // LDO output of 2.25V +#define SYSCTL_LDO_2_30V 0x00000004 // LDO output of 2.30V +#define SYSCTL_LDO_2_35V 0x00000003 // LDO output of 2.35V +#define SYSCTL_LDO_2_40V 0x00000002 // LDO output of 2.40V +#define SYSCTL_LDO_2_45V 0x00000001 // LDO output of 2.45V +#define SYSCTL_LDO_2_50V 0x00000000 // LDO output of 2.50V +#define SYSCTL_LDO_2_55V 0x0000001f // LDO output of 2.55V +#define SYSCTL_LDO_2_60V 0x0000001e // LDO output of 2.60V +#define SYSCTL_LDO_2_65V 0x0000001d // LDO output of 2.65V +#define SYSCTL_LDO_2_70V 0x0000001c // LDO output of 2.70V +#define SYSCTL_LDO_2_75V 0x0000001b // LDO output of 2.75V + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlLDOConfigSet() API. +// +//***************************************************************************** +#define SYSCTL_LDOCFG_ARST 0x00000001 // Allow LDO failure to reset +#define SYSCTL_LDOCFG_NORST 0x00000000 // Do not reset on LDO failure + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlIntEnable(), +// SysCtlIntDisable(), and SysCtlIntClear() APIs, or returned in the bit mask +// by the SysCtlIntStatus() API. +// +//***************************************************************************** +#define SYSCTL_INT_PLL_LOCK 0x00000040 // PLL lock interrupt +#define SYSCTL_INT_CUR_LIMIT 0x00000020 // Current limit interrupt +#define SYSCTL_INT_IOSC_FAIL 0x00000010 // Internal oscillator failure int +#define SYSCTL_INT_MOSC_FAIL 0x00000008 // Main oscillator failure int +#define SYSCTL_INT_POR 0x00000004 // Power on reset interrupt +#define SYSCTL_INT_BOR 0x00000002 // Brown out interrupt +#define SYSCTL_INT_PLL_FAIL 0x00000001 // PLL failure interrupt + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlResetCauseClear() +// API or returned by the SysCtlResetCauseGet() API. +// +//***************************************************************************** +#define SYSCTL_CAUSE_LDO 0x00000020 // LDO power not OK reset +#define SYSCTL_CAUSE_SW 0x00000010 // Software reset +#define SYSCTL_CAUSE_WDOG 0x00000008 // Watchdog reset +#define SYSCTL_CAUSE_BOR 0x00000004 // Brown-out reset +#define SYSCTL_CAUSE_POR 0x00000002 // Power on reset +#define SYSCTL_CAUSE_EXT 0x00000001 // External reset + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlBrownOutConfigSet() +// API as the ulConfig parameter. +// +//***************************************************************************** +#define SYSCTL_BOR_RESET 0x00000002 // Reset instead of interrupting +#define SYSCTL_BOR_RESAMPLE 0x00000001 // Resample BOR before asserting + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlPWMClockSet() API +// as the ulConfig parameter, and can be returned by the SysCtlPWMClockGet() +// API. +// +//***************************************************************************** +#define SYSCTL_PWMDIV_1 0x00000000 // PWM clock is processor clock /1 +#define SYSCTL_PWMDIV_2 0x00100000 // PWM clock is processor clock /2 +#define SYSCTL_PWMDIV_4 0x00120000 // PWM clock is processor clock /4 +#define SYSCTL_PWMDIV_8 0x00140000 // PWM clock is processor clock /8 +#define SYSCTL_PWMDIV_16 0x00160000 // PWM clock is processor clock /16 +#define SYSCTL_PWMDIV_32 0x00180000 // PWM clock is processor clock /32 +#define SYSCTL_PWMDIV_64 0x001A0000 // PWM clock is processor clock /64 + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlADCSpeedSet() API +// as the ulSpeed parameter, and can be returned by the SyCtlADCSpeedGet() +// API. +// +//***************************************************************************** +#define SYSCTL_ADCSPEED_1MSPS 0x00000300 // 1,000,000 samples per second +#define SYSCTL_ADCSPEED_500KSPS 0x00000200 // 500,000 samples per second +#define SYSCTL_ADCSPEED_250KSPS 0x00000100 // 250,000 samples per second +#define SYSCTL_ADCSPEED_125KSPS 0x00000000 // 125,000 samples per second + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlClockSet() API as +// the ulConfig parameter. +// +//***************************************************************************** +#define SYSCTL_SYSDIV_1 0x07800000 // Processor clock is osc/pll /1 +#define SYSCTL_SYSDIV_2 0x00C00000 // Processor clock is osc/pll /2 +#define SYSCTL_SYSDIV_3 0x01400000 // Processor clock is osc/pll /3 +#define SYSCTL_SYSDIV_4 0x01C00000 // Processor clock is osc/pll /4 +#define SYSCTL_SYSDIV_5 0x02400000 // Processor clock is osc/pll /5 +#define SYSCTL_SYSDIV_6 0x02C00000 // Processor clock is osc/pll /6 +#define SYSCTL_SYSDIV_7 0x03400000 // Processor clock is osc/pll /7 +#define SYSCTL_SYSDIV_8 0x03C00000 // Processor clock is osc/pll /8 +#define SYSCTL_SYSDIV_9 0x04400000 // Processor clock is osc/pll /9 +#define SYSCTL_SYSDIV_10 0x04C00000 // Processor clock is osc/pll /10 +#define SYSCTL_SYSDIV_11 0x05400000 // Processor clock is osc/pll /11 +#define SYSCTL_SYSDIV_12 0x05C00000 // Processor clock is osc/pll /12 +#define SYSCTL_SYSDIV_13 0x06400000 // Processor clock is osc/pll /13 +#define SYSCTL_SYSDIV_14 0x06C00000 // Processor clock is osc/pll /14 +#define SYSCTL_SYSDIV_15 0x07400000 // Processor clock is osc/pll /15 +#define SYSCTL_SYSDIV_16 0x07C00000 // Processor clock is osc/pll /16 +#define SYSCTL_USE_PLL 0x00000000 // System clock is the PLL clock +#define SYSCTL_USE_OSC 0x00003800 // System clock is the osc clock +#define SYSCTL_XTAL_3_57MHZ 0x00000100 // External crystal is 3.579545MHz +#define SYSCTL_XTAL_3_68MHZ 0x00000140 // External crystal is 3.6864MHz +#define SYSCTL_XTAL_4MHZ 0x00000180 // External crystal is 4MHz +#define SYSCTL_XTAL_4_09MHZ 0x000001C0 // External crystal is 4.096MHz +#define SYSCTL_XTAL_4_91MHZ 0x00000200 // External crystal is 4.9152MHz +#define SYSCTL_XTAL_5MHZ 0x00000240 // External crystal is 5MHz +#define SYSCTL_XTAL_5_12MHZ 0x00000280 // External crystal is 5.12MHz +#define SYSCTL_XTAL_6MHZ 0x000002C0 // External crystal is 6MHz +#define SYSCTL_XTAL_6_14MHZ 0x00000300 // External crystal is 6.144MHz +#define SYSCTL_XTAL_7_37MHZ 0x00000340 // External crystal is 7.3728MHz +#define SYSCTL_XTAL_8MHZ 0x00000380 // External crystal is 8MHz +#define SYSCTL_XTAL_8_19MHZ 0x000003C0 // External crystal is 8.192MHz +#define SYSCTL_OSC_MAIN 0x00000000 // Oscillator source is main osc +#define SYSCTL_OSC_INT 0x00000010 // Oscillator source is int. osc +#define SYSCTL_OSC_INT4 0x00000020 // Oscillator source is int. osc /4 +#define SYSCTL_INT_OSC_DIS 0x00000002 // Disable internal oscillator +#define SYSCTL_MAIN_OSC_DIS 0x00000001 // Disable main oscillator + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern unsigned long SysCtlSRAMSizeGet(void); +extern unsigned long SysCtlFlashSizeGet(void); +extern tBoolean SysCtlPinPresent(unsigned long ulPin); +extern tBoolean SysCtlPeripheralPresent(unsigned long ulPeripheral); +extern void SysCtlPeripheralReset(unsigned long ulPeripheral); +extern void SysCtlPeripheralEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralSleepEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralSleepDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDeepSleepEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDeepSleepDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralClockGating(tBoolean bEnable); +extern void SysCtlIntRegister(void (*pfnHandler)(void)); +extern void SysCtlIntUnregister(void); +extern void SysCtlIntEnable(unsigned long ulInts); +extern void SysCtlIntDisable(unsigned long ulInts); +extern void SysCtlIntClear(unsigned long ulInts); +extern unsigned long SysCtlIntStatus(tBoolean bMasked); +extern void SysCtlLDOSet(unsigned long ulVoltage); +extern unsigned long SysCtlLDOGet(void); +extern void SysCtlLDOConfigSet(unsigned long ulConfig); +extern void SysCtlReset(void); +extern void SysCtlSleep(void); +extern void SysCtlDeepSleep(void); +extern unsigned long SysCtlResetCauseGet(void); +extern void SysCtlResetCauseClear(unsigned long ulCauses); +extern void SysCtlBrownOutConfigSet(unsigned long ulConfig, + unsigned long ulDelay); +extern void SysCtlClockSet(unsigned long ulConfig); +extern unsigned long SysCtlClockGet(void); +extern void SysCtlPWMClockSet(unsigned long ulConfig); +extern unsigned long SysCtlPWMClockGet(void); +extern void SysCtlADCSpeedSet(unsigned long ulSpeed); +extern unsigned long SysCtlADCSpeedGet(void); +extern void SysCtlIOSCVerificationSet(tBoolean bEnable); +extern void SysCtlMOSCVerificationSet(tBoolean bEnable); +extern void SysCtlPLLVerificationSet(tBoolean bEnable); +extern void SysCtlClkVerificationClear(void); + +#ifdef __cplusplus +} +#endif + +#endif // __SYSCTL_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/systick.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/systick.h new file mode 100644 index 000000000..f89bf65b8 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/systick.h @@ -0,0 +1,55 @@ +//***************************************************************************** +// +// systick.h - Prototypes for the SysTick driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __SYSTICK_H__ +#define __SYSTICK_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void SysTickEnable(void); +extern void SysTickDisable(void); +extern void SysTickIntRegister(void (*pfnHandler)(void)); +extern void SysTickIntUnregister(void); +extern void SysTickIntEnable(void); +extern void SysTickIntDisable(void); +extern void SysTickPeriodSet(unsigned long ulPeriod); +extern unsigned long SysTickPeriodGet(void); +extern unsigned long SysTickValueGet(void); + +#ifdef __cplusplus +} +#endif + +#endif // __SYSTICK_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/uart.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/uart.h new file mode 100644 index 000000000..a0e16db33 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/uart.h @@ -0,0 +1,104 @@ +//***************************************************************************** +// +// uart.h - Defines and Macros for the UART. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __UART_H__ +#define __UART_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to UARTIntEnable, UARTIntDisable, and UARTIntClear +// as the ulIntFlags parameter, and returned from UARTIntStatus. +// +//***************************************************************************** +#define UART_INT_OE 0x400 // Overrun Error Interrupt Mask +#define UART_INT_BE 0x200 // Break Error Interrupt Mask +#define UART_INT_PE 0x100 // Parity Error Interrupt Mask +#define UART_INT_FE 0x080 // Framing Error Interrupt Mask +#define UART_INT_RT 0x040 // Receive Timeout Interrupt Mask +#define UART_INT_TX 0x020 // Transmit Interrupt Mask +#define UART_INT_RX 0x010 // Receive Interrupt Mask + +//***************************************************************************** +// +// Values that can be passed to UARTConfigSet as the ulConfig parameter and +// returned by UARTConfigGet in the pulConfig parameter. Additionally, the +// UART_CONFIG_PAR_* subset can be passed to UARTParityModeSet as the ulParity +// parameter, and are returned by UARTParityModeGet. +// +//***************************************************************************** +#define UART_CONFIG_WLEN_8 0x00000060 // 8 bit data +#define UART_CONFIG_WLEN_7 0x00000040 // 7 bit data +#define UART_CONFIG_WLEN_6 0x00000020 // 6 bit data +#define UART_CONFIG_WLEN_5 0x00000000 // 5 bit data +#define UART_CONFIG_STOP_ONE 0x00000000 // One stop bit +#define UART_CONFIG_STOP_TWO 0x00000008 // Two stop bits +#define UART_CONFIG_PAR_NONE 0x00000000 // No parity +#define UART_CONFIG_PAR_EVEN 0x00000006 // Even parity +#define UART_CONFIG_PAR_ODD 0x00000002 // Odd parity +#define UART_CONFIG_PAR_ONE 0x00000086 // Parity bit is one +#define UART_CONFIG_PAR_ZERO 0x00000082 // Parity bit is zero + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void UARTParityModeSet(unsigned long ulBase, unsigned long ulParity); +extern unsigned long UARTParityModeGet(unsigned long ulBase); +extern void UARTConfigSet(unsigned long ulBase, unsigned long ulBaud, + unsigned long ulConfig); +extern void UARTConfigGet(unsigned long ulBase, unsigned long *pulBaud, + unsigned long *pulConfig); +extern void UARTEnable(unsigned long ulBase); +extern void UARTDisable(unsigned long ulBase); +extern void UARTEnableSIR(unsigned long ulBase, tBoolean bLowPower); +extern void UARTDisableSIR(unsigned long ulBase); +extern tBoolean UARTCharsAvail(unsigned long ulBase); +extern tBoolean UARTSpaceAvail(unsigned long ulBase); +extern long UARTCharNonBlockingGet(unsigned long ulBase); +extern long UARTCharGet(unsigned long ulBase); +extern tBoolean UARTCharNonBlockingPut(unsigned long ulBase, + unsigned char ucData); +extern void UARTCharPut(unsigned long ulBase, unsigned char ucData); +extern void UARTBreakCtl(unsigned long ulBase, tBoolean bBreakState); +extern void UARTIntRegister(unsigned long ulBase, void(*pfnHandler)(void)); +extern void UARTIntUnregister(unsigned long ulBase); +extern void UARTIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void UARTIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long UARTIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void UARTIntClear(unsigned long ulBase, unsigned long ulIntFlags); + +#ifdef __cplusplus +} +#endif + +#endif // __UART_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/ustdlib.c b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/ustdlib.c new file mode 100644 index 000000000..472f9deeb --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/ustdlib.c @@ -0,0 +1,418 @@ +//***************************************************************************** +// +// ustdlib.c - Simple standard library functions. +// +// Copyright (c) 2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +//***************************************************************************** + +#include +#include +#include "debug.h" + +//***************************************************************************** +// +//! \addtogroup utilities_api +//! @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// A mapping from an integer between 0 and 15 to its ASCII character +// equivalent. +// +//***************************************************************************** +static const char * const g_pcHex = "0123456789abcdef"; + +//***************************************************************************** +// +//! A simple sprintf function supporting \%c, \%d, \%s, \%u, \%x, and \%X. +//! +//! \param pcBuf is the buffer where the converted string is stored. +//! \param pcString is the format string. +//! \param ... are the optional arguments, which depend on the contents of the +//! format string. +//! +//! This function is very similar to the C library sprintf() function. +//! Only the following formatting characters are supported: +//! +//! - \%c to print a character +//! - \%d to print a decimal value +//! - \%s to print a string +//! - \%u to print an unsigned decimal value +//! - \%x to print a hexadecimal value using lower case letters +//! - \%X to print a hexadecimal value using lower case letters (not upper case +//! letters as would typically be used) +//! - \%\% to print out a \% character +//! +//! For \%d, \%u, \%x, and \%X, an optional number may reside between the \% +//! and the format character, which specifies the minimum number of characters +//! to use for that value; if preceeded by a 0 then the extra characters will +//! be filled with zeros instead of spaces. For example, ``\%8d'' will use +//! eight characters to print the decimal value with spaces added to reach +//! eight; ``\%08d'' will use eight characters as well but will add zeros +//! instead of spaces. +//! +//! The type of the arguments after \b pcString must match the requirements of +//! the format string. For example, if an integer was passed where a string +//! was expected, an error of some kind will most likely occur. +//! +//! The caller must ensure that the buffer pcBuf is large enough to hold the +//! entire converted string, including the null termination character. +//! +//! \return None. +// +//***************************************************************************** +void +usprintf(char *pcBuf, const char *pcString, ...) +{ + unsigned long ulIdx, ulValue, ulPos, ulCount, ulBase; + char *pcStr, cFill; + va_list vaArgP; + + // + // Check the arguments. + // + ASSERT(pcString != 0); + ASSERT(pcBuf != 0); + + // + // Start the varargs processing. + // + va_start(vaArgP, pcString); + + // + // Loop while there are more characters in the string. + // + while(*pcString) + { + // + // Find the first non-% character, or the end of the string. + // + for(ulIdx = 0; (pcString[ulIdx] != '%') && (pcString[ulIdx] != '\0'); + ulIdx++) + { + } + + // + // Write this portion of the string. + // + strncpy(pcBuf, pcString, ulIdx); + + // + // Skip the portion of the string that was written. + // + pcString += ulIdx; + pcBuf += ulIdx; + + // + // See if the next character is a %. + // + if(*pcString == '%') + { + // + // Skip the %. + // + pcString++; + + // + // Set the digit count to zero, and the fill character to space + // (i.e. to the defaults). + // + ulCount = 0; + cFill = ' '; + + // + // It may be necessary to get back here to process more characters. + // Goto's aren't pretty, but effective. I feel extremely dirty for + // using not one but two of the beasts. + // +again: + + // + // Determine how to handle the next character. + // + switch(*pcString++) + { + // + // Handle the digit characters. + // + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + // + // If this is a zero, and it is the first digit, then the + // fill character is a zero instead of a space. + // + if((pcString[-1] == '0') && (ulCount == 0)) + { + cFill = '0'; + } + + // + // Update the digit count. + // + ulCount *= 10; + ulCount += pcString[-1] - '0'; + + // + // Get the next character. + // + goto again; + } + + // + // Handle the %c command. + // + case 'c': + { + // + // Get the value from the varargs. + // + ulValue = va_arg(vaArgP, unsigned long); + + // + // Print out the character. + // + *pcBuf++ = (char)ulValue; + + // + // This command has been handled. + // + break; + } + + // + // Handle the %d command. + // + case 'd': + { + // + // Get the value from the varargs. + // + ulValue = va_arg(vaArgP, unsigned long); + + // + // Reset the buffer position. + // + ulPos = 0; + + // + // If the value is negative, make it positive and stick a + // minus sign in the beginning of the buffer. + // + if((long)ulValue < 0) + { + *pcBuf++ = '-'; + ulPos++; + ulValue = -(long)ulValue; + } + + // + // Set the base to 10. + // + ulBase = 10; + + // + // Convert the value to ASCII. + // + goto convert; + } + + // + // Handle the %s command. + // + case 's': + { + // + // Get the string pointer from the varargs. + // + pcStr = va_arg(vaArgP, char *); + + // + // Determine the length of the string. + // + for(ulIdx = 0; pcStr[ulIdx] != '\0'; ulIdx++) + { + } + + // + // Write the string. + // + strncpy(pcBuf, pcStr, ulIdx); + pcBuf += ulIdx; + + // + // This command has been handled. + // + break; + } + + // + // Handle the %u command. + // + case 'u': + { + // + // Get the value from the varargs. + // + ulValue = va_arg(vaArgP, unsigned long); + + // + // Reset the buffer position. + // + ulPos = 0; + + // + // Set the base to 10. + // + ulBase = 10; + + // + // Convert the value to ASCII. + // + goto convert; + } + + // + // Handle the %x and %X commands. Note that they are treated + // identically; i.e. %X will use lower case letters for a-f + // instead of the upper case letters is should use. + // + case 'x': + case 'X': + { + // + // Get the value from the varargs. + // + ulValue = va_arg(vaArgP, unsigned long); + + // + // Reset the buffer position. + // + ulPos = 0; + + // + // Set the base to 16. + // + ulBase = 16; + + // + // Determine the number of digits in the string version of + // the value. + // +convert: + for(ulIdx = 1; + (((ulIdx * ulBase) <= ulValue) && + (((ulIdx * ulBase) / ulBase) == ulIdx)); + ulIdx *= ulBase, ulCount--) + { + } + + // + // Provide additional padding at the beginning of the + // string conversion if needed. + // + if((ulCount > 1) && (ulCount < 16)) + { + for(ulCount--; ulCount; ulCount--) + { + *pcBuf++ = cFill; + ulPos++; + } + } + + // + // Convert the value into a string. + // + for(; ulIdx; ulIdx /= ulBase) + { + *pcBuf++ = g_pcHex[(ulValue / ulIdx) % ulBase]; + ulPos++; + } + + // + // This command has been handled. + // + break; + } + + // + // Handle the %% command. + // + case '%': + { + // + // Simply write a single %. + // + *pcBuf++ = pcString[-1]; + + // + // This command has been handled. + // + break; + } + + // + // Handle all other commands. + // + default: + { + // + // Indicate an error. + // + strncpy(pcBuf, "ERROR", 5); + pcBuf += 5; + + // + // This command has been handled. + // + break; + } + } + } + } + + // + // End the varargs processing. + // + va_end(vaArgP); + + // + // Null terminate the string in the buffer. + // + *pcBuf = 0; +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/ustdlib.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/ustdlib.h new file mode 100644 index 000000000..f950d8173 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/ustdlib.h @@ -0,0 +1,46 @@ +//***************************************************************************** +// +// uartstdlib.h - Prototypes for simple standard library functions. +// +// Copyright (c) 2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// +//***************************************************************************** + +#ifndef __UARTSTDLIB_H__ +#define __UARTSTDLIB_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void usprintf(char *, const char *pcString, ...); + +#ifdef __cplusplus +} +#endif + +#endif // __UARTSTDLIB_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/watchdog.h b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/watchdog.h new file mode 100644 index 000000000..2d0ad37a0 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/LuminaryDrivers/watchdog.h @@ -0,0 +1,63 @@ +//***************************************************************************** +// +// watchdog.h - Prototypes for the Watchdog Timer API +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __WATCHDOG_H__ +#define __WATCHDOG_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern tBoolean WatchdogRunning(unsigned long ulBase); +extern void WatchdogEnable(unsigned long ulBase); +extern void WatchdogResetEnable(unsigned long ulBase); +extern void WatchdogResetDisable(unsigned long ulBase); +extern void WatchdogLock(unsigned long ulBase); +extern void WatchdogUnlock(unsigned long ulBase); +extern tBoolean WatchdogLockState(unsigned long ulBase); +extern void WatchdogReloadSet(unsigned long ulBase, unsigned long ulLoadVal); +extern unsigned long WatchdogReloadGet(unsigned long ulBase); +extern unsigned long WatchdogValueGet(unsigned long ulBase); +extern void WatchdogIntRegister(unsigned long ulBase, void(*pfnHandler)(void)); +extern void WatchdogIntUnregister(unsigned long ulBase); +extern void WatchdogIntEnable(unsigned long ulBase); +extern unsigned long WatchdogIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void WatchdogIntClear(unsigned long ulBase); +extern void WatchdogStallDisable(unsigned long ulBase); +extern void WatchdogStallDisable(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __WATCHDOG_H__ diff --git a/Demo/CORTEX_LM3S2965_GCC/Makefile b/Demo/CORTEX_LM3S2965_GCC/Makefile new file mode 100644 index 000000000..e9bb5f2b9 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/Makefile @@ -0,0 +1,85 @@ +#****************************************************************************** +# +# Makefile - Rules for building the driver library and examples. +# +# Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +# +# Software License Agreement +# +# Luminary Micro, Inc. (LMI) is supplying this software for use solely and +# exclusively on LMI's Stellaris Family of microcontroller products. +# +# The software is owned by LMI and/or its suppliers, and is protected under +# applicable copyright laws. All rights are reserved. Any use in violation +# of the foregoing restrictions may subject the user to criminal sanctions +# under applicable laws, as well as to civil liability for the breach of the +# terms and conditions of this license. +# +# THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +# OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +# LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +# CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +# +#****************************************************************************** + +include makedefs + +RTOS_SOURCE_DIR=../../Source +DEMO_SOURCE_DIR=../Common/Minimal + +CFLAGS+=-I LuminaryDrivers -I . -I ${RTOS_SOURCE_DIR}/include -I ${RTOS_SOURCE_DIR}/portable/GCC/ARM_CM3 -I ../Common/include -D GCC_ARMCM3_LM3S102 -D inline= -D sprintf=usprintf + +VPATH=${RTOS_SOURCE_DIR}:${RTOS_SOURCE_DIR}/portable/MemMang:${RTOS_SOURCE_DIR}/portable/GCC/ARM_CM3:${DEMO_SOURCE_DIR}:LuminaryDrivers:ParTest + +OBJS=${COMPILER}/main.o \ + ${COMPILER}/list.o \ + ${COMPILER}/queue.o \ + ${COMPILER}/tasks.o \ + ${COMPILER}/port.o \ + ${COMPILER}/heap_2.o \ + ${COMPILER}/BlockQ.o \ + ${COMPILER}/PollQ.o \ + ${COMPILER}/integer.o \ + ${COMPILER}/semtest.o \ + ${COMPILER}/osram128x64x4.o \ + ${COMPILER}/blocktim.o \ + ${COMPILER}/death.o \ + ${COMPILER}/ParTest.o \ + ${COMPILER}/timertest.o \ + ${COMPILER}/ustdlib.o + +INIT_OBJS= ${COMPILER}/startup.o + +LIBS= LuminaryDrivers/libdriver.a + + +# +# The default rule, which causes init to be built. +# +all: ${COMPILER} \ + ${COMPILER}/RTOSDemo.axf \ + +# +# The rule to clean out all the build products +# + +clean: + @rm -rf ${COMPILER} ${wildcard *.bin} RTOSDemo.axf + +# +# The rule to create the target directory +# +${COMPILER}: + @mkdir ${COMPILER} + +${COMPILER}/RTOSDemo.axf: ${INIT_OBJS} ${OBJS} ${LIBS} +SCATTER_RTOSDemo=standalone.ld +ENTRY_RTOSDemo=ResetISR + +# +# +# Include the automatically generated dependency files. +# +-include ${wildcard ${COMPILER}/*.d} __dummy__ + diff --git a/Demo/CORTEX_LM3S2965_GCC/ParTest/ParTest.c b/Demo/CORTEX_LM3S2965_GCC/ParTest/ParTest.c new file mode 100644 index 000000000..f16ae6291 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/ParTest/ParTest.c @@ -0,0 +1,83 @@ +/* + FreeRTOS.org V4.3.0 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + + Also see http://www.SafeRTOS.com for an IEC 61508 compliant version along + with commercial development and support options. + *************************************************************************** +*/ + +/*----------------------------------------------------------- + * Simple parallel port IO routines. + *-----------------------------------------------------------*/ + +/* +*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Demo includes. */ +#include "partest.h" + +/* Library includes. */ +#include "hw_types.h" +#include "gpio.h" +#include "hw_memmap.h" + + +/*-----------------------------------------------------------*/ + +void vParTestInitialise( void ) +{ + GPIODirModeSet( GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_DIR_MODE_OUT ); + GPIOPadConfigSet( GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD ); + GPIOPinWrite( GPIO_PORTF_BASE, GPIO_PIN_0, 0 ); +} +/*-----------------------------------------------------------*/ + +void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue ) +{ + /* There is only one LED. */ + ( void ) uxLED; + + GPIOPinWrite( GPIO_PORTF_BASE, GPIO_PIN_0, xValue ); +} +/*-----------------------------------------------------------*/ + +unsigned portBASE_TYPE uxParTestGetLED( unsigned portBASE_TYPE uxLED ) +{ + /* There is only one LED. */ + ( void ) uxLED; + + return GPIOPinRead( GPIO_PORTF_BASE, GPIO_PIN_0 ); +} + + diff --git a/Demo/CORTEX_LM3S2965_GCC/bitmap.h b/Demo/CORTEX_LM3S2965_GCC/bitmap.h new file mode 100644 index 000000000..02ce0b365 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/bitmap.h @@ -0,0 +1,171 @@ +#ifndef BITMAP_H +#define BITMAP_H + +const unsigned char pucImage[] = +{ +0x00, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0x00, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa0, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, +0x00, 0x8f, 0xff, 0xff, 0xf8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x88, 0x88, 0x88, +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x78, 0x8f, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x88, 0x77, 0x77, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xf0, 0x00, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, +0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x08, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, +0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0x00, 0x8f, 0x00, 0xff, +0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x78, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x07, +0x00, 0x70, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, +0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0x88, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x07, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf8, +0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x8f, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0x87, 0x77, +0x77, 0x77, 0x78, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x88, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf8, 0x87, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, +0x78, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xff, 0x80, 0x00, 0x8f, 0x8f, 0xff, 0x87, 0x77, 0x77, 0x77, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, +0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x8f, 0x07, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, +0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x07, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, +0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0f, 0x00, 0x8f, 0x00, 0xff, +0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, +0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, +0x78, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x70, 0x08, 0x00, 0x88, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x88, 0x88, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, +0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x70, 0x07, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x87, 0x88, +0x88, 0x8f, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x7f, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf7, 0x88, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf7, +0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x88, 0x88, 0x88, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0x87, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, +0x00, 0x00, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, +0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x07, 0xff, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xff, 0xff, 0x88, 0x88, 0x88, 0x88, +0xff, 0xff, 0xff, 0xff, 0x88, 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x87, 0x77, 0x77, 0x77, +0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0x00, 0x0f, 0x70, 0x08, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0x00, 0x07, 0x70, 0x07, +0x88, 0x88, 0x88, 0xff, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x70, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x08, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x08, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa0, 0x00, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, +0x00 }; + +#define bmpBITMAP_HEIGHT 50 +#define bmpBITMAP_WIDTH 128 + +#endif diff --git a/Demo/CORTEX_LM3S2965_GCC/lcd_message.h b/Demo/CORTEX_LM3S2965_GCC/lcd_message.h new file mode 100644 index 000000000..ced7a1dbc --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/lcd_message.h @@ -0,0 +1,9 @@ +#ifndef LCD_MESSAGE_H +#define LCD_MESSAGE_H + +typedef struct +{ + char *pcMessage; +} xOLEDMessage; + +#endif /* LCD_MESSAGE_H */ diff --git a/Demo/CORTEX_LM3S2965_GCC/main.c b/Demo/CORTEX_LM3S2965_GCC/main.c new file mode 100644 index 000000000..9a0216cd2 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/main.c @@ -0,0 +1,313 @@ +/* + FreeRTOS.org V4.3.0 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + *************************************************************************** +*/ + + +/* + * Creates all the demo application tasks, then starts the scheduler. The WEB + * documentation provides more details of the standard demo application tasks. + * In addition to the standard demo tasks, the following tasks and tests are + * defined and/or created within this file: + * + * "Fast Interrupt Test" - A high frequency periodic interrupt is generated + * using a free running timer to demonstrate the use of the + * configKERNEL_INTERRUPT_PRIORITY configuration constant. The interrupt + * service routine measures the number of processor clocks that occur between + * each interrupt - and in so doing measures the jitter in the interrupt timing. + * The maximum measured jitter time is latched in the ulMaxJitter variable, and + * displayed on the OLED display by the 'Check' task as described below. The + * fast interrupt is configured and handled in the timertest.c source file. + * + * "OLED" task - the OLED task is a 'gatekeeper' task. It is the only task that + * is permitted to access the display directly. Other tasks wishing to write a + * message to the OLED send the message on a queue to the OLED task instead of + * accessing the OLED themselves. The OLED task just blocks on the queue waiting + * for messages - waking and displaying the messages as they arrive. + * + * "Check" task - This only executes every five seconds but has the highest + * priority so is guaranteed to get processor time. Its main function is to + * check that all the standard demo tasks are still operational. Should any + * unexpected behaviour within a demo task be discovered the 'check' task will + * write an error to the OLED (via the OLED task). If all the demo tasks are + * executing with their expected behaviour then the check task writes PASS + * along with the max jitter time to the OLED (again via the OLED task), as + * described above. + * + */ + + + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "Task.h" +#include "queue.h" +#include "semphr.h" + +/* Demo app includes. */ +#include "BlockQ.h" +#include "death.h" +#include "integer.h" +#include "blocktim.h" +#include "flash.h" +#include "partest.h" +#include "semtest.h" +#include "pollq.h" +#include "lcd_message.h" +#include "bitmap.h" + +/* Hardware library includes. */ +#include "hw_memmap.h" +#include "hw_types.h" +#include "sysctl.h" +#include "gpio.h" +#include "osram128x64x4.h" + +/*-----------------------------------------------------------*/ + +/* The time between cycles of the 'check' task. */ +#define mainCHECK_DELAY ( ( portTickType ) 5000 / portTICK_RATE_MS ) + +/* The check task uses the sprintf function so requires a little more stack too. */ +#define mainCHECK_TASK_STACK_SIZE ( configMINIMAL_STACK_SIZE + 50 ) + +/* Task priorities. */ +#define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2 ) +#define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 ) +#define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 ) +#define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 ) +#define mainCREATOR_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 ) +#define mainINTEGER_TASK_PRIORITY ( tskIDLE_PRIORITY ) + +/* The maximum number of message that can be waiting for display at any one +time. */ +#define mainOLED_QUEUE_SIZE ( 3 ) + +/* Dimensions the buffer into which the jitter time is written. */ +#define mainMAX_MSG_LEN 25 + +/* The period of the system clock in nano seconds. This is used to calculate +the jitter time in nano seconds. */ +#define mainNS_PER_CLOCK ( ( unsigned portLONG ) ( ( 1.0 / ( double ) configCPU_CLOCK_HZ ) * 1000000000.0 ) ) + +/* Constants used when writing strings to the display. */ +#define mainCHARACTER_HEIGHT ( 9 ) +#define mainMAX_ROWS ( mainCHARACTER_HEIGHT * 7 ) +#define mainFULL_SCALE ( 15 ) +#define ulSSI_FREQUENCY 1000000 + +/*-----------------------------------------------------------*/ + +/* + * Checks the status of all the demo tasks then prints a message to the + * display. The message will be either PASS - an include in brackets the + * maximum measured jitter time (as described at the to of the file), or a + * message that describes which of the standard demo tasks an error has been + * discovered in. + * + * Messages are not written directly to the terminal, but passed to vOLEDTask + * via a queue. + */ +static void vCheckTask( void *pvParameters ); + +/* + * The display is written two by more than one task so is controlled by a + * 'gatekeeper' task. This is the only task that is actually permitted to + * access the display directly. Other tasks wanting to display a message send + * the message to the gatekeeper. + */ +static void vOLEDTask( void *pvParameters ); + +/* + * Configure the hardware for the demo. + */ +static void prvSetupHardware( void ); + +/* + * Configures the high frequency timers - those used to measure the timing + * jitter while the real time kernel is executing. + */ +extern void vSetupTimer( void ); + +/*-----------------------------------------------------------*/ + +/* The queue used to send messages to the OLED task. */ +xQueueHandle xOLEDQueue; + +/* The welcome text. */ +const portCHAR * const pcWelcomeMessage = " www.FreeRTOS.org"; + +/*-----------------------------------------------------------*/ + +int main( void ) +{ + prvSetupHardware(); + + /* Create the queue used by the OLED task. Messages for display on the OLED + are received via this queue. */ + xOLEDQueue = xQueueCreate( mainOLED_QUEUE_SIZE, sizeof( xOLEDMessage ) ); + + /* Start the standard demo tasks. */ + vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY ); + vCreateBlockTimeTasks(); + vStartSemaphoreTasks( mainSEM_TEST_PRIORITY ); + vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY ); + vStartIntegerMathTasks( mainINTEGER_TASK_PRIORITY ); + + /* Start the tasks defined within this file/specific to this demo. */ + xTaskCreate( vCheckTask, ( signed portCHAR * ) "Check", mainCHECK_TASK_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL ); + xTaskCreate( vOLEDTask, ( signed portCHAR * ) "OLED", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL ); + + /* The suicide tasks must be created last as they need to know how many + tasks were running prior to their creation in order to ascertain whether + or not the correct/expected number of tasks are running at any given time. */ + vCreateSuicidalTasks( mainCREATOR_TASK_PRIORITY ); + + /* Configure the high frequency interrupt used to measure the interrupt + jitter time. */ + #ifdef __ICCARM__ + vSetupTimer(); + #endif + + /* Start the scheduler. */ + vTaskStartScheduler(); + + /* Will only get here if there was insufficient memory to create the idle + task. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void prvSetupHardware( void ) +{ + /* Set the clocking to run from the PLL at 50 MHz */ + SysCtlClockSet( SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ ); + + /* Enable Port F for Ethernet LEDs + LED0 Bit 3 Output + LED1 Bit 2 Output */ + SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOF ); + GPIODirModeSet( GPIO_PORTF_BASE, (GPIO_PIN_2 | GPIO_PIN_3), GPIO_DIR_MODE_HW ); + GPIOPadConfigSet( GPIO_PORTF_BASE, (GPIO_PIN_2 | GPIO_PIN_3 ), GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD ); + + vParTestInitialise(); +} +/*-----------------------------------------------------------*/ + +static void vCheckTask( void *pvParameters ) +{ +portTickType xLastExecutionTime; +xOLEDMessage xMessage; +static portCHAR cPassMessage[ mainMAX_MSG_LEN ]; +extern unsigned portLONG ulMaxJitter; + + xLastExecutionTime = xTaskGetTickCount(); + xMessage.pcMessage = cPassMessage; + + for( ;; ) + { + /* Perform this check every mainCHECK_DELAY milliseconds. */ + vTaskDelayUntil( &xLastExecutionTime, mainCHECK_DELAY ); + + /* Has an error been found in any task? */ + + if( xAreBlockingQueuesStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN BLOCK Q"; + } + else if( xAreBlockTimeTestTasksStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN BLOCK TIME"; + } + else if( xAreSemaphoreTasksStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN SEMAPHORE"; + } + else if( xArePollingQueuesStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN POLL Q"; + } + else if( xIsCreateTaskStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN CREATE"; + } + else if( xAreIntegerMathsTaskStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN MATH"; + } + else + { + #ifdef __ICCARM__ + sprintf( cPassMessage, "PASS [%uns]", ulMaxJitter * mainNS_PER_CLOCK ); + #else + sprintf( cPassMessage, "PASS" ); + #endif + } + + /* Send the message to the OLED gatekeeper for display. */ + xQueueSend( xOLEDQueue, &xMessage, portMAX_DELAY ); + } +} +/*-----------------------------------------------------------*/ + + + +void vOLEDTask( void *pvParameters ) +{ +xOLEDMessage xMessage; +unsigned portLONG ulY = mainMAX_ROWS; + + /* Initialise the OLED and display a startup message. */ + OSRAM128x64x4Init( ulSSI_FREQUENCY ); + + OSRAM128x64x4StringDraw( " POWERED BY FreeRTOS", 0, 0, mainFULL_SCALE ); + OSRAM128x64x4ImageDraw( pucImage, 0, mainCHARACTER_HEIGHT + 1, bmpBITMAP_WIDTH, bmpBITMAP_HEIGHT ); + + for( ;; ) + { + /* Wait for a message to arrive that requires displaying. */ + xQueueReceive( xOLEDQueue, &xMessage, portMAX_DELAY ); + + /* Write the message on the next available row. */ + ulY += mainCHARACTER_HEIGHT; + if( ulY >= mainMAX_ROWS ) + { + ulY = mainCHARACTER_HEIGHT; + OSRAM128x64x4Clear(); + OSRAM128x64x4StringDraw( pcWelcomeMessage, 0, 0, mainFULL_SCALE ); + } + + /* Display the message. */ + OSRAM128x64x4StringDraw( xMessage.pcMessage, 0, ulY, mainFULL_SCALE ); + } +} diff --git a/Demo/CORTEX_LM3S2965_GCC/makedefs b/Demo/CORTEX_LM3S2965_GCC/makedefs new file mode 100644 index 000000000..efd7530d4 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/makedefs @@ -0,0 +1,208 @@ +#****************************************************************************** +# +# makedefs - Definitions common to all makefiles. +# +# Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +# +# Software License Agreement +# +# Luminary Micro, Inc. (LMI) is supplying this software for use solely and +# exclusively on LMI's Stellaris Family of microcontroller products. +# +# The software is owned by LMI and/or its suppliers, and is protected under +# applicable copyright laws. All rights are reserved. Any use in violation +# of the foregoing restrictions may subject the user to criminal sanctions +# under applicable laws, as well as to civil liability for the breach of the +# terms and conditions of this license. +# +# THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +# OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +# LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +# CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +# +#****************************************************************************** + +#****************************************************************************** +# +# Get the operating system name. If this is Cygwin, the .d files will be +# munged to convert c: into /cygdrive/c so that "make" will be happy with the +# auto-generated dependencies. +# +#****************************************************************************** +os:=${shell uname -s} + +#****************************************************************************** +# +# The compiler to be used. +# +#****************************************************************************** +ifndef COMPILER +COMPILER=gcc +endif + +#****************************************************************************** +# +# The debugger to be used. +# +#****************************************************************************** +ifndef DEBUGGER +DEBUGGER=gdb +endif + +#****************************************************************************** +# +# Definitions for using GCC. +# +#****************************************************************************** +ifeq (${COMPILER}, gcc) + +# +# The command for calling the compiler. +# +CC=arm-stellaris-eabi-gcc + +# +# The flags passed to the assembler. +# +AFLAGS=-mthumb \ + -mcpu=cortex-m3 \ + -MD + +# +# The flags passed to the compiler. +# +CFLAGS=-mthumb \ + -mcpu=cortex-m3 \ + -O2 \ + -MD + +# +# The command for calling the library archiver. +# +AR=arm-stellaris-eabi-ar + +# +# The command for calling the linker. +# +LD=arm-stellaris-eabi-ld + +# +# The flags passed to the linker. +# +LDFLAGS= -Map gcc/out.map + +# +# Get the location of libgcc.a from the GCC front-end. +# +LIBGCC=${shell ${CC} -mthumb -march=armv6t2 -print-libgcc-file-name} + +# +# Get the location of libc.a from the GCC front-end. +# +LIBC=${shell ${CC} -mthumb -march=armv6t2 -print-file-name=libc.a} + +# +# The command for extracting images from the linked executables. +# +OBJCOPY=arm-stellaris-eabi-objcopy + +endif + +#****************************************************************************** +# +# Tell the compiler to include debugging information if the DEBUG environment +# variable is set. +# +#****************************************************************************** +ifdef DEBUG +CFLAGS += -g +endif + +#****************************************************************************** +# +# The rule for building the object file from each C source file. +# +#****************************************************************************** +${COMPILER}/%.o: %.c + @if [ 'x${VERBOSE}' = x ]; \ + then \ + echo " CC ${<}"; \ + else \ + echo ${CC} ${CFLAGS} -D${COMPILER} -o ${@} -c ${<}; \ + fi + @${CC} ${CFLAGS} -D${COMPILER} -o ${@} -c ${<} +ifeq (${COMPILER}, rvds) + @mv -f ${notdir ${@:.o=.d}} ${COMPILER} +endif +ifneq ($(findstring CYGWIN, ${os}), ) + @perl -i.bak -p -e 's/[Cc]:/\/cygdrive\/c/g' ${@:.o=.d} +endif + +#****************************************************************************** +# +# The rule for building the object file from each assembly source file. +# +#****************************************************************************** +${COMPILER}/%.o: %.S + @if [ 'x${VERBOSE}' = x ]; \ + then \ + echo " CC ${<}"; \ + else \ + echo ${CC} ${AFLAGS} -D${COMPILER} -o ${@} -c ${<}; \ + fi +ifeq (${COMPILER}, rvds) + @${CC} ${AFLAGS} -D${COMPILER} -E ${<} > ${@:.o=_.S} + @${CC} ${AFLAGS} -o ${@} -c ${@:.o=_.S} + @rm ${@:.o=_.S} + @${CC} ${AFLAGS} -D${COMPILER} --md -E ${<} + @sed 's,,${@},g' ${notdir ${<:.S=.d}} > ${@:.o=.d} + @rm ${notdir ${<:.S=.d}} +endif +ifeq (${COMPILER}, gcc) + @${CC} ${AFLAGS} -D${COMPILER} -o ${@} -c ${<} +endif +ifneq ($(findstring CYGWIN, ${os}), ) + @perl -i.bak -p -e 's/[Cc]:/\/cygdrive\/c/g' ${@:.o=.d} +endif + +#****************************************************************************** +# +# The rule for creating an object library. +# +#****************************************************************************** +${COMPILER}/%.a: + @if [ 'x${VERBOSE}' = x ]; \ + then \ + echo " AR ${@}"; \ + else \ + echo ${AR} -cr ${@} ${^}; \ + fi + @${AR} -cr ${@} ${^} + +#****************************************************************************** +# +# The rule for linking the application. +# +#****************************************************************************** +${COMPILER}/%.axf: + @if [ 'x${VERBOSE}' = x ]; \ + then \ + echo " LD ${@}"; \ + fi +ifeq (${COMPILER}, gcc) + @if [ 'x${VERBOSE}' != x ]; \ + then \ + echo ${LD} -T ${SCATTER_${notdir ${@:.axf=}}} \ + --entry ${ENTRY_${notdir ${@:.axf=}}} \ + ${LDFLAGSgcc_${notdir ${@:.axf=}}} \ + ${LDFLAGS} -o ${@} ${^} \ + '${LIBC}' '${LIBGCC}'; \ + fi + @${LD} -T ${SCATTER_${notdir ${@:.axf=}}} \ + --entry ${ENTRY_${notdir ${@:.axf=}}} \ + ${LDFLAGSgcc_${notdir ${@:.axf=}}} \ + ${LDFLAGS} -o ${@} ${^} \ + '${LIBC}' '${LIBGCC}' + @${OBJCOPY} -O binary ${@} ${@:.axf=.bin} +endif diff --git a/Demo/CORTEX_LM3S2965_GCC/standalone.ld b/Demo/CORTEX_LM3S2965_GCC/standalone.ld new file mode 100644 index 000000000..35111445b --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/standalone.ld @@ -0,0 +1,60 @@ +/****************************************************************************** + * + * standalone.ld - Linker script for applications using startup.c and + * DriverLib. + * + * Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. + * + * Software License Agreement + * + * Luminary Micro, Inc. (LMI) is supplying this software for use solely and + * exclusively on LMI's microcontroller products. + * + * The software is owned by LMI and/or its suppliers, and is protected under + * applicable copyright laws. All rights are reserved. Any use in violation + * of the foregoing restrictions may subject the user to criminal sanctions + * under applicable laws, as well as to civil liability for the breach of the + * terms and conditions of this license. + * + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 1392 of the Stellaris Peripheral Driver Library. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 256K + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 64K +} + +SECTIONS +{ + .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/Demo/CORTEX_LM3S2965_GCC/startup.c b/Demo/CORTEX_LM3S2965_GCC/startup.c new file mode 100644 index 000000000..7530af16d --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/startup.c @@ -0,0 +1,234 @@ +//***************************************************************************** +// +// startup.c - Boot code for Stellaris. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1392 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +// 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); +extern void xPortPendSVHandler(void); +extern void xPortSysTickHandler(void); +extern void Timer0IntHandler(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +#ifndef STACK_SIZE +#define STACK_SIZE 64 +#endif +static unsigned long pulStack[STACK_SIZE]; + +//***************************************************************************** +// +// The minimal vector table for a Cortex M3. Note that the proper constructs +// must be placed on this to ensure that it ends up at physical address +// 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((unsigned long)pulStack + sizeof(pulStack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // 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, // SSI Rx and Tx + IntDefaultHandler, // I2C Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder + 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 + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 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 + IntDefaultHandler, // Ethernet + IntDefaultHandler // Hibernate +}; + +//***************************************************************************** +// +// 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 unsigned long _etext; +extern unsigned long _data; +extern unsigned long _edata; +extern unsigned long _bss; +extern unsigned long _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 main() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + unsigned long *pulSrc, *pulDest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pulSrc = &_etext; + for(pulDest = &_data; pulDest < &_edata; ) + { + *pulDest++ = *pulSrc++; + } + + // + // Zero fill the bss segment. + // + for(pulDest = &_bss; pulDest < &_ebss; ) + { + *pulDest++ = 0; + } + + // + // 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/Demo/CORTEX_LM3S2965_GCC/timertest.c b/Demo/CORTEX_LM3S2965_GCC/timertest.c new file mode 100644 index 000000000..2eddbfcda --- /dev/null +++ b/Demo/CORTEX_LM3S2965_GCC/timertest.c @@ -0,0 +1,133 @@ +/* + FreeRTOS.org V4.3.0 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + + Also see http://www.SafeRTOS.com for an IEC 61508 compliant version along + with commercial development and support options. + *************************************************************************** +*/ + +/* High speed timer test as described in main.c. */ + +/* Scheduler includes. */ +#include "FreeRTOS.h" + +/* Library includes. */ +#include "hw_ints.h" +#include "hw_memmap.h" +#include "hw_types.h" +#include "interrupt.h" +#include "sysctl.h" +#include "LMI_timer.h" + +/* The set frequency of the interrupt. Deviations from this are measured as +the jitter. */ +#define timerINTERRUPT_FREQUENCY ( 20000UL ) + +/* The expected time between each of the timer interrupts - if the jitter was +zero. */ +#define timerEXPECTED_DIFFERENCE_VALUE ( configCPU_CLOCK_HZ / timerINTERRUPT_FREQUENCY ) + +/* The highest available interrupt priority. */ +#define timerHIGHEST_PRIORITY ( 0 ) + +/* Misc defines. */ +#define timerMAX_32BIT_VALUE ( 0xffffffffUL ) +#define timerTIMER_1_COUNT_VALUE ( * ( ( unsigned long * ) ( TIMER1_BASE + 0x48 ) ) ) + +/*-----------------------------------------------------------*/ + +/* Interrupt handler in which the jitter is measured. */ +void Timer0IntHandler( void ); + +/* Stores the value of the maximum recorded jitter between interrupts. */ +unsigned portLONG ulMaxJitter = 0; + +/*-----------------------------------------------------------*/ + +void vSetupTimer( void ) +{ +unsigned long ulFrequency; + + /* Timer zero is used to generate the interrupts, and timer 1 is used + to measure the jitter. */ + SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER0 ); + SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER1 ); + TimerConfigure( TIMER0_BASE, TIMER_CFG_32_BIT_PER ); + TimerConfigure( TIMER1_BASE, TIMER_CFG_32_BIT_PER ); + + /* Set the timer interrupt to be above the kernel - highest. */ + IntPrioritySet( INT_TIMER0A, timerHIGHEST_PRIORITY ); + + /* Just used to measure time. */ + TimerLoadSet(TIMER1_BASE, TIMER_A, timerMAX_32BIT_VALUE ); + + /* The rate at which the timer will interrupt. */ + ulFrequency = configCPU_CLOCK_HZ / timerINTERRUPT_FREQUENCY; + TimerLoadSet( TIMER0_BASE, TIMER_A, ulFrequency ); + IntEnable( INT_TIMER0A ); + TimerIntEnable( TIMER0_BASE, TIMER_TIMA_TIMEOUT ); + + /* Enable both timers. */ + TimerEnable( TIMER0_BASE, TIMER_A ); + TimerEnable( TIMER1_BASE, TIMER_A ); +} +/*-----------------------------------------------------------*/ + +void Timer0IntHandler( void ) +{ +unsigned portLONG ulDifference, ulCurrentCount; +static portLONG ulMaxDifference = 0, ulLastCount = 0; + + /* We use the timer 1 counter value to measure the clock cycles between + the timer 0 interrupts. */ + ulCurrentCount = timerTIMER_1_COUNT_VALUE; + + if( ulCurrentCount < ulLastCount ) + { + /* How many times has timer 1 counted since the last interrupt? */ + ulDifference = ulLastCount - ulCurrentCount; + + /* Is this the largest difference we have measured yet? */ + if( ulDifference > ulMaxDifference ) + { + ulMaxDifference = ulDifference; + ulMaxJitter = ulMaxDifference - timerEXPECTED_DIFFERENCE_VALUE; + } + } + + ulLastCount = ulCurrentCount; + + TimerIntClear( TIMER0_BASE, TIMER_TIMA_TIMEOUT ); +} + + + + + diff --git a/Demo/CORTEX_LM3S2965_IAR/FreeRTOSConfig.h b/Demo/CORTEX_LM3S2965_IAR/FreeRTOSConfig.h new file mode 100644 index 000000000..d17c161ba --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/FreeRTOSConfig.h @@ -0,0 +1,80 @@ +/* + FreeRTOS.org V4.3.0 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + + Also see http://www.SafeRTOS.com for an IEC 61508 compliant version along + with commercial development and support options. + *************************************************************************** +*/ + +#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. + *----------------------------------------------------------*/ + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 0 +#define configUSE_TICK_HOOK 0 +#define configCPU_CLOCK_HZ ( ( unsigned portLONG ) 50000000 ) +#define configTICK_RATE_HZ ( ( portTickType ) 1000 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned portSHORT ) 70 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 12000 ) ) +#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 1 + +#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 ) +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +/* 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 0 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 + + +#define configKERNEL_INTERRUPT_PRIORITY 255 + + +#endif /* FREERTOS_CONFIG_H */ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/LM3Sxxx.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/LM3Sxxx.h new file mode 100644 index 000000000..11952d416 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/LM3Sxxx.h @@ -0,0 +1,64 @@ +//***************************************************************************** +// +// LM3Sxxx.h - Header file for Luminary Micro LM3Sxxx microcontrollers. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __LM3SXXX_H__ +#define __LM3SXXX_H__ + +#include "hw_adc.h" +#include "hw_comp.h" +#include "hw_flash.h" +#include "hw_gpio.h" +#include "hw_i2c.h" +#include "hw_ints.h" +#include "hw_memmap.h" +#include "hw_nvic.h" +#include "hw_pwm.h" +#include "hw_qei.h" +#include "hw_ssi.h" +#include "hw_sysctl.h" +#include "hw_timer.h" +#include "hw_types.h" +#include "hw_uart.h" +#include "hw_watchdog.h" +#include "adc.h" +#include "comp.h" +#include "cpu.h" +#include "debug.h" +#include "flash.h" +#include "gpio.h" +#include "i2c.h" +#include "interrupt.h" +#include "pwm.h" +#include "qei.h" +#include "ssi.h" +#include "sysctl.h" +#include "systick.h" +#include "timer.h" +#include "uart.h" +#include "watchdog.h" + +#endif // __LM3SXXX_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/LM3Sxxxx.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/LM3Sxxxx.h new file mode 100644 index 000000000..bafb07cda --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/LM3Sxxxx.h @@ -0,0 +1,70 @@ +//***************************************************************************** +// +// LM3Sxxxx.h - Header file for Luminary Micro LM3Sxxxx microcontrollers. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __LM3SXXXX_H__ +#define __LM3SXXXX_H__ + +#include "hw_adc.h" +#include "hw_can.h" +#include "hw_comp.h" +#include "hw_ethernet.h" +#include "hw_flash.h" +#include "hw_gpio.h" +#include "hw_hibernate.h" +#include "hw_i2c.h" +#include "hw_ints.h" +#include "hw_memmap.h" +#include "hw_nvic.h" +#include "hw_pwm.h" +#include "hw_qei.h" +#include "hw_ssi.h" +#include "hw_sysctl.h" +#include "hw_timer.h" +#include "hw_types.h" +#include "hw_uart.h" +#include "hw_watchdog.h" +#include "adc.h" +#include "can.h" +#include "comp.h" +#include "cpu.h" +#include "debug.h" +#include "ethernet.h" +#include "flash.h" +#include "gpio.h" +#include "hibernate.h" +#include "i2c.h" +#include "interrupt.h" +#include "pwm.h" +#include "qei.h" +#include "ssi.h" +#include "sysctl.h" +#include "systick.h" +#include "timer.h" +#include "uart.h" +#include "watchdog.h" + +#endif // __LM3SXXXX_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/_flash.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/_flash.h new file mode 100644 index 000000000..75d30c41c --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/_flash.h @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// flash.h - Prototypes for the flash driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __FLASH_H__ +#define __FLASH_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to FlashProtectSet(), and returned by +// FlashProtectGet(). +// +//***************************************************************************** +typedef enum +{ + FlashReadWrite, // Flash can be read and written + FlashReadOnly, // Flash can only be read + FlashExecuteOnly // Flash can only be executed +} +tFlashProtection; + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern unsigned long FlashUsecGet(void); +extern void FlashUsecSet(unsigned long ulClocks); +extern long FlashErase(unsigned long ulAddress); +extern long FlashProgram(unsigned long *pulData, unsigned long ulAddress, + unsigned long ulCount); +extern tFlashProtection FlashProtectGet(unsigned long ulAddress); +extern long FlashProtectSet(unsigned long ulAddress, + tFlashProtection eProtect); +extern long FlashProtectSave(void); +extern long FlashUserGet(unsigned long *pulUser0, unsigned long *pulUser1); +extern long FlashUserSet(unsigned long ulUser0, unsigned long ulUser1); +extern long FlashUserSave(void); +extern void FlashIntRegister(void (*pfnHandler)(void)); +extern void FlashIntUnregister(void); +extern void FlashIntEnable(unsigned long ulIntFlags); +extern void FlashIntDisable(unsigned long ulIntFlags); +extern unsigned long FlashIntGetStatus(tBoolean bMasked); +extern void FlashIntClear(unsigned long ulIntFlags); + +#ifdef __cplusplus +} +#endif + +#endif // __FLASH_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/_timer.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/_timer.h new file mode 100644 index 000000000..85b3160ab --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/_timer.h @@ -0,0 +1,137 @@ +//***************************************************************************** +// +// timer.h - Prototypes for the timer module +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __TIMER_H__ +#define __TIMER_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to TimerConfigure as the ulConfig parameter. +// +//***************************************************************************** +#define TIMER_CFG_32_BIT_OS 0x00000001 // 32-bit one-shot timer +#define TIMER_CFG_32_BIT_PER 0x00000002 // 32-bit periodic timer +#define TIMER_CFG_32_RTC 0x01000000 // 32-bit RTC timer +#define TIMER_CFG_16_BIT_PAIR 0x04000000 // Two 16-bit timers +#define TIMER_CFG_A_ONE_SHOT 0x00000001 // Timer A one-shot timer +#define TIMER_CFG_A_PERIODIC 0x00000002 // Timer A periodic timer +#define TIMER_CFG_A_CAP_COUNT 0x00000003 // Timer A event counter +#define TIMER_CFG_A_CAP_TIME 0x00000007 // Timer A event timer +#define TIMER_CFG_A_PWM 0x0000000A // Timer A PWM output +#define TIMER_CFG_B_ONE_SHOT 0x00000100 // Timer B one-shot timer +#define TIMER_CFG_B_PERIODIC 0x00000200 // Timer B periodic timer +#define TIMER_CFG_B_CAP_COUNT 0x00000300 // Timer B event counter +#define TIMER_CFG_B_CAP_TIME 0x00000700 // Timer B event timer +#define TIMER_CFG_B_PWM 0x00000A00 // Timer B PWM output + +//***************************************************************************** +// +// Values that can be passed to TimerIntEnable, TimerIntDisable, and +// TimerIntClear as the ulIntFlags parameter, and returned from TimerIntStatus. +// +//***************************************************************************** +#define TIMER_CAPB_EVENT 0x00000400 // CaptureB event interrupt +#define TIMER_CAPB_MATCH 0x00000200 // CaptureB match interrupt +#define TIMER_TIMB_TIMEOUT 0x00000100 // TimerB time out interrupt +#define TIMER_RTC_MATCH 0x00000008 // RTC interrupt mask +#define TIMER_CAPA_EVENT 0x00000004 // CaptureA event interrupt +#define TIMER_CAPA_MATCH 0x00000002 // CaptureA match interrupt +#define TIMER_TIMA_TIMEOUT 0x00000001 // TimerA time out interrupt + +//***************************************************************************** +// +// Values that can be passed to TimerControlEvent as the ulEvent parameter. +// +//***************************************************************************** +#define TIMER_EVENT_POS_EDGE 0x00000000 // Count positive edges +#define TIMER_EVENT_NEG_EDGE 0x00000404 // Count negative edges +#define TIMER_EVENT_BOTH_EDGES 0x00000C0C // Count both edges + +//***************************************************************************** +// +// Values that can be passed to most of the timer APIs as the ulTimer +// parameter. +// +//***************************************************************************** +#define TIMER_A 0x000000ff // Timer A +#define TIMER_B 0x0000ff00 // Timer B +#define TIMER_BOTH 0x0000ffff // Timer Both + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void TimerEnable(unsigned long ulBase, unsigned long ulTimer); +extern void TimerDisable(unsigned long ulBase, unsigned long ulTimer); +extern void TimerConfigure(unsigned long ulBase, unsigned long ulConfig); +extern void TimerControlLevel(unsigned long ulBase, unsigned long ulTimer, + tBoolean bInvert); +extern void TimerControlTrigger(unsigned long ulBase, unsigned long ulTimer, + tBoolean bEnable); +extern void TimerControlEvent(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulEvent); +extern void TimerControlStall(unsigned long ulBase, unsigned long ulTimer, + tBoolean bStall); +extern void TimerRTCEnable(unsigned long ulBase); +extern void TimerRTCDisable(unsigned long ulBase); +extern void TimerPrescaleSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerPrescaleGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerPrescaleMatchSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerPrescaleMatchGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerLoadSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerLoadGet(unsigned long ulBase, unsigned long ulTimer); +extern unsigned long TimerValueGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerMatchSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerMatchGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerIntRegister(unsigned long ulBase, unsigned long ulTimer, + void (*pfnHandler)(void)); +extern void TimerIntUnregister(unsigned long ulBase, unsigned long ulTimer); +extern void TimerIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void TimerIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long TimerIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void TimerIntClear(unsigned long ulBase, unsigned long ulIntFlags); +extern void TimerQuiesce(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __TIMER_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/adc.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/adc.h new file mode 100644 index 000000000..7533ccfd8 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/adc.h @@ -0,0 +1,130 @@ +//***************************************************************************** +// +// adc.h - ADC headers for using the ADC driver functions. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __ADC_H__ +#define __ADC_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to ADCSequenceConfigure as the ulTrigger +// parameter. +// +//***************************************************************************** +#define ADC_TRIGGER_PROCESSOR 0x00000000 // Processor event +#define ADC_TRIGGER_COMP0 0x00000001 // Analog comparator 0 event +#define ADC_TRIGGER_COMP1 0x00000002 // Analog comparator 1 event +#define ADC_TRIGGER_COMP2 0x00000003 // Analog comparator 2 event +#define ADC_TRIGGER_EXTERNAL 0x00000004 // External event +#define ADC_TRIGGER_TIMER 0x00000005 // Timer event +#define ADC_TRIGGER_PWM0 0x00000006 // PWM0 event +#define ADC_TRIGGER_PWM1 0x00000007 // PWM1 event +#define ADC_TRIGGER_PWM2 0x00000008 // PWM2 event +#define ADC_TRIGGER_ALWAYS 0x0000000F // Always event + +//***************************************************************************** +// +// Values that can be passed to ADCSequenceStepConfigure as the ulConfig +// parameter. +// +//***************************************************************************** +#define ADC_CTL_TS 0x00000080 // Temperature sensor select +#define ADC_CTL_IE 0x00000040 // Interrupt enable +#define ADC_CTL_END 0x00000020 // Sequence end select +#define ADC_CTL_D 0x00000010 // Differential select +#define ADC_CTL_CH0 0x00000000 // Input channel 0 +#define ADC_CTL_CH1 0x00000001 // Input channel 1 +#define ADC_CTL_CH2 0x00000002 // Input channel 2 +#define ADC_CTL_CH3 0x00000003 // Input channel 3 +#define ADC_CTL_CH4 0x00000004 // Input channel 4 +#define ADC_CTL_CH5 0x00000005 // Input channel 5 +#define ADC_CTL_CH6 0x00000006 // Input channel 6 +#define ADC_CTL_CH7 0x00000007 // Input channel 7 + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void ADCIntRegister(unsigned long ulBase, unsigned long ulSequenceNum, + void (*pfnHandler)(void)); +extern void ADCIntUnregister(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCIntDisable(unsigned long ulBase, unsigned long ulSequenceNum); +extern void ADCIntEnable(unsigned long ulBase, unsigned long ulSequenceNum); +extern unsigned long ADCIntStatus(unsigned long ulBase, + unsigned long ulSequenceNum, + tBoolean bMasked); +extern void ADCIntClear(unsigned long ulBase, unsigned long ulSequenceNum); +extern void ADCSequenceEnable(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCSequenceDisable(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCSequenceConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulTrigger, + unsigned long ulPriority); +extern void ADCSequenceStepConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulStep, + unsigned long ulConfig); +extern long ADCSequenceOverflow(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCSequenceOverflowClear(unsigned long ulBase, + unsigned long ulSequenceNum); +extern long ADCSequenceUnderflow(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCSequenceUnderflowClear(unsigned long ulBase, + unsigned long ulSequenceNum); +extern long ADCSequenceDataGet(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long *pulBuffer); +extern void ADCProcessorTrigger(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCSoftwareOversampleConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulFactor); +extern void ADCSoftwareOversampleStepConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulStep, + unsigned long ulConfig); +extern void ADCSoftwareOversampleDataGet(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long *pulBuffer, + unsigned long ulCount); +extern void ADCHardwareOversampleConfigure(unsigned long ulBase, + unsigned long ulFactor); + +#ifdef __cplusplus +} +#endif + +#endif // __ADC_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/can.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/can.h new file mode 100644 index 000000000..bdd623304 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/can.h @@ -0,0 +1,441 @@ +//***************************************************************************** +// +// can.h - Defines and Macros for the CAN controller. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __CAN_H__ +#define __CAN_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup can_api +//! @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// Miscellaneous defines for Message ID Types +// +//***************************************************************************** + +//***************************************************************************** +// +//! These are the flags used by the tCANMsgObject variable when calling the +//! the CANMessageSet() and CANMessageGet() APIs. +// +//***************************************************************************** +typedef enum +{ + // + //! This indicates that transmit interrupts should be enabled, or are + //! enabled. + // + MSG_OBJ_TX_INT_ENABLE = 0x00000001, + + // + //! This indicates that receive interrupts should be enabled or are + //! enabled. + // + MSG_OBJ_RX_INT_ENABLE = 0x00000002, + + // + //! This indicates that a message object will use or is using an extended + //! identifier. + // + MSG_OBJ_EXTENDED_ID = 0x00000004, + + // + //! This indicates that a message object will use or is using filtering + //! based on the object's message Identifier. + // + MSG_OBJ_USE_ID_FILTER = 0x00000008, + + // + //! This indicates that new data was available in the message object. + // + MSG_OBJ_NEW_DATA = 0x00000080, + + // + //! This indicates that data was lost since this message object was last + //! read. + // + MSG_OBJ_DATA_LOST = 0x00000100, + + // + //! This indicates that a message object will use or is using filtering + //! based on the direction of the transfer. If the direction filtering is + //! used then ID filtering must also be enabled. + // + MSG_OBJ_USE_DIR_FILTER = (0x00000010 | MSG_OBJ_USE_ID_FILTER), + + // + //! This indicates that a message object will use or is using message + //! identifier filtering based of the the extended identifier. + //! If the extended identifier filtering is used then ID filtering must + //! also be enabled. + // + MSG_OBJ_USE_EXT_FILTER = (0x00000020 | MSG_OBJ_USE_ID_FILTER), + + // + //! This indicates that a message object is a remote frame. + // + MSG_OBJ_REMOTE_FRAME = 0x00000040, + + // + //! This indicates that a message object has no flags set. + // + MSG_OBJ_NO_FLAGS = 0x00000000 +} +tCANObjFlags; + +//***************************************************************************** +// +//! This define is used with the #tCANObjFlags enumerated values to allow +//! checking only status flags and not configuration flags. +// +//***************************************************************************** +#define MSG_OBJ_STATUS_MASK (MSG_OBJ_NEW_DATA | MSG_OBJ_DATA_LOST) + +//***************************************************************************** +// +//! This structure used for encapsulating all the items associated with a CAN +//! message object in the CAN controller. +// +//***************************************************************************** +typedef struct +{ + // + //! The CAN message identifier used for 11 or 29 bit identifiers. + // + unsigned long ulMsgID; + + // + //! The message identifier mask used when identifier filtering is enabled. + // + unsigned long ulMsgIDMask; + + // + //! This value holds various status flags and settings specified by + //! tCANObjFlags. + // + unsigned long ulFlags; + + // + //! This value is the number of bytes of data in the message object. + // + unsigned long ulMsgLen; + + // + //! This is a pointer to the message object's data. + // + unsigned char *pucMsgData; +} +tCANMsgObject; + +//***************************************************************************** +// +//! This structure is used for encapsulating the values associated with setting +//! up the bit timing for a CAN controller. The structure is used when calling +//! the CANGetBitTiming and CANSetBitTiming functions. +// +//***************************************************************************** +typedef struct +{ + // + //! This value holds the sum of the Synchronization, Propagation, and Phase + //! Buffer 1 segments, measured in time quanta. The valid values for this + //! setting range from 2 to 16. + // + unsigned int uSyncPropPhase1Seg; + + // + //! This value holds the Phase Buffer 2 segment in time quanta. The valid + //! values for this setting range from 1 to 8. + // + unsigned int uPhase2Seg; + + // + //! This value holds the Resynchronization Jump Width in time quanta. The + //! valid values for this setting range from 1 to 4. + // + unsigned int uSJW; + + // + //! This value holds the CAN_CLK divider used to determine time quanta. + //! The valid values for this setting range from 1 to 1023. + // + unsigned int uQuantumPrescaler; + +} +tCANBitClkParms; + +//***************************************************************************** +// +//! This data type is used to identify the interrupt status register. This is +//! used when calling the a CANIntStatus() function. +// +//***************************************************************************** +typedef enum +{ + // + //! Read the CAN interrupt status information. + // + CAN_INT_STS_CAUSE, + + // + //! Read a message object's interrupt status. + // + CAN_INT_STS_OBJECT +} +tCANIntStsReg; + +//***************************************************************************** +// +//! This data type is used to identify which of the several status registers +//! to read when calling the CANStatusGet() function. +// +//***************************************************************************** +typedef enum +{ + // + //! Read the full CAN controller status. + // + CAN_STS_CONTROL, + + // + //! Read the full 32 bit mask of message objects with a transmit request + //! set. + // + CAN_STS_TXREQUEST, + + // + //! Read the full 32 bit mask of message objects with a new data available. + // + CAN_STS_NEWDAT, + + // + //! Read the full 32 bit mask of message objects that are enabled. + // + CAN_STS_MSGVAL +} +tCANStsReg; + +//***************************************************************************** +// +//! These definitions are used to specify interrupt sources to CANIntEnable() +//! and CANIntDisable(). +// +//***************************************************************************** +typedef enum +{ + // + //! This flag is used to allow a CAN controller to generate error + //! interrupts. + // + CAN_INT_ERROR = 0x00000008, + + // + //! This flag is used to allow a CAN controller to generate status + //! interrupts. + // + CAN_INT_STATUS = 0x00000004, + + // + //! This flag is used to allow a CAN controller to generate any CAN + //! interrupts. If this is not set then no interrupts will be generated by + //! the CAN controller. + // + CAN_INT_MASTER = 0x00000002 +} +tCANIntFlags; + +//***************************************************************************** +// +//! This definition is used to determine the type of message object that will +//! be set up via a call to the CANMessageSet() API. +// +//***************************************************************************** +typedef enum +{ + // + //! Transmit message object. + // + MSG_OBJ_TYPE_TX, + + // + //! Transmit remote request message object + // + MSG_OBJ_TYPE_TX_REMOTE, + + // + //! Receive message object. + // + MSG_OBJ_TYPE_RX, + + // + //! Receive remote request message object. + // + MSG_OBJ_TYPE_RX_REMOTE, + + // + //! Remote frame receive remote, with auto-transmit message object. + // + MSG_OBJ_TYPE_RXTX_REMOTE +} +tMsgObjType; + +//***************************************************************************** +// +//! The following enumeration contains all error or status indicators that +//! can be returned when calling the CANStatusGet() API. +// +//***************************************************************************** +typedef enum +{ + // + //! CAN controller has entered a Bus Off state. + // + CAN_STATUS_BUS_OFF = 0x00000080, + + // + //! CAN controller error level has reached warning level. + // + CAN_STATUS_EWARN = 0x00000040, + + // + //! CAN controller error level has reached error passive level. + // + CAN_STATUS_EPASS = 0x00000020, + + // + //! A message was received successfully since the last read of this status. + // + CAN_STATUS_RXOK = 0x00000010, + + // + //! A message was transmitted successfully since the last read of this + //! status. + // + CAN_STATUS_TXOK = 0x00000008, + + // + //! This is the mask for the last error code field. + // + CAN_STATUS_LEC_MSK = 0x00000007, + + // + //! There was no error. + // + CAN_STATUS_LEC_NONE = 0x00000000, + + // + //! A bit stuffing error has occurred. + // + CAN_STATUS_LEC_STUFF = 0x00000001, + + // + //! A formatting error has occurred. + // + CAN_STATUS_LEC_FORM = 0x00000002, + + // + //! An acknowledge error has occurred. + // + CAN_STATUS_LEC_ACK = 0x00000003, + + // + //! The bus remained a bit level of 1 for longer than is allowed. + // + CAN_STATUS_LEC_BIT1 = 0x00000004, + + // + //! The bus remained a bit level of 0 for longer than is allowed. + // + CAN_STATUS_LEC_BIT0 = 0x00000005, + + // + //! A CRC error has occurred. + // + CAN_STATUS_LEC_CRC = 0x00000006, + + // + //! This is the mask for the CAN Last Error Code (LEC). + // + CAN_STATUS_LEC_MASK = 0x00000007 +} +tCANStatusCtrl; + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void CANInit(unsigned long ulBase); +extern void CANEnable(unsigned long ulBase); +extern void CANDisable(unsigned long ulBase); +extern void CANSetBitTiming(unsigned long ulBase, tCANBitClkParms *pClkParms); +extern void CANGetBitTiming(unsigned long ulBase, tCANBitClkParms *pClkParms); +extern unsigned long CANReadReg(unsigned long ulRegAddress); +extern void CANWriteReg(unsigned long ulRegAddress, unsigned long ulRegValue); +extern void CANMessageSet(unsigned long ulBase, unsigned long ulObjID, + tCANMsgObject *pMsgObject, tMsgObjType eMsgType); +extern void CANMessageGet(unsigned long ulBase, unsigned long ulObjID, + tCANMsgObject *pMsgObject, tBoolean bClrPendingInt); +extern unsigned long CANStatusGet(unsigned long ulBase, tCANStsReg eStatusReg); +extern void CANMessageClear(unsigned long ulBase, unsigned long ulObjID); +extern void CANIntRegister(unsigned long ulBase, void (*pfnHandler)(void)); +extern void CANIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void CANIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern void CANIntClear(unsigned long ulBase, unsigned long ulIntClr); +extern unsigned long CANIntStatus(unsigned long ulBase, + tCANIntStsReg eIntStsReg); +extern tBoolean CANRetryGet(unsigned long ulBase); +extern void CANRetrySet(unsigned long ulBase, tBoolean bAutoRetry); +extern tBoolean CANErrCntrGet(unsigned long ulBase, unsigned long *pulRxCount, + unsigned long *pulTxCount); +extern long CANGetIntNumber(unsigned long ulBase); +extern void CANReadDataReg(unsigned char *pucData, unsigned long *pulRegister, + int iSize); +extern void CANWriteDataReg(unsigned char *pucData, unsigned long *pulRegister, + int iSize); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +#ifdef __cplusplus +} +#endif + +#endif // __CAN_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/comp.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/comp.h new file mode 100644 index 000000000..60fa1e04e --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/comp.h @@ -0,0 +1,122 @@ +//***************************************************************************** +// +// comp.h - Prototypes for the analog comparator driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __COMP_H__ +#define __COMP_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to ComparatorConfigure() as the ulConfig +// parameter. For each group (i.e. COMP_TRIG_xxx, COMP_INT_xxx, etc.), one of +// the values may be selected and ORed together will values from the other +// groups. +// +//***************************************************************************** +#define COMP_TRIG_NONE 0x00000000 // No ADC trigger +#define COMP_TRIG_HIGH 0x00000880 // Trigger when high +#define COMP_TRIG_LOW 0x00000800 // Trigger when low +#define COMP_TRIG_FALL 0x00000820 // Trigger on falling edge +#define COMP_TRIG_RISE 0x00000840 // Trigger on rising edge +#define COMP_TRIG_BOTH 0x00000860 // Trigger on both edges +#define COMP_INT_HIGH 0x00000010 // Interrupt when high +#define COMP_INT_LOW 0x00000000 // Interrupt when low +#define COMP_INT_FALL 0x00000004 // Interrupt on falling edge +#define COMP_INT_RISE 0x00000008 // Interrupt on rising edge +#define COMP_INT_BOTH 0x0000000C // Interrupt on both edges +#define COMP_ASRCP_PIN 0x00000000 // Dedicated Comp+ pin +#define COMP_ASRCP_PIN0 0x00000200 // Comp0+ pin +#define COMP_ASRCP_REF 0x00000400 // Internal voltage reference +#ifndef DEPRECATED +#define COMP_OUTPUT_NONE 0x00000000 // No comparator output +#endif +#define COMP_OUTPUT_NORMAL 0x00000000 // Comparator output normal +#define COMP_OUTPUT_INVERT 0x00000002 // Comparator output inverted + +//***************************************************************************** +// +// Values that can be passed to ComparatorSetRef() as the ulRef parameter. +// +//***************************************************************************** +#define COMP_REF_OFF 0x00000000 // Turn off the internal reference +#define COMP_REF_0V 0x00000300 // Internal reference of 0V +#define COMP_REF_0_1375V 0x00000301 // Internal reference of 0.1375V +#define COMP_REF_0_275V 0x00000302 // Internal reference of 0.275V +#define COMP_REF_0_4125V 0x00000303 // Internal reference of 0.4125V +#define COMP_REF_0_55V 0x00000304 // Internal reference of 0.55V +#define COMP_REF_0_6875V 0x00000305 // Internal reference of 0.6875V +#define COMP_REF_0_825V 0x00000306 // Internal reference of 0.825V +#define COMP_REF_0_928125V 0x00000201 // Internal reference of 0.928125V +#define COMP_REF_0_9625V 0x00000307 // Internal reference of 0.9625V +#define COMP_REF_1_03125V 0x00000202 // Internal reference of 1.03125V +#define COMP_REF_1_134375V 0x00000203 // Internal reference of 1.134375V +#define COMP_REF_1_1V 0x00000308 // Internal reference of 1.1V +#define COMP_REF_1_2375V 0x00000309 // Internal reference of 1.2375V +#define COMP_REF_1_340625V 0x00000205 // Internal reference of 1.340625V +#define COMP_REF_1_375V 0x0000030A // Internal reference of 1.375V +#define COMP_REF_1_44375V 0x00000206 // Internal reference of 1.44375V +#define COMP_REF_1_5125V 0x0000030B // Internal reference of 1.5125V +#define COMP_REF_1_546875V 0x00000207 // Internal reference of 1.546875V +#define COMP_REF_1_65V 0x0000030C // Internal reference of 1.65V +#define COMP_REF_1_753125V 0x00000209 // Internal reference of 1.753125V +#define COMP_REF_1_7875V 0x0000030D // Internal reference of 1.7875V +#define COMP_REF_1_85625V 0x0000020A // Internal reference of 1.85625V +#define COMP_REF_1_925V 0x0000030E // Internal reference of 1.925V +#define COMP_REF_1_959375V 0x0000020B // Internal reference of 1.959375V +#define COMP_REF_2_0625V 0x0000030F // Internal reference of 2.0625V +#define COMP_REF_2_165625V 0x0000020D // Internal reference of 2.165625V +#define COMP_REF_2_26875V 0x0000020E // Internal reference of 2.26875V +#define COMP_REF_2_371875V 0x0000020F // Internal reference of 2.371875V + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void ComparatorConfigure(unsigned long ulBase, unsigned long ulComp, + unsigned long ulConfig); +extern void ComparatorRefSet(unsigned long ulBase, unsigned long ulRef); +extern tBoolean ComparatorValueGet(unsigned long ulBase, unsigned long ulComp); +extern void ComparatorIntRegister(unsigned long ulBase, unsigned long ulComp, + void (*pfnHandler)(void)); +extern void ComparatorIntUnregister(unsigned long ulBase, + unsigned long ulComp); +extern void ComparatorIntEnable(unsigned long ulBase, unsigned long ulComp); +extern void ComparatorIntDisable(unsigned long ulBase, unsigned long ulComp); +extern tBoolean ComparatorIntStatus(unsigned long ulBase, unsigned long ulComp, + tBoolean bMasked); +extern void ComparatorIntClear(unsigned long ulBase, unsigned long ulComp); + +#ifdef __cplusplus +} +#endif + +#endif // __COMP_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/cpu.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/cpu.h new file mode 100644 index 000000000..f21f82221 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/cpu.h @@ -0,0 +1,40 @@ +//***************************************************************************** +// +// cpu.h - Prototypes for the CPU instruction wrapper functions. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __CPU_H__ +#define __CPU_H__ + +//***************************************************************************** +// +// Prototypes. +// +//***************************************************************************** +extern void CPUcpsid(void); +extern void CPUcpsie(void); +extern void CPUwfi(void); + +#endif // __CPU_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/debug.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/debug.h new file mode 100644 index 000000000..c64b8fc2d --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/debug.h @@ -0,0 +1,56 @@ +//***************************************************************************** +// +// debug.h - Macros for assisting debug of the driver library. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __DEBUG_H__ +#define __DEBUG_H__ + +//***************************************************************************** +// +// Prototype for the function that is called when an invalid argument is passed +// to an API. This is only used when doing a DEBUG build. +// +//***************************************************************************** +extern void __error__(char *pcFilename, unsigned long ulLine); + +//***************************************************************************** +// +// The ASSERT macro, which does the actual assertion checking. Typically, this +// will be for procedure arguments. +// +//***************************************************************************** +#ifdef DEBUG +#define ASSERT(expr) { \ + if(!(expr)) \ + { \ + __error__(__FILE__, __LINE__); \ + } \ + } +#else +#define ASSERT(expr) +#endif + +#endif // __DEBUG_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/driverlib.r79 b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/driverlib.r79 new file mode 100644 index 0000000000000000000000000000000000000000..3e297f9cf989e5fa1211a3a73c3d607fce6129a8 GIT binary patch literal 192492 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 Jesb>V{{!yVs89d^ literal 0 HcmV?d00001 diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/ethernet.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/ethernet.h new file mode 100644 index 000000000..127763f2c --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/ethernet.h @@ -0,0 +1,254 @@ +//***************************************************************************** +// +// ethernet.h - Defines and Macros for the ethernet module. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __ETHERNET_H__ +#define __ETHERNET_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to EthernetConfigSet as the ulConfig value, and +// returned from EthernetConfigGet. +// +//***************************************************************************** +#define ETH_CFG_RX_BADCRCDIS 0x000800 // Disable RX BAD CRC Packets +#define ETH_CFG_RX_PRMSEN 0x000400 // Enable RX Promiscuous +#define ETH_CFG_RX_AMULEN 0x000200 // Enable RX Multicast +#define ETH_CFG_TX_DPLXEN 0x000010 // Enable TX Duplex Mode +#define ETH_CFG_TX_CRCEN 0x000004 // Enable TX CRC Generation +#define ETH_CFG_TX_PADEN 0x000002 // Enable TX Padding + +//***************************************************************************** +// +// Values that can be passed to EthernetIntEnable, EthernetIntDisable, and +// EthernetIntClear as the ulIntFlags parameter, and returned from +// EthernetIntStatus. +// +//***************************************************************************** +#define ETH_INT_PHY 0x040 // PHY Event/Interrupt +#define ETH_INT_MDIO 0x020 // Management Transaction +#define ETH_INT_RXER 0x010 // RX Error +#define ETH_INT_RXOF 0x008 // RX FIFO Overrun +#define ETH_INT_TX 0x004 // TX Complete +#define ETH_INT_TXER 0x002 // TX Error +#define ETH_INT_RX 0x001 // RX Complete + +//***************************************************************************** +// +// The following define values that can be passed as register addresses to +// EthernetPHYRead and EthernetPHYWrite. +// +//***************************************************************************** +#define PHY_MR0 0 // Control +#define PHY_MR1 1 // Status +#define PHY_MR2 2 // PHY Identifier 1 +#define PHY_MR3 3 // PHY Identifier 2 +#define PHY_MR4 4 // Auto-Neg. Advertisement +#define PHY_MR5 5 // Auto-Neg. Link Partner Ability +#define PHY_MR6 6 // Auto-Neg. Expansion + // 7-15 Reserved/Not Implemented +#define PHY_MR16 16 // Vendor Specific +#define PHY_MR17 17 // Interrupt Control/Status +#define PHY_MR18 18 // Diagnostic Register +#define PHY_MR19 19 // Transceiver Control + // 20-22 Reserved +#define PHY_MR23 23 // LED Configuration Register +#define PHY_MR24 24 // MDI/MDIX Control Register + // 25-31 Reserved/Not Implemented + +//***************************************************************************** +// +// The following define bit fields in the ETH_MR0 register +// +//***************************************************************************** +#define PHY_MR0_RESET 0x8000 // Reset the PHY +#define PHY_MR0_LOOPBK 0x4000 // TXD to RXD Loopback +#define PHY_MR0_SPEEDSL 0x2000 // Speed Selection +#define PHY_MR0_SPEEDSL_10 0x0000 // Speed Selection 10BASE-T +#define PHY_MR0_SPEEDSL_100 0x2000 // Speed Selection 100BASE-T +#define PHY_MR0_ANEGEN 0x1000 // Auto-Negotiation Enable +#define PHY_MR0_PWRDN 0x0800 // Power Down +#define PHY_MR0_RANEG 0x0200 // Restart Auto-Negotiation +#define PHY_MR0_DUPLEX 0x0100 // Enable full duplex +#define PHY_MR0_DUPLEX_HALF 0x0000 // Enable half duplex mode +#define PHY_MR0_DUPLEX_FULL 0x0100 // Enable full duplex mode + +//***************************************************************************** +// +// The following define bit fields in the ETH_MR1 register +// +//***************************************************************************** +#define PHY_MR1_ANEGC 0x0020 // Auto-Negotiate Complete +#define PHY_MR1_RFAULT 0x0010 // Remove Fault Detected +#define PHY_MR1_LINK 0x0004 // Link Established +#define PHY_MR1_JAB 0x0002 // Jabber Condition Detected + +//***************************************************************************** +// +// The following define bit fields in the ETH_MR17 register +// +//***************************************************************************** +#define PHY_MR17_RXER_IE 0x4000 // Enable Receive Error Interrupt +#define PHY_MR17_LSCHG_IE 0x0400 // Enable Link Status Change Int. +#define PHY_MR17_ANEGCOMP_IE 0x0100 // Enable Auto-Negotiate Cmpl. Int. +#define PHY_MR17_RXER_INT 0x0040 // Receive Error Interrupt +#define PHY_MR17_LSCHG_INT 0x0004 // Link Status Change Interrupt +#define PHY_MR17_ANEGCOMP_INT 0x0001 // Auto-Negotiate Complete Int. + +//***************************************************************************** +// +// The following define bit fields in the ETH_MR18 register +// +//***************************************************************************** +#define PHY_MR18_ANEGF 0x1000 // Auto-Negotiate Failed +#define PHY_MR18_DPLX 0x0800 // Duplex Mode Negotiated +#define PHY_MR18_DPLX_HALF 0x0000 // Half Duplex Mode Negotiated +#define PHY_MR18_DPLX_FULL 0x0800 // Full Duplex Mode Negotiated +#define PHY_MR18_RATE 0x0400 // Rate Negotiated +#define PHY_MR18_RATE_10 0x0000 // Rate Negotiated is 10BASE-T +#define PHY_MR18_RATE_100 0x0400 // Rate Negotiated is 100BASE-TX + +//***************************************************************************** +// +// The following define bit fields in the ETH_MR23 register +// +//***************************************************************************** +#define PHY_MR23_LED1 0x00f0 // LED1 Configuration +#define PHY_MR23_LED1_LINK 0x0000 // LED1 is Link Status +#define PHY_MR23_LED1_RXTX 0x0010 // LED1 is RX or TX Activity +#define PHY_MR23_LED1_TX 0x0020 // LED1 is TX Activity +#define PHY_MR23_LED1_RX 0x0030 // LED1 is RX Activity +#define PHY_MR23_LED1_COL 0x0040 // LED1 is RX Activity +#define PHY_MR23_LED1_100 0x0050 // LED1 is RX Activity +#define PHY_MR23_LED1_10 0x0060 // LED1 is RX Activity +#define PHY_MR23_LED1_DUPLEX 0x0070 // LED1 is RX Activity +#define PHY_MR23_LED1_LINKACT 0x0080 // LED1 is Link Status + Activity +#define PHY_MR23_LED0 0x000f // LED0 Configuration +#define PHY_MR23_LED0_LINK 0x0000 // LED0 is Link Status +#define PHY_MR23_LED0_RXTX 0x0001 // LED0 is RX or TX Activity +#define PHY_MR23_LED0_TX 0x0002 // LED0 is TX Activity +#define PHY_MR23_LED0_RX 0x0003 // LED0 is RX Activity +#define PHY_MR23_LED0_COL 0x0004 // LED0 is RX Activity +#define PHY_MR23_LED0_100 0x0005 // LED0 is RX Activity +#define PHY_MR23_LED0_10 0x0006 // LED0 is RX Activity +#define PHY_MR23_LED0_DUPLEX 0x0007 // LED0 is RX Activity +#define PHY_MR23_LED0_LINKACT 0x0008 // LED0 is Link Status + Activity + +//***************************************************************************** +// +// The following define bit fields in the ETH_MR24 register +// +//***************************************************************************** +#define PHY_MR24_MDIX 0x0020 // Auto-Switching Configuration +#define PHY_MR24_MDIX_NORMAL 0x0000 // Auto-Switching in passthrough +#define PHY_MR23_MDIX_CROSSOVER 0x0020 // Auto-Switching in crossover + +//***************************************************************************** +// +// Helper Macros for Ethernet Processing +// +//***************************************************************************** +// +// htonl/ntohl - big endian/little endian byte swapping macros for +// 32-bit (long) values +// +//***************************************************************************** +#ifndef htonl + #define htonl(a) \ + ((((a) >> 24) & 0x000000ff) | \ + (((a) >> 8) & 0x0000ff00) | \ + (((a) << 8) & 0x00ff0000) | \ + (((a) << 24) & 0xff000000)) +#endif + +#ifndef ntohl + #define ntohl(a) htonl((a)) +#endif + +//***************************************************************************** +// +// htons/ntohs - big endian/little endian byte swapping macros for +// 16-bit (short) values +// +//***************************************************************************** +#ifndef htons + #define htons(a) \ + ((((a) >> 8) & 0x00ff) | \ + (((a) << 8) & 0xff00)) +#endif + +#ifndef ntohs + #define ntohs(a) htons((a)) +#endif + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void EthernetInit(unsigned long ulBase); +extern void EthernetConfigSet(unsigned long ulBase, unsigned long ulConfig); +extern unsigned long EthernetConfigGet(unsigned long ulBase); +extern void EthernetMACAddrSet(unsigned long ulBase, + unsigned char *pucMACAddr); +extern void EthernetMACAddrGet(unsigned long ulBase, + unsigned char *pucMACAddr); +extern void EthernetEnable(unsigned long ulBase); +extern void EthernetDisable(unsigned long ulBase); +extern tBoolean EthernetPacketAvail(unsigned long ulBase); +extern tBoolean EthernetSpaceAvail(unsigned long ulBase); +extern long EthernetPacketNonBlockingGet(unsigned long ulBase, + unsigned char *pucBuf, + long lBufLen); +extern long EthernetPacketGet(unsigned long ulBase, unsigned char *pucBuf, + long lBufLen); +extern long EthernetPacketNonBlockingPut(unsigned long ulBase, + unsigned char *pucBuf, + long lBufLen); +extern long EthernetPacketPut(unsigned long ulBase, unsigned char *pucBuf, + long lBufLen); +extern void EthernetIntRegister(unsigned long ulBase, + void (*pfnHandler)(void)); +extern void EthernetIntUnregister(unsigned long ulBase); +extern void EthernetIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void EthernetIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long EthernetIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void EthernetIntClear(unsigned long ulBase, unsigned long ulIntFlags); +extern void EthernetPHYWrite(unsigned long ulBase, unsigned char ucRegAddr, + unsigned long ulData); +extern unsigned long EthernetPHYRead(unsigned long ulBase, + unsigned char ucRegAddr); + +#ifdef __cplusplus +} +#endif + +#endif // __ETHERNET_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/gpio.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/gpio.h new file mode 100644 index 000000000..6e74f9d4f --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/gpio.h @@ -0,0 +1,138 @@ +//***************************************************************************** +// +// gpio.h - Defines and Macros for GPIO API. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __GPIO_H__ +#define __GPIO_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following values define the bit field for the ucPins argument to several +// of the APIs. +// +//***************************************************************************** +#define GPIO_PIN_0 0x00000001 // GPIO pin 0 +#define GPIO_PIN_1 0x00000002 // GPIO pin 1 +#define GPIO_PIN_2 0x00000004 // GPIO pin 2 +#define GPIO_PIN_3 0x00000008 // GPIO pin 3 +#define GPIO_PIN_4 0x00000010 // GPIO pin 4 +#define GPIO_PIN_5 0x00000020 // GPIO pin 5 +#define GPIO_PIN_6 0x00000040 // GPIO pin 6 +#define GPIO_PIN_7 0x00000080 // GPIO pin 7 + +//***************************************************************************** +// +// Values that can be passed to GPIODirModeSet as the ulPinIO parameter, and +// returned from GPIODirModeGet. +// +//***************************************************************************** +#define GPIO_DIR_MODE_IN 0x00000000 // Pin is a GPIO input +#define GPIO_DIR_MODE_OUT 0x00000001 // Pin is a GPIO output +#define GPIO_DIR_MODE_HW 0x00000002 // Pin is a peripheral function + +//***************************************************************************** +// +// Values that can be passed to GPIOIntTypeSet as the ulIntType parameter, and +// returned from GPIOIntTypeGet. +// +//***************************************************************************** +#define GPIO_FALLING_EDGE 0x00000000 // Interrupt on falling edge +#define GPIO_RISING_EDGE 0x00000004 // Interrupt on rising edge +#define GPIO_BOTH_EDGES 0x00000001 // Interrupt on both edges +#define GPIO_LOW_LEVEL 0x00000002 // Interrupt on low level +#define GPIO_HIGH_LEVEL 0x00000007 // Interrupt on high level + +//***************************************************************************** +// +// Values that can be passed to GPIOPadConfigSet as the ulStrength parameter, +// and returned by GPIOPadConfigGet in the *pulStrength parameter. +// +//***************************************************************************** +#define GPIO_STRENGTH_2MA 0x00000001 // 2mA drive strength +#define GPIO_STRENGTH_4MA 0x00000002 // 4mA drive strength +#define GPIO_STRENGTH_8MA 0x00000004 // 8mA drive strength +#define GPIO_STRENGTH_8MA_SC 0x0000000C // 8mA drive with slew rate control + +//***************************************************************************** +// +// Values that can be passed to GPIOPadConfigSet as the ulPadType parameter, +// and returned by GPIOPadConfigGet in the *pulPadType parameter. +// +//***************************************************************************** +#define GPIO_PIN_TYPE_STD 0x00000008 // Push-pull +#define GPIO_PIN_TYPE_STD_WPU 0x0000000A // Push-pull with weak pull-up +#define GPIO_PIN_TYPE_STD_WPD 0x0000000C // Push-pull with weak pull-down +#define GPIO_PIN_TYPE_OD 0x00000009 // Open-drain +#define GPIO_PIN_TYPE_OD_WPU 0x0000000B // Open-drain with weak pull-up +#define GPIO_PIN_TYPE_OD_WPD 0x0000000D // Open-drain with weak pull-down +#define GPIO_PIN_TYPE_ANALOG 0x00000000 // Analog comparator + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void GPIODirModeSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulPinIO); +extern unsigned long GPIODirModeGet(unsigned long ulPort, unsigned char ucPin); +extern void GPIOIntTypeSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulIntType); +extern unsigned long GPIOIntTypeGet(unsigned long ulPort, unsigned char ucPin); +extern void GPIOPadConfigSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulStrength, + unsigned long ulPadType); +extern void GPIOPadConfigGet(unsigned long ulPort, unsigned char ucPin, + unsigned long *pulStrength, + unsigned long *pulPadType); +extern void GPIOPinIntEnable(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinIntDisable(unsigned long ulPort, unsigned char ucPins); +extern long GPIOPinIntStatus(unsigned long ulPort, tBoolean bMasked); +extern void GPIOPinIntClear(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPortIntRegister(unsigned long ulPort, + void (*pfIntHandler)(void)); +extern void GPIOPortIntUnregister(unsigned long ulPort); +extern long GPIOPinRead(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinWrite(unsigned long ulPort, unsigned char ucPins, + unsigned char ucVal); +extern void GPIOPinTypeComparator(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeI2C(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypePWM(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeQEI(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeSSI(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeTimer(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeUART(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeCAN(unsigned long ulPort, unsigned char ucPins); + +#ifdef __cplusplus +} +#endif + +#endif // __GPIO_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hibernate.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hibernate.h new file mode 100644 index 000000000..69a8c144a --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hibernate.h @@ -0,0 +1,107 @@ +//***************************************************************************** +// +// hibernate.h - API definition for the Hibernation module. +// +// Copyright (c) 2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HIBERNATE_H__ +#define __HIBERNATE_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Macros needed for selecting the clock source for HibernateClockSelect() +// +//***************************************************************************** +#define HIBERNATE_CLOCK_SEL_RAW 0x04 +#define HIBERNATE_CLOCK_SEL_DIV128 0x00 + +//***************************************************************************** +// +// Macros need to configure wake events for HibernateWakeSet() +// +//***************************************************************************** +#define HIBERNATE_WAKE_PIN 0x10 +#define HIBERNATE_WAKE_RTC 0x08 + +//***************************************************************************** +// +// Macros needed to configure low battery detect for HibernateLowBatSet() +// +//***************************************************************************** +#define HIBERNATE_LOW_BAT_DETECT 0x20 +#define HIBERNATE_LOW_BAT_ABORT 0xA0 + +//***************************************************************************** +// +// Macros defining interrupt source bits for the interrupt functions. +// +//***************************************************************************** +#define HIBERNATE_INT_PIN_WAKE 0x08 +#define HIBERNATE_INT_LOW_BAT 0x04 +#define HIBERNATE_INT_RTC_MATCH_0 0x01 +#define HIBERNATE_INT_RTC_MATCH_1 0x02 + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void HibernateEnable(void); +extern void HibernateDisable(void); +extern void HibernateClockSelect(unsigned long ulClockInput); +extern void HibernateRTCEnable(void); +extern void HibernateRTCDisable(void); +extern void HibernateWakeSet(unsigned long ulWakeFlags); +extern unsigned long HibernateWakeGet(void); +extern void HibernateLowBatSet(unsigned long ulLowBatFlags); +extern unsigned long HibernateLowBatGet(void); +extern void HibernateRTCSet(unsigned long ulRTCValue); +extern unsigned long HibernateRTCGet(void); +extern void HibernateRTCMatch0Set(unsigned long ulMatch); +extern unsigned long HibernateRTCMatch0Get(void); +extern void HibernateRTCMatch1Set(unsigned long ulMatch); +extern unsigned long HibernateRTCMatch1Get(void); +extern void HibernateRTCTrimSet(unsigned long ulTrim); +extern unsigned long HibernateRTCTrimGet(void); +extern void HibernateDataSet(unsigned long *pulData, unsigned long ulCount); +extern void HibernateDataGet(unsigned long *pulData, unsigned long ulCount); +extern void HibernateRequest(void); +extern void HibernateIntEnable(unsigned long ulIntFlags); +extern void HibernateIntDisable(unsigned long ulIntFlags); +extern void HibernateIntRegister(void (*pfnHandler)(void)); +extern void HibernateIntUnregister(void); +extern unsigned long HibernateIntStatus(tBoolean bMasked); +extern void HibernateIntClear(unsigned long ulIntFlags); +extern unsigned int HibernateIsActive(void); + +#ifdef __cplusplus +} +#endif + +#endif // __HIBERNATE_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_adc.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_adc.h new file mode 100644 index 000000000..932d3f26e --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_adc.h @@ -0,0 +1,343 @@ +//***************************************************************************** +// +// hw_adc.h - Macros used when accessing the ADC hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_ADC_H__ +#define __HW_ADC_H__ + +//***************************************************************************** +// +// The following define the offsets of the ADC registers. +// +//***************************************************************************** +#define ADC_O_ACTSS 0x00000000 // Active sample register +#define ADC_O_RIS 0x00000004 // Raw interrupt status register +#define ADC_O_IM 0x00000008 // Interrupt mask register +#define ADC_O_ISC 0x0000000C // Interrupt status/clear register +#define ADC_O_OSTAT 0x00000010 // Overflow status register +#define ADC_O_EMUX 0x00000014 // Event multiplexer select reg. +#define ADC_O_USTAT 0x00000018 // Underflow status register +#define ADC_O_SSPRI 0x00000020 // Channel priority register +#define ADC_O_PSSI 0x00000028 // Processor sample initiate reg. +#define ADC_O_SAC 0x00000030 // Sample Averaging Control reg. +#define ADC_O_SSMUX0 0x00000040 // Multiplexer select 0 register +#define ADC_O_SSCTL0 0x00000044 // Sample sequence control 0 reg. +#define ADC_O_SSFIFO0 0x00000048 // Result FIFO 0 register +#define ADC_O_SSFSTAT0 0x0000004C // FIFO 0 status register +#define ADC_O_SSMUX1 0x00000060 // Multiplexer select 1 register +#define ADC_O_SSCTL1 0x00000064 // Sample sequence control 1 reg. +#define ADC_O_SSFIFO1 0x00000068 // Result FIFO 1 register +#define ADC_O_SSFSTAT1 0x0000006C // FIFO 1 status register +#define ADC_O_SSMUX2 0x00000080 // Multiplexer select 2 register +#define ADC_O_SSCTL2 0x00000084 // Sample sequence control 2 reg. +#define ADC_O_SSFIFO2 0x00000088 // Result FIFO 2 register +#define ADC_O_SSFSTAT2 0x0000008C // FIFO 2 status register +#define ADC_O_SSMUX3 0x000000A0 // Multiplexer select 3 register +#define ADC_O_SSCTL3 0x000000A4 // Sample sequence control 3 reg. +#define ADC_O_SSFIFO3 0x000000A8 // Result FIFO 3 register +#define ADC_O_SSFSTAT3 0x000000AC // FIFO 3 status register +#define ADC_O_TMLB 0x00000100 // Test mode loopback register + +//***************************************************************************** +// +// The following define the offsets of the ADC sequence registers. +// +//***************************************************************************** +#define ADC_O_SEQ 0x00000040 // Offset to the first sequence +#define ADC_O_SEQ_STEP 0x00000020 // Increment to the next sequence +#define ADC_O_X_SSMUX 0x00000000 // Multiplexer select register +#define ADC_O_X_SSCTL 0x00000004 // Sample sequence control register +#define ADC_O_X_SSFIFO 0x00000008 // Result FIFO register +#define ADC_O_X_SSFSTAT 0x0000000C // FIFO status register + +//***************************************************************************** +// +// The following define the bit fields in the ADC_ACTSS register. +// +//***************************************************************************** +#define ADC_ACTSS_ASEN3 0x00000008 // Sample sequence 3 enable +#define ADC_ACTSS_ASEN2 0x00000004 // Sample sequence 2 enable +#define ADC_ACTSS_ASEN1 0x00000002 // Sample sequence 1 enable +#define ADC_ACTSS_ASEN0 0x00000001 // Sample sequence 0 enable + +//***************************************************************************** +// +// The following define the bit fields in the ADC_RIS register. +// +//***************************************************************************** +#define ADC_RIS_INR3 0x00000008 // Sample sequence 3 interrupt +#define ADC_RIS_INR2 0x00000004 // Sample sequence 2 interrupt +#define ADC_RIS_INR1 0x00000002 // Sample sequence 1 interrupt +#define ADC_RIS_INR0 0x00000001 // Sample sequence 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the ADC_IM register. +// +//***************************************************************************** +#define ADC_IM_MASK3 0x00000008 // Sample sequence 3 mask +#define ADC_IM_MASK2 0x00000004 // Sample sequence 2 mask +#define ADC_IM_MASK1 0x00000002 // Sample sequence 1 mask +#define ADC_IM_MASK0 0x00000001 // Sample sequence 0 mask + +//***************************************************************************** +// +// The following define the bit fields in the ADC_ISC register. +// +//***************************************************************************** +#define ADC_ISC_IN3 0x00000008 // Sample sequence 3 interrupt +#define ADC_ISC_IN2 0x00000004 // Sample sequence 2 interrupt +#define ADC_ISC_IN1 0x00000002 // Sample sequence 1 interrupt +#define ADC_ISC_IN0 0x00000001 // Sample sequence 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the ADC_OSTAT register. +// +//***************************************************************************** +#define ADC_OSTAT_OV3 0x00000008 // Sample sequence 3 overflow +#define ADC_OSTAT_OV2 0x00000004 // Sample sequence 2 overflow +#define ADC_OSTAT_OV1 0x00000002 // Sample sequence 1 overflow +#define ADC_OSTAT_OV0 0x00000001 // Sample sequence 0 overflow + +//***************************************************************************** +// +// The following define the bit fields in the ADC_EMUX register. +// +//***************************************************************************** +#define ADC_EMUX_EM3_MASK 0x0000F000 // Event mux 3 mask +#define ADC_EMUX_EM3_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM3_COMP0 0x00001000 // Analog comparator 0 event +#define ADC_EMUX_EM3_COMP1 0x00002000 // Analog comparator 1 event +#define ADC_EMUX_EM3_COMP2 0x00003000 // Analog comparator 2 event +#define ADC_EMUX_EM3_EXTERNAL 0x00004000 // External event +#define ADC_EMUX_EM3_TIMER 0x00005000 // Timer event +#define ADC_EMUX_EM3_PWM0 0x00006000 // PWM0 event +#define ADC_EMUX_EM3_PWM1 0x00007000 // PWM1 event +#define ADC_EMUX_EM3_PWM2 0x00008000 // PWM2 event +#define ADC_EMUX_EM3_ALWAYS 0x0000F000 // Always event +#define ADC_EMUX_EM2_MASK 0x00000F00 // Event mux 2 mask +#define ADC_EMUX_EM2_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM2_COMP0 0x00000100 // Analog comparator 0 event +#define ADC_EMUX_EM2_COMP1 0x00000200 // Analog comparator 1 event +#define ADC_EMUX_EM2_COMP2 0x00000300 // Analog comparator 2 event +#define ADC_EMUX_EM2_EXTERNAL 0x00000400 // External event +#define ADC_EMUX_EM2_TIMER 0x00000500 // Timer event +#define ADC_EMUX_EM2_PWM0 0x00000600 // PWM0 event +#define ADC_EMUX_EM2_PWM1 0x00000700 // PWM1 event +#define ADC_EMUX_EM2_PWM2 0x00000800 // PWM2 event +#define ADC_EMUX_EM2_ALWAYS 0x00000F00 // Always event +#define ADC_EMUX_EM1_MASK 0x000000F0 // Event mux 1 mask +#define ADC_EMUX_EM1_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM1_COMP0 0x00000010 // Analog comparator 0 event +#define ADC_EMUX_EM1_COMP1 0x00000020 // Analog comparator 1 event +#define ADC_EMUX_EM1_COMP2 0x00000030 // Analog comparator 2 event +#define ADC_EMUX_EM1_EXTERNAL 0x00000040 // External event +#define ADC_EMUX_EM1_TIMER 0x00000050 // Timer event +#define ADC_EMUX_EM1_PWM0 0x00000060 // PWM0 event +#define ADC_EMUX_EM1_PWM1 0x00000070 // PWM1 event +#define ADC_EMUX_EM1_PWM2 0x00000080 // PWM2 event +#define ADC_EMUX_EM1_ALWAYS 0x000000F0 // Always event +#define ADC_EMUX_EM0_MASK 0x0000000F // Event mux 0 mask +#define ADC_EMUX_EM0_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM0_COMP0 0x00000001 // Analog comparator 0 event +#define ADC_EMUX_EM0_COMP1 0x00000002 // Analog comparator 1 event +#define ADC_EMUX_EM0_COMP2 0x00000003 // Analog comparator 2 event +#define ADC_EMUX_EM0_EXTERNAL 0x00000004 // External event +#define ADC_EMUX_EM0_TIMER 0x00000005 // Timer event +#define ADC_EMUX_EM0_PWM0 0x00000006 // PWM0 event +#define ADC_EMUX_EM0_PWM1 0x00000007 // PWM1 event +#define ADC_EMUX_EM0_PWM2 0x00000008 // PWM2 event +#define ADC_EMUX_EM0_ALWAYS 0x0000000F // Always event +#define ADC_EMUX_EM0_SHIFT 0 // The shift for the first event +#define ADC_EMUX_EM1_SHIFT 4 // The shift for the second event +#define ADC_EMUX_EM2_SHIFT 8 // The shift for the third event +#define ADC_EMUX_EM3_SHIFT 12 // The shift for the fourth event + +//***************************************************************************** +// +// The following define the bit fields in the ADC_USTAT register. +// +//***************************************************************************** +#define ADC_USTAT_UV3 0x00000008 // Sample sequence 3 underflow +#define ADC_USTAT_UV2 0x00000004 // Sample sequence 2 underflow +#define ADC_USTAT_UV1 0x00000002 // Sample sequence 1 underflow +#define ADC_USTAT_UV0 0x00000001 // Sample sequence 0 underflow + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSPRI register. +// +//***************************************************************************** +#define ADC_SSPRI_SS3_MASK 0x00003000 // Sequencer 3 priority mask +#define ADC_SSPRI_SS3_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS3_2ND 0x00001000 // Second priority +#define ADC_SSPRI_SS3_3RD 0x00002000 // Third priority +#define ADC_SSPRI_SS3_4TH 0x00003000 // Fourth priority +#define ADC_SSPRI_SS2_MASK 0x00000300 // Sequencer 2 priority mask +#define ADC_SSPRI_SS2_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS2_2ND 0x00000100 // Second priority +#define ADC_SSPRI_SS2_3RD 0x00000200 // Third priority +#define ADC_SSPRI_SS2_4TH 0x00000300 // Fourth priority +#define ADC_SSPRI_SS1_MASK 0x00000030 // Sequencer 1 priority mask +#define ADC_SSPRI_SS1_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS1_2ND 0x00000010 // Second priority +#define ADC_SSPRI_SS1_3RD 0x00000020 // Third priority +#define ADC_SSPRI_SS1_4TH 0x00000030 // Fourth priority +#define ADC_SSPRI_SS0_MASK 0x00000003 // Sequencer 0 priority mask +#define ADC_SSPRI_SS0_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS0_2ND 0x00000001 // Second priority +#define ADC_SSPRI_SS0_3RD 0x00000002 // Third priority +#define ADC_SSPRI_SS0_4TH 0x00000003 // Fourth priority + +//***************************************************************************** +// +// The following define the bit fields in the ADC_PSSI register. +// +//***************************************************************************** +#define ADC_PSSI_SS3 0x00000008 // Trigger sample sequencer 3 +#define ADC_PSSI_SS2 0x00000004 // Trigger sample sequencer 2 +#define ADC_PSSI_SS1 0x00000002 // Trigger sample sequencer 1 +#define ADC_PSSI_SS0 0x00000001 // Trigger sample sequencer 0 + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SAC register. +// +//***************************************************************************** +#define ADC_SAC_AVG_OFF 0x00000000 // No hardware oversampling +#define ADC_SAC_AVG_2X 0x00000001 // 2x hardware oversampling +#define ADC_SAC_AVG_4X 0x00000002 // 4x hardware oversampling +#define ADC_SAC_AVG_8X 0x00000003 // 8x hardware oversampling +#define ADC_SAC_AVG_16X 0x00000004 // 16x hardware oversampling +#define ADC_SAC_AVG_32X 0x00000005 // 32x hardware oversampling +#define ADC_SAC_AVG_64X 0x00000006 // 64x hardware oversampling + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSMUX0, ADC_SSMUX1, +// ADC_SSMUX2, and ADC_SSMUX3 registers. Not all fields are present in all +// registers. +// +//***************************************************************************** +#define ADC_SSMUX_MUX7_MASK 0x70000000 // 8th mux select mask +#define ADC_SSMUX_MUX6_MASK 0x07000000 // 7th mux select mask +#define ADC_SSMUX_MUX5_MASK 0x00700000 // 6th mux select mask +#define ADC_SSMUX_MUX4_MASK 0x00070000 // 5th mux select mask +#define ADC_SSMUX_MUX3_MASK 0x00007000 // 4th mux select mask +#define ADC_SSMUX_MUX2_MASK 0x00000700 // 3rd mux select mask +#define ADC_SSMUX_MUX1_MASK 0x00000070 // 2nd mux select mask +#define ADC_SSMUX_MUX0_MASK 0x00000007 // 1st mux select mask +#define ADC_SSMUX_MUX7_SHIFT 28 +#define ADC_SSMUX_MUX6_SHIFT 24 +#define ADC_SSMUX_MUX5_SHIFT 20 +#define ADC_SSMUX_MUX4_SHIFT 16 +#define ADC_SSMUX_MUX3_SHIFT 12 +#define ADC_SSMUX_MUX2_SHIFT 8 +#define ADC_SSMUX_MUX1_SHIFT 4 +#define ADC_SSMUX_MUX0_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSCTL0, ADC_SSCTL1, +// ADC_SSCTL2, and ADC_SSCTL3 registers. Not all fields are present in all +// registers. +// +//***************************************************************************** +#define ADC_SSCTL_TS7 0x80000000 // 8th temperature sensor select +#define ADC_SSCTL_IE7 0x40000000 // 8th interrupt enable +#define ADC_SSCTL_END7 0x20000000 // 8th sequence end select +#define ADC_SSCTL_D7 0x10000000 // 8th differential select +#define ADC_SSCTL_TS6 0x08000000 // 7th temperature sensor select +#define ADC_SSCTL_IE6 0x04000000 // 7th interrupt enable +#define ADC_SSCTL_END6 0x02000000 // 7th sequence end select +#define ADC_SSCTL_D6 0x01000000 // 7th differential select +#define ADC_SSCTL_TS5 0x00800000 // 6th temperature sensor select +#define ADC_SSCTL_IE5 0x00400000 // 6th interrupt enable +#define ADC_SSCTL_END5 0x00200000 // 6th sequence end select +#define ADC_SSCTL_D5 0x00100000 // 6th differential select +#define ADC_SSCTL_TS4 0x00080000 // 5th temperature sensor select +#define ADC_SSCTL_IE4 0x00040000 // 5th interrupt enable +#define ADC_SSCTL_END4 0x00020000 // 5th sequence end select +#define ADC_SSCTL_D4 0x00010000 // 5th differential select +#define ADC_SSCTL_TS3 0x00008000 // 4th temperature sensor select +#define ADC_SSCTL_IE3 0x00004000 // 4th interrupt enable +#define ADC_SSCTL_END3 0x00002000 // 4th sequence end select +#define ADC_SSCTL_D3 0x00001000 // 4th differential select +#define ADC_SSCTL_TS2 0x00000800 // 3rd temperature sensor select +#define ADC_SSCTL_IE2 0x00000400 // 3rd interrupt enable +#define ADC_SSCTL_END2 0x00000200 // 3rd sequence end select +#define ADC_SSCTL_D2 0x00000100 // 3rd differential select +#define ADC_SSCTL_TS1 0x00000080 // 2nd temperature sensor select +#define ADC_SSCTL_IE1 0x00000040 // 2nd interrupt enable +#define ADC_SSCTL_END1 0x00000020 // 2nd sequence end select +#define ADC_SSCTL_D1 0x00000010 // 2nd differential select +#define ADC_SSCTL_TS0 0x00000008 // 1st temperature sensor select +#define ADC_SSCTL_IE0 0x00000004 // 1st interrupt enable +#define ADC_SSCTL_END0 0x00000002 // 1st sequence end select +#define ADC_SSCTL_D0 0x00000001 // 1st differential select + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSFIFO0, ADC_SSFIFO1, +// ADC_SSFIFO2, and ADC_SSFIFO3 registers. +// +//***************************************************************************** +#define ADC_SSFIFO_DATA_MASK 0x000003FF // Sample data +#define ADC_SSFIFO_DATA_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSFSTAT0, ADC_SSFSTAT1, +// ADC_SSFSTAT2, and ADC_SSFSTAT3 registers. +// +//***************************************************************************** +#define ADC_SSFSTAT_FULL 0x00001000 // FIFO is full +#define ADC_SSFSTAT_EMPTY 0x00000100 // FIFO is empty +#define ADC_SSFSTAT_HPTR 0x000000F0 // FIFO head pointer +#define ADC_SSFSTAT_TPTR 0x0000000F // FIFO tail pointer + +//***************************************************************************** +// +// The following define the bit fields in the ADC_TMLB register. +// +//***************************************************************************** +#define ADC_TMLB_LB 0x00000001 // Loopback control signals + +//***************************************************************************** +// +// The following define the bit fields in the loopback ADC data. +// +//***************************************************************************** +#define ADC_LB_CNT_MASK 0x000003C0 // Sample counter mask +#define ADC_LB_CONT 0x00000020 // Continuation sample +#define ADC_LB_DIFF 0x00000010 // Differential sample +#define ADC_LB_TS 0x00000008 // Temperature sensor sample +#define ADC_LB_MUX_MASK 0x00000007 // Input channel number mask +#define ADC_LB_CNT_SHIFT 6 // Sample counter shift +#define ADC_LB_MUX_SHIFT 0 // Input channel number shift + +#endif // __HW_ADC_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_can.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_can.h new file mode 100644 index 000000000..02f7b7465 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_can.h @@ -0,0 +1,379 @@ +//***************************************************************************** +// +// hw_can.h - Defines and macros used when accessing the can. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_CAN_H__ +#define __HW_CAN_H__ + +//***************************************************************************** +// +// The following define the offsets of the can registers. +// +//***************************************************************************** +#define CAN_O_CTL 0x00000000 // Control register +#define CAN_O_STS 0x00000004 // Status register +#define CAN_O_ERR 0x00000008 // Error register +#define CAN_O_BIT 0x0000000C // Bit Timing register +#define CAN_O_INT 0x00000010 // Interrupt register +#define CAN_O_TST 0x00000014 // Test register +#define CAN_O_BRPE 0x00000018 // Baud Rate Prescaler register +#define CAN_O_IF1CRQ 0x00000020 // Interface 1 Command Request reg. +#define CAN_O_IF1CMSK 0x00000024 // Interface 1 Command Mask reg. +#define CAN_O_IF1MSK1 0x00000028 // Interface 1 Mask 1 register +#define CAN_O_IF1MSK2 0x0000002C // Interface 1 Mask 2 register +#define CAN_O_IF1ARB1 0x00000030 // Interface 1 Arbitration 1 reg. +#define CAN_O_IF1ARB2 0x00000034 // Interface 1 Arbitration 2 reg. +#define CAN_O_IF1MCTL 0x00000038 // Interface 1 Message Control reg. +#define CAN_O_IF1DA1 0x0000003C // Interface 1 DataA 1 register +#define CAN_O_IF1DA2 0x00000040 // Interface 1 DataA 2 register +#define CAN_O_IF1DB1 0x00000044 // Interface 1 DataB 1 register +#define CAN_O_IF1DB2 0x00000048 // Interface 1 DataB 2 register +#define CAN_O_IF2CRQ 0x00000080 // Interface 2 Command Request reg. +#define CAN_O_IF2CMSK 0x00000084 // Interface 2 Command Mask reg. +#define CAN_O_IF2MSK1 0x00000088 // Interface 2 Mask 1 register +#define CAN_O_IF2MSK2 0x0000008C // Interface 2 Mask 2 register +#define CAN_O_IF2ARB1 0x00000090 // Interface 2 Arbitration 1 reg. +#define CAN_O_IF2ARB2 0x00000094 // Interface 2 Arbitration 2 reg. +#define CAN_O_IF2MCTL 0x00000098 // Interface 2 Message Control reg. +#define CAN_O_IF2DA1 0x0000009C // Interface 2 DataA 1 register +#define CAN_O_IF2DA2 0x000000A0 // Interface 2 DataA 2 register +#define CAN_O_IF2DB1 0x000000A4 // Interface 2 DataB 1 register +#define CAN_O_IF2DB2 0x000000A8 // Interface 2 DataB 2 register +#define CAN_O_TXRQ1 0x00000100 // Transmission Request 1 register +#define CAN_O_TXRQ2 0x00000104 // Transmission Request 2 register +#define CAN_O_NWDA1 0x00000120 // New Data 1 register +#define CAN_O_NWDA2 0x00000124 // New Data 2 register +#define CAN_O_MSGINT1 0x00000140 // Intr. Pending in Msg Obj 1 reg. +#define CAN_O_MSGINT2 0x00000144 // Intr. Pending in Msg Obj 2 reg. +#define CAN_O_MSGVAL1 0x00000160 // Message Valid in Msg Obj 1 reg. +#define CAN_O_MSGVAL2 0x00000164 // Message Valid in Msg Obj 2 reg. + +//***************************************************************************** +// +// The following define the reset values of the can registers. +// +//***************************************************************************** +#define CAN_RV_CTL 0x00000001 +#define CAN_RV_STS 0x00000000 +#define CAN_RV_ERR 0x00000000 +#define CAN_RV_BIT 0x00002301 +#define CAN_RV_INT 0x00000000 +#define CAN_RV_TST 0x00000000 +#define CAN_RV_BRPE 0x00000000 +#define CAN_RV_IF1CRQ 0x00000001 +#define CAN_RV_IF1CMSK 0x00000000 +#define CAN_RV_IF1MSK1 0x0000FFFF +#define CAN_RV_IF1MSK2 0x0000FFFF +#define CAN_RV_IF1ARB1 0x00000000 +#define CAN_RV_IF1ARB2 0x00000000 +#define CAN_RV_IF1MCTL 0x00000000 +#define CAN_RV_IF1DA1 0x00000000 +#define CAN_RV_IF1DA2 0x00000000 +#define CAN_RV_IF1DB1 0x00000000 +#define CAN_RV_IF1DB2 0x00000000 +#define CAN_RV_IF2CRQ 0x00000001 +#define CAN_RV_IF2CMSK 0x00000000 +#define CAN_RV_IF2MSK1 0x0000FFFF +#define CAN_RV_IF2MSK2 0x0000FFFF +#define CAN_RV_IF2ARB1 0x00000000 +#define CAN_RV_IF2ARB2 0x00000000 +#define CAN_RV_IF2MCTL 0x00000000 +#define CAN_RV_IF2DA1 0x00000000 +#define CAN_RV_IF2DA2 0x00000000 +#define CAN_RV_IF2DB1 0x00000000 +#define CAN_RV_IF2DB2 0x00000000 +#define CAN_RV_TXRQ1 0x00000000 +#define CAN_RV_TXRQ2 0x00000000 +#define CAN_RV_NWDA1 0x00000000 +#define CAN_RV_NWDA2 0x00000000 +#define CAN_RV_MSGINT1 0x00000000 +#define CAN_RV_MSGINT2 0x00000000 +#define CAN_RV_MSGVAL1 0x00000000 +#define CAN_RV_MSGVAL2 0x00000000 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_CTL register. +// +//***************************************************************************** +#define CAN_CTL_TEST 0x00000080 // Test mode enable +#define CAN_CTL_CCE 0x00000040 // Configuration change enable +#define CAN_CTL_DAR 0x00000020 // Disable automatic retransmission +#define CAN_CTL_EIE 0x00000008 // Error interrupt enable +#define CAN_CTL_SIE 0x00000004 // Status change interrupt enable +#define CAN_CTL_IE 0x00000002 // Module interrupt enable +#define CAN_CTL_INIT 0x00000001 // Initialization + +//***************************************************************************** +// +// The following define the bit fields in the CAN_STS register. +// +//***************************************************************************** +#define CAN_STS_BOFF 0x00000080 // Bus Off status +#define CAN_STS_EWARN 0x00000040 // Error Warning status +#define CAN_STS_EPASS 0x00000020 // Error Passive status +#define CAN_STS_RXOK 0x00000010 // Received Message Successful +#define CAN_STS_TXOK 0x00000008 // Transmitted Message Successful +#define CAN_STS_LEC_MSK 0x00000007 // Last Error Code +#define CAN_STS_LEC_NONE 0x00000000 // No error +#define CAN_STS_LEC_STUFF 0x00000001 // Stuff error +#define CAN_STS_LEC_FORM 0x00000002 // Form(at) error +#define CAN_STS_LEC_ACK 0x00000003 // Ack error +#define CAN_STS_LEC_BIT1 0x00000004 // Bit 1 error +#define CAN_STS_LEC_BIT0 0x00000005 // Bit 0 error +#define CAN_STS_LEC_CRC 0x00000006 // CRC error + +//***************************************************************************** +// +// The following define the bit fields in the CAN_ERR register. +// +//***************************************************************************** +#define CAN_ERR_RP 0x00008000 // Receive error passive status +#define CAN_ERR_REC_MASK 0x00007F00 // Receive error counter status +#define CAN_ERR_REC_SHIFT 8 // Receive error counter bit pos +#define CAN_ERR_TEC_MASK 0x000000FF // Transmit error counter status +#define CAN_ERR_TEC_SHIFT 0 // Transmit error counter bit pos + +//***************************************************************************** +// +// The following define the bit fields in the CAN_BIT register. +// +//***************************************************************************** +#define CAN_BIT_TSEG2 0x00007000 // Time segment after sample point +#define CAN_BIT_TSEG1 0x00000F00 // Time segment before sample point +#define CAN_BIT_SJW 0x000000C0 // (Re)Synchronization jump width +#define CAN_BIT_BRP 0x0000003F // Baud rate prescaler + +//***************************************************************************** +// +// The following define the bit fields in the CAN_INT register. +// +//***************************************************************************** +#define CAN_INT_INTID_MSK 0x0000FFFF // Interrupt Identifier +#define CAN_INT_INTID_NONE 0x00000000 // No Interrupt Pending +#define CAN_INT_INTID_STATUS 0x00008000 // Status Interrupt + +//***************************************************************************** +// +// The following define the bit fields in the CAN_TST register. +// +//***************************************************************************** +#define CAN_TST_RX 0x00000080 // CAN_RX pin status +#define CAN_TST_TX_MSK 0x00000060 // Overide control of CAN_TX pin +#define CAN_TST_TX_CANCTL 0x00000000 // CAN core controls CAN_TX +#define CAN_TST_TX_SAMPLE 0x00000020 // Sample Point on CAN_TX +#define CAN_TST_TX_DOMINANT 0x00000040 // Dominant value on CAN_TX +#define CAN_TST_TX_RECESSIVE 0x00000060 // Recessive value on CAN_TX +#define CAN_TST_LBACK 0x00000010 // Loop back mode +#define CAN_TST_SILENT 0x00000008 // Silent mode +#define CAN_TST_BASIC 0x00000004 // Basic mode + +//***************************************************************************** +// +// The following define the bit fields in the CAN_BRPE register. +// +//***************************************************************************** +#define CAN_BRPE_BRPE 0x0000000F // Baud rate prescaler extension + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1CRQ and CAN_IF1CRQ +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFCRQ_BUSY 0x00008000 // Busy flag status +#define CAN_IFCRQ_MNUM_MSK 0x0000003F // Message Number + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1CMSK and CAN_IF2CMSK +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFCMSK_WRNRD 0x00000080 // Write, not Read +#define CAN_IFCMSK_MASK 0x00000040 // Access Mask Bits +#define CAN_IFCMSK_ARB 0x00000020 // Access Arbitration Bits +#define CAN_IFCMSK_CONTROL 0x00000010 // Access Control Bits +#define CAN_IFCMSK_CLRINTPND 0x00000008 // Clear interrupt pending Bit +#define CAN_IFCMSK_TXRQST 0x00000004 // Access Tx request bit (WRNRD=1) +#define CAN_IFCMSK_NEWDAT 0x00000004 // Access New Data bit (WRNRD=0) +#define CAN_IFCMSK_DATAA 0x00000002 // DataA access - bytes 0 to 3 +#define CAN_IFCMSK_DATAB 0x00000001 // DataB access - bytes 4 to 7 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1MSK1 and CAN_IF2MSK1 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFMSK1_MSK 0x0000FFFF // Identifier Mask + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1MSK2 and CAN_IF2MSK2 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFMSK2_MXTD 0x00008000 // Mask extended identifier +#define CAN_IFMSK2_MDIR 0x00004000 // Mask message direction +#define CAN_IFMSK2_MSK 0x00001FFF // Mask identifier + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1ARB1 and CAN_IF2ARB1 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFARB1_ID 0x0000FFFF // Identifier + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1ARB2 and CAN_IF2ARB2 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFARB2_MSGVAL 0x00008000 // Message valid +#define CAN_IFARB2_XTD 0x00004000 // Extended identifier +#define CAN_IFARB2_DIR 0x00002000 // Message direction +#define CAN_IFARB2_ID 0x00001FFF // Message identifier + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1MCTL and CAN_IF2MCTL +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFMCTL_NEWDAT 0x00008000 // New Data +#define CAN_IFMCTL_MSGLST 0x00004000 // Message lost +#define CAN_IFMCTL_INTPND 0x00002000 // Interrupt pending +#define CAN_IFMCTL_UMASK 0x00001000 // Use acceptance mask +#define CAN_IFMCTL_TXIE 0x00000800 // Transmit interrupt enable +#define CAN_IFMCTL_RXIE 0x00000400 // Receive interrupt enable +#define CAN_IFMCTL_RMTEN 0x00000200 // Remote enable +#define CAN_IFMCTL_TXRQST 0x00000100 // Transmit request +#define CAN_IFMCTL_EOB 0x00000080 // End of buffer +#define CAN_IFMCTL_DLC 0x0000000F // Data length code + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1DA1 and CAN_IF2DA1 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFDA1_DATA 0x0000FFFF // Data - bytes 1 and 0 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1DA2 and CAN_IF2DA2 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFDA2_DATA 0x0000FFFF // Data - bytes 3 and 2 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1DB1 and CAN_IF2DB1 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFDB1_DATA 0x0000FFFF // Data - bytes 5 and 4 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1DB2 and CAN_IF2DB2 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFDB2_DATA 0x0000FFFF // Data - bytes 7 and 6 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_TXRQ1 register. +// +//***************************************************************************** +#define CAN_TXRQ1_TXRQST 0x0000FFFF // Transmission Request Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_TXRQ2 register. +// +//***************************************************************************** +#define CAN_TXRQ2_TXRQST 0x0000FFFF // Transmission Request Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_NWDA1 register. +// +//***************************************************************************** +#define CAN_NWDA1_NEWDATA 0x0000FFFF // New Data Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_NWDA2 register. +// +//***************************************************************************** +#define CAN_NWDA2_NEWDATA 0x0000FFFF // New Data Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_MSGINT1 register. +// +//***************************************************************************** +#define CAN_MSGINT1_INTPND 0x0000FFFF // Interrupt Pending Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_MSGINT2 register. +// +//***************************************************************************** +#define CAN_MSGINT2_INTPND 0x0000FFFF // Interrupt Pending Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_MSGVAL1 register. +// +//***************************************************************************** +#define CAN_MSGVAL1_MSGVAL 0x0000FFFF // Message Valid Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_MSGVAL2 register. +// +//***************************************************************************** +#define CAN_MSGVAL2_MSGVAL 0x0000FFFF // Message Valid Bits + +#endif // __HW_CAN_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_comp.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_comp.h new file mode 100644 index 000000000..d8b355ea9 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_comp.h @@ -0,0 +1,118 @@ +//***************************************************************************** +// +// hw_comp.h - Macros used when accessing the comparator hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_COMP_H__ +#define __HW_COMP_H__ + +//***************************************************************************** +// +// The following define the offsets of the comparator registers. +// +//***************************************************************************** +#define COMP_O_MIS 0x00000000 // Interrupt status register +#define COMP_O_RIS 0x00000004 // Raw interrupt status register +#define COMP_O_INTEN 0x00000008 // Interrupt enable register +#define COMP_O_REFCTL 0x00000010 // Reference voltage control reg. +#define COMP_O_ACSTAT0 0x00000020 // Comp0 status register +#define COMP_O_ACCTL0 0x00000024 // Comp0 control register +#define COMP_O_ACSTAT1 0x00000040 // Comp1 status register +#define COMP_O_ACCTL1 0x00000044 // Comp1 control register +#define COMP_O_ACSTAT2 0x00000060 // Comp2 status register +#define COMP_O_ACCTL2 0x00000064 // Comp2 control register + +//***************************************************************************** +// +// The following define the bit fields in the COMP_MIS, COMP_RIS, and +// COMP_INTEN registers. +// +//***************************************************************************** +#define COMP_INT_2 0x00000004 // Comp2 interrupt +#define COMP_INT_1 0x00000002 // Comp1 interrupt +#define COMP_INT_0 0x00000001 // Comp0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the COMP_REFCTL register. +// +//***************************************************************************** +#define COMP_REFCTL_EN 0x00000200 // Reference voltage enable +#define COMP_REFCTL_RNG 0x00000100 // Reference voltage range +#define COMP_REFCTL_VREF_MASK 0x0000000F // Reference voltage select mask +#define COMP_REFCTL_VREF_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the COMP_ACSTAT0, COMP_ACSTAT1, and +// COMP_ACSTAT2 registers. +// +//***************************************************************************** +#define COMP_ACSTAT_OVAL 0x00000002 // Comparator output value + +//***************************************************************************** +// +// The following define the bit fields in the COMP_ACCTL0, COMP_ACCTL1, and +// COMP_ACCTL2 registers. +// +//***************************************************************************** +#define COMP_ACCTL_TMASK 0x00000800 // Trigger enable +#define COMP_ACCTL_ASRCP_MASK 0x00000600 // Vin+ source select mask +#define COMP_ACCTL_ASRCP_PIN 0x00000000 // Dedicated Comp+ pin +#define COMP_ACCTL_ASRCP_PIN0 0x00000200 // Comp0+ pin +#define COMP_ACCTL_ASRCP_REF 0x00000400 // Internal voltage reference +#define COMP_ACCTL_ASRCP_RES 0x00000600 // Reserved +#define COMP_ACCTL_OEN 0x00000100 // Comparator output enable +#define COMP_ACCTL_TSVAL 0x00000080 // Trigger polarity select +#define COMP_ACCTL_TSEN_MASK 0x00000060 // Trigger sense mask +#define COMP_ACCTL_TSEN_LEVEL 0x00000000 // Trigger is level sense +#define COMP_ACCTL_TSEN_FALL 0x00000020 // Trigger is falling edge +#define COMP_ACCTL_TSEN_RISE 0x00000040 // Trigger is rising edge +#define COMP_ACCTL_TSEN_BOTH 0x00000060 // Trigger is both edges +#define COMP_ACCTL_ISLVAL 0x00000010 // Interrupt polarity select +#define COMP_ACCTL_ISEN_MASK 0x0000000C // Interrupt sense mask +#define COMP_ACCTL_ISEN_LEVEL 0x00000000 // Interrupt is level sense +#define COMP_ACCTL_ISEN_FALL 0x00000004 // Interrupt is falling edge +#define COMP_ACCTL_ISEN_RISE 0x00000008 // Interrupt is rising edge +#define COMP_ACCTL_ISEN_BOTH 0x0000000C // Interrupt is both edges +#define COMP_ACCTL_CINV 0x00000002 // Comparator output invert + +//***************************************************************************** +// +// The following define the reset values for the comparator registers. +// +//***************************************************************************** +#define COMP_RV_MIS 0x00000000 // Interrupt status register +#define COMP_RV_RIS 0x00000000 // Raw interrupt status register +#define COMP_RV_INTEN 0x00000000 // Interrupt enable register +#define COMP_RV_REFCTL 0x00000000 // Reference voltage control reg. +#define COMP_RV_ACSTAT0 0x00000000 // Comp0 status register +#define COMP_RV_ACCTL0 0x00000000 // Comp0 control register +#define COMP_RV_ACSTAT1 0x00000000 // Comp1 status register +#define COMP_RV_ACCTL1 0x00000000 // Comp1 control register +#define COMP_RV_ACSTAT2 0x00000000 // Comp2 status register +#define COMP_RV_ACCTL2 0x00000000 // Comp2 control register + +#endif // __HW_COMP_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_ethernet.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_ethernet.h new file mode 100644 index 000000000..7a8d224cd --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_ethernet.h @@ -0,0 +1,205 @@ +//***************************************************************************** +// +// hw_ethernet.h - Macros used when accessing the ethernet hardware. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_ETHERNET_H__ +#define __HW_ETHERNET_H__ + +//***************************************************************************** +// +// The following define the offsets of the MAC registers in the Ethernet +// Controller. +// +//***************************************************************************** +#define MAC_O_IS 0x00000000 // Interrupt Status Register +#define MAC_O_IACK 0x00000000 // Interrupt Acknowledge Register +#define MAC_O_IM 0x00000004 // Interrupt Mask Register +#define MAC_O_RCTL 0x00000008 // Receive Control Register +#define MAC_O_TCTL 0x0000000C // Transmit Control Register +#define MAC_O_DATA 0x00000010 // Data Register +#define MAC_O_IA0 0x00000014 // Individual Address Register 0 +#define MAC_O_IA1 0x00000018 // Individual Address Register 1 +#define MAC_O_THR 0x0000001C // Threshold Register +#define MAC_O_MCTL 0x00000020 // Management Control Register +#define MAC_O_MDV 0x00000024 // Management Divider Register +#define MAC_O_MADD 0x00000028 // Management Address Register +#define MAC_O_MTXD 0x0000002C // Management Transmit Data Reg +#define MAC_O_MRXD 0x00000030 // Management Receive Data Reg +#define MAC_O_NP 0x00000034 // Number of Packets Register +#define MAC_O_TR 0x00000038 // Transmission Request Register + +//***************************************************************************** +// +// The following define the reset values of the MAC registers. +// +//***************************************************************************** +#define MAC_RV_IS 0x00000000 +#define MAC_RV_IACK 0x00000000 +#define MAC_RV_IM 0x0000007F +#define MAC_RV_RCTL 0x00000008 +#define MAC_RV_TCTL 0x00000000 +#define MAC_RV_DATA 0x00000000 +#define MAC_RV_IA0 0x00000000 +#define MAC_RV_IA1 0x00000000 +#define MAC_RV_THR 0x0000003F +#define MAC_RV_MCTL 0x00000000 +#define MAC_RV_MDV 0x00000080 +#define MAC_RV_MADD 0x00000000 +#define MAC_RV_MTXD 0x00000000 +#define MAC_RV_MRXD 0x00000000 +#define MAC_RV_NP 0x00000000 +#define MAC_RV_TR 0x00000000 + +//***************************************************************************** +// +// The following define the bit fields in the MAC_IS register. +// +//***************************************************************************** +#define MAC_IS_PHYINT 0x00000040 // PHY Interrupt +#define MAC_IS_MDINT 0x00000020 // MDI Transaction Complete +#define MAC_IS_RXER 0x00000010 // RX Error +#define MAC_IS_FOV 0x00000008 // RX FIFO Overrun +#define MAC_IS_TXEMP 0x00000004 // TX FIFO Empy +#define MAC_IS_TXER 0x00000002 // TX Error +#define MAC_IS_RXINT 0x00000001 // RX Packet Available + +//***************************************************************************** +// +// The following define the bit fields in the MAC_IACK register. +// +//***************************************************************************** +#define MAC_IACK_PHYINT 0x00000040 // Clear PHY Interrupt +#define MAC_IACK_MDINT 0x00000020 // Clear MDI Transaction Complete +#define MAC_IACK_RXER 0x00000010 // Clear RX Error +#define MAC_IACK_FOV 0x00000008 // Clear RX FIFO Overrun +#define MAC_IACK_TXEMP 0x00000004 // Clear TX FIFO Empy +#define MAC_IACK_TXER 0x00000002 // Clear TX Error +#define MAC_IACK_RXINT 0x00000001 // Clear RX Packet Available + +//***************************************************************************** +// +// The following define the bit fields in the MAC_IM register. +// +//***************************************************************************** +#define MAC_IM_PHYINTM 0x00000040 // Mask PHY Interrupt +#define MAC_IM_MDINTM 0x00000020 // Mask MDI Transaction Complete +#define MAC_IM_RXERM 0x00000010 // Mask RX Error +#define MAC_IM_FOVM 0x00000008 // Mask RX FIFO Overrun +#define MAC_IM_TXEMPM 0x00000004 // Mask TX FIFO Empy +#define MAC_IM_TXERM 0x00000002 // Mask TX Error +#define MAC_IM_RXINTM 0x00000001 // Mask RX Packet Available + +//***************************************************************************** +// +// The following define the bit fields in the MAC_RCTL register. +// +//***************************************************************************** +#define MAC_RCTL_RSTFIFO 0x00000010 // Clear the Receive FIFO +#define MAC_RCTL_BADCRC 0x00000008 // Reject Packets With Bad CRC +#define MAC_RCTL_PRMS 0x00000004 // Enable Promiscuous Mode +#define MAC_RCTL_AMUL 0x00000002 // Enable Multicast Packets +#define MAC_RCTL_RXEN 0x00000001 // Enable Ethernet Receiver + +//***************************************************************************** +// +// The following define the bit fields in the MAC_TCTL register. +// +//***************************************************************************** +#define MAC_TCTL_DUPLEX 0x00000010 // Enable Duplex mode +#define MAC_TCTL_CRC 0x00000004 // Enable CRC Generation +#define MAC_TCTL_PADEN 0x00000002 // Enable Automatic Padding +#define MAC_TCTL_TXEN 0x00000001 // Enable Ethernet Transmitter + +//***************************************************************************** +// +// The following define the bit fields in the MAC_IA0 register. +// +//***************************************************************************** +#define MAC_IA0_MACOCT4 0xFF000000 // 4th Octet of MAC address +#define MAC_IA0_MACOCT3 0x00FF0000 // 3rd Octet of MAC address +#define MAC_IA0_MACOCT2 0x0000FF00 // 2nd Octet of MAC address +#define MAC_IA0_MACOCT1 0x000000FF // 1st Octet of MAC address + +//***************************************************************************** +// +// The following define the bit fields in the MAC_IA1 register. +// +//***************************************************************************** +#define MAC_IA1_MACOCT6 0x0000FF00 // 6th Octet of MAC address +#define MAC_IA1_MACOCT5 0x000000FF // 5th Octet of MAC address + +//***************************************************************************** +// +// The following define the bit fields in the MAC_TXTH register. +// +//***************************************************************************** +#define MAC_THR_THRESH 0x0000003F // Transmit Threshold Value + +//***************************************************************************** +// +// The following define the bit fields in the MAC_MCTL register. +// +//***************************************************************************** +#define MAC_MCTL_REGADR 0x000000F8 // Address for Next MII Transaction +#define MAC_MCTL_WRITE 0x00000002 // Next MII Transaction is Write +#define MAC_MCTL_START 0x00000001 // Start MII Transaction + +//***************************************************************************** +// +// The following define the bit fields in the MAC_MDV register. +// +//***************************************************************************** +#define MAC_MDV_DIV 0x000000FF // Clock Divider for MDC for TX + +//***************************************************************************** +// +// The following define the bit fields in the MAC_MTXD register. +// +//***************************************************************************** +#define MAC_MTXD_MDTX 0x0000FFFF // Data for Next MII Transaction + +//***************************************************************************** +// +// The following define the bit fields in the MAC_MRXD register. +// +//***************************************************************************** +#define MAC_MRXD_MDRX 0x0000FFFF // Data Read from Last MII Trans. + +//***************************************************************************** +// +// The following define the bit fields in the MAC_NP register. +// +//***************************************************************************** +#define MAC_NP_NPR 0x0000003F // Number of RX Frames in FIFO + +//***************************************************************************** +// +// The following define the bit fields in the MAC_TXRQ register. +// +//***************************************************************************** +#define MAC_TR_NEWTX 0x00000001 // Start an Ethernet Transmission + +#endif // __HW_ETHERNET_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_flash.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_flash.h new file mode 100644 index 000000000..c5bea3b26 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_flash.h @@ -0,0 +1,147 @@ +//***************************************************************************** +// +// hw_flash.h - Macros used when accessing the flash controller. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_FLASH_H__ +#define __HW_FLASH_H__ + +//***************************************************************************** +// +// The following define the offsets of the FLASH registers. +// +//***************************************************************************** +#define FLASH_FMA 0x400FD000 // Memory address register +#define FLASH_FMD 0x400FD004 // Memory data register +#define FLASH_FMC 0x400FD008 // Memory control register +#define FLASH_FCRIS 0x400FD00c // Raw interrupt status register +#define FLASH_FCIM 0x400FD010 // Interrupt mask register +#define FLASH_FCMISC 0x400FD014 // Interrupt status register +#define FLASH_FMPRE 0x400FE130 // FLASH read protect register +#define FLASH_FMPPE 0x400FE134 // FLASH program protect register +#define FLASH_USECRL 0x400FE140 // uSec reload register +#define FLASH_FMPRE0 0x400FE200 // FLASH read protect register 0 +#define FLASH_FMPRE1 0x400FE204 // FLASH read protect register 1 +#define FLASH_FMPRE2 0x400FE208 // FLASH read protect register 2 +#define FLASH_FMPRE3 0x400FE20C // FLASH read protect register 3 +#define FLASH_FMPPE0 0x400FE400 // FLASH program protect register 0 +#define FLASH_FMPPE1 0x400FE404 // FLASH program protect register 1 +#define FLASH_FMPPE2 0x400FE408 // FLASH program protect register 2 +#define FLASH_FMPPE3 0x400FE40C // FLASH program protect register 3 + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FMC register. +// +//***************************************************************************** +#define FLASH_FMC_WRKEY_MASK 0xFFFF0000 // FLASH write key mask +#define FLASH_FMC_WRKEY 0xA4420000 // FLASH write key +#define FLASH_FMC_COMT 0x00000008 // Commit user register +#define FLASH_FMC_MERASE 0x00000004 // Mass erase FLASH +#define FLASH_FMC_ERASE 0x00000002 // Erase FLASH page +#define FLASH_FMC_WRITE 0x00000001 // Write FLASH word + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FCRIS register. +// +//***************************************************************************** +#define FLASH_FCRIS_PROGRAM 0x00000002 // Programming status +#define FLASH_FCRIS_ACCESS 0x00000001 // Invalid access status + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FCIM register. +// +//***************************************************************************** +#define FLASH_FCIM_PROGRAM 0x00000002 // Programming mask +#define FLASH_FCIM_ACCESS 0x00000001 // Invalid access mask + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FMIS register. +// +//***************************************************************************** +#define FLASH_FCMISC_PROGRAM 0x00000002 // Programming status +#define FLASH_FCMISC_ACCESS 0x00000001 // Invalid access status + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FMPRE and FLASH_FMPPE +// registers. +// +//***************************************************************************** +#define FLASH_FMP_BLOCK_31 0x80000000 // Enable for block 31 +#define FLASH_FMP_BLOCK_30 0x40000000 // Enable for block 30 +#define FLASH_FMP_BLOCK_29 0x20000000 // Enable for block 29 +#define FLASH_FMP_BLOCK_28 0x10000000 // Enable for block 28 +#define FLASH_FMP_BLOCK_27 0x08000000 // Enable for block 27 +#define FLASH_FMP_BLOCK_26 0x04000000 // Enable for block 26 +#define FLASH_FMP_BLOCK_25 0x02000000 // Enable for block 25 +#define FLASH_FMP_BLOCK_24 0x01000000 // Enable for block 24 +#define FLASH_FMP_BLOCK_23 0x00800000 // Enable for block 23 +#define FLASH_FMP_BLOCK_22 0x00400000 // Enable for block 22 +#define FLASH_FMP_BLOCK_21 0x00200000 // Enable for block 21 +#define FLASH_FMP_BLOCK_20 0x00100000 // Enable for block 20 +#define FLASH_FMP_BLOCK_19 0x00080000 // Enable for block 19 +#define FLASH_FMP_BLOCK_18 0x00040000 // Enable for block 18 +#define FLASH_FMP_BLOCK_17 0x00020000 // Enable for block 17 +#define FLASH_FMP_BLOCK_16 0x00010000 // Enable for block 16 +#define FLASH_FMP_BLOCK_15 0x00008000 // Enable for block 15 +#define FLASH_FMP_BLOCK_14 0x00004000 // Enable for block 14 +#define FLASH_FMP_BLOCK_13 0x00002000 // Enable for block 13 +#define FLASH_FMP_BLOCK_12 0x00001000 // Enable for block 12 +#define FLASH_FMP_BLOCK_11 0x00000800 // Enable for block 11 +#define FLASH_FMP_BLOCK_10 0x00000400 // Enable for block 10 +#define FLASH_FMP_BLOCK_9 0x00000200 // Enable for block 9 +#define FLASH_FMP_BLOCK_8 0x00000100 // Enable for block 8 +#define FLASH_FMP_BLOCK_7 0x00000080 // Enable for block 7 +#define FLASH_FMP_BLOCK_6 0x00000040 // Enable for block 6 +#define FLASH_FMP_BLOCK_5 0x00000020 // Enable for block 5 +#define FLASH_FMP_BLOCK_4 0x00000010 // Enable for block 4 +#define FLASH_FMP_BLOCK_3 0x00000008 // Enable for block 3 +#define FLASH_FMP_BLOCK_2 0x00000004 // Enable for block 2 +#define FLASH_FMP_BLOCK_1 0x00000002 // Enable for block 1 +#define FLASH_FMP_BLOCK_0 0x00000001 // Enable for block 0 + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_USECRL register. +// +//***************************************************************************** +#define FLASH_USECRL_MASK 0x000000FF // Clock per uSec +#define FLASH_USECRL_SHIFT 0 + +//***************************************************************************** +// +// The erase size is the size of the FLASH block that is erased by an erase +// operation, and the protect size is the size of the FLASH block that is +// protected by each protection register. +// +//***************************************************************************** +#define FLASH_ERASE_SIZE 0x00000400 +#define FLASH_PROTECT_SIZE 0x00000800 + +#endif // __HW_FLASH_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_gpio.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_gpio.h new file mode 100644 index 000000000..3596325a7 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_gpio.h @@ -0,0 +1,115 @@ +//***************************************************************************** +// +// hw_gpio.h - Defines and Macros for GPIO hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_GPIO_H__ +#define __HW_GPIO_H__ + +//***************************************************************************** +// +// GPIO Register Offsets. +// +//***************************************************************************** +#define GPIO_O_DATA 0x00000000 // Data register. +#define GPIO_O_DIR 0x00000400 // Data direction register. +#define GPIO_O_IS 0x00000404 // Interrupt sense register. +#define GPIO_O_IBE 0x00000408 // Interrupt both edges register. +#define GPIO_O_IEV 0x0000040C // Intterupt event register. +#define GPIO_O_IM 0x00000410 // Interrupt mask register. +#define GPIO_O_RIS 0x00000414 // Raw interrupt status register. +#define GPIO_O_MIS 0x00000418 // Masked interrupt status reg. +#define GPIO_O_ICR 0x0000041C // Interrupt clear register. +#define GPIO_O_AFSEL 0x00000420 // Mode control select register. +#define GPIO_O_DR2R 0x00000500 // 2ma drive select register. +#define GPIO_O_DR4R 0x00000504 // 4ma drive select register. +#define GPIO_O_DR8R 0x00000508 // 8ma drive select register. +#define GPIO_O_ODR 0x0000050C // Open drain select register. +#define GPIO_O_PUR 0x00000510 // Pull up select register. +#define GPIO_O_PDR 0x00000514 // Pull down select register. +#define GPIO_O_SLR 0x00000518 // Slew rate control enable reg. +#define GPIO_O_DEN 0x0000051C // Digital input enable register. +#define GPIO_O_LOCK 0x00000520 // Lock register. +#define GPIO_O_CR 0x00000524 // Commit register. +#define GPIO_O_PeriphID4 0x00000FD0 // +#define GPIO_O_PeriphID5 0x00000FD4 // +#define GPIO_O_PeriphID6 0x00000FD8 // +#define GPIO_O_PeriphID7 0x00000FDC // +#define GPIO_O_PeriphID0 0x00000FE0 // +#define GPIO_O_PeriphID1 0x00000FE4 // +#define GPIO_O_PeriphID2 0x00000FE8 // +#define GPIO_O_PeriphID3 0x00000FEC // +#define GPIO_O_PCellID0 0x00000FF0 // +#define GPIO_O_PCellID1 0x00000FF4 // +#define GPIO_O_PCellID2 0x00000FF8 // +#define GPIO_O_PCellID3 0x00000FFC // + +//***************************************************************************** +// +// The following define the bit fields in the GPIO_LOCK register. +// +//***************************************************************************** +#define GPIO_LOCK_LOCKED 0x00000001 // GPIO_CR register is locked +#define GPIO_LOCK_UNLOCKED 0x00000000 // GPIO_CR register is unlocked +#define GPIO_LOCK_KEY 0x1ACCE551 // Unlocks the GPIO_CR register + +//***************************************************************************** +// +// GPIO Register reset values. +// +//***************************************************************************** +#define GPIO_RV_DATA 0x00000000 // Data register reset value. +#define GPIO_RV_DIR 0x00000000 // Data direction reg RV. +#define GPIO_RV_IS 0x00000000 // Interrupt sense reg RV. +#define GPIO_RV_IBE 0x00000000 // Interrupt both edges reg RV. +#define GPIO_RV_IEV 0x00000000 // Intterupt event reg RV. +#define GPIO_RV_IM 0x00000000 // Interrupt mask reg RV. +#define GPIO_RV_RIS 0x00000000 // Raw interrupt status reg RV. +#define GPIO_RV_MIS 0x00000000 // Masked interrupt status reg RV. +#define GPIO_RV_IC 0x00000000 // Interrupt clear reg RV. +#define GPIO_RV_AFSEL 0x00000000 // Mode control select reg RV. +#define GPIO_RV_DR2R 0x000000FF // 2ma drive select reg RV. +#define GPIO_RV_DR4R 0x00000000 // 4ma drive select reg RV. +#define GPIO_RV_DR8R 0x00000000 // 8ma drive select reg RV. +#define GPIO_RV_ODR 0x00000000 // Open drain select reg RV. +#define GPIO_RV_PUR 0x000000FF // Pull up select reg RV. +#define GPIO_RV_PDR 0x00000000 // Pull down select reg RV. +#define GPIO_RV_SLR 0x00000000 // Slew rate control enable reg RV. +#define GPIO_RV_DEN 0x000000FF // Digital input enable reg RV. +#define GPIO_RV_LOCK 0x00000001 // Lock register RV. +#define GPIO_RV_PeriphID4 0x00000000 // +#define GPIO_RV_PeriphID5 0x00000000 // +#define GPIO_RV_PeriphID6 0x00000000 // +#define GPIO_RV_PeriphID7 0x00000000 // +#define GPIO_RV_PeriphID0 0x00000061 // +#define GPIO_RV_PeriphID1 0x00000010 // +#define GPIO_RV_PeriphID2 0x00000004 // +#define GPIO_RV_PeriphID3 0x00000000 // +#define GPIO_RV_PCellID0 0x0000000D // +#define GPIO_RV_PCellID1 0x000000F0 // +#define GPIO_RV_PCellID2 0x00000005 // +#define GPIO_RV_PCellID3 0x000000B1 // + +#endif // __HW_GPIO_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_hibernate.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_hibernate.h new file mode 100644 index 000000000..ee730d4c5 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_hibernate.h @@ -0,0 +1,145 @@ +//***************************************************************************** +// +// hw_hibernate.h - Defines and Macros for the Hibernation module. +// +// Copyright (c) 2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_HIBERNATE_H__ +#define __HW_HIBERNATE_H__ + +//***************************************************************************** +// +// The following define the addresses of the hibernation module registers. +// +//***************************************************************************** +#define HIB_RTCC 0x400fc000 // Hibernate RTC counter +#define HIB_RTCM0 0x400fc004 // Hibernate RTC match 0 +#define HIB_RTCM1 0x400fc008 // Hibernate RTC match 1 +#define HIB_RTCLD 0x400fc00C // Hibernate RTC load +#define HIB_CTL 0x400fc010 // Hibernate RTC control +#define HIB_IM 0x400fc014 // Hibernate interrupt mask +#define HIB_RIS 0x400fc018 // Hibernate raw interrupt status +#define HIB_MIS 0x400fc01C // Hibernate masked interrupt stat +#define HIB_IC 0x400fc020 // Hibernate interrupt clear +#define HIB_RTCT 0x400fc024 // Hibernate RTC trim +#define HIB_DATA 0x400fc030 // Hibernate data area +#define HIB_DATA_END 0x400fc130 // end of data area, exclusive + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate RTC counter register. +// +//***************************************************************************** +#define HIB_RTCC_MASK 0xffffffff // RTC counter mask + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate RTC match 0 register. +// +//***************************************************************************** +#define HIB_RTCM0_MASK 0xffffffff // RTC match 0 mask + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate RTC match 1 register. +// +//***************************************************************************** +#define HIB_RTCM1_MASK 0xffffffff // RTC match 1 mask + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate RTC load register. +// +//***************************************************************************** +#define HIB_RTCLD_MASK 0xffffffff // RTC load mask + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate control register +// +//***************************************************************************** +#define HIB_CTL_VABORT 0x00000080 // low bat abort +#define HIB_CTL_CLK32EN 0x00000040 // enable clock/oscillator +#define HIB_CTL_LOWBATEN 0x00000020 // enable low battery detect +#define HIB_CTL_PINWEN 0x00000010 // enable wake on WAKE pin +#define HIB_CTL_RTCWEN 0x00000008 // enable wake on RTC match +#define HIB_CTL_CLKSEL 0x00000004 // clock input selection +#define HIB_CTL_HIBREQ 0x00000002 // request hibernation +#define HIB_CTL_RTCEN 0x00000001 // RTC enable + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate interrupt mask reg. +// +//***************************************************************************** +#define HIB_IM_EXTW 0x00000008 // wake from external pin interrupt +#define HIB_IM_LOWBAT 0x00000004 // low battery interrupt +#define HIB_IM_RTCALT1 0x00000002 // RTC match 1 interrupt +#define HIB_IM_RTCALT0 0x00000001 // RTC match 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate raw interrupt status. +// +//***************************************************************************** +#define HIB_RIS_EXTW 0x00000008 // wake from external pin interrupt +#define HIB_RIS_LOWBAT 0x00000004 // low battery interrupt +#define HIB_RIS_RTCALT1 0x00000002 // RTC match 1 interrupt +#define HIB_RID_RTCALT0 0x00000001 // RTC match 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate masked int status. +// +//***************************************************************************** +#define HIB_MIS_EXTW 0x00000008 // wake from external pin interrupt +#define HIB_MIS_LOWBAT 0x00000004 // low battery interrupt +#define HIB_MIS_RTCALT1 0x00000002 // RTC match 1 interrupt +#define HIB_MID_RTCALT0 0x00000001 // RTC match 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate interrupt clear reg. +// +//***************************************************************************** +#define HIB_IC_EXTW 0x00000008 // wake from external pin interrupt +#define HIB_IC_LOWBAT 0x00000004 // low battery interrupt +#define HIB_IC_RTCALT1 0x00000002 // RTC match 1 interrupt +#define HIB_IC_RTCALT0 0x00000001 // RTC match 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate RTC trim register. +// +//***************************************************************************** +#define HIB_RTCT_MASK 0x0000ffff // RTC trim mask + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate data register. +// +//***************************************************************************** +#define HIB_DATA_MASK 0xffffffff // NV memory data mask + +#endif // __HW_HIBERNATE_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_i2c.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_i2c.h new file mode 100644 index 000000000..b90edb7df --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_i2c.h @@ -0,0 +1,197 @@ +//***************************************************************************** +// +// hw_i2c.h - Macros used when accessing the I2C master and slave hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_I2C_H__ +#define __HW_I2C_H__ + +//***************************************************************************** +// +// The following defines the offset between the I2C master and slave registers. +// +//***************************************************************************** +#define I2C_O_SLAVE 0x00000800 // Offset from master to slave + +//***************************************************************************** +// +// The following define the offsets of the I2C master registers. +// +//***************************************************************************** +#define I2C_MASTER_O_SA 0x00000000 // Slave address register +#define I2C_MASTER_O_CS 0x00000004 // Control and Status register +#define I2C_MASTER_O_DR 0x00000008 // Data register +#define I2C_MASTER_O_TPR 0x0000000C // Timer period register +#define I2C_MASTER_O_IMR 0x00000010 // Interrupt mask register +#define I2C_MASTER_O_RIS 0x00000014 // Raw interrupt status register +#define I2C_MASTER_O_MIS 0x00000018 // Masked interrupt status reg +#define I2C_MASTER_O_MICR 0x0000001c // Interrupt clear register +#define I2C_MASTER_O_CR 0x00000020 // Configuration register + +//***************************************************************************** +// +// The following define the offsets of the I2C slave registers. +// +//***************************************************************************** +#define I2C_SLAVE_O_OAR 0x00000000 // Own address register +#define I2C_SLAVE_O_CSR 0x00000004 // Control/Status register +#define I2C_SLAVE_O_DR 0x00000008 // Data register +#define I2C_SLAVE_O_IM 0x0000000C // Interrupt mask register +#define I2C_SLAVE_O_RIS 0x00000010 // Raw interrupt status register +#define I2C_SLAVE_O_MIS 0x00000014 // Masked interrupt status reg +#define I2C_SLAVE_O_SICR 0x00000018 // Interrupt clear register + +//***************************************************************************** +// +// The followng define the bit fields in the I2C master slave address register. +// +//***************************************************************************** +#define I2C_MASTER_SA_SA_MASK 0x000000FE // Slave address +#define I2C_MASTER_SA_RS 0x00000001 // Receive/send +#define I2C_MASTER_SA_SA_SHIFT 1 + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Control and Status +// register. +// +//***************************************************************************** +#define I2C_MASTER_CS_ACK 0x00000008 // Acknowlegde +#define I2C_MASTER_CS_STOP 0x00000004 // Stop +#define I2C_MASTER_CS_START 0x00000002 // Start +#define I2C_MASTER_CS_RUN 0x00000001 // Run +#define I2C_MASTER_CS_BUS_BUSY 0x00000040 // Bus busy +#define I2C_MASTER_CS_IDLE 0x00000020 // Idle +#define I2C_MASTER_CS_ARB_LOST 0x00000010 // Lost arbitration +#define I2C_MASTER_CS_DATA_ACK 0x00000008 // Data byte not acknowledged +#define I2C_MASTER_CS_ADDR_ACK 0x00000004 // Address byte not acknowledged +#define I2C_MASTER_CS_ERROR 0x00000002 // Error occurred +#define I2C_MASTER_CS_BUSY 0x00000001 // Controller is TX/RX data +#define I2C_MASTER_CS_ERR_MASK 0x0000001C + +//***************************************************************************** +// +// The following define values used in determining the contents of the I2C +// Master Timer Period register. +// +//***************************************************************************** +#define I2C_MASTER_TPR_SCL_HP 0x00000004 // SCL high period +#define I2C_MASTER_TPR_SCL_LP 0x00000006 // SCL low period +#define I2C_MASTER_TPR_SCL (I2C_MASTER_TPR_SCL_HP + I2C_MASTER_TPR_SCL_LP) +#define I2C_SCL_STANDARD 100000 // SCL standard frequency +#define I2C_SCL_FAST 400000 // SCL fast frequency + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Interrupt Mask +// register. +// +//***************************************************************************** +#define I2C_MASTER_IMR_IM 0x00000001 // Master interrupt mask + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Raw Interrupt Status +// register. +// +//***************************************************************************** +#define I2C_MASTER_RIS_RIS 0x00000001 // Master raw interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Masked Interrupt +// Status register. +// +//***************************************************************************** +#define I2C_MASTER_MIS_MIS 0x00000001 // Master masked interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Interrupt Clear +// register. +// +//***************************************************************************** +#define I2C_MASTER_MICR_IC 0x00000001 // Master interrupt clear + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Configuration +// register. +// +//***************************************************************************** +#define I2C_MASTER_CR_SFE 0x00000020 // Slave function enable +#define I2C_MASTER_CR_MFE 0x00000010 // Master function enable +#define I2C_MASTER_CR_LPBK 0x00000001 // Loopback enable + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Own Address register. +// +//***************************************************************************** +#define I2C_SLAVE_SOAR_OAR_MASK 0x0000007F // Slave address + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Control/Status +// register. +// +//***************************************************************************** +#define I2C_SLAVE_CSR_DA 0x00000001 // Enable the device +#define I2C_SLAVE_CSR_TREQ 0x00000002 // Transmit request received +#define I2C_SLAVE_CSR_RREQ 0x00000001 // Receive data from I2C master + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Interrupt Mask +// register. +// +//***************************************************************************** +#define I2C_SLAVE_IMR_IM 0x00000001 // Slave interrupt mask + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Raw Interrupt Status +// register. +// +//***************************************************************************** +#define I2C_SLAVE_RIS_RIS 0x00000001 // Slave raw interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Masked Interrupt +// Status register. +// +//***************************************************************************** +#define I2C_SLAVE_MIS_MIS 0x00000001 // Slave masked interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Interrupt Clear +// register. +// +//***************************************************************************** +#define I2C_SLAVE_SICR_IC 0x00000001 // Slave interrupt clear + +#endif // __HW_I2C_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_ints.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_ints.h new file mode 100644 index 000000000..d2df4ee5b --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_ints.h @@ -0,0 +1,113 @@ +//***************************************************************************** +// +// hw_ints.h - Macros that define the interrupt assignment on Stellaris. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_INTS_H__ +#define __HW_INTS_H__ + +//***************************************************************************** +// +// The following define the fault assignments. +// +//***************************************************************************** +#define FAULT_NMI 2 // NMI fault +#define FAULT_HARD 3 // Hard fault +#define FAULT_MPU 4 // MPU fault +#define FAULT_BUS 5 // Bus fault +#define FAULT_USAGE 6 // Usage fault +#define FAULT_SVCALL 11 // SVCall +#define FAULT_DEBUG 12 // Debug monitor +#define FAULT_PENDSV 14 // PendSV +#define FAULT_SYSTICK 15 // System Tick + +//***************************************************************************** +// +// The following define the interrupt assignments. +// +//***************************************************************************** +#define INT_GPIOA 16 // GPIO Port A +#define INT_GPIOB 17 // GPIO Port B +#define INT_GPIOC 18 // GPIO Port C +#define INT_GPIOD 19 // GPIO Port D +#define INT_GPIOE 20 // GPIO Port E +#define INT_UART0 21 // UART0 Rx and Tx +#define INT_UART1 22 // UART1 Rx and Tx +#define INT_SSI 23 // SSI Rx and Tx +#define INT_SSI0 23 // SSI0 Rx and Tx +#define INT_I2C 24 // I2C Master and Slave +#define INT_I2C0 24 // I2C0 Master and Slave +#define INT_PWM_FAULT 25 // PWM Fault +#define INT_PWM0 26 // PWM Generator 0 +#define INT_PWM1 27 // PWM Generator 1 +#define INT_PWM2 28 // PWM Generator 2 +#define INT_QEI 29 // Quadrature Encoder +#define INT_QEI0 29 // Quadrature Encoder 0 +#define INT_ADC0 30 // ADC Sequence 0 +#define INT_ADC1 31 // ADC Sequence 1 +#define INT_ADC2 32 // ADC Sequence 2 +#define INT_ADC3 33 // ADC Sequence 3 +#define INT_WATCHDOG 34 // Watchdog timer +#define INT_TIMER0A 35 // Timer 0 subtimer A +#define INT_TIMER0B 36 // Timer 0 subtimer B +#define INT_TIMER1A 37 // Timer 1 subtimer A +#define INT_TIMER1B 38 // Timer 1 subtimer B +#define INT_TIMER2A 39 // Timer 2 subtimer A +#define INT_TIMER2B 40 // Timer 2 subtimer B +#define INT_COMP0 41 // Analog Comparator 0 +#define INT_COMP1 42 // Analog Comparator 1 +#define INT_COMP2 43 // Analog Comparator 2 +#define INT_SYSCTL 44 // System Control (PLL, OSC, BO) +#define INT_FLASH 45 // FLASH Control +#define INT_GPIOF 46 // GPIO Port F +#define INT_GPIOG 47 // GPIO Port G +#define INT_GPIOH 48 // GPIO Port H +#define INT_UART2 49 // UART2 Rx and Tx +#define INT_SSI1 50 // SSI1 Rx and Tx +#define INT_TIMER3A 51 // Timer 3 subtimer A +#define INT_TIMER3B 52 // Timer 3 subtimer B +#define INT_I2C1 53 // I2C1 Master and Slave +#define INT_QEI1 54 // Quadrature Encoder 1 +#define INT_CAN0 55 // CAN0 +#define INT_CAN1 56 // CAN1 +#define INT_ETH 58 // Ethernet +#define INT_HIBERNATE 59 // Hibernation module + +//***************************************************************************** +// +// The total number of interrupts. +// +//***************************************************************************** +#define NUM_INTERRUPTS 60 + +//***************************************************************************** +// +// The total number of priority levels. +// +//***************************************************************************** +#define NUM_PRIORITY 8 +#define NUM_PRIORITY_BITS 3 + +#endif // __HW_INTS_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_memmap.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_memmap.h new file mode 100644 index 000000000..8ae2a06cd --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_memmap.h @@ -0,0 +1,80 @@ +//***************************************************************************** +// +// hw_memmap.h - Macros defining the memory map of Stellaris. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_MEMMAP_H__ +#define __HW_MEMMAP_H__ + +//***************************************************************************** +// +// The following define the base address of the memories and peripherals. +// +//***************************************************************************** +#define FLASH_BASE 0x00000000 // FLASH memory +#define SRAM_BASE 0x20000000 // SRAM memory +#define WATCHDOG_BASE 0x40000000 // Watchdog +#define GPIO_PORTA_BASE 0x40004000 // GPIO Port A +#define GPIO_PORTB_BASE 0x40005000 // GPIO Port B +#define GPIO_PORTC_BASE 0x40006000 // GPIO Port C +#define GPIO_PORTD_BASE 0x40007000 // GPIO Port D +#define SSI_BASE 0x40008000 // SSI +#define SSI0_BASE 0x40008000 // SSI0 +#define SSI1_BASE 0x40009000 // SSI1 +#define UART0_BASE 0x4000C000 // UART0 +#define UART1_BASE 0x4000D000 // UART1 +#define UART2_BASE 0x4000E000 // UART2 +#define I2C_MASTER_BASE 0x40020000 // I2C Master +#define I2C_SLAVE_BASE 0x40020800 // I2C Slave +#define I2C0_MASTER_BASE 0x40020000 // I2C0 Master +#define I2C0_SLAVE_BASE 0x40020800 // I2C0 Slave +#define I2C1_MASTER_BASE 0x40021000 // I2C1 Master +#define I2C1_SLAVE_BASE 0x40021800 // I2C1 Slave +#define GPIO_PORTE_BASE 0x40024000 // GPIO Port E +#define GPIO_PORTF_BASE 0x40025000 // GPIO Port F +#define GPIO_PORTG_BASE 0x40026000 // GPIO Port G +#define GPIO_PORTH_BASE 0x40027000 // GPIO Port H +#define PWM_BASE 0x40028000 // PWM +#define QEI_BASE 0x4002C000 // QEI +#define QEI0_BASE 0x4002C000 // QEI0 +#define QEI1_BASE 0x4002D000 // QEI1 +#define TIMER0_BASE 0x40030000 // Timer0 +#define TIMER1_BASE 0x40031000 // Timer1 +#define TIMER2_BASE 0x40032000 // Timer2 +#define TIMER3_BASE 0x40033000 // Timer3 +#define ADC_BASE 0x40038000 // ADC +#define COMP_BASE 0x4003C000 // Analog comparators +#define CAN0_BASE 0x40040000 // CAN0 +#define CAN1_BASE 0x40041000 // CAN1 +#define ETH_BASE 0x40048000 // Ethernet +#define FLASH_CTRL_BASE 0x400FD000 // FLASH Controller +#define SYSCTL_BASE 0x400FE000 // System Control +#define ITM_BASE 0xE0000000 // Instrumentation Trace Macrocell +#define DWT_BASE 0xE0001000 // Data Watchpoint and Trace +#define FPB_BASE 0xE0002000 // FLASH Patch and Breakpoint +#define NVIC_BASE 0xE000E000 // Nested Vectored Interrupt Ctrl +#define TPIU_BASE 0xE0040000 // Trace Port Interface Unit + +#endif // __HW_MEMMAP_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_nvic.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_nvic.h new file mode 100644 index 000000000..68c8d7c7f --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_nvic.h @@ -0,0 +1,1050 @@ +//***************************************************************************** +// +// hw_nvic.h - Macros used when accessing the NVIC hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_NVIC_H__ +#define __HW_NVIC_H__ + +//***************************************************************************** +// +// The following define the addresses of the NVIC registers. +// +//***************************************************************************** +#define NVIC_INT_TYPE 0xE000E004 // Interrupt Controller Type Reg. +#define NVIC_ST_CTRL 0xE000E010 // SysTick Control and Status Reg. +#define NVIC_ST_RELOAD 0xE000E014 // SysTick Reload Value Register +#define NVIC_ST_CURRENT 0xE000E018 // SysTick Current Value Register +#define NVIC_ST_CAL 0xE000E01C // SysTick Calibration Value Reg. +#define NVIC_EN0 0xE000E100 // IRQ 0 to 31 Set Enable Register +#define NVIC_EN1 0xE000E104 // IRQ 32 to 63 Set Enable Register +#define NVIC_DIS0 0xE000E180 // IRQ 0 to 31 Clear Enable Reg. +#define NVIC_DIS1 0xE000E184 // IRQ 32 to 63 Clear Enable Reg. +#define NVIC_PEND0 0xE000E200 // IRQ 0 to 31 Set Pending Register +#define NVIC_PEND1 0xE000E204 // IRQ 32 to 63 Set Pending Reg. +#define NVIC_UNPEND0 0xE000E280 // IRQ 0 to 31 Clear Pending Reg. +#define NVIC_UNPEND1 0xE000E284 // IRQ 32 to 63 Clear Pending Reg. +#define NVIC_ACTIVE0 0xE000E300 // IRQ 0 to 31 Active Register +#define NVIC_ACTIVE1 0xE000E304 // IRQ 32 to 63 Active Register +#define NVIC_PRI0 0xE000E400 // IRQ 0 to 3 Priority Register +#define NVIC_PRI1 0xE000E404 // IRQ 4 to 7 Priority Register +#define NVIC_PRI2 0xE000E408 // IRQ 8 to 11 Priority Register +#define NVIC_PRI3 0xE000E40C // IRQ 12 to 15 Priority Register +#define NVIC_PRI4 0xE000E410 // IRQ 16 to 19 Priority Register +#define NVIC_PRI5 0xE000E414 // IRQ 20 to 23 Priority Register +#define NVIC_PRI6 0xE000E418 // IRQ 24 to 27 Priority Register +#define NVIC_PRI7 0xE000E41C // IRQ 28 to 31 Priority Register +#define NVIC_PRI8 0xE000E420 // IRQ 32 to 35 Priority Register +#define NVIC_PRI9 0xE000E424 // IRQ 36 to 39 Priority Register +#define NVIC_PRI10 0xE000E428 // IRQ 40 to 43 Priority Register +#define NVIC_CPUID 0xE000ED00 // CPUID Base Register +#define NVIC_INT_CTRL 0xE000ED04 // Interrupt Control State Register +#define NVIC_VTABLE 0xE000ED08 // Vector Table Offset Register +#define NVIC_APINT 0xE000ED0C // App. Int & Reset Control Reg. +#define NVIC_SYS_CTRL 0xE000ED10 // System Control Register +#define NVIC_CFG_CTRL 0xE000ED14 // Configuration Control Register +#define NVIC_SYS_PRI1 0xE000ED18 // Sys. Handlers 4 to 7 Priority +#define NVIC_SYS_PRI2 0xE000ED1C // Sys. Handlers 8 to 11 Priority +#define NVIC_SYS_PRI3 0xE000ED20 // Sys. Handlers 12 to 15 Priority +#define NVIC_SYS_HND_CTRL 0xE000ED24 // System Handler Control and State +#define NVIC_FAULT_STAT 0xE000ED28 // Configurable Fault Status Reg. +#define NVIC_HFAULT_STAT 0xE000ED2C // Hard Fault Status Register +#define NVIC_DEBUG_STAT 0xE000ED30 // Debug Status Register +#define NVIC_MM_ADDR 0xE000ED34 // Mem Manage Address Register +#define NVIC_FAULT_ADDR 0xE000ED38 // Bus Fault Address Register +#define NVIC_MPU_TYPE 0xE000ED90 // MPU Type Register +#define NVIC_MPU_CTRL 0xE000ED94 // MPU Control Register +#define NVIC_MPU_NUMBER 0xE000ED98 // MPU Region Number Register +#define NVIC_MPU_BASE 0xE000ED9C // MPU Region Base Address Register +#define NVIC_MPU_ATTR 0xE000EDA0 // MPU Region Attribute & Size Reg. +#define NVIC_DBG_CTRL 0xE000EDF0 // Debug Control and Status Reg. +#define NVIC_DBG_XFER 0xE000EDF4 // Debug Core Reg. Transfer Select +#define NVIC_DBG_DATA 0xE000EDF8 // Debug Core Register Data +#define NVIC_DBG_INT 0xE000EDFC // Debug Reset Interrupt Control +#define NVIC_SW_TRIG 0xE000EF00 // Software Trigger Interrupt Reg. + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_INT_TYPE register. +// +//***************************************************************************** +#define NVIC_INT_TYPE_LINES_M 0x0000001F // Number of interrupt lines (x32) +#define NVIC_INT_TYPE_LINES_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CTRL register. +// +//***************************************************************************** +#define NVIC_ST_CTRL_COUNT 0x00010000 // Count flag +#define NVIC_ST_CTRL_CLK_SRC 0x00000004 // Clock Source +#define NVIC_ST_CTRL_INTEN 0x00000002 // Interrupt enable +#define NVIC_ST_CTRL_ENABLE 0x00000001 // Counter mode + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_RELOAD register. +// +//***************************************************************************** +#define NVIC_ST_RELOAD_M 0x00FFFFFF // Counter load value +#define NVIC_ST_RELOAD_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CURRENT register. +// +//***************************************************************************** +#define NVIC_ST_CURRENT_M 0x00FFFFFF // Counter current value +#define NVIC_ST_CURRENT_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CAL register. +// +//***************************************************************************** +#define NVIC_ST_CAL_NOREF 0x80000000 // No reference clock +#define NVIC_ST_CAL_SKEW 0x40000000 // Clock skew +#define NVIC_ST_CAL_ONEMS_M 0x00FFFFFF // 1ms reference value +#define NVIC_ST_CAL_ONEMS_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EN0 register. +// +//***************************************************************************** +#define NVIC_EN0_INT31 0x80000000 // Interrupt 31 enable +#define NVIC_EN0_INT30 0x40000000 // Interrupt 30 enable +#define NVIC_EN0_INT29 0x20000000 // Interrupt 29 enable +#define NVIC_EN0_INT28 0x10000000 // Interrupt 28 enable +#define NVIC_EN0_INT27 0x08000000 // Interrupt 27 enable +#define NVIC_EN0_INT26 0x04000000 // Interrupt 26 enable +#define NVIC_EN0_INT25 0x02000000 // Interrupt 25 enable +#define NVIC_EN0_INT24 0x01000000 // Interrupt 24 enable +#define NVIC_EN0_INT23 0x00800000 // Interrupt 23 enable +#define NVIC_EN0_INT22 0x00400000 // Interrupt 22 enable +#define NVIC_EN0_INT21 0x00200000 // Interrupt 21 enable +#define NVIC_EN0_INT20 0x00100000 // Interrupt 20 enable +#define NVIC_EN0_INT19 0x00080000 // Interrupt 19 enable +#define NVIC_EN0_INT18 0x00040000 // Interrupt 18 enable +#define NVIC_EN0_INT17 0x00020000 // Interrupt 17 enable +#define NVIC_EN0_INT16 0x00010000 // Interrupt 16 enable +#define NVIC_EN0_INT15 0x00008000 // Interrupt 15 enable +#define NVIC_EN0_INT14 0x00004000 // Interrupt 14 enable +#define NVIC_EN0_INT13 0x00002000 // Interrupt 13 enable +#define NVIC_EN0_INT12 0x00001000 // Interrupt 12 enable +#define NVIC_EN0_INT11 0x00000800 // Interrupt 11 enable +#define NVIC_EN0_INT10 0x00000400 // Interrupt 10 enable +#define NVIC_EN0_INT9 0x00000200 // Interrupt 9 enable +#define NVIC_EN0_INT8 0x00000100 // Interrupt 8 enable +#define NVIC_EN0_INT7 0x00000080 // Interrupt 7 enable +#define NVIC_EN0_INT6 0x00000040 // Interrupt 6 enable +#define NVIC_EN0_INT5 0x00000020 // Interrupt 5 enable +#define NVIC_EN0_INT4 0x00000010 // Interrupt 4 enable +#define NVIC_EN0_INT3 0x00000008 // Interrupt 3 enable +#define NVIC_EN0_INT2 0x00000004 // Interrupt 2 enable +#define NVIC_EN0_INT1 0x00000002 // Interrupt 1 enable +#define NVIC_EN0_INT0 0x00000001 // Interrupt 0 enable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EN1 register. +// +//***************************************************************************** +#define NVIC_EN1_INT59 0x08000000 // Interrupt 59 enable +#define NVIC_EN1_INT58 0x04000000 // Interrupt 58 enable +#define NVIC_EN1_INT57 0x02000000 // Interrupt 57 enable +#define NVIC_EN1_INT56 0x01000000 // Interrupt 56 enable +#define NVIC_EN1_INT55 0x00800000 // Interrupt 55 enable +#define NVIC_EN1_INT54 0x00400000 // Interrupt 54 enable +#define NVIC_EN1_INT53 0x00200000 // Interrupt 53 enable +#define NVIC_EN1_INT52 0x00100000 // Interrupt 52 enable +#define NVIC_EN1_INT51 0x00080000 // Interrupt 51 enable +#define NVIC_EN1_INT50 0x00040000 // Interrupt 50 enable +#define NVIC_EN1_INT49 0x00020000 // Interrupt 49 enable +#define NVIC_EN1_INT48 0x00010000 // Interrupt 48 enable +#define NVIC_EN1_INT47 0x00008000 // Interrupt 47 enable +#define NVIC_EN1_INT46 0x00004000 // Interrupt 46 enable +#define NVIC_EN1_INT45 0x00002000 // Interrupt 45 enable +#define NVIC_EN1_INT44 0x00001000 // Interrupt 44 enable +#define NVIC_EN1_INT43 0x00000800 // Interrupt 43 enable +#define NVIC_EN1_INT42 0x00000400 // Interrupt 42 enable +#define NVIC_EN1_INT41 0x00000200 // Interrupt 41 enable +#define NVIC_EN1_INT40 0x00000100 // Interrupt 40 enable +#define NVIC_EN1_INT39 0x00000080 // Interrupt 39 enable +#define NVIC_EN1_INT38 0x00000040 // Interrupt 38 enable +#define NVIC_EN1_INT37 0x00000020 // Interrupt 37 enable +#define NVIC_EN1_INT36 0x00000010 // Interrupt 36 enable +#define NVIC_EN1_INT35 0x00000008 // Interrupt 35 enable +#define NVIC_EN1_INT34 0x00000004 // Interrupt 34 enable +#define NVIC_EN1_INT33 0x00000002 // Interrupt 33 enable +#define NVIC_EN1_INT32 0x00000001 // Interrupt 32 enable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DIS0 register. +// +//***************************************************************************** +#define NVIC_DIS0_INT31 0x80000000 // Interrupt 31 disable +#define NVIC_DIS0_INT30 0x40000000 // Interrupt 30 disable +#define NVIC_DIS0_INT29 0x20000000 // Interrupt 29 disable +#define NVIC_DIS0_INT28 0x10000000 // Interrupt 28 disable +#define NVIC_DIS0_INT27 0x08000000 // Interrupt 27 disable +#define NVIC_DIS0_INT26 0x04000000 // Interrupt 26 disable +#define NVIC_DIS0_INT25 0x02000000 // Interrupt 25 disable +#define NVIC_DIS0_INT24 0x01000000 // Interrupt 24 disable +#define NVIC_DIS0_INT23 0x00800000 // Interrupt 23 disable +#define NVIC_DIS0_INT22 0x00400000 // Interrupt 22 disable +#define NVIC_DIS0_INT21 0x00200000 // Interrupt 21 disable +#define NVIC_DIS0_INT20 0x00100000 // Interrupt 20 disable +#define NVIC_DIS0_INT19 0x00080000 // Interrupt 19 disable +#define NVIC_DIS0_INT18 0x00040000 // Interrupt 18 disable +#define NVIC_DIS0_INT17 0x00020000 // Interrupt 17 disable +#define NVIC_DIS0_INT16 0x00010000 // Interrupt 16 disable +#define NVIC_DIS0_INT15 0x00008000 // Interrupt 15 disable +#define NVIC_DIS0_INT14 0x00004000 // Interrupt 14 disable +#define NVIC_DIS0_INT13 0x00002000 // Interrupt 13 disable +#define NVIC_DIS0_INT12 0x00001000 // Interrupt 12 disable +#define NVIC_DIS0_INT11 0x00000800 // Interrupt 11 disable +#define NVIC_DIS0_INT10 0x00000400 // Interrupt 10 disable +#define NVIC_DIS0_INT9 0x00000200 // Interrupt 9 disable +#define NVIC_DIS0_INT8 0x00000100 // Interrupt 8 disable +#define NVIC_DIS0_INT7 0x00000080 // Interrupt 7 disable +#define NVIC_DIS0_INT6 0x00000040 // Interrupt 6 disable +#define NVIC_DIS0_INT5 0x00000020 // Interrupt 5 disable +#define NVIC_DIS0_INT4 0x00000010 // Interrupt 4 disable +#define NVIC_DIS0_INT3 0x00000008 // Interrupt 3 disable +#define NVIC_DIS0_INT2 0x00000004 // Interrupt 2 disable +#define NVIC_DIS0_INT1 0x00000002 // Interrupt 1 disable +#define NVIC_DIS0_INT0 0x00000001 // Interrupt 0 disable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DIS1 register. +// +//***************************************************************************** +#define NVIC_DIS1_INT59 0x08000000 // Interrupt 59 disable +#define NVIC_DIS1_INT58 0x04000000 // Interrupt 58 disable +#define NVIC_DIS1_INT57 0x02000000 // Interrupt 57 disable +#define NVIC_DIS1_INT56 0x01000000 // Interrupt 56 disable +#define NVIC_DIS1_INT55 0x00800000 // Interrupt 55 disable +#define NVIC_DIS1_INT54 0x00400000 // Interrupt 54 disable +#define NVIC_DIS1_INT53 0x00200000 // Interrupt 53 disable +#define NVIC_DIS1_INT52 0x00100000 // Interrupt 52 disable +#define NVIC_DIS1_INT51 0x00080000 // Interrupt 51 disable +#define NVIC_DIS1_INT50 0x00040000 // Interrupt 50 disable +#define NVIC_DIS1_INT49 0x00020000 // Interrupt 49 disable +#define NVIC_DIS1_INT48 0x00010000 // Interrupt 48 disable +#define NVIC_DIS1_INT47 0x00008000 // Interrupt 47 disable +#define NVIC_DIS1_INT46 0x00004000 // Interrupt 46 disable +#define NVIC_DIS1_INT45 0x00002000 // Interrupt 45 disable +#define NVIC_DIS1_INT44 0x00001000 // Interrupt 44 disable +#define NVIC_DIS1_INT43 0x00000800 // Interrupt 43 disable +#define NVIC_DIS1_INT42 0x00000400 // Interrupt 42 disable +#define NVIC_DIS1_INT41 0x00000200 // Interrupt 41 disable +#define NVIC_DIS1_INT40 0x00000100 // Interrupt 40 disable +#define NVIC_DIS1_INT39 0x00000080 // Interrupt 39 disable +#define NVIC_DIS1_INT38 0x00000040 // Interrupt 38 disable +#define NVIC_DIS1_INT37 0x00000020 // Interrupt 37 disable +#define NVIC_DIS1_INT36 0x00000010 // Interrupt 36 disable +#define NVIC_DIS1_INT35 0x00000008 // Interrupt 35 disable +#define NVIC_DIS1_INT34 0x00000004 // Interrupt 34 disable +#define NVIC_DIS1_INT33 0x00000002 // Interrupt 33 disable +#define NVIC_DIS1_INT32 0x00000001 // Interrupt 32 disable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PEND0 register. +// +//***************************************************************************** +#define NVIC_PEND0_INT31 0x80000000 // Interrupt 31 pend +#define NVIC_PEND0_INT30 0x40000000 // Interrupt 30 pend +#define NVIC_PEND0_INT29 0x20000000 // Interrupt 29 pend +#define NVIC_PEND0_INT28 0x10000000 // Interrupt 28 pend +#define NVIC_PEND0_INT27 0x08000000 // Interrupt 27 pend +#define NVIC_PEND0_INT26 0x04000000 // Interrupt 26 pend +#define NVIC_PEND0_INT25 0x02000000 // Interrupt 25 pend +#define NVIC_PEND0_INT24 0x01000000 // Interrupt 24 pend +#define NVIC_PEND0_INT23 0x00800000 // Interrupt 23 pend +#define NVIC_PEND0_INT22 0x00400000 // Interrupt 22 pend +#define NVIC_PEND0_INT21 0x00200000 // Interrupt 21 pend +#define NVIC_PEND0_INT20 0x00100000 // Interrupt 20 pend +#define NVIC_PEND0_INT19 0x00080000 // Interrupt 19 pend +#define NVIC_PEND0_INT18 0x00040000 // Interrupt 18 pend +#define NVIC_PEND0_INT17 0x00020000 // Interrupt 17 pend +#define NVIC_PEND0_INT16 0x00010000 // Interrupt 16 pend +#define NVIC_PEND0_INT15 0x00008000 // Interrupt 15 pend +#define NVIC_PEND0_INT14 0x00004000 // Interrupt 14 pend +#define NVIC_PEND0_INT13 0x00002000 // Interrupt 13 pend +#define NVIC_PEND0_INT12 0x00001000 // Interrupt 12 pend +#define NVIC_PEND0_INT11 0x00000800 // Interrupt 11 pend +#define NVIC_PEND0_INT10 0x00000400 // Interrupt 10 pend +#define NVIC_PEND0_INT9 0x00000200 // Interrupt 9 pend +#define NVIC_PEND0_INT8 0x00000100 // Interrupt 8 pend +#define NVIC_PEND0_INT7 0x00000080 // Interrupt 7 pend +#define NVIC_PEND0_INT6 0x00000040 // Interrupt 6 pend +#define NVIC_PEND0_INT5 0x00000020 // Interrupt 5 pend +#define NVIC_PEND0_INT4 0x00000010 // Interrupt 4 pend +#define NVIC_PEND0_INT3 0x00000008 // Interrupt 3 pend +#define NVIC_PEND0_INT2 0x00000004 // Interrupt 2 pend +#define NVIC_PEND0_INT1 0x00000002 // Interrupt 1 pend +#define NVIC_PEND0_INT0 0x00000001 // Interrupt 0 pend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PEND1 register. +// +//***************************************************************************** +#define NVIC_PEND1_INT59 0x08000000 // Interrupt 59 pend +#define NVIC_PEND1_INT58 0x04000000 // Interrupt 58 pend +#define NVIC_PEND1_INT57 0x02000000 // Interrupt 57 pend +#define NVIC_PEND1_INT56 0x01000000 // Interrupt 56 pend +#define NVIC_PEND1_INT55 0x00800000 // Interrupt 55 pend +#define NVIC_PEND1_INT54 0x00400000 // Interrupt 54 pend +#define NVIC_PEND1_INT53 0x00200000 // Interrupt 53 pend +#define NVIC_PEND1_INT52 0x00100000 // Interrupt 52 pend +#define NVIC_PEND1_INT51 0x00080000 // Interrupt 51 pend +#define NVIC_PEND1_INT50 0x00040000 // Interrupt 50 pend +#define NVIC_PEND1_INT49 0x00020000 // Interrupt 49 pend +#define NVIC_PEND1_INT48 0x00010000 // Interrupt 48 pend +#define NVIC_PEND1_INT47 0x00008000 // Interrupt 47 pend +#define NVIC_PEND1_INT46 0x00004000 // Interrupt 46 pend +#define NVIC_PEND1_INT45 0x00002000 // Interrupt 45 pend +#define NVIC_PEND1_INT44 0x00001000 // Interrupt 44 pend +#define NVIC_PEND1_INT43 0x00000800 // Interrupt 43 pend +#define NVIC_PEND1_INT42 0x00000400 // Interrupt 42 pend +#define NVIC_PEND1_INT41 0x00000200 // Interrupt 41 pend +#define NVIC_PEND1_INT40 0x00000100 // Interrupt 40 pend +#define NVIC_PEND1_INT39 0x00000080 // Interrupt 39 pend +#define NVIC_PEND1_INT38 0x00000040 // Interrupt 38 pend +#define NVIC_PEND1_INT37 0x00000020 // Interrupt 37 pend +#define NVIC_PEND1_INT36 0x00000010 // Interrupt 36 pend +#define NVIC_PEND1_INT35 0x00000008 // Interrupt 35 pend +#define NVIC_PEND1_INT34 0x00000004 // Interrupt 34 pend +#define NVIC_PEND1_INT33 0x00000002 // Interrupt 33 pend +#define NVIC_PEND1_INT32 0x00000001 // Interrupt 32 pend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_UNPEND0 register. +// +//***************************************************************************** +#define NVIC_UNPEND0_INT31 0x80000000 // Interrupt 31 unpend +#define NVIC_UNPEND0_INT30 0x40000000 // Interrupt 30 unpend +#define NVIC_UNPEND0_INT29 0x20000000 // Interrupt 29 unpend +#define NVIC_UNPEND0_INT28 0x10000000 // Interrupt 28 unpend +#define NVIC_UNPEND0_INT27 0x08000000 // Interrupt 27 unpend +#define NVIC_UNPEND0_INT26 0x04000000 // Interrupt 26 unpend +#define NVIC_UNPEND0_INT25 0x02000000 // Interrupt 25 unpend +#define NVIC_UNPEND0_INT24 0x01000000 // Interrupt 24 unpend +#define NVIC_UNPEND0_INT23 0x00800000 // Interrupt 23 unpend +#define NVIC_UNPEND0_INT22 0x00400000 // Interrupt 22 unpend +#define NVIC_UNPEND0_INT21 0x00200000 // Interrupt 21 unpend +#define NVIC_UNPEND0_INT20 0x00100000 // Interrupt 20 unpend +#define NVIC_UNPEND0_INT19 0x00080000 // Interrupt 19 unpend +#define NVIC_UNPEND0_INT18 0x00040000 // Interrupt 18 unpend +#define NVIC_UNPEND0_INT17 0x00020000 // Interrupt 17 unpend +#define NVIC_UNPEND0_INT16 0x00010000 // Interrupt 16 unpend +#define NVIC_UNPEND0_INT15 0x00008000 // Interrupt 15 unpend +#define NVIC_UNPEND0_INT14 0x00004000 // Interrupt 14 unpend +#define NVIC_UNPEND0_INT13 0x00002000 // Interrupt 13 unpend +#define NVIC_UNPEND0_INT12 0x00001000 // Interrupt 12 unpend +#define NVIC_UNPEND0_INT11 0x00000800 // Interrupt 11 unpend +#define NVIC_UNPEND0_INT10 0x00000400 // Interrupt 10 unpend +#define NVIC_UNPEND0_INT9 0x00000200 // Interrupt 9 unpend +#define NVIC_UNPEND0_INT8 0x00000100 // Interrupt 8 unpend +#define NVIC_UNPEND0_INT7 0x00000080 // Interrupt 7 unpend +#define NVIC_UNPEND0_INT6 0x00000040 // Interrupt 6 unpend +#define NVIC_UNPEND0_INT5 0x00000020 // Interrupt 5 unpend +#define NVIC_UNPEND0_INT4 0x00000010 // Interrupt 4 unpend +#define NVIC_UNPEND0_INT3 0x00000008 // Interrupt 3 unpend +#define NVIC_UNPEND0_INT2 0x00000004 // Interrupt 2 unpend +#define NVIC_UNPEND0_INT1 0x00000002 // Interrupt 1 unpend +#define NVIC_UNPEND0_INT0 0x00000001 // Interrupt 0 unpend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_UNPEND1 register. +// +//***************************************************************************** +#define NVIC_UNPEND1_INT59 0x08000000 // Interrupt 59 unpend +#define NVIC_UNPEND1_INT58 0x04000000 // Interrupt 58 unpend +#define NVIC_UNPEND1_INT57 0x02000000 // Interrupt 57 unpend +#define NVIC_UNPEND1_INT56 0x01000000 // Interrupt 56 unpend +#define NVIC_UNPEND1_INT55 0x00800000 // Interrupt 55 unpend +#define NVIC_UNPEND1_INT54 0x00400000 // Interrupt 54 unpend +#define NVIC_UNPEND1_INT53 0x00200000 // Interrupt 53 unpend +#define NVIC_UNPEND1_INT52 0x00100000 // Interrupt 52 unpend +#define NVIC_UNPEND1_INT51 0x00080000 // Interrupt 51 unpend +#define NVIC_UNPEND1_INT50 0x00040000 // Interrupt 50 unpend +#define NVIC_UNPEND1_INT49 0x00020000 // Interrupt 49 unpend +#define NVIC_UNPEND1_INT48 0x00010000 // Interrupt 48 unpend +#define NVIC_UNPEND1_INT47 0x00008000 // Interrupt 47 unpend +#define NVIC_UNPEND1_INT46 0x00004000 // Interrupt 46 unpend +#define NVIC_UNPEND1_INT45 0x00002000 // Interrupt 45 unpend +#define NVIC_UNPEND1_INT44 0x00001000 // Interrupt 44 unpend +#define NVIC_UNPEND1_INT43 0x00000800 // Interrupt 43 unpend +#define NVIC_UNPEND1_INT42 0x00000400 // Interrupt 42 unpend +#define NVIC_UNPEND1_INT41 0x00000200 // Interrupt 41 unpend +#define NVIC_UNPEND1_INT40 0x00000100 // Interrupt 40 unpend +#define NVIC_UNPEND1_INT39 0x00000080 // Interrupt 39 unpend +#define NVIC_UNPEND1_INT38 0x00000040 // Interrupt 38 unpend +#define NVIC_UNPEND1_INT37 0x00000020 // Interrupt 37 unpend +#define NVIC_UNPEND1_INT36 0x00000010 // Interrupt 36 unpend +#define NVIC_UNPEND1_INT35 0x00000008 // Interrupt 35 unpend +#define NVIC_UNPEND1_INT34 0x00000004 // Interrupt 34 unpend +#define NVIC_UNPEND1_INT33 0x00000002 // Interrupt 33 unpend +#define NVIC_UNPEND1_INT32 0x00000001 // Interrupt 32 unpend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ACTIVE0 register. +// +//***************************************************************************** +#define NVIC_ACTIVE0_INT31 0x80000000 // Interrupt 31 active +#define NVIC_ACTIVE0_INT30 0x40000000 // Interrupt 30 active +#define NVIC_ACTIVE0_INT29 0x20000000 // Interrupt 29 active +#define NVIC_ACTIVE0_INT28 0x10000000 // Interrupt 28 active +#define NVIC_ACTIVE0_INT27 0x08000000 // Interrupt 27 active +#define NVIC_ACTIVE0_INT26 0x04000000 // Interrupt 26 active +#define NVIC_ACTIVE0_INT25 0x02000000 // Interrupt 25 active +#define NVIC_ACTIVE0_INT24 0x01000000 // Interrupt 24 active +#define NVIC_ACTIVE0_INT23 0x00800000 // Interrupt 23 active +#define NVIC_ACTIVE0_INT22 0x00400000 // Interrupt 22 active +#define NVIC_ACTIVE0_INT21 0x00200000 // Interrupt 21 active +#define NVIC_ACTIVE0_INT20 0x00100000 // Interrupt 20 active +#define NVIC_ACTIVE0_INT19 0x00080000 // Interrupt 19 active +#define NVIC_ACTIVE0_INT18 0x00040000 // Interrupt 18 active +#define NVIC_ACTIVE0_INT17 0x00020000 // Interrupt 17 active +#define NVIC_ACTIVE0_INT16 0x00010000 // Interrupt 16 active +#define NVIC_ACTIVE0_INT15 0x00008000 // Interrupt 15 active +#define NVIC_ACTIVE0_INT14 0x00004000 // Interrupt 14 active +#define NVIC_ACTIVE0_INT13 0x00002000 // Interrupt 13 active +#define NVIC_ACTIVE0_INT12 0x00001000 // Interrupt 12 active +#define NVIC_ACTIVE0_INT11 0x00000800 // Interrupt 11 active +#define NVIC_ACTIVE0_INT10 0x00000400 // Interrupt 10 active +#define NVIC_ACTIVE0_INT9 0x00000200 // Interrupt 9 active +#define NVIC_ACTIVE0_INT8 0x00000100 // Interrupt 8 active +#define NVIC_ACTIVE0_INT7 0x00000080 // Interrupt 7 active +#define NVIC_ACTIVE0_INT6 0x00000040 // Interrupt 6 active +#define NVIC_ACTIVE0_INT5 0x00000020 // Interrupt 5 active +#define NVIC_ACTIVE0_INT4 0x00000010 // Interrupt 4 active +#define NVIC_ACTIVE0_INT3 0x00000008 // Interrupt 3 active +#define NVIC_ACTIVE0_INT2 0x00000004 // Interrupt 2 active +#define NVIC_ACTIVE0_INT1 0x00000002 // Interrupt 1 active +#define NVIC_ACTIVE0_INT0 0x00000001 // Interrupt 0 active + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ACTIVE1 register. +// +//***************************************************************************** +#define NVIC_ACTIVE1_INT59 0x08000000 // Interrupt 59 active +#define NVIC_ACTIVE1_INT58 0x04000000 // Interrupt 58 active +#define NVIC_ACTIVE1_INT57 0x02000000 // Interrupt 57 active +#define NVIC_ACTIVE1_INT56 0x01000000 // Interrupt 56 active +#define NVIC_ACTIVE1_INT55 0x00800000 // Interrupt 55 active +#define NVIC_ACTIVE1_INT54 0x00400000 // Interrupt 54 active +#define NVIC_ACTIVE1_INT53 0x00200000 // Interrupt 53 active +#define NVIC_ACTIVE1_INT52 0x00100000 // Interrupt 52 active +#define NVIC_ACTIVE1_INT51 0x00080000 // Interrupt 51 active +#define NVIC_ACTIVE1_INT50 0x00040000 // Interrupt 50 active +#define NVIC_ACTIVE1_INT49 0x00020000 // Interrupt 49 active +#define NVIC_ACTIVE1_INT48 0x00010000 // Interrupt 48 active +#define NVIC_ACTIVE1_INT47 0x00008000 // Interrupt 47 active +#define NVIC_ACTIVE1_INT46 0x00004000 // Interrupt 46 active +#define NVIC_ACTIVE1_INT45 0x00002000 // Interrupt 45 active +#define NVIC_ACTIVE1_INT44 0x00001000 // Interrupt 44 active +#define NVIC_ACTIVE1_INT43 0x00000800 // Interrupt 43 active +#define NVIC_ACTIVE1_INT42 0x00000400 // Interrupt 42 active +#define NVIC_ACTIVE1_INT41 0x00000200 // Interrupt 41 active +#define NVIC_ACTIVE1_INT40 0x00000100 // Interrupt 40 active +#define NVIC_ACTIVE1_INT39 0x00000080 // Interrupt 39 active +#define NVIC_ACTIVE1_INT38 0x00000040 // Interrupt 38 active +#define NVIC_ACTIVE1_INT37 0x00000020 // Interrupt 37 active +#define NVIC_ACTIVE1_INT36 0x00000010 // Interrupt 36 active +#define NVIC_ACTIVE1_INT35 0x00000008 // Interrupt 35 active +#define NVIC_ACTIVE1_INT34 0x00000004 // Interrupt 34 active +#define NVIC_ACTIVE1_INT33 0x00000002 // Interrupt 33 active +#define NVIC_ACTIVE1_INT32 0x00000001 // Interrupt 32 active + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI0 register. +// +//***************************************************************************** +#define NVIC_PRI0_INT3_M 0xFF000000 // Interrupt 3 priority mask +#define NVIC_PRI0_INT2_M 0x00FF0000 // Interrupt 2 priority mask +#define NVIC_PRI0_INT1_M 0x0000FF00 // Interrupt 1 priority mask +#define NVIC_PRI0_INT0_M 0x000000FF // Interrupt 0 priority mask +#define NVIC_PRI0_INT3_S 24 +#define NVIC_PRI0_INT2_S 16 +#define NVIC_PRI0_INT1_S 8 +#define NVIC_PRI0_INT0_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI1 register. +// +//***************************************************************************** +#define NVIC_PRI1_INT7_M 0xFF000000 // Interrupt 7 priority mask +#define NVIC_PRI1_INT6_M 0x00FF0000 // Interrupt 6 priority mask +#define NVIC_PRI1_INT5_M 0x0000FF00 // Interrupt 5 priority mask +#define NVIC_PRI1_INT4_M 0x000000FF // Interrupt 4 priority mask +#define NVIC_PRI1_INT7_S 24 +#define NVIC_PRI1_INT6_S 16 +#define NVIC_PRI1_INT5_S 8 +#define NVIC_PRI1_INT4_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI2 register. +// +//***************************************************************************** +#define NVIC_PRI2_INT11_M 0xFF000000 // Interrupt 11 priority mask +#define NVIC_PRI2_INT10_M 0x00FF0000 // Interrupt 10 priority mask +#define NVIC_PRI2_INT9_M 0x0000FF00 // Interrupt 9 priority mask +#define NVIC_PRI2_INT8_M 0x000000FF // Interrupt 8 priority mask +#define NVIC_PRI2_INT11_S 24 +#define NVIC_PRI2_INT10_S 16 +#define NVIC_PRI2_INT9_S 8 +#define NVIC_PRI2_INT8_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI3 register. +// +//***************************************************************************** +#define NVIC_PRI3_INT15_M 0xFF000000 // Interrupt 15 priority mask +#define NVIC_PRI3_INT14_M 0x00FF0000 // Interrupt 14 priority mask +#define NVIC_PRI3_INT13_M 0x0000FF00 // Interrupt 13 priority mask +#define NVIC_PRI3_INT12_M 0x000000FF // Interrupt 12 priority mask +#define NVIC_PRI3_INT15_S 24 +#define NVIC_PRI3_INT14_S 16 +#define NVIC_PRI3_INT13_S 8 +#define NVIC_PRI3_INT12_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI4 register. +// +//***************************************************************************** +#define NVIC_PRI4_INT19_M 0xFF000000 // Interrupt 19 priority mask +#define NVIC_PRI4_INT18_M 0x00FF0000 // Interrupt 18 priority mask +#define NVIC_PRI4_INT17_M 0x0000FF00 // Interrupt 17 priority mask +#define NVIC_PRI4_INT16_M 0x000000FF // Interrupt 16 priority mask +#define NVIC_PRI4_INT19_S 24 +#define NVIC_PRI4_INT18_S 16 +#define NVIC_PRI4_INT17_S 8 +#define NVIC_PRI4_INT16_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI5 register. +// +//***************************************************************************** +#define NVIC_PRI5_INT23_M 0xFF000000 // Interrupt 23 priority mask +#define NVIC_PRI5_INT22_M 0x00FF0000 // Interrupt 22 priority mask +#define NVIC_PRI5_INT21_M 0x0000FF00 // Interrupt 21 priority mask +#define NVIC_PRI5_INT20_M 0x000000FF // Interrupt 20 priority mask +#define NVIC_PRI5_INT23_S 24 +#define NVIC_PRI5_INT22_S 16 +#define NVIC_PRI5_INT21_S 8 +#define NVIC_PRI5_INT20_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI6 register. +// +//***************************************************************************** +#define NVIC_PRI6_INT27_M 0xFF000000 // Interrupt 27 priority mask +#define NVIC_PRI6_INT26_M 0x00FF0000 // Interrupt 26 priority mask +#define NVIC_PRI6_INT25_M 0x0000FF00 // Interrupt 25 priority mask +#define NVIC_PRI6_INT24_M 0x000000FF // Interrupt 24 priority mask +#define NVIC_PRI6_INT27_S 24 +#define NVIC_PRI6_INT26_S 16 +#define NVIC_PRI6_INT25_S 8 +#define NVIC_PRI6_INT24_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI7 register. +// +//***************************************************************************** +#define NVIC_PRI7_INT31_M 0xFF000000 // Interrupt 31 priority mask +#define NVIC_PRI7_INT30_M 0x00FF0000 // Interrupt 30 priority mask +#define NVIC_PRI7_INT29_M 0x0000FF00 // Interrupt 29 priority mask +#define NVIC_PRI7_INT28_M 0x000000FF // Interrupt 28 priority mask +#define NVIC_PRI7_INT31_S 24 +#define NVIC_PRI7_INT30_S 16 +#define NVIC_PRI7_INT29_S 8 +#define NVIC_PRI7_INT28_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI8 register. +// +//***************************************************************************** +#define NVIC_PRI8_INT35_M 0xFF000000 // Interrupt 35 priority mask +#define NVIC_PRI8_INT34_M 0x00FF0000 // Interrupt 34 priority mask +#define NVIC_PRI8_INT33_M 0x0000FF00 // Interrupt 33 priority mask +#define NVIC_PRI8_INT32_M 0x000000FF // Interrupt 32 priority mask +#define NVIC_PRI8_INT35_S 24 +#define NVIC_PRI8_INT34_S 16 +#define NVIC_PRI8_INT33_S 8 +#define NVIC_PRI8_INT32_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI9 register. +// +//***************************************************************************** +#define NVIC_PRI9_INT39_M 0xFF000000 // Interrupt 39 priority mask +#define NVIC_PRI9_INT38_M 0x00FF0000 // Interrupt 38 priority mask +#define NVIC_PRI9_INT37_M 0x0000FF00 // Interrupt 37 priority mask +#define NVIC_PRI9_INT36_M 0x000000FF // Interrupt 36 priority mask +#define NVIC_PRI9_INT39_S 24 +#define NVIC_PRI9_INT38_S 16 +#define NVIC_PRI9_INT37_S 8 +#define NVIC_PRI9_INT36_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI10 register. +// +//***************************************************************************** +#define NVIC_PRI10_INT43_M 0xFF000000 // Interrupt 43 priority mask +#define NVIC_PRI10_INT42_M 0x00FF0000 // Interrupt 42 priority mask +#define NVIC_PRI10_INT41_M 0x0000FF00 // Interrupt 41 priority mask +#define NVIC_PRI10_INT40_M 0x000000FF // Interrupt 40 priority mask +#define NVIC_PRI10_INT43_S 24 +#define NVIC_PRI10_INT42_S 16 +#define NVIC_PRI10_INT41_S 8 +#define NVIC_PRI10_INT40_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_CPUID register. +// +//***************************************************************************** +#define NVIC_CPUID_IMP_M 0xFF000000 // Implementer +#define NVIC_CPUID_VAR_M 0x00F00000 // Variant +#define NVIC_CPUID_PARTNO_M 0x0000FFF0 // Processor part number +#define NVIC_CPUID_REV_M 0x0000000F // Revision + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_INT_CTRL register. +// +//***************************************************************************** +#define NVIC_INT_CTRL_NMI_SET 0x80000000 // Pend a NMI +#define NVIC_INT_CTRL_PEND_SV 0x10000000 // Pend a PendSV +#define NVIC_INT_CTRL_UNPEND_SV 0x08000000 // Unpend a PendSV +#define NVIC_INT_CTRL_ISR_PRE 0x00800000 // Debug interrupt handling +#define NVIC_INT_CTRL_ISR_PEND 0x00400000 // Debug interrupt pending +#define NVIC_INT_CTRL_VEC_PEN_M 0x003FF000 // Highest pending exception +#define NVIC_INT_CTRL_RET_BASE 0x00000800 // Return to base +#define NVIC_INT_CTRL_VEC_ACT_M 0x000003FF // Current active exception +#define NVIC_INT_CTRL_VEC_PEN_S 12 +#define NVIC_INT_CTRL_VEC_ACT_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_VTABLE register. +// +//***************************************************************************** +#define NVIC_VTABLE_BASE 0x20000000 // Vector table base +#define NVIC_VTABLE_OFFSET_M 0x1FFFFF00 // Vector table offset +#define NVIC_VTABLE_OFFSET_S 8 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_APINT register. +// +//***************************************************************************** +#define NVIC_APINT_VECTKEY_M 0xFFFF0000 // Vector key mask +#define NVIC_APINT_VECTKEY 0x05FA0000 // Vector key +#define NVIC_APINT_ENDIANESS 0x00008000 // Data endianess +#define NVIC_APINT_PRIGROUP_M 0x00000700 // Priority group +#define NVIC_APINT_PRIGROUP_7_1 0x00000000 // Priority group 7.1 split +#define NVIC_APINT_PRIGROUP_6_2 0x00000100 // Priority group 6.2 split +#define NVIC_APINT_PRIGROUP_5_3 0x00000200 // Priority group 5.3 split +#define NVIC_APINT_PRIGROUP_4_4 0x00000300 // Priority group 4.4 split +#define NVIC_APINT_PRIGROUP_3_5 0x00000400 // Priority group 3.5 split +#define NVIC_APINT_PRIGROUP_2_6 0x00000500 // Priority group 2.6 split +#define NVIC_APINT_PRIGROUP_1_7 0x00000600 // Priority group 1.7 split +#define NVIC_APINT_PRIGROUP_0_8 0x00000700 // Priority group 0.8 split +#define NVIC_APINT_SYSRESETREQ 0x00000004 // System reset request +#define NVIC_APINT_VECT_CLR_ACT 0x00000002 // Clear active NMI/fault info +#define NVIC_APINT_VECT_RESET 0x00000001 // System reset + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_CTRL register. +// +//***************************************************************************** +#define NVIC_SYS_CTRL_SEVONPEND 0x00000010 // Wakeup on pend +#define NVIC_SYS_CTRL_SLEEPDEEP 0x00000004 // Deep sleep enable +#define NVIC_SYS_CTRL_SLEEPEXIT 0x00000002 // Sleep on ISR exit + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_CFG_CTRL register. +// +//***************************************************************************** +#define NVIC_CFG_CTRL_BFHFNMIGN 0x00000100 // Ignore bus fault in NMI/fault +#define NVIC_CFG_CTRL_DIV0 0x00000010 // Trap on divide by 0 +#define NVIC_CFG_CTRL_UNALIGNED 0x00000008 // Trap on unaligned access +#define NVIC_CFG_CTRL_DEEP_PEND 0x00000004 // Allow deep interrupt trigger +#define NVIC_CFG_CTRL_MAIN_PEND 0x00000002 // Allow main interrupt trigger +#define NVIC_CFG_CTRL_BASE_THR 0x00000001 // Thread state control + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI1 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI1_RES_M 0xFF000000 // Priority of reserved handler +#define NVIC_SYS_PRI1_USAGE_M 0x00FF0000 // Priority of usage fault handler +#define NVIC_SYS_PRI1_BUS_M 0x0000FF00 // Priority of bus fault handler +#define NVIC_SYS_PRI1_MEM_M 0x000000FF // Priority of mem manage handler +#define NVIC_SYS_PRI1_USAGE_S 16 +#define NVIC_SYS_PRI1_BUS_S 8 +#define NVIC_SYS_PRI1_MEM_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI2 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI2_SVC_M 0xFF000000 // Priority of SVCall handler +#define NVIC_SYS_PRI2_RES_M 0x00FFFFFF // Priority of reserved handlers +#define NVIC_SYS_PRI2_SVC_S 24 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI3 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI3_TICK_M 0xFF000000 // Priority of Sys Tick handler +#define NVIC_SYS_PRI3_PENDSV_M 0x00FF0000 // Priority of PendSV handler +#define NVIC_SYS_PRI3_RES_M 0x0000FF00 // Priority of reserved handler +#define NVIC_SYS_PRI3_DEBUG_M 0x000000FF // Priority of debug handler +#define NVIC_SYS_PRI3_TICK_S 24 +#define NVIC_SYS_PRI3_PENDSV_S 16 +#define NVIC_SYS_PRI3_DEBUG_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_HND_CTRL register. +// +//***************************************************************************** +#define NVIC_SYS_HND_CTRL_USAGE 0x00040000 // Usage fault enable +#define NVIC_SYS_HND_CTRL_BUS 0x00020000 // Bus fault enable +#define NVIC_SYS_HND_CTRL_MEM 0x00010000 // Mem manage fault enable +#define NVIC_SYS_HND_CTRL_SVC 0x00008000 // SVCall is pended +#define NVIC_SYS_HND_CTRL_BUSP 0x00004000 // Bus fault is pended +#define NVIC_SYS_HND_CTRL_TICK 0x00000800 // Sys tick is active +#define NVIC_SYS_HND_CTRL_PNDSV 0x00000400 // PendSV is active +#define NVIC_SYS_HND_CTRL_MON 0x00000100 // Monitor is active +#define NVIC_SYS_HND_CTRL_SVCA 0x00000080 // SVCall is active +#define NVIC_SYS_HND_CTRL_USGA 0x00000008 // Usage fault is active +#define NVIC_SYS_HND_CTRL_BUSA 0x00000002 // Bus fault is active +#define NVIC_SYS_HND_CTRL_MEMA 0x00000001 // Mem manage is active + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_FAULT_STAT register. +// +//***************************************************************************** +#define NVIC_FAULT_STAT_DIV0 0x02000000 // Divide by zero fault +#define NVIC_FAULT_STAT_UNALIGN 0x01000000 // Unaligned access fault +#define NVIC_FAULT_STAT_NOCP 0x00080000 // No coprocessor fault +#define NVIC_FAULT_STAT_INVPC 0x00040000 // Invalid PC fault +#define NVIC_FAULT_STAT_INVSTAT 0x00020000 // Invalid state fault +#define NVIC_FAULT_STAT_UNDEF 0x00010000 // Undefined instruction fault +#define NVIC_FAULT_STAT_BFARV 0x00008000 // BFAR is valid +#define NVIC_FAULT_STAT_BSTKE 0x00001000 // Stack bus fault +#define NVIC_FAULT_STAT_BUSTKE 0x00000800 // Unstack bus fault +#define NVIC_FAULT_STAT_IMPRE 0x00000400 // Imprecise data bus error +#define NVIC_FAULT_STAT_PRECISE 0x00000200 // Precise data bus error +#define NVIC_FAULT_STAT_IBUS 0x00000100 // Instruction bus fault +#define NVIC_FAULT_STAT_MMARV 0x00000080 // MMAR is valid +#define NVIC_FAULT_STAT_MSTKE 0x00000010 // Stack access violation +#define NVIC_FAULT_STAT_MUSTKE 0x00000008 // Unstack access violation +#define NVIC_FAULT_STAT_DERR 0x00000002 // Data access violation +#define NVIC_FAULT_STAT_IERR 0x00000001 // Instruction access violation + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_HFAULT_STAT register. +// +//***************************************************************************** +#define NVIC_HFAULT_STAT_DBG 0x80000000 // Debug event +#define NVIC_HFAULT_STAT_FORCED 0x40000000 // Cannot execute fault handler +#define NVIC_HFAULT_STAT_VECT 0x00000002 // Vector table read fault + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DEBUG_STAT register. +// +//***************************************************************************** +#define NVIC_DEBUG_STAT_EXTRNL 0x00000010 // EDBGRQ asserted +#define NVIC_DEBUG_STAT_VCATCH 0x00000008 // Vector catch +#define NVIC_DEBUG_STAT_DWTTRAP 0x00000004 // DWT match +#define NVIC_DEBUG_STAT_BKPT 0x00000002 // Breakpoint instruction +#define NVIC_DEBUG_STAT_HALTED 0x00000001 // Halt request + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MM_ADDR register. +// +//***************************************************************************** +#define NVIC_MM_ADDR_M 0xFFFFFFFF // Data fault address +#define NVIC_MM_ADDR_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_FAULT_ADDR register. +// +//***************************************************************************** +#define NVIC_FAULT_ADDR_M 0xFFFFFFFF // Data bus fault address +#define NVIC_FAULT_ADDR_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EXC_STACK register. +// +//***************************************************************************** +#define NVIC_EXC_STACK_DEEP 0x00000001 // Exception stack + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EXC_NUM register. +// +//***************************************************************************** +#define NVIC_EXC_NUM_M 0x000003FF // Exception number +#define NVIC_EXC_NUM_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_COPRO register. +// +//***************************************************************************** +#define NVIC_COPRO_15_M 0xC0000000 // Coprocessor 15 access mask +#define NVIC_COPRO_15_DENIED 0x00000000 // Coprocessor 15 access denied +#define NVIC_COPRO_15_PRIV 0x40000000 // Coprocessor 15 privileged addess +#define NVIC_COPRO_15_FULL 0xC0000000 // Coprocessor 15 full access +#define NVIC_COPRO_14_M 0x30000000 // Coprocessor 14 access mask +#define NVIC_COPRO_14_DENIED 0x00000000 // Coprocessor 14 access denied +#define NVIC_COPRO_14_PRIV 0x10000000 // Coprocessor 14 privileged addess +#define NVIC_COPRO_14_FULL 0x30000000 // Coprocessor 14 full access +#define NVIC_COPRO_13_M 0x0C000000 // Coprocessor 13 access mask +#define NVIC_COPRO_13_DENIED 0x00000000 // Coprocessor 13 access denied +#define NVIC_COPRO_13_PRIV 0x04000000 // Coprocessor 13 privileged addess +#define NVIC_COPRO_13_FULL 0x0C000000 // Coprocessor 13 full access +#define NVIC_COPRO_12_M 0x03000000 // Coprocessor 12 access mask +#define NVIC_COPRO_12_DENIED 0x00000000 // Coprocessor 12 access denied +#define NVIC_COPRO_12_PRIV 0x01000000 // Coprocessor 12 privileged addess +#define NVIC_COPRO_12_FULL 0x03000000 // Coprocessor 12 full access +#define NVIC_COPRO_11_M 0x00C00000 // Coprocessor 11 access mask +#define NVIC_COPRO_11_DENIED 0x00000000 // Coprocessor 11 access denied +#define NVIC_COPRO_11_PRIV 0x00400000 // Coprocessor 11 privileged addess +#define NVIC_COPRO_11_FULL 0x00C00000 // Coprocessor 11 full access +#define NVIC_COPRO_10_M 0x00300000 // Coprocessor 10 access mask +#define NVIC_COPRO_10_DENIED 0x00000000 // Coprocessor 10 access denied +#define NVIC_COPRO_10_PRIV 0x00100000 // Coprocessor 10 privileged addess +#define NVIC_COPRO_10_FULL 0x00300000 // Coprocessor 10 full access +#define NVIC_COPRO_9_M 0x000C0000 // Coprocessor 9 access mask +#define NVIC_COPRO_9_DENIED 0x00000000 // Coprocessor 9 access denied +#define NVIC_COPRO_9_PRIV 0x00040000 // Coprocessor 9 privileged addess +#define NVIC_COPRO_9_FULL 0x000C0000 // Coprocessor 9 full access +#define NVIC_COPRO_8_M 0x00030000 // Coprocessor 8 access mask +#define NVIC_COPRO_8_DENIED 0x00000000 // Coprocessor 8 access denied +#define NVIC_COPRO_8_PRIV 0x00010000 // Coprocessor 8 privileged addess +#define NVIC_COPRO_8_FULL 0x00030000 // Coprocessor 8 full access +#define NVIC_COPRO_7_M 0x0000C000 // Coprocessor 7 access mask +#define NVIC_COPRO_7_DENIED 0x00000000 // Coprocessor 7 access denied +#define NVIC_COPRO_7_PRIV 0x00004000 // Coprocessor 7 privileged addess +#define NVIC_COPRO_7_FULL 0x0000C000 // Coprocessor 7 full access +#define NVIC_COPRO_6_M 0x00003000 // Coprocessor 6 access mask +#define NVIC_COPRO_6_DENIED 0x00000000 // Coprocessor 6 access denied +#define NVIC_COPRO_6_PRIV 0x00001000 // Coprocessor 6 privileged addess +#define NVIC_COPRO_6_FULL 0x00003000 // Coprocessor 6 full access +#define NVIC_COPRO_5_M 0x00000C00 // Coprocessor 5 access mask +#define NVIC_COPRO_5_DENIED 0x00000000 // Coprocessor 5 access denied +#define NVIC_COPRO_5_PRIV 0x00000400 // Coprocessor 5 privileged addess +#define NVIC_COPRO_5_FULL 0x00000C00 // Coprocessor 5 full access +#define NVIC_COPRO_4_M 0x00000300 // Coprocessor 4 access mask +#define NVIC_COPRO_4_DENIED 0x00000000 // Coprocessor 4 access denied +#define NVIC_COPRO_4_PRIV 0x00000100 // Coprocessor 4 privileged addess +#define NVIC_COPRO_4_FULL 0x00000300 // Coprocessor 4 full access +#define NVIC_COPRO_3_M 0x000000C0 // Coprocessor 3 access mask +#define NVIC_COPRO_3_DENIED 0x00000000 // Coprocessor 3 access denied +#define NVIC_COPRO_3_PRIV 0x00000040 // Coprocessor 3 privileged addess +#define NVIC_COPRO_3_FULL 0x000000C0 // Coprocessor 3 full access +#define NVIC_COPRO_2_M 0x00000030 // Coprocessor 2 access mask +#define NVIC_COPRO_2_DENIED 0x00000000 // Coprocessor 2 access denied +#define NVIC_COPRO_2_PRIV 0x00000010 // Coprocessor 2 privileged addess +#define NVIC_COPRO_2_FULL 0x00000030 // Coprocessor 2 full access +#define NVIC_COPRO_1_M 0x0000000C // Coprocessor 1 access mask +#define NVIC_COPRO_1_DENIED 0x00000000 // Coprocessor 1 access denied +#define NVIC_COPRO_1_PRIV 0x00000004 // Coprocessor 1 privileged addess +#define NVIC_COPRO_1_FULL 0x0000000C // Coprocessor 1 full access +#define NVIC_COPRO_0_M 0x00000003 // Coprocessor 0 access mask +#define NVIC_COPRO_0_DENIED 0x00000000 // Coprocessor 0 access denied +#define NVIC_COPRO_0_PRIV 0x00000001 // Coprocessor 0 privileged addess +#define NVIC_COPRO_0_FULL 0x00000003 // Coprocessor 0 full access + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_TYPE register. +// +//***************************************************************************** +#define NVIC_MPU_TYPE_IREGION_M 0x00FF0000 // Number of I regions +#define NVIC_MPU_TYPE_DREGION_M 0x0000FF00 // Number of D regions +#define NVIC_MPU_TYPE_SEPARATE 0x00000001 // Separate or unified MPU +#define NVIC_MPU_TYPE_IREGION_S 16 +#define NVIC_MPU_TYPE_DREGION_S 8 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_CTRL register. +// +//***************************************************************************** +#define NVIC_MPU_CTRL_HFNMIENA 0x00000002 // MPU enabled during faults +#define NVIC_MPU_CTRL_ENABLE 0x00000001 // MPU enable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_NUMBER register. +// +//***************************************************************************** +#define NVIC_MPU_NUMBER_M 0x000000FF // MPU region to access +#define NVIC_MPU_NUMBER_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_BASE register. +// +//***************************************************************************** +#define NVIC_MPU_BASE_ADDR_M 0xFFFFFF00 // Base address +#define NVIC_MPU_BASE_VALID 0x00000010 // Region number valid +#define NVIC_MPU_BASE_REGION_M 0x0000000F // Region number +#define NVIC_MPU_BASE_ADDR_S 8 +#define NVIC_MPU_BASE_REGION_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_ATTR register. +// +//***************************************************************************** +#define NVIC_MPU_ATTR_ATTRS 0xFFFF0000 // Attributes +#define NVIC_MPU_ATTR_SRD 0x0000FF00 // Sub-region disable +#define NVIC_MPU_ATTR_SZENABLE 0x000000FF // Region size + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_CTRL register. +// +//***************************************************************************** +#define NVIC_DBG_CTRL_DBGKEY_M 0xFFFF0000 // Debug key mask +#define NVIC_DBG_CTRL_DBGKEY 0xA05F0000 // Debug key +#define NVIC_DBG_CTRL_MON_PEND 0x00008000 // Pend the monitor +#define NVIC_DBG_CTRL_MON_REQ 0x00004000 // Monitor request +#define NVIC_DBG_CTRL_MON_EN 0x00002000 // Debug monitor enable +#define NVIC_DBG_CTRL_MONSTEP 0x00001000 // Monitor step the core +#define NVIC_DBG_CTRL_S_SLEEP 0x00000400 // Core is sleeping +#define NVIC_DBG_CTRL_S_HALT 0x00000200 // Core status on halt +#define NVIC_DBG_CTRL_S_REGRDY 0x00000100 // Register read/write available +#define NVIC_DBG_CTRL_S_LOCKUP 0x00000080 // Core is locked up +#define NVIC_DBG_CTRL_C_RESET 0x00000010 // Reset the core +#define NVIC_DBG_CTRL_C_MASKINT 0x00000008 // Mask interrupts when stepping +#define NVIC_DBG_CTRL_C_STEP 0x00000004 // Step the core +#define NVIC_DBG_CTRL_C_HALT 0x00000002 // Halt the core +#define NVIC_DBG_CTRL_C_DEBUGEN 0x00000001 // Enable debug + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_XFER register. +// +//***************************************************************************** +#define NVIC_DBG_XFER_REG_WNR 0x00010000 // Write or not read +#define NVIC_DBG_XFER_REG_SEL_M 0x0000001F // Register +#define NVIC_DBG_XFER_REG_R0 0x00000000 // Register R0 +#define NVIC_DBG_XFER_REG_R1 0x00000001 // Register R1 +#define NVIC_DBG_XFER_REG_R2 0x00000002 // Register R2 +#define NVIC_DBG_XFER_REG_R3 0x00000003 // Register R3 +#define NVIC_DBG_XFER_REG_R4 0x00000004 // Register R4 +#define NVIC_DBG_XFER_REG_R5 0x00000005 // Register R5 +#define NVIC_DBG_XFER_REG_R6 0x00000006 // Register R6 +#define NVIC_DBG_XFER_REG_R7 0x00000007 // Register R7 +#define NVIC_DBG_XFER_REG_R8 0x00000008 // Register R8 +#define NVIC_DBG_XFER_REG_R9 0x00000009 // Register R9 +#define NVIC_DBG_XFER_REG_R10 0x0000000A // Register R10 +#define NVIC_DBG_XFER_REG_R11 0x0000000B // Register R11 +#define NVIC_DBG_XFER_REG_R12 0x0000000C // Register R12 +#define NVIC_DBG_XFER_REG_R13 0x0000000D // Register R13 +#define NVIC_DBG_XFER_REG_R14 0x0000000E // Register R14 +#define NVIC_DBG_XFER_REG_R15 0x0000000F // Register R15 +#define NVIC_DBG_XFER_REG_FLAGS 0x00000010 // xPSR/Flags register +#define NVIC_DBG_XFER_REG_MSP 0x00000011 // Main SP +#define NVIC_DBG_XFER_REG_PSP 0x00000012 // Process SP +#define NVIC_DBG_XFER_REG_DSP 0x00000013 // Deep SP +#define NVIC_DBG_XFER_REG_CFBP 0x00000014 // Control/Fault/BasePri/PriMask + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_DATA register. +// +//***************************************************************************** +#define NVIC_DBG_DATA_M 0xFFFFFFFF // Data temporary cache +#define NVIC_DBG_DATA_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_INT register. +// +//***************************************************************************** +#define NVIC_DBG_INT_HARDERR 0x00000400 // Debug trap on hard fault +#define NVIC_DBG_INT_INTERR 0x00000200 // Debug trap on interrupt errors +#define NVIC_DBG_INT_BUSERR 0x00000100 // Debug trap on bus error +#define NVIC_DBG_INT_STATERR 0x00000080 // Debug trap on usage fault state +#define NVIC_DBG_INT_CHKERR 0x00000040 // Debug trap on usage fault check +#define NVIC_DBG_INT_NOCPERR 0x00000020 // Debug trap on coprocessor error +#define NVIC_DBG_INT_MMERR 0x00000010 // Debug trap on mem manage fault +#define NVIC_DBG_INT_RESET 0x00000008 // Core reset status +#define NVIC_DBG_INT_RSTPENDCLR 0x00000004 // Clear pending core reset +#define NVIC_DBG_INT_RSTPENDING 0x00000002 // Core reset is pending +#define NVIC_DBG_INT_RSTVCATCH 0x00000001 // Reset vector catch + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SW_TRIG register. +// +//***************************************************************************** +#define NVIC_SW_TRIG_INTID_M 0x000003FF // Interrupt to trigger +#define NVIC_SW_TRIG_INTID_S 0 + +#endif // __HW_NVIC_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_pwm.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_pwm.h new file mode 100644 index 000000000..53609c6f9 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_pwm.h @@ -0,0 +1,260 @@ +//***************************************************************************** +// +// hw_pwm.h - Defines and Macros for Pulse Width Modulation (PWM) ports +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_PWM_H__ +#define __HW_PWM_H__ + +//***************************************************************************** +// +// PWM Module Register Offsets. +// +//***************************************************************************** +#define PWM_O_CTL 0x00000000 // PWM Master Control register +#define PWM_O_SYNC 0x00000004 // PWM Time Base Sync register +#define PWM_O_ENABLE 0x00000008 // PWM Output Enable register +#define PWM_O_INVERT 0x0000000C // PWM Output Inversion register +#define PWM_O_FAULT 0x00000010 // PWM Output Fault register +#define PWM_O_INTEN 0x00000014 // PWM Interrupt Enable register +#define PWM_O_RIS 0x00000018 // PWM Interrupt Raw Status reg. +#define PWM_O_ISC 0x0000001C // PWM Interrupt Status register +#define PWM_O_STATUS 0x00000020 // PWM Status register + +//***************************************************************************** +// +// The following define the bit fields in the PWM Master Control register. +// +//***************************************************************************** +#define PWM_CTL_GLOBAL_SYNC2 0x00000004 // Global sync generator 2 +#define PWM_CTL_GLOBAL_SYNC1 0x00000002 // Global sync generator 1 +#define PWM_CTL_GLOBAL_SYNC0 0x00000001 // Global sync generator 0 + +//***************************************************************************** +// +// The following define the bit fields in the PWM Time Base Sync register. +// +//***************************************************************************** +#define PWM_SYNC_SYNC2 0x00000004 // Reset generator 2 counter +#define PWM_SYNC_SYNC1 0x00000002 // Reset generator 1 counter +#define PWM_SYNC_SYNC0 0x00000001 // Reset generator 0 counter + +//***************************************************************************** +// +// The following define the bit fields in the PWM Output Enable register. +// +//***************************************************************************** +#define PWM_ENABLE_PWM5EN 0x00000020 // PWM5 pin enable +#define PWM_ENABLE_PWM4EN 0x00000010 // PWM4 pin enable +#define PWM_ENABLE_PWM3EN 0x00000008 // PWM3 pin enable +#define PWM_ENABLE_PWM2EN 0x00000004 // PWM2 pin enable +#define PWM_ENABLE_PWM1EN 0x00000002 // PWM1 pin enable +#define PWM_ENABLE_PWM0EN 0x00000001 // PWM0 pin enable + +//***************************************************************************** +// +// The following define the bit fields in the PWM Inversion register. +// +//***************************************************************************** +#define PWM_INVERT_PWM5INV 0x00000020 // PWM5 pin invert +#define PWM_INVERT_PWM4INV 0x00000010 // PWM4 pin invert +#define PWM_INVERT_PWM3INV 0x00000008 // PWM3 pin invert +#define PWM_INVERT_PWM2INV 0x00000004 // PWM2 pin invert +#define PWM_INVERT_PWM1INV 0x00000002 // PWM1 pin invert +#define PWM_INVERT_PWM0INV 0x00000001 // PWM0 pin invert + +//***************************************************************************** +// +// The following define the bit fields in the PWM Fault register. +// +//***************************************************************************** +#define PWM_FAULT_FAULT5 0x00000020 // PWM5 pin fault +#define PWM_FAULT_FAULT4 0x00000010 // PWM5 pin fault +#define PWM_FAULT_FAULT3 0x00000008 // PWM5 pin fault +#define PWM_FAULT_FAULT2 0x00000004 // PWM5 pin fault +#define PWM_FAULT_FAULT1 0x00000002 // PWM5 pin fault +#define PWM_FAULT_FAULT0 0x00000001 // PWM5 pin fault + +//***************************************************************************** +// +// PWM Interrupt Register bit definitions. +// +//***************************************************************************** +#define PWM_INT_INTFAULT 0x00010000 // Fault interrupt pending + +//***************************************************************************** +// +// The following define the bit fields in the PWM Status register. +// +//***************************************************************************** +#define PWM_STATUS_FAULT 0x00000001 // Fault status + +//***************************************************************************** +// +// PWM Generator standard offsets. +// +//***************************************************************************** +#define PWM_GEN_0_OFFSET 0x00000040 // PWM0 base +#define PWM_GEN_1_OFFSET 0x00000080 // PWM1 base +#define PWM_GEN_2_OFFSET 0x000000C0 // PWM2 base + +#define PWM_O_X_CTL 0x00000000 // Gen Control Reg +#define PWM_O_X_INTEN 0x00000004 // Gen Int/Trig Enable Reg +#define PWM_O_X_RIS 0x00000008 // Gen Raw Int Status Reg +#define PWM_O_X_ISC 0x0000000C // Gen Int Status Reg +#define PWM_O_X_LOAD 0x00000010 // Gen Load Reg +#define PWM_O_X_COUNT 0x00000014 // Gen Counter Reg +#define PWM_O_X_CMPA 0x00000018 // Gen Compare A Reg +#define PWM_O_X_CMPB 0x0000001C // Gen Compare B Reg +#define PWM_O_X_GENA 0x00000020 // Gen Generator A Ctrl Reg +#define PWM_O_X_GENB 0x00000024 // Gen Generator B Ctrl Reg +#define PWM_O_X_DBCTL 0x00000028 // Gen Dead Band Ctrl Reg +#define PWM_O_X_DBRISE 0x0000002C // Gen DB Rising Edge Delay Reg +#define PWM_O_X_DBFALL 0x00000030 // Gen DB Falling Edge Delay Reg + +//***************************************************************************** +// +// PWM_X Control Register bit definitions. +// +//***************************************************************************** +#define PWM_X_CTL_ENABLE 0x00000001 // Master enable for gen block +#define PWM_X_CTL_MODE 0x00000002 // Counter mode, down or up/down +#define PWM_X_CTL_DEBUG 0x00000004 // Debug mode +#define PWM_X_CTL_LOADUPD 0x00000008 // Update mode for the load reg +#define PWM_X_CTL_CMPAUPD 0x00000010 // Update mode for comp A reg +#define PWM_X_CTL_CMPBUPD 0x00000020 // Update mode for comp B reg + +//***************************************************************************** +// +// PWM_X Interrupt/Trigger Enable Register bit definitions. +// +//***************************************************************************** +#define PWM_X_INTEN_INTCNTZERO 0x00000001 // Int if COUNT = 0 +#define PWM_X_INTEN_INTCNTLOAD 0x00000002 // Int if COUNT = LOAD +#define PWM_X_INTEN_INTCMPAU 0x00000004 // Int if COUNT = CMPA U +#define PWM_X_INTEN_INTCMPAD 0x00000008 // Int if COUNT = CMPA D +#define PWM_X_INTEN_INTCMPBU 0x00000010 // Int if COUNT = CMPA U +#define PWM_X_INTEN_INTCMPBD 0x00000020 // Int if COUNT = CMPA D +#define PWM_X_INTEN_TRCNTZERO 0x00000100 // Trig if COUNT = 0 +#define PWM_X_INTEN_TRCNTLOAD 0x00000200 // Trig if COUNT = LOAD +#define PWM_X_INTEN_TRCMPAU 0x00000400 // Trig if COUNT = CMPA U +#define PWM_X_INTEN_TRCMPAD 0x00000800 // Trig if COUNT = CMPA D +#define PWM_X_INTEN_TRCMPBU 0x00001000 // Trig if COUNT = CMPA U +#define PWM_X_INTEN_TRCMPBD 0x00002000 // Trig if COUNT = CMPA D + +//***************************************************************************** +// +// PWM_X Raw Interrupt Status Register bit definitions. +// +//***************************************************************************** +#define PWM_X_RIS_INTCNTZERO 0x00000001 // PWM_X_COUNT = 0 int +#define PWM_X_RIS_INTCNTLOAD 0x00000002 // PWM_X_COUNT = PWM_X_LOAD int +#define PWM_X_RIS_INTCMPAU 0x00000004 // PWM_X_COUNT = PWM_X_CMPA U int +#define PWM_X_RIS_INTCMPAD 0x00000008 // PWM_X_COUNT = PWM_X_CMPA D int +#define PWM_X_RIS_INTCMPBU 0x00000010 // PWM_X_COUNT = PWM_X_CMPB U int +#define PWM_X_RIS_INTCMPBD 0x00000020 // PWM_X_COUNT = PWM_X_CMPB D int + +//***************************************************************************** +// +// PWM_X Interrupt Status Register bit definitions. +// +//***************************************************************************** +#define PWM_X_INT_INTCNTZERO 0x00000001 // PWM_X_COUNT = 0 received +#define PWM_X_INT_INTCNTLOAD 0x00000002 // PWM_X_COUNT = PWM_X_LOAD rcvd +#define PWM_X_INT_INTCMPAU 0x00000004 // PWM_X_COUNT = PWM_X_CMPA U rcvd +#define PWM_X_INT_INTCMPAD 0x00000008 // PWM_X_COUNT = PWM_X_CMPA D rcvd +#define PWM_X_INT_INTCMPBU 0x00000010 // PWM_X_COUNT = PWM_X_CMPB U rcvd +#define PWM_X_INT_INTCMPBD 0x00000020 // PWM_X_COUNT = PWM_X_CMPB D rcvd + +//***************************************************************************** +// +// PWM_X Generator A/B Control Register bit definitions. +// +//***************************************************************************** +#define PWM_X_GEN_Y_ACTZERO 0x00000003 // Act PWM_X_COUNT = 0 +#define PWM_X_GEN_Y_ACTLOAD 0x0000000C // Act PWM_X_COUNT = PWM_X_LOAD +#define PWM_X_GEN_Y_ACTCMPAU 0x00000030 // Act PWM_X_COUNT = PWM_X_CMPA U +#define PWM_X_GEN_Y_ACTCMPAD 0x000000C0 // Act PWM_X_COUNT = PWM_X_CMPA D +#define PWM_X_GEN_Y_ACTCMPBU 0x00000300 // Act PWM_X_COUNT = PWM_X_CMPB U +#define PWM_X_GEN_Y_ACTCMPBD 0x00000C00 // Act PWM_X_COUNT = PWM_X_CMPB D + +//***************************************************************************** +// +// PWM_X Generator A/B Control Register action definitions. +// +//***************************************************************************** +#define PWM_GEN_ACT_NONE 0x0 // Do nothing +#define PWM_GEN_ACT_INV 0x1 // Invert the output signal +#define PWM_GEN_ACT_ZERO 0x2 // Set the output signal to zero +#define PWM_GEN_ACT_ONE 0x3 // Set the output signal to one +#define PWM_GEN_ACT_ZERO_SHIFT 0 // Shift amount for the zero action +#define PWM_GEN_ACT_LOAD_SHIFT 2 // Shift amount for the load action +#define PWM_GEN_ACT_A_UP_SHIFT 4 // Shift amount for the A up action +#define PWM_GEN_ACT_A_DN_SHIFT 6 // Shift amount for the A dn action +#define PWM_GEN_ACT_B_UP_SHIFT 8 // Shift amount for the B up action +#define PWM_GEN_ACT_B_DN_SHIFT 10 // Shift amount for the B dn action + +//***************************************************************************** +// +// PWM_X Dead Band Control Register bit definitions. +// +//***************************************************************************** +#define PWM_DBCTL_ENABLE 0x00000001 // Enable dead band insertion + +//***************************************************************************** +// +// PWM Register reset values. +// +//***************************************************************************** +#define PWM_RV_CTL 0x00000000 // Master control of the PWM module +#define PWM_RV_SYNC 0x00000000 // Counter synch for PWM generators +#define PWM_RV_ENABLE 0x00000000 // Master enable for the PWM + // output pins +#define PWM_RV_INVERT 0x00000000 // Inversion control for + // PWM output pins +#define PWM_RV_FAULT 0x00000000 // Fault handling for the PWM + // output pins +#define PWM_RV_INTEN 0x00000000 // Interrupt enable +#define PWM_RV_RIS 0x00000000 // Raw interrupt status +#define PWM_RV_ISC 0x00000000 // Interrupt status and clearing +#define PWM_RV_STATUS 0x00000000 // Status +#define PWM_RV_X_CTL 0x00000000 // Master control of the PWM + // generator block +#define PWM_RV_X_INTEN 0x00000000 // Interrupt and trigger enable +#define PWM_RV_X_RIS 0x00000000 // Raw interrupt status +#define PWM_RV_X_ISC 0x00000000 // Interrupt status and clearing +#define PWM_RV_X_LOAD 0x00000000 // The load value for the counter +#define PWM_RV_X_COUNT 0x00000000 // The current counter value +#define PWM_RV_X_CMPA 0x00000000 // The comparator A value +#define PWM_RV_X_CMPB 0x00000000 // The comparator B value +#define PWM_RV_X_GENA 0x00000000 // Controls PWM generator A +#define PWM_RV_X_GENB 0x00000000 // Controls PWM generator B +#define PWM_RV_X_DBCTL 0x00000000 // Control the dead band generator +#define PWM_RV_X_DBRISE 0x00000000 // The dead band rising edge delay + // count +#define PWM_RV_X_DBFALL 0x00000000 // The dead band falling edge delay + // count + +#endif // __HW_PWM_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_qei.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_qei.h new file mode 100644 index 000000000..6d988ba95 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_qei.h @@ -0,0 +1,176 @@ +//***************************************************************************** +// +// hw_qei.h - Macros used when accessing the QEI hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_QEI_H__ +#define __HW_QEI_H__ + +//***************************************************************************** +// +// The following define the offsets of the QEI registers. +// +//***************************************************************************** +#define QEI_O_CTL 0x00000000 // Configuration and control reg. +#define QEI_O_STAT 0x00000004 // Status register +#define QEI_O_POS 0x00000008 // Current position register +#define QEI_O_MAXPOS 0x0000000C // Maximum position register +#define QEI_O_LOAD 0x00000010 // Velocity timer load register +#define QEI_O_TIME 0x00000014 // Velocity timer register +#define QEI_O_COUNT 0x00000018 // Velocity pulse count register +#define QEI_O_SPEED 0x0000001C // Velocity speed register +#define QEI_O_INTEN 0x00000020 // Interrupt enable register +#define QEI_O_RIS 0x00000024 // Raw interrupt status register +#define QEI_O_ISC 0x00000028 // Interrupt status register + +//***************************************************************************** +// +// The following define the bit fields in the QEI_CTL register. +// +//***************************************************************************** +#define QEI_CTL_STALLEN 0x00001000 // Stall enable +#define QEI_CTL_INVI 0x00000800 // Invert Index input +#define QEI_CTL_INVB 0x00000400 // Invert PhB input +#define QEI_CTL_INVA 0x00000200 // Invert PhA input +#define QEI_CTL_VELDIV_M 0x000001C0 // Velocity predivider mask +#define QEI_CTL_VELDIV_1 0x00000000 // Predivide by 1 +#define QEI_CTL_VELDIV_2 0x00000040 // Predivide by 2 +#define QEI_CTL_VELDIV_4 0x00000080 // Predivide by 4 +#define QEI_CTL_VELDIV_8 0x000000C0 // Predivide by 8 +#define QEI_CTL_VELDIV_16 0x00000100 // Predivide by 16 +#define QEI_CTL_VELDIV_32 0x00000140 // Predivide by 32 +#define QEI_CTL_VELDIV_64 0x00000180 // Predivide by 64 +#define QEI_CTL_VELDIV_128 0x000001C0 // Predivide by 128 +#define QEI_CTL_VELEN 0x00000020 // Velocity enable +#define QEI_CTL_RESMODE 0x00000010 // Position counter reset mode +#define QEI_CTL_CAPMODE 0x00000008 // Edge capture mode +#define QEI_CTL_SIGMODE 0x00000004 // Encoder signaling mode +#define QEI_CTL_SWAP 0x00000002 // Swap input signals +#define QEI_CTL_ENABLE 0x00000001 // QEI enable + +//***************************************************************************** +// +// The following define the bit fields in the QEI_STAT register. +// +//***************************************************************************** +#define QEI_STAT_DIRECTION 0x00000002 // Direction of rotation +#define QEI_STAT_ERROR 0x00000001 // Signalling error detected + +//***************************************************************************** +// +// The following define the bit fields in the QEI_POS register. +// +//***************************************************************************** +#define QEI_POS_M 0xFFFFFFFF // Current encoder position +#define QEI_POS_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_MAXPOS register. +// +//***************************************************************************** +#define QEI_MAXPOS_M 0xFFFFFFFF // Maximum encoder position +#define QEI_MAXPOS_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_LOAD register. +// +//***************************************************************************** +#define QEI_LOAD_M 0xFFFFFFFF // Velocity timer load value +#define QEI_LOAD_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_TIME register. +// +//***************************************************************************** +#define QEI_TIME_M 0xFFFFFFFF // Velocity timer current value +#define QEI_TIME_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_COUNT register. +// +//***************************************************************************** +#define QEI_COUNT_M 0xFFFFFFFF // Encoder running pulse count +#define QEI_COUNT_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_SPEED register. +// +//***************************************************************************** +#define QEI_SPEED_M 0xFFFFFFFF // Encoder pulse count +#define QEI_SPEED_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_INTEN register. +// +//***************************************************************************** +#define QEI_INTEN_ERROR 0x00000008 // Phase error detected +#define QEI_INTEN_DIR 0x00000004 // Direction change +#define QEI_INTEN_TIMER 0x00000002 // Velocity timer expired +#define QEI_INTEN_INDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// The following define the bit fields in the QEI_RIS register. +// +//***************************************************************************** +#define QEI_RIS_ERROR 0x00000008 // Phase error detected +#define QEI_RIS_DIR 0x00000004 // Direction change +#define QEI_RIS_TIMER 0x00000002 // Velocity timer expired +#define QEI_RIS_INDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// The following define the bit fields in the QEI_ISC register. +// +//***************************************************************************** +#define QEI_INT_ERROR 0x00000008 // Phase error detected +#define QEI_INT_DIR 0x00000004 // Direction change +#define QEI_INT_TIMER 0x00000002 // Velocity timer expired +#define QEI_INT_INDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// The following define the reset values for the QEI registers. +// +//***************************************************************************** +#define QEI_RV_CTL 0x00000000 // Configuration and control reg. +#define QEI_RV_STAT 0x00000000 // Status register +#define QEI_RV_POS 0x00000000 // Current position register +#define QEI_RV_MAXPOS 0x00000000 // Maximum position register +#define QEI_RV_LOAD 0x00000000 // Velocity timer load register +#define QEI_RV_TIME 0x00000000 // Velocity timer register +#define QEI_RV_COUNT 0x00000000 // Velocity pulse count register +#define QEI_RV_SPEED 0x00000000 // Velocity speed register +#define QEI_RV_INTEN 0x00000000 // Interrupt enable register +#define QEI_RV_RIS 0x00000000 // Raw interrupt status register +#define QEI_RV_ISC 0x00000000 // Interrupt status register + +#endif // __HW_QEI_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_ssi.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_ssi.h new file mode 100644 index 000000000..2af758095 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_ssi.h @@ -0,0 +1,120 @@ +//***************************************************************************** +// +// hw_ssi.h - Macros used when accessing the SSI hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_SSI_H__ +#define __HW_SSI_H__ + +//***************************************************************************** +// +// The following define the offsets of the SSI registers. +// +//***************************************************************************** +#define SSI_O_CR0 0x00000000 // Control register 0 +#define SSI_O_CR1 0x00000004 // Control register 1 +#define SSI_O_DR 0x00000008 // Data register +#define SSI_O_SR 0x0000000C // Status register +#define SSI_O_CPSR 0x00000010 // Clock prescale register +#define SSI_O_IM 0x00000014 // Int mask set and clear register +#define SSI_O_RIS 0x00000018 // Raw interrupt register +#define SSI_O_MIS 0x0000001C // Masked interrupt register +#define SSI_O_ICR 0x00000020 // Interrupt clear register + +//***************************************************************************** +// +// The following define the bit fields in the SSI Control register 0. +// +//***************************************************************************** +#define SSI_CR0_SCR 0x0000FF00 // Serial clock rate +#define SSI_CR0_SPH 0x00000080 // SSPCLKOUT phase +#define SSI_CR0_SPO 0x00000040 // SSPCLKOUT polarity +#define SSI_CR0_FRF_MASK 0x00000030 // Frame format mask +#define SSI_CR0_FRF_MOTO 0x00000000 // Motorola SPI frame format +#define SSI_CR0_FRF_TI 0x00000010 // TI sync serial frame format +#define SSI_CR0_FRF_NMW 0x00000020 // National Microwire frame format +#define SSI_CR0_DSS 0x0000000F // Data size select +#define SSI_CR0_DSS_4 0x00000003 // 4 bit data +#define SSI_CR0_DSS_5 0x00000004 // 5 bit data +#define SSI_CR0_DSS_6 0x00000005 // 6 bit data +#define SSI_CR0_DSS_7 0x00000006 // 7 bit data +#define SSI_CR0_DSS_8 0x00000007 // 8 bit data +#define SSI_CR0_DSS_9 0x00000008 // 9 bit data +#define SSI_CR0_DSS_10 0x00000009 // 10 bit data +#define SSI_CR0_DSS_11 0x0000000A // 11 bit data +#define SSI_CR0_DSS_12 0x0000000B // 12 bit data +#define SSI_CR0_DSS_13 0x0000000C // 13 bit data +#define SSI_CR0_DSS_14 0x0000000D // 14 bit data +#define SSI_CR0_DSS_15 0x0000000E // 15 bit data +#define SSI_CR0_DSS_16 0x0000000F // 16 bit data + +//***************************************************************************** +// +// The following define the bit fields in the SSI Control register 1. +// +//***************************************************************************** +#define SSI_CR1_SOD 0x00000008 // Slave mode output disable +#define SSI_CR1_MS 0x00000004 // Master or slave mode select +#define SSI_CR1_SSE 0x00000002 // Sync serial port enable +#define SSI_CR1_LBM 0x00000001 // Loopback mode + +//***************************************************************************** +// +// The following define the bit fields in the SSI Status register. +// +//***************************************************************************** +#define SSI_SR_BSY 0x00000010 // SSI busy +#define SSI_SR_RFF 0x00000008 // RX FIFO full +#define SSI_SR_RNE 0x00000004 // RX FIFO not empty +#define SSI_SR_TNF 0x00000002 // TX FIFO not full +#define SSI_SR_TFE 0x00000001 // TX FIFO empty + +//***************************************************************************** +// +// The following define the bit fields in the SSI clock prescale register. +// +//***************************************************************************** +#define SSI_CPSR_CPSDVSR_MASK 0x000000FF // Clock prescale + +//***************************************************************************** +// +// The following define information concerning the SSI Data register. +// +//***************************************************************************** +#define TX_FIFO_SIZE (8) // Number of entries in the TX FIFO +#define RX_FIFO_SIZE (8) // Number of entries in the RX FIFO + +//***************************************************************************** +// +// The following define the bit fields in the interrupt mask set and clear, +// raw interrupt, masked interrupt, and interrupt clear registers. +// +//***************************************************************************** +#define SSI_INT_TXFF 0x00000008 // TX FIFO interrupt +#define SSI_INT_RXFF 0x00000004 // RX FIFO interrupt +#define SSI_INT_RXTO 0x00000002 // RX timeout interrupt +#define SSI_INT_RXOR 0x00000001 // RX overrun interrupt + +#endif // __HW_SSI_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_sysctl.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_sysctl.h new file mode 100644 index 000000000..6a2d6312b --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_sysctl.h @@ -0,0 +1,659 @@ +//***************************************************************************** +// +// hw_sysctl.h - Macros used when accessing the system control hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_SYSCTL_H__ +#define __HW_SYSCTL_H__ + +//***************************************************************************** +// +// The following define the addresses of the system control registers. +// +//***************************************************************************** +#define SYSCTL_DID0 0x400fe000 // Device identification register 0 +#define SYSCTL_DID1 0x400fe004 // Device identification register 1 +#define SYSCTL_DC0 0x400fe008 // Device capabilities register 0 +#define SYSCTL_DC1 0x400fe010 // Device capabilities register 1 +#define SYSCTL_DC2 0x400fe014 // Device capabilities register 2 +#define SYSCTL_DC3 0x400fe018 // Device capabilities register 3 +#define SYSCTL_DC4 0x400fe01C // Device capabilities register 4 +#define SYSCTL_PBORCTL 0x400fe030 // POR/BOR reset control register +#define SYSCTL_LDOPCTL 0x400fe034 // LDO power control register +#define SYSCTL_SRCR0 0x400fe040 // Software reset control reg 0 +#define SYSCTL_SRCR1 0x400fe044 // Software reset control reg 1 +#define SYSCTL_SRCR2 0x400fe048 // Software reset control reg 2 +#define SYSCTL_RIS 0x400fe050 // Raw interrupt status register +#define SYSCTL_IMC 0x400fe054 // Interrupt mask/control register +#define SYSCTL_MISC 0x400fe058 // Interrupt status register +#define SYSCTL_RESC 0x400fe05c // Reset cause register +#define SYSCTL_RCC 0x400fe060 // Run-mode clock config register +#define SYSCTL_PLLCFG 0x400fe064 // PLL configuration register +#define SYSCTL_RCC2 0x400fe070 // Run-mode clock config register 2 +#define SYSCTL_RCGC0 0x400fe100 // Run-mode clock gating register 0 +#define SYSCTL_RCGC1 0x400fe104 // Run-mode clock gating register 1 +#define SYSCTL_RCGC2 0x400fe108 // Run-mode clock gating register 2 +#define SYSCTL_SCGC0 0x400fe110 // Sleep-mode clock gating reg 0 +#define SYSCTL_SCGC1 0x400fe114 // Sleep-mode clock gating reg 1 +#define SYSCTL_SCGC2 0x400fe118 // Sleep-mode clock gating reg 2 +#define SYSCTL_DCGC0 0x400fe120 // Deep Sleep-mode clock gate reg 0 +#define SYSCTL_DCGC1 0x400fe124 // Deep Sleep-mode clock gate reg 1 +#define SYSCTL_DCGC2 0x400fe128 // Deep Sleep-mode clock gate reg 2 +#define SYSCTL_DSLPCLKCFG 0x400fe144 // Deep Sleep-mode clock config reg +#define SYSCTL_CLKVCLR 0x400fe150 // Clock verifcation clear register +#define SYSCTL_LDOARST 0x400fe160 // LDO reset control register +#define SYSCTL_USER0 0x400fe1e0 // NV User Register 0 +#define SYSCTL_USER1 0x400fe1e4 // NV User Register 1 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DID0 register. +// +//***************************************************************************** +#define SYSCTL_DID0_VER_MASK 0x70000000 // DID0 version mask +#define SYSCTL_DID0_VER_0 0x00000000 // DID0 version 0 +#define SYSCTL_DID0_VER_1 0x10000000 // DID0 version 1 +#define SYSCTL_DID0_CLASS_MASK 0x00FF0000 // Device Class +#define SYSCTL_DID0_CLASS_SANDSTORM 0x00000000 // LM3Snnn Sandstorm Device +#define SYSCTL_DID0_CLASS_FURY 0x00010000 // LM3Snnnn Fury Device +#define SYSCTL_DID0_MAJ_MASK 0x0000FF00 // Major revision mask +#define SYSCTL_DID0_MAJ_A 0x00000000 // Major revision A +#define SYSCTL_DID0_MAJ_B 0x00000100 // Major revision B +#define SYSCTL_DID0_MAJ_C 0x00000200 // Major revision C +#define SYSCTL_DID0_MIN_MASK 0x000000FF // Minor revision mask +#define SYSCTL_DID0_MIN_0 0x00000000 // Minor revision 0 +#define SYSCTL_DID0_MIN_1 0x00000001 // Minor revision 1 +#define SYSCTL_DID0_MIN_2 0x00000002 // Minor revision 2 +#define SYSCTL_DID0_MIN_3 0x00000003 // Minor revision 3 +#define SYSCTL_DID0_MIN_4 0x00000004 // Minor revision 4 +#define SYSCTL_DID0_MIN_5 0x00000005 // Minor revision 5 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DID1 register. +// +//***************************************************************************** +#define SYSCTL_DID1_VER_MASK 0xF0000000 // Register version mask +#define SYSCTL_DID1_FAM_MASK 0x0F000000 // Family mask +#define SYSCTL_DID1_FAM_S 0x00000000 // Stellaris family +#define SYSCTL_DID1_PRTNO_MASK 0x00FF0000 // Part number mask +#define SYSCTL_DID1_PRTNO_101 0x00010000 // LM3S101 +#define SYSCTL_DID1_PRTNO_102 0x00020000 // LM3S102 +#define SYSCTL_DID1_PRTNO_301 0x00110000 // LM3S301 +#define SYSCTL_DID1_PRTNO_310 0x00120000 // LM3S310 +#define SYSCTL_DID1_PRTNO_315 0x00130000 // LM3S315 +#define SYSCTL_DID1_PRTNO_316 0x00140000 // LM3S316 +#define SYSCTL_DID1_PRTNO_317 0x00170000 // LM3S317 +#define SYSCTL_DID1_PRTNO_328 0x00150000 // LM3S328 +#define SYSCTL_DID1_PRTNO_601 0x00210000 // LM3S601 +#define SYSCTL_DID1_PRTNO_610 0x00220000 // LM3S610 +#define SYSCTL_DID1_PRTNO_611 0x00230000 // LM3S611 +#define SYSCTL_DID1_PRTNO_612 0x00240000 // LM3S612 +#define SYSCTL_DID1_PRTNO_613 0x00250000 // LM3S613 +#define SYSCTL_DID1_PRTNO_615 0x00260000 // LM3S615 +#define SYSCTL_DID1_PRTNO_617 0x00280000 // LM3S617 +#define SYSCTL_DID1_PRTNO_618 0x00290000 // LM3S618 +#define SYSCTL_DID1_PRTNO_628 0x00270000 // LM3S628 +#define SYSCTL_DID1_PRTNO_801 0x00310000 // LM3S801 +#define SYSCTL_DID1_PRTNO_811 0x00320000 // LM3S811 +#define SYSCTL_DID1_PRTNO_812 0x00330000 // LM3S812 +#define SYSCTL_DID1_PRTNO_815 0x00340000 // LM3S815 +#define SYSCTL_DID1_PRTNO_817 0x00360000 // LM3S817 +#define SYSCTL_DID1_PRTNO_818 0x00370000 // LM3S818 +#define SYSCTL_DID1_PRTNO_828 0x00350000 // LM3S828 +#define SYSCTL_DID1_PRTNO_2110 0x00510000 // LM3S2110 +#define SYSCTL_DID1_PRTNO_2139 0x00840000 // LM3S2139 +#define SYSCTL_DID1_PRTNO_2410 0x00A20000 // LM3S2410 +#define SYSCTL_DID1_PRTNO_2412 0x00590000 // LM3S2412 +#define SYSCTL_DID1_PRTNO_2432 0x00560000 // LM3S2432 +#define SYSCTL_DID1_PRTNO_2533 0x005A0000 // LM3S2533 +#define SYSCTL_DID1_PRTNO_2620 0x00570000 // LM3S2620 +#define SYSCTL_DID1_PRTNO_2637 0x00850000 // LM3S2637 +#define SYSCTL_DID1_PRTNO_2651 0x00530000 // LM3S2651 +#define SYSCTL_DID1_PRTNO_2730 0x00A40000 // LM3S2730 +#define SYSCTL_DID1_PRTNO_2739 0x00520000 // LM3S2739 +#define SYSCTL_DID1_PRTNO_2939 0x00540000 // LM3S2939 +#define SYSCTL_DID1_PRTNO_2948 0x008F0000 // LM3S2948 +#define SYSCTL_DID1_PRTNO_2950 0x00580000 // LM3S2950 +#define SYSCTL_DID1_PRTNO_2965 0x00550000 // LM3S2965 +#define SYSCTL_DID1_PRTNO_6100 0x00A10000 // LM3S6100 +#define SYSCTL_DID1_PRTNO_6110 0x00740000 // LM3S6110 +#define SYSCTL_DID1_PRTNO_6420 0x00A50000 // LM3S6420 +#define SYSCTL_DID1_PRTNO_6422 0x00820000 // LM3S6422 +#define SYSCTL_DID1_PRTNO_6432 0x00750000 // LM3S6432 +#define SYSCTL_DID1_PRTNO_6610 0x00710000 // LM3S6610 +#define SYSCTL_DID1_PRTNO_6633 0x00830000 // LM3S6633 +#define SYSCTL_DID1_PRTNO_6637 0x008B0000 // LM3S6637 +#define SYSCTL_DID1_PRTNO_6730 0x00A30000 // LM3S6730 +#define SYSCTL_DID1_PRTNO_6938 0x00890000 // LM3S6938 +#define SYSCTL_DID1_PRTNO_6952 0x00780000 // LM3S6952 +#define SYSCTL_DID1_PRTNO_6965 0x00730000 // LM3S6965 +#define SYSCTL_DID1_PINCNT_MASK 0x0000E000 // Pin count +#define SYSCTL_DID1_PINCNT_100 0x00004000 // 100 pin package +#define SYSCTL_DID1_TEMP_MASK 0x000000E0 // Temperature range mask +#define SYSCTL_DID1_TEMP_C 0x00000000 // Commercial temp range (0..70C) +#define SYSCTL_DID1_TEMP_I 0x00000020 // Industrial temp range (-40..85C) +#define SYSCTL_DID1_PKG_MASK 0x00000018 // Package mask +#define SYSCTL_DID1_PKG_28SOIC 0x00000000 // 28-pin SOIC +#define SYSCTL_DID1_PKG_48QFP 0x00000008 // 48-pin QFP +#define SYSCTL_DID1_ROHS 0x00000004 // Part is RoHS compliant +#define SYSCTL_DID1_QUAL_MASK 0x00000003 // Qualification status mask +#define SYSCTL_DID1_QUAL_ES 0x00000000 // Engineering sample (unqualified) +#define SYSCTL_DID1_QUAL_PP 0x00000001 // Pilot production (unqualified) +#define SYSCTL_DID1_QUAL_FQ 0x00000002 // Fully qualified +#define SYSCTL_DID1_PRTNO_SHIFT 16 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC0 register. +// +//***************************************************************************** +#define SYSCTL_DC0_SRAMSZ_MASK 0xFFFF0000 // SRAM size mask +#define SYSCTL_DC0_SRAMSZ_2KB 0x00070000 // 2 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_4KB 0x000F0000 // 4 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_8KB 0x001F0000 // 8 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_16KB 0x003F0000 // 16 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_32KB 0x007F0000 // 32 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_64KB 0x00FF0000 // 64 KB of SRAM +#define SYSCTL_DC0_FLASHSZ_MASK 0x0000FFFF // Flash size mask +#define SYSCTL_DC0_FLASHSZ_8KB 0x00000003 // 8 KB of flash +#define SYSCTL_DC0_FLASHSZ_16KB 0x00000007 // 16 KB of flash +#define SYSCTL_DC0_FLASHSZ_32KB 0x0000000F // 32 KB of flash +#define SYSCTL_DC0_FLASHSZ_64KB 0x0000001F // 64 KB of flash +#define SYSCTL_DC0_FLASHSZ_96KB 0x0000002F // 96 KB of flash +#define SYSCTL_DC0_FLASHSZ_128K 0x0000003F // 128 KB of flash +#define SYSCTL_DC0_FLASHSZ_256K 0x0000007F // 256 KB of flash + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC1 register. +// +//***************************************************************************** +#define SYSCTL_DC1_CAN1 0x02000000 // CAN1 module present +#define SYSCTL_DC1_CAN0 0x01000000 // CAN0 module present +#define SYSCTL_DC1_PWM 0x00100000 // PWM module present +#define SYSCTL_DC1_ADC 0x00010000 // ADC module present +#define SYSCTL_DC1_SYSDIV_MASK 0x0000F000 // Minimum system divider mask +#define SYSCTL_DC1_ADCSPD_MASK 0x00000F00 // ADC speed mask +#define SYSCTL_DC1_ADCSPD_1M 0x00000300 // 1Msps ADC +#define SYSCTL_DC1_ADCSPD_500K 0x00000200 // 500Ksps ADC +#define SYSCTL_DC1_ADCSPD_250K 0x00000100 // 250Ksps ADC +#define SYSCTL_DC1_ADCSPD_125K 0x00000000 // 125Ksps ADC +#define SYSCTL_DC1_MPU 0x00000080 // Cortex M3 MPU present +#define SYSCTL_DC1_HIB 0x00000040 // Hibernation module present +#define SYSCTL_DC1_TEMP 0x00000020 // Temperature sensor present +#define SYSCTL_DC1_PLL 0x00000010 // PLL present +#define SYSCTL_DC1_WDOG 0x00000008 // Watchdog present +#define SYSCTL_DC1_SWO 0x00000004 // Serial wire output present +#define SYSCTL_DC1_SWD 0x00000002 // Serial wire debug present +#define SYSCTL_DC1_JTAG 0x00000001 // JTAG debug present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC2 register. +// +//***************************************************************************** +#define SYSCTL_DC2_COMP2 0x04000000 // Analog comparator 2 present +#define SYSCTL_DC2_COMP1 0x02000000 // Analog comparator 1 present +#define SYSCTL_DC2_COMP0 0x01000000 // Analog comparator 0 present +#define SYSCTL_DC2_TIMER3 0x00080000 // Timer 3 present +#define SYSCTL_DC2_TIMER2 0x00040000 // Timer 2 present +#define SYSCTL_DC2_TIMER1 0x00020000 // Timer 1 present +#define SYSCTL_DC2_TIMER0 0x00010000 // Timer 0 present +#define SYSCTL_DC2_I2C1 0x00002000 // I2C 1 present +#define SYSCTL_DC2_I2C0 0x00001000 // I2C 0 present +#ifndef DEPRECATED +#define SYSCTL_DC2_I2C 0x00001000 // I2C present +#endif +#define SYSCTL_DC2_QEI1 0x00000200 // QEI 1 present +#define SYSCTL_DC2_QEI0 0x00000100 // QEI 0 present +#ifndef DEPRECATED +#define SYSCTL_DC2_QEI 0x00000100 // QEI present +#endif +#define SYSCTL_DC2_SSI1 0x00000020 // SSI 1 present +#define SYSCTL_DC2_SSI0 0x00000010 // SSI 0 present +#ifndef DEPRECATED +#define SYSCTL_DC2_SSI 0x00000010 // SSI present +#endif +#define SYSCTL_DC2_UART2 0x00000004 // UART 2 present +#define SYSCTL_DC2_UART1 0x00000002 // UART 1 present +#define SYSCTL_DC2_UART0 0x00000001 // UART 0 present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC3 register. +// +//***************************************************************************** +#define SYSCTL_DC3_32KHZ 0x80000000 // 32kHz pin present +#define SYSCTL_DC3_CCP5 0x20000000 // CCP5 pin present +#define SYSCTL_DC3_CCP4 0x10000000 // CCP4 pin present +#define SYSCTL_DC3_CCP3 0x08000000 // CCP3 pin present +#define SYSCTL_DC3_CCP2 0x04000000 // CCP2 pin present +#define SYSCTL_DC3_CCP1 0x02000000 // CCP1 pin present +#define SYSCTL_DC3_CCP0 0x01000000 // CCP0 pin present +#define SYSCTL_DC3_ADC7 0x00800000 // ADC7 pin present +#define SYSCTL_DC3_ADC6 0x00400000 // ADC6 pin present +#define SYSCTL_DC3_ADC5 0x00200000 // ADC5 pin present +#define SYSCTL_DC3_ADC4 0x00100000 // ADC4 pin present +#define SYSCTL_DC3_ADC3 0x00080000 // ADC3 pin present +#define SYSCTL_DC3_ADC2 0x00040000 // ADC2 pin present +#define SYSCTL_DC3_ADC1 0x00020000 // ADC1 pin present +#define SYSCTL_DC3_ADC0 0x00010000 // ADC0 pin present +#define SYSCTL_DC3_MC_FAULT0 0x00008000 // MC0 fault pin present +#define SYSCTL_DC3_C2O 0x00004000 // C2o pin present +#define SYSCTL_DC3_C2PLUS 0x00002000 // C2+ pin present +#define SYSCTL_DC3_C2MINUS 0x00001000 // C2- pin present +#define SYSCTL_DC3_C1O 0x00000800 // C1o pin present +#define SYSCTL_DC3_C1PLUS 0x00000400 // C1+ pin present +#define SYSCTL_DC3_C1MINUS 0x00000200 // C1- pin present +#define SYSCTL_DC3_C0O 0x00000100 // C0o pin present +#define SYSCTL_DC3_C0PLUS 0x00000080 // C0+ pin present +#define SYSCTL_DC3_C0MINUS 0x00000040 // C0- pin present +#define SYSCTL_DC3_PWM5 0x00000020 // PWM5 pin present +#define SYSCTL_DC3_PWM4 0x00000010 // PWM4 pin present +#define SYSCTL_DC3_PWM3 0x00000008 // PWM3 pin present +#define SYSCTL_DC3_PWM2 0x00000004 // PWM2 pin present +#define SYSCTL_DC3_PWM1 0x00000002 // PWM1 pin present +#define SYSCTL_DC3_PWM0 0x00000001 // PWM0 pin present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC4 register. +// +//***************************************************************************** +#define SYSCTL_DC4_ETH 0x50000000 // Ethernet present +#define SYSCTL_DC4_GPIOH 0x00000080 // GPIO port H present +#define SYSCTL_DC4_GPIOG 0x00000040 // GPIO port G present +#define SYSCTL_DC4_GPIOF 0x00000020 // GPIO port F present +#define SYSCTL_DC4_GPIOE 0x00000010 // GPIO port E present +#define SYSCTL_DC4_GPIOD 0x00000008 // GPIO port D present +#define SYSCTL_DC4_GPIOC 0x00000004 // GPIO port C present +#define SYSCTL_DC4_GPIOB 0x00000002 // GPIO port B present +#define SYSCTL_DC4_GPIOA 0x00000001 // GPIO port A present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_PBORCTL register. +// +//***************************************************************************** +#define SYSCTL_PBORCTL_BOR_MASK 0x0000FFFC // BOR wait timer +#define SYSCTL_PBORCTL_BORIOR 0x00000002 // BOR interrupt or reset +#define SYSCTL_PBORCTL_BORWT 0x00000001 // BOR wait and check for noise +#define SYSCTL_PBORCTL_BOR_SH 2 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_LDOPCTL register. +// +//***************************************************************************** +#define SYSCTL_LDOPCTL_MASK 0x0000003F // Voltage adjust mask +#define SYSCTL_LDOPCTL_2_25V 0x00000005 // LDO output of 2.25V +#define SYSCTL_LDOPCTL_2_30V 0x00000004 // LDO output of 2.30V +#define SYSCTL_LDOPCTL_2_35V 0x00000003 // LDO output of 2.35V +#define SYSCTL_LDOPCTL_2_40V 0x00000002 // LDO output of 2.40V +#define SYSCTL_LDOPCTL_2_45V 0x00000001 // LDO output of 2.45V +#define SYSCTL_LDOPCTL_2_50V 0x00000000 // LDO output of 2.50V +#define SYSCTL_LDOPCTL_2_55V 0x0000001F // LDO output of 2.55V +#define SYSCTL_LDOPCTL_2_60V 0x0000001E // LDO output of 2.60V +#define SYSCTL_LDOPCTL_2_65V 0x0000001D // LDO output of 2.65V +#define SYSCTL_LDOPCTL_2_70V 0x0000001C // LDO output of 2.70V +#define SYSCTL_LDOPCTL_2_75V 0x0000001B // LDO output of 2.75V + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR0, SYSCTL_RCGC0, +// SYSCTL_SCGC0, and SYSCTL_DCGC0 registers. +// +//***************************************************************************** +#define SYSCTL_SET0_CAN1 0x02000000 // CAN 1 module +#define SYSCTL_SET0_CAN0 0x01000000 // CAN 0 module +#define SYSCTL_SET0_PWM 0x00100000 // PWM module +#define SYSCTL_SET0_ADC 0x00010000 // ADC module +#define SYSCTL_SET0_ADCSPD_MASK 0x00000F00 // ADC speed mask +#define SYSCTL_SET0_ADCSPD_1M 0x00000300 // 1Msps ADC +#define SYSCTL_SET0_ADCSPD_500K 0x00000200 // 500Ksps ADC +#define SYSCTL_SET0_ADCSPD_250K 0x00000100 // 250Ksps ADC +#define SYSCTL_SET0_ADCSPD_125K 0x00000000 // 125Ksps ADC +#define SYSCTL_SET0_HIB 0x00000040 // Hibernation module +#define SYSCTL_SET0_WDOG 0x00000008 // Watchdog module + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR1, SYSCTL_RCGC1, +// SYSCTL_SCGC1, and SYSCTL_DCGC1 registers. +// +//***************************************************************************** +#define SYSCTL_SET1_COMP2 0x04000000 // Analog comparator module 2 +#define SYSCTL_SET1_COMP1 0x02000000 // Analog comparator module 1 +#define SYSCTL_SET1_COMP0 0x01000000 // Analog comparator module 0 +#define SYSCTL_SET1_TIMER3 0x00080000 // Timer module 3 +#define SYSCTL_SET1_TIMER2 0x00040000 // Timer module 2 +#define SYSCTL_SET1_TIMER1 0x00020000 // Timer module 1 +#define SYSCTL_SET1_TIMER0 0x00010000 // Timer module 0 +#define SYSCTL_SET1_I2C1 0x00002000 // I2C module 1 +#define SYSCTL_SET1_I2C0 0x00001000 // I2C module 0 +#ifndef DEPRECATED +#define SYSCTL_SET1_I2C 0x00001000 // I2C module +#endif +#define SYSCTL_SET1_QEI1 0x00000200 // QEI module 1 +#define SYSCTL_SET1_QEI0 0x00000100 // QEI module 0 +#ifndef DEPRECATED +#define SYSCTL_SET1_QEI 0x00000100 // QEI module +#endif +#define SYSCTL_SET1_SSI1 0x00000020 // SSI module 1 +#define SYSCTL_SET1_SSI0 0x00000010 // SSI module 0 +#ifndef DEPRECATED +#define SYSCTL_SET1_SSI 0x00000010 // SSI module +#endif +#define SYSCTL_SET1_UART2 0x00000004 // UART module 2 +#define SYSCTL_SET1_UART1 0x00000002 // UART module 1 +#define SYSCTL_SET1_UART0 0x00000001 // UART module 0 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR2, SYSCTL_RCGC2, +// SYSCTL_SCGC2, and SYSCTL_DCGC2 registers. +// +//***************************************************************************** +#define SYSCTL_SET2_ETH 0x50000000 // ETH module +#define SYSCTL_SET2_GPIOH 0x00000080 // GPIO H module +#define SYSCTL_SET2_GPIOG 0x00000040 // GPIO G module +#define SYSCTL_SET2_GPIOF 0x00000020 // GPIO F module +#define SYSCTL_SET2_GPIOE 0x00000010 // GPIO E module +#define SYSCTL_SET2_GPIOD 0x00000008 // GPIO D module +#define SYSCTL_SET2_GPIOC 0x00000004 // GPIO C module +#define SYSCTL_SET2_GPIOB 0x00000002 // GPIO B module +#define SYSCTL_SET2_GPIOA 0x00000001 // GIPO A module + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RIS, SYSCTL_IMC, and +// SYSCTL_IMS registers. +// +//***************************************************************************** +#define SYSCTL_INT_PLL_LOCK 0x00000040 // PLL lock interrupt +#define SYSCTL_INT_CUR_LIMIT 0x00000020 // Current limit interrupt +#define SYSCTL_INT_IOSC_FAIL 0x00000010 // Internal oscillator failure int +#define SYSCTL_INT_MOSC_FAIL 0x00000008 // Main oscillator failure int +#define SYSCTL_INT_POR 0x00000004 // Power on reset interrupt +#define SYSCTL_INT_BOR 0x00000002 // Brown out interrupt +#define SYSCTL_INT_PLL_FAIL 0x00000001 // PLL failure interrupt + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RESC register. +// +//***************************************************************************** +#define SYSCTL_RESC_LDO 0x00000020 // LDO power OK lost reset +#define SYSCTL_RESC_SW 0x00000010 // Software reset +#define SYSCTL_RESC_WDOG 0x00000008 // Watchdog reset +#define SYSCTL_RESC_BOR 0x00000004 // Brown-out reset +#define SYSCTL_RESC_POR 0x00000002 // Power on reset +#define SYSCTL_RESC_EXT 0x00000001 // External reset + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RCC register. +// +//***************************************************************************** +#define SYSCTL_RCC_ACG 0x08000000 // Automatic clock gating +#define SYSCTL_RCC_SYSDIV_MASK 0x07800000 // System clock divider +#define SYSCTL_RCC_SYSDIV_2 0x00800000 // System clock /2 +#define SYSCTL_RCC_SYSDIV_3 0x01000000 // System clock /3 +#define SYSCTL_RCC_SYSDIV_4 0x01800000 // System clock /4 +#define SYSCTL_RCC_SYSDIV_5 0x02000000 // System clock /5 +#define SYSCTL_RCC_SYSDIV_6 0x02800000 // System clock /6 +#define SYSCTL_RCC_SYSDIV_7 0x03000000 // System clock /7 +#define SYSCTL_RCC_SYSDIV_8 0x03800000 // System clock /8 +#define SYSCTL_RCC_SYSDIV_9 0x04000000 // System clock /9 +#define SYSCTL_RCC_SYSDIV_10 0x04800000 // System clock /10 +#define SYSCTL_RCC_SYSDIV_11 0x05000000 // System clock /11 +#define SYSCTL_RCC_SYSDIV_12 0x05800000 // System clock /12 +#define SYSCTL_RCC_SYSDIV_13 0x06000000 // System clock /13 +#define SYSCTL_RCC_SYSDIV_14 0x06800000 // System clock /14 +#define SYSCTL_RCC_SYSDIV_15 0x07000000 // System clock /15 +#define SYSCTL_RCC_SYSDIV_16 0x07800000 // System clock /16 +#define SYSCTL_RCC_USE_SYSDIV 0x00400000 // Use sytem clock divider +#define SYSCTL_RCC_USE_PWMDIV 0x00100000 // Use PWM clock divider +#define SYSCTL_RCC_PWMDIV_MASK 0x000E0000 // PWM clock divider +#define SYSCTL_RCC_PWMDIV_2 0x00000000 // PWM clock /2 +#define SYSCTL_RCC_PWMDIV_4 0x00020000 // PWM clock /4 +#define SYSCTL_RCC_PWMDIV_8 0x00040000 // PWM clock /8 +#define SYSCTL_RCC_PWMDIV_16 0x00060000 // PWM clock /16 +#define SYSCTL_RCC_PWMDIV_32 0x00080000 // PWM clock /32 +#define SYSCTL_RCC_PWMDIV_64 0x000A0000 // PWM clock /64 +#define SYSCTL_RCC_PWRDN 0x00002000 // PLL power down +#define SYSCTL_RCC_OE 0x00001000 // PLL output enable +#define SYSCTL_RCC_BYPASS 0x00000800 // PLL bypass +#define SYSCTL_RCC_PLLVER 0x00000400 // PLL verification timer enable +#define SYSCTL_RCC_XTAL_MASK 0x000003C0 // Crystal attached to main osc +#define SYSCTL_RCC_XTAL_3_57MHZ 0x00000100 // Using a 3.579545MHz crystal +#define SYSCTL_RCC_XTAL_3_68MHz 0x00000140 // Using a 3.6864MHz crystal +#define SYSCTL_RCC_XTAL_4MHz 0x00000180 // Using a 4MHz crystal +#define SYSCTL_RCC_XTAL_4_09MHZ 0x000001C0 // Using a 4.096MHz crystal +#define SYSCTL_RCC_XTAL_4_91MHZ 0x00000200 // Using a 4.9152MHz crystal +#define SYSCTL_RCC_XTAL_5MHZ 0x00000240 // Using a 5MHz crystal +#define SYSCTL_RCC_XTAL_5_12MHZ 0x00000280 // Using a 5.12MHz crystal +#define SYSCTL_RCC_XTAL_6MHZ 0x000002C0 // Using a 6MHz crystal +#define SYSCTL_RCC_XTAL_6_14MHZ 0x00000300 // Using a 6.144MHz crystal +#define SYSCTL_RCC_XTAL_7_37MHZ 0x00000340 // Using a 7.3728MHz crystal +#define SYSCTL_RCC_XTAL_8MHZ 0x00000380 // Using a 8MHz crystal +#define SYSCTL_RCC_XTAL_8_19MHZ 0x000003C0 // Using a 8.192MHz crystal +#define SYSCTL_RCC_OSCSRC_MASK 0x00000030 // Oscillator input select +#define SYSCTL_RCC_OSCSRC_MAIN 0x00000000 // Use the main oscillator +#define SYSCTL_RCC_OSCSRC_INT 0x00000010 // Use the internal oscillator +#define SYSCTL_RCC_OSCSRC_INT4 0x00000020 // Use the internal oscillator / 4 +#define SYSCTL_RCC_IOSCVER 0x00000008 // Int. osc. verification timer en +#define SYSCTL_RCC_MOSCVER 0x00000004 // Main osc. verification timer en +#define SYSCTL_RCC_IOSCDIS 0x00000002 // Internal oscillator disable +#define SYSCTL_RCC_MOSCDIS 0x00000001 // Main oscillator disable +#define SYSCTL_RCC_SYSDIV_SHIFT 23 // Shift to the SYSDIV field +#define SYSCTL_RCC_PWMDIV_SHIFT 17 // Shift to the PWMDIV field +#define SYSCTL_RCC_XTAL_SHIFT 6 // Shift to the XTAL field +#define SYSCTL_RCC_OSCSRC_SHIFT 4 // Shift to the OSCSRC field + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_PLLCFG register. +// +//***************************************************************************** +#define SYSCTL_PLLCFG_OD_MASK 0x0000C000 // Output divider +#define SYSCTL_PLLCFG_OD_1 0x00000000 // Output divider is 1 +#define SYSCTL_PLLCFG_OD_2 0x00004000 // Output divider is 2 +#define SYSCTL_PLLCFG_OD_4 0x00008000 // Output divider is 4 +#define SYSCTL_PLLCFG_F_MASK 0x00003FE0 // PLL multiplier +#define SYSCTL_PLLCFG_R_MASK 0x0000001F // Input predivider +#define SYSCTL_PLLCFG_F_SHIFT 5 +#define SYSCTL_PLLCFG_R_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RCC2 register. +// +//***************************************************************************** +#define SYSCTL_RCC2_USERCC2 0x80000000 // Use RCC2 +#define SYSCTL_RCC2_SYSDIV2_MSK 0x1F800000 // System clock divider +#define SYSCTL_RCC2_SYSDIV2_2 0x00800000 // System clock /2 +#define SYSCTL_RCC2_SYSDIV2_3 0x01000000 // System clock /3 +#define SYSCTL_RCC2_SYSDIV2_4 0x01800000 // System clock /4 +#define SYSCTL_RCC2_SYSDIV2_5 0x02000000 // System clock /5 +#define SYSCTL_RCC2_SYSDIV2_6 0x02800000 // System clock /6 +#define SYSCTL_RCC2_SYSDIV2_7 0x03000000 // System clock /7 +#define SYSCTL_RCC2_SYSDIV2_8 0x03800000 // System clock /8 +#define SYSCTL_RCC2_SYSDIV2_9 0x04000000 // System clock /9 +#define SYSCTL_RCC2_SYSDIV2_10 0x04800000 // System clock /10 +#define SYSCTL_RCC2_SYSDIV2_11 0x05000000 // System clock /11 +#define SYSCTL_RCC2_SYSDIV2_12 0x05800000 // System clock /12 +#define SYSCTL_RCC2_SYSDIV2_13 0x06000000 // System clock /13 +#define SYSCTL_RCC2_SYSDIV2_14 0x06800000 // System clock /14 +#define SYSCTL_RCC2_SYSDIV2_15 0x07000000 // System clock /15 +#define SYSCTL_RCC2_SYSDIV2_16 0x07800000 // System clock /16 +#define SYSCTL_RCC2_SYSDIV2_17 0x08000000 // System clock /17 +#define SYSCTL_RCC2_SYSDIV2_18 0x08800000 // System clock /18 +#define SYSCTL_RCC2_SYSDIV2_19 0x09000000 // System clock /19 +#define SYSCTL_RCC2_SYSDIV2_20 0x09800000 // System clock /20 +#define SYSCTL_RCC2_SYSDIV2_21 0x0A000000 // System clock /21 +#define SYSCTL_RCC2_SYSDIV2_22 0x0A800000 // System clock /22 +#define SYSCTL_RCC2_SYSDIV2_23 0x0B000000 // System clock /23 +#define SYSCTL_RCC2_SYSDIV2_24 0x0B800000 // System clock /24 +#define SYSCTL_RCC2_SYSDIV2_25 0x0C000000 // System clock /25 +#define SYSCTL_RCC2_SYSDIV2_26 0x0C800000 // System clock /26 +#define SYSCTL_RCC2_SYSDIV2_27 0x0D000000 // System clock /27 +#define SYSCTL_RCC2_SYSDIV2_28 0x0D800000 // System clock /28 +#define SYSCTL_RCC2_SYSDIV2_29 0x0E000000 // System clock /29 +#define SYSCTL_RCC2_SYSDIV2_30 0x0E800000 // System clock /30 +#define SYSCTL_RCC2_SYSDIV2_31 0x0F000000 // System clock /31 +#define SYSCTL_RCC2_SYSDIV2_32 0x0F800000 // System clock /32 +#define SYSCTL_RCC2_SYSDIV2_33 0x10000000 // System clock /33 +#define SYSCTL_RCC2_SYSDIV2_34 0x10800000 // System clock /34 +#define SYSCTL_RCC2_SYSDIV2_35 0x11000000 // System clock /35 +#define SYSCTL_RCC2_SYSDIV2_36 0x11800000 // System clock /36 +#define SYSCTL_RCC2_SYSDIV2_37 0x12000000 // System clock /37 +#define SYSCTL_RCC2_SYSDIV2_38 0x12800000 // System clock /38 +#define SYSCTL_RCC2_SYSDIV2_39 0x13000000 // System clock /39 +#define SYSCTL_RCC2_SYSDIV2_40 0x13800000 // System clock /40 +#define SYSCTL_RCC2_SYSDIV2_41 0x14000000 // System clock /41 +#define SYSCTL_RCC2_SYSDIV2_42 0x14800000 // System clock /42 +#define SYSCTL_RCC2_SYSDIV2_43 0x15000000 // System clock /43 +#define SYSCTL_RCC2_SYSDIV2_44 0x15800000 // System clock /44 +#define SYSCTL_RCC2_SYSDIV2_45 0x16000000 // System clock /45 +#define SYSCTL_RCC2_SYSDIV2_46 0x16800000 // System clock /46 +#define SYSCTL_RCC2_SYSDIV2_47 0x17000000 // System clock /47 +#define SYSCTL_RCC2_SYSDIV2_48 0x17800000 // System clock /48 +#define SYSCTL_RCC2_SYSDIV2_49 0x18000000 // System clock /49 +#define SYSCTL_RCC2_SYSDIV2_50 0x18800000 // System clock /50 +#define SYSCTL_RCC2_SYSDIV2_51 0x19000000 // System clock /51 +#define SYSCTL_RCC2_SYSDIV2_52 0x19800000 // System clock /52 +#define SYSCTL_RCC2_SYSDIV2_53 0x1A000000 // System clock /53 +#define SYSCTL_RCC2_SYSDIV2_54 0x1A800000 // System clock /54 +#define SYSCTL_RCC2_SYSDIV2_55 0x1B000000 // System clock /55 +#define SYSCTL_RCC2_SYSDIV2_56 0x1B800000 // System clock /56 +#define SYSCTL_RCC2_SYSDIV2_57 0x1C000000 // System clock /57 +#define SYSCTL_RCC2_SYSDIV2_58 0x1C800000 // System clock /58 +#define SYSCTL_RCC2_SYSDIV2_59 0x1D000000 // System clock /59 +#define SYSCTL_RCC2_SYSDIV2_60 0x1D800000 // System clock /60 +#define SYSCTL_RCC2_SYSDIV2_61 0x1E000000 // System clock /61 +#define SYSCTL_RCC2_SYSDIV2_62 0x1E800000 // System clock /62 +#define SYSCTL_RCC2_SYSDIV2_63 0x1F000000 // System clock /63 +#define SYSCTL_RCC2_SYSDIV2_64 0x1F800000 // System clock /64 +#define SYSCTL_RCC2_PWRDN2 0x00002000 // PLL power down +#define SYSCTL_RCC2_BYPASS2 0x00000800 // PLL bypass +#define SYSCTL_RCC2_OSCSRC2_MSK 0x00000070 // Oscillator input select +#define SYSCTL_RCC2_OSCSRC2_MO 0x00000000 // Use the main oscillator +#define SYSCTL_RCC2_OSCSRC2_IO 0x00000010 // Use the internal oscillator +#define SYSCTL_RCC2_OSCSRC2_IO4 0x00000020 // Use the internal oscillator / 4 +#define SYSCTL_RCC2_OSCSRC2_30 0x00000030 // Use the 30 KHz internal osc. +#define SYSCTL_RCC2_OSCSRC2_32 0x00000070 // Use the 32 KHz external osc. + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DSLPCLKCFG register. +// +//***************************************************************************** +#define SYSCTL_DSLPCLKCFG_D_MSK 0x1f800000 // Deep sleep system clock override +#define SYSCTL_DSLPCLKCFG_D_2 0x00800000 // System clock /2 +#define SYSCTL_DSLPCLKCFG_D_3 0x01000000 // System clock /3 +#define SYSCTL_DSLPCLKCFG_D_4 0x01800000 // System clock /4 +#define SYSCTL_DSLPCLKCFG_D_5 0x02000000 // System clock /5 +#define SYSCTL_DSLPCLKCFG_D_6 0x02800000 // System clock /6 +#define SYSCTL_DSLPCLKCFG_D_7 0x03000000 // System clock /7 +#define SYSCTL_DSLPCLKCFG_D_8 0x03800000 // System clock /8 +#define SYSCTL_DSLPCLKCFG_D_9 0x04000000 // System clock /9 +#define SYSCTL_DSLPCLKCFG_D_10 0x04800000 // System clock /10 +#define SYSCTL_DSLPCLKCFG_D_11 0x05000000 // System clock /11 +#define SYSCTL_DSLPCLKCFG_D_12 0x05800000 // System clock /12 +#define SYSCTL_DSLPCLKCFG_D_13 0x06000000 // System clock /13 +#define SYSCTL_DSLPCLKCFG_D_14 0x06800000 // System clock /14 +#define SYSCTL_DSLPCLKCFG_D_15 0x07000000 // System clock /15 +#define SYSCTL_DSLPCLKCFG_D_16 0x07800000 // System clock /16 +#define SYSCTL_DSLPCLKCFG_D_17 0x08000000 // System clock /17 +#define SYSCTL_DSLPCLKCFG_D_18 0x08800000 // System clock /18 +#define SYSCTL_DSLPCLKCFG_D_19 0x09000000 // System clock /19 +#define SYSCTL_DSLPCLKCFG_D_20 0x09800000 // System clock /20 +#define SYSCTL_DSLPCLKCFG_D_21 0x0A000000 // System clock /21 +#define SYSCTL_DSLPCLKCFG_D_22 0x0A800000 // System clock /22 +#define SYSCTL_DSLPCLKCFG_D_23 0x0B000000 // System clock /23 +#define SYSCTL_DSLPCLKCFG_D_24 0x0B800000 // System clock /24 +#define SYSCTL_DSLPCLKCFG_D_25 0x0C000000 // System clock /25 +#define SYSCTL_DSLPCLKCFG_D_26 0x0C800000 // System clock /26 +#define SYSCTL_DSLPCLKCFG_D_27 0x0D000000 // System clock /27 +#define SYSCTL_DSLPCLKCFG_D_28 0x0D800000 // System clock /28 +#define SYSCTL_DSLPCLKCFG_D_29 0x0E000000 // System clock /29 +#define SYSCTL_DSLPCLKCFG_D_30 0x0E800000 // System clock /30 +#define SYSCTL_DSLPCLKCFG_D_31 0x0F000000 // System clock /31 +#define SYSCTL_DSLPCLKCFG_D_32 0x0F800000 // System clock /32 +#define SYSCTL_DSLPCLKCFG_D_33 0x10000000 // System clock /33 +#define SYSCTL_DSLPCLKCFG_D_34 0x10800000 // System clock /34 +#define SYSCTL_DSLPCLKCFG_D_35 0x11000000 // System clock /35 +#define SYSCTL_DSLPCLKCFG_D_36 0x11800000 // System clock /36 +#define SYSCTL_DSLPCLKCFG_D_37 0x12000000 // System clock /37 +#define SYSCTL_DSLPCLKCFG_D_38 0x12800000 // System clock /38 +#define SYSCTL_DSLPCLKCFG_D_39 0x13000000 // System clock /39 +#define SYSCTL_DSLPCLKCFG_D_40 0x13800000 // System clock /40 +#define SYSCTL_DSLPCLKCFG_D_41 0x14000000 // System clock /41 +#define SYSCTL_DSLPCLKCFG_D_42 0x14800000 // System clock /42 +#define SYSCTL_DSLPCLKCFG_D_43 0x15000000 // System clock /43 +#define SYSCTL_DSLPCLKCFG_D_44 0x15800000 // System clock /44 +#define SYSCTL_DSLPCLKCFG_D_45 0x16000000 // System clock /45 +#define SYSCTL_DSLPCLKCFG_D_46 0x16800000 // System clock /46 +#define SYSCTL_DSLPCLKCFG_D_47 0x17000000 // System clock /47 +#define SYSCTL_DSLPCLKCFG_D_48 0x17800000 // System clock /48 +#define SYSCTL_DSLPCLKCFG_D_49 0x18000000 // System clock /49 +#define SYSCTL_DSLPCLKCFG_D_50 0x18800000 // System clock /50 +#define SYSCTL_DSLPCLKCFG_D_51 0x19000000 // System clock /51 +#define SYSCTL_DSLPCLKCFG_D_52 0x19800000 // System clock /52 +#define SYSCTL_DSLPCLKCFG_D_53 0x1A000000 // System clock /53 +#define SYSCTL_DSLPCLKCFG_D_54 0x1A800000 // System clock /54 +#define SYSCTL_DSLPCLKCFG_D_55 0x1B000000 // System clock /55 +#define SYSCTL_DSLPCLKCFG_D_56 0x1B800000 // System clock /56 +#define SYSCTL_DSLPCLKCFG_D_57 0x1C000000 // System clock /57 +#define SYSCTL_DSLPCLKCFG_D_58 0x1C800000 // System clock /58 +#define SYSCTL_DSLPCLKCFG_D_59 0x1D000000 // System clock /59 +#define SYSCTL_DSLPCLKCFG_D_60 0x1D800000 // System clock /60 +#define SYSCTL_DSLPCLKCFG_D_61 0x1E000000 // System clock /61 +#define SYSCTL_DSLPCLKCFG_D_62 0x1E800000 // System clock /62 +#define SYSCTL_DSLPCLKCFG_D_63 0x1F000000 // System clock /63 +#define SYSCTL_DSLPCLKCFG_D_64 0x1F800000 // System clock /64 +#define SYSCTL_DSLPCLKCFG_O_MSK 0x00000070 // Deep sleep oscillator override +#define SYSCTL_DSLPCLKCFG_O_IGN 0x00000000 // Do not override +#define SYSCTL_DSLPCLKCFG_O_IO 0x00000010 // Use the internal oscillator +#define SYSCTL_DSLPCLKCFG_O_30 0x00000030 // Use the 30 KHz internal osc. +#define SYSCTL_DSLPCLKCFG_O_32 0x00000070 // Use the 32 KHz external osc. + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_CLKVCLR register. +// +//***************************************************************************** +#define SYSCTL_CLKVCLR_CLR 0x00000001 // Clear clock verification fault + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_LDOARST register. +// +//***************************************************************************** +#define SYSCTL_LDOARST_ARST 0x00000001 // Allow LDO to reset device + +#endif // __HW_SYSCTL_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_timer.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_timer.h new file mode 100644 index 000000000..eb58abf65 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_timer.h @@ -0,0 +1,235 @@ +//***************************************************************************** +// +// hw_timer.h - Defines and macros used when accessing the timer. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_TIMER_H__ +#define __HW_TIMER_H__ + +//***************************************************************************** +// +// The following define the offsets of the timer registers. +// +//***************************************************************************** +#define TIMER_O_CFG 0x00000000 // Configuration register +#define TIMER_O_TAMR 0x00000004 // TimerA mode register +#define TIMER_O_TBMR 0x00000008 // TimerB mode register +#define TIMER_O_CTL 0x0000000C // Control register +#define TIMER_O_IMR 0x00000018 // Interrupt mask register +#define TIMER_O_RIS 0x0000001C // Interrupt status register +#define TIMER_O_MIS 0x00000020 // Masked interrupt status reg. +#define TIMER_O_ICR 0x00000024 // Interrupt clear register +#define TIMER_O_TAILR 0x00000028 // TimerA interval load register +#define TIMER_O_TBILR 0x0000002C // TimerB interval load register +#define TIMER_O_TAMATCHR 0x00000030 // TimerA match register +#define TIMER_O_TBMATCHR 0x00000034 // TimerB match register +#define TIMER_O_TAPR 0x00000038 // TimerA prescale register +#define TIMER_O_TBPR 0x0000003C // TimerB prescale register +#define TIMER_O_TAPMR 0x00000040 // TimerA prescale match register +#define TIMER_O_TBPMR 0x00000044 // TimerB prescale match register +#define TIMER_O_TAR 0x00000048 // TimerA register +#define TIMER_O_TBR 0x0000004C // TimerB register + +//***************************************************************************** +// +// The following define the reset values of the timer registers. +// +//***************************************************************************** +#define TIMER_RV_CFG 0x00000000 // Configuration register RV +#define TIMER_RV_TAMR 0x00000000 // TimerA mode register RV +#define TIMER_RV_TBMR 0x00000000 // TimerB mode register RV +#define TIMER_RV_CTL 0x00000000 // Control register RV +#define TIMER_RV_IMR 0x00000000 // Interrupt mask register RV +#define TIMER_RV_RIS 0x00000000 // Interrupt status register RV +#define TIMER_RV_MIS 0x00000000 // Masked interrupt status reg RV +#define TIMER_RV_ICR 0x00000000 // Interrupt clear register RV +#define TIMER_RV_TAILR 0xFFFFFFFF // TimerA interval load reg RV +#define TIMER_RV_TBILR 0x0000FFFF // TimerB interval load reg RV +#define TIMER_RV_TAMATCHR 0xFFFFFFFF // TimerA match register RV +#define TIMER_RV_TBMATCHR 0x0000FFFF // TimerB match register RV +#define TIMER_RV_TAPR 0x00000000 // TimerA prescale register RV +#define TIMER_RV_TBPR 0x00000000 // TimerB prescale register RV +#define TIMER_RV_TAPMR 0x00000000 // TimerA prescale match reg RV +#define TIMER_RV_TBPMR 0x00000000 // TimerB prescale match regi RV +#define TIMER_RV_TAR 0xFFFFFFFF // TimerA register RV +#define TIMER_RV_TBR 0x0000FFFF // TimerB register RV + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_CFG register. +// +//***************************************************************************** +#define TIMER_CFG_CFG_MSK 0x00000007 // Configuration options mask +#define TIMER_CFG_16_BIT 0x00000004 // Two 16 bit timers +#define TIMER_CFG_32_BIT_RTC 0x00000001 // 32 bit RTC +#define TIMER_CFG_32_BIT_TIMER 0x00000000 // 32 bit timer + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TnMR register. +// +//***************************************************************************** +#define TIMER_TNMR_TNAMS 0x00000008 // Alternate mode select +#define TIMER_TNMR_TNCMR 0x00000004 // Capture mode - count or time +#define TIMER_TNMR_TNTMR_MSK 0x00000003 // Timer mode mask +#define TIMER_TNMR_TNTMR_CAP 0x00000003 // Mode - capture +#define TIMER_TNMR_TNTMR_PERIOD 0x00000002 // Mode - periodic +#define TIMER_TNMR_TNTMR_1_SHOT 0x00000001 // Mode - one shot + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_CTL register. +// +//***************************************************************************** +#define TIMER_CTL_TBPWML 0x00004000 // TimerB PWM output level invert +#define TIMER_CTL_TBOTE 0x00002000 // TimerB output trigger enable +#define TIMER_CTL_TBEVENT_MSK 0x00000C00 // TimerB event mode mask +#define TIMER_CTL_TBEVENT_BOTH 0x00000C00 // TimerB event mode - both edges +#define TIMER_CTL_TBEVENT_NEG 0x00000400 // TimerB event mode - neg edge +#define TIMER_CTL_TBEVENT_POS 0x00000000 // TimerB event mode - pos edge +#define TIMER_CTL_TBSTALL 0x00000200 // TimerB stall enable +#define TIMER_CTL_TBEN 0x00000100 // TimerB enable +#define TIMER_CTL_TAPWML 0x00000040 // TimerA PWM output level invert +#define TIMER_CTL_TAOTE 0x00000020 // TimerA output trigger enable +#define TIMER_CTL_RTCEN 0x00000010 // RTC counter enable +#define TIMER_CTL_TAEVENT_MSK 0x0000000C // TimerA event mode mask +#define TIMER_CTL_TAEVENT_BOTH 0x0000000C // TimerA event mode - both edges +#define TIMER_CTL_TAEVENT_NEG 0x00000004 // TimerA event mode - neg edge +#define TIMER_CTL_TAEVENT_POS 0x00000000 // TimerA event mode - pos edge +#define TIMER_CTL_TASTALL 0x00000002 // TimerA stall enable +#define TIMER_CTL_TAEN 0x00000001 // TimerA enable + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_IMR register. +// +//***************************************************************************** +#define TIMER_IMR_CBEIM 0x00000400 // CaptureB event interrupt mask +#define TIMER_IMR_CBMIM 0x00000200 // CaptureB match interrupt mask +#define TIMER_IMR_TBTOIM 0x00000100 // TimerB time out interrupt mask +#define TIMER_IMR_RTCIM 0x00000008 // RTC interrupt mask +#define TIMER_IMR_CAEIM 0x00000004 // CaptureA event interrupt mask +#define TIMER_IMR_CAMIM 0x00000002 // CaptureA match interrupt mask +#define TIMER_IMR_TATOIM 0x00000001 // TimerA time out interrupt mask + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_RIS register. +// +//***************************************************************************** +#define TIMER_RIS_CBERIS 0x00000400 // CaptureB event raw int status +#define TIMER_RIS_CBMRIS 0x00000200 // CaptureB match raw int status +#define TIMER_RIS_TBTORIS 0x00000100 // TimerB time out raw int status +#define TIMER_RIS_RTCRIS 0x00000008 // RTC raw int status +#define TIMER_RIS_CAERIS 0x00000004 // CaptureA event raw int status +#define TIMER_RIS_CAMRIS 0x00000002 // CaptureA match raw int status +#define TIMER_RIS_TATORIS 0x00000001 // TimerA time out raw int status + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_MIS register. +// +//***************************************************************************** +#define TIMER_RIS_CBEMIS 0x00000400 // CaptureB event masked int status +#define TIMER_RIS_CBMMIS 0x00000200 // CaptureB match masked int status +#define TIMER_RIS_TBTOMIS 0x00000100 // TimerB time out masked int stat +#define TIMER_RIS_RTCMIS 0x00000008 // RTC masked int status +#define TIMER_RIS_CAEMIS 0x00000004 // CaptureA event masked int status +#define TIMER_RIS_CAMMIS 0x00000002 // CaptureA match masked int status +#define TIMER_RIS_TATOMIS 0x00000001 // TimerA time out masked int stat + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_ICR register. +// +//***************************************************************************** +#define TIMER_ICR_CBECINT 0x00000400 // CaptureB event interrupt clear +#define TIMER_ICR_CBMCINT 0x00000200 // CaptureB match interrupt clear +#define TIMER_ICR_TBTOCINT 0x00000100 // TimerB time out interrupt clear +#define TIMER_ICR_RTCCINT 0x00000008 // RTC interrupt clear +#define TIMER_ICR_CAECINT 0x00000004 // CaptureA event interrupt clear +#define TIMER_ICR_CAMCINT 0x00000002 // CaptureA match interrupt clear +#define TIMER_ICR_TATOCINT 0x00000001 // TimerA time out interrupt clear + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TAILR register. +// +//***************************************************************************** +#define TIMER_TAILR_TAILRH 0xFFFF0000 // TimerB load val in 32 bit mode +#define TIMER_TAILR_TAILRL 0x0000FFFF // TimerA interval load value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TBILR register. +// +//***************************************************************************** +#define TIMER_TBILR_TBILRL 0x0000FFFF // TimerB interval load value + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TAMATCHR register. +// +//***************************************************************************** +#define TIMER_TAMATCHR_TAMRH 0xFFFF0000 // TimerB match val in 32 bit mode +#define TIMER_TAMATCHR_TAMRL 0x0000FFFF // TimerA match value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TBMATCHR register. +// +//***************************************************************************** +#define TIMER_TBMATCHR_TBMRL 0x0000FFFF // TimerB match load value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TnPR register. +// +//***************************************************************************** +#define TIMER_TNPR_TNPSR 0x000000FF // TimerN prescale value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TnPMR register. +// +//***************************************************************************** +#define TIMER_TNPMR_TNPSMR 0x000000FF // TimerN prescale match value + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TAR register. +// +//***************************************************************************** +#define TIMER_TAR_TARH 0xFFFF0000 // TimerB val in 32 bit mode +#define TIMER_TAR_TARL 0x0000FFFF // TimerA value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TBR register. +// +//***************************************************************************** +#define TIMER_TBR_TBRL 0x0000FFFF // TimerB value + +#endif // __HW_TIMER_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_types.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_types.h new file mode 100644 index 000000000..974a85594 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_types.h @@ -0,0 +1,129 @@ +//***************************************************************************** +// +// hw_types.h - Common types and macros. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_TYPES_H__ +#define __HW_TYPES_H__ + +//***************************************************************************** +// +// Define a boolean type, and values for true and false. +// +//***************************************************************************** +typedef unsigned char tBoolean; + +#ifndef true +#define true 1 +#endif + +#ifndef false +#define false 0 +#endif + +//***************************************************************************** +// +// Macros for hardware access, both direct and via the bit-band region. +// +//***************************************************************************** +#define HWREG(x) \ + (*((volatile unsigned long *)(x))) +#define HWREGH(x) \ + (*((volatile unsigned short *)(x))) +#define HWREGB(x) \ + (*((volatile unsigned char *)(x))) +#define HWREGBITW(x, b) \ + HWREG(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) +#define HWREGBITH(x, b) \ + HWREGH(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) +#define HWREGBITB(x, b) \ + HWREGB(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) + +//***************************************************************************** +// +// Helper Macros for determining silicon revisions, etc. +// +// These macros will be used by Driverlib at "run-time" to create necessary +// conditional code blocks that will allow a single version of the Driverlib +// "binary" code to support multiple(all) Stellaris silicon revisions. +// +// It is expected that these macros will be used inside of a standard 'C' +// conditional block of code, e.g. +// +// if(DEVICE_IS_SANDSTORM()) +// { +// do some Sandstorm specific code here. +// } +// +// By default, these macros will be defined as run-time checks of the +// appropriate register(s) to allow creation of run-time conditional code +// blocks for a common DriverLib across the entire Stellaris family. +// +// However, if code-space optimization is required, these macros can be "hard- +// coded" for a specific version of Stellaris silicon. Many compilers will +// then detect the "hard-coded" conditionals, and appropriately optimize the +// code blocks, eliminating any "unreachable" code. This would result in +// a smaller Driverlib, thus producing a smaller final application size, but +// at the cost of limiting the Driverlib binary to a specific Stellaris +// silicon revision. +// +//***************************************************************************** +#ifndef DEVICE_IS_SANDSTORM +#define DEVICE_IS_SANDSTORM \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_VER_MASK) == SYSCTL_DID0_VER_0) || \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_VER_MASK) == SYSCTL_DID0_VER_1) && \ + ((HWREG(SYSCTL_DID0) & SYSCTL_DID0_CLASS_MASK) == \ + SYSCTL_DID0_CLASS_SANDSTORM))) +#endif + +#ifndef DEVICE_IS_FURY +#define DEVICE_IS_FURY \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_VER_MASK) == SYSCTL_DID0_VER_1) && \ + ((HWREG(SYSCTL_DID0) & SYSCTL_DID0_CLASS_MASK) == \ + SYSCTL_DID0_CLASS_FURY)) +#endif + +#ifndef DEVICE_IS_REVA2 +#define DEVICE_IS_REVA2 \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MAJ_MASK) == SYSCTL_DID0_MAJ_A) && \ + ((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MIN_MASK) == SYSCTL_DID0_MIN_2)) +#endif + +#ifndef DEVICE_IS_REVC1 +#define DEVICE_IS_REVC1 \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MAJ_MASK) == SYSCTL_DID0_MAJ_C) && \ + ((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MIN_MASK) == SYSCTL_DID0_MIN_1)) +#endif + +#ifndef DEVICE_IS_REVC2 +#define DEVICE_IS_REVC2 \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MAJ_MASK) == SYSCTL_DID0_MAJ_C) && \ + ((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MIN_MASK) == SYSCTL_DID0_MIN_2)) +#endif + +#endif // __HW_TYPES_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_uart.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_uart.h new file mode 100644 index 000000000..e5bb1c47e --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_uart.h @@ -0,0 +1,241 @@ +//***************************************************************************** +// +// hw_uart.h - Macros and defines used when accessing the UART hardware +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_UART_H__ +#define __HW_UART_H__ + +//***************************************************************************** +// +// UART Register Offsets. +// +//***************************************************************************** +#define UART_O_DR 0x00000000 // Data Register +#define UART_O_RSR 0x00000004 // Receive Status Register (read) +#define UART_O_ECR 0x00000004 // Error Clear Register (write) +#define UART_O_FR 0x00000018 // Flag Register (read only) +#define UART_O_IBRD 0x00000024 // Integer Baud Rate Divisor Reg +#define UART_O_FBRD 0x00000028 // Fractional Baud Rate Divisor Reg +#define UART_O_LCR_H 0x0000002C // Line Control Register, HIGH byte +#define UART_O_CTL 0x00000030 // Control Register +#define UART_O_IFLS 0x00000034 // Interrupt FIFO Level Select Reg +#define UART_O_IM 0x00000038 // Interrupt Mask Set/Clear Reg +#define UART_O_RIS 0x0000003C // Raw Interrupt Status Register +#define UART_O_MIS 0x00000040 // Masked Interrupt Status Register +#define UART_O_ICR 0x00000044 // Interrupt Clear Register +#define UART_O_PeriphID4 0x00000FD0 // +#define UART_O_PeriphID5 0x00000FD4 // +#define UART_O_PeriphID6 0x00000FD8 // +#define UART_O_PeriphID7 0x00000FDC // +#define UART_O_PeriphID0 0x00000FE0 // +#define UART_O_PeriphID1 0x00000FE4 // +#define UART_O_PeriphID2 0x00000FE8 // +#define UART_O_PeriphID3 0x00000FEC // +#define UART_O_PCellID0 0x00000FF0 // +#define UART_O_PCellID1 0x00000FF4 // +#define UART_O_PCellID2 0x00000FF8 // +#define UART_O_PCellID3 0x00000FFC // + +//***************************************************************************** +// +// Data Register bits +// +//***************************************************************************** +#define UART_DR_OE 0x00000800 // Overrun Error +#define UART_DR_BE 0x00000400 // Break Error +#define UART_DR_PE 0x00000200 // Parity Error +#define UART_DR_FE 0x00000100 // Framing Error +#define UART_DR_DATA_MASK 0x000000FF // UART data + +//***************************************************************************** +// +// Receive Status Register bits +// +//***************************************************************************** +#define UART_RSR_OE 0x00000008 // Overrun Error +#define UART_RSR_BE 0x00000004 // Break Error +#define UART_RSR_PE 0x00000002 // Parity Error +#define UART_RSR_FE 0x00000001 // Framing Error + +//***************************************************************************** +// +// Flag Register bits +// +//***************************************************************************** +#define UART_FR_TXFE 0x00000080 // TX FIFO Empty +#define UART_FR_RXFF 0x00000040 // RX FIFO Full +#define UART_FR_TXFF 0x00000020 // TX FIFO Full +#define UART_FR_RXFE 0x00000010 // RX FIFO Empty +#define UART_FR_BUSY 0x00000008 // UART Busy + +//***************************************************************************** +// +// Integer baud-rate divisor +// +//***************************************************************************** +#define UART_IBRD_DIVINT_MASK 0x0000FFFF // Integer baud-rate divisor + +//***************************************************************************** +// +// Fractional baud-rate divisor +// +//***************************************************************************** +#define UART_FBRD_DIVFRAC_MASK 0x0000003F // Fractional baud-rate divisor + +//***************************************************************************** +// +// Line Control Register High bits +// +//***************************************************************************** +#define UART_LCR_H_SPS 0x00000080 // Stick Parity Select +#define UART_LCR_H_WLEN 0x00000060 // Word length +#define UART_LCR_H_WLEN_8 0x00000060 // 8 bit data +#define UART_LCR_H_WLEN_7 0x00000040 // 7 bit data +#define UART_LCR_H_WLEN_6 0x00000020 // 6 bit data +#define UART_LCR_H_WLEN_5 0x00000000 // 5 bit data +#define UART_LCR_H_FEN 0x00000010 // Enable FIFO +#define UART_LCR_H_STP2 0x00000008 // Two Stop Bits Select +#define UART_LCR_H_EPS 0x00000004 // Even Parity Select +#define UART_LCR_H_PEN 0x00000002 // Parity Enable +#define UART_LCR_H_BRK 0x00000001 // Send Break + +//***************************************************************************** +// +// Control Register bits +// +//***************************************************************************** +#define UART_CTL_RXE 0x00000200 // Receive Enable +#define UART_CTL_TXE 0x00000100 // Transmit Enable +#define UART_CTL_LBE 0x00000080 // Loopback Enable +#define UART_CTL_SIRLP 0x00000004 // SIR (IrDA) Low Power Enable +#define UART_CTL_SIREN 0x00000002 // SIR (IrDA) Enable +#define UART_CTL_UARTEN 0x00000001 // UART Enable + +//***************************************************************************** +// +// Interrupt FIFO Level Select Register bits +// +//***************************************************************************** +#define UART_IFLS_RX1_8 0x00000000 // 1/8 Full +#define UART_IFLS_RX2_8 0x00000010 // 1/4 Full +#define UART_IFLS_RX4_8 0x00000020 // 1/2 Full +#define UART_IFLS_RX6_8 0x00000030 // 3/4 Full +#define UART_IFLS_RX7_8 0x00000040 // 7/8 Full +#define UART_IFLS_TX1_8 0x00000000 // 1/8 Full +#define UART_IFLS_TX2_8 0x00000001 // 1/4 Full +#define UART_IFLS_TX4_8 0x00000002 // 1/2 Full +#define UART_IFLS_TX6_8 0x00000003 // 3/4 Full +#define UART_IFLS_TX7_8 0x00000004 // 7/8 Full + +//***************************************************************************** +// +// Interrupt Mask Set/Clear Register bits +// +//***************************************************************************** +#define UART_IM_OEIM 0x00000400 // Overrun Error Interrupt Mask +#define UART_IM_BEIM 0x00000200 // Break Error Interrupt Mask +#define UART_IM_PEIM 0x00000100 // Parity Error Interrupt Mask +#define UART_IM_FEIM 0x00000080 // Framing Error Interrupt Mask +#define UART_IM_RTIM 0x00000040 // Receive Timeout Interrupt Mask +#define UART_IM_TXIM 0x00000020 // Transmit Interrupt Mask +#define UART_IM_RXIM 0x00000010 // Receive Interrupt Mask + +//***************************************************************************** +// +// Raw Interrupt Status Register +// +//***************************************************************************** +#define UART_RIS_OERIS 0x00000400 // Overrun Error Interrupt Status +#define UART_RIS_BERIS 0x00000200 // Break Error Interrupt Status +#define UART_RIS_PERIS 0x00000100 // Parity Error Interrupt Status +#define UART_RIS_FERIS 0x00000080 // Framing Error Interrupt Status +#define UART_RIS_RTRIS 0x00000040 // Receive Timeout Interrupt Status +#define UART_RIS_TXRIS 0x00000020 // Transmit Interrupt Status +#define UART_RIS_RXRIS 0x00000010 // Receive Interrupt Status + +//***************************************************************************** +// +// Masked Interrupt Status Register +// +//***************************************************************************** +#define UART_MIS_OEMIS 0x00000400 // Overrun Error Interrupt Status +#define UART_MIS_BEMIS 0x00000200 // Break Error Interrupt Status +#define UART_MIS_PEMIS 0x00000100 // Parity Error Interrupt Status +#define UART_MIS_FEMIS 0x00000080 // Framing Error Interrupt Status +#define UART_MIS_RTMIS 0x00000040 // Receive Timeout Interrupt Status +#define UART_MIS_TXMIS 0x00000020 // Transmit Interrupt Status +#define UART_MIS_RXMIS 0x00000010 // Receive Interrupt Status + +//***************************************************************************** +// +// Interrupt Clear Register bits +// +//***************************************************************************** +#define UART_ICR_OEIC 0x00000400 // Overrun Error Interrupt Clear +#define UART_ICR_BEIC 0x00000200 // Break Error Interrupt Clear +#define UART_ICR_PEIC 0x00000100 // Parity Error Interrupt Clear +#define UART_ICR_FEIC 0x00000080 // Framing Error Interrupt Clear +#define UART_ICR_RTIC 0x00000040 // Receive Timeout Interrupt Clear +#define UART_ICR_TXIC 0x00000020 // Transmit Interrupt Clear +#define UART_ICR_RXIC 0x00000010 // Receive Interrupt Clear + +#define UART_RSR_ANY (UART_RSR_OE | \ + UART_RSR_BE | \ + UART_RSR_PE | \ + UART_RSR_FE) + +//***************************************************************************** +// +// Reset Values for UART Registers. +// +//***************************************************************************** +#define UART_RV_DR 0x00000000 +#define UART_RV_RSR 0x00000000 +#define UART_RV_ECR 0x00000000 +#define UART_RV_FR 0x00000090 +#define UART_RV_IBRD 0x00000000 +#define UART_RV_FBRD 0x00000000 +#define UART_RV_LCR_H 0x00000000 +#define UART_RV_CTL 0x00000300 +#define UART_RV_IFLS 0x00000012 +#define UART_RV_IM 0x00000000 +#define UART_RV_RIS 0x00000000 +#define UART_RV_MIS 0x00000000 +#define UART_RV_ICR 0x00000000 +#define UART_RV_PeriphID4 0x00000000 +#define UART_RV_PeriphID5 0x00000000 +#define UART_RV_PeriphID6 0x00000000 +#define UART_RV_PeriphID7 0x00000000 +#define UART_RV_PeriphID0 0x00000011 +#define UART_RV_PeriphID1 0x00000000 +#define UART_RV_PeriphID2 0x00000018 +#define UART_RV_PeriphID3 0x00000001 +#define UART_RV_PCellID0 0x0000000D +#define UART_RV_PCellID1 0x000000F0 +#define UART_RV_PCellID2 0x00000005 +#define UART_RV_PCellID3 0x000000B1 + +#endif // __HW_UART_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_watchdog.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_watchdog.h new file mode 100644 index 000000000..7a3b5a8d9 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/hw_watchdog.h @@ -0,0 +1,116 @@ +//***************************************************************************** +// +// hw_watchdog.h - Macros used when accessing the Watchdog Timer hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_WATCHDOG_H__ +#define __HW_WATCHDOG_H__ + +//***************************************************************************** +// +// The following define the offsets of the Watchdog Timer registers. +// +//***************************************************************************** +#define WDT_O_LOAD 0x00000000 // Load register +#define WDT_O_VALUE 0x00000004 // Current value register +#define WDT_O_CTL 0x00000008 // Control register +#define WDT_O_ICR 0x0000000C // Interrupt clear register +#define WDT_O_RIS 0x00000010 // Raw interrupt status register +#define WDT_O_MIS 0x00000014 // Masked interrupt status register +#define WDT_O_TEST 0x00000418 // Test register +#define WDT_O_LOCK 0x00000C00 // Lock register +#define WDT_O_PeriphID4 0x00000FD0 // +#define WDT_O_PeriphID5 0x00000FD4 // +#define WDT_O_PeriphID6 0x00000FD8 // +#define WDT_O_PeriphID7 0x00000FDC // +#define WDT_O_PeriphID0 0x00000FE0 // +#define WDT_O_PeriphID1 0x00000FE4 // +#define WDT_O_PeriphID2 0x00000FE8 // +#define WDT_O_PeriphID3 0x00000FEC // +#define WDT_O_PCellID0 0x00000FF0 // +#define WDT_O_PCellID1 0x00000FF4 // +#define WDT_O_PCellID2 0x00000FF8 // +#define WDT_O_PCellID3 0x00000FFC // + +//***************************************************************************** +// +// The following define the bit fields in the WDT_CTL register. +// +//***************************************************************************** +#define WDT_CTL_RESEN 0x00000002 // Enable reset output +#define WDT_CTL_INTEN 0x00000001 // Enable the WDT counter and int + +//***************************************************************************** +// +// The following define the bit fields in the WDT_ISR, WDT_RIS, and WDT_MIS +// registers. +// +//***************************************************************************** +#define WDT_INT_TIMEOUT 0x00000001 // Watchdog timer expired + +//***************************************************************************** +// +// The following define the bit fields in the WDT_TEST register. +// +//***************************************************************************** +#define WDT_TEST_STALL 0x00000100 // Watchdog stall enable +#ifndef DEPRECATED +#define WDT_TEST_STALL_EN 0x00000100 // Watchdog stall enable +#endif + +//***************************************************************************** +// +// The following define the bit fields in the WDT_LOCK register. +// +//***************************************************************************** +#define WDT_LOCK_LOCKED 0x00000001 // Watchdog timer is locked +#define WDT_LOCK_UNLOCKED 0x00000000 // Watchdog timer is unlocked +#define WDT_LOCK_UNLOCK 0x1ACCE551 // Unlocks the watchdog timer + +//***************************************************************************** +// +// The following define the reset values for the WDT registers. +// +//***************************************************************************** +#define WDT_RV_LOAD 0xFFFFFFFF // Load register +#define WDT_RV_VALUE 0xFFFFFFFF // Current value register +#define WDT_RV_CTL 0x00000000 // Control register +#define WDT_RV_RIS 0x00000000 // Raw interrupt status register +#define WDT_RV_MIS 0x00000000 // Masked interrupt status register +#define WDT_RV_LOCK 0x00000000 // Lock register +#define WDT_RV_PeriphID4 0x00000000 // +#define WDT_RV_PeriphID5 0x00000000 // +#define WDT_RV_PeriphID6 0x00000000 // +#define WDT_RV_PeriphID7 0x00000000 // +#define WDT_RV_PeriphID0 0x00000005 // +#define WDT_RV_PeriphID1 0x00000018 // +#define WDT_RV_PeriphID2 0x00000018 // +#define WDT_RV_PeriphID3 0x00000001 // +#define WDT_RV_PCellID0 0x0000000D // +#define WDT_RV_PCellID1 0x000000F0 // +#define WDT_RV_PCellID2 0x00000005 // +#define WDT_RV_PCellID3 0x000000B1 // + +#endif // __HW_WATCHDOG_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/i2c.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/i2c.h new file mode 100644 index 000000000..46a28eeb5 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/i2c.h @@ -0,0 +1,137 @@ +//***************************************************************************** +// +// i2c.h - Prototypes for the I2C Driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __I2C_H__ +#define __I2C_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Defines for the API. +// +//***************************************************************************** +//***************************************************************************** +// +// Interrupt defines. +// +//***************************************************************************** +#define I2C_INT_MASTER 0x00000001 +#define I2C_INT_SLAVE 0x00000002 + +//***************************************************************************** +// +// I2C Master commands. +// +//***************************************************************************** +#define I2C_MASTER_CMD_SINGLE_SEND \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_SINGLE_RECEIVE \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_START \ + (I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_CONT \ + (I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_FINISH \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_ERROR_STOP \ + (I2C_MASTER_CS_STOP) +#define I2C_MASTER_CMD_BURST_RECEIVE_START \ + (I2C_MASTER_CS_ACK | I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_RECEIVE_CONT \ + (I2C_MASTER_CS_ACK | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_RECEIVE_FINISH \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_RUN) + +//***************************************************************************** +// +// I2C Master error status. +// +//***************************************************************************** +#define I2C_MASTER_ERR_NONE 0 +#define I2C_MASTER_ERR_ADDR_ACK 0x00000004 +#define I2C_MASTER_ERR_DATA_ACK 0x00000008 +#define I2C_MASTER_ERR_ARB_LOST 0x00000010 + +//***************************************************************************** +// +// I2C Slave action requests +// +//***************************************************************************** +#define I2C_SLAVE_ACT_NONE 0 +#define I2C_SLAVE_ACT_RREQ 0x00000001 // Master has sent data +#define I2C_SLAVE_ACT_TREQ 0x00000002 // Master has requested data + +//***************************************************************************** +// Miscellaneous I2C driver definitions. +//***************************************************************************** +#define I2C_MASTER_MAX_RETRIES 1000 // Number of retries + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void I2CIntRegister(unsigned long ulBase, void(fnHandler)(void)); +extern void I2CIntUnregister(unsigned long ulBase); +extern tBoolean I2CMasterBusBusy(unsigned long ulBase); +extern tBoolean I2CMasterBusy(unsigned long ulBase); +extern void I2CMasterControl(unsigned long ulBase, unsigned long ulCmd); +extern unsigned long I2CMasterDataGet(unsigned long ulBase); +extern void I2CMasterDataPut(unsigned long ulBase, unsigned char ucData); +extern void I2CMasterDisable(unsigned long ulBase); +extern void I2CMasterEnable(unsigned long ulBase); +extern unsigned long I2CMasterErr(unsigned long ulBase); +extern void I2CMasterInit(unsigned long ulBase, tBoolean bFast); +extern void I2CMasterIntClear(unsigned long ulBase); +extern void I2CMasterIntDisable(unsigned long ulBase); +extern void I2CMasterIntEnable(unsigned long ulBase); +extern tBoolean I2CMasterIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void I2CMasterSlaveAddrSet(unsigned long ulBase, + unsigned char ucSlaveAddr, + tBoolean bReceive); +extern unsigned long I2CSlaveDataGet(unsigned long ulBase); +extern void I2CSlaveDataPut(unsigned long ulBase, unsigned char ucData); +extern void I2CSlaveDisable(unsigned long ulBase); +extern void I2CSlaveEnable(unsigned long ulBase); +extern void I2CSlaveInit(unsigned long ulBase, unsigned char ucSlaveAddr); +extern void I2CSlaveIntClear(unsigned long ulBase); +extern void I2CSlaveIntDisable(unsigned long ulBase); +extern void I2CSlaveIntEnable(unsigned long ulBase); +extern tBoolean I2CSlaveIntStatus(unsigned long ulBase, tBoolean bMasked); +extern unsigned long I2CSlaveStatus(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __I2C_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/interrupt.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/interrupt.h new file mode 100644 index 000000000..1ce70f16b --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/interrupt.h @@ -0,0 +1,57 @@ +//***************************************************************************** +// +// interrupt.h - Prototypes for the NVIC Interrupt Controller Driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __INTERRUPT_H__ +#define __INTERRUPT_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void IntMasterEnable(void); +extern void IntMasterDisable(void); +extern void IntRegister(unsigned long ulInterrupt, void (*pfnHandler)(void)); +extern void IntUnregister(unsigned long ulInterrupt); +extern void IntPriorityGroupingSet(unsigned long ulBits); +extern unsigned long IntPriorityGroupingGet(void); +extern void IntPrioritySet(unsigned long ulInterrupt, + unsigned char ucPriority); +extern long IntPriorityGet(unsigned long ulInterrupt); +extern void IntEnable(unsigned long ulInterrupt); +extern void IntDisable(unsigned long ulInterrupt); + +#ifdef __cplusplus +} +#endif + +#endif // __INTERRUPT_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/lmi_flash.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/lmi_flash.h new file mode 100644 index 000000000..75d30c41c --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/lmi_flash.h @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// flash.h - Prototypes for the flash driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __FLASH_H__ +#define __FLASH_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to FlashProtectSet(), and returned by +// FlashProtectGet(). +// +//***************************************************************************** +typedef enum +{ + FlashReadWrite, // Flash can be read and written + FlashReadOnly, // Flash can only be read + FlashExecuteOnly // Flash can only be executed +} +tFlashProtection; + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern unsigned long FlashUsecGet(void); +extern void FlashUsecSet(unsigned long ulClocks); +extern long FlashErase(unsigned long ulAddress); +extern long FlashProgram(unsigned long *pulData, unsigned long ulAddress, + unsigned long ulCount); +extern tFlashProtection FlashProtectGet(unsigned long ulAddress); +extern long FlashProtectSet(unsigned long ulAddress, + tFlashProtection eProtect); +extern long FlashProtectSave(void); +extern long FlashUserGet(unsigned long *pulUser0, unsigned long *pulUser1); +extern long FlashUserSet(unsigned long ulUser0, unsigned long ulUser1); +extern long FlashUserSave(void); +extern void FlashIntRegister(void (*pfnHandler)(void)); +extern void FlashIntUnregister(void); +extern void FlashIntEnable(unsigned long ulIntFlags); +extern void FlashIntDisable(unsigned long ulIntFlags); +extern unsigned long FlashIntGetStatus(tBoolean bMasked); +extern void FlashIntClear(unsigned long ulIntFlags); + +#ifdef __cplusplus +} +#endif + +#endif // __FLASH_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/lmi_timer.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/lmi_timer.h new file mode 100644 index 000000000..85b3160ab --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/lmi_timer.h @@ -0,0 +1,137 @@ +//***************************************************************************** +// +// timer.h - Prototypes for the timer module +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __TIMER_H__ +#define __TIMER_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to TimerConfigure as the ulConfig parameter. +// +//***************************************************************************** +#define TIMER_CFG_32_BIT_OS 0x00000001 // 32-bit one-shot timer +#define TIMER_CFG_32_BIT_PER 0x00000002 // 32-bit periodic timer +#define TIMER_CFG_32_RTC 0x01000000 // 32-bit RTC timer +#define TIMER_CFG_16_BIT_PAIR 0x04000000 // Two 16-bit timers +#define TIMER_CFG_A_ONE_SHOT 0x00000001 // Timer A one-shot timer +#define TIMER_CFG_A_PERIODIC 0x00000002 // Timer A periodic timer +#define TIMER_CFG_A_CAP_COUNT 0x00000003 // Timer A event counter +#define TIMER_CFG_A_CAP_TIME 0x00000007 // Timer A event timer +#define TIMER_CFG_A_PWM 0x0000000A // Timer A PWM output +#define TIMER_CFG_B_ONE_SHOT 0x00000100 // Timer B one-shot timer +#define TIMER_CFG_B_PERIODIC 0x00000200 // Timer B periodic timer +#define TIMER_CFG_B_CAP_COUNT 0x00000300 // Timer B event counter +#define TIMER_CFG_B_CAP_TIME 0x00000700 // Timer B event timer +#define TIMER_CFG_B_PWM 0x00000A00 // Timer B PWM output + +//***************************************************************************** +// +// Values that can be passed to TimerIntEnable, TimerIntDisable, and +// TimerIntClear as the ulIntFlags parameter, and returned from TimerIntStatus. +// +//***************************************************************************** +#define TIMER_CAPB_EVENT 0x00000400 // CaptureB event interrupt +#define TIMER_CAPB_MATCH 0x00000200 // CaptureB match interrupt +#define TIMER_TIMB_TIMEOUT 0x00000100 // TimerB time out interrupt +#define TIMER_RTC_MATCH 0x00000008 // RTC interrupt mask +#define TIMER_CAPA_EVENT 0x00000004 // CaptureA event interrupt +#define TIMER_CAPA_MATCH 0x00000002 // CaptureA match interrupt +#define TIMER_TIMA_TIMEOUT 0x00000001 // TimerA time out interrupt + +//***************************************************************************** +// +// Values that can be passed to TimerControlEvent as the ulEvent parameter. +// +//***************************************************************************** +#define TIMER_EVENT_POS_EDGE 0x00000000 // Count positive edges +#define TIMER_EVENT_NEG_EDGE 0x00000404 // Count negative edges +#define TIMER_EVENT_BOTH_EDGES 0x00000C0C // Count both edges + +//***************************************************************************** +// +// Values that can be passed to most of the timer APIs as the ulTimer +// parameter. +// +//***************************************************************************** +#define TIMER_A 0x000000ff // Timer A +#define TIMER_B 0x0000ff00 // Timer B +#define TIMER_BOTH 0x0000ffff // Timer Both + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void TimerEnable(unsigned long ulBase, unsigned long ulTimer); +extern void TimerDisable(unsigned long ulBase, unsigned long ulTimer); +extern void TimerConfigure(unsigned long ulBase, unsigned long ulConfig); +extern void TimerControlLevel(unsigned long ulBase, unsigned long ulTimer, + tBoolean bInvert); +extern void TimerControlTrigger(unsigned long ulBase, unsigned long ulTimer, + tBoolean bEnable); +extern void TimerControlEvent(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulEvent); +extern void TimerControlStall(unsigned long ulBase, unsigned long ulTimer, + tBoolean bStall); +extern void TimerRTCEnable(unsigned long ulBase); +extern void TimerRTCDisable(unsigned long ulBase); +extern void TimerPrescaleSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerPrescaleGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerPrescaleMatchSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerPrescaleMatchGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerLoadSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerLoadGet(unsigned long ulBase, unsigned long ulTimer); +extern unsigned long TimerValueGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerMatchSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerMatchGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerIntRegister(unsigned long ulBase, unsigned long ulTimer, + void (*pfnHandler)(void)); +extern void TimerIntUnregister(unsigned long ulBase, unsigned long ulTimer); +extern void TimerIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void TimerIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long TimerIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void TimerIntClear(unsigned long ulBase, unsigned long ulIntFlags); +extern void TimerQuiesce(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __TIMER_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/osram128x64x4.c b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/osram128x64x4.c new file mode 100644 index 000000000..3353a82e6 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/osram128x64x4.c @@ -0,0 +1,933 @@ +//***************************************************************************** +// +// osram128x64x4.c - Driver for the OSRAM 128x64x4 graphical OLED display. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup ek_lm3sx965_api +//! @{ +// +//***************************************************************************** + +#include "hw_ssi.h" +#include "hw_memmap.h" +#include "hw_sysctl.h" +#include "hw_types.h" +#include "debug.h" +#include "gpio.h" +#include "ssi.h" +#include "sysctl.h" +#include "osram128x64x4.h" + +//***************************************************************************** +// +// Flag to indicate if SSI port is enabled for OSRAM usage. +// +//***************************************************************************** +static volatile tBoolean g_bSSIEnabled = false; + +//***************************************************************************** +// +// Define the OSRAM 128x64x4 Remap Setting(s). This will be used in +// several places in the code to switch between vertical and horizontal +// address incrementing. +// +// The Remap Command (0xA0) takes one 8-bit parameter. The parameter is +// defined as follows. +// +// Bit 7: Reserved +// Bit 6: Disable(0)/Enable(1) COM Split Odd Even +// When enabled, the COM signals are split Odd on one side, even on +// the other. Otherwise, they are split 0-39 on one side, 40-79 on +// the other. +// Bit 5: Reserved +// Bit 4: Disable(0)/Enable(1) COM Remap +// When Enabled, ROW 0-79 map to COM 79-0 (i.e. reverse row order) +// Bit 3: Reserved +// Bit 2: Horizontal(0)/Vertical(1) Address Increment +// When set, data RAM address will increment along the column rather +// than along the row. +// Bit 1: Disable(0)/Enable(1) Nibble Remap +// When enabled, the upper and lower nibbles in the DATA bus for access +// to the data RAM are swapped. +// Bit 0: Disable(0)/Enable(1) Column Address Remap +// When enabled, DATA RAM columns 0-63 are remapped to Segment Columns +// 127-0. +// +//***************************************************************************** +#define OSRAM_INIT_REMAP 0x52 +#define OSRAM_INIT_OFFSET 0x4C +static const unsigned char g_pucOSRAM128x64x4VerticalInc[] = { 0xA0, 0x56 }; +static const unsigned char g_pucOSRAM128x64x4HorizontalInc[] = { 0xA0, 0x52 }; + +//***************************************************************************** +// +// A 5x7 font (in a 6x8 cell, where the sixth column is omitted from this +// table) for displaying text on the OLED display. The data is organized as +// bytes from the left column to the right column, with each byte containing +// the top row in the LSB and the bottom row in the MSB. +// +// Note: This is the same font data that is used in the EK-LM3S811 +// osram96x16x1 driver. The single bit-per-pixel is expaned in the StringDraw +// function to the appropriate four bit-per-pixel gray scale format. +// +//***************************************************************************** +static const unsigned char g_pucFont[96][5] = +{ + { 0x00, 0x00, 0x00, 0x00, 0x00 }, // " " + { 0x00, 0x00, 0x4f, 0x00, 0x00 }, // ! + { 0x00, 0x07, 0x00, 0x07, 0x00 }, // " + { 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // # + { 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $ + { 0x23, 0x13, 0x08, 0x64, 0x62 }, // % + { 0x36, 0x49, 0x55, 0x22, 0x50 }, // & + { 0x00, 0x05, 0x03, 0x00, 0x00 }, // ' + { 0x00, 0x1c, 0x22, 0x41, 0x00 }, // ( + { 0x00, 0x41, 0x22, 0x1c, 0x00 }, // ) + { 0x14, 0x08, 0x3e, 0x08, 0x14 }, // * + { 0x08, 0x08, 0x3e, 0x08, 0x08 }, // + + { 0x00, 0x50, 0x30, 0x00, 0x00 }, // , + { 0x08, 0x08, 0x08, 0x08, 0x08 }, // - + { 0x00, 0x60, 0x60, 0x00, 0x00 }, // . + { 0x20, 0x10, 0x08, 0x04, 0x02 }, // / + { 0x3e, 0x51, 0x49, 0x45, 0x3e }, // 0 + { 0x00, 0x42, 0x7f, 0x40, 0x00 }, // 1 + { 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2 + { 0x21, 0x41, 0x45, 0x4b, 0x31 }, // 3 + { 0x18, 0x14, 0x12, 0x7f, 0x10 }, // 4 + { 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5 + { 0x3c, 0x4a, 0x49, 0x49, 0x30 }, // 6 + { 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7 + { 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8 + { 0x06, 0x49, 0x49, 0x29, 0x1e }, // 9 + { 0x00, 0x36, 0x36, 0x00, 0x00 }, // : + { 0x00, 0x56, 0x36, 0x00, 0x00 }, // ; + { 0x08, 0x14, 0x22, 0x41, 0x00 }, // < + { 0x14, 0x14, 0x14, 0x14, 0x14 }, // = + { 0x00, 0x41, 0x22, 0x14, 0x08 }, // > + { 0x02, 0x01, 0x51, 0x09, 0x06 }, // ? + { 0x32, 0x49, 0x79, 0x41, 0x3e }, // @ + { 0x7e, 0x11, 0x11, 0x11, 0x7e }, // A + { 0x7f, 0x49, 0x49, 0x49, 0x36 }, // B + { 0x3e, 0x41, 0x41, 0x41, 0x22 }, // C + { 0x7f, 0x41, 0x41, 0x22, 0x1c }, // D + { 0x7f, 0x49, 0x49, 0x49, 0x41 }, // E + { 0x7f, 0x09, 0x09, 0x09, 0x01 }, // F + { 0x3e, 0x41, 0x49, 0x49, 0x7a }, // G + { 0x7f, 0x08, 0x08, 0x08, 0x7f }, // H + { 0x00, 0x41, 0x7f, 0x41, 0x00 }, // I + { 0x20, 0x40, 0x41, 0x3f, 0x01 }, // J + { 0x7f, 0x08, 0x14, 0x22, 0x41 }, // K + { 0x7f, 0x40, 0x40, 0x40, 0x40 }, // L + { 0x7f, 0x02, 0x0c, 0x02, 0x7f }, // M + { 0x7f, 0x04, 0x08, 0x10, 0x7f }, // N + { 0x3e, 0x41, 0x41, 0x41, 0x3e }, // O + { 0x7f, 0x09, 0x09, 0x09, 0x06 }, // P + { 0x3e, 0x41, 0x51, 0x21, 0x5e }, // Q + { 0x7f, 0x09, 0x19, 0x29, 0x46 }, // R + { 0x46, 0x49, 0x49, 0x49, 0x31 }, // S + { 0x01, 0x01, 0x7f, 0x01, 0x01 }, // T + { 0x3f, 0x40, 0x40, 0x40, 0x3f }, // U + { 0x1f, 0x20, 0x40, 0x20, 0x1f }, // V + { 0x3f, 0x40, 0x38, 0x40, 0x3f }, // W + { 0x63, 0x14, 0x08, 0x14, 0x63 }, // X + { 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y + { 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z + { 0x00, 0x7f, 0x41, 0x41, 0x00 }, // [ + { 0x02, 0x04, 0x08, 0x10, 0x20 }, // "\" + { 0x00, 0x41, 0x41, 0x7f, 0x00 }, // ] + { 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^ + { 0x40, 0x40, 0x40, 0x40, 0x40 }, // _ + { 0x00, 0x01, 0x02, 0x04, 0x00 }, // ` + { 0x20, 0x54, 0x54, 0x54, 0x78 }, // a + { 0x7f, 0x48, 0x44, 0x44, 0x38 }, // b + { 0x38, 0x44, 0x44, 0x44, 0x20 }, // c + { 0x38, 0x44, 0x44, 0x48, 0x7f }, // d + { 0x38, 0x54, 0x54, 0x54, 0x18 }, // e + { 0x08, 0x7e, 0x09, 0x01, 0x02 }, // f + { 0x0c, 0x52, 0x52, 0x52, 0x3e }, // g + { 0x7f, 0x08, 0x04, 0x04, 0x78 }, // h + { 0x00, 0x44, 0x7d, 0x40, 0x00 }, // i + { 0x20, 0x40, 0x44, 0x3d, 0x00 }, // j + { 0x7f, 0x10, 0x28, 0x44, 0x00 }, // k + { 0x00, 0x41, 0x7f, 0x40, 0x00 }, // l + { 0x7c, 0x04, 0x18, 0x04, 0x78 }, // m + { 0x7c, 0x08, 0x04, 0x04, 0x78 }, // n + { 0x38, 0x44, 0x44, 0x44, 0x38 }, // o + { 0x7c, 0x14, 0x14, 0x14, 0x08 }, // p + { 0x08, 0x14, 0x14, 0x18, 0x7c }, // q + { 0x7c, 0x08, 0x04, 0x04, 0x08 }, // r + { 0x48, 0x54, 0x54, 0x54, 0x20 }, // s + { 0x04, 0x3f, 0x44, 0x40, 0x20 }, // t + { 0x3c, 0x40, 0x40, 0x20, 0x7c }, // u + { 0x1c, 0x20, 0x40, 0x20, 0x1c }, // v + { 0x3c, 0x40, 0x30, 0x40, 0x3c }, // w + { 0x44, 0x28, 0x10, 0x28, 0x44 }, // x + { 0x0c, 0x50, 0x50, 0x50, 0x3c }, // y + { 0x44, 0x64, 0x54, 0x4c, 0x44 }, // z + { 0x00, 0x08, 0x36, 0x41, 0x00 }, // { + { 0x00, 0x00, 0x7f, 0x00, 0x00 }, // | + { 0x00, 0x41, 0x36, 0x08, 0x00 }, // } + { 0x02, 0x01, 0x02, 0x04, 0x02 }, // ~ + { 0x02, 0x01, 0x02, 0x04, 0x02 }, // ~ +}; + +//***************************************************************************** +// +// The sequence of commands used to initialize the SSD0303 controller. Each +// command is described as follows: there is a byte specifying the number of +// bytes in the command sequence, followed by that many bytes of command data. +// Note: This initialization sequence is derived from OSRAM App Note AN018. +// +//***************************************************************************** +static const unsigned char g_pucOSRAM128x64x4Init[] = +{ + // + // Column Address + // + 4, 0x15, 0, 63, 0xe3, + + // + // Row Address + // + 4, 0x75, 0, 63, 0xe3, + + // + // Contrast Control + // + 3, 0x81, 50, 0xe3, + + // + // Half Current Range + // + 2, 0x85, 0xe3, + + // + // Display Re-map + // + 3, 0xA0, OSRAM_INIT_REMAP, 0xe3, + + // + // Display Start Line + // + 3, 0xA1, 0, 0xe3, + + // + // Display Offset + // + 3, 0xA2, OSRAM_INIT_OFFSET, 0xe3, + + // + // Display Mode Normal + // + 2, 0xA4, 0xe3, + + // + // Multiplex Ratio + // + 3, 0xA8, 63, 0xe3, + + // + // Phase Length + // + 3, 0xB1, 0x22, 0xe3, + + // + // Row Period + // + 3, 0xB2, 70, 0xe3, + + // + // Display Clock Divide + // + 3, 0xB3, 0xF1, 0xe3, + + // + // VSL + // + 3, 0xBF, 0x0D, 0xe3, + + // + // VCOMH + // + 3, 0xBE, 0x02, 0xe3, + + // + // VP + // + 3, 0xBC, 0x10, 0xe3, + + // + // Gamma + // + 10, 0xB8, 0x01, 0x11, 0x22, 0x32, 0x43, 0x54, 0x65, 0x76, 0xe3, + + // + // Set DC-DC + 3, 0xAD, 0x03, 0xe3, + + // + // Display ON/OFF + // + 2, 0xAF, 0xe3, +}; + +//***************************************************************************** +// +//! \internal +//! +//! Write a sequence of command bytes to the SSD0323 controller. +//! +//! The data is written in a polled fashion; this function will not return +//! until the entire byte sequence has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +OSRAMWriteCommand(const unsigned char *pucBuffer, unsigned long ulCount) +{ + unsigned long ulTemp; + + // + // Return iff SSI port is not enabled for OSRAM. + // + if(!g_bSSIEnabled) + { + return; + } + + // + // Clear the command/control bit to enable command mode. + // + GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_7, 0); + + // + // Loop while there are more bytes left to be transferred. + // + while(ulCount != 0) + { + // + // Write the next byte to the controller. + // + SSIDataPut(SSI0_BASE, *pucBuffer++); + + // + // Dummy read to drain the fifo and time the GPIO signal. + // + SSIDataGet(SSI0_BASE, &ulTemp); + + // + // Decrement the BYTE counter. + // + ulCount--; + } +} + +//***************************************************************************** +// +//! \internal +//! +//! Write a sequence of data bytes to the SSD0323 controller. +//! +//! The data is written in a polled fashion; this function will not return +//! until the entire byte sequence has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +OSRAMWriteData(const unsigned char *pucBuffer, unsigned long ulCount) +{ + unsigned long ulTemp; + + // + // Return iff SSI port is not enabled for OSRAM. + // + if(!g_bSSIEnabled) + { + return; + } + + // + // Set the command/control bit to enable data mode. + // + GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_PIN_7); + + // + // Loop while there are more bytes left to be transferred. + // + while(ulCount != 0) + { + // + // Write the next byte to the controller. + // + SSIDataPut(SSI0_BASE, *pucBuffer++); + + // + // Dummy read to drain the fifo and time the GPIO signal. + // + SSIDataGet(SSI0_BASE, &ulTemp); + + // + // Decrement the BYTE counter. + // + ulCount--; + } +} + +//***************************************************************************** +// +//! Clears the OLED display. +//! +//! This function will clear the display RAM. All pixels in the display will +//! be turned off. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Clear(void) +{ + static const unsigned char pucCommand1[] = { 0x15, 0, 63 }; + static const unsigned char pucCommand2[] = { 0x75, 0, 79 }; + unsigned long ulRow, ulColumn; + static unsigned char pucZeroBuffer[8] = { 0, 0, 0, 0, 0, 0, 0, 0}; + + // + // Set the window to fill the entire display. + // + OSRAMWriteCommand(pucCommand1, sizeof(pucCommand1)); + OSRAMWriteCommand(pucCommand2, sizeof(pucCommand2)); + OSRAMWriteCommand(g_pucOSRAM128x64x4VerticalInc, + sizeof(g_pucOSRAM128x64x4VerticalInc)); + + // + // In vertical address increment mode, loop through each column, filling + // each row with 0. + // + for(ulColumn = 0; ulColumn < (128/2); ulColumn++) + { + // + // 8 rows (bytes) per row of text. + // + for(ulRow = 0; ulRow < 80; ulRow += 8) + { + OSRAMWriteData(pucZeroBuffer, sizeof(pucZeroBuffer)); + } + } +} + +//***************************************************************************** +// +//! Displays a string on the OLED display. +//! +//! \param pcStr is a pointer to the string to display. +//! \param ulX is the horizontal position to display the string, specified in +//! columns from the left edge of the display. +//! \param ulY is the vertical position to display the string, specified in +//! rows from the top edge of the display. +//! \param ucLevel is the 4-bit grey scale value to be used for displayed text. +//! +//! This function will draw a string on the display. Only the ASCII characters +//! between 32 (space) and 126 (tilde) are supported; other characters will +//! result in random data being draw on the display (based on whatever appears +//! before/after the font in memory). The font is mono-spaced, so characters +//! such as "i" and "l" have more white space around them than characters such +//! as "m" or "w". +//! +//! If the drawing of the string reaches the right edge of the display, no more +//! characters will be drawn. Therefore, special care is not required to avoid +//! supplying a string that is "too long" to display. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \note Because the OLED display packs 2 pixels of data in a single byte, the +//! parameter \e ulX must be an even column number (e.g. 0, 2, 4, etc). +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4StringDraw(const char *pcStr, unsigned long ulX, + unsigned long ulY, unsigned char ucLevel) +{ + static unsigned char pucBuffer[8]; + unsigned long ulIdx1, ulIdx2; + unsigned char ucTemp; + + // + // Check the arguments. + // + ASSERT(ulX < 128); + ASSERT((ulX & 1) == 0); + ASSERT(ulY < 64); + ASSERT(ucLevel < 16); + + // + // Setup a window starting at the specified column and row, ending + // at the right edge of the display and 8 rows down (single character row). + // + pucBuffer[0] = 0x15; + pucBuffer[1] = ulX / 2; + pucBuffer[2] = 63; + OSRAMWriteCommand(pucBuffer, 3); + pucBuffer[0] = 0x75; + pucBuffer[1] = ulY; + pucBuffer[2] = ulY + 7; + OSRAMWriteCommand(pucBuffer, 3); + OSRAMWriteCommand(g_pucOSRAM128x64x4VerticalInc, + sizeof(g_pucOSRAM128x64x4VerticalInc)); + + // + // Loop while there are more characters in the string. + // + while(*pcStr != 0) + { + // + // Get a working copy of the current character and convert to an + // index into the character bit-map array. + // + ucTemp = *pcStr; + ucTemp &= 0x7F; + if(ucTemp < ' ') + { + ucTemp = ' '; + } + else + { + ucTemp -= ' '; + } + + // + // Build and display the character buffer. + // + for(ulIdx1 = 0; ulIdx1 < 3; ulIdx1++) + { + // + // Convert two columns of 1-bit font data into a single data + // byte column of 4-bit font data. + // + for(ulIdx2 = 0; ulIdx2 < 8; ulIdx2++) + { + pucBuffer[ulIdx2] = 0; + if(g_pucFont[ucTemp][ulIdx1*2] & (1 << ulIdx2)) + { + pucBuffer[ulIdx2] = ((ucLevel << 4) & 0xf0); + } + if((ulIdx1 < 2) && + (g_pucFont[ucTemp][ulIdx1*2+1] & (1 << ulIdx2))) + { + pucBuffer[ulIdx2] |= ((ucLevel << 0) & 0x0f); + } + } + + // + // If there is room, dump the single data byte column to the + // display. Otherwise, bail out. + // + if(ulX < 126) + { + OSRAMWriteData(pucBuffer, 8); + ulX += 2; + } + else + { + return; + } + } + + // + // Advance to the next character. + // + pcStr++; + } +} + +//***************************************************************************** +// +//! Displays an image on the OLED display. +//! +//! \param pucImage is a pointer to the image data. +//! \param ulX is the horizontal position to display this image, specified in +//! columns from the left edge of the display. +//! \param ulY is the vertical position to display this image, specified in +//! rows from the top of the display. +//! \param ulWidth is the width of the image, specified in columns. +//! \param ulHeight is the height of the image, specified in rows. +//! +//! This function will display a bitmap graphic on the display. Because of the +//! format of the display RAM, the starting column (/e ulX) and the number of +//! columns (/e ulWidth) must be an integer multiple of two. +//! +//! The image data is organized with the first row of image data appearing left +//! to right, followed immediately by the second row of image data. Each byte +//! contains the data for two columns in the current row, with the leftmost +//! column being contained in bits 7:4 and the rightmost column being contained +//! in bits 3:0. +//! +//! For example, an image six columns wide and seven scan lines tall would +//! be arranged as follows (showing how the twenty one bytes of the image would +//! appear on the display): +//! +//! \verbatim +//! +-------------------+-------------------+-------------------+ +//! | Byte 0 | Byte 1 | Byte 2 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 3 | Byte 4 | Byte 5 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 6 | Byte 7 | Byte 8 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 9 | Byte 10 | Byte 11 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 12 | Byte 13 | Byte 14 | +//! +---------+---------+---------+--3------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 15 | Byte 16 | Byte 17 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 18 | Byte 19 | Byte 20 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! \endverbatim +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by` +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4ImageDraw(const unsigned char *pucImage, unsigned long ulX, + unsigned long ulY, unsigned long ulWidth, + unsigned long ulHeight) +{ + static unsigned char pucBuffer[8]; + + // + // Check the arguments. + // + ASSERT(ulX < 128); + ASSERT((ulX & 1) == 0); + ASSERT(ulY < 64); + ASSERT((ulX + ulWidth) <= 128); + ASSERT((ulY + ulHeight) <= 64); + ASSERT((ulWidth & 1) == 0); + + // + // Setup a window starting at the specified column and row, and ending + // at the column + width and row+height. + // + pucBuffer[0] = 0x15; + pucBuffer[1] = ulX / 2; + pucBuffer[2] = (ulX + ulWidth - 2) / 2; + OSRAMWriteCommand(pucBuffer, 3); + pucBuffer[0] = 0x75; + pucBuffer[1] = ulY; + pucBuffer[2] = ulY + ulHeight - 1; + OSRAMWriteCommand(pucBuffer, 3); + OSRAMWriteCommand(g_pucOSRAM128x64x4HorizontalInc, + sizeof(g_pucOSRAM128x64x4HorizontalInc)); + + // + // Loop while there are more rows to display. + // + while(ulHeight--) + { + // + // Write this row of image data. + // + OSRAMWriteData(pucImage, (ulWidth / 2)); + + // + // Advance to the next row of the image. + // + pucImage += (ulWidth / 2); + } +} + +//***************************************************************************** +// +//! Enable the SSI component of the OLED display driver. +//! +//! \param ulFrequency specifies the SSI Clock Frequency to be used. +//! +//! This function initializes the SSI interface to the OLED display. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Enable(unsigned long ulFrequency) +{ + unsigned long ulTemp; + + // + // Disable the SSI port. + // + SSIDisable(SSI0_BASE); + + // + // Configure the SSI0 port for master mode. + // + SSIConfig(SSI0_BASE, SSI_FRF_MOTO_MODE_2, SSI_MODE_MASTER, ulFrequency, 8); + + // + // (Re)Enable SSI control of the FSS pin. + // + GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_3); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + + // + // Enable the SSI port. + // + SSIEnable(SSI0_BASE); + + // + // Drain the receive fifo. + // + while(SSIDataNonBlockingGet(SSI0_BASE, &ulTemp) != 0) + { + } + + // + // Indicate that the OSRAM driver can use the SSI Port. + // + g_bSSIEnabled = true; +} + +//***************************************************************************** +// +//! Enable the SSI component of the OLED display driver. +//! +//! \param ulFrequency specifies the SSI Clock Frequency to be used. +//! +//! This function initializes the SSI interface to the OLED display. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Disable(void) +{ + unsigned long ulTemp; + + // + // Indicate that the OSRAM driver can no longer use the SSI Port. + // + g_bSSIEnabled = false; + + // + // Drain the receive fifo. + // + while(SSIDataNonBlockingGet(SSI0_BASE, &ulTemp) != 0) + { + } + + // + // Disable the SSI port. + // + SSIDisable(SSI0_BASE); + + // + // Disable SSI control of the FSS pin. + // + GPIODirModeSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_DIR_MODE_OUT); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_PIN_3); + +} + +//***************************************************************************** +// +//! Initialize the OLED display. +//! +//! \param ulFrequency specifies the SSI Clock Frequency to be used. +//! +//! This function initializes the SSI interface to the OLED display and +//! configures the SSD0323 controller on the panel. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Init(unsigned long ulFrequency) +{ + unsigned long ulIdx; + + // + // Enable the SSI0 and GPIO port blocks as they are needed by this driver. + // + SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); + + // + // Configure the SSI0CLK and SSIOTX pins for SSI operation. + // + GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_5); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_2, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_5, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + + // + // Configure the PC7 pin as a D/Cn signal for OLED device. + // + GPIODirModeSet(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_DIR_MODE_OUT); + GPIOPadConfigSet(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD); + GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_PIN_7); + + // + // Configure and enable the SSI0 port for master mode. + // + OSRAM128x64x4Enable(ulFrequency); + + // + // Clear the frame buffer. + // + OSRAM128x64x4Clear(); + + // + // Initialize the SSD0323 controller. Loop through the initialization + // sequence array, sending each command "string" to the controller. + // + for(ulIdx = 0; ulIdx < sizeof(g_pucOSRAM128x64x4Init); + ulIdx += g_pucOSRAM128x64x4Init[ulIdx] + 1) + { + // + // Send this command. + // + OSRAMWriteCommand(g_pucOSRAM128x64x4Init + ulIdx + 1, + g_pucOSRAM128x64x4Init[ulIdx] - 1); + } +} + +//***************************************************************************** +// +//! Turns on the OLED display. +//! +//! This function will turn on the OLED display, causing it to display the +//! contents of its internal frame buffer. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4DisplayOn(void) +{ + unsigned long ulIdx; + + // + // Initialize the SSD0323 controller. Loop through the initialization + // sequence array, sending each command "string" to the controller. + // + for(ulIdx = 0; ulIdx < sizeof(g_pucOSRAM128x64x4Init); + ulIdx += g_pucOSRAM128x64x4Init[ulIdx] + 1) + { + // + // Send this command. + // + OSRAMWriteCommand(g_pucOSRAM128x64x4Init + ulIdx + 1, + g_pucOSRAM128x64x4Init[ulIdx] - 1); + } +} + +//***************************************************************************** +// +//! Turns off the OLED display. +//! +//! This function will turn off the OLED display. This will stop the scanning +//! of the panel and turn off the on-chip DC-DC converter, preventing damage to +//! the panel due to burn-in (it has similar characters to a CRT in this +//! respect). +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4DisplayOff(void) +{ + static const unsigned char pucCommand1[] = + { + 0xAE, 0xAD, 0x02 + }; + + // + // Turn off the DC-DC converter and the display. + // + OSRAMWriteCommand(pucCommand1, sizeof(pucCommand1)); +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/osram128x64x4.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/osram128x64x4.h new file mode 100644 index 000000000..2ba7cb956 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/osram128x64x4.h @@ -0,0 +1,63 @@ +//***************************************************************************** +// +// osram128x64x4.h - Prototypes for the driver for the OSRAM 128x64x4 graphical +// OLED display. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __OSRAM128X64X4_H__ +#define __OSRAM128X64X4_H__ + +//***************************************************************************** +// +// Prototypes for the driver APIs. +// +//***************************************************************************** +extern void OSRAM128x64x4Clear(void); +extern void OSRAM128x64x4StringDraw(const char *pcStr, + unsigned long ulX, + unsigned long ulY, + unsigned char ucLevel); +extern void OSRAM128x64x4ImageDraw(const unsigned char *pucImage, + unsigned long ulX, + unsigned long ulY, + unsigned long ulWidth, + unsigned long ulHeight); +extern void OSRAM128x64x4Init(unsigned long ulFrequency); +extern void OSRAM128x64x4Enable(unsigned long ulFrequency); +extern void OSRAM128x64x4Disable(void); +extern void OSRAM128x64x4DisplayOn(void); +extern void OSRAM128x64x4DisplayOff(void); + +//***************************************************************************** +// +// The following macro(s) map old names for the OSRAM functions to the new +// names. In new code, the new names should be used in favor of the old names. +// +//***************************************************************************** +#ifndef DEPRECATED +#define OSRAM128x64x1InitSSI OSRAM128x64x4Enable +#endif + +#endif // __OSRAM128X64X4_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/pwm.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/pwm.h new file mode 100644 index 000000000..bb67fda19 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/pwm.h @@ -0,0 +1,161 @@ +//***************************************************************************** +// +// pwm.h - API function protoypes for Pulse Width Modulation (PWM) ports +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __PWM_H__ +#define __PWM_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following defines are passed to PWMGenConfigure() as the ulConfig +// parameter and specify the configuration of the PWM generator. +// +//***************************************************************************** +#define PWM_GEN_MODE_DOWN 0x00000000 // Down count mode +#define PWM_GEN_MODE_UP_DOWN 0x00000002 // Up/Down count mode +#define PWM_GEN_MODE_SYNC 0x00000038 // Synchronous updates +#define PWM_GEN_MODE_NO_SYNC 0x00000000 // Immediate updates +#define PWM_GEN_MODE_DBG_RUN 0x00000004 // Continue running in debug mode +#define PWM_GEN_MODE_DBG_STOP 0x00000000 // Stop running in debug mode + +//***************************************************************************** +// +// Defines for enabling, disabling, and clearing PWM generator interrupts and +// triggers. +// +//***************************************************************************** +#define PWM_INT_CNT_ZERO 0x00000001 // Int if COUNT = 0 +#define PWM_INT_CNT_LOAD 0x00000002 // Int if COUNT = LOAD +#define PWM_INT_CNT_AU 0x00000004 // Int if COUNT = CMPA U +#define PWM_INT_CNT_AD 0x00000008 // Int if COUNT = CMPA D +#define PWM_INT_CNT_BU 0x00000010 // Int if COUNT = CMPA U +#define PWM_INT_CNT_BD 0x00000020 // Int if COUNT = CMPA D +#define PWM_TR_CNT_ZERO 0x00000100 // Trig if COUNT = 0 +#define PWM_TR_CNT_LOAD 0x00000200 // Trig if COUNT = LOAD +#define PWM_TR_CNT_AU 0x00000400 // Trig if COUNT = CMPA U +#define PWM_TR_CNT_AD 0x00000800 // Trig if COUNT = CMPA D +#define PWM_TR_CNT_BU 0x00001000 // Trig if COUNT = CMPA U +#define PWM_TR_CNT_BD 0x00002000 // Trig if COUNT = CMPA D + +//***************************************************************************** +// +// Defines for enabling, disabling, and clearing PWM interrupts. +// +//***************************************************************************** +#define PWM_INT_GEN_0 0x00000001 // Generator 0 interrupt +#define PWM_INT_GEN_1 0x00000002 // Generator 1 interrupt +#define PWM_INT_GEN_2 0x00000004 // Generator 2 interrupt +#define PWM_INT_FAULT 0x00010000 // Fault interrupt + +//***************************************************************************** +// +// Defines to identify the generators within a module. +// +//***************************************************************************** +#define PWM_GEN_0 0x00000040 // Offset address of Gen0 +#define PWM_GEN_1 0x00000080 // Offset address of Gen1 +#define PWM_GEN_2 0x000000C0 // Offset address of Gen2 + +#define PWM_GEN_0_BIT 0x00000001 // Bit-wise ID for Gen0 +#define PWM_GEN_1_BIT 0x00000002 // Bit-wise ID for Gen1 +#define PWM_GEN_2_BIT 0x00000004 // Bit-wise ID for Gen2 + +//***************************************************************************** +// +// Defines to identify the outputs within a module. +// +//***************************************************************************** +#define PWM_OUT_0 0x00000040 // Encoded offset address of PWM0 +#define PWM_OUT_1 0x00000041 // Encoded offset address of PWM1 +#define PWM_OUT_2 0x00000082 // Encoded offset address of PWM2 +#define PWM_OUT_3 0x00000083 // Encoded offset address of PWM3 +#define PWM_OUT_4 0x000000C4 // Encoded offset address of PWM4 +#define PWM_OUT_5 0x000000C5 // Encoded offset address of PWM5 + +#define PWM_OUT_0_BIT 0x00000001 // Bit-wise ID for PWM0 +#define PWM_OUT_1_BIT 0x00000002 // Bit-wise ID for PWM1 +#define PWM_OUT_2_BIT 0x00000004 // Bit-wise ID for PWM2 +#define PWM_OUT_3_BIT 0x00000008 // Bit-wise ID for PWM3 +#define PWM_OUT_4_BIT 0x00000010 // Bit-wise ID for PWM4 +#define PWM_OUT_5_BIT 0x00000020 // Bit-wise ID for PWM5 + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void PWMGenConfigure(unsigned long ulBase, unsigned long ulGen, + unsigned long ulConfig); +extern void PWMGenPeriodSet(unsigned long ulBase, unsigned long ulGen, + unsigned long ulPeriod); +extern unsigned long PWMGenPeriodGet(unsigned long ulBase, + unsigned long ulGen); +extern void PWMGenEnable(unsigned long ulBase, unsigned long ulGen); +extern void PWMGenDisable(unsigned long ulBase, unsigned long ulGen); +extern void PWMPulseWidthSet(unsigned long ulBase, unsigned long ulPWMOut, + unsigned long ulWidth); +extern unsigned long PWMPulseWidthGet(unsigned long ulBase, + unsigned long ulPWMOut); +extern void PWMDeadBandEnable(unsigned long ulBase, unsigned long ulGen, + unsigned short usRise, unsigned short usFall); +extern void PWMDeadBandDisable(unsigned long ulBase, unsigned long ulGen); +extern void PWMSyncUpdate(unsigned long ulBase, unsigned long ulGenBits); +extern void PWMSyncTimeBase(unsigned long ulBase, unsigned long ulGenBits); +extern void PWMOutputState(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bEnable); +extern void PWMOutputInvert(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bInvert); +extern void PWMOutputFault(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bFaultKill); +extern void PWMGenIntRegister(unsigned long ulBase, unsigned long ulGen, + void (*pfnIntHandler)(void)); +extern void PWMGenIntUnregister(unsigned long ulBase, unsigned long ulGen); +extern void PWMFaultIntRegister(unsigned long ulBase, + void (*pfnIntHandler)(void)); +extern void PWMFaultIntUnregister(unsigned long ulBase); +extern void PWMGenIntTrigEnable(unsigned long ulBase, unsigned long ulGen, + unsigned long ulIntTrig); +extern void PWMGenIntTrigDisable(unsigned long ulBase, unsigned long ulGen, + unsigned long ulIntTrig); +extern unsigned long PWMGenIntStatus(unsigned long ulBase, unsigned long ulGen, + tBoolean bMasked); +extern void PWMGenIntClear(unsigned long ulBase, unsigned long ulGen, + unsigned long ulInts); +extern void PWMIntEnable(unsigned long ulBase, unsigned long ulGenFault); +extern void PWMIntDisable(unsigned long ulBase, unsigned long ulGenFault); +extern void PWMFaultIntClear(unsigned long ulBase); +extern unsigned long PWMIntStatus(unsigned long ulBase, tBoolean bMasked); + +#ifdef __cplusplus +} +#endif + +#endif // __PWM_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/qei.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/qei.h new file mode 100644 index 000000000..89d5b20bc --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/qei.h @@ -0,0 +1,104 @@ +//***************************************************************************** +// +// qei.h - Prototypes for the Quadrature Encoder Driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __QEI_H__ +#define __QEI_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to QEIConfigure as the ulConfig paramater. +// +//***************************************************************************** +#define QEI_CONFIG_CAPTURE_A 0x00000000 // Count on ChA edges only +#define QEI_CONFIG_CAPTURE_A_B 0x00000008 // Count on ChA and ChB edges +#define QEI_CONFIG_NO_RESET 0x00000000 // Do not reset on index pulse +#define QEI_CONFIG_RESET_IDX 0x00000010 // Reset position on index pulse +#define QEI_CONFIG_QUADRATURE 0x00000000 // ChA and ChB are quadrature +#define QEI_CONFIG_CLOCK_DIR 0x00000004 // ChA and ChB are clock and dir +#define QEI_CONFIG_NO_SWAP 0x00000000 // Do not swap ChA and ChB +#define QEI_CONFIG_SWAP 0x00000002 // Swap ChA and ChB + +//***************************************************************************** +// +// Values that can be passed to QEIVelocityConfigure as the ulPreDiv parameter. +// +//***************************************************************************** +#define QEI_VELDIV_1 0x00000000 // Predivide by 1 +#define QEI_VELDIV_2 0x00000040 // Predivide by 2 +#define QEI_VELDIV_4 0x00000080 // Predivide by 4 +#define QEI_VELDIV_8 0x000000C0 // Predivide by 8 +#define QEI_VELDIV_16 0x00000100 // Predivide by 16 +#define QEI_VELDIV_32 0x00000140 // Predivide by 32 +#define QEI_VELDIV_64 0x00000180 // Predivide by 64 +#define QEI_VELDIV_128 0x000001C0 // Predivide by 128 + +//***************************************************************************** +// +// Values that can be passed to QEIEnableInts, QEIDisableInts, and QEIClearInts +// as the ulIntFlags parameter, and returned by QEIGetIntStatus. +// +//***************************************************************************** +#define QEI_INTERROR 0x00000008 // Phase error detected +#define QEI_INTDIR 0x00000004 // Direction change +#define QEI_INTTIMER 0x00000002 // Velocity timer expired +#define QEI_INTINDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void QEIEnable(unsigned long ulBase); +extern void QEIDisable(unsigned long ulBase); +extern void QEIConfigure(unsigned long ulBase, unsigned long ulConfig, + unsigned long ulMaxPosition); +extern unsigned long QEIPositionGet(unsigned long ulBase); +extern void QEIPositionSet(unsigned long ulBase, unsigned long ulPosition); +extern long QEIDirectionGet(unsigned long ulBase); +extern tBoolean QEIErrorGet(unsigned long ulBase); +extern void QEIVelocityEnable(unsigned long ulBase); +extern void QEIVelocityDisable(unsigned long ulBase); +extern void QEIVelocityConfigure(unsigned long ulBase, unsigned long ulPreDiv, + unsigned long ulPeriod); +extern unsigned long QEIVelocityGet(unsigned long ulBase); +extern void QEIIntRegister(unsigned long ulBase, void (*pfnHandler)(void)); +extern void QEIIntUnregister(unsigned long ulBase); +extern void QEIIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void QEIIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long QEIIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void QEIIntClear(unsigned long ulBase, unsigned long ulIntFlags); + +#ifdef __cplusplus +} +#endif + +#endif // __QEI_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/ssi.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/ssi.h new file mode 100644 index 000000000..227b6bd9b --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/ssi.h @@ -0,0 +1,89 @@ +//***************************************************************************** +// +// ssi.h - Prototypes for the Synchronous Serial Interface Driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __SSI_H__ +#define __SSI_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to SSIIntEnable, SSIIntDisable, and SSIIntClear +// as the ulIntFlags parameter, and returned by SSIIntStatus. +// +//***************************************************************************** +#define SSI_TXFF 0x00000008 // TX FIFO half empty or less +#define SSI_RXFF 0x00000004 // RX FIFO half full or less +#define SSI_RXTO 0x00000002 // RX timeout +#define SSI_RXOR 0x00000001 // RX overrun + +//***************************************************************************** +// +// Values that can be passed to SSIConfig. +// +//***************************************************************************** +#define SSI_FRF_MOTO_MODE_0 0x00000000 // Moto fmt, polarity 0, phase 0 +#define SSI_FRF_MOTO_MODE_1 0x00000002 // Moto fmt, polarity 0, phase 1 +#define SSI_FRF_MOTO_MODE_2 0x00000001 // Moto fmt, polarity 1, phase 0 +#define SSI_FRF_MOTO_MODE_3 0x00000003 // Moto fmt, polarity 1, phase 1 +#define SSI_FRF_TI 0x00000010 // TI frame format +#define SSI_FRF_NMW 0x00000020 // National MicroWire frame format + +#define SSI_MODE_MASTER 0x00000000 // SSI master +#define SSI_MODE_SLAVE 0x00000001 // SSI slave +#define SSI_MODE_SLAVE_OD 0x00000002 // SSI slave with output disabled + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void SSIConfig(unsigned long ulBase, unsigned long ulProtocol, + unsigned long ulMode, unsigned long ulBitRate, + unsigned long ulDataWidth); +extern void SSIDataGet(unsigned long ulBase, unsigned long *pulData); +extern long SSIDataNonBlockingGet(unsigned long ulBase, + unsigned long *pulData); +extern void SSIDataPut(unsigned long ulBase, unsigned long ulData); +extern long SSIDataNonBlockingPut(unsigned long ulBase, unsigned long ulData); +extern void SSIDisable(unsigned long ulBase); +extern void SSIEnable(unsigned long ulBase); +extern void SSIIntClear(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntRegister(unsigned long ulBase, void(*pfnHandler)(void)); +extern unsigned long SSIIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void SSIIntUnregister(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __SSI_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/sysctl.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/sysctl.h new file mode 100644 index 000000000..d2efbca0d --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/sysctl.h @@ -0,0 +1,301 @@ +//***************************************************************************** +// +// sysctl.h - Prototypes for the system control driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __SYSCTL_H__ +#define __SYSCTL_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following are values that can be passed to the +// SysCtlPeripheralPresent(), SysCtlPeripheralEnable(), +// SysCtlPeripheralDisable(), and SysCtlPeripheralReset() APIs as the +// ulPeripheral parameter. The peripherals in the fourth group (upper nibble +// is 3) can only be used with the SysCtlPeripheralPresent() API. +// +//***************************************************************************** +#define SYSCTL_PERIPH_PWM 0x00100010 // PWM +#define SYSCTL_PERIPH_ADC 0x00100001 // ADC +#define SYSCTL_PERIPH_HIBERNATE 0x00000040 // Hibernation module +#define SYSCTL_PERIPH_WDOG 0x00000008 // Watchdog +#define SYSCTL_PERIPH_CAN0 0x00100100 // CAN 0 +#define SYSCTL_PERIPH_CAN1 0x00100200 // CAN 1 +#define SYSCTL_PERIPH_UART0 0x10000001 // UART 0 +#define SYSCTL_PERIPH_UART1 0x10000002 // UART 1 +#define SYSCTL_PERIPH_UART2 0x10000004 // UART 2 +#define SYSCTL_PERIPH_SSI 0x10000010 // SSI +#define SYSCTL_PERIPH_SSI0 0x10000010 // SSI 0 +#define SYSCTL_PERIPH_SSI1 0x10000020 // SSI 1 +#define SYSCTL_PERIPH_QEI 0x10000100 // QEI +#define SYSCTL_PERIPH_QEI0 0x10000100 // QEI 0 +#define SYSCTL_PERIPH_QEI1 0x10000200 // QEI 1 +#define SYSCTL_PERIPH_I2C 0x10001000 // I2C +#define SYSCTL_PERIPH_I2C0 0x10001000 // I2C 0 +#define SYSCTL_PERIPH_I2C1 0x10004000 // I2C 1 +#define SYSCTL_PERIPH_TIMER0 0x10100001 // Timer 0 +#define SYSCTL_PERIPH_TIMER1 0x10100002 // Timer 1 +#define SYSCTL_PERIPH_TIMER2 0x10100004 // Timer 2 +#define SYSCTL_PERIPH_TIMER3 0x10100008 // Timer 3 +#define SYSCTL_PERIPH_COMP0 0x10100100 // Analog comparator 0 +#define SYSCTL_PERIPH_COMP1 0x10100200 // Analog comparator 1 +#define SYSCTL_PERIPH_COMP2 0x10100400 // Analog comparator 2 +#define SYSCTL_PERIPH_GPIOA 0x20000001 // GPIO A +#define SYSCTL_PERIPH_GPIOB 0x20000002 // GPIO B +#define SYSCTL_PERIPH_GPIOC 0x20000004 // GPIO C +#define SYSCTL_PERIPH_GPIOD 0x20000008 // GPIO D +#define SYSCTL_PERIPH_GPIOE 0x20000010 // GPIO E +#define SYSCTL_PERIPH_GPIOF 0x20000020 // GPIO F +#define SYSCTL_PERIPH_GPIOG 0x20000040 // GPIO G +#define SYSCTL_PERIPH_GPIOH 0x20000080 // GPIO H +#define SYSCTL_PERIPH_ETH 0x20105000 // ETH +#define SYSCTL_PERIPH_MPU 0x30000080 // Cortex M3 MPU +#define SYSCTL_PERIPH_TEMP 0x30000020 // Temperature sensor +#define SYSCTL_PERIPH_PLL 0x30000010 // PLL + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlPinPresent() API +// as the ulPin parameter. +// +//***************************************************************************** +#define SYSCTL_PIN_PWM0 0x00000001 // PWM0 pin +#define SYSCTL_PIN_PWM1 0x00000002 // PWM1 pin +#define SYSCTL_PIN_PWM2 0x00000004 // PWM2 pin +#define SYSCTL_PIN_PWM3 0x00000008 // PWM3 pin +#define SYSCTL_PIN_PWM4 0x00000010 // PWM4 pin +#define SYSCTL_PIN_PWM5 0x00000020 // PWM5 pin +#define SYSCTL_PIN_C0MINUS 0x00000040 // C0- pin +#define SYSCTL_PIN_C0PLUS 0x00000080 // C0+ pin +#define SYSCTL_PIN_C0O 0x00000100 // C0o pin +#define SYSCTL_PIN_C1MINUS 0x00000200 // C1- pin +#define SYSCTL_PIN_C1PLUS 0x00000400 // C1+ pin +#define SYSCTL_PIN_C1O 0x00000800 // C1o pin +#define SYSCTL_PIN_C2MINUS 0x00001000 // C2- pin +#define SYSCTL_PIN_C2PLUS 0x00002000 // C2+ pin +#define SYSCTL_PIN_C2O 0x00004000 // C2o pin +#define SYSCTL_PIN_MC_FAULT0 0x00008000 // MC0 Fault pin +#define SYSCTL_PIN_ADC0 0x00010000 // ADC0 pin +#define SYSCTL_PIN_ADC1 0x00020000 // ADC1 pin +#define SYSCTL_PIN_ADC2 0x00040000 // ADC2 pin +#define SYSCTL_PIN_ADC3 0x00080000 // ADC3 pin +#define SYSCTL_PIN_ADC4 0x00100000 // ADC4 pin +#define SYSCTL_PIN_ADC5 0x00200000 // ADC5 pin +#define SYSCTL_PIN_ADC6 0x00400000 // ADC6 pin +#define SYSCTL_PIN_ADC7 0x00800000 // ADC7 pin +#define SYSCTL_PIN_CCP0 0x01000000 // CCP0 pin +#define SYSCTL_PIN_CCP1 0x02000000 // CCP1 pin +#define SYSCTL_PIN_CCP2 0x04000000 // CCP2 pin +#define SYSCTL_PIN_CCP3 0x08000000 // CCP3 pin +#define SYSCTL_PIN_CCP4 0x10000000 // CCP4 pin +#define SYSCTL_PIN_CCP5 0x20000000 // CCP5 pin +#define SYSCTL_PIN_32KHZ 0x80000000 // 32kHz pin + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlLDOSet() API as +// the ulVoltage value, or returned by the SysCtlLDOGet() API. +// +//***************************************************************************** +#define SYSCTL_LDO_2_25V 0x00000005 // LDO output of 2.25V +#define SYSCTL_LDO_2_30V 0x00000004 // LDO output of 2.30V +#define SYSCTL_LDO_2_35V 0x00000003 // LDO output of 2.35V +#define SYSCTL_LDO_2_40V 0x00000002 // LDO output of 2.40V +#define SYSCTL_LDO_2_45V 0x00000001 // LDO output of 2.45V +#define SYSCTL_LDO_2_50V 0x00000000 // LDO output of 2.50V +#define SYSCTL_LDO_2_55V 0x0000001f // LDO output of 2.55V +#define SYSCTL_LDO_2_60V 0x0000001e // LDO output of 2.60V +#define SYSCTL_LDO_2_65V 0x0000001d // LDO output of 2.65V +#define SYSCTL_LDO_2_70V 0x0000001c // LDO output of 2.70V +#define SYSCTL_LDO_2_75V 0x0000001b // LDO output of 2.75V + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlLDOConfigSet() API. +// +//***************************************************************************** +#define SYSCTL_LDOCFG_ARST 0x00000001 // Allow LDO failure to reset +#define SYSCTL_LDOCFG_NORST 0x00000000 // Do not reset on LDO failure + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlIntEnable(), +// SysCtlIntDisable(), and SysCtlIntClear() APIs, or returned in the bit mask +// by the SysCtlIntStatus() API. +// +//***************************************************************************** +#define SYSCTL_INT_PLL_LOCK 0x00000040 // PLL lock interrupt +#define SYSCTL_INT_CUR_LIMIT 0x00000020 // Current limit interrupt +#define SYSCTL_INT_IOSC_FAIL 0x00000010 // Internal oscillator failure int +#define SYSCTL_INT_MOSC_FAIL 0x00000008 // Main oscillator failure int +#define SYSCTL_INT_POR 0x00000004 // Power on reset interrupt +#define SYSCTL_INT_BOR 0x00000002 // Brown out interrupt +#define SYSCTL_INT_PLL_FAIL 0x00000001 // PLL failure interrupt + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlResetCauseClear() +// API or returned by the SysCtlResetCauseGet() API. +// +//***************************************************************************** +#define SYSCTL_CAUSE_LDO 0x00000020 // LDO power not OK reset +#define SYSCTL_CAUSE_SW 0x00000010 // Software reset +#define SYSCTL_CAUSE_WDOG 0x00000008 // Watchdog reset +#define SYSCTL_CAUSE_BOR 0x00000004 // Brown-out reset +#define SYSCTL_CAUSE_POR 0x00000002 // Power on reset +#define SYSCTL_CAUSE_EXT 0x00000001 // External reset + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlBrownOutConfigSet() +// API as the ulConfig parameter. +// +//***************************************************************************** +#define SYSCTL_BOR_RESET 0x00000002 // Reset instead of interrupting +#define SYSCTL_BOR_RESAMPLE 0x00000001 // Resample BOR before asserting + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlPWMClockSet() API +// as the ulConfig parameter, and can be returned by the SysCtlPWMClockGet() +// API. +// +//***************************************************************************** +#define SYSCTL_PWMDIV_1 0x00000000 // PWM clock is processor clock /1 +#define SYSCTL_PWMDIV_2 0x00100000 // PWM clock is processor clock /2 +#define SYSCTL_PWMDIV_4 0x00120000 // PWM clock is processor clock /4 +#define SYSCTL_PWMDIV_8 0x00140000 // PWM clock is processor clock /8 +#define SYSCTL_PWMDIV_16 0x00160000 // PWM clock is processor clock /16 +#define SYSCTL_PWMDIV_32 0x00180000 // PWM clock is processor clock /32 +#define SYSCTL_PWMDIV_64 0x001A0000 // PWM clock is processor clock /64 + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlADCSpeedSet() API +// as the ulSpeed parameter, and can be returned by the SyCtlADCSpeedGet() +// API. +// +//***************************************************************************** +#define SYSCTL_ADCSPEED_1MSPS 0x00000300 // 1,000,000 samples per second +#define SYSCTL_ADCSPEED_500KSPS 0x00000200 // 500,000 samples per second +#define SYSCTL_ADCSPEED_250KSPS 0x00000100 // 250,000 samples per second +#define SYSCTL_ADCSPEED_125KSPS 0x00000000 // 125,000 samples per second + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlClockSet() API as +// the ulConfig parameter. +// +//***************************************************************************** +#define SYSCTL_SYSDIV_1 0x07800000 // Processor clock is osc/pll /1 +#define SYSCTL_SYSDIV_2 0x00C00000 // Processor clock is osc/pll /2 +#define SYSCTL_SYSDIV_3 0x01400000 // Processor clock is osc/pll /3 +#define SYSCTL_SYSDIV_4 0x01C00000 // Processor clock is osc/pll /4 +#define SYSCTL_SYSDIV_5 0x02400000 // Processor clock is osc/pll /5 +#define SYSCTL_SYSDIV_6 0x02C00000 // Processor clock is osc/pll /6 +#define SYSCTL_SYSDIV_7 0x03400000 // Processor clock is osc/pll /7 +#define SYSCTL_SYSDIV_8 0x03C00000 // Processor clock is osc/pll /8 +#define SYSCTL_SYSDIV_9 0x04400000 // Processor clock is osc/pll /9 +#define SYSCTL_SYSDIV_10 0x04C00000 // Processor clock is osc/pll /10 +#define SYSCTL_SYSDIV_11 0x05400000 // Processor clock is osc/pll /11 +#define SYSCTL_SYSDIV_12 0x05C00000 // Processor clock is osc/pll /12 +#define SYSCTL_SYSDIV_13 0x06400000 // Processor clock is osc/pll /13 +#define SYSCTL_SYSDIV_14 0x06C00000 // Processor clock is osc/pll /14 +#define SYSCTL_SYSDIV_15 0x07400000 // Processor clock is osc/pll /15 +#define SYSCTL_SYSDIV_16 0x07C00000 // Processor clock is osc/pll /16 +#define SYSCTL_USE_PLL 0x00000000 // System clock is the PLL clock +#define SYSCTL_USE_OSC 0x00003800 // System clock is the osc clock +#define SYSCTL_XTAL_3_57MHZ 0x00000100 // External crystal is 3.579545MHz +#define SYSCTL_XTAL_3_68MHZ 0x00000140 // External crystal is 3.6864MHz +#define SYSCTL_XTAL_4MHZ 0x00000180 // External crystal is 4MHz +#define SYSCTL_XTAL_4_09MHZ 0x000001C0 // External crystal is 4.096MHz +#define SYSCTL_XTAL_4_91MHZ 0x00000200 // External crystal is 4.9152MHz +#define SYSCTL_XTAL_5MHZ 0x00000240 // External crystal is 5MHz +#define SYSCTL_XTAL_5_12MHZ 0x00000280 // External crystal is 5.12MHz +#define SYSCTL_XTAL_6MHZ 0x000002C0 // External crystal is 6MHz +#define SYSCTL_XTAL_6_14MHZ 0x00000300 // External crystal is 6.144MHz +#define SYSCTL_XTAL_7_37MHZ 0x00000340 // External crystal is 7.3728MHz +#define SYSCTL_XTAL_8MHZ 0x00000380 // External crystal is 8MHz +#define SYSCTL_XTAL_8_19MHZ 0x000003C0 // External crystal is 8.192MHz +#define SYSCTL_OSC_MAIN 0x00000000 // Oscillator source is main osc +#define SYSCTL_OSC_INT 0x00000010 // Oscillator source is int. osc +#define SYSCTL_OSC_INT4 0x00000020 // Oscillator source is int. osc /4 +#define SYSCTL_INT_OSC_DIS 0x00000002 // Disable internal oscillator +#define SYSCTL_MAIN_OSC_DIS 0x00000001 // Disable main oscillator + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern unsigned long SysCtlSRAMSizeGet(void); +extern unsigned long SysCtlFlashSizeGet(void); +extern tBoolean SysCtlPinPresent(unsigned long ulPin); +extern tBoolean SysCtlPeripheralPresent(unsigned long ulPeripheral); +extern void SysCtlPeripheralReset(unsigned long ulPeripheral); +extern void SysCtlPeripheralEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralSleepEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralSleepDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDeepSleepEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDeepSleepDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralClockGating(tBoolean bEnable); +extern void SysCtlIntRegister(void (*pfnHandler)(void)); +extern void SysCtlIntUnregister(void); +extern void SysCtlIntEnable(unsigned long ulInts); +extern void SysCtlIntDisable(unsigned long ulInts); +extern void SysCtlIntClear(unsigned long ulInts); +extern unsigned long SysCtlIntStatus(tBoolean bMasked); +extern void SysCtlLDOSet(unsigned long ulVoltage); +extern unsigned long SysCtlLDOGet(void); +extern void SysCtlLDOConfigSet(unsigned long ulConfig); +extern void SysCtlReset(void); +extern void SysCtlSleep(void); +extern void SysCtlDeepSleep(void); +extern unsigned long SysCtlResetCauseGet(void); +extern void SysCtlResetCauseClear(unsigned long ulCauses); +extern void SysCtlBrownOutConfigSet(unsigned long ulConfig, + unsigned long ulDelay); +extern void SysCtlClockSet(unsigned long ulConfig); +extern unsigned long SysCtlClockGet(void); +extern void SysCtlPWMClockSet(unsigned long ulConfig); +extern unsigned long SysCtlPWMClockGet(void); +extern void SysCtlADCSpeedSet(unsigned long ulSpeed); +extern unsigned long SysCtlADCSpeedGet(void); +extern void SysCtlIOSCVerificationSet(tBoolean bEnable); +extern void SysCtlMOSCVerificationSet(tBoolean bEnable); +extern void SysCtlPLLVerificationSet(tBoolean bEnable); +extern void SysCtlClkVerificationClear(void); + +#ifdef __cplusplus +} +#endif + +#endif // __SYSCTL_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/systick.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/systick.h new file mode 100644 index 000000000..f89bf65b8 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/systick.h @@ -0,0 +1,55 @@ +//***************************************************************************** +// +// systick.h - Prototypes for the SysTick driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __SYSTICK_H__ +#define __SYSTICK_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void SysTickEnable(void); +extern void SysTickDisable(void); +extern void SysTickIntRegister(void (*pfnHandler)(void)); +extern void SysTickIntUnregister(void); +extern void SysTickIntEnable(void); +extern void SysTickIntDisable(void); +extern void SysTickPeriodSet(unsigned long ulPeriod); +extern unsigned long SysTickPeriodGet(void); +extern unsigned long SysTickValueGet(void); + +#ifdef __cplusplus +} +#endif + +#endif // __SYSTICK_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/uart.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/uart.h new file mode 100644 index 000000000..a0e16db33 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/uart.h @@ -0,0 +1,104 @@ +//***************************************************************************** +// +// uart.h - Defines and Macros for the UART. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __UART_H__ +#define __UART_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to UARTIntEnable, UARTIntDisable, and UARTIntClear +// as the ulIntFlags parameter, and returned from UARTIntStatus. +// +//***************************************************************************** +#define UART_INT_OE 0x400 // Overrun Error Interrupt Mask +#define UART_INT_BE 0x200 // Break Error Interrupt Mask +#define UART_INT_PE 0x100 // Parity Error Interrupt Mask +#define UART_INT_FE 0x080 // Framing Error Interrupt Mask +#define UART_INT_RT 0x040 // Receive Timeout Interrupt Mask +#define UART_INT_TX 0x020 // Transmit Interrupt Mask +#define UART_INT_RX 0x010 // Receive Interrupt Mask + +//***************************************************************************** +// +// Values that can be passed to UARTConfigSet as the ulConfig parameter and +// returned by UARTConfigGet in the pulConfig parameter. Additionally, the +// UART_CONFIG_PAR_* subset can be passed to UARTParityModeSet as the ulParity +// parameter, and are returned by UARTParityModeGet. +// +//***************************************************************************** +#define UART_CONFIG_WLEN_8 0x00000060 // 8 bit data +#define UART_CONFIG_WLEN_7 0x00000040 // 7 bit data +#define UART_CONFIG_WLEN_6 0x00000020 // 6 bit data +#define UART_CONFIG_WLEN_5 0x00000000 // 5 bit data +#define UART_CONFIG_STOP_ONE 0x00000000 // One stop bit +#define UART_CONFIG_STOP_TWO 0x00000008 // Two stop bits +#define UART_CONFIG_PAR_NONE 0x00000000 // No parity +#define UART_CONFIG_PAR_EVEN 0x00000006 // Even parity +#define UART_CONFIG_PAR_ODD 0x00000002 // Odd parity +#define UART_CONFIG_PAR_ONE 0x00000086 // Parity bit is one +#define UART_CONFIG_PAR_ZERO 0x00000082 // Parity bit is zero + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void UARTParityModeSet(unsigned long ulBase, unsigned long ulParity); +extern unsigned long UARTParityModeGet(unsigned long ulBase); +extern void UARTConfigSet(unsigned long ulBase, unsigned long ulBaud, + unsigned long ulConfig); +extern void UARTConfigGet(unsigned long ulBase, unsigned long *pulBaud, + unsigned long *pulConfig); +extern void UARTEnable(unsigned long ulBase); +extern void UARTDisable(unsigned long ulBase); +extern void UARTEnableSIR(unsigned long ulBase, tBoolean bLowPower); +extern void UARTDisableSIR(unsigned long ulBase); +extern tBoolean UARTCharsAvail(unsigned long ulBase); +extern tBoolean UARTSpaceAvail(unsigned long ulBase); +extern long UARTCharNonBlockingGet(unsigned long ulBase); +extern long UARTCharGet(unsigned long ulBase); +extern tBoolean UARTCharNonBlockingPut(unsigned long ulBase, + unsigned char ucData); +extern void UARTCharPut(unsigned long ulBase, unsigned char ucData); +extern void UARTBreakCtl(unsigned long ulBase, tBoolean bBreakState); +extern void UARTIntRegister(unsigned long ulBase, void(*pfnHandler)(void)); +extern void UARTIntUnregister(unsigned long ulBase); +extern void UARTIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void UARTIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long UARTIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void UARTIntClear(unsigned long ulBase, unsigned long ulIntFlags); + +#ifdef __cplusplus +} +#endif + +#endif // __UART_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/watchdog.h b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/watchdog.h new file mode 100644 index 000000000..2d0ad37a0 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/LuminaryDrivers/watchdog.h @@ -0,0 +1,63 @@ +//***************************************************************************** +// +// watchdog.h - Prototypes for the Watchdog Timer API +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __WATCHDOG_H__ +#define __WATCHDOG_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern tBoolean WatchdogRunning(unsigned long ulBase); +extern void WatchdogEnable(unsigned long ulBase); +extern void WatchdogResetEnable(unsigned long ulBase); +extern void WatchdogResetDisable(unsigned long ulBase); +extern void WatchdogLock(unsigned long ulBase); +extern void WatchdogUnlock(unsigned long ulBase); +extern tBoolean WatchdogLockState(unsigned long ulBase); +extern void WatchdogReloadSet(unsigned long ulBase, unsigned long ulLoadVal); +extern unsigned long WatchdogReloadGet(unsigned long ulBase); +extern unsigned long WatchdogValueGet(unsigned long ulBase); +extern void WatchdogIntRegister(unsigned long ulBase, void(*pfnHandler)(void)); +extern void WatchdogIntUnregister(unsigned long ulBase); +extern void WatchdogIntEnable(unsigned long ulBase); +extern unsigned long WatchdogIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void WatchdogIntClear(unsigned long ulBase); +extern void WatchdogStallDisable(unsigned long ulBase); +extern void WatchdogStallDisable(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __WATCHDOG_H__ diff --git a/Demo/CORTEX_LM3S2965_IAR/ParTest/ParTest.c b/Demo/CORTEX_LM3S2965_IAR/ParTest/ParTest.c new file mode 100644 index 000000000..f16ae6291 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/ParTest/ParTest.c @@ -0,0 +1,83 @@ +/* + FreeRTOS.org V4.3.0 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + + Also see http://www.SafeRTOS.com for an IEC 61508 compliant version along + with commercial development and support options. + *************************************************************************** +*/ + +/*----------------------------------------------------------- + * Simple parallel port IO routines. + *-----------------------------------------------------------*/ + +/* +*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Demo includes. */ +#include "partest.h" + +/* Library includes. */ +#include "hw_types.h" +#include "gpio.h" +#include "hw_memmap.h" + + +/*-----------------------------------------------------------*/ + +void vParTestInitialise( void ) +{ + GPIODirModeSet( GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_DIR_MODE_OUT ); + GPIOPadConfigSet( GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD ); + GPIOPinWrite( GPIO_PORTF_BASE, GPIO_PIN_0, 0 ); +} +/*-----------------------------------------------------------*/ + +void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue ) +{ + /* There is only one LED. */ + ( void ) uxLED; + + GPIOPinWrite( GPIO_PORTF_BASE, GPIO_PIN_0, xValue ); +} +/*-----------------------------------------------------------*/ + +unsigned portBASE_TYPE uxParTestGetLED( unsigned portBASE_TYPE uxLED ) +{ + /* There is only one LED. */ + ( void ) uxLED; + + return GPIOPinRead( GPIO_PORTF_BASE, GPIO_PIN_0 ); +} + + diff --git a/Demo/CORTEX_LM3S2965_IAR/RTOSDemo.dep b/Demo/CORTEX_LM3S2965_IAR/RTOSDemo.dep new file mode 100644 index 000000000..9b6787905 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/RTOSDemo.dep @@ -0,0 +1,856 @@ + + + + 2 + + Debug + + $TOOLKIT_DIR$\inc\stddef.h + $PROJ_DIR$\Debug\Obj\flash.pbi + $PROJ_DIR$\Debug\Obj\uIP_Task.pbi + $PROJ_DIR$\..\..\Source\include\projdefs.h + $PROJ_DIR$\..\..\Source\include\queue.h + $PROJ_DIR$\Debug\Obj\blocktim.r79 + $TOOLKIT_DIR$\inc\stdlib.h + $TOOLKIT_DIR$\lib\dl7mptnnl8n.h + $PROJ_DIR$\..\Common\include\blocktim.h + $PROJ_DIR$\..\Common\include\death.h + $PROJ_DIR$\webserver\httpd-fsdata.h + $TOOLKIT_DIR$\lib\dl7mptnnl8n.r79 + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\psock.h + $PROJ_DIR$\Debug\Obj\httpd-cgi.r79 + $PROJ_DIR$\Debug\Obj\emac.r79 + $PROJ_DIR$\Debug\Obj\uip_arp.pbi + $PROJ_DIR$\Debug\Obj\tasks.pbi + $PROJ_DIR$\..\..\Source\include\portable.h + $PROJ_DIR$\Debug\Obj\portasm.r79 + $PROJ_DIR$\Debug\Obj\osram128x64x4.pbi + $PROJ_DIR$\webserver\httpd-fsdata.c + $TOOLKIT_DIR$\inc\ysizet.h + $PROJ_DIR$\Debug\Obj\list.r79 + $PROJ_DIR$\LuminaryDrivers\hw_types.h + $PROJ_DIR$\Debug\Obj\BlockQ.pbi + $TOOLKIT_DIR$\inc\stdint.h + $PROJ_DIR$\Debug\Obj\uip.r79 + $PROJ_DIR$\Debug\Obj\main.pbi + $PROJ_DIR$\Debug\Obj\pdc.r79 + $TOOLKIT_DIR$\inc\xencoding_limits.h + $PROJ_DIR$\LuminaryDrivers\pdc.c + $PROJ_DIR$\LuminaryDrivers\interrupt.h + $PROJ_DIR$\..\Common\include\BlockQ.h + $PROJ_DIR$\Debug\Obj\timer.pbi + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\uipopt.h + $PROJ_DIR$\LuminaryDrivers\hw_ints.h + $TOOLKIT_DIR$\inc\DLib_Defaults.h + $PROJ_DIR$\LuminaryDrivers\hw_memmap.h + $PROJ_DIR$\Debug\Obj\main.r79 + $PROJ_DIR$\bitmap.h + $PROJ_DIR$\timertest.c + $PROJ_DIR$\Debug\Obj\timertest.pbi + $PROJ_DIR$\webserver\webserver.h + $PROJ_DIR$\..\Common\Minimal\semtest.c + $PROJ_DIR$\Debug\Obj\PollQ.pbi + $PROJ_DIR$\Debug\Obj\blocktim.pbi + $PROJ_DIR$\Debug\Obj\timer.r79 + $PROJ_DIR$\Debug\Obj\semtest.r79 + $PROJ_DIR$\LuminaryDrivers\gpio.h + $PROJ_DIR$\Debug\Obj\startup_ewarm.pbi + $PROJ_DIR$\Debug\Obj\timertest.r79 + $PROJ_DIR$\Debug\Obj\uip.pbi + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\uip_arch.h + $PROJ_DIR$\lcd_message.h + $PROJ_DIR$\Debug\Obj\httpd-cgi.pbi + $PROJ_DIR$\webserver\httpd-fs.h + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\uip_arp.h + $TOOLKIT_DIR$\inc\yvals.h + $PROJ_DIR$\Debug\Obj\BlockQ.r79 + $PROJ_DIR$\Debug\Obj\pdc.pbi + $PROJ_DIR$\..\Common\Minimal\death.c + $PROJ_DIR$\Debug\Obj\integer.r79 + $PROJ_DIR$\Debug\Exe\RTOSDemo.d79 + $PROJ_DIR$\Debug\Obj\ParTest.r79 + $PROJ_DIR$\Debug\Obj\http-strings.pbi + $PROJ_DIR$\Debug\Obj\PollQ.r79 + $PROJ_DIR$\Debug\Obj\httpd.pbi + $PROJ_DIR$\Debug\Obj\startup_ewarm.r79 + $PROJ_DIR$\LuminaryDrivers\ssi.h + $PROJ_DIR$\Debug\Obj\flash.r79 + $PROJ_DIR$\LuminaryDrivers\sysctl.h + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\lc.h + $PROJ_DIR$\Debug\Obj\tasks.r79 + $PROJ_DIR$\..\Common\include\integer.h + $PROJ_DIR$\webserver\http-strings.h + $PROJ_DIR$\LuminaryDrivers\osram128x64x4.h + $PROJ_DIR$\Debug\Obj\uIP_Task.r79 + $PROJ_DIR$\..\Common\Minimal\BlockQ.c + $PROJ_DIR$\..\..\..\..\..\Demo\CORTEX_LM3S6965_IAR\main.c + $PROJ_DIR$\..\Common\Minimal\integer.c + $PROJ_DIR$\..\Common\Minimal\flash.c + $PROJ_DIR$\..\Common\Minimal\PollQ.c + $PROJ_DIR$\ParTest\ParTest.c + $PROJ_DIR$\main.c + $PROJ_DIR$\Debug\Obj\uip_arp.r79 + $PROJ_DIR$\Debug\Obj\port.pbi + $PROJ_DIR$\LuminaryDrivers\hw_sysctl.h + $PROJ_DIR$\Debug\Obj\httpd-fs.pbi + $PROJ_DIR$\Debug\Obj\heap_2.pbi + $PROJ_DIR$\Debug\Obj\osram128x64x4.r79 + $PROJ_DIR$\Debug\Obj\queue.pbi + $PROJ_DIR$\LuminaryDrivers\hw_ssi.h + $PROJ_DIR$\Debug\Obj\httpd.r79 + $PROJ_DIR$\Debug\Obj\death.r79 + $PROJ_DIR$\webserver\clock-arch.h + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\lc-switch.h + $PROJ_DIR$\FreeRTOSConfig.h + $PROJ_DIR$\Debug\Obj\semtest.pbi + $PROJ_DIR$\webserver\uip-conf.h + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\uip.h + $PROJ_DIR$\webserver\httpd-cgi.h + $PROJ_DIR$\..\..\Source\portable\IAR\ARM_CM3\portmacro.h + $PROJ_DIR$\Debug\Obj\death.pbi + $PROJ_DIR$\..\..\Source\include\task.h + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\clock.h + $PROJ_DIR$\..\..\Source\include\semphr.h + $PROJ_DIR$\..\Common\include\PollQ.h + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\uip.c + $PROJ_DIR$\webserver\httpd-cgi.c + $PROJ_DIR$\LuminaryDrivers\pdc.h + $PROJ_DIR$\LuminaryDrivers\driverlib.r79 + $PROJ_DIR$\..\..\Source\include\croutine.h + $TOOLKIT_DIR$\inc\stdio.h + $PROJ_DIR$\Debug\Obj\RTOSDemo.pbd + $PROJ_DIR$\..\Common\include\partest.h + $PROJ_DIR$\Debug\Obj\psock.pbi + $PROJ_DIR$\..\..\Source\tasks.c + $PROJ_DIR$\startup_ewarm.c + $PROJ_DIR$\LuminaryDrivers\ethernet.h + $PROJ_DIR$\..\Common\include\flash.h + $PROJ_DIR$\LuminaryDrivers\hw_ethernet.h + $PROJ_DIR$\Debug\Exe\RTOSDemo.sim + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\pt.h + $PROJ_DIR$\Debug\Obj\psock.r79 + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\timer.h + $PROJ_DIR$\Debug\Obj\list.pbi + $PROJ_DIR$\Debug\Obj\httpd-fs.r79 + $PROJ_DIR$\Debug\Obj\ParTest.pbi + $PROJ_DIR$\..\Common\Minimal\blocktim.c + $PROJ_DIR$\Debug\Obj\http-strings.r79 + $PROJ_DIR$\Debug\Obj\integer.pbi + $PROJ_DIR$\webserver\httpd.h + $TOOLKIT_DIR$\inc\DLib_Product.h + $PROJ_DIR$\LuminaryDrivers\LMI_timer.h + $PROJ_DIR$\LuminaryDrivers\debug.h + $TOOLKIT_DIR$\inc\string.h + $PROJ_DIR$\RTOSDemo.xcl + $TOOLKIT_DIR$\inc\DLib_Threads.h + $PROJ_DIR$\..\..\Source\queue.c + $PROJ_DIR$\..\..\Source\include\list.h + $PROJ_DIR$\..\..\Source\portable\IAR\ARM_CM3\portasm.s + $PROJ_DIR$\webserver\emac.c + $PROJ_DIR$\..\..\Source\portable\MemMang\heap_2.c + $PROJ_DIR$\Debug\Obj\queue.r79 + $PROJ_DIR$\Debug\Obj\port.r79 + $PROJ_DIR$\..\..\Source\list.c + $PROJ_DIR$\..\..\Source\portable\IAR\ARM_CM3\port.c + $PROJ_DIR$\LuminaryDrivers\osram128x64x4.c + $PROJ_DIR$\Debug\Obj\emac.pbi + $PROJ_DIR$\Debug\Obj\heap_2.r79 + $PROJ_DIR$\..\..\Source\include\FreeRTOS.h + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\uip_arp.c + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\psock.c + $PROJ_DIR$\webserver\httpd-fs.c + $PROJ_DIR$\webserver\uIP_Task.c + $PROJ_DIR$\webserver\httpd.c + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\timer.c + $PROJ_DIR$\webserver\http-strings.c + $PROJ_DIR$\webserver\emac.h + $PROJ_DIR$\..\Common\include\semtest.h + + + $PROJ_DIR$\LuminaryDrivers\pdc.c + + + ICCARM + 28 + + + BICOMP + 59 + + + + + ICCARM + 37 23 134 48 68 70 109 + + + BICOMP + 37 23 134 48 68 70 109 + + + + + $PROJ_DIR$\timertest.c + + + ICCARM + 50 + + + BICOMP + 41 + + + + + ICCARM + 150 0 57 36 7 132 29 137 21 3 96 17 101 35 37 23 31 70 133 + + + BICOMP + 150 0 57 36 132 29 137 21 3 96 17 101 35 37 23 31 70 133 + + + + + $PROJ_DIR$\..\Common\Minimal\semtest.c + + + ICCARM + 47 + + + BICOMP + 97 + + + + + ICCARM + 6 57 36 7 132 29 137 21 150 0 3 96 17 101 103 139 105 4 159 + + + BICOMP + 6 57 36 132 29 137 21 150 0 3 96 17 101 103 139 105 4 159 + + + + + $PROJ_DIR$\..\Common\Minimal\death.c + + + ICCARM + 93 + + + BICOMP + 102 + + + + + ICCARM + 6 57 36 7 132 29 137 21 150 0 3 96 17 101 103 139 9 + + + BICOMP + 6 57 36 132 29 137 21 150 0 3 96 17 101 103 139 9 + + + + + $PROJ_DIR$\Debug\Exe\RTOSDemo.d79 + + + XLINK + 121 + + + + + XLINK + 136 58 63 65 5 93 14 69 149 129 13 126 92 61 22 38 89 144 18 123 143 47 67 72 46 50 76 26 84 110 11 + + + + + $PROJ_DIR$\..\Common\Minimal\BlockQ.c + + + ICCARM + 58 + + + BICOMP + 24 + + + + + ICCARM + 6 57 36 7 132 29 137 21 150 0 3 96 17 101 103 139 4 32 + + + BICOMP + 6 57 36 132 29 137 21 150 0 3 96 17 101 103 139 4 32 + + + + + $PROJ_DIR$\..\Common\Minimal\integer.c + + + ICCARM + 61 + + + BICOMP + 130 + + + + + ICCARM + 6 57 36 7 132 29 137 21 150 0 3 96 17 101 103 139 73 + + + BICOMP + 6 57 36 132 29 137 21 150 0 3 96 17 101 103 139 73 + + + + + $PROJ_DIR$\..\Common\Minimal\flash.c + + + ICCARM + 69 + + + BICOMP + 1 + + + + + ICCARM + 6 57 36 7 132 29 137 21 150 0 3 96 17 101 103 139 114 119 + + + BICOMP + 6 57 36 132 29 137 21 150 0 3 96 17 101 103 139 114 119 + + + + + $PROJ_DIR$\..\Common\Minimal\PollQ.c + + + ICCARM + 65 + + + BICOMP + 44 + + + + + ICCARM + 6 57 36 7 132 29 137 21 150 0 3 96 17 101 103 139 4 106 + + + BICOMP + 6 57 36 132 29 137 21 150 0 3 96 17 101 103 139 4 106 + + + + + $PROJ_DIR$\ParTest\ParTest.c + + + ICCARM + 63 + + + BICOMP + 127 + + + + + ICCARM + 150 0 57 36 7 132 29 137 21 3 96 17 101 103 139 114 23 48 37 + + + BICOMP + 150 0 57 36 132 29 137 21 3 96 17 101 103 139 114 23 48 37 + + + + + $PROJ_DIR$\main.c + + + ICCARM + 38 + + + BICOMP + 27 + + + + + ICCARM + 112 57 36 7 132 29 137 21 150 0 3 96 17 101 103 139 4 105 32 9 73 8 119 114 159 106 53 39 37 23 70 48 75 + + + BICOMP + 112 57 36 132 29 137 21 150 0 3 96 17 101 103 139 4 105 32 9 73 8 119 114 159 106 53 39 37 23 70 48 75 + + + + + [ROOT_NODE] + + + XLINK + 121 62 + + + + + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\uip.c + + + ICCARM + 26 + + + BICOMP + 51 + + + + + ICCARM + 99 34 98 25 57 36 7 132 29 137 42 131 12 122 71 95 55 52 135 21 + + + BICOMP + 99 34 98 25 57 36 132 29 137 42 131 12 122 71 95 55 52 135 21 + + + + + $PROJ_DIR$\webserver\httpd-cgi.c + + + ICCARM + 13 + + + BICOMP + 54 + + + + + ICCARM + 99 34 98 25 57 36 7 132 29 137 42 131 12 122 71 95 55 100 112 21 135 + + + BICOMP + 99 34 98 25 57 36 132 29 137 42 131 12 122 71 95 55 100 112 21 135 + + + + + $PROJ_DIR$\Debug\Obj\RTOSDemo.pbd + + + BILINK + 24 127 44 45 102 1 88 130 125 27 19 85 90 97 49 16 41 + + + + + $PROJ_DIR$\..\..\Source\tasks.c + + + ICCARM + 72 + + + BICOMP + 16 + + + + + ICCARM + 112 57 36 7 132 29 137 21 6 135 150 0 3 96 17 101 103 139 + + + BICOMP + 112 57 36 132 29 137 21 6 135 150 0 3 96 17 101 103 139 + + + + + $PROJ_DIR$\startup_ewarm.c + + + ICCARM + 67 + + + BICOMP + 49 + + + + + $PROJ_DIR$\..\Common\Minimal\blocktim.c + + + ICCARM + 5 + + + BICOMP + 45 + + + + + ICCARM + 150 0 57 36 7 132 29 137 21 3 96 17 101 103 139 4 + + + BICOMP + 150 0 57 36 132 29 137 21 3 96 17 101 103 139 4 + + + + + $PROJ_DIR$\..\..\Source\queue.c + + + ICCARM + 143 + + + BICOMP + 90 + + + + + ICCARM + 6 57 36 7 132 29 137 21 135 150 0 3 96 17 101 103 139 111 + + + BICOMP + 6 57 36 132 29 137 21 135 150 0 3 96 17 101 103 139 111 + + + + + $PROJ_DIR$\..\..\Source\portable\IAR\ARM_CM3\portasm.s + + + AARM + 18 + + + + + AARM + 96 + + + + + $PROJ_DIR$\webserver\emac.c + + + ICCARM + 14 + + + BICOMP + 148 + + + + + ICCARM + 150 0 57 36 7 132 29 137 21 3 96 17 101 105 4 103 139 158 99 34 98 25 42 131 12 122 71 95 55 23 37 35 120 118 31 + + + BICOMP + 150 0 57 36 132 29 137 21 3 96 17 101 105 4 103 139 158 99 34 98 25 42 131 12 122 71 95 55 23 37 35 120 118 31 + + + + + $PROJ_DIR$\..\..\Source\portable\MemMang\heap_2.c + + + ICCARM + 149 + + + BICOMP + 88 + + + + + ICCARM + 6 57 36 7 132 29 137 21 150 0 3 96 17 101 103 139 + + + BICOMP + 6 57 36 132 29 137 21 150 0 3 96 17 101 103 139 + + + + + $PROJ_DIR$\..\..\Source\list.c + + + ICCARM + 22 + + + BICOMP + 125 + + + + + ICCARM + 6 57 36 7 132 29 137 21 150 0 3 96 17 101 139 + + + BICOMP + 6 57 36 132 29 137 21 150 0 3 96 17 101 139 + + + + + $PROJ_DIR$\..\..\Source\portable\IAR\ARM_CM3\port.c + + + ICCARM + 144 + + + BICOMP + 85 + + + + + ICCARM + 150 0 57 36 7 132 29 137 21 3 96 17 101 103 139 + + + BICOMP + 150 0 57 36 132 29 137 21 3 96 17 101 103 139 + + + + + $PROJ_DIR$\LuminaryDrivers\osram128x64x4.c + + + ICCARM + 89 + + + BICOMP + 19 + + + + + ICCARM + 91 37 86 23 134 48 68 70 75 + + + BICOMP + 91 37 86 23 134 48 68 70 75 + + + + + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\uip_arp.c + + + ICCARM + 84 + + + BICOMP + 15 + + + + + ICCARM + 56 99 34 98 25 57 36 7 132 29 137 42 131 12 122 71 95 55 135 21 + + + BICOMP + 56 99 34 98 25 57 36 132 29 137 42 131 12 122 71 95 55 135 21 + + + + + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\psock.c + + + ICCARM + 123 + + + BICOMP + 115 + + + + + ICCARM + 112 57 36 7 132 29 137 21 135 34 98 25 42 131 12 122 71 95 55 99 + + + BICOMP + 112 57 36 132 29 137 21 135 34 98 25 42 131 12 122 71 95 55 99 + + + + + $PROJ_DIR$\webserver\httpd-fs.c + + + ICCARM + 126 + + + BICOMP + 87 + + + + + ICCARM + 131 12 34 98 25 57 36 7 132 29 137 42 122 71 95 55 10 99 20 + + + BICOMP + 131 12 34 98 25 57 36 132 29 137 42 122 71 95 55 10 99 20 + + + + + $PROJ_DIR$\webserver\uIP_Task.c + + + ICCARM + 76 + + + BICOMP + 2 + + + + + ICCARM + 135 57 36 7 132 29 137 21 150 0 3 96 17 101 103 139 105 4 53 23 99 34 98 25 42 131 12 122 71 95 55 56 124 104 94 120 118 37 158 114 + + + BICOMP + 135 57 36 132 29 137 21 150 0 3 96 17 101 103 139 105 4 53 23 99 34 98 25 42 131 12 122 71 95 55 56 124 104 94 120 118 37 158 114 + + + + + $PROJ_DIR$\webserver\httpd.c + + + ICCARM + 92 + + + BICOMP + 66 + + + + + ICCARM + 99 34 98 25 57 36 7 132 29 137 42 131 12 122 71 95 55 100 74 135 21 + + + BICOMP + 99 34 98 25 57 36 132 29 137 42 131 12 122 71 95 55 100 74 135 21 + + + + + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\timer.c + + + ICCARM + 46 + + + BICOMP + 33 + + + + + ICCARM + 104 94 150 0 57 36 7 132 29 137 21 3 96 17 101 124 + + + BICOMP + 104 94 150 0 57 36 132 29 137 21 3 96 17 101 124 + + + + + $PROJ_DIR$\webserver\http-strings.c + + + ICCARM + 129 + + + BICOMP + 64 + + + + + [MULTI_TOOL] + XLINK + + + + Release + + + [MULTI_TOOL] + XLINK + + + + + diff --git a/Demo/CORTEX_LM3S2965_IAR/RTOSDemo.ewd b/Demo/CORTEX_LM3S2965_IAR/RTOSDemo.ewd new file mode 100644 index 000000000..3d24b7e57 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/RTOSDemo.ewd @@ -0,0 +1,1133 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 13 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 0 + 1 + 1 + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 6 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ewplugin + 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 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 13 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 0 + 1 + 0 + + + + + ANGEL_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + JLINK_ID + 2 + + 6 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ewplugin + 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 + + + + + + diff --git a/Demo/CORTEX_LM3S2965_IAR/RTOSDemo.ewp b/Demo/CORTEX_LM3S2965_IAR/RTOSDemo.ewp new file mode 100644 index 000000000..82b8949ca --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/RTOSDemo.ewp @@ -0,0 +1,1728 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + XLINK + 2 + + 18 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 2 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 2 + + 9 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 14 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + XLINK + 2 + + 18 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 2 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + Demo files + + $PROJ_DIR$\..\Common\Minimal\BlockQ.c + + + $PROJ_DIR$\..\Common\Minimal\blocktim.c + + + $PROJ_DIR$\..\Common\Minimal\death.c + + + $PROJ_DIR$\..\Common\Minimal\flash.c + + + $PROJ_DIR$\..\Common\Minimal\integer.c + + + $PROJ_DIR$\main.c + + + $PROJ_DIR$\ParTest\ParTest.c + + + $PROJ_DIR$\..\Common\Minimal\PollQ.c + + + $PROJ_DIR$\..\Common\Minimal\semtest.c + + + $PROJ_DIR$\timertest.c + + + + Library files + + $PROJ_DIR$\LuminaryDrivers\driverlib.r79 + + + $PROJ_DIR$\LuminaryDrivers\osram128x64x4.c + + + + Scheduler files + + $PROJ_DIR$\..\..\Source\portable\MemMang\heap_2.c + + + $PROJ_DIR$\..\..\Source\list.c + + + $PROJ_DIR$\..\..\Source\portable\IAR\ARM_CM3\port.c + + + $PROJ_DIR$\..\..\Source\portable\IAR\ARM_CM3\portasm.s + + + $PROJ_DIR$\..\..\Source\queue.c + + + $PROJ_DIR$\..\..\Source\tasks.c + + + + System files + + $PROJ_DIR$\startup_ewarm.c + + + + + diff --git a/Demo/CORTEX_LM3S2965_IAR/RTOSDemo.eww b/Demo/CORTEX_LM3S2965_IAR/RTOSDemo.eww new file mode 100644 index 000000000..239a9381e --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/RTOSDemo.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\RTOSDemo.ewp + + + + + diff --git a/Demo/CORTEX_LM3S2965_IAR/RTOSDemo.xcl b/Demo/CORTEX_LM3S2965_IAR/RTOSDemo.xcl new file mode 100644 index 000000000..a7044e640 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/RTOSDemo.xcl @@ -0,0 +1,56 @@ +//***************************************************************************** +// +// webserver-lwip.xcl - Linker script for EW-ARM. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED AS IS. NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +//***************************************************************************** + +// +// Set the CPU type to ARM. +// +-carm + +// +// Define the size of flash and SRAM. +// +-DROMSTART=00000000 +-DROMEND=00040000 +-DRAMSTART=20000000 +-DRAMEND=20010000 + + + +// +// Define the sections to place into flash, and the order to place them. +// +-Z(CODE)INTVEC=ROMSTART-ROMEND +-Z(CODE)ICODE,DIFUNCT=ROMSTART-ROMEND +-Z(CODE)CODE=ROMSTART-ROMEND +-Z(CONST)CODE_ID=ROMSTART-ROMEND +-Z(CONST)INITTAB,DATA_ID,DATA_C=ROMSTART-ROMEND +-Z(CONST)CHECKSUM=ROMSTART-ROMEND + +// +// Define the sections to place into SRAM, and the order to place them. +// +-Z(DATA)VTABLE=RAMSTART-RAMEND +-Z(DATA)DATA_I,DATA_Z,DATA_N=RAMSTART-RAMEND +-Z(DATA)CODE_I=RAMSTART-RAMEND diff --git a/Demo/CORTEX_LM3S2965_IAR/bitmap.h b/Demo/CORTEX_LM3S2965_IAR/bitmap.h new file mode 100644 index 000000000..02ce0b365 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/bitmap.h @@ -0,0 +1,171 @@ +#ifndef BITMAP_H +#define BITMAP_H + +const unsigned char pucImage[] = +{ +0x00, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0x00, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa0, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, +0x00, 0x8f, 0xff, 0xff, 0xf8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x88, 0x88, 0x88, +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x78, 0x8f, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x88, 0x77, 0x77, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xf0, 0x00, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, +0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x08, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, +0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0x00, 0x8f, 0x00, 0xff, +0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x78, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x07, +0x00, 0x70, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, +0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0x88, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x07, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf8, +0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x8f, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0x87, 0x77, +0x77, 0x77, 0x78, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x88, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf8, 0x87, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, +0x78, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xff, 0x80, 0x00, 0x8f, 0x8f, 0xff, 0x87, 0x77, 0x77, 0x77, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, +0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x8f, 0x07, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, +0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x07, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, +0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0f, 0x00, 0x8f, 0x00, 0xff, +0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, +0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, +0x78, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x70, 0x08, 0x00, 0x88, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x88, 0x88, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, +0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x70, 0x07, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x87, 0x88, +0x88, 0x8f, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x7f, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf7, 0x88, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf7, +0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x88, 0x88, 0x88, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0x87, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, +0x00, 0x00, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, +0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x07, 0xff, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xff, 0xff, 0x88, 0x88, 0x88, 0x88, +0xff, 0xff, 0xff, 0xff, 0x88, 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x87, 0x77, 0x77, 0x77, +0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0x00, 0x0f, 0x70, 0x08, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0x00, 0x07, 0x70, 0x07, +0x88, 0x88, 0x88, 0xff, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x70, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x08, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x08, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa0, 0x00, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, +0x00 }; + +#define bmpBITMAP_HEIGHT 50 +#define bmpBITMAP_WIDTH 128 + +#endif diff --git a/Demo/CORTEX_LM3S2965_IAR/lcd_message.h b/Demo/CORTEX_LM3S2965_IAR/lcd_message.h new file mode 100644 index 000000000..adfc18b8a --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/lcd_message.h @@ -0,0 +1,9 @@ +#ifndef LCD_MESSAGE_H +#define LCD_MESSAGE_H + +typedef struct +{ + signed char *pcMessage; +} xOLEDMessage; + +#endif /* LCD_MESSAGE_H */ diff --git a/Demo/CORTEX_LM3S2965_IAR/main.c b/Demo/CORTEX_LM3S2965_IAR/main.c new file mode 100644 index 000000000..e73d68f5e --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/main.c @@ -0,0 +1,307 @@ +/* + FreeRTOS.org V4.3.0 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + *************************************************************************** +*/ + + +/* + * Creates all the demo application tasks, then starts the scheduler. The WEB + * documentation provides more details of the standard demo application tasks. + * In addition to the standard demo tasks, the following tasks and tests are + * defined and/or created within this file: + * + * "Fast Interrupt Test" - A high frequency periodic interrupt is generated + * using a free running timer to demonstrate the use of the + * configKERNEL_INTERRUPT_PRIORITY configuration constant. The interrupt + * service routine measures the number of processor clocks that occur between + * each interrupt - and in so doing measures the jitter in the interrupt timing. + * The maximum measured jitter time is latched in the ulMaxJitter variable, and + * displayed on the OLED display by the 'Check' task as described below. The + * fast interrupt is configured and handled in the timertest.c source file. + * + * "OLED" task - the OLED task is a 'gatekeeper' task. It is the only task that + * is permitted to access the display directly. Other tasks wishing to write a + * message to the OLED send the message on a queue to the OLED task instead of + * accessing the OLED themselves. The OLED task just blocks on the queue waiting + * for messages - waking and displaying the messages as they arrive. + * + * "Check" task - This only executes every five seconds but has the highest + * priority so is guaranteed to get processor time. Its main function is to + * check that all the standard demo tasks are still operational. Should any + * unexpected behaviour within a demo task be discovered the 'check' task will + * write an error to the OLED (via the OLED task). If all the demo tasks are + * executing with their expected behaviour then the check task writes PASS + * along with the max jitter time to the OLED (again via the OLED task), as + * described above. + * + */ + + + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "Task.h" +#include "queue.h" +#include "semphr.h" + +/* Demo app includes. */ +#include "BlockQ.h" +#include "death.h" +#include "integer.h" +#include "blocktim.h" +#include "flash.h" +#include "partest.h" +#include "semtest.h" +#include "pollq.h" +#include "lcd_message.h" +#include "bitmap.h" + +/* Hardware library includes. */ +#include "hw_memmap.h" +#include "hw_types.h" +#include "sysctl.h" +#include "gpio.h" +#include "osram128x64x4.h" + +/*-----------------------------------------------------------*/ + +/* The time between cycles of the 'check' task. */ +#define mainCHECK_DELAY ( ( portTickType ) 5000 / portTICK_RATE_MS ) + +/* The check task uses the sprintf function so requires a little more stack too. */ +#define mainCHECK_TASK_STACK_SIZE ( configMINIMAL_STACK_SIZE + 50 ) + +/* Task priorities. */ +#define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2 ) +#define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 ) +#define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 ) +#define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 ) +#define mainCREATOR_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 ) +#define mainINTEGER_TASK_PRIORITY ( tskIDLE_PRIORITY ) + +/* The maximum number of message that can be waiting for display at any one +time. */ +#define mainOLED_QUEUE_SIZE ( 3 ) + +/* Dimensions the buffer into which the jitter time is written. */ +#define mainMAX_MSG_LEN 25 + +/* The period of the system clock in nano seconds. This is used to calculate +the jitter time in nano seconds. */ +#define mainNS_PER_CLOCK ( ( unsigned portLONG ) ( ( 1.0 / ( double ) configCPU_CLOCK_HZ ) * 1000000000.0 ) ) + +/* Constants used when writing strings to the display. */ +#define mainCHARACTER_HEIGHT ( 9 ) +#define mainMAX_ROWS ( mainCHARACTER_HEIGHT * 7 ) +#define mainFULL_SCALE ( 15 ) +#define ulSSI_FREQUENCY 1000000 + +/*-----------------------------------------------------------*/ + +/* + * Checks the status of all the demo tasks then prints a message to the + * display. The message will be either PASS - an include in brackets the + * maximum measured jitter time (as described at the to of the file), or a + * message that describes which of the standard demo tasks an error has been + * discovered in. + * + * Messages are not written directly to the terminal, but passed to vOLEDTask + * via a queue. + */ +static void vCheckTask( void *pvParameters ); + +/* + * The display is written two by more than one task so is controlled by a + * 'gatekeeper' task. This is the only task that is actually permitted to + * access the display directly. Other tasks wanting to display a message send + * the message to the gatekeeper. + */ +static void vOLEDTask( void *pvParameters ); + +/* + * Configure the hardware for the demo. + */ +static void prvSetupHardware( void ); + +/* + * Configures the high frequency timers - those used to measure the timing + * jitter while the real time kernel is executing. + */ +extern void vSetupTimer( void ); + +/*-----------------------------------------------------------*/ + +/* The queue used to send messages to the OLED task. */ +xQueueHandle xOLEDQueue; + +/* The welcome text. */ +const portCHAR * const pcWelcomeMessage = " www.FreeRTOS.org"; + +/*-----------------------------------------------------------*/ + +int main( void ) +{ + prvSetupHardware(); + + /* Create the queue used by the OLED task. Messages for display on the OLED + are received via this queue. */ + xOLEDQueue = xQueueCreate( mainOLED_QUEUE_SIZE, sizeof( xOLEDMessage ) ); + + /* Start the standard demo tasks. */ + vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY ); + vCreateBlockTimeTasks(); + vStartSemaphoreTasks( mainSEM_TEST_PRIORITY ); + vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY ); + vStartIntegerMathTasks( mainINTEGER_TASK_PRIORITY ); + + /* Start the tasks defined within this file/specific to this demo. */ + xTaskCreate( vCheckTask, ( signed portCHAR * ) "Check", mainCHECK_TASK_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL ); + xTaskCreate( vOLEDTask, ( signed portCHAR * ) "OLED", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL ); + + /* The suicide tasks must be created last as they need to know how many + tasks were running prior to their creation in order to ascertain whether + or not the correct/expected number of tasks are running at any given time. */ + vCreateSuicidalTasks( mainCREATOR_TASK_PRIORITY ); + + /* Configure the high frequency interrupt used to measure the interrupt + jitter time. */ + vSetupTimer(); + + /* Start the scheduler. */ + vTaskStartScheduler(); + + /* Will only get here if there was insufficient memory to create the idle + task. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void prvSetupHardware( void ) +{ + /* Set the clocking to run from the PLL at 50 MHz */ + SysCtlClockSet( SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ ); + + /* Enable Port F for Ethernet LEDs + LED0 Bit 3 Output + LED1 Bit 2 Output */ + SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOF ); + GPIODirModeSet( GPIO_PORTF_BASE, (GPIO_PIN_2 | GPIO_PIN_3), GPIO_DIR_MODE_HW ); + GPIOPadConfigSet( GPIO_PORTF_BASE, (GPIO_PIN_2 | GPIO_PIN_3 ), GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD ); + + vParTestInitialise(); +} +/*-----------------------------------------------------------*/ + +static void vCheckTask( void *pvParameters ) +{ +portTickType xLastExecutionTime; +xOLEDMessage xMessage; +static portCHAR cPassMessage[ mainMAX_MSG_LEN ]; +extern unsigned portLONG ulMaxJitter; + + xLastExecutionTime = xTaskGetTickCount(); + xMessage.pcMessage = cPassMessage; + + for( ;; ) + { + /* Perform this check every mainCHECK_DELAY milliseconds. */ + vTaskDelayUntil( &xLastExecutionTime, mainCHECK_DELAY ); + + /* Has an error been found in any task? */ + + if( xAreBlockingQueuesStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN BLOCK Q"; + } + else if( xAreBlockTimeTestTasksStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN BLOCK TIME"; + } + else if( xAreSemaphoreTasksStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN SEMAPHORE"; + } + else if( xArePollingQueuesStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN POLL Q"; + } + else if( xIsCreateTaskStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN CREATE"; + } + else if( xAreIntegerMathsTaskStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN MATH"; + } + else + { + sprintf( cPassMessage, "PASS [%uns]", ulMaxJitter * mainNS_PER_CLOCK ); + } + + /* Send the message to the OLED gatekeeper for display. */ + xQueueSend( xOLEDQueue, &xMessage, portMAX_DELAY ); + } +} +/*-----------------------------------------------------------*/ + + + +void vOLEDTask( void *pvParameters ) +{ +xOLEDMessage xMessage; +unsigned portLONG ulY = mainMAX_ROWS; + + /* Initialise the OLED and display a startup message. */ + OSRAM128x64x4Init( ulSSI_FREQUENCY ); + + OSRAM128x64x4StringDraw( " POWERED BY FreeRTOS", 0, 0, mainFULL_SCALE ); + OSRAM128x64x4ImageDraw( pucImage, 0, mainCHARACTER_HEIGHT + 1, bmpBITMAP_WIDTH, bmpBITMAP_HEIGHT ); + + for( ;; ) + { + /* Wait for a message to arrive that requires displaying. */ + xQueueReceive( xOLEDQueue, &xMessage, portMAX_DELAY ); + + /* Write the message on the next available row. */ + ulY += mainCHARACTER_HEIGHT; + if( ulY >= mainMAX_ROWS ) + { + ulY = mainCHARACTER_HEIGHT; + OSRAM128x64x4Clear(); + OSRAM128x64x4StringDraw( pcWelcomeMessage, 0, 0, mainFULL_SCALE ); + } + + /* Display the message. */ + OSRAM128x64x4StringDraw( xMessage.pcMessage, 0, ulY, mainFULL_SCALE ); + } +} diff --git a/Demo/CORTEX_LM3S2965_IAR/startup_ewarm.c b/Demo/CORTEX_LM3S2965_IAR/startup_ewarm.c new file mode 100644 index 000000000..fe6effc46 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/startup_ewarm.c @@ -0,0 +1,265 @@ +//***************************************************************************** +// +// startup_ewarm.c - Boot code for Stellaris. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 100 of the Stellaris Ethernet +// Applications Library. +// +//***************************************************************************** + +//***************************************************************************** +// +// 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. +// +//***************************************************************************** + + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); +extern void xPortPendSVHandler(void); +extern void xPortSysTickHandler(void); +extern void vEMAC_ISR( void ); +extern Timer0IntHandler( void ); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +#ifndef STACK_SIZE +#define STACK_SIZE 64 +#endif +static unsigned long pulStack[STACK_SIZE]; + +//***************************************************************************** +// +// 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); + unsigned long ulPtr; +} +uVectorEntry; + +//***************************************************************************** +// +// The minimal vector table for a Cortex M3. Note that the proper constructs +// must be placed on this to ensure that it ends up at physical address +// 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry g_pfnVectors[] @ "INTVEC" = +{ + { .ulPtr = (unsigned long)pulStack + sizeof(pulStack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // 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, // SSI Rx and Tx + IntDefaultHandler, // I2C Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder + 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 + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 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 + IntDefaultHandler, // CAN2 + IntDefaultHandler, // Ethernet + IntDefaultHandler // Power Island +}; + +//***************************************************************************** +// +// 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. +// +//***************************************************************************** +#pragma segment="DATA_ID" +#pragma segment="DATA_I" +#pragma segment="DATA_Z" + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + unsigned long *pulSrc, *pulDest, *pulEnd; + + // + // Copy the data segment initializers from flash to SRAM. + // + pulSrc = __segment_begin("DATA_ID"); + pulDest = __segment_begin("DATA_I"); + pulEnd = __segment_end("DATA_I"); + while(pulDest < pulEnd) + { + *pulDest++ = *pulSrc++; + } + + // + // Zero fill the bss segment. + // + pulDest = __segment_begin("DATA_Z"); + pulEnd = __segment_end("DATA_Z"); + while(pulDest < pulEnd) + { + *pulDest++ = 0; + } + + // + // 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/Demo/CORTEX_LM3S2965_IAR/timertest.c b/Demo/CORTEX_LM3S2965_IAR/timertest.c new file mode 100644 index 000000000..2eddbfcda --- /dev/null +++ b/Demo/CORTEX_LM3S2965_IAR/timertest.c @@ -0,0 +1,133 @@ +/* + FreeRTOS.org V4.3.0 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + + Also see http://www.SafeRTOS.com for an IEC 61508 compliant version along + with commercial development and support options. + *************************************************************************** +*/ + +/* High speed timer test as described in main.c. */ + +/* Scheduler includes. */ +#include "FreeRTOS.h" + +/* Library includes. */ +#include "hw_ints.h" +#include "hw_memmap.h" +#include "hw_types.h" +#include "interrupt.h" +#include "sysctl.h" +#include "LMI_timer.h" + +/* The set frequency of the interrupt. Deviations from this are measured as +the jitter. */ +#define timerINTERRUPT_FREQUENCY ( 20000UL ) + +/* The expected time between each of the timer interrupts - if the jitter was +zero. */ +#define timerEXPECTED_DIFFERENCE_VALUE ( configCPU_CLOCK_HZ / timerINTERRUPT_FREQUENCY ) + +/* The highest available interrupt priority. */ +#define timerHIGHEST_PRIORITY ( 0 ) + +/* Misc defines. */ +#define timerMAX_32BIT_VALUE ( 0xffffffffUL ) +#define timerTIMER_1_COUNT_VALUE ( * ( ( unsigned long * ) ( TIMER1_BASE + 0x48 ) ) ) + +/*-----------------------------------------------------------*/ + +/* Interrupt handler in which the jitter is measured. */ +void Timer0IntHandler( void ); + +/* Stores the value of the maximum recorded jitter between interrupts. */ +unsigned portLONG ulMaxJitter = 0; + +/*-----------------------------------------------------------*/ + +void vSetupTimer( void ) +{ +unsigned long ulFrequency; + + /* Timer zero is used to generate the interrupts, and timer 1 is used + to measure the jitter. */ + SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER0 ); + SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER1 ); + TimerConfigure( TIMER0_BASE, TIMER_CFG_32_BIT_PER ); + TimerConfigure( TIMER1_BASE, TIMER_CFG_32_BIT_PER ); + + /* Set the timer interrupt to be above the kernel - highest. */ + IntPrioritySet( INT_TIMER0A, timerHIGHEST_PRIORITY ); + + /* Just used to measure time. */ + TimerLoadSet(TIMER1_BASE, TIMER_A, timerMAX_32BIT_VALUE ); + + /* The rate at which the timer will interrupt. */ + ulFrequency = configCPU_CLOCK_HZ / timerINTERRUPT_FREQUENCY; + TimerLoadSet( TIMER0_BASE, TIMER_A, ulFrequency ); + IntEnable( INT_TIMER0A ); + TimerIntEnable( TIMER0_BASE, TIMER_TIMA_TIMEOUT ); + + /* Enable both timers. */ + TimerEnable( TIMER0_BASE, TIMER_A ); + TimerEnable( TIMER1_BASE, TIMER_A ); +} +/*-----------------------------------------------------------*/ + +void Timer0IntHandler( void ) +{ +unsigned portLONG ulDifference, ulCurrentCount; +static portLONG ulMaxDifference = 0, ulLastCount = 0; + + /* We use the timer 1 counter value to measure the clock cycles between + the timer 0 interrupts. */ + ulCurrentCount = timerTIMER_1_COUNT_VALUE; + + if( ulCurrentCount < ulLastCount ) + { + /* How many times has timer 1 counted since the last interrupt? */ + ulDifference = ulLastCount - ulCurrentCount; + + /* Is this the largest difference we have measured yet? */ + if( ulDifference > ulMaxDifference ) + { + ulMaxDifference = ulDifference; + ulMaxJitter = ulMaxDifference - timerEXPECTED_DIFFERENCE_VALUE; + } + } + + ulLastCount = ulCurrentCount; + + TimerIntClear( TIMER0_BASE, TIMER_TIMA_TIMEOUT ); +} + + + + + diff --git a/Demo/CORTEX_LM3S2965_KEIL/FreeRTOSConfig.h b/Demo/CORTEX_LM3S2965_KEIL/FreeRTOSConfig.h new file mode 100644 index 000000000..e41bcd6a6 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/FreeRTOSConfig.h @@ -0,0 +1,80 @@ +/* + FreeRTOS.org V4.3.0 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + + Also see http://www.SafeRTOS.com for an IEC 61508 compliant version along + with commercial development and support options. + *************************************************************************** +*/ + +#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. + *----------------------------------------------------------*/ + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 0 +#define configUSE_TICK_HOOK 0 +#define configCPU_CLOCK_HZ ( ( unsigned portLONG ) 50000000 ) +#define configTICK_RATE_HZ ( ( portTickType ) 1000 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned portSHORT ) 70 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 12000 ) ) +#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 configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 ) +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +/* 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 0 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 + + +#define configKERNEL_INTERRUPT_PRIORITY 255 + + +#endif /* FREERTOS_CONFIG_H */ diff --git a/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/DriverLib.lib b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/DriverLib.lib new file mode 100644 index 0000000000000000000000000000000000000000..1d1d80ec76a140e2e07dc7023bc7d4ae319e458a GIT binary patch literal 1019382 zcmeFa31D2+c`ttM%t#(@Shm49#K1KOV}miHT>=9djb^05TE?1@7cd!(rLiR}OR^R( ztY%3<2uVmt6VlKIC`pr)BtS!*wvad}P5N)sK1iTTLK-K{Yk{PVT}VR-FTCIPopbIz z_s)!jZNSj?KhoTDzWqDfchB9Iug#734_-RwLfe}n1}Mws*0!r_8*A&Br*DoBf!l@1 z^}OwVR^)fZJLwm=>p#R>@e9toL3nfrfnl&hZ`HjWv-1=D|H#@`AYcY$K!D{-KS% zL*23d=-$R++(RRi6U-h>v+}9IM0%jEwR-bZT`~5Z`JFp+V=U0NnFX?ABb8I*O>JGZ z{lx?(_l@PHfwsmf@@GS&BQ=?A+p&HuSI{bOCO=6Qkpq z@uBV8r9?WvYbrm|?=`NGt+~luTYi$1IVjf=jdH!w7^>5@;n6*&pvF11(#+|}{FtZe zn$SBkP^iX1x_U;pO-|F0=>oD@s{*3e8z<%+bFl2sjc~BsxQ}Of?arQ>Sa+mrsG%@e z5-UZt%1&l&S-*3tzN4k10};m`SC2MWYSr~E6n3-YdwM21H+OZkWwsUzW^(4ilbL27 z_9B?$da^-arpYD+Ms^R$*xkD!NA6@Mdxo~gdUDSPeQo9DUA;}!-iG(jc52mr%=4N0wwN46;+Z+_S&7io-0XRDg$*Fc05-@faKy+eHk=ve^Vb+C}XNsDZ ze)i;Z0~A%Eo!lbODNc^>Q!+hyl$8WBPtBwwigDxk&}81w$1o{;1H$p>&M}V1dAWE^ zZSSm&G}dRbqrSP0$k0!`6p*KCc}X|a5zX&yxMFL*p>RQZ)B#!Rjx@0D$$fijYP<3q zqP6uWA|k(uA=W=VxK$}?&eQ`%1u25f)E$1o;|rVIQLs8wNBOOu(75^L$G#ZaB{!a% z936MpZZ6IZNDdoNPFymPIy{*;H%ggU9jr{88M7RGPktMR83(Z;H$0W6;35M^Zepir zJttzR-u|(Pp#fdUQ(@1xp*JAl993Y*PY&kCNAi;#p*r{QGO(ewJ>Af>ClO!Y=v|E< zLOJ{trK%@5l3d*~wrlsg?YkSn??1-InDmJ37-Nx|`m47OG;~kZcmGcdK4>GoJ4OqY z-W?a;lOKEFa9WuH-Aoqeyy7U-{tH~+j9Yqr_hC+_U=t!qw734I?>oylqNBRcBFOT3^pu%0t z8G(!`|4a{YN}@c5U4M-`d34d*5XIV?wISWd?>O*QK`RX21N zE*vE@#pG^zZm(u&TVun{?Wuj$g)tlx*5$7r;egy<-O(G5U!BYL7d;@B6BO!anxF`O zP_O4C1ZJ9(Qb11!2*f5E=?J~MCSSK{aQ)c&iGgA}mA7#Dc=A~Gd?dJ7re5$&!GJj3) z=6!`n$(Rl<`yhw9b?NG=)VgcBQjPgyk>$+}b?=DCCA$MNai;F@&qUeS5S*!R{DMwL zk?af|RYdm0g{?O~@U*3p-K|68oudPML}`FDQ3*sS%HVP!O?Cs+)KqT3T|pAvK{y;k zBTh7928MM!b1^ESxd;`|6oMCTs!aai#2ovR8X95HIXX76$?BL1rZ#q(;QDyd1k-5` zi1U;FemJ-9tqzWZ z+69h~t$R7@<*T<1N7{yCV?Ff+N9nErg~`S!3si3C$Zp&*IZ~f0dI`oSa|O$cZ=2}o zYMjXJ=q`HETFyF{c$1ceYHq>6OqWHmjD#~sagF;#9jCj^Ob6;S^<_b%b4CIksn680 z1=4%6u6b54LoXLmAiEsKXX^4Ivih(9(lZ?v6p>bgfrQ_rYvjjqsNSwSCPv4c>HIKO zX2L=0>%SfZ1z#7TE^<2v6>1$A@k_2YO^lAvCa#E}6ZlL%6}nB75e!}QM6`c$2un-{ z(=ocICCAH9AIejqo=mL3JK+4@0Y!T)M-$-A++_b?q&U`Zf_bZo@>cnI{V;Ax*y)!f zoR^PoR+umx+?diPmXcO?Mn()UCiN4&?X6%pA9tP(WhClH-Ex<{&IY6AcJ zgo!X9EX*gzM~7Xq-c>mKgrGB$E<)`p9E6IgE<8T&a`TB_hve)ssJ)@g27J%&~6iM~UKBI!)M z;%_VrFMVtT>C#zra zVg*+hqEj>UQW4P;b;!z{372Q;Oux&zs-=4tr{`L6iMAy-GN7Y@fl~1Rm_%-Bn9jM$ zV^#y|C7@`!T- zbkr!7NtogmU??%P0&>*>aGmI$njD*&g7Q zU4*im-Z#=uXF^-((i9{J?j0K-`Tuz_b60+dV`leuKIlze-I1xR>Axm^dC_~1-rSf; zzEI5ECf7*G%FT5dt(_C&=@?o7BmQ)l{J)>SRtv$%%g1~dS;mV>i{L!%=!p&6D>+MuW+29?IgNBJ5p z%7`8^j>@tQG7@q{z~;n0NmDUL0!A#wUJNa|B&KD2bk7J50A(O` z@v-3@8*u2kZKyv-i#E9$lp=h=nO0i{=nA&x^JD2@Y!sRA_)8C6!`CpSM6x>_GnKo- zZnWhJ0CWPbM(CKUVK?k*jE=k-HiECT-_hFbuP#t-jR3eVb(VBC)zMMB7C0jIwUNfS zYUwzB3{S%3h9xUn8P7jT|6H2WnBHb6!r*BZgRb{!+!!vt1bb>cKan5NJ?paf09}aX zZZ72+6TN1JM!fn>tz3@frY6+Wn6f2YtlK+joUZhaCpp}Xf5-YJpRGO0o!^_jFPj|d z-@)to%oH!uH|@G&xML{WxOZ#e!}t^XCYYV>?wXR|JcIQz=XI}lC+T)kK6@D5$Y&4tH6*i{Jsrc*WP^9o zycO$L=?yJkhvi}1#$CDWhJ5$tt0!s;j^JI_*RSXBaCO(vx|Zm~&TX~6yM6q_@Ev*v zQB@doXQsaLSNH@jBvqHf>6yCJ@3dRp(*2vE;p?7}(;(eH65mbh1QXMd-<==!V6YGy z_G0u)d00+IAO=)$;j*&|)R2c0R3Ebwhcv%h0cy|)N{s3l&GDMp0Vo(Tz<2l2Qp1HD z8m(RWbHlujWwJ(ig*?~-VF$5(Y6$A`(vWfMB5QVUTV(Kma)3OVcZy-2P36Yr8^yBq zd`R8YGl6HvH*Kr#D!hU{wV@I^U@LYi7 zc6A%a((PAQ_im5WCS&V;y8-_!eW%7!*{ujmM|`6%dP8^k-CYt&dzGzn;sE39ez5P+$RqvyBY^t5-np< zyadj>F80ru{}%(I+h7PWGxeaq!Hn)ahM?$}rsL6>`qppS5vB-Nx}!I$0jh$61`!zK zSw{m=$l}BfgG69c6L}}Hd5}Iod!|N4 z==7fEfvMqP9TGiApJ49@J>28SISau#^n%n;<8umCRgICRrmC98Cfhc@p@7+5Ute$A zb(mPS>Prg0?(T_MmL+tuL|C|x5Rcu%lwd7qD@BWSnH4}ej9j3eJ zA@ZsM*5MCIf!tWzejn~;;Gl6~bCs|Ihdwyiye#~!zZv{tne}vd<*&al{l0lCc+O6R ztwUEXYYvN*zj?}Pk7Y=!5QiUqR|k1Cu%$V2fAdFS=l-4g&Y&%b|mWD+jFu`9Z+ed1X(=21Bn{ub%zFykM+v_US!m z{PR+^Ldf?8xr2u%|V&z&p8sZ^xG(v>0@ zUIya3xG-Oc)8>Li4hr$^xk46}5l)EHAt27s^r{LW&XgQfvJQsF|0!&F<0dQ>fjD?(H+hWj-{shubJYb8Jubs8^3{bGy!YgjCZPl!e; z2+_0#k{2zwctO*GVED3m$tALFF7l!!@?sa+ruf#nC@F5k>Lp$zp)Pe%ZA%DonTwEu zLNt3(LPT9e8``SH1zlI0(PS|%ft)3DtBaQI5;E>04JG)@O~OlHB|x{iXr%Co;;kEN>(e#(0Ke}B6fvHnKr-8Db3PSWO z;qfOsOo+4usUtI|vL@>FUMf;ygTx83@l+lwn<%bqUdki+idxnbn7tZ|S1JIWZjnX8 zUL}h{yhrnrp{xd0FCef_f#n3`Bp@kUB|!N8TG*7P2Dk`Ac`A^ZZB!6qdl_egl+oNB zDpL*$akVN!YKJTeF|5g?f2RhdQ*4Y2(6LL`fLeH50+-EO3t&P5%a)K| zlNu0Ws*We+?u)q@_go^D!r{FOEegLv>|3h}ygxq;ZTxQhmf_ceUr;n*i-A%;Um%R5 zK*@?-v}Ij>Xm|@=nZG6372DD=g;%lW#`kRz0!K6a3VK!t88``vAj^eLE-C1ULFI*+ zLA=VOwF1q`^uK7q2U3$DN=Kly=`>dp4u=p zfs4-4EL#i0`svwh`^GFTYG>QCSzB0@RP4sP`7`OX9pQHr(8(2Hog)c7NdsLgtQ8WS z>~xtMg>|mNreiKTCajeb-JQ-vGY+8&%2!E3yt8+ci--2}B)-=x00ZYsLOPx5NjehM z(6m|-Qn*FP#Y5l%B@lHzssZ~Ntp}DPjzBFa7ivl@(_v8HR76t}$waq7f|V+VL>?P7 zRK8l%V5-V7RS#1&ngUY>1*U2>g-jVFn5uI~WXhnyRK2FbRJCKO5vCe61*QxNOf_l> znKDQ))#Q-KltF{3i!=?UY8+Ehn7UX~V9KDt)LKm;Qw9m9E^$a?%Amp2rIMEE>}b)3 zuo4$mT*<`OYjlJGYwaq7;x+XigW|Q5CrYw2+Zj!-^V->FP`q}w8x*gdL4)G8Gs=`SZ28)6%q4iO z>~aZSBjYZ?Yhxb~I67s!H+U;^jY;y_xz;3kEnR1lytZz!h(-|)n;LFDHD(eVZ*TR| zQ$5|WcskwP;|?qg*7tguV%?o7ZG}!r3G01@4BA6F)i12~7c%JD(YFJHb(@zVz9|#$ z>5A%!QOi6Z@bYAmopJ4F9W&hSWx$;~+Rb{Vf3SeAy=-9m9R+mlB)w%&SReAzqa7Qg zo70}={IJP^SF2*Q>Xt-%3+p3ZdhzDI)5~NwcZ5UHM++HrMIvZ#VSTKSLDwXL_7>J% zUIt%tBd~$z<6a)Kxg%(AVf~Jm!D#LX+FMwkD4;uDqP>On$pX6LB-&e8cYEoc=8kZ4 ze#+#i@-#OXg!Q{#dhzD|w3o@#+-PrM-BZZmR0QoUtlukSaB70~7S`{38T`%7JCe_M zc|6UH_7>K?UIw$d(cZ$kuYm4)*#P?e1$5U*+G+oRm+ozDZq5fxj)=FpBMD)B)=Mwm z+@JF@d7GPdDSueV;8uioNS`lcaBC8&5!M&H3Eny>wr5Q*(aB%aLwRCa}X7)1y8uCw>z{_5I!NR*I`ZEvBa2}4V{m9XgdBPe4=Onf@x`5O=C&q*&E5d zz!N@(s_cRmKcga6A%Hyq?x_oR<*ILM*y zDIeW%kR#pqJam7Iz})=4kHPQY(>}WCAdR7Ce00-63J!noqni#=Z1@q=>A;PKpx!x0 zXo>vKCdoVEe{7Px1OAXn@{ad^V^TVbRr!XtY_AyN6nDnnlF>FG;0inJj({dIvy@CrZNlwU?t_ zb3_!2uwM3Z)HxiAMOgps<*0QzB#W?K@p5?Lh+N41#>?TI$h`J=)yv_VNwmBCKVA<1 zP)3CRt(T)gMb>HzrPsWqdQCzP><`e2oR0{p73(w!CU5eRYIUea+u!UZnNj=}FUbh} zw|XhYuHwC3N<>+L4=?08gTKiJM>eZkn<3yu{IVEA;Y0%?tA} z#DdcxY7!g7Qqv%1oB&5nDy+{Kv}9ZdKQf5br9p!|O(cU@S{g)$Lb!Ja`x0RNIfG)V~jk17(K`pLFNGf^Y{ zMIto`tPB67fW=uFeqEF3-}t<>pkk1r!=KCY3w|yTfV0$ znY7~~?ZdyX@w}5V4!Uy#*&O~$`GHyJ_Bd4&&1EhFNR-GT!igW zo`;ur70EN=I1xX=dax1GpNCgsZ`g_WpmQER*_BD_6Y+^?Z$~EE)tR(0F3*urdlc(t zEG1S*urt+bV?>`Tp_bmXjitg$3H7F2TwG ziAZ5Oq&L`AP`O$OZBA#Bv2}J8^wz++EWL9%YF9yRtp;1{Ds*6-24i*=db?hOt#(xt zPCIKbZqw*#B#`bhi`dohr%8iVb~U`Yh(J1jUyYhxtN?HVT1yb#BWG8`$4e9d5}->7 z!m(hMJ-4gj@ns4H1~}ZTAQ*waQ3X}ov?^#J2ro>qtKn=+0T2V!N)Q$X5t~-=aRpV` zHE=wkplZ7Yezz&8#;$>@?F4O%W@7Dl3eK*9he^Wl;cO&o*TBEaT||pr0~gmhh$?Wv z%MKR-4mjHBAgaLu_qtp}i%sFQn-KEYy%sK}G+1TV!pHR*thQ_6WDkMq&G;rshg}O7 z(*!3vqUmlEL3j;$#IA!^?@Y%Uvb;dh8qbVoqQ0He` zaGAo5-e|FN=m9~EmWwOeEv?W4T$ALYj7aCwxXGrvd$6Na>WC=UG%Foqi%FCxi&r_s zm`RjpiqCV1ttL?(U7Sw`kA^Y1xLOTtq!4`p4Neo?#LK2N9G6UdjPVx|-oxL@_y`Yq zlRwV*DvV{?qhjD0M72z;CStlHx*_hN@!G5gG(M&&Dp||a5~6h=@&S`iRIV}VnOY!< zo7~V{4NkjyT$0_@=nxa8zp}fU9AcYEl-+faLv#ieR94IGx|qVX+g;VNyVfEOn^@WW zmjG*aBHD=Dz7%M)Q>taBTqeV;p@vQ)fxnpvrbLZwoG25jO$oWeZjn*TB*;@zF*;gw zy|0npw^Hae(bCU2MK1$Q?Fx4iK%36+_d>BJK|C{=rRsJL%-L9`r^6s7WQ~(Dikk#E z4lhq;oJJ-LCG2ThH)b?1VPzw9BvQ_NB&=+K&aMqfr>2CaAND+%RI=C5A*)0|lVauy z{LaO1C4Q~=1;xeK9%al_&x`7ic{l69MuZkmcb|k7d*i}o$O=!5Obl%w$q(55cvL|2 zOty@U;xp?bV&OGb<*8;o&1_D^^&;-v$?>VYjosb(+j4mS8=WJrY2VlrZ(F%{mA&%3 zl`D6T4(BFu_lE7LA08dqZlAXb469aQS;gG#rP(J2@l_0$zk&H%O7oNVE_;(?Pi8i* z+`D?~DqH%ta;3)`^2J_(-2q*gq_oPuj&=@eHvnK|DG4wqD6O*BuC?n(Zskgt0Z>h~ zTdU2Zf{yw2lG@&I`r!(C>oz$4J8`O+$O}3)N zSJ(!a-GH46UBX;tUvfzSf%=F0+-QPdU^3iAVT!@HYOJMCA5IRlV-QaIjomo&w!cMx!4=x zTotw4bzbM*fR=k>oTHX=*7N6K4{|dN08@5YQ z>vvj%$Q$?gR=G@1vaJoVq4)(}zG+Ug6kgutTjxx&dn%5u-|!uDCfPYNh_henPC894 zdSRFEsM8$0s&Wr8a9GE;)oF6UMP0tL&Y&8;;ZT(Ctuv^GYdE^&`|C8d$mLwVQ%#;$ zcRZrAmVBQY;gjyc5FKLkO=^V4`4UHf&TH@;YD93+bV}?p>Lo(Q+Ksb~AT+xKqdr(J zL|uYW6?8(2OVB5Rv5!Ub^J-MuP-moRPmN>eR#!rv8YetmM(5k+qy(R%XFOd$=NsoF zfi4zEJWkR%^Jfi4`i1yK@QdOX6ph#(&HPahoau!fq<66%Y^Iw-TI>y*Mb5g7&xNU( zREOPJyeG3VzjthWm5pknW}+Iu8vN+_ont!(U_3Ks)ca%5r|$hNy{0uq-?+MmLbE*U zJP`_&(drW(Iql+{IFW55+k&EH1Af%&^jK3++=cDY^nbc1wuJ&>Kjb_&L_3dqk~#p+ zsSgS2l|3LQ1nWTooY_tQ;gj_UwyJ&Sx>k?B5&MlByn8m(RBh=%IS6xOHW9d}I1v<|jBb&!xXLZDHXxvbbmx$4%yET|PBp+qF0o9BDWUu4nngAQ7tS zFN!o>RNEx6=?ubVmX4ml!T^@N>11~oA)A_NBTXGlinq2oY*co+YUsiPgeUN(w9#$! z5HX!DcM*K7<-v?ijw_bj_)cXSB}acI+Jl4hY_uoVjty>lXLTkv)85;OGqENbB zSv<{+tMfHktSBQ&vnhv*_Filv9?kUj#IxN`pocEUvp=2~wnk!1`#Px$@s$+9; z!Pf5HmX3I7#jVK=$=0|}78OZ%Co&rnDMcVCk@7c>cCHsUiYD8-;@bCUDn|Ds#5cq{=n4pW4GkWP>F&h|_z0eDU;?nz8IHbex)awr zaIZDRafP1bM4pW5k3%Df5bxY{daN2)G%}tqm>DhLLrvp$L)rO z6TGkUIlx?k$C2a<$;A@zx+aQ+^#sKAoS)2kuMbmBe1ta>9%jOb?4j%=F0MDJvr7yzoh;=Twd^zTwuuhppsd@xSBanZAelE;lJ+7!_#5&Sy(oY>5;aFl%>MqDs0%W@1#k1iIJ1)t!4rhQGB zReqZ6>wjcD*u3R&fWj-K!oL22W&N4%YxN!p?rJUZdb^tLRgr!8EJ|)aE1hJ#Xg_N^ z%zzES{(hDd*)z9^?REEaxFG)f`&oL?1*J#V&sOlqaz2*@=PoXrU49Cp{;AyMr^qfB zzh#}+yybmfK}L}Z`n+X-0Cya#`K?}iVqrZ%Neda>PWK%Z&TyXhTk*lQ9r*!K@j>v= zoX=*nc;Owssl@Ax)JZ&)_&z2%Hqa=>*ig11SA1+}XP5ySg8gGdt^;~B3*{2!87>98 zg5!(}(z9cU{~r#h_^)EZKfvJ=6aT4AC>4y4*gsj;tpPPYC z_aCC<#ssO8Y!~l$ZAfy+<)6RbWsgqZ$!nmX)S7VSm>|74mOlQX?qju&r#;_^>0`Yw zE9~PRTe$I-`dF{&%;2xZUUyH+dxvCS{{*#FeeKgt{rPs^*B?uNf7{pJ|NJ)W??aaL zn5Vz>0*t5j(RcVcsH5!fpQ7aJZ><{?N^kc*?}U#>yWhVl$j5r8Ee>9bgT3Ia@=JKP zU#oWed?bBh<~-e*LaA`hzdvB@51Mn{eM>Ko0xfAw`^`{PxbwFqR==1RYlnoy=ntyW z?!N{onP@K|$I5Kj@r@PN2WBodRXibTC+&GDpMHgRxYw*1|t8h%`u)Z(H*hx5_5S)Wwv5^)+ zi=LQqcAlzf;W&F=!1|tNoTVr8V{Sk5SkuzRShJz9aI6g|EL7-G1tzJD5NZiP*SqBy z3m1+tuYGV9k4f4mX26E@>2XFhbDWg}CY*5)LhN!`(nFb~dR8bBl?KsC{&mdpjX5&l zj=5vmmwhax)~B|NWWRyN6EnW%s5a79?Fz3%m3WQy&# zw8v1uiC}-<6VBK766NfLj<@fn7st}~-_?DuV!^BM^~ChOo<*f&!EY_=Tb?n{J2LP_ z2LpEwoPvX`w{0zyAs6>wk%QgX6(_VCU$LdCGzx zDx%VMKb zboKRiJh{f8#WL_BKTdrxNHToGMrg?7loDblVwnubHZYZzNT3?7VZdG&&oJ5 zx@~e#ZanYa(BeDl)jEt}K{s3a1Io>OJ0`H|ei$6)k|e?hzs#L4uB2&MfcGflCrfm( zMemoU@q?v`k0I@yVqu&9F+}l1-LoN2pcwllc@4-HX=GS&xQ;KTNDueHhoc)`R`8B; zK3}(p&!W&7JM6la(r)ZsrG&o3?^=P+-otr+l zM=gC~;?XwMHHBmF&VcoSa^9B}^u71&2ZtxE#~6n;R2PmzI(m z9;Y`Fge6(?yO80wqp~($mZ4nMj8ldf$+$EZ%4b9u(Pp*(XRXaW1ZA_$2zG#y0Jbx_?1}{uQ8fwF@SY} zUJM`RWwZ9fcN31>-mNU%0M1i{fy5ZhTe`1a}&mC{nvkC~aTwM#FK_fGxj_|90&zTkq1 zvEiY~>_onwK0-bL1V2JyU(jz~fY0;b8#s&_%a06PLf`;{yNCMom$Y_t+85yM;1?uI zJ%4SxHwwFzSEXMYH!z08k=N#&YO4*KAb54L=8nGX*5;0hl++XpZ3!C@af z%LmW(!Sj6Z93MR22cP7F7m8VEA7>{n7W(LmnNHC}ro}$`BBs-xRi;J4QteG^v!FOd zoNF8u1!3uVqkn>;T>QBQ4vN3=z#;KP4{V7ac;GVeNe>(lOFeLfc-pue7!)u^ejmw8ug*NP2{scZ#p%ble{@4TGBA)cX9}xfUfj=VV@EH-Q!4khC z&h@~b7OfumK9Tdle<*J7z+V!d_P~EEemz%vNB&2}V&im$CECP=9=KDi^T27b-2-nH zw|L;J_>2e6i$C|kJH$VD;9cTH54=aT8U1C68^u-+{9bXr2mYYA+XH`8{ILiAr1(1z z{Cnbg5BvurWQ-q6d_kP)fxjXy^1zRZ4|?F3_^by`if?$}Zt+hZxL3UBfv*(v7nuE# z6X$y1?IP-dcZw@L@PwH1!23l1LQ~&G;v*jVP2vk4`2FH9Jn)Cak38^Q;@2MdQ(|F- zssA(Ld=LCt5%<7Ss~&&XihZ8??H6}>;P;6ydEh(5cRcXN z#7{i%-QqVM`1i#rp87l>F7&`(6iE;Kkobtl-%G{kJ#ee|rU$-U{J;aJ#ETwygP6Bi zw;sidE#e#xyj5K4fd|D#4?H5qJn*FWuBZK)#0Na|Ys4#MroDPmU2ekXiBmoFHDWcL zTT#gpr-?`9NeRYS;tUa%i$n#VC0_HuD@4KrSBv{S{@ft`+ymb#p7y}Ei+}gPcZzaP z{XQYi^uYIsMh|?y;Dc|+|Idr7J@hY&TRiYr#m_u&i+I%ow~LdF{huYe#A*+m5v?Bh z3bDll_lZdlyiMHUfrrHd9(Y_l=7IN$1)lhNvDohEpGI-N2VO1KdipCOZuRuXGSO-5 zfGr%9(p}a%S)x+R_t000?`k4)3r}+2X6(-`akKcG2fj@_;ekIae(Hfgj*slQ3N7)w z;tUUbuUPAWKPRs6zz>SO9{3UQHP8OISv=!`6XHKTaEDmn*)9tWQ#mMkJsTHGx9TRf~~$#q6R zELr+s0A!%?L!pe~y^OgygT6#8S_19>`S2-b;|INP0>ly(;0lEQ9wSl@`9&)Nr;ruw zqOB`I#j!0cvAVz*ieZ>vq@EhGsE3w__p(y57nrj|L}X_#vasp}FP0`7A$}fztc*kh zCt)GC z$V(y4_*aP!;56hQ2_c7DoYRO4d>x;Zqx`dS1QNW9;Lo}61i^pk!s7&gUWnb4f6&G6 zB=`?pc$DA=T$uHIL5Mws$1v0OSDQoRD+<*DL#g+5YK1`+(U#a<+e+5Ewcl0Qf`0keJNZ2x-I{(!mtk#qawmOgHO zk$A8atSL;x_43*_wA zJwkk)@W`K5Iolml`jE4I@N+`W_A|;pV77mb&pu$bkDTq_sKx(h{ed1%$l0Hb${)b&&q|*^fY~49?9a{055VjP^2f;Ty+Ztr%73Er!z!ou7Z9EO z+3Du&59B!^XMZ*+e*m*TD}4R{W`B^gKer0;XHXCT{B@Ooi}DW%@s!H{P37g3k0^b} z**@erA!qw>WgjrxKi6j;FxyAY_QzCv0Os~U&h7DG)gH*XJ&?2gE8LvzgP#*}wx3Y; z0ki#8KKp>#K619dONc**f&k!esQfP||A-LZQ~7f$XZu$weaP89xA zRB;h7$7|#V$lk|<__oTQRXN*#kJ5*n?Sr2aa<+fDvJaT;pYO8|nC&BH`%`Kj0RB4J zLC*8wE;SF3{~O_vzpQfhBdhcxXFnjv2|4?*PWb_t{lJFhU}QJx0nC0NXFq^s`+(U# za<2c!h2Z@r@}H9&@>f(o*OD;n?Nj=Zvp=50PXPpdsJCb9_g4V@;%hne_I9HMyHvqp{w}4e7du;cQ)j)7pg{mow|$fo-|!eH%OK zYihODHRJi=A^Hk(;dOfNy(rT#x;Jr6!=$hJv$5$e#!7G0J9~V04tr?crwlx#60YOL zKE``iJQ8jlJZQ(hV06I^haP6_kZ_s-27B_`hbAU*)2oNo(;E6QVEtGqiL042Hnnvm zw=+NCl~&Ip8+^I(+{kvY8K`aJ5EN^0(RfX6a&mlV>(nGM(A&&*Z_8%~^Eo^KUQ(*;=`-GF_R9S4J=D zsIKnqsIBVlsIIEqbWulDRb?8OG%#sklJR&P+l`gI>3DiWedP`5%(~dRRtYu$Z11S- z=GT%{##^F|l|AwGjg_gMc)GDN9&JhPu2$h>`}kN^RZcZbr4hg?XAWRR6by}E(2P%w zO|BV)f|&wZ5e065BL`*(aK+`}0|FkzX9{?RI1P(quRTj2bJc0Y9=mOpK4#lS$8*$0 ztIZVni?o{BB^_Ol>1rR7u=ZQ+f?#>3T~HCXk7b}}ua8Am53*xuX>IlxM0HbU)mmj0UY9)$6`xa^hKdiJO+&?Z$EKq;O-IF7yQY!Fx3#9B)=%qILlLjkniP$p z2a6FXTw-IPRfmWV%@w%h5b@Qw(nNfatuzrYai4}bokRHISZT@n=^Sb(;*dLDrt3C* zuCBnQBZ=?Gl_ug7Z>5R&3fnZq=^Uz`&Y_0s9BQ1-p{D5^YAWK89tn8$enCwf+BCh1 zPwthJ!`JXi((t*uk~Dl?t~6~LUmB+IrEwZxnu_?M7aLVI-or-cU{)S-75K?VjF_%P zI!Tf6^~h3E_{?J|Qn3N76c!u4id1ayDpIkbt4XEZC^l@B6b7y5@LV6s%ZBohy!)6E zRW267rKw`!TTx1SUMy@&nPMSZQi_FZNhubp6{VyHjYVd>lxZq5-FY!rg-=Now2q|U z1EVD<`21%H3O>GBic(}&NjvyvWeFL4RI&u6zN82E^mu^`FC(k)HH{J!%)k;9eD|~z zrARMGJNP1K2^oB>vjhbn(=0)$FX=&j5f4I00WNEl$8^ zL`x7#8Luy8yrGow#!|+cN*Qk|VqErCsm{WeX$$JX68LItaRR>MT7podqgYj4DdY8} zj5m}r-dM_bV=3cJ#f*>kW5-gYb%%+7kK`0qkO{?Fmk7ni6{{*Xu9#44Trr{8xRQiY z#*2+BmMA%{idCG>Rh4SnVoi%`7YmPMxL9yxe2E$q3yj2HEG!bfSWqN<(U3^^5_TJl zOi0qxRO{XS`j5c;7Xw7`&m!=C`gNY7?-<%zS=mF1CnhT^aZ-GEXsg!=eU#_f`|H!- z9;EMVxBn7D(ti;E2#+4XJ{9VOIa>i$E<@ZWtJd(D@X7&EiL1YOn(#twa{1iWAz|V6 z5>XbzHzD(TFX*hf0GHh&qI}M*&e?%Qfu+{FtkbMBf(uBdr&I8Ke<1*`BZWOYxG;$) zi0HbY{=mUn6a#z%CLuWy8CP40mr{mr-9rIvoC4of1!TjlO|!aqFwX-Nz|~481$Bw- zzd{f_agOB3(-q3w7=?|thvIB{|6#eqw?f_%s2SxIPJ-?xA+VBdBv%6}A%d2;m#{jq z8@SQb@yjGUC;{9WTA)j@m4A(&RwamTAf?-$4)G(cDDsV`)Xq~xFcLF5)y4gj4(;dC z4m%~Wb95icid@00vOg`SF^H9}0~?xzWfM3@_OoM5h)cnylZ7|`K-RpKo=K!xSh8sp z?=nS@U@e}ODrhnBOp5J5BXW{vKV>~wj)tppMJl(%CaF+im;RFkhh@gyNThNx_K+hg zRXnRTY1ZF@8(Qh(Ju>NBGpN?VJ-FrKbRe0I!FH0vU=&pCaHA6^D`Z0eNOd18dqyA7 za*Rj;s$r!R;q6LnL%647A)EU;4NH~KHnL@C8{pftq^>f)l~r*iruxDK*eWCeyws{P%2B#w4Xm}A@=zs8`y^DU#F4R^j14?X^*b#uV}zfiqVED%;CbEfCO>VFVK?iB$g3ST4YB|2(i&aXD z`J7D+N|GQoeT^mySCGa4C5ivG5Ibm6uuIgj&xVXw2?GuZJ;0Q{nqR=ZgP`aHMcP|_ z-hg~-B;qG{;7OY4q@{avsZ>F`r6;LKE;@r%($rQNSSU6~`g7mlKF3_CPzB9?FBh0! zb%S-VmJGg31fDs6A|ARMWu;SyIu_xLgHupS-i|~NoLjDk4r@NhJl+jH0LJ$(F&4@$ z5R)istq(i|KkBdZifAIRHuXH#1C$zg3$q5DQ1>W2vL;z11_&LLkWJZRTvn3L@_WvJ zQ80A{^${gj5!?tG5tU~MN=7Ch#$p2EDiQ6uqmnw!=hMp+w#Qqqfbkhh{k zX1u+`C{vL=paL}?o3wsG>z7u-DK%6)m$k1nQG_l?HesCki*-;+Si}6B2>jE_BCE%h zQ?+FT*`o?R;gU68O)ylNl@MnPzstOwCj*pD2M-b@Xl-%_1|dA@NBHop2LXWU9YiN+ zJLx{X=Y9=0@F*tDOklHV z0TMyJZ?;Ww>fTl$4M*;?XEmL33mqMWt7kh{X3`M(Vav{EABLI0EH=5+N(=>wk*Xs# zgRTHS<1!#!0gcJ`%8G&|=&)%yQ~5yx6rqPX9cO|4naPSU)94UsXvqBuzL3RS)EZP; zE6#SLsH@EcaiDC8B3;9f=tC}5NPMX+J!wfYoS9!=Z6_ws zpQF-20ytSQSC7UCy)=Q?PYKCtRj002T$X56OG;PFX%(QPceqWx!l4h_jCTAEnoSB$ zL@-6;Y0MZ$7zK_cyc50gZt7OJ<>(?l0HzGe2PKw>NSgUsNUoPCbF0aCI@4`OIfEm( z&0QyElhfw>4vnPT93PTNj#;H_Q0)S3Ekl*OO;{b0OJZHa1Unw7m~42_fjYb-Wq8Z$ z4BTAa?BX10g|fuPgRXv137}pj#=FCc3pyxiVZ>S#*jyG(o7V3520un_B%buz`pZpBBLYzsXvK*1zupO}+22Z@bSOcyAZj;mp; z)~&?e{hC`{xte7ubJCv2x=BR}G&yz@ig{^M$@*<7g2Xeq)iRcR(mY9fC4Z?17|@)c zT`}xe7zuN|B{8V02*#LZ;`|A0N!l^-oF?mfhk4l}ZC)5;pjDvF{fRX=8_93`nEaYY)lO{^i4_TJmgE5VJh(E0=g{+Xv zV|az9RAdVFYOKx~ACjTEH=_BFI}BXlezn;V8VbGmU8EiGa`IpXSta5G16Np0XHDWf zc!$h*drla&@0R|X6$k0aB2xlv-S|Zfa zQiH0elhmLg+9`?6sGozT0%W*qn#-5ps;DeuTRfyUKVUFX6bw>m^z`ax#ld2JxEYcT){}gTY~=uKkFgZ3XNBICx{YISs&%CLI$WSC6a5((h|n@ zN*cEsrE_{$LQvS6=}Ii3iY1!156bp)7+Oe~14$_|``nE}IYEabtA%w?(r9bBB=*py zzze18BypSBwNgydwkRHk@K~NN-7V@`4Yk9<)(qgao&-RG28Sf0Kd;ipCFU?O5igB1 zGx4nD9tBk@!jg?S-sAEebch-4ax<12txwnt;N2;dC?fk9)u`^fPVyDdC4${1jvKp0PIDqp;fGz4W!)q^ zc+H~i8Ac$u2YB8C&(it~OEFHr8pY$>rB~Fd9Gi-mQK>QefklO?fX}sS% zfu#axYjw+_)eo0FLHZYxFo28>1P)42#(!OAnjRSj@@0=>A0Hr)<1_Q*ahB{3mm7vD zfyFq=%}XSZvSC1l)wHC3>RF5)h&UCqWo+r>%Ez@A)z1K_XIVW&!}IhiqJeOzKg)EO02<|XHp;+;)7EFPeIO3Xe$)Bpi@ zK0sS8B6rVAh6pVdLeP?DjGrOlFl%KJUuuyhewoN)WN}KJ{Ce;J+h?=jQ4NCZ6_N;t zp`BeJXzGc@*lJb;!*{E5)CZ^@-=+EmXUpmkyPFOK!(ukq^+6YDoC}$Pl{3vlq$v^n zg*e+WEW&&#RK9CMYoJQvwKh71UR^rd)gF{h5j;TE)adhf(^1%L)iTENfu7OD7&suS zcA@J@h-*{H3Tkj+lCEq~n!Ot+HAa;Ky1i?G-Yq(o!t4RrHM+?(M}v}}3?>JVDOGR- zsp3J{;UTOfCdodRq0oEM&^{n`&(@BxW$Fdu<>t|6`A{($c8}r5DV);XNV1oOxK?ES z9!bac!LZc82y|;R4_`piNg;m0lx8$3Vf3hg5S$zYCLCqIUSc+ERAcO+C!4uUFVSSf zvYOboDBjSuRD~Epd!TYYCy{UXs09vh_evZ^ zB|-{ut;A4#QTC{SqfpvZ%ws(V*b(VGIzao9A{O-iGDj^brK8bGU|o-O_uolRnUHX*+QX^T>*V0dp ze|OOF&w*>TGm<$-+&Tqm3T}Wmd)Y&DIFfRm*dW4vPH6HCBw6K+o1o?aC)jbF6b*c# zP2hz`uSyXztUT3yMl(sR+e30N5AM^|HT=8c=R6M_pGfFrrib@Y88)B@t6zAvFUS{H z&{3j7TO%HBWyt8p49i+d(rU~`Xqvr6g1kK-t_q2LIFVRusNq?yn})07tUvW$s2NVM zZ`UbhL8!hp>r|Z_7*r(gA1d>1AOsioImS>U_LX#Thl1mzvQQ7Q4bTbk+ zYsEb(`tlSB<3LY(?+ogFj*5Pkk{j8x(Dz_Fd+=3qfW2a^yb-}y!)WY%vZ9X5U>s;> zE!PNge#D5S+Lel=A2tl6HV+UlZU4o<%NwrHYmEi&!Ylw=n@{nyt@oG9{f`tWk@}3lw z&Z`#>nH|zs42eWKO#9f^ z0L3jK$s@>UcvCwmE7yFLNaDfJDCbU}&=f^tw@7Ii*Xnq0hk?{g9mokamIb+G<6(il zhJ584YD*ode5jDlkwlogi^uP^>b-c(r#IA$vnwSuyF!j#)Gf4H`UAoQej2Z8NI_#Q z*@At!lGN&in51gE5)3FYxI*J!H5`_?t*Y**Cz;b$ScW!XEHY+?C^kX{R5@Y?gM89o zHG$JY*iY#uQj-+{P+_QZ4t!O%vF^xgfy5l6q&(s-V_&iQfL`+F8twpxLB6;Lcr0Te z{}{Q=u4&U)SV$Zb!~t3LYaf(WpLRSFL9jJ5(=rTbJ@~?Ox`V782vzX+MWh;3S*7rG zsoi_tV@q`lX_wP|fnW;9o?f@#xO#<{SqGC`|NuQIT;{gJK zbd;kheM3*@z`W3O|9Jd2Zma0F?#Tuf5&G1|P3He}&Cu01c1zbkR7 zR_z)>ejTYtkBavPWn70+TC~DJ;#x)%r0?`QZb5tFw@^1_eFn zbTa_e%W?|OhF9SaaVvgU%HI=gCXLD_Q`nK~m3kt|3J+3I&E@OC{}Dc1L+?t?16b&& z39PEl{M^qR1@Bb7Cp!%a*bXy&RI-xwu&6+Mk{V_^ohav&_6}!A$mU}-7bzjTOO_r? z$sF73pXS3*bAQwPai(%zE0rww;SG$(s#Vr?HG>s53{uYA@|a8fjw2*J!26DZ;uFk` z9TaiGMf90lGonHJC&|YUwWAX(<={Th%KFtnz5()jj{zOB-PsiP;@zZ8r*El~SIgzt3o3ST|9FsoBp;US4QW z6MRO&_p&Y$r)Ig4cZJO;aZ+m(PtT}YNQR1V2 zLz09LV!ld}y@U2qNPplQG0GT-M%0OWnYgwP2H~HK8%ZkA=E>1bd~)xz*s%^^E;C&< zIQj57a5T$kC~0)O4#k7AeRWOAh*bRqy#kXJz-L}~%vR%#=uhLPIZ?O~6C1prXDn~N zfMa3lvC|tBQuDRMDcd28KuywNX$VE9IoZ}P#1{$mN32n8_()i~CG;&1}PLCIiT9s z@NoZZ8T43LGnkM(M{5VfAk(0IzpV1lpuKiWQ;5I z>Nmz74JAfjoGV`Y^>1G*Pt0vE8~ognh_II5)I7gA@MI)GczaMRPcAE4_395R2Tyre z;SytyhkhasS$)E8URJj9)gO+vMIJ3n%u9%~=N@`~%azOSY6&fNt zdX>}0WVhncIczDESSai3sVn)Q+QGoPzBa!Qf~UIGT)geWhY~{%TdNj675de^W2E!F zkA!}8KbPV!h-QqiBNakx5w>g(8aWUDN_2;wia7mJe#8#h>?e(ius!DVbQxMeQe3*! z6M`PHdCJ4~VOv;-nz41qnQQ~1?=QEW5q8Dn7Jk$p(&tm346Hi+$>6GU;rm1Eaakht zt4GF8J7n`{wi2U<&lG)5o1T0q^sD_2-_2v?fbVqRkLfx`#UZggjJY-T=={XViExBG zIQU}u@>PA`d}Mi_2wBfq)DGMh7d-!JHk7z6aZ2KhME7CD^CR}GMyC~?d08BM>{ntm z@V(CuHqV0G+0cD9_~zVo)|Xxm-TS4N#l5M-mtHQvxBI32*LJ@o)<^&AwHwOT-0;00 zKUaP@I4eB&RIv&4K*i!ioZq|f5JBDl_1Z4TS3oKS=|kT?t4!iwx-->%*qZ%?!INgq zf9Cv$M+U*w_w5(wB|@Nw?j0FC>4o=|L!xixiVw%io_ZXm#7lxa=={g?GZWsTyjqoUVGL1{WMCKNS}uRii8^77x<-uuSF_;x2J+8PUzMRpC+y(E z*V=#i@~uK!!5p1ac4WU;pSXqlZj;l4Wk+sfy=T6%|7En`{<0%?F#P^U&}L(0NAA?r z|3(48IT5KwsIByBQK^?SJH(W%u`Wzwo|j;Aycc^aJYVG?F!9) z2K{3tU$COf`|cZz9u8Ue^#u-n`^DR><$cjm@EPD<+P~|*zHf%ker8u_)-&G$cRRR8 z5BJ4#eW63&0cZ1nzBZBT`&3Kdsrv?#<-w;(PZ)Zdr2OHPDDP9{r6^lvtQQgIzP_j` z2M8aspF#W!{Im}-tUUB|*^zrJoBJi?X|MGO*+OnRf&cJ+ac>{B^H2MJ^KUdqPfB1m zl*wpGG2vb#){EuKojpa)>9cb5nH#fcPio0DaXlr6M^;d8=^%ibMcXf3iT%CXz^qVS0i7eRC|Y7wkwTp$KPsbP*EDa2e8MOx;W z2z+@$gIdQ)CIa8R&>+cHXaHArb=cV zq{7mbILopO#CLH43#ilPf zwk3qP%tc5+A)37?JQ?jG+R#=lF6g@2j3$eD3FIuHTV1qtmymH6X(*Y4yT`o*RswXJ zi&jd2Y(E{1R)w)l<0&ZtT&5&eja}ygWVXWqp`cTOxS^H`!SLF7wP^aw&>!6{g22=% zpwmEEPX!@*@Te}vpX@N)nJGc)$jqs%iF&=4id5JjakxeAR30mvmSU`IUdki+3f!L$ zO@Y~~!FZ(t;OQ1wB+aVyF+ElL0k<{MM&+CMH~rfGU?x`0cm+e^Al~96w(wM;{tT-(lwwK z9+$vn^VR~GkifDf>O_#`LMN9Lbj6PM^R&uG^4+pd z&t}^7!lwe+U# zI)VKh3-+d?ZE?F^SgRzQ-Vlp+bl7;Km35xPw8mR{+w3Z6KVKqJ@vheN1{<#{vQ{gh z&FM@sw$8>2{Hz){mu*WWyQ4NaG}XI-KIkN{muP-MV>A&&bxTtthF7tC2#5&~TdemJ&;Aan>IxOEjlv1nJs z#tXo#_b3Q7I7M?N8_%@cb?~8&fc9idyr(OgiQ9GXV|!OG-j&^ziTCvMrZQ<8FRZgh z2$$+fcK0MRn{CLAnuu&m5_~m+PY}^0weeey-&y$4JwWnt8&HlW*6hsh+?g9&Gw4Jc z#5>l7jhH^(IHGS@#4%$|XS}mBnsTBJb$+%bnvUC%z4Q`&N{Bz{o@l2=%Wn}7dW9a~ znp7(VKsuMkO*YltlZl!{VnB>?h%F|uj)|)rV$3AgGx0o!*lH3Rn0P+Mn~7~?>}p^m zh3E@taGK~Q=3c{b$;8JPe<9&L{H=_S@Q^q8y5p6_nUrI5;4!Z}CY9_pbjT`E(4?4IiQhT+t-!Apzo7WP?7azmUPaYEKKFT&G;LYZ zmZj(mMhsXG`X=d)fK8LM2~FCNq@@TNx&&G*ZEaI5h*I`_M^pp^R74iR4FR_*ptx5= zL<9sy<$Ygy1(i)je&6poGjnI=J}DOYLb%XUV+oX;|dfVqr*sxdqguN$BICk~Q#X~Dr z4%YkPSFT=lRQ=w2fnl$`u&fg9j^WwYEyuU7a{g(;KWlh?YM-;uQ1;ILLndt4XUSgm zs@sGKkv7z&eossXv(fGhd)1%7$-zzoNK6{Y-2{`FIsZ^8tKL86(p+uw;t z1-<-fzphrzu3S+Ae`#cl2ATJ88LkAc1xtiAi^_jc2m+6=Zww{^C`;(OKy z$$^EKR4}*9-K+k90}24!N803HE2arT_k=dDSV}9F41JZ=QOMU#TzW-b>Ddc<5B=Bc z``Rf=edw2Kaus{q7q&G2Q#y9H98}o|1X})CV`70nOep}Q(;OQqhxPJ5<1kxPuJtuh zu8EdAAy)1+u-t2-94+V9^Aj+S?1jI*@%O6t4ptqz0zZ@Brlx;-@4#kz&8DV&-jP|_ z?j6WEuZ1`nVXU^ZHZG<15U3BAQ&>iL1Ro^L_H;;Zd)NGywj4vQw>qqKL2qySy#5@- z#nS{2wge@%V&_4Cc3ieu4Y10l+h$eOKX4U!genOOFyjM1H|W^TVpF>O8<+Qv6R8+WSOL&!Ho zTN7l>4k6zdZM4iB4|U9Ii{)`MszYGAht}VcSAk~g6tJTb3ZVxHDtmJSePLE^Kg|`e zyBix)ZN1(u++6AkB*q{l>Ixpah0%D>hL1dF^Rz@jQQP1Pwb^_RVRr;uDqbGG0iE@D z&|bjF5YsjTH8|KqE&cs@t`_FCRDAMntwwC@Duf}YsvA{#2 zqs)dD3kB&rWT3ydbB@b{6(n|(1aYI|0QT6hUhf8rEN&Z{@co*1S7Pbo@_kT?RaeG7 z+XC@V&0TJWM6oJ7zHHQB{6$dReh3N_g! zF-QyP)jEs4GzMuQ>z)8V6oE~&5b8f2e*iCwL0SlOsj1069D`yZE7W8ki9xZD?-L)5 zL9vh(YO>2?P%LDHn(SjSs1|bj5?92aTF7l>Tp5FEAr)$}t71?sq(V*h@d&gA5}78u zI>M}dM5M{Ci7;y(k!Z4OBg|Sy1e)v<5$23TfhPN8ggM(#pvgWJVa_xZXtL`f%vpv4 zP4?*s^M-*ylU*NS-YyVmvRfS1#9lc?3?qI+&$%@Q#WKE!d@csXG`3rs?DH`wwz1vP zWM7CuHI523*%xC_t)oIs_N5q9^Qcgh-4=st9~Ek{FUO!YknJJ2$Dp;4?ICwW;AHDM zBGhDe#-Q~bJ8OI;2A%UzsL8$>gU)*>)MQ_aLFYacYO=4#pz|LJHQ6^}&^r)>;%g%@ z=sgHRP4>+g^ezOUCi_+ldLM#Nlid}8lYHmG0A#YeW6<|53_vEkCkCB`w3~c82Azep zpL{0TS)rKPZZ?kOob`zz67O>)Ng5{pT=l1 ziQS)|w32!*^ZqPB#Z1~?fIg6*VkaxuWIs<(F_iWg zZKZ-u_R9oScT&OlkaB{mKdE4oJrbkIboOY1T8|RJCi_)_T9*>RCVMPFtxt(ylRciG z&Z)G+{yIUOS5dIZev_citti-JPb8@GD+)H*ZxhsaJ?XT+OHkkUAlPKTk5S+EAlGD1 z#-Q(e5Nopkiov|^vDf~04CZ~0z4m`%(3wel?H^*$SxI~CQ!(g_1S_D|{%;IA8v#VG z{bLMz6G^XqItIOkq}M+0!Aeuy3kfPVQYS`DUrbOjk~%Tazb2?yNu3zz-x5^KaWPEhYx5Nxt@Vlhb~A^XDjVQ7bd8)mG+{G z64cvDy3xf6>TM!eTJ(OMtIR zVX>GMjz?^08&_urowR%kiu#;6^`qG6jm2=UHOwKtUji~aW#;@ z$y9h<3R^D|;kYJ9Ve4ih9G3+tZ2e4xo9r_w>>N!y^bINOJdMIlc4G=VSEF!~-IT)4 z*C^a%H>a@gn9`{~o5H?lLO8Bz5;&d|Z%t6&Ga=e!pG(lZXL4Hne1hgZlk?&i64V(? zd-WF+)Y(gW^_LRVnG5E?)OcHhI%@&N-1y}L^~RE3eS3m>TS>3}MvhjR9yg`1SWBH7 zHU4G_i@AKy`c?{yz0|pp`>qsLgSnn{cM7Y;R5-33Qdmvqde*m7SZ$`lP4=A>wnh`- zxPnMwYc&y$Yls9+Cd%)nu=Oz!ZnE#EuyZo)SwBc&=VcUbvLB|fb2IH(KT2WeXB2L- zAE&T)H0fEJQ`mbNgq!RqDePSh!cBHx3VUCJa9jf=a581ypTfRp%AEPL6n0kA?)5+l zJF98``gsaFt7!*&Fom7fw1@p7g}v3Ji#?RW-fGgv9#`1jsH!k`{<_FO%c-Z+a=$4s zB=hGJMFv_=y`3few#Xp%)6NEl-xV3ef>sG!X%rd6hQ7ByS!56^S|xDBQDjg%suH;B zC^D!eRS8^q6dBY5U9bN`kwJY>l`z>;1%_l!{of*k^+QntS0Y6Q>xrU-$(}AUSYH$+ zO!iEX!Fi*O0DmenIDe!PCi`=d!FeQ=Fxg*<49+L1gvp*QGWfnMBf)b;2H%^Zgvp*S zFvRoh3kBTwXQ+T{s{)>PXwJ2NE#P^N=4|`70`82c1H#`6xU->-2rm_IXF?bVbM8M1 zxU(Q|%(^cZaBn~v6gHOSN-OB~-hMJFoDt%c=H4@l3}Qj;46wjiMFugU?~!L08N`O# z8BoGGMFusZ>yhUc8PtlZgvrh;GN>6{k37G~pmtOxaHplnU=1ls;BHHi!CF$3z#W$Y zLoy#isRZu86d9a5YLC3E$l&~uO5jdRk-5j(kg-Lpdy1<(vJ_f78%5nRta1U6&ci$sst{GiVSK= zRRY&UMF#arH$Hr^$e=!{O5mPPfgzc(Z!0obpA;ofo&xSn2m@ip{&oR(76gtN z`#S~P8&HOYdkeU?pNtAW4)IDe_U0mkSWr6yEbx;egP73w$oq;6Vngi=DB-6?1~sDV zk@puF)QYME?j{u()Qql2K2T&(JE{`6r&MIHh7=`mTdBxkEh$Ri&QgIPnXw-#GFV>} zC2)VK$l#n&d*s7K2Iq}b0(Y5;49*?3M?P9)aQ;XoaIdMz;2lzW8VMrPKx0vUTv+_$uT_H!&<9TVtAUZ)u}Ogs;$*&F?ovC>hzd8S!;Ek zr#4gVCN+27Sm!6Wv$t~KiXp~lc*V6|7sl{(4{NU6Ey$2@hC)J#pD*X)V}cQ$u5yE4HidEK>YS0%XfV|7*B=}2%k1D{;II-#>6Shs5u zI$amecx^(a>%tp9B6Ypmpyq3YuBu{&ue#kf;-#0+TD@h=^%1vf;+EvwfjnfyJ6(3 z3Ehn&UrXqAAo+Siwj;?so;+1*mkuT0PH<;?SG(^dcsiKeo8Zo~UG2V`;BGkiUP5={ z$@dew9Z-IdknM=_Q%|18+D%GFl=~Ch+1}OeXEENK4k-^LxbtjRyPwB6mER?FH>&(T zq1#dA$%Jf2l|Op&45?i@syv8R*2T(p(^E1-O1XH-s0q^x9cXS7+Em4B;NUkUwvJFz@j-g7ZTT zyu9aOR1piX4=IeEFYi0>^C|;$R;*~(24`(aNm;p%Po?|8F;sh7#F zNSIg@cCT_fp)@>3QGtsBFH*w+5J?T1Qc=4BNzl~-V)EvL+GQHEPX1{k`t1@C`Ab6Lf+ zRj`>AvS7_Tr+5AW^;8zoh_4r5KdU0ov;lurCMA8LBG=Rbe@P;jW?!txHDzFu)r#*E zV0)_~*W>|zfg~@d-Byun(ty9tlFP|2SLA9Q@Rw`&wgYy%DsnXq_^UpA&}o1?{D?Cqv3no4|Y|QeV4CAo&V~LmT^{TIQNplbUP~7WY1aWk{0}SBA17SYnIl5L1;sZfT;2HUQNjgt{v_ez z3ta>K9lf~?V9y7YiT0F>NLbu)&8kpyG;GH^Va04!EUtKUWdX0?U*Y71(v8dIa+B^<8i)P@1~yAuwU zp{u(8jgU$B0#fVTr1(E3ENsL+H*Gn)J)JP+Iyk#MlW^z@gz@gfpAsI?Miu>Y0$DB8 zs((p9`*I>Lh5nX9?nTG}{qk7&>d@aSaPezp!Xr}y9%QY+gH}==?xI23KPvFR*w#^X z?0&fd4`jI>tvh-fYh)orZ}w`-ht6~s(3$e23QRrng*3}0Bk9Q%xVq=Zo&J;xJp3M; zRh%=k$xf}nw4iTJ&cu!D(<(5bb^#MQ^yw9tV9J0A9r`?F%HKjAa6^%utFe|Uu-L(f zdP|eAQ7$NO&70q9&CMnO%Y_9NyaU@~+fCLuxHVge$G!lILadiuT;N(TuT5S|1dsKS zOA0)*X1DZm{YGunOD-+)^kFe!c~}tEibb9U0h2n(Wd$ZIYV8sarHG4sxWEIB*3SGB zTQa?Wq`=kb`-s#HYsCT!KHcSOrfzh3ktbAI=9rHad7_%3BrFsQOl|mvns-^gE_P*s zr88oIn|)GQg14Oq@cJ)G5!Vnqf2znb8(+nj8Bd%;xUMU5ae)x&bF=c~FHaA&FY51| z$FCBg3kpDi$LWWV=_%?Tau!^|xRuikCXj7uu;7A-{|mbW1}%_a!PkoS+p{cqC!5D%cSYIzE~(SQT<1zls>_u8GwU?-C_w z1r;7oSgZ;hKNxU(CtTj~=VmudbB|IPE`34)Sk6TwUSV8=YF-I<5s*gwgVmucw)yH}?#Pj_-Drd64$6y8V zFU1^zcvc?^&=?QItAv+BJm2`Ha(JO?ge*FBsGNeaw=fo-6mtaPS$&h89OHp_m2gUk zyS-f~4&|`EjKK=xPm4K1@u)u5l`$TQ7YS#CxE%x`y%EZp?93RfApWeFBNUJ7o9yfu z55TAbVFTdyOmT~+X!PNv%dI(!ejz7cFUj5h&lPZ4GTok&WveAwzp@2(u<2Yd#20DvtK*Nk^39DVpIxwZ{Cuwj_-U;F22J(F1_CSaRsJ)^O378?3PvF@!#g*^(VH< ziY)lRue&JFIpV&A2Rl&QRdmiJ1Nl!2JiID!EOI$`e}M&U)Z2EbW0Dd1X9cFN`K@yo zcww@!@Ib=UIuLJ{(w%-@;Nj;baht@6lS{$}3tU0%VIT}szbLSTHIpZF9xAZN1)DcD z3PS&WJm=yEp`i1efkWom>rYx5TK~ENPhWdi&<*)9r{7fI>TS#`hJv1`#1ib}L!aMP zV)5JfQnBAvVwsc+!Z7*!N-UFe7Fh7fN-Tc&zOfNsK>x2wEPm@AzcPoFawQhOZ;yKz zSSwdz@tgM2;D4yZ;vWTVY{d7~pQ^+nABJNaA+%u4T#+ZR?<~A5Q;{byFy^?YEAj*u zZo?}x6?p;^w_^=mkteV*yynjpc<=${IUEVKV(d46sle6kHyh!|@SJBW@brW{m~Eb` zz|$7;z;~Xnz|%T=R^Hk9!wvt)nfS4^WMAOr1Vv@AtgDrEDFowKqiyz7a@g{0*taSfzweN9V_2D> zJ#24VNUwZZ)eZ$H{B5?B*-fpz`CUzVvRuAHkyv|W`s~KYC06(&qI-o_|40= zhfto2-@M%4Ly?X6#mfUc6xxU%ygV>K^5Xct%Xj2RV51fYni(KL9>{4?q<>NG!M-VE z0G*WsK1UNrqE-dw9TF(kM8|8(fjkG@jz33$-qhX4->k`{uvz(&1RlzBv0dkQ2-hQd zF8-oQM+oJ)rXtsTLcI&)u8Tph$I_#|i=qy;^r-WK-fQW3?`@vMg<_wjhuxP$L%*em z{g?CwuAHy~6TrYMigw05m@*CtpwK;;ZBdQ|{>h6a{OnDHIlCzK&K!$8lw}?kVJ;uX z8vHa)jzvC7>|Hq)_=046cL>EL@~3s!La2CK;HE6_h!Bc%E%s2^tT5SC5QC)JEXNW z-@4%tbAkifT6*)@5Woi<(B7Hn;Kcnw2lRyi2A2~Z5Yn;i+K8WLQMEefg|j`J^9+G7 z>I}@n(`Q~jH9pfr?T57V`g{1Y`*>E4_2Bmod_In|XM3!7(foXZ=OW@95A}x-D|N1i zy6_BM)K74Ac3yYKG5r~Ty%@(V>v)`VEe)9G)?xDu882i zj?UTrd_@0BPwtO%aWj!$dZiyw8ez=^>wQYdsMtV%U;7;A(E6)H*F~7GxhU~zkM$jN zh&LIxx3BleEMG6|JVS+B1i|d&*7d$(Ikc0i@G`)u+cc2PUsLqNbWEPO{Wv;=<4 zDw^ie9-9U0oQ)Oe04`JAhMGFzPXe%8?tuH&($;*)F`&N=9MU__?|kah7rzYQz=xp~ z>ho}jVixm;pfw)}!Pfcn`g`Z+*E+PuqY*`5y~&UJsm2-TW^(h< zRW-WQVq9+wL{?U*9}013)#Y1B1z#58Q7fzL4~O`Iz{|KTif?g;aQ~uwW`uM+LlmOD z0V*3kmq%!K@NIh8<@s0$$NnXkC|87d`~2KJI2K(Qf^A(vk3}n9XF;sP2JBb<+10ff zZ}DJr5xm`jX#PUZZ+fso&U*!v1=&DU8I}5D4>wnW9}rlUX10-CXVL7Bc)YnH{)FIm znZ~&x@61}j{{#&3`eVxQC&$1ATkPIi!ixbz;{U>6_l_E|Q`CgNX8g6_uWY8{xHWr6 z%LbRMKPuchGVhggaM;psTe@to-PV!YJJLtM^w)5vV7b=b+dpA&!-l@*G`OK{M4g|In(`T4ClW%>oy@d+c(BchwyiR9nQ(R zDaJ8V={g!Z$Y9!Bz;!VSPzK{kF)qJb3IVJFYk?iQA_GgX47f^~Qe@y-*fL-}Fg0et z>dnKn(zF818fbRn(+hYmpG%$@F^=EzblFh`w(ttDFJADs7jR#^7-;_($IqYI;;A7v z^a`*mUhxA9xGP?#>377q{^Y1gV172h%nBS@hH#(-S}Jg869@;IU{(c=Nx2mGQESYh zzx~W+KoR(lZNMUf*Fp@{US#k}$g*H|%)lRYUUIVR-xHj~c zta>eUM3A|)v8OA5Y3aogJl`oL{=6i_nxdl7R3=**;bGC@%*!I!7d@R>2ScnmESmih zKkpRbLDBRP{I*jByP|ctSRP>At@<j@xmN@n@{9A*5)=&Z=oqvOEUsy?_r#!W zV9G_#l`&`=m?8ll6NB2oA`;-L7}N&V-hiK>ia~w+Ktv+vni$jv4@4xu_Xc2VYmXQ~ zMFLzKgHlfw32tm4hv?2i>8-uK;6$$Wt0XV67ZpS-;+G2s8 zXwj~=`2)=Z%~RZKCNM6x!Zv0RJgG5&(e+MB;4n9~;ZBa>$zg8v>QfRp%#F$C)EJ%; z=7!>@C2)|t=}0^j5W`c0+)abrM2#voHO#$?8>taIEzG?XpQB9RF!vJNGY??CPTA7y zFOXqYRPCaK0Y6R_a-epXI}R*(2QZKh@VO{Ah{#^d$3hPLEE;|Xt~=N%<`8y8$kI8# zkDa#DZ6I)N<@TekDCKk)Sh&o)DrD)I-|MyDhRer8a8?MSfv*lhRw5ElLtO7TT3hhI z#Q>bpm(B`&CWia+ElcWtLyQ*Ir#HrUq#abhDTbq(LHV0w7%$>@)u{QG9E@U<=h67s z#BB*2Z$7esZ#WK2g?Mu}Yydf;Q>E*Tmnu zhf(iN;7L}p9d7SQ;Hg%$eK-9_4#x1`*VEqKHqeBpiTa%7Y1R8rbqz}3_|B`izo^b5y@BE6}nxzYTg1l0<=w?2NEpfW0}Eg}Em1QlyE zxx9}gsLVgjZi;y{L8Tp zyMKu|rVUIA4F&JS!-5ehp)s$=2!WgwrOWA@)1gM4P7z|q7<)nxB&f5Zpi??C*$1Ak@Nh1;6_ z#`rj(Z1c=ta`fz#i;r4o z#@1J5>ocKsuR99l!KFiH?3il&mSi^Z#!}tx>-&ydwX|pL>NP#f7q1&^>Ki=DjQy}F zy~XUlUMS6;QU%_F4pFpr_w@&_U%YB){V_dj2iGlKymD}@0^6wkSu2KGSH7ob@!Dgc z!q4zE)GXWi&!ud<+$%xj^4_>CD9mUR5$Df32(R3l(V3RhxoW6yXk9OrYR&K~Z`sZd zm9-QpL2qHXGDyNEd;7r)@SFgOkb+6n8zg3Q$y4-3jTv25F;2!=89X%G`O{Uorr67z z-)lzK23qpos2N@5DY!j?El(8hb+)#DD$6b_WjlYlIvWpx1E`z)Ix>``$_WWelE%z>FRdGLp($(RurcXp-e=gS-hn zolhC$?dZw4tBbZw%jQ!BuAKr!KyEant5a?~MPNqPq*UJeg4)ha77wjo*E+Ozr5XGE zQg(JZ+jH#O@b?X~^Nm^1MvLSrXMG_hY|q{p$a7%nipPJk7VB)I!mj-}5#ll3*`0Wu zTYS&~aA>&^#YS^9-k8EQ2t2>q7589ju|}Wn8j;+atK{52Ui`tVyTDxl;Unm zL5J`@4U+zL13)aL9bB>UaFld-@4`tIa7*>lVXDWYt$ z^6sUo@>|MP<%X)N@*dSy)x}nuLiAU#`+h zh57i-cSN1tj+vmh9q*NN%|2v4o|mbJsRBg?c*%c-V3>NZ4vW((ERwQ%RpaG3m$k> zPEYJ=U)bJNk5w{S4F+#*bBBX;`$fXc@3SqJ*MTd?h;_pdE^X!-hMmW1b` zG`eS%+1h^eIJ%qdM!nheria-X&&5AG$D#>Rh(LAo;HKE46UwZ4UTN8CRGrw0Cgvve%|e88i>Yu_R}| zMT>tKXQ}O8RGPQOe&BP~af)1^v`{xG)0o2$mrXs6kh10RyIS<9t}Z`aRg=|>tKPO; zSM#>&th_Bxj~<7!op^S_IAB@L&ZUgA>u05W986X9>+7d)piqRlw`MdOgCniE4+&ny zE_(!r9q_mGzj4TVa6tGE{He{Wtr=lPWVNN*a&1*@b!|=Uh}zoPk+q|0N7rss zyWKXvD5u#vP`0iev+@s&v}1L7WDVM^Jo;@@t4G%Ch}NqvkEq$DdgS=(ea2Pq$mS$r zT+Mg~*ZfCywu83sM0l1RhhFFQJ9^Bdy*jfbrdhA5C`qYTh`2M1RzUb1o!!xygAPd1Y% zm|<7^sed)YdRHN3#|>&|LnR+{N;@8wK_6sH4Ciz~347zHPl6q6DdN^jTHr`zSJFa9 zVr>1BQ6v5`(@&~|;eB;PX+*(SN5EHic3BZq%a(B`oLY5S`SjBHsJ!XG-`4qUb@`gC zCJVhYtJz7M@!vPrxc-Q-hQl#~BdysE)qE=mYuQvYr}YtJKaet1#H2!m);Q zZ6e>cImwSI`abEaA6Hb1YhZ!06r$TwGyE3c{9 z1B9$Rwq~5P-zJeIRe7Dqk_i-wF!x&-r%wh)TGI!@G7#1b;DlX!&1#&mGcP?3Ct2U9 zWhW!92LYi{d%B{OL;Jq#x5RMno17=R<1aH&+ma1CcR2b${{a^xMe|MyQqYAJ^?iOz zelc7h-qA}{VJ+i6aBBH9_Tcvb*;@bjQ|=#oRI7i~a0aSrhxc!sQf$Bdz%~2&+L@^97u+;nv)R6Y-HB;w0wzFt@)1{* za%lU}N7#!l(J_fNe0NNmh2#<; zEg&j(){v#PapvxOzWpOmXX0;b$CNY5c1#&Ht~3%I^BYnI4zK(CvJ-_O6#8W=b}P;( zvqQGa^#p8<;MjvM={z#`x4Xc23I6iD%$no*^{p$8I73PP^x9&qp4T!aU+9lWhK)@) zyj+lPnrvNL`)LkEvAC9TA3POvMhBW1jXV>St!?A$k~ZEXW#I6CQ5%0N%dV3)ZdDlJ9k3=t!?LfTsv>K%iaxp?_Hhsx>chwFGzW`%Im#u zJdi>W3jI1H;I@Ei{cD!pBR+t=QQYV6Ux7PC*xh7iS4hy?NjiFse;A-{JZ9c{(B8Qo zdAXB-c{y9K9VolwkNw%0zvJ%{_``S*$sktQUz}j&h{pwDoTnVdSQnCVRYEu#3!;%i z(S-#~wZ*UKLiC zKUL zRQBlm3V!Gc3Hh zNT%aHVd0X6vU8TD;Vw$(;|pM6>*JCBEUmJSyGkiX?Bm2jA3q4`h4>4u&)L1~s)&)U znGR;uA&k*lX^D_}8R?oWy37xHkD}qSDV%2&^~<+cb4?%iAJ#JNKXXCZ+WvDxwOvbX zBOPNm9PwAei;9`~lazpuRzfkF`qe&70+EW4pvFLXFy>YW}LZe5aMatpY zi{Ya{P*xdQLu(!A&*YzBn4 z;7@(z5uD{d5|m4}*L*#vqfPDw|C$f5*8loi{oEQmhK$}tuE&0cQvW?|@BF*i_CL?E zb8GCl5nhtH96`Iws3AjxeRA<+88z6N#_+0E+npYsx4SKqEEU__$q@z|ScV%HcrA|e zI>zKn$Aw^qAw2y0Oi@3>Y`t&nhT>gdVZr>;sh8|CLEYLp=H|pd9*{C{c-`j})`_9$ z9}i~P&CWmEC7DbsF3UgZAoVC+{o^5=<^JKy1o8jV{;~DXCS>KuoPTV?XAyRM)4sUB zG^VBr=SN@>KOSdUxz?`6UxNMqJ!1>^)))%DGwbCHKRIK^mcAiA6>Bo=wlcU(f%lvM z^3lA(Y@f5PTL(W|0pbziE$rzaWVj)1%R_MsLD7(pL0F^(K4y7^snR}zQ^u7OjzN2a z$T5g9#|@4_jG2dYL=x(8+#P?|J8VQmIM_zy2&SkXgg`N4g)3S$>sqIWk(Lpxnzw%3 zqD&W9Trh6+jB3-7Yu4yBK(==5x@Cl&+eXTLE!>gVzC7Xptau(du5i<0Wcfz9Csw_E zBOa#NOD-Ru6`9oS_1?pnO`!+{e{Fp}%WfHA{k3)FAYPr2kYfC z7t$FsPw1yyyiLVl;G9T>TOIoe8u@A9lk>>jNij4#TQ4Sng2awr|X|ZUp%Lj{Xu*YPv@*X z4j2FGi!MXpiyS_VUedCDXtl7Kx^qC7gg=autwVh5j}BT7LdV&%|3J53Ik|%-`wzK) zZVSs;|MYqwCqkuh)G4PNv40W^{csf096X2jLwa&>R|lzZ(}0x-7kpdqhvA+9wF~?Z zDOz=F{qM?Jx#k~!Yq0||8;&Yg!W`8_}Z+8v+T-Rj(gI^ z*i1EQbokx)heTU_0sN_3Nj%9(b=orSB7<|WGVd~>Z z+kpn(p$ieN=teyNT-bX580WGgrU-jIh_em&+gjgv3cdli!1IY*%T1WJ&l}3`X7Upo z>~xvm(%-iH#E4yh*N)q#eC#geUGZRQ_0Gpg<~PripRotgR-^$e(y-Xe~RaxxC2(R1OE6#?#P-q zR%bgU1LH3LHos<*F%8-L?t=h6_)xi&SISiRq|=4p=8B@Wx$Um zCKmcM^K<;hU|Nrea4@d&>4@<$2`RgB?5)A6<_#`b+>9+-w~9vV%G$WNtskR9zoojd z-(D#`RS!C9{ZH=O-ZskmZEell;H#s{WB4T22s=pQ=2^`f@wYQ*W4OA+q7oxI4)P>b z%?|MI8G4hTy0ip>G1k9?65;wgmPdnaJMivMmU{~J`2LzVfiBlaxb?OJx$qA+;mWt2 z$Wusq%*e^eH{yX)0B?Xg$Rj*My8s`D=i6&`7go#_BWot`bRt&3HI5HVA^}gmkFR+H z@=ithwSwXds8q0#T~mvZUaF@m+X6ora#wc%_rZhp_L2JARc+p6w14GILsTZecUWEi zrZC|WaB_YR@v(nfzrP8R84CTr_zq(0uglq&MsXDA#tS)%j~evraaTw%0K5U^B8j)? z@zN`XkiSF5(QEK0Q>54|NTUDR*N-^rntwM!(^fk1j#5=z&%kS~$vrw&`vzjpDebw>`amA8Uq z-F7o&E?KZ{uzkbO;HqV~quHj{50?Yz__{nY)`R*Sfxl$7y7R zJ^oNZgeSoCDa5fQiBuZ9oNp5y!g(X(>-Ah><{@1&;BXnzSK}`j$PPzx zc}$uK&PF9Mx>QaVx-xjZ{0IEu#?#Y?Xb?1pL%9<8hoF6qRELw9!gZ)4G3E%GnLb7w z8^X(IBzZ*y35--ig`rX&d1ZAoSpk4m14m!fkdf-{2jQ(BQ=4p=jA+eSS@d?Avju?yn zvW~-E{M75kGGtbdp2e|hj{~P4IKAer9CLAn1>TAHtKOx0;<)O4>#H$Lf(Jw5ZX5{9 zBd~hbfsnRvx_v*vqTlR6VvlPBsh1$Y6&@{@;WFmjfb3Qg_Os5`(WR ztLDx5xhq!&W*Kgg9gl%S;{9t2tNfAWFKzp#>g^k3qe9;u7^Nk%Ue(!-`jo|&#I9_M z*L$CAB_xa7!n=`$ceGo-T+S}pHW(jemBh@hkYIeg736Syyprj3d_0lFCD>f+!LWoU zhp^M81JgLHJ8p>dB&^9+8fFcYrS*_uSQRrE$+0%@z}ld&I)=Z8p;L@E444$0Of9F^Rh+ z4fqSVIL@$^0SPHf@*^2Zx=QP1q{F5kT!_}=FS&{dMx!>-BN)lHemr_JrP#pQR~(Pb zMsRHH_;bqkGX9Ll+k)t$m$*I}E?MN^`ux(|K7Jo^Jijd$NTnJ~&<8@hf6ujfo3&42 zEz`QGl%2AD&@+R5ZI>zNo2Q_hux}0`-SMJqYwv*5di*8s-V2iHxI(VW3GaiygykI| znT~G=3t>*D2@A;@c1NUrW)`e@2~zo5;g$BsU4?8>QV!P(EN>?Ma9+ole5AY3jFbKG z7j%UQNOBDkkl0iAj7dm^JLfDnnbfN^10yXi>^ocE7kCZj0;L7lI|I6P{;z(0qGjzd zt*!O@?z?Wy$`wNc>+m6{6{}aR13^AVQorxg`h8dPnaQ>;!iQ|J@fJ}gEWVtI6Wds?~tTNCh5#P zi1IkFYseD3CP~*N>FtvAwn=()lHNW^ZCh0LrdQ_4gm!zwbblF@Lv{xDJb$gT^VP51Gf(>Q7ZIQnT#<6pxxgf$b z^P?z#jX5$(*O`$~dOI^CN^fg^9+fxRbVT^}=I99D##|GncQ(63{5zSwqV$gD$%wz& z+!)~{GZdxAnv`S#ZmfT^Vul9(0ngSA7*|RrH?Qru7PaG%#midD816`7p2#lg;9Eg zSsSH4Xuch#PdAT8>2uBBqx8jQ=k1+z&K(~y%~AR)(;cNhX_iOn8_X$D`c`vQl)lZ} z5v9Ls?vK*nGJlNH_nJ|>cC`V$&+HMUyUjbIbe}miN-r|&qV&7Wc~N?a`E-Cc-Nqx9`&+}KdRubaNC?^8Kw6(C-Y*>h74=e!>e72`tM^_ap`J9hF!Wjx;Pg~h6{ol zB7A~5K`($T-e69P_$QkWN99j94@UZ)W}b=C=a^BvbhRPFn=o&Q(jPYaN9ilgf++n7 zvnon|#+(tQZ!uR#=`Wc(qV!kHeNp7&fEQTiCOZLmJb%sR72ls?WJ5T#Ev=STBTySXoFk6C8h$R7?gcSP;k zZ0?HMbE4@E79bh!0G;C+3vq^9NasfQ-iA+H$A2h#>((f^)Xua}Y^QI{MKC^$6{(w0&O5=L|tGM35oKz!M z!8DW@uw{(ArDRG6kaQgW#t6LxwkDE{d9xWQbJ@O3)M~TeGp1H(lG+vYqrm@WGv;UH zVZi9Jm$}T0kxe6aB|nYG9#Y1bDLAc>GRTrU(~LiZSZfI_5|4RSudan@Uo!@(j*!=o z%orgxu_zV|ak5ADyM3vC**wS35~&RM6wba69c|IgaHU{Md%Qz(;1Wc2((I)v zWB7|?u8)*Z47A1&FqUq-OX+HyA;rXrw^jABx07ym84FpsoE=^I z1$Cg%T}o7EESGht>p?r=t^*-6ekG_VJ3|3uh4T|_27}2;5Z=g2AnanG#oOexl--1@ zO{pdi|2^JR?*o9+OXg-qV{uu@yY|QhB_QP3u_Xh2N@B>}S=g!iE!9yn1|5sikZ<`o zR7rGXwnI&6Z1x>wA3s5w5XEo+xLE38wvqamuqjCiHmFTh6?vC*tQ21|4-3O;$4Bd$ zu?v{oU1$(KUi@;@AC0L8X%x2DCo?W{pbs zH{?sx+$|-(w~gtjj-PVg$+XJ{ec0{s*;0|a8}y-tsi%}vt$OVSeO)kIG6h2pu$OWIPe}lyjwDCL}FS4<#r{nK}M~p%%a;KQ(57~I5 zjX58X&ii)Me@~W!n9fCgr`x#0#tUtHq>YDcJe}qIRrkJ`zn^L37ds-J2|j0^(gQ|* z2eR~4JD?!F4tVKnd3r6=-_RE`OIPOf_mckgJiUhLujFaETj|a`E#+=9=6$4JmD45P zH;tkGrH|+IW0=0f>i6NCek|#?8*@D4%M$vRlk^8{8kOK^&0&h|$$CpUNJ}}0KS=r+ z#+=3&{AXGI^K8tqsdO{$n_B#Gn}*85{|TGE-ljzkjKBelawQ<1%Je(+DJarKFB~Gh zkQTiVi(Xhfe1Z9pMinK7sZHs#M#f3TPuuhknbO~8V<{KLcd_V$awH%YeGaqwAWf(= zDbWXM(Fd{Ub8ccM(9g5^#7?&)c0xL`6Vj2L(D7QJpw^g=q)3u&jnpJTk%7`URu=o&&7d#<;7qkIX7Melc6y^$8Z z(TSt>MOySmEP9`x=ncB)jac-C5|>df^thZc(vjXsM|vZT|3$q)6g`f$dZT;^h(+&r zTfLDMy?0OaMq2bnEP7vH%ng)-G+a>P&ojp1n>PNDjeo`%`u~D4_#d(HuPy!eHvWT+ zpJt45Ua;xEGe$lPp%P>0m-0s0czYX`3M4WzJbp8P{zo&*ro>=gMWpMS6Mn=+9Cf28=t@!`A)UzGZ`Zv z=K;nSSvsH7V7`yp_~VR`k6$Ar{YJ*%zs1I1v~=ECCH{3Ae~U5lN&90Ec5$7vD`Kt( z#196nA0RD$uv_8>NQ)mJ7C*R9@8Xt_{tU}Qd^6)O=r^Gli@XhaEONmo0kOzE!pcQj z1FA{IaVqA_119kIwgE{{bn_#_|}xr?n_q(yFhA{S|q zi&*4dY>bS*NPojX4&u8Qf618pZ2W7+IQ-70MGq9>V$q`>AVa;?V~N!RY0;xG(F1AG z1F`6FiPZyX(F3vQahufxaij;*&p})XG2iWAT*nxGBJ&3Fk7pV&pQa>zcN@Re#xk!U z-z1x!#u)r>xA9C%Z?`d@1YkK*@Av0%9rZvy35cgMz0}qpX{rC7N&S(Q`XiS5f5^5w z($emTKhJWmw&M@t`)#_0@d>s(#3CR35)h00ZYv*Ykv}1kkF>}~Eb?)m;N_K4Ou-(e`tsZ$?2S#4_J}!kA4=BmSw4rJSQ| zd5A?m_$43~`8`%X(jxz@iF~9*K4Ou762?82k2IDN5@U!lrB533EgOscUmNptn|{*9 zf3>mbwcN@$nLM(cnjB%OeBQ5$N7X3bjahP<(KejPU zEB)dj%m1j2e`D#QFZ#_>HvJ4^MEVxWMf?TE*IWNYEOvDMiS&yWm-P+oiA!F|S8HSL z57N%ubYQ%*jb)vK{8EpVc`WsSTnUJ!9t&(ekd}J9DX9n2QV+yZkJIhA`lKCKLBEZ9 zBEFL`Cj0N&_+cCW(Z>H^jC|7W;MnjA}xBp&6pEe9%9M= zfE|~R7JU(mzGvF`5b1ANerb0s4y4@?!{nxfSo{=;=WV)%`XMdrN#L?>M0_Oah>vHC z`h3u)FR|$l+w@h8(Jt3AhWzVnEbBASZ?!m|TO^;X&rt3+ZTcR||6LpZ$kKmm;|Fbw zPtk}zVuw}M9*D(`kShVP*zpi+N2JA$dnfioTI`2d?01&6AJSq!#A3f2t^E*-{SZg? zLwXzP1^dW)0_i=NM!eF-ZvFc{rcv(uZM=~&>~Wfn&$jXTjFI21fB6_S^NF1if5P%z zZ{wS7{5i(RC-zyB$6_DklYm(4v&h;9X|c~-u!%Q%31 z;;+EvItTo+UPHW(@im!C%&Sh{rLM0xUQ zVDXYAYX^^=c+}d}>(@+d9ys_I{vP4L)M-aeKls@8l|zfB50HRgq4XJppM64xIfoJ* z7+ABaVg1?}bLLH6Iv~IE8e~|p3O~=WcKw>6iOZ2;={m{KKhS&pJBQ{pu9~-GK!1Zh zl3;&HiUOwdXJrQ#Hg@$44a|AZ!D|**;)e|U@D$iv`lR^v%V+m3o6^>N==v!IeNX}Y zX)3TUSh$#__Yd{1Skl_Ncz)mHO6+_TjD=5~#kviweP8do?nCEw&FNoK;C4S^1@2?p zlzYyisgoNHeeZ%9%>~Wvk70qi@4ce;vT1`$k6HVk`O_yg7K)}8OTl``al$(JnBGaP z^Bd=_m^P(Qu2Z<7TUciue9Zc(U9-Bn&^p%G6W0!|Trm+3A>t9_;3Gz!j0bu1?;Com zeNRN6SoGBB8*ZK|zjoq&-NaKN4zF|Qcf33?{LvEL(7t);nZ~LJ=s=e%#0B1j&AD!;|vYEZ;zHVsk(BdU#;?mW} z95aZA+$TE1y5o)^U}mjfv2t09*S(>kzoUDgv#;gY$qn5NJq>LQa~t{^dfFRW_UmeH zUeGnUX+c+WQ^TVDx|*6A`atOer4N+O_V#uh4{5+p`t>cG+VH`?{<*Dl+cY^1$&Rju z`SO!d4ehg9rZ?ahGN(86^tSg+Z)k6s)p=~Q9d?ddyJo=F(AK{p80Z>ad7!IMz>0j} zLjkWe@Kq=P8rXr53cSKVSUEp*z`%&?uQV`L&aML`vcJ+m8DyvPyn5qF?pJL&`t_@q zExBK{?7(ki{DswCX~GDs=5o6U1i4>n0ts?Eo4+b|aYlPpnVsHtDudduG?i6Q`_*`< ztMaRHQCH(vBiH49HFBNKufjhh>#K7Pr}3+hDp_BhROc9!x)g5lO3RkOEyAoEyM|xJ z=&CfxDrS0Bz9?1w=W{N7wM*z!*;ip7sibSotuT&M@m0w4`Tm*4fMJ4}6YJIg{}O?V z@ci<|b*KN^FA)lTORp6hbd{)yb;aeATeUYdHBQ?S+B9WLX!E2kp_7`nh|bs&I(ds) zP1&MWQ@5zqv@L2iZHrn>-=bDCDrmJ>uUuee=Uc(Zl7rKWw(wxn)GdI`leYj)s<3YM z#ZKOmLX)?o(3CAHG<8b~P1}+})3>D1^erhgqk=--!JD_#W>dD*+*7xdb6SPQ_A;k$ z$pdF>$pL3nP{=h|^A-%$yaoGAs$d>h=Hx9j*OV=^*3>QNGIa~OOxuDk)3>0@j0(EA z1xVADtX%<qmtv=0xP+#g(^9% zg(|tMg(^9$gNC(6rKv$PRhkwoGHhv;rUT7WX(~{p(lnq*r76H7!)j1z=+``zhJ9K4 zH8oanc14;hxVj?E6&ziWNfo-BMJjYSMJ5lc!IWV&m^!Qm(}vYx+OQf-A6A1I6*Q1F zY*S-}-l9mQuC7RPg}!2u3T>*$qzVJPB9n*JU`mDVs(GdktHIP^HJCQ62GfVtU`7QE zw6%wAp5a=jdAP=zRH1D|#^m9gW6E&Crwk{2>TtrR4JUm1aKdK{CwxW);o4fm8NPWq zyHBcMb}4G|aP2;MxMrU+obai`37uUW)m!f^}CCXsTdc1u9vW zIV$;;cTf$*%;cxLQ{ za5H4(iY2DPO)huyCBMPtD4qUxj8LN6T|$X&bqOW9%_S5R;%{*YA-ugMgy1%o%i(VF zNIJNE6{dOX%JJJhFC{5|PbyFOV*L#q!6J>^Ehj;&?EG^VLX{gq z4a-c!5N?F0w-1Y8!ptw0B(ab@HV&&c!g{7mn-vtAn=k6KnF_7jmJvC+}n z$j@QGhm6vgu}U7P@s*Gl!K&ElO}4p;PK<}llkk8`SDUv7jwZRj=rFS}Hx_8y{s4!` z9+c;+s(vZ&+l&!a93;8sRFy>KZI!Aex$;=m_dP?zQH1MUIr6Zrf4kSYXc^W0=ysj~ zCt81)?P^N5oz*I0Qx98yJi@czW}M$D>CB?BPHO*7So81Bl$okGri7>Eqadn-lkeu` z%{F#dyj>Os+TAJy4OGYbm4Vvu)1FoAuT|y>rONS%s1V`^S%>I?55^)uyuSR%gbUdf zrnHYs>}*f&-PtJsf@q2dW)U*?qUx^3S%c(9{)R&pbX~)ghAOJ+T0zd7es~aT4zP{* zb0lvK%F4{WI7Xqo>-&(-#C|r98XNqsjNQ~|Gj}!pHm?{<&ryGUWQ~Ss6WyUMp58JK z`2xg7!pxEyfg|wZroOhOjRw4Uo4LmYb z@s%7~o-w~tqSNO+(pBn)lxnI@^BzJCa~-qOw2V&6$VgfhbPa69%)OROahJLAIqVgn zk5_&OBG>6m?aJ{PDb}26bNWV!jCl+l8#ZGY!^5IbLN?phi?&0cLRz4&1&Qa7>_b`H z4fX`9w~C&K1Z4yPok7p5STG)KH0F$DI6V5GmL70Z?Wgq_QyTUozFcO4e|^*yg;dt6 zRTPMaHWK+CQlvGX(eC(B;W$c;{;=y+X1+_{ZFJN9#$F7)3_Ub5r3#mx9~g|paQ`QRzT)%ZJ%C$2ou@i1w^ zP6h;<$6ON>b&Y(?nCN8UWyd2UpN#vylS0I;*O1c(H&o@BJj4?r?~B!17smiKL?FQP zo&Xl|KJ!~gdKXTv(}XWOO_!FDL8t>P`)*%9Bs7=LYqC#+=z23w<&pBtG{~tOtm7hQ zz3?%E4Zaw7HNz;4vKR6tWmUiqv{5;5ba}7x6f+B_A|m55yh8xXRuz4j12Bhh4Z;CC za)~GJxmkK1J)?a-t|nkU3~oa<-JQLeE^~ugq+W=JJ07y%U=yyYd4&YX)iO8O(%A$j z*j(PwS7FUB!It+IBF_G9bP=aK2~gHNFI8 z;_+_$70I8~7LbV%t_hyN5=hy=5+}?15@@ND*%lJ6GPmoAFW4?-=92tb#pK8*$~8!4 z@^jJ0c(nx>RTQqeKO=d#aCT+gDm}$zf$M>TOs1X(3Af5oh?YVQum2)*Ug&uNA5K{? z^B=4^pJZ!Uj?e8+nqx;?^|CVM$M3mQ7UMYOi=&@6sEVW1x-&cc$SXZ|b-)sKbHz;1 z6RmAMi*!X0_#*ynUt$s=GfydlR`!cJ4giQMY>kJi`JQX=o~PA#fylU!X_mtB1SEmU zHa+2c6qy3|3*F7q4i4hzN?2dG@#shNtUiM+P?_6Apo+D6I#%_%dQBd5nw$b6dYn{&eWOK*d=umbA{c_41jW!YO1QPOr1|K^wZw6gOXW2ea)X0--e$7q97-XV>8dY z@4!KVn$Y1g4stO1yM=j8=XpKN+=(egznAM~1y_RO@e2u0*o-f+n0j2TdsctqoE6GI zLr><(o%nm&mr*$3Fod~*@6&w6fn9oHi}9tA`XPb7LJ?J0C>ut*3|D7l`>IlKWXieX z0#eWAAqp9q_-ml-Nh7C8}n5ugy;65v!gO@oZ3X{9=VPUOy|kq+!{>G zzezaY*7f9e?aMROcoR=GtYpN6n)GMiZ@Gm0ft@-7ahn{Y#I6oV{D%_-?#j2a0%lR^+Ky?kC~I!S{zRXSv_iippkX(9D`4u$L0#_{r}|1kg4N>br=n zT9l%mKl4|^Ls}1uyvW$@sbqGe>w6&i#?HCFkB>b#i)f3=_#y>q=gwpk2bodBAk^bK za$z_F305*Qx7unen#F7`3+i;$5A+5}uFQ0cdOhuqQM{%D69zhH1x@*av<1Ly&cj9p)+3lZSmyF3N07{JI&wCr zKTGxM@O2sCw8C-j_RCxWKXxbhEFRv?M@Pc`VmXb>4?u*-uXJIha((2`Uw$B1bTk z^%i4(0`PheIi6+m2Ci~T-GL)$oqs?)2wKB>OLSUQwYd;oXtG0cvOTkx@wUvF4<`&vZr=sPY{Z{* zj3?Gep&TSoGc>^QOlNg^lLRD$k)~=q@*j^Gij3+MaRj%$J>;uwB^BB%hFKNRn>w)z`lS6Mf&p^N!P@hxt zA8WZJQ?1;@9LrxBd2X2kwbpo=lIm7jPeBP`sDtZIc*i)Bz$W?B5~M(Az|LBf$VC(D zjlwb`4J7JCwZ4BCs{j57#-4u!)_YVifar&y0L z>_HV6n0qfd;9B@02YH7PX&pL;L$y2^A^-{*ZK*_EG>df=cBY{w*`m+3|SVp5z zjr|5Sa!5H;VhRx`Dq;XYhv$)bCMg=g`jl_~MWBtxx0|gT=tfB_2$brg3 z;c}*j&E`zg;?gKptAiq_sd*lHs9}Vq?fI)6;<7kg9P24*g*sr+n?h^nAf`SvB*Lw7 z6jgCx$t9vTTnpip-@!CXK-h#o^1noVzR)DEP2Fo^=SZxgs<>@@-O13K~8d+Yb;;1JYT0rGFLCl6wTkg?Mdv5NQ)uc#O zPRjr{oM(=x6+3U1+%GAD<5SLuob0OQ#1@(PUV9_~UMrPgxi2ue2`7;2>mz;2j6|k` zNkyo-7wVKZvx<2@PPHRWL<28#620Z+0-tQtjNUnN1(_J_!Ga^GAZG5!)B58L9C(nP+#JUY^gIHz?hi=_6yC6 zXNvRJzLRoT`d`bqy*yI8xRIefuNSna0}HvVYjYWl@~EB-6Nv1igv}@s87>FMyByA# zS|C(4N`$h&UY0Q=(Cx49ma6-raq9zR zR=`bnUKP5NhQHR@iP0?9nFfVH5ivX!s{L!-<(3sfHp^(f#1bT0DuaPk(XMk|5EG%A zL6DUo3bm$y${6;S{mpSm)tRWe7Bdf+YX5G`APF`DPZ4ZAk-Y{gg2&PxR6fuV>UcO( zoa`u`qO^Ui07g%W{c*y=HftGLVJY3#mI~N_@}3q&wBsukj;PWk>k1G#sn9(+96lvQ zkrRod8H0_W4Ye~_ps#g@J_9rozeI2?3d)NXv0Cg(&AOQ_;})b^B4qV|SR?hu$r1Qt z1IsLj7z!POh=Cbw=H)^#t2QgSjC#8QsI=(DT8KQR*dKkhP!Km}sNYLqpNTVMazXUc zS%$?Mvk^I~%4;x0ZVGDmUeN~)j-VyGGOD~T_bQ@8&01kak!ACeWksUaj9e#xKfEOB zKL`lYoUgMY43Ehqqqaa21q`7CoggGhrrPy5xY|~U5m2e81wvNTtw#n?8U|@{y7JW$ z$NHkQ9Ec$xi#eW}Yu_hP$3L|G!sUicQ^)#h*=92hFY^9j(6*>Iq*XbT5a^J`dLG9! z-x6G-vQ?K06$eZR|KR9^aJ(F)0W`m6<3f1@bFnt6!25Bw5q~G(Z*%!x97O|dUUz9D zR2KBINRcEecCA+a0}9u6INj=$z+(*zNv;oaS>#n0bD=EISRz?YBudp_gfQ#_*AfQT zgfG`An~t4e-H2kAYZlu`C^HJS8k43H;BPF_!j8O84 zQ;=;lS4OP+%Z`b5^*J!(*D({65fS>Joa%HM0T&+g3|c&z7!LIE$j!FCb+z_^HO=s{ zIx0n7E(0~lRk8raiB^i%48jX%jI4Ev#=FGi74+(yXFP;TCmKtOw4;0&v~L( z4PIqCkBY@RP)}q#fGj6I+HTovagho6eC4bJv1ppNh2Jo2dmCg=E{O` zixs{wSR+vv7f?DzCmZ+!QwGgI38qS?DiIl6_|_4t%`Rs2m|M@4%_YuM!mmx7VLhb- z$5+VOg^Sh z`_@X+OX0e!1NU{_Rg3jAGnxn(JD=gJ9R@Yf9+Ta%2X3Tb&&FyOh`tt+;>~P2; zN_OF_MO>|sF&mM|z#+uB$;Q9hYaBeX3Ux<0qJ*@^g%)CqNWgv;Ypsd8n*YPzo50Cg zl=Eyg=E@v7AkdjiCdrV=WSAoyqDDYPT@`P| z3y)P%R7CM+Mb}mE1b@5hfd}fY;Hv-i+Ld+P<^TOYRrS7az1=-Y1~h*5LnYHy&;3-@ z^VVB$y+^S(bzSYjpegSvLYRLA^BE9Y*1V#ES;X?Bj>RsG0F= zD=2GyJPV;t;5ZVe6fU9JwA6VUJ=bR?6m%-OTWu#Bd9)FT&&B45VZ*LBk(P-eSU9HG zipS-4<0k~8t-+$d2sT0dW5SCwxAw(U)%&C>juB-&OWsRPun1toWiY z>1b4mQn1or!YDudWtR0F5!bakOx*i!w)Jof1zXr*ZrlvtO48My*&Gsv#NrLtfocmN2*NK++Ua(GX%* zR|bgNv|A&h;-nvv_l^89>3Za%bs2u86^n=prOVaC1sWuur@l^r!#%#sI&LF!+8T&ljlKAEhkY^I4XK- z$7$%q3N?TJW%J{xMDb!To;W|Tr1;FlVz1oeiM_-{Aw&ZN>0q=Xh=l-1Lr`m&7e(T> zR~SVt3&IH8#Im5(u`rBK*i+gVrR*XL;Kq|J2G+}6lu}Cq1f@?2K&4Jysn{Z?6`^V3 ziTU%fn*oa~V7tS3VmXM*q;L{;ahwkl9mJka^OY_vCk_urKtP>s=~W2*b2JBwN#a>J zcfMk_;v{J9IIR&!#Cf`id+8Qei*7sL0`upeG=Bk9uRK}Yyr4m{RmI5Id#hQ%i+Rj= zJ7SF#P{*~4gs^T245M0zfb}f0aFNF0J`TUzj=h(usCo(9uOX#&f#$E(043@y9-m-e z;?ci`C5n7_4xI(1n$|<|;*&2qx#{G1;_?L@r|Gu2*hOpPB>}R{@NEcCT09A>m%2!z zE(=g?rx9^^fY5?UZFEser2<47+NwDK16Mbq$w_$^uvO#m;egX6R<=AXb)55mES zf(-zsG_d?M`Za9GgVMFab14(?8-FG{ajlT70@J32NpnY?avdVg|lvTtj8pk{ql@=E#qd9tap z=Bni0LzBswt)o+;hsL#8n1oHwJ1d)Q-{bD5{=5cz)ECV(*vD837_NfRvA(%-9L~TsPt+0M4-3Yr$H)2 zf~^aE62+=~F?_& z4oiP~N9#Zm(j7w5Eu8JynhJV=&TcVO)H*v5R@+F+eIaTJpJ3^AEZ38zKZm8aBh>%k z7|6%rH;q((Foy-Tv=ywSnXP#^{J<1PwuLx)g65SL+#aG0^oQF3U+eUCIMhtHQ^`t3 z#}!eI&dknf7$xxKVsR<*0ca+1aNhOZ?;V6ew6FRad#F6gk-s)GA zQF%a!eOq%zpD{~th9A`Ype01cACSf^NgsNFAU&>RqTYEt%%QwqzBwuhEF!Om|EF)+9b=>8&+FJNgGY(wmd`Y_wOyk-x3C zqbHTbCyc#X3pOXK8gO#3U^-caxUaWhOA=pL^%^XgNpb{eBsiGr!dGwkrSe3+w z(!7fa_V=USsOcpJ04JagggUCzNqi^SyVL+60lJJ(@3yY2c%H;}|Gdi$3Jh>~qk&)q z{-z96oy4bhy=FpNGB62eaTE#wF+eSZQZ4C9T#hR*W1y-eK6~o58mKynPcwUM2C7No z+k##@p>3&wbbCurTM{42^E!wb=;+GyRi={of~>bGKr|=uRbOwjkEj9%yzC4R;DDoD zKB5{NaIZT+G$%QB_7K6tr!t8z8G1MgX|O7ZZ}NFtELfeyhibh(g8e)CagZhP>0qy) zaBF9(zdeahW_kkz+2yTCe0k0rv|w8jA8_@yS`f@|Z5u&$DpbRRyvd;ybwB6#=3-i7yj-R}z7)1wS0aBvJYR5Zt7u1E%MEf>ItQ${>%+PWQMdJ)Sx4!I6UphbGnsvs}!xMHhaKGSBrzpRo}q zJlE~Ybakct*{*bcwmB6#BXdALzrQclWzpPWiwWb94RA}s97PfaCB{v*x2JC)6(*7a zW0X&94ioEyxY{SC!$eGOAbFurYzY$^gt!Lr7RF-k29dSER_3DDF*w8MCgEN$<5C!( z7W_rTJNzwzuauAv^JfHKg;?eU3V|0QO4BK?n#BIj)YgncleuOMXq5#eYlT`sv<}3o zJffKUp&jalnj?xuNDv$Rc6D6R-PPz5Tf_e9?rQRhZDFGBu8VzQdzh%Z>kehNMy~=VhhXhsU`KDpPU0?@o}3v;;&iuW@6g!P z2rolx+PC#(+E!h^I=Sk?RjUpk8XKC%VnxzdKXzz*U-H7$U|78x(<QM3Ii z%)JMC`nuSdx*N<9-O|y57GIeRf!VD%sc?~Eb@I|na|rAo>653YrV2(^!keRNNn^g) zpWhu#^6MrcJsMQHb+B*8)35I{=P3PQTuuZo_GPxFs*lOXuGFUdjX*-`SQ`@)`~q4) zkb~y1;~eJ8#}Y8JI+uP%oU3BX-Q+s=47A)c;~ZN~?(p*5bTqGuu4gh&)s0By+xz*@j-I)~mV$eI0Gt?w;;oL5=5Xy{ap;_Kr4xDXo#K ze(Obt&^mjz*;OH#6kZgN!fRiRyoRp~XyH|_MqYzf1+?&bS0k^zs)eSn(*jR00l}%! zCxslrDFllRJ|*l&CD-7BRq3!Bm0Wxa7N)~qRC3i#uTATv+~_)OqZspP{(2YAcUY?k z5ulHA!?(e7T5A!A!1W?W7upp?;Lc8>Gh5@)+2g+YE`zf#uY}5dPC%@ zn%Z!4RAcWTa|eJmuF6)0S_*-rm;W`XIxJXIi4_LD@~^2iwUuGNsa+atR67)jEw`jeX!ez1***>%-lIBS0_qYg$8Hq`6Ql zz0_~$Za22rRenuvtaGc3TInTzO>T1fDPvdn4Y95%+@95}m0sH?y*lf(W)1J~=%sy4 zt*VchhG%+VU(>52O#3^p-fLEu>o8@*0JCc3`iaTaNmLs(laGsCfP5AH=C;m- zm2tc4e5l@hzWu1zZDG-8uI@!erOves9+xZT6&5`5ui5;?LESdGEiMFo4gS{R@9o0- zdi)+w|I1DdeBx^ug6>^z+`A5LJ%sk{q<(<*`V~+x(Xep=WVopS!YxnnZ3olF^Fx-O zeoGFA?%elnt*P4C+0pFZzNc|XIqgg=<|y&=Vny+acv1ZPqN4c9;-dHkB}MU7rA6`8 zi6S}H*v@fvE`CuHcRf{w>Opm^ro0Pf>bW39|4Y>qUS_i`SX;)k0V_7mj3<+|xT8_o zutEr2Dk7n({^H7}i)))SwtoN%MOm%_Kvn>p+xt6ux`}LRs;zA56jG+8&1Yjd;KGA| z!Z9^^cZH8 z_Q5XPQ3&JHy@MEi`vx-Gvt2cqZ)~kJn!|Dp*)A8`nn?`|_GPl|sm|7IJ-C0R8^Xv~ zsy3IG)P?(C9lf19@(Z@~3^sRW3M+2u*xJ#OiO8ZN{XMM%TU&b#flzC2w0W#^gWajl zj<)WM^*z;_?$`GeU>A4Cq>*}h(fzpDoRy95qey*w8PgCnGa5Xdw%v;xNtJjcMF_yM zGkks7eoPWOv5P#%YJ;AZCtWm)l*MTrYDMN+hR0IusK*kXIY%lkj{jPfcqL1Uy^=HV zLWSr399VOF75{~gFFd9vDQ7H6|HAV|JU-TgZ7!z|O{Ncx?;YJYGdY4rL$Y$$%#1Y; zO^vAXTjUuefD|FflbV2(BZ7C0by|r`nnIr4el4JUb~G>7GBt1TqNX*jIkYn|^;`=| zP99HQ^!L#kWj`4pXby*-eT_vh>+$;(QXEI_@bDTHyJ=zhNqBg>)GLi8;)$X}aiSzq znn)zd67v%C6AKax@lcnav}czB*5m7O#Kc`*iC65MA^`#Ue-a&3T=bWY2{}j5aP&N$ z{4k!#Z)7j`RFa6WQlW@2ApkD7|IdSR-KXD0$?bom5_r9i9qoH-Mi}rzINJBb z@iT9sq*1*Arf@$ej-j8m7hOuL?`|Hi}yPp z?_kR5_vYVu-eTFT-^kPPPH~{0v z88cq|aUC4br6f$qgg(YXpIb@}T&VPzt{QTwPrh-ziUO&ugwr^4}7 z8Y|5?_mtw?!zUzcqPom&Is(Br6<>vQ0pT#wK2I>cnd! z_B+4$mnW7&s)Z?UJXw31!;L4dgCm|2%*huXqsSkM9vxeubCwf5e9%5L!8!iep#q!e zNovXSZbjU5FHv9ohEf}WInLNAj((oPiKy^|;qkZhu>~!tvMM-)->n zxcmD^9M>pir{c75x=cOJ)w5QG$Rr#=PH0`rYgu8%$cQbm(B`n>3*l zgB<(2yN0F?jO+>KtXX#&>-8>_PzuI_QouRmfiW-Pk@vh|-O(KS{hsJ}pwAC|mW8>V zj?6Z31=DO}#L=&7wPzcl=eT3$ZxJ&REPAcuJE8+WfB7+j?ZlK5E9vif-kam@9769T zEZu75LQ#_cln`9Qd>>|V`d_OQ7xK?Tts%oA9UJZcJe{pky;kb!_Og2kPLQkG0L(64B{cY*~g|@_*({G-7Fa-0g>cV9axHJNnMBt(boQS~15jYls<7#!t zA1o%SBMw}q${n~=UGBj6L?K=~wuxU#7OGHYtt|OT6Eq$JFZ_m>z`FZ=QOh zG=M$KPL|*mN1HrVqb_pbCbijtFIW2UR!2tk%r4 z-mo|8RK|fXQCSC0sT&-)O})l}yVM6AxLW2A)M* zv;#M*mpgE~dXEEltIs*`fclODU!i{Ez`NAEQ2ct>j8b;=HeKprN7;*cvh(4y)$(Es zu|6x*Z}p@@kRH}=*7K^`BoCM7ZF;gM7!O;8n@Ng+&rmOP=qvf^y`Q*A-o*}lvFdZ+ zjp`Z)ZdErsaHqP%f&0|G4!m7`#euI@KXKqa>SQOrE>hPx^;@gn_lQ4#KS7f!q5qd+e@x-;6~N%z?Z2J2X0X}JMbp; zb_ecNpLO7^>bnlSQ~jp{?-ti$Tjl%Wj4VXQ?WRZ9sKt8hDm~}3wv!i=zf=w5cQGF` zh{-$D#1-pVJsJ2{%eUMhRVpu_0HLNzRE!jf$1^qeKP@IR*e<}XK$;fA7c*Wdcd&`j zAJIBTEv5rO#eTx`5fWeGz7c=a9aHg-FII7}3^0@y(+@8uyVt~GXa2n#B?4p0 zEOtQWyY8|60G=c~pf{S1H3#@{;(G%45Mj)-96eaSyN>vDfET!1DY&X)8zT5FJwJ<~ znpThS0~UVd&!=3qlHD=M_ff*gKf$~O8&8>>_lOAp%;chPwb6^5vv$f!LS9e!9PVVV z@#~qRsU1H6iyz3vj~dyNRQNt(`0rz$(R+C^|CWJ8&xJ-Ga@SJf z2Q2oHi+vo8_dr1mo$)c|z<<)@pJm>v^nro=dj|eFbMXJlz~a{$V+XnT1wE3Gi(ls& zzW|G0I5tHtYx)-(5qHnFyi(LGGoFwGp z2V!0N2e9~ovBB{Ju=s&o{D6?O3t(v%w;YDgI^MIv5%2a>;o42 z3nTUci+$u`zrpkmVDSUF_|c(vHH#ttXBc2E_SXlw*ayEPOZ|nmW`(SeH0~Y(p#eS2q zKdyIFjR7zAk>5|doAusb%pW!I&zXb&R|fu*fyGXxv4mh@9OPrP+4_ckjav?9#-_J7W{JR4vc6#GK`aQg?I1Oqofxl} znQUt7t{u+m7hVDZJcnbSc7wq1ln4xD`)<5qx~+1&dv{h|I&&?UXS-;ikuP0kw^nxc zPG{Q=Y?&C!$1m5R`@vq>AnemOTvt=uJ+d`bTc6{P|5zE=Q~l!2%>LH?J#{VBJ7(%~ z*rlD;Q+NNh!n~(pWcc9Zfu6>i${c3#V;H<6hlRIyUsr8qWBow(P<4*mzRxrAK3jIQ zGc|I3!xg(n8hpL$Cr8Fc*QfnQI@~)Yd8mE%E=okoE_8;`!Sf+uEKHbH@Ceqdg+;J> zg(QshZ~f9e6J--KyT^wPj!dZ#4iBk}?*l3)Ifij4x8xE3yBp=C1`5skN47B6@>HgH=+KR4<-inrr%@zF>y_t&C#humFgPpZi zgPqk?727ZFtg5Q$2c{pGeqcH>nGAlnRSfoL`nT3sJglGzp)~dYVJ5(ZH}{jlM`9DmKC7`wc_XpY90ll0~ZR8cHrhw5Im$w z2aa+e=a<(93B-?fVCNS{6{gnjhxpMB^pH41WbTb8(sOP(M(f;di}ajr+j^U^_xQTZ zIzA_1b6i%Kp%#{pHq_?nuDL{tt@2#L#MXE&cCGAO?Apc>yTfR!qn&C(ZRN=Fuqb@$ z(dYY+thCjfdPr(}?2>byoJ5_SOAARY{VqL@=8;Oy#bO|MEFFTz361NRXgoUs!$d2X zZ0a6(#wK7nM}eLs=#k1yo~Lq8!FIk=fv@`HsPKvSz)oQzzI;=dh>y|~CgQs>vk+%< zsD3tw8fJ5-F^@xLf>(jpAanfjX^n+x_|#89IedkuAPt|%DM-Vsm4#`u_|h);Yo_3KbZ3Vv5l;eq};FC#(D0w=9^*3H<5OTc z#)W|IapfoATUq%D_=A>;XMAHrlMUxNUTZ-(Vog7`dr zF$O$7vz3=0U%|?YuPREd1Q(2e6hHSq9clQN~|Lv{eMInQVT0evND;Mt|5%pt*m_KSo_q zUk*A9%f-?%79(1}V<8gNJ}elT);kp-SBnk!Sh19O!-z?{@LDMsK}>WD^ff0&O4Klx zD6zn<1#Aa^litU;?2h8QC6k|++^S)bOR?&g{4p*d=dG+jhiL~gu=od6`rbVR$nR-? zQI-nsv1`bgW`fn{Dt}KTp?#CQyT5zBWCS4~vy$f++4O~Ne=n4Mbq`W^U z^?fZv98=tQ;S267!Uv=^jaxw4B3IY#k;WBXlYU`Z5eBeSuhVTJ1cjcJw#q%9TR3qO zj^QD#Dt7_3e6Mah0q8LjwhN`hRu6WU#I^}Gou(E`gQ~Xx!_uOCuAM+mj@HkLe%{*u z1x(w9u-a7YbYq5DpxDy?a5^N=lYt!g{+7Posn_0x@fJKd!GzJlQ)jUq(5|-qgn}RG z-xd_0%iFH8qV_D7jTaitUsMl4#1ckKrnAWWD1St1N606Vk)-t&(cQC+>=?bkT{fd0 zT`4_Wv|GPKPa#AhG~$j9li2g*C3B6y?@cVhBs*U$llP0}@SwyD8JNO#@HWt!5Qd@^ zB2QMN3jQqC8H;Y(w+k)EW;_6=V|w%2kTz8TK%AnOAB>`tm>5SkhT7|KPnrmu46u}* z#Ln06U6`=5EH?L~Y3w24bm!RlXxLqH^Tpc+et<}NFhRk4m%vhgG@q$;xbo`N8d^z4 zDeB|G^OD5COEzCjt#pJ)0uiI)xuz)DdRmTsN29`Rt}$YRMN@Y@m|vhCeXbzF77Pbs zPyNBi-*$o4BM8HxG5WU!))`}dA`b>izcY9bi^ia|vPu&_Yu2Cu}iUJf$^9=NE=J75tG3h$UuU6>2UlZh4n3{dW?=?4JTWU0?4WLp) zuJxJy!de_Qx<|FxcSYQ|ABsqf1AM9p35{H!{z;PkFowN#>WHAi^~Z=!_ttS-(#f7F z0g+;x!cg_wI<)+KRNk+ycxVQ0-a160FjA5~=xL-a@+&`v$TCI$!@TGzH2HZ{?mz}G zzI&`Z3`>f0K)1rCb?mM_UJ@KS*?tylF-qEWQK*)J^VBCjQ`hY=Q>{v6w}A6&6Dr72 zJYW?fhZQqCYh(=atUB;g(pc_N9h{a-yQxQm2AMELTP^Nq$E2ghtJ08dUOy)O5%?r& zQfbS@T=d=OR`~b8>z*amoG|d%l}TN`aY0C!yN%xU04WqEEBjZ>Ah%io$8;?F6cB6t z)8CJyJxp14t!EA$urfh^tr*cDs+W|Kby}kKJq%*dP)s# z9lX0Ody6d~ms;pRCh#YqM7dG%DBsi3sSepj%}<13fc%6lYd+mB`d4EvRP{-efRbL+ zNCR`GQ0^>0TY~`r zCbV?`HwfCVvWASDWU)mOMr#ZovPNCJRc$aOfpwcD^=M<6SvCFL9*Y58rkvRL#Yg#t zW>m)4`Np7!O@9ank!%4;b~m_-mmNI$$=XUl>;}0ZjQt z)*ajL_B<4l{5~f>d|xvrpMRy~Y9WUlFzg$2Xh_Hll|L}KGiexfwjmtoM3GHDE^cZ$ z&-Ae2*BM7^Cey3Uu;wQi(L_P&A|9yXISYf}pL{+REcKpC0bC{|s>HSAV+0o2**FAC z*O%w|vbI-R83AR9B!uIl# zpKPUy1bhGlT_R|&xHJ38mgt9&fDCj2Aa~j6S{J=}SnU&+QA9GfG$3-=IW+SaJzaVx zvGl>OL=61rP$hJJyX;Ak3MmuV{!kE%P}C}C$RcP@?2~VAkp(1^$mqM#T66)?OZiy- zQepUZD~Fa~ph(EIk&wt(MseLjx>Zc&TiI#rL2S3m&HlSq68YnlHNxDfa^H5Ef+YS} zRiIeX7MX}MU z4P#4Jpe5n#!i_3REG&ZHqLPR4mnh?j25FIck1pW1Na{w`)_S9<%(U|3!bJLGno_p! ziFTN46%o~-^$Qb!OoO6SwhzstQ=$=~`ZC+1{1t|=BXF)whmO-yniIRuNp0~^8!AN) z(Dpd4AYqdn>FtEjB=nk|F>J|=CDNc95s9OsRJ@gUo~0#RoDLOIaWhH74}j$lh>%82}9 zENv876lCL3x-5-Al9o0bbqYd$bibr@TP&gkJNgOB&`hz%sTCUt`%TlP^zq3m_()mN z;4WfmEzH{Kv`_U)N4En6UB!B33I%D1vr-b)mRFT+N9`CiI>Eyurl^hSAp>Om7jaUd z8$sM^>krI+^g9#eB_?Q@={?lKjU-_iQaV8u6D#vL{sga^9tZ0YV3@#U1n9I$?J?kP z<8{7lNE>?RhsxSj3{smcGjb74h%*n{it9;0yDBS!t4GKKA(NzozC*xN;0fxLy6L@n zMIq`AH?WHyf61V*!zz1HgmfqSPIs|A1TxgerEd5svda~A?n+H2eH$$aAu6X>M?x(2 zgj`h}I9jxoF_cK5WpM|9@gK&w0}IZgBZAr@kXR-D}p*OMJ_Q1OWS-G&=9)0%Z{k;SWi(Yk%K$f6xk%mOOtgx0RQGo_ zV_j_$Z`twCplhRTBKkx-anSuZ`L3|`HmUs@ZMA@Kr5$`QR*53fj2~=oJVC*+oo-BP zJH~U#t~av>iF`_m`m6YR1b+#&2_q3J%1+co6qxp@t0lZ|(;#L^p(J&WnYe~0(o|~S zCd`@SXx*po1UFqY>2bA7^N5S$O}mgV6|tvb-0$HY^(2=0XC(N9h7_dK-U=Z%wN31{ zhwnZb9F|%fp-a?cd&w|ADFc;XQPZ{B(LD)X1+XEIMtH+OlGOkq@bUR;outc!DDlCc zR!c*k#2<0zVcID&3%?4;CLY&*SfT56*^{fhfP`5=OkFi$h4|(Mv|Ubkcw#2J9WnNX znteaws=8Xe9dYvL`w^S&jLRi2-q$(_?`*RD*i4fjpJ>~Szsk=|wDEMI9WV0a_8olc z=Uq6nrDNC7@Z_OnYHDia;BI_#C+}{K>geC7TmUnY*fku+hnWLl2Qfduyjaiard##YrWIsWv9ts46Bi7TwXa)CyJ^Rf1cjRH`uut zxM+G;2*LM*zZQan%MSfoQ(Uxa26k-RhB3;`0vE}9Ipko)d3i)%g7llGSYE6VrRr~3 z(9vB^PEUO>z&$`nRexNh<94bo(@O3YA78}bmGaco!Qd5gyhrs*Ew}uP{bHqQ1pNWHx-fdA`=rLm3Vl{k{q$JRC$a?h`k~AGXf}Y9mCA z7GNAtzsUp8(_^LZhkp)$_xjyF=3&1i1qkXS3PnXbl{ZbaTS`8?dTJM?JjZ%HQ;<<0I4dL~^uqNPT5P4YsyNI)-z|ed3*e4%v^dfU+uVphfrT{pVvH_x$&7e*M6` zyLKBVCBK5-cv9WbJfv2rSI@hF^bY)bi`1K5FqF7I zabNSOdi7g@oj37TNNvJzEcsIW#*<%}I5Mhk2Tdie1x>YIo4Ef4`%}MO?D(BOW z%FPq8^FDFTsjZ)GR*&9y&PC^(`PjoxE_&eWPpSuAi$Cwl_yboiKl9$#KIw(Zu~0eg zmp{||;~#vWdDZtyN7Wnt{p`;)&wu3n>%Trg=@FB^`}(g9ym@)qV;=@J;Zyej`zW~P zKX&l!4**{Q_{_8Z^YNn5GtWBnUVM_|v5%bnvgSWLde1qxH>)3PY<}|o^no{*c#kOb z%Ts^&-_POV6Y!rN*5xPfD{fuXy79OFJ2}>Rd$T9}cm8H!4E-a0#{P>Zy$jSGvGXn* zDmiEIV_(_1V&cl>XWaX;oqfxPC(0#%m*hX4=v%(zUUkQXLmzGa#Sd<2PCm?j{=(U> zX`c5;RO%%=-!ZZ9v713F@o6vFIW$r9STk_(M;_XF?u2^N>Y)!0KY9Nx2Ocf;9uE8` z{HI5>|BLRsIEm6z_dl^{qm)p;e7NTQ^U}?Ti01t-l|0spncZsd;Vt_U8`;+$Xz^>P z_tp1)VfRBNWeXo#?(O!jc?cNNW7m8OCE`1LygG2?UecI&@Sef^Ty+u7D6w-D|4-k|-B>z zK((Dl#N`1(3u35rQMjcZAllGY%>fv=x)Dv5b_sNr=#~Jj-6b*;AVW&#;i}Fhh!UXN z0<=*AWcyiYv?|0hFa4y-F9Ay4v#6P}Tx#PbRp_fF%TmG@vQFH9-7uEo^F2d!z_MBP`I&UKVhj zS1j3nW;}LBi;aW$#F{BW>VPg{Rm761|DXl5<#EeT+94|BAvPfe=(yI_fGs?!fy)wbl4-ofi!BT%lh=(-?@#8v zLQn2JG?|>)Iy!|9Z)vkI37fJnN&7Z_OW$spSfO{Ges}1T1YoFcs`q_Q2Ptd;C zNgSi+;%^21c%$aoeXsfHgG%g`^6b9X-n08&`&(N-yYIE~p56CaUt4os@O=EO#9xby zndW(^u9=C+f5cHiq~_q|>f z+O|Eqi~C<-Q*LM9>s2^|@OI;c_~UYLT%KS(&b0&ohL1ch&(o8<$apO42O-fv!x}pcG%~4rPA3Re7P#vM41zJgH5G3JNOF>9y=l0Etj$N;VO;oOAmAgcx=VE zTH^;Cd|G)IYCQIbO!@rW*m{l8p7QsSuB?LkwH93!a6|h#qrJT^KtuU@jqVB?2_1$I>H?xS8FZ)* zh~7eUM}M}reFs+6{7&Px?AUT#NL?*q3S$WSObVrMdnV{nM(%(iwDtti#mz_u4SryI zrYndH?#I40paiP8fB81wM%X&H^}bpt2#$PCXMJL>+q-;Pj^jf(`#~_X(Z>u;ybnlh^@D~)=K~6xecVvsdq7~jA2I}SJw!soPXwfp zHn#k=z8yFo5<=5oPZE!_Y+wICYe#F3A24*|2A|rTYDxE{eIi}C(I@uyb%jP*xbhsI zl)~n%ffRhX$tR)K-2n-{+~SeOV>{b2*xQ-e?o;W@tpU~X1m<2Cka|-sVXZLuqJW4- zb1lAHXdS6a23b#fpcWQeTkRsxD+!r%f4thGf&Op7HzK-7ZZ0|Nbj`N$q z939uYWQ^8wl#h|S@E!7yNqs>@~Iuxl7_Ca8BAaR1CFvy~ch$bkc- zH|Ed-`#fPcx%4d=Up-t<-o-g&U%k*T$)Wq|rGYlM^p0wFA}hx~|s0;(D zxha={$D3wgv~A91X!RKwZk@RdJR-FQ9BOYZ6& z1X+KyoYK86c|cF~HJ$!#ap}FCoa$*Z>$k&_JGwbuv5y&NNa%noTq65d(>NEo(j~HQ z4G|5$(hle?v!y3novp45X7iPG z$~)pYA%~^+DDO6x+z^%?R^Ce@|PaN=bw7)Z07J)sp!jz4b>bEF6RvYj1W9f27RVQ&euboBJ|pzR1Qzc~cHHO$hL z!@|?^+rlipJ$*q<5CLxw6Pv?Cbnu;FA}isTXG6Tta->t(79fit^tH1Bce&*LZ9bL0 zzu%?i%uhey(jD*M`rR(ssTrLApi9nd589TV-)G5Ci)-utOo$BWk4MOTC|HO&8fbzbX!-L7k<`5UEp}dE4xT@Q^8f%1M~iQ5NKo!OdfT|<|gCPiEV?Uxab`o=H^$Kzi)9JOIG=Y#*B zOU_m{g*npT`1c4$Q&osVj)`A89CcwbJ@}1F&Q?{2Iq1Z19gg}inI8PkC1{$lRXk3ElamLfkZ+ z#_v(@nTEuksTHREOB6awxzc-Sb=8;t`8BhsBZ-;c^~Pb5Y1WDN6$5qCNrh>9WvHISChrz>?*Sg z#=ylEY3~ow>LmfPhZo$Hob_z5NVDb)4=xQ*=B^k_UuKbJJsW5CR@`dKc5x{M>k7JD zl?1+Bm#dQy!y$-<`T#pRC7)yDsBoT?MGeKn+QJU)}39 zP-C(Rj&CtgQxaP;c>Nlxu93&a2Mko3?nz-Jr*6@B$6R}#KmXZQ=PhZX<~1L*g7bS6?)Gn2Fs+8mD2A?GU zV0p|?rJ6VTRISq7Mfq3H%cS0;dI~J8W4E+vS!jb zFLd#4YriN$w5=_YFAj)(W(iuVeVdC9N7YMmNO}&#p1s}Bs%x^HnHD{(-V6MzTs$t9 zY-fS^>IkuKyE*LHzpsf94T&M~+6c)E0(?&5brDj!M_+ldV_qMjp=l*VuvG)@1?rYJ z{@ZF}KM(JX5mFHFmH58D_ofJ$HB6-kL^IF5cQ|xyu@aZcZ+7u+%e*B*^jn74FmH_z z?fp4K`r9HTd%F+g-PO z-*4%)xG~wGZ%nd#Kj7lCxK8g%*$Zf1LHb=qv241pr@y~vt35eD!Kb|a(}%{#Rt>FA zu0ld~*<~1e`QVof2^baj?p>{)+|)BC>}dBz7HSlE0$-U)yneMLJ;%0_<6CSctyM@etuC= zd}VP_{DP9A_^Q&P`07Ma{K7K%GKJhLkIR$kIsGFaO7WXTdO?~+Jy-OLdkaobyP(^% zSv=L1$!3!)HqDGDlbFj?RyM2<0&iiFP*s0%Wz)sAO&Z%j(2@og;}v8Dz#-b-(bG+2 zQ&VkaQ>TzJEp0v<%K=vn2MGvIjovtNXm1wL#JO64U`M!^iRnp$z&<9%G`I4!Zs3WE zHawb`>Pxrd2lsA8T^KviKG@Z4bQnB7Qj<;h^bKUTXS-@JYuj3BG>7FHvRy8=HIo_` z?90d*d0S6kOMa?0r`yP=vx1ny4|Mc)?#M6L(lglHnJKIo3oacknTRYZ(%;iMu(h?< z5D2yQMw`caFxZ{y>}c!GSl?5<>3+`lGkvhT*{JC0MfZ2$(qA?ajUqcUTQi-Ud860R z;OVsO-egTxWm6?iOCSKt&d{v@eOWvQhh@uDe}4uKz-aXJ{+WZj!)0+Ahh35CmE(hN zd*G`i?)x2ikEvp?@mosquVX8gk|o8(@iR-7;NMD=y^>S#X>QN^f1;CoMa3uJm^+1* zk#feP^gnrCmzObLd+8V-okj~HS%GV2#+rwwMpXHWRTAhcX2x1Z4-@j(O8Dvl{-pZy zRW`oS;^-oa;=9e7r$|5S1K8>(or&}qMkeN@p^VQB1PP}mIM&OIWKRtQG(Io%6jB^V z=J4;|UX82FWk z$KL!P(AzBckC;fXVxdU509pWQMg{}h5TP+Ja&SUoqaW|f>u)LPe*bqs;n)aFkS||+ zSgWKnX&#=rf`r%o5eVkflp0Mogh{}2e6f*0Y~Y1{KWQ)80naHWzRZ|l9Gro1-~t&3 zel5Ca;Dn3=@~tWwFDmt?Au|1F{;lVIHW~wMi~)2nla&mG0ed~0%}$O?&5TX!F=3I1 zFbLwp+rmJoz@LtT-=mZp2Qcv|IC2T+hE{1f#X80Y0I3LD2mQiSC+p~rC%Mx z61P8C-~rpzo;{QPXknFw!lVZJubG(PGuUKR<#*Xri5)Luueu(evYZ*#@LlxBoPAL` z1+Bx+7TWVl$RZh$^2LqyLv!f(v*#DmqURUBI};g8$QBMOnQI^Wd4_RizQia_P#w-Q zILl;Fnp14OC1zqP6h}J93<5!Qh72<&I;JY6%6Z0_f-&`$STv?&^r0TB?9U!kb|8Yy zd@*JHFm;nL&BhdI(U>AG5>rV*_2Sp0!edpwxl1&rXhFvmRn8%%isO$UrZ6H^1b+yk zqy*7JqLYrEkaN`vT1Ltlm(pMLya$7D$&3%-6S8P&Br6jNl~ah9bS{4NdFbmXh0jAq zg=Wj!_g1lC5ku_za3W85z$o0e$8sLh7U$fr|6RCWzXCr`;Q7WjWp2NI&GUX6^lQuL z)UkCe6~?3^zJcFxzgiVS{Hy9${hsD=Ut<=>-yfH2%=(gL{&mIAP`wk_pZGGFq@4b2 ze!}zK5%-7n-l5?GBh#tFL!)ELTl6v`Wu+rWY%s4BPOmp1$G3ccLHG5)K|#2$!|Ju} zd}FvZXROQSSJC5``j6!}PI$+19BYd$&^f2^`61okc1-?P(L?V~$e3)KFSoBB_q+#! zzV4qG8XkF?T^*VO{v7oU_jO1;n*!;tsjvS9{>-7Tz4%)bGQXR@q{${7OpT_W}HQYAdrZNs*HkNnED88Gl%&qh=nuDBg+eeY%KWKWWW>+!j)V zhp8MNt4{3kvC!1^*pH8u6F26BBYbRQaT#y0i`M#uNbRhc<5tcB2#(FLRa zk?|3Ev?_dLaOH4Uc*%&fbDr5R!XIN5Z-D~j2g2?3eqIlRGhh5$mxKX7gv00e1Yn-T z!smA%<;0-oa#j~991>g)@YvS_7=z)pMeS)jbj%^{7R29MWbQSTa^#kHJM+ZGTQD~` z*6~>4?X5BI%|-q&tb02gWL9k`$oRlsD99L8;UHs7T^$ZGua_YfT8BI*Z;aW?|9o*} zy`UZ@!r{2GI8Pldh$tBfB0x_sj$*Ek`J_WOcM9Dd3CShk8$T=6G)JX;BBBw+rA})dxkK%YKe!aK} zZq#qviH+}f!v&^eA5Y!+#&=`h+sphwxATqOndp4O+6e{x*I?EU_)n`(5e&^Y-VE3o zRj&aeXTBkmi6kiD$;54dnexTFbwqRM@!8HLNDI#;E(F|&KTHvLbn{uBF^m%=vS)0 zz}$i!NXmCSSeHzg{9m10%#Xjk`2Wt_;swS2kgMkw;ULrJPAACzOmhnxSoz}0dST;= z@L$v1ViWwC)7;{2#1YQp^DuchTV|;-K9;ArnsWlz4S0fK%2~ro|HAX`4#EXz=)RGC zqf=NHz_|s<3i?CRi)FvPYbN%Nw-1f)!Kd<7`OoAlHd}t?;W@saPzY%y{`9rYuTbK} zu)Vekn*bUqUwl}*n!`O0^NIqol3-50Xx!*amVBo^t8Fgx&!vH|ST)bjWR|EeenaoA zIH!1dM8`{6BwikdwZF=E`IhHB;>63~_~g+dX02|zRmgNq{3A+{mb zVxdt&E>LI2z}PxAv~P+_gq-0rRp3v@!B0_jq`WWE@%mZ*n`@G%_!WDCuxXFvXr z{=AI#V$Oa3F}KejgL5bFShr1@+vh*=yt|w}xAzw1)L`X~sndgJTmA*Ljr6%y3kuU; zd%yF{GKXW`i$8>Z$J}84l9HudXpl>NT=2_67ImK3YkfP_&xwQP7skAYoH*#89-5w+ zDtz7YV!a5uyK89bz{nmYw=+2)L~al)@UEO0GrIDQ52a|4NURukD9alswi2W>5e|9f{r=FP;va`QpAvbx>l(liXQx& znDYgjlPM==(vNxGADoy;kB#8f4;eYE)G>`5*gp;i^!ef^C`IBytECTltcvcaP6JBxM1$XQJF$aR>JqMA%Stove%p67*kUJe4q}`C=<(BhOU(PC6F+?;L-_2G zxjknUg(67DOE`i!5sjRRmde1SAEwh|4fhF;#E@8mEYj19Atzw;BmKuT)|4K@v)sA` zp6<(j*c3dS#-89)6Jw*(*{PA?X>4~l6>JhdoLqNk#NRJj@Dn5BdoJ~HdjuD3B;Hef zv`xf)(P7=h&hINi%gx+V{_jFCBiDsv5x6u0mqcJseFpmM^$Cw(SKp}-cu52A;KB9~}4;6~0`LtHtU%J?#>ws@t5-R2kvib`ce-kI;M3Fwhd-g_JM;xASr%@u`RZ~9UZ~D-_)k{varBkx zd6Tc=H&6Z1UVQ=Q;cWH3(1NO`j;Mcd;1{W%IPlBVQx5zpwVZqVn&hcBs3r$~tJ>uQ>2$)Z-5Pc~!(Ssc-+wDt(fLSig+QI`C%o90%T_-r&I7 z)JGloD)mhV9#+3_;89f?iU&^}Qs+7FjJn)`Z&V+4;G5M~9QZc%uMYfjZ0;Pc&ui3~ z4*Vun@4#UR$OkXpDX>|dK&<-lF4 z*@64jP6yth4m)sG-R{66>irIUKz-4HuT?*E;Oo?r4t$fkIrRFXr#7nc#bJMMRcjsi zrK;6|U#WIE@axo#4*X{IS_giI`j7*^S3T&!A5=ea;E$?5Iq;{{n;n1C>a@^;wx>R) zDjoPA)W;nD4)t{h?omH;;6e4217E3@1}85ZFGH%zf%mCR4t!7zJMfgc$$@WBuXEt% zsZEZ*x2Qc1{1Wv%2Y!WmqXWNI-Rr=2sINKjo$6-}{2pv*9`4_})fo zr2}8DN=~=hIo@5a-sjMttG>hA{3dz0-||^~Nhuf)U$6Kt2X0iioB1pmJhe*wve*a< zyj*S8lYK#YDyixndWCw4L$6fBj{REodB?vOsP8%Oi`DNO_;1t#&T>ui)T`C`4*W)S znFGH~ZFAsvs|g2wzj}!S-=p5?z#mtiap2FYe{|q4s9!nogX(Oj{aaPN19z%!2kujQ z9eBHXo&#U4Uhlwr)Q24S8ucXyo=`t@;KS-a9r!uwO6Po%Qd3TUtyd2_{e78Qq%UHm z#XYRXz05W~au2&^-R{uOR^M>wEA+aT!QsB1I@!@*t-kEUN4>f_G@tR*3)M{ye7m~C zfnTpa>A-JM|Lnl;RKIuN_o;GczVabe>A)XT-46U|HRiw%sB@k9MT>f=L;sSx%%N{m zS2}R7y551es@FO2PIa#X?^fS*;Qi{C4m_^PocYJJTIs;gS2v))+2jx6FNXQ*>kRyE zfx%p=)Z+3p{9atF)~Tt*aYmqFWH4&Y_d>Gfcoau!XT3yRqJrc%#G>3lQhiFs9ph@=|PaFU8G z#;7Nz>xlDYb>n`emV&3eTw!`0Q;(=}xsHdq6<)d0Q}7s@=1NGGFQXqZF}1?`5HAnu zSB!k+bu7v`s|X60om#F&V`_<>l$*5#0m`9Q{VR=voBZBVcEu{FI;C8W>HiX!mWuC- z%BfaQZkAS}$-HuQ0Htdoj7JI7Ygp-}PzBCqvP^Y)OdSO746Pnq?aTDw7V|EX;|7kP zx*mc?99}k0#So1vJOSq~R5;XV0Se0&f+L0X?wBfH#;`k=Sk7I^0Qh~PW2slBt|dY@ zr&gj zA2Bd;;ro+bqCfk;4g5y~V^Nf+t=PBpo;b0O2k;c}p9tVd!k^TS>&4y>;Ae=xFMtmb zzBhnH&!?2^8yI_Ifah@(`?ONi%-h9_&KD1RL67d)e-zhl&U8E>ZtYV0ghfMxGlZ$;cp3TKR_$48)C*O8sAF$XzBVr%0*hen*U#y>+j{!y( zDCRiARqQUMzGiZ?e zFA2HWztY$TEcVZe*as~3k&FG8D)nI~hyh0EN{&NG#qQQG#V{AUI5=!BcEK+Rx!A>` z_QjL~EOs#%3;(y2dJge`#V&HOi%HBq1~2gqJPuhE`=C-^Ho3^-ptHHy1)n73V)rUz z7qHk}6R`_e>>?Mte`Dh8CnnB-zn}Jyf1de=O#37M5n=F&eGDEp7eBx+3Ay-jwebV6 z_)!`01F-mkT>N;sQc`c|mwE&LS=vMX0CRN8H%R=ZegPK0)<^sTEPf#uzi_Zie*yk6^&*%4daLO#9&6roWI&e<7FtLN0!c1iAPD zIZ4RHk8a}!VDV!`#1FvY2XgV_x#oBW{7EQ^A^$A%w=4BklmF1lcg*ipa;?E!?CuM4u?s#)$i;52u?tx2o*S_X zSnMJfy8!Nmf*9bBn_TR_!^|s?f1h~dVt;>-i+#vRLN4~V82f<5ellVou-Hc~_K%qJ z8eloEA^(hmy>}}06_fwKQ1?GGMSmrgz z?}x(JyUh6>xy0j7^z$FYbDqvz{JAE`#h>#)XF@Li^c#Nwi$CW?`~fWfAio7-G5laE zs$zgK6_#B5dbgQ}Ab*s2rkpmO_>~*%L{+fMz8hU2xd+M|Nc6mhP z;K;#)Llf)wL!fO3soCtrc*V?QQ(JfKaE`zz-x!~qnV1%V;VBUq$oAcM#dKTcc=ztC z-ZCw4D!8c&16|h%e?v=qe?!xCt(h&2h56}F^_0}$n&ydX4{zRgxDot$YGA&j%L+6K z|JKUR-sx=Hfh`k5Ir`B^sKb=FpXwKPX7;!C@2P94-Z4{`quzdP7s?N}&~|pRZF_xf z#g1zSo2qk^o3HkQx&K;Gy{BPh_~7J$p2nI=t9t$9$k^!mjJb85_eI~Mu<*4Cmjw^m zh8~{|v;!Y`zdx4-ZQ6-ko&K8uuC?HG)qHq*7g*7}`lA>D7Jk`BJ_Drr#u;Bo%|Y^0 zYXLI!B@B9C4w#9V-Q)PSz*LA)f0WPF7<`5?PzZm_W5*88JZc!SF*G?ez7Hncipv*7 z9ZCIAT7dGOKMGK}4FD#2z$9dEFTa)$s*v$=J)Z7ZKQui(Il6mhn(pxPyodLWWcTAy z7`%}Y(l9!{_fQxf8yz1}ro|2p4d;*#4O^-nfYkb_{ZrGE(?h$}`r$(d4~~o@_$*@T zhJz%i=9$s4Jt^Oxii&~uF6`T$I$T@PRnc3~Qn9(BzoIu&k-E6Ex_Yp)wra4mx~gLP z#hq1E75%{U1Je&oM<$cO@3so;g44gXzT$cP1Dn&ETQt}Ju)VXQM?R5Tk!emfR`g*6 zsp!QHR*e;zRCCASYBTQao1DnHb*yj($BLs5j`>yC!4e9NHdy9SFd7V=P;j)tGo*mM z^mJ;#PJcS`CQvGZ!5sb{Z7>h{pCi8?@<$uo^T?wU&0xh>`4%p;p(-My;uu zmD)5LwRTp!b#=4J*3ary!>nF4%<5I+tX?(c@ybl+(UA5sIy5K-#KzqE_(W`JmeU13 z5j&L?Cf4Mct@@JKX{oSe?Q9O!&E`=3Yz{Td<`6bvD(q0>Yz{T$aVQAk*?P2kwhpby z)1SWD+S!7vZnhY!o6Vv6*&J$^&7sEG9BRsA(?$Zeaw^#F)w48vO`cY_I%{W%g1T9P z0Q-0q^re0lUm9ldrEwNtn)3K!=Q&k1q08cq<67s)se@c)V-U#GM}}0DCuA%sPv;p@ zzW6nye9>!2`C`|Q@6TqBG!B z45Vf9oqaSV-Iel2>Iel z6ABs67gr*YFRp};FRp};FRnBppK-3b=4*AdNWM{>it>%=g3qTP{Q1Un^5+}PiO)Bd z6Q6G+7kmM``9^W_V+;>2XE7}+bX&^5wG?oNZxwZp?yjil8@YC7WNNyi0(UpYMt8f4 zb8nx_>Hbk*{+YQ~6zJ2{aqm58oO_21jr6qc76lf~&7sInd;K>|rKiWz=$r$tGji9e zVvnl8({gy|m(QvUjSTG`Ro?k17N-wQPLEu_uB&DpZbMh9l6j?FWwG+uQg4}ehIe-S zWXkk)DX$cTBK*yg5>Z+a9}~a>3-Uy;5I5jAE~R_rm(Lq7R~{Y|kQA5wgACwjyvMHM zn|;_XOt2J#5!#ScZVS=;Bs^Q7YD-j1TcD|g-%hbU$MdRYe9n# zT1eY?(C1R^f>~&-1OzPW zlFOm?c`3%!KQ^);t_en-lG7n|hDOM*7?#q1@mD+x#0JiwIXPr(G{T5s5-9}vrMjSs zWUyEah)RVi@zr4GI>YrX$>T3W_Azx(5KJf{ zp~CczEZ<>%5`T0mqRVeFWjJM$=IAgG59GVW73<>`rwyLGfsB?0E5-m0%oscn0^LLN zUtv`0OjGy})FM>`FCPwvGkxZ;9%z>0P`lv#Zg?zYxSY>dBC(scta3ZbNZHD2Hom7> z>>b3DS0)AZf~GGDQku@vRnZuWsLe7o>p!E&2E16CRhyM!m;f5m{;}3NEwcrkKgUP_ z@<8&<7HuK@LH-<69>hT@CFG_Syf6a|zasYk326m>>5A@ZZTGWcq^Nc=-9ds>#&0cE zL=iuE#)T+SG|i~LA*1gzog{%W8d)KqIU>?$GSRmf2iV)hw<3A$?>xwuw8|Egi8L*1 zGz=N46)0*{vDX76rSl6msF)*^WlP`!d8 zMo79ptTohI|37>00-sk^$yDVP(zc+w3JDM`?`y>C_@X%;wowTBgSQ6 ziICsO-3m3rq-fYArBA|xb{G~2Z$yNd((mJ)*|00DmfDA-432&e)<%6)=?t{JPNZ^$ zsTman(|nhA2&8+*Z0mLRIw;vUI0= zSpbfjvPbjbc$H5{+sSmvv58Es%!Ux+9o8>jJf?DE_M)T6;vtkj$Y{@CRC)uv$iL7f zuxre(D8jnc9QYxix_y?@Os*x5g_hV&xnm>03yxK8MqE-pTw_cNA?k#Q^7>y(aFh^>$sbFSj-M57u!LKA31w&MR$N;{L8CdHt9Z-R;w?958<791yz(-g?#Zt3+xJ2lt~ zl^c^29uFgSXxN&dxGpCBPKz?>G=c$OPJE~^61awO2T#^khNoff0wP>Z5h(Z3@;=UG&RznP8`n6rRD z^|TDfj^uF;aiV@H3GgSC!vgR+ZXT=-jld63T`Y+VQ#F!fxdSS1wt=rAt%;^%XtJmr zV(G$)<}pZzz0mu4m&yY$Q1pmW1WRwWq|7Tmi!f1l4ca4r03zaxen+kqP=_%&s*gfQ zgAd*gSI>w7v&<8bI*Kv~f~At0t-EWy959E-N2*zvhyrV4|*eoYn6z~FBp#w0BDz02;kL-nfF4?mD- z-kfqHN4i0mp}oL*xYxt-M~I(kf`g2GV2{n%p_cVrO~4D>%?9jq@qh~2fFk;3sA?6L z?IB;9k&NKmBnyIeTCm-lHcynPGKe?2MFsL2NMLiw5DBiIcgq0nj$HGBRK}{?y;U~c)SAUrk$ZAGH_=o{f`^iM0c4_4QE#yf&5_=y0PP4t2yikKI ze#$aA8(ZyZb3MErTbC?g=7>%B=)qo=9bQVHz`xCbElr);cKeZvd%;uvrgbW$zIw=n zUr)pX8P-51GUmKr5)e+=(xX?*21c5()q~@Dkl9JJxrar*8$XvYxez+jj2N==LSXKY z`dYTtG_erLx>4F7>nh{(6#;luoPT@=galg~T_|Yh#XOHNs+TL@{b+eWq<-W0e z6KH-d6k`#IDzaFyY9`o$H3T`E7<4nO>(|H>fmxI}Z#7caYrR!J=n?!yLjxTz-O@v} z|2l=|&xyiq1Bspep#YQB@#;9Kpq6==bEP@or+k*cyvL_ejk`DvsRgryk5y)`CgjM2 z&yWM*W+EiHG8{zg0D&xag;li$G@zID5iX%zj#@G%D<3jgQpoMY;W^KZBwS0b(!3&B zjU!0ERGk~*X>SA>q*2H#20SAy=w%_Wz>~;zShYawT zMU}MLB??5qYf|B6EUYq=J5y}TIn!ivqR2HbMgK|8X$~x6e~@()_bk9DWgT-!Y_L+P z@@~8wOG9i4#O&c`IJ>^XAeYnT5H~#R%>)+!R~O&RlxKARF8LfFa$ckQ(3tvFKB-(@ zeJ+&tb_L^wlSrN>A66kRFlG4jZRlV=rm`-fay*i}2<;osFd|Cj+5tgwbxaa^2!Zy_s2YhnNCS9zg?Zm7wGK(yuz1_Ux>dIOL{lr^q z<0>eSpjFn+XCa&!pO=rrSxjyV6SFO4((%o%SL_mKQG|A5a+2U-3o;4eFsN*>g|=F+ z`Z^1W2PxB18QY6(?gsn;6p;^@YoE@oC}7 zgLGT7Ybqa2FqTnZn7y2kw?M@J{qvN{Lw+Z94^h_9uxhE2K2RTq+D?}tac#IETshmJY z1oD9OkhX8s6xHJ!@}R)|feoI)aDhHiDGe06sZeJ6hdmsL5!Q@w77~?ceyb(S0prs% zHH&QcLrJjRr-O%fo1CMzYgMC~Iz%?YAG|Y@h@zGB)~hg@RdOE7dR`)x6HoM$8=|bL zVD)P9!+;!e!-~*L-0F+8Hm=9*^(iDS#UCKLH@3GP@ByrN^C?Eqb{^ktUIb}OPL6W$ z6&wk9=xb13Y9}uw8D!LI3%6h9a}j6(!0eJwawBn>-H3k|@G~N~>{2Tc3YVM@6#vpBieI=`q8x+DX3TEXXKIST3)cfZ`vc0Yh|^wSFIsu&`9|HNJApE~SYc z4DM2MLq>3=o-L)Z`cN@%lBm31;nqp-Ld_uy13NIXBhOtpX7^E{1K?gADCi_eociE& zq!{)&3rPU~xB_M*QDU-^O*QOOAr_MTuto}jZWoG8MhBBH*rHyTJw+;>IY{G94OQwNT%UaRe`nN>6gYR_lZ8^sobduY+Xb1Y&SrDUd^ zj}#8wb!Ii#O-Aq1sK!0u&>*iYt(IrOmD2q(0gy3wJ0O+r!-QV^pz!6utE%FTY<8c# z-Uaj(q8$le0HKRb@xHx?Z`50Awwl=z%3NRxu9xDBms zHo@!w{lE##0_$WGd2{GlP_E6E)5+~_WST`!moh)Y5{+=Yi79apWGc?+TR|yluceql zYPyfH1A%F)C;(G}wg8|5`K;+(8fT<|6(j}nQ3Tnat14u0VHN#CZXG!o5{xpYqf?Px zBoTzVi!FYW$?UVGMOWgqDP`8It_QAw;yvKqjS{F+BEH8k6LH#CiuRScE*x@;DKZ zvO%y{pn&XZ#4KKV_&2eBkPBh)em$#@fgJ_3Xt1KRiW%+Uv!q?3TrBHYUr~xgf9LW;=i7J?Uvn`K)iWCisf!8bm zf(WDHe9CXma*(!SLJm8%wT@RNL`N|YQYp}IQ}%j9qD8WkImiP7YMo(Mm9WbtOz{So zXP2OxF^w^Bf~Kb>T&R&Td$LY53Su>ZapsszX{Lmn2eqr9bPK+ST(yy{>}+*$CUdj2 zY%$N$#PBY{Z`MnS8F0|G89015Mcsx8NF_XShFV~yo0ZKH@OO*e7A6mEe2dDw8Bn1< z*@C7QA*N=*U@6ii+U8(1OK)UcjPWZTlNzghU->Ojd%$%5t5X1u+4Ft*^wL(=*YyLN zv~Gb^+<;82uxcAn9eST<7(iPy)JqkvwK4<@uUbn}pJ5CaUAe#nCM|s+D{b~ZTS-@Gt6gTr3>4s#TvWw?^(1R7Dv)*hhrB)xP|a5S0higvs~j4YqdxYwD_s#8&O|H}pl@mf zN()Q_U23&LgmAYRkq1Pt0ESvo1L23=)R}6oG6(InBM4O~(qAy6SX*qa*6B&6RtUYG z*P!E>Jm(WTvk`e^$B#Up53?niT zxy-xlyyLbp#NJ3#2Y0#3U$5AG>0Nh=<%ERcCMtbVX)bcy>o8|%9A&q`7T*hZI?WK2 zieLO{4NeK+q5^qj;>Ea`1}1BG8zVSE`=pei)geE&<(GOD1Ha1LYE2?0$Aj5t+r=#K zW@hL^X(MwR1~T}%ndkf~j#QagAXZS%h-S~4U6e|T+)h3M97>q4G<1K6Q>WBj6iVtY zVgY2Wy)8_`FM4Wt8{ff=&U*)r64ZMgoH`$tyx{J;6Nh3q7b^}&K-nJJ6Do-wMrLsyf*U}xOd9>T-efdN9L(o~CD0W@sD}`hlDY8C^KiB#;c3o3vEohlV zum+U(SJoe`2B#HhA3rMz;!}#tq70~Cphloj?87pl^$Nn}92#efh3XNut{AGH_k;1+ z_}O}}fou{GqITIa3k81zlBLieOt2HUd@^F?^c=wA(!V7{!iOGu&?Q~5ws7dc*}9mm zDizmi3jp;nEZAp0%`yN(HrMHOc8<1_=0&S>TFIKvyvBiuDdMv-rbHU))oC?BDxx{r z%cL!e{lp^VKDM%qj61@MFk%atY{k#{)8rDWnguSjKLUvlNbl1IMTvgi5^=eLkV7-z zlzbl`#kv@Np3-8M0|>R-jY->!QS0oZq6aqZV*hnHYvrwrUVueZ9%3{i;xg5SCW^ej3 z2(hx**6aznMwyxAGEz=B+EI1dDv_YJ3})Or#Xt~xmH8_aWYK54z!DH+zYtJ!oiO}< zesA_pQI1BGaqOCosPtD^LoM4m6!mA>IusGz&3ekV_`$5aF_u-zNaYnLU>u6$3#`@z%-s|$4;wSC7IXOCsSs8%N4KiL^nIC5D`=zPr_4R`zV_$#vn}d7D2Kzf-e4~75F*5F-SeG&l50pPvvLq-wuYX)e@xgbj&J3Qn z`rg&|3_d^h^#kTz#qXMYygBLR13y4cv%l-O@+UMOo;7@6@5@2`HII}&c3f-MYtym4 zKK88AQ@dZAURpeO%vnhJ!gr9{}f-D<@7t{N&4H%TjaFNIm~Z zFh?=u6djm6_}xcRCj|%UUaYJ8;kf;E=EcAqs9XJVUoiV~!R++@)a>+uAXoZC3V()w zIM-Vb6@!m4ka;Dm~&oui>`C;E!MX)!rYy1~hD9?Z@p0 zHT2ZWsY`=-#~on$XxR1+Nj>%Q*qNz$8A-qKNHEV~$<11BYF_%laVH1gOU-WHAIuD9 zXJFaF1H0?~zAl#vxm8+#*tBVf)u3;9dlG~d@=I~aWJwdW^=c}fec9%HR`Wfiw}zG&)$)!DPIUVYVIF{~cb7OZw@ z(G;;ABWk4dv7qIY+#A3B!y8ZhqO?v@UnzYopMx7>XHD7=G*0UGV*~V6QMxVrxz-Is zi@!Mt1bh>;wR&td#$M)m_zQpI@mEgzC!p~+9)D~Wj_#?9r<-{bQ5?n$o_q*`BioL` zoKj{=O3p07RbEpxDM)8$WTzAzlbsYy4ob)1hmLU;ehwBgC$XFCIG$Xc1aTb2A6*3mXR}CQ%*195N$H#^Hw% zae*iSdvVCNO2BM=7o1jszRdpAri3wP5$d>0LW0G%M@T5>P!hNBm`G<&A72gEFG72C zh76KjM?%hyvWy91x{s3nrwxWj@0Daj_8u*o*y_ufWMYN#aQo_L=_{+Ip|6}hO?vV< z)uJg?JO{vYEdfi<(JHnXlH8LnK!Os^kbS^!^OoPFfO$s>u;t`V5Z9?X5m~M{7 zAAQ|~zqI_g1s!F~1U!i8Hg7@Wspl;j*s$?DyjtSCwxx~dwQt|FVRQf1%g-|g@2AyG z;-Dx*u3^!GgUL)CHDe?jl+NoN+`ef|u5n)D$tUL;w`>~PuyJ5(?$QmzgSk1m?iG!_ zRdXwH=gRxca|_F>&d*)2WovHxiVfQ~Y}u^EN|{0MuD-t3m3=Mk^*yb9t$lqt6O<{@ z(ovr)zpT2vyrl`B05HJ}$8HMQ)h0O6u^U5ntqEpYc4K#2PbgSxf>}<`*5Ubh4^J@L z@jKdjLREO3Sa6an0WV0mS(+>GewpB8FX)O0kYkPt@bdM>?slIAuc8c2@mac?%bf(D zLomVIh@>KvK-;{Cq%xGClI0OeRVZmRL4}ueh2_APCa8=^d^y$SD5okS@#R#Pqnzr9 z#FtZDj&e?OlE%K3-AkI!?(3-USprL15cuH+6P%uhfUv&0TE0GEf-^#4V`oP%WXyzs zLeC6k9nIbKJ#?`OY3!mr+d2~ScSYn0*;hI-J6fWGRWU?@iq#g-(bd<`-r2aMuZk^MYfZ#M zwFPq9*92jLHTm+&g~+d81Yw)4Es)nj&QF3cm|$Ijd;vXV4KTq#fqXvY=zp63f&zIB z<<fcZxXMZlY2AJT&0y+IxZVfQOMFn#DuiP47f{pp| z3i=O)*J}MX70Bs7$ixFC*jykN|5*d@*l~ee{AUfoW5NY;@t-xo1Q!>`#edcS6KpMz ztN+vh6KpGxtN+vh6ATx~)qiS$3APu=)qiS$2`Pvi znJ@NUL*XX4E>O8HD{iKRW`vd&6MQf(?`dso!HjBxU6wENWM5C)IetEr1>rU;##Gqb z+}Ilfpg;3E7Iqi%f!t#dAB(?6S-bhb^xNEb=)3LRwnHA&*6UV>-gnq+f2wT<_DpWy z(YCa=$8S68m$&!!E$wK_p)F>#2-RBO-IS~1E)yQjCUaY?QM zdaGbu-{P*e&iWi)jvZ7xvLRQozyvjpY|K@l=goIyQ?6p62^KiAImcdIOLBRAcW-$P zuk#ERIm&oam#*?0URW7)IkF;$S1$(399fye`-p>Xl09el zH1@XV@b>7ShqMgq9Nvr?^pa$gx8(3b!eF^07w7Pv-e83zTXT4Gd9acs8x^Wy*ea4} z#flu>>=>L)O6p!!pTp~pgL6VgLk=&e4$dV5O$$5>!%2cP2q>6!KB>m~rR6!i1vq$* zr67Y*eWaRuTXT5-Xt0_@YglgPf6e$y%TLeV=3L`G^x|h5oM(wH9Ny$S z$7lVM%{Z)sn{zsvJ38vS{H!BqJ`J(`Ej%`(2iwv<%MN#DC%O*qM0QVw95dN(`no#1 zd+Vb@0x(B;VMA0{Bf{BU*ccVg7vV`>*c25m5aG$_Z&5DyKbXtFEiYuB!p<3GFBJ4# znU|vcM&ZvRKZe)yz;fyGQGB!DE6|s@D5B#zzyv16G=*mAwv2u9n;0(&fh^x$1$Ar7PNeP08jTR-WFj zw&f8WS|#3L|<|D;nFoo%br( zbPZO9&QssrgVQ|ibQN@Zqm|)2G3-1Q1CTUDB%zVGQXVX^5)P@p6<9&-bv&*c4A>dx zBO)iK5O?H@sh^V^1Lm%%xDi{P9#;a-T@}+=i0P@v2~uxocjN*clywyXTb6g9jRK)a z%EZ1qis`67D=bb6#8x~X!OP9GgaJGAd~t&lOJD5G7qjC_R?OkpxyQt9OQXf>+4_on zMBJY%^TqV1=$C5&tMbL{Syqg_{n`2A$Yly__Rq-|hZi|Gn$FD^hnGn30f}HuD6WY1 z6=_EC-P$Ok1^Zaro60Q&R}k|NJ)!+@-#}E{)!nnm{sj^z|dVZpv{Gl`L;%twnkeLAht%8wnjrq5cO`Qt)lHWA+^?ZvTKEw%Mu_J>X$0( zy33Ow>X$0(y7wkQw9-}9b?-}pXr-&HU#>`kXr-%cjozOCv6Zf}4e)_NNF}o}g;7 z#qCN4X)ma?e!49YWV^}&tLgS65GeD z^x-7X!YbQ#b|8Et5mcitSYX@ku0)V+I}|I1e>4ul69Kqx=T>DP^bGT3NhsICdiTl% zcgH}z%{cpxD55G8+*640`y;XE-a;5W+(0!5K=HU&3PkSjYXYul3&pFP}@OJ!X5(4*Wtls*FUd&ZL45gKF z^GntwS>EZcf6W)iJJ*l$#qr+tZ&9&c4OY|aiudmYa$OPK;}t(Hkn1*0pYJfi!2-FI z@2?#^7nSoGzI6--hY5a?C$)L)72W6aq&6#izX^U874ky5^SE@xpXW)PVrn+QFY}}> zs|f!iDwKPGt|{4new8QnilNyAzs{37#Ugw$D%5+8PBX6*yp%8YHIhE`n|yItG9PI8 z?@(OThk3L09F#3>EZ+KERNUCu#oef#pJ4X?6l{X)qtcE>eHOsAGW~6W8={cL zN;d_u*7)d1T-eo)M=G>~v3L{Q6qn;}ya&(%6YPuuDx7xK+ypnrg%RzXDok)oTprcV zxxxgu#sKABJIcm$HF057JBl~KZE<-_JIXh~?NI<$QEhNkOLo8?%9DoI=s0Tc$dlRz zXJ$;`DDI0T%WlZ{#Cv> za;+Fn`Lq+;`#gQP-4orgVB?9KL7z!L;fV-eNfz|k1kB3b5Q4%UPJs0FwDO^)FFKLE zrxdk8w}y}BBP#nUYgUB%ae4Re3L#bH5eU5X_X&`w7VMzER0ye#YJs(1PJl$Upsr68 zLTaK~&@KKU0TR)|z4ccLA@d_zD)1$$y$O)07JLHatA&sSQ7vfUuO&dDS{kt1bda9r z-txk2_r82_e0g~~CeGh@KNFMY@4UaAFHPK4eq6i`}HIi|Eht#dbna=`Ui^f^F+B^TkfL?pyyOU+g9uSwsIb zCN0>x{yJamb?fdlU+i>?^fxhS;pX+_0(pEPe5F7hmd>T{^@zN(U@iQ8Oj@`Y{-Hn~ zUk%?VkjIz9k+j`uVj`)OX9nZz;Z+6l_=0$Kfjqtu3wtI#omF`#%t8bKk=g*D)Dk{voK%MKsu$V9uqv6 zfRH_^Ojz73{&fOE_PBgLPPUVOlYo#tvYrz`$KNI(3ApsAtz;WVVrh+IsqY< z;j5gE&m5=7iu}&cq#mTmddX!IPmPTJ)VlNMA+NP11JzqbMwgc!V%AnqU^6Jv@*I zYIB{C#^dsE0tkz_tDNkyzL$)#ogHep3O*YJaTSkrNx59{{V0HIcnpBm?w_LoYG{&Q z_0moREO`GC1yDl_fHm(2QGi|6^wt@F=JLOyQac6N8*8}F^TViAMvTgE&+T8MA{0w+ zs}NTI#0fD9@o-;XXY4M9KBxTCLQG^A3gt2c>v}G#$ zI^IjEr#Wx|ZCxgV*ejD=pWKet~@`q%QINNVU-be<;HzOk%^b0&A z-6y@s^$}f|{dVN4WRUpVb~jvOPX>v@Yh6dWCK)6imnSpWZ+9eu^cj|gPSdr?An~~D z1gPn{WRQ5g-f8+^GDtiw&z(@y^~oUdc!Se)Lo!G_&N)fuj2n|d(!m>@rkj#M;&J{g zL^SP828qX;oTi(TLE>@Q0J3(sB!cwms%EF@)?|=)TplK%rd`P(@wlIIZc7Hy>gKi!)Q z5|8^6rH?0r#N&Q`+MNs%kNcCQJ;@;PxSyZyO9qL@)tB(oClW#Ov|fdupYBfviO2o? z^guF5JnrYGPbP!J<9>ent7MRP+|N&+N(PC?{rvP`GDtk`=cm6;28qZ0{PZ`;An~}L zpZ+!(Bp&zk(?f}%`O?Sz{PgK$ka*nBPoGH!iO2o?^x0&Pc-+rV4=01f<9>enTnyB; z66cUIfniwcN#r9jfSxHj1m`APDu^L;`|9>yGP=w8gPcc`QQ?&?s(LID)E0tx#p?^B zfLJjtkEaV?OhnnIXbIyP%;U)*Uq7+@D-P7;e__*yJ-F^IFK`ps-b9pYa+t3sV%Tat z7iPeTcOpjW<|pv4Ct_snm5UVA^JF4MmR>)7|6?LXR$hN$>l=v}S$O^A{Zt}G)?I&b z>zj#~yuIbOl0mZW`nmg`l0o8XKX>m-28plz-2HSiNSy8G?q`xg;%z^7e>)i@?)G!{ zcalNkZ|x#zxBbZ=ak!tm4FUcVBxSzX!kPH%!`?>pnC40mO59uN1H&n1Io-SsomPm)2h?)s_er^z5$ zcm3S-d@@MZT|YU!kPMP_*UwHrO9bWZEq|U2l6BY5Prpb8(c|IX@|VdV@wlI#{&zA+ zJnrYG|40Uj$Nl{Dt7MRP+|N({nG6z-`}yhD$sqB#pP&9uGDtk`=cgAFL3w-2my$u^ zaX&x(CK)6i_j}8ilR@HfKR>;a3=)s~`RUbUka*nBPydw+5|8`&>9@%s@wlI#UP}gv z$Nl{D-^n2HxSyYXmk7$+TmDZnNIdT6r`MA~;&H#X{CzS=JnrYGKO}?1<9>d6BLRe; zV9Lfx=O=CqM~duanaK94v#)J&{4(-Y$*B0w@ajZR-k$H8WROg)Vik?L(ShvGru+1# z({@(HmEhYP!2Wi+&;EegBQo;#gA?%{g_-!9g}=jo&*t#uLj&99`uA+!1zq-iS5pr4 zo=unSPxmT?Opx8adE18dn+MkA)(-Y>HQmDvTefT*=-+H6y*DVs3q{lZ{WQI2cQw10 zV$B@hx_uxAubq5B|Hf?te4SWT>&out#j`G(ott&itXY?A+1NjfcYo%*`i)yQug{${ z8-Urf@df}vw~h|qHn?T$aEMzFD(S42VkB?sQi?D(H)E9aY<(y!=J3 zd^pUP-|*)vzrU#&uPSNo!<#h2pX#G{Z3Z_x;GF{We}wcu8=sv!AYKf1nuIzwp>`{ht*Vt4b3`bu{2H+6%1OG1GY zD5!s{&ctKRa(}5%3j{J~E{Pe3UswFm#x?#)jH{sMu814=C-B^##yEP8ulkX-=_JG_ z<8KcB>hYK6SGp*9%kO|*H?U^=`fy=F?u$ha4u^U-n#=a5TbSIsBkxAE??kJ?BMr^n zy|V@`8`?TMhidcvMsx8u4}azOJG?sQz4RJ-zKOp#U5{P1KV6-V{(KNjYvFfVx(E8# zt=zg{cmSW#2|1mcH(qW^ETs9efwkL*2b7n>x-A*Iwr&|7SUb#@X-~Q|D2IdW`mL`B zmG>m6-zrhZD*W-AEr<7BD7<}hVC&ZHL&LHD!f&U&sqdm$|8)M#WX8tUcYI5#h`SD0 zeVJMG}})1| zQn7x2l5<;H-e`sz$LBN?t+N;eui&Gu&L`ue@;{eP0@K&mg!f zmM=H~U8_%C!bw5J{8P&po?5+7xjnsjnOz@u)_@3sXI^^RI+v2UaA9@%!gdigH!b!s zrbAQ}A8keEZ5!S@u;l{wJieMXWXL`|#u*ykY9akwH`$_*^7?!0yYV7CoDVg&;((vh zin=Jbw{>|3-g+A4H+C(@GxgoQ&8zx4s`{|oD7TuU`4;qb#JMfa^}WlxoBLYp+gnz4 z;vKu{2%E=AwYWr42j11&*42J?a>l04Hd3jNhp3auu6?i*!ftnVAzzOkjFtE;(tVEr~z`T&e6(%H?+x~=Tfp$sYe4r;#jF!knh zL=iC19HhTz#so!0V~#Eg#=J8Xa7K;n0gC?I_0Q5Ogn~J>;h%z_Cywr?CZ5CmOgxHj;exl&W}G*b9ho{6adt?%zvjC^HNcuuDfIFL@6 z_d8PdUT+|zF2&18$RW3pqj*=%ukT(%@TK6?Z{cH)C- zZvd@xI!b@DIo-BbQTo>=7&B$e6g1aVZ7zQM&&~D!?`f~br-I6FCcX<{$#AGR!|H{ZSM+F zguW{~I#$WYC!pS9+mC$<<5x@6Zv>qH&9M3{j^7~tRKWQ*J&uEz?Tys&=muk^7ENS7 zC}uyHI<=@IeG#al^f9hiuuo{07z=;d{qCQ=KXA-2jM^VgL>o8UkP5zG`vgwQ)^F|K zova3PktrvBl6Gx=WA0)_Ej!qYR(5L>om{|t>e(0RRPj`W&vz9<2GA7IjFT&bXw z`;0R~064JUvClB34C&~EExf>VL*fHrfm!BhBzT29I>V^0E|i1SR8aQdXFS~aFoCv`}X=f_u($k#-=GB*umb8AbsfsBv9sC zo?m~1{*G>b#1u@I?DzPahB@?|?7`^u#hg$14?VvE@yXKj(f=h?#gQPX;xRKJIYE#` z>Ed^wpO2$3jsGR&LeudmXC_rmNY`;_?KRZO@ieN|S?Md8c`DFjkEe0RA@jLX$`o1o zC(uHStYdVpulNg&r>r!>A?Esq&!>Xl#K)EF^U(1bT>j{&+G*B7a^ZmO_(n$6&0yut z?$@O_%q)sSZKqta3wa!Fx-NjH!)<3|GPb=2ifd2{zn8EI{Z=w@KjG{~W(nwh9Ah$m zDMQ+CSY;;wUSN7HT6Q=;0fFV>XNZ0+Nx$pln8`?n|7aQa@(j-gp~}^N@E?iw&$z{gn6ZD7rRtUHXF@b(cc&cF#$I^sN~gbJ;2Ax)c54 zF@ve1+4w8wC@ix(oSEtEfE~$kQB| z`Uh_%Q5@|mp5-SUaHLZL#e8${7tQeY=A`^ObCMpPJ_9oZm<}IQ#|X z9Qui2)c(})N)Y@!(wCx(tILeV)pn(w+Le?>Pue+pPm1=X|AGa6eWWVCI412yU9n;~ z4x~rvOY9aDN4th+CG{l;B{0+5+e32MbU`iT=J)OQpIeJYnUk; }qTeH#9~v#5l# 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

ror8@kk? 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 So5Wibyj|!dT&> 24) & 0x000000ff) | \ + (((a) >> 8) & 0x0000ff00) | \ + (((a) << 8) & 0x00ff0000) | \ + (((a) << 24) & 0xff000000)) +#endif + +#ifndef ntohl + #define ntohl(a) htonl((a)) +#endif + +//***************************************************************************** +// +// htons/ntohs - big endian/little endian byte swapping macros for +// 16-bit (short) values +// +//***************************************************************************** +#ifndef htons + #define htons(a) \ + ((((a) >> 8) & 0x00ff) | \ + (((a) << 8) & 0xff00)) +#endif + +#ifndef ntohs + #define ntohs(a) htons((a)) +#endif + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void EthernetInit(unsigned long ulBase); +extern void EthernetConfigSet(unsigned long ulBase, unsigned long ulConfig); +extern unsigned long EthernetConfigGet(unsigned long ulBase); +extern void EthernetMACAddrSet(unsigned long ulBase, + unsigned char *pucMACAddr); +extern void EthernetMACAddrGet(unsigned long ulBase, + unsigned char *pucMACAddr); +extern void EthernetEnable(unsigned long ulBase); +extern void EthernetDisable(unsigned long ulBase); +extern tBoolean EthernetPacketAvail(unsigned long ulBase); +extern tBoolean EthernetSpaceAvail(unsigned long ulBase); +extern long EthernetPacketNonBlockingGet(unsigned long ulBase, + unsigned char *pucBuf, + long lBufLen); +extern long EthernetPacketGet(unsigned long ulBase, unsigned char *pucBuf, + long lBufLen); +extern long EthernetPacketNonBlockingPut(unsigned long ulBase, + unsigned char *pucBuf, + long lBufLen); +extern long EthernetPacketPut(unsigned long ulBase, unsigned char *pucBuf, + long lBufLen); +extern void EthernetIntRegister(unsigned long ulBase, + void (*pfnHandler)(void)); +extern void EthernetIntUnregister(unsigned long ulBase); +extern void EthernetIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void EthernetIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long EthernetIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void EthernetIntClear(unsigned long ulBase, unsigned long ulIntFlags); +extern void EthernetPHYWrite(unsigned long ulBase, unsigned char ucRegAddr, + unsigned long ulData); +extern unsigned long EthernetPHYRead(unsigned long ulBase, + unsigned char ucRegAddr); + +#ifdef __cplusplus +} +#endif + +#endif // __ETHERNET_H__ diff --git a/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/gpio.h b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/gpio.h new file mode 100644 index 000000000..6e74f9d4f --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/gpio.h @@ -0,0 +1,138 @@ +//***************************************************************************** +// +// gpio.h - Defines and Macros for GPIO API. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __GPIO_H__ +#define __GPIO_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following values define the bit field for the ucPins argument to several +// of the APIs. +// +//***************************************************************************** +#define GPIO_PIN_0 0x00000001 // GPIO pin 0 +#define GPIO_PIN_1 0x00000002 // GPIO pin 1 +#define GPIO_PIN_2 0x00000004 // GPIO pin 2 +#define GPIO_PIN_3 0x00000008 // GPIO pin 3 +#define GPIO_PIN_4 0x00000010 // GPIO pin 4 +#define GPIO_PIN_5 0x00000020 // GPIO pin 5 +#define GPIO_PIN_6 0x00000040 // GPIO pin 6 +#define GPIO_PIN_7 0x00000080 // GPIO pin 7 + +//***************************************************************************** +// +// Values that can be passed to GPIODirModeSet as the ulPinIO parameter, and +// returned from GPIODirModeGet. +// +//***************************************************************************** +#define GPIO_DIR_MODE_IN 0x00000000 // Pin is a GPIO input +#define GPIO_DIR_MODE_OUT 0x00000001 // Pin is a GPIO output +#define GPIO_DIR_MODE_HW 0x00000002 // Pin is a peripheral function + +//***************************************************************************** +// +// Values that can be passed to GPIOIntTypeSet as the ulIntType parameter, and +// returned from GPIOIntTypeGet. +// +//***************************************************************************** +#define GPIO_FALLING_EDGE 0x00000000 // Interrupt on falling edge +#define GPIO_RISING_EDGE 0x00000004 // Interrupt on rising edge +#define GPIO_BOTH_EDGES 0x00000001 // Interrupt on both edges +#define GPIO_LOW_LEVEL 0x00000002 // Interrupt on low level +#define GPIO_HIGH_LEVEL 0x00000007 // Interrupt on high level + +//***************************************************************************** +// +// Values that can be passed to GPIOPadConfigSet as the ulStrength parameter, +// and returned by GPIOPadConfigGet in the *pulStrength parameter. +// +//***************************************************************************** +#define GPIO_STRENGTH_2MA 0x00000001 // 2mA drive strength +#define GPIO_STRENGTH_4MA 0x00000002 // 4mA drive strength +#define GPIO_STRENGTH_8MA 0x00000004 // 8mA drive strength +#define GPIO_STRENGTH_8MA_SC 0x0000000C // 8mA drive with slew rate control + +//***************************************************************************** +// +// Values that can be passed to GPIOPadConfigSet as the ulPadType parameter, +// and returned by GPIOPadConfigGet in the *pulPadType parameter. +// +//***************************************************************************** +#define GPIO_PIN_TYPE_STD 0x00000008 // Push-pull +#define GPIO_PIN_TYPE_STD_WPU 0x0000000A // Push-pull with weak pull-up +#define GPIO_PIN_TYPE_STD_WPD 0x0000000C // Push-pull with weak pull-down +#define GPIO_PIN_TYPE_OD 0x00000009 // Open-drain +#define GPIO_PIN_TYPE_OD_WPU 0x0000000B // Open-drain with weak pull-up +#define GPIO_PIN_TYPE_OD_WPD 0x0000000D // Open-drain with weak pull-down +#define GPIO_PIN_TYPE_ANALOG 0x00000000 // Analog comparator + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void GPIODirModeSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulPinIO); +extern unsigned long GPIODirModeGet(unsigned long ulPort, unsigned char ucPin); +extern void GPIOIntTypeSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulIntType); +extern unsigned long GPIOIntTypeGet(unsigned long ulPort, unsigned char ucPin); +extern void GPIOPadConfigSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulStrength, + unsigned long ulPadType); +extern void GPIOPadConfigGet(unsigned long ulPort, unsigned char ucPin, + unsigned long *pulStrength, + unsigned long *pulPadType); +extern void GPIOPinIntEnable(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinIntDisable(unsigned long ulPort, unsigned char ucPins); +extern long GPIOPinIntStatus(unsigned long ulPort, tBoolean bMasked); +extern void GPIOPinIntClear(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPortIntRegister(unsigned long ulPort, + void (*pfIntHandler)(void)); +extern void GPIOPortIntUnregister(unsigned long ulPort); +extern long GPIOPinRead(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinWrite(unsigned long ulPort, unsigned char ucPins, + unsigned char ucVal); +extern void GPIOPinTypeComparator(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeI2C(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypePWM(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeQEI(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeSSI(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeTimer(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeUART(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeCAN(unsigned long ulPort, unsigned char ucPins); + +#ifdef __cplusplus +} +#endif + +#endif // __GPIO_H__ diff --git a/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hibernate.h b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hibernate.h new file mode 100644 index 000000000..69a8c144a --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hibernate.h @@ -0,0 +1,107 @@ +//***************************************************************************** +// +// hibernate.h - API definition for the Hibernation module. +// +// Copyright (c) 2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HIBERNATE_H__ +#define __HIBERNATE_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Macros needed for selecting the clock source for HibernateClockSelect() +// +//***************************************************************************** +#define HIBERNATE_CLOCK_SEL_RAW 0x04 +#define HIBERNATE_CLOCK_SEL_DIV128 0x00 + +//***************************************************************************** +// +// Macros need to configure wake events for HibernateWakeSet() +// +//***************************************************************************** +#define HIBERNATE_WAKE_PIN 0x10 +#define HIBERNATE_WAKE_RTC 0x08 + +//***************************************************************************** +// +// Macros needed to configure low battery detect for HibernateLowBatSet() +// +//***************************************************************************** +#define HIBERNATE_LOW_BAT_DETECT 0x20 +#define HIBERNATE_LOW_BAT_ABORT 0xA0 + +//***************************************************************************** +// +// Macros defining interrupt source bits for the interrupt functions. +// +//***************************************************************************** +#define HIBERNATE_INT_PIN_WAKE 0x08 +#define HIBERNATE_INT_LOW_BAT 0x04 +#define HIBERNATE_INT_RTC_MATCH_0 0x01 +#define HIBERNATE_INT_RTC_MATCH_1 0x02 + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void HibernateEnable(void); +extern void HibernateDisable(void); +extern void HibernateClockSelect(unsigned long ulClockInput); +extern void HibernateRTCEnable(void); +extern void HibernateRTCDisable(void); +extern void HibernateWakeSet(unsigned long ulWakeFlags); +extern unsigned long HibernateWakeGet(void); +extern void HibernateLowBatSet(unsigned long ulLowBatFlags); +extern unsigned long HibernateLowBatGet(void); +extern void HibernateRTCSet(unsigned long ulRTCValue); +extern unsigned long HibernateRTCGet(void); +extern void HibernateRTCMatch0Set(unsigned long ulMatch); +extern unsigned long HibernateRTCMatch0Get(void); +extern void HibernateRTCMatch1Set(unsigned long ulMatch); +extern unsigned long HibernateRTCMatch1Get(void); +extern void HibernateRTCTrimSet(unsigned long ulTrim); +extern unsigned long HibernateRTCTrimGet(void); +extern void HibernateDataSet(unsigned long *pulData, unsigned long ulCount); +extern void HibernateDataGet(unsigned long *pulData, unsigned long ulCount); +extern void HibernateRequest(void); +extern void HibernateIntEnable(unsigned long ulIntFlags); +extern void HibernateIntDisable(unsigned long ulIntFlags); +extern void HibernateIntRegister(void (*pfnHandler)(void)); +extern void HibernateIntUnregister(void); +extern unsigned long HibernateIntStatus(tBoolean bMasked); +extern void HibernateIntClear(unsigned long ulIntFlags); +extern unsigned int HibernateIsActive(void); + +#ifdef __cplusplus +} +#endif + +#endif // __HIBERNATE_H__ diff --git a/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_adc.h b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_adc.h new file mode 100644 index 000000000..932d3f26e --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_adc.h @@ -0,0 +1,343 @@ +//***************************************************************************** +// +// hw_adc.h - Macros used when accessing the ADC hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_ADC_H__ +#define __HW_ADC_H__ + +//***************************************************************************** +// +// The following define the offsets of the ADC registers. +// +//***************************************************************************** +#define ADC_O_ACTSS 0x00000000 // Active sample register +#define ADC_O_RIS 0x00000004 // Raw interrupt status register +#define ADC_O_IM 0x00000008 // Interrupt mask register +#define ADC_O_ISC 0x0000000C // Interrupt status/clear register +#define ADC_O_OSTAT 0x00000010 // Overflow status register +#define ADC_O_EMUX 0x00000014 // Event multiplexer select reg. +#define ADC_O_USTAT 0x00000018 // Underflow status register +#define ADC_O_SSPRI 0x00000020 // Channel priority register +#define ADC_O_PSSI 0x00000028 // Processor sample initiate reg. +#define ADC_O_SAC 0x00000030 // Sample Averaging Control reg. +#define ADC_O_SSMUX0 0x00000040 // Multiplexer select 0 register +#define ADC_O_SSCTL0 0x00000044 // Sample sequence control 0 reg. +#define ADC_O_SSFIFO0 0x00000048 // Result FIFO 0 register +#define ADC_O_SSFSTAT0 0x0000004C // FIFO 0 status register +#define ADC_O_SSMUX1 0x00000060 // Multiplexer select 1 register +#define ADC_O_SSCTL1 0x00000064 // Sample sequence control 1 reg. +#define ADC_O_SSFIFO1 0x00000068 // Result FIFO 1 register +#define ADC_O_SSFSTAT1 0x0000006C // FIFO 1 status register +#define ADC_O_SSMUX2 0x00000080 // Multiplexer select 2 register +#define ADC_O_SSCTL2 0x00000084 // Sample sequence control 2 reg. +#define ADC_O_SSFIFO2 0x00000088 // Result FIFO 2 register +#define ADC_O_SSFSTAT2 0x0000008C // FIFO 2 status register +#define ADC_O_SSMUX3 0x000000A0 // Multiplexer select 3 register +#define ADC_O_SSCTL3 0x000000A4 // Sample sequence control 3 reg. +#define ADC_O_SSFIFO3 0x000000A8 // Result FIFO 3 register +#define ADC_O_SSFSTAT3 0x000000AC // FIFO 3 status register +#define ADC_O_TMLB 0x00000100 // Test mode loopback register + +//***************************************************************************** +// +// The following define the offsets of the ADC sequence registers. +// +//***************************************************************************** +#define ADC_O_SEQ 0x00000040 // Offset to the first sequence +#define ADC_O_SEQ_STEP 0x00000020 // Increment to the next sequence +#define ADC_O_X_SSMUX 0x00000000 // Multiplexer select register +#define ADC_O_X_SSCTL 0x00000004 // Sample sequence control register +#define ADC_O_X_SSFIFO 0x00000008 // Result FIFO register +#define ADC_O_X_SSFSTAT 0x0000000C // FIFO status register + +//***************************************************************************** +// +// The following define the bit fields in the ADC_ACTSS register. +// +//***************************************************************************** +#define ADC_ACTSS_ASEN3 0x00000008 // Sample sequence 3 enable +#define ADC_ACTSS_ASEN2 0x00000004 // Sample sequence 2 enable +#define ADC_ACTSS_ASEN1 0x00000002 // Sample sequence 1 enable +#define ADC_ACTSS_ASEN0 0x00000001 // Sample sequence 0 enable + +//***************************************************************************** +// +// The following define the bit fields in the ADC_RIS register. +// +//***************************************************************************** +#define ADC_RIS_INR3 0x00000008 // Sample sequence 3 interrupt +#define ADC_RIS_INR2 0x00000004 // Sample sequence 2 interrupt +#define ADC_RIS_INR1 0x00000002 // Sample sequence 1 interrupt +#define ADC_RIS_INR0 0x00000001 // Sample sequence 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the ADC_IM register. +// +//***************************************************************************** +#define ADC_IM_MASK3 0x00000008 // Sample sequence 3 mask +#define ADC_IM_MASK2 0x00000004 // Sample sequence 2 mask +#define ADC_IM_MASK1 0x00000002 // Sample sequence 1 mask +#define ADC_IM_MASK0 0x00000001 // Sample sequence 0 mask + +//***************************************************************************** +// +// The following define the bit fields in the ADC_ISC register. +// +//***************************************************************************** +#define ADC_ISC_IN3 0x00000008 // Sample sequence 3 interrupt +#define ADC_ISC_IN2 0x00000004 // Sample sequence 2 interrupt +#define ADC_ISC_IN1 0x00000002 // Sample sequence 1 interrupt +#define ADC_ISC_IN0 0x00000001 // Sample sequence 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the ADC_OSTAT register. +// +//***************************************************************************** +#define ADC_OSTAT_OV3 0x00000008 // Sample sequence 3 overflow +#define ADC_OSTAT_OV2 0x00000004 // Sample sequence 2 overflow +#define ADC_OSTAT_OV1 0x00000002 // Sample sequence 1 overflow +#define ADC_OSTAT_OV0 0x00000001 // Sample sequence 0 overflow + +//***************************************************************************** +// +// The following define the bit fields in the ADC_EMUX register. +// +//***************************************************************************** +#define ADC_EMUX_EM3_MASK 0x0000F000 // Event mux 3 mask +#define ADC_EMUX_EM3_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM3_COMP0 0x00001000 // Analog comparator 0 event +#define ADC_EMUX_EM3_COMP1 0x00002000 // Analog comparator 1 event +#define ADC_EMUX_EM3_COMP2 0x00003000 // Analog comparator 2 event +#define ADC_EMUX_EM3_EXTERNAL 0x00004000 // External event +#define ADC_EMUX_EM3_TIMER 0x00005000 // Timer event +#define ADC_EMUX_EM3_PWM0 0x00006000 // PWM0 event +#define ADC_EMUX_EM3_PWM1 0x00007000 // PWM1 event +#define ADC_EMUX_EM3_PWM2 0x00008000 // PWM2 event +#define ADC_EMUX_EM3_ALWAYS 0x0000F000 // Always event +#define ADC_EMUX_EM2_MASK 0x00000F00 // Event mux 2 mask +#define ADC_EMUX_EM2_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM2_COMP0 0x00000100 // Analog comparator 0 event +#define ADC_EMUX_EM2_COMP1 0x00000200 // Analog comparator 1 event +#define ADC_EMUX_EM2_COMP2 0x00000300 // Analog comparator 2 event +#define ADC_EMUX_EM2_EXTERNAL 0x00000400 // External event +#define ADC_EMUX_EM2_TIMER 0x00000500 // Timer event +#define ADC_EMUX_EM2_PWM0 0x00000600 // PWM0 event +#define ADC_EMUX_EM2_PWM1 0x00000700 // PWM1 event +#define ADC_EMUX_EM2_PWM2 0x00000800 // PWM2 event +#define ADC_EMUX_EM2_ALWAYS 0x00000F00 // Always event +#define ADC_EMUX_EM1_MASK 0x000000F0 // Event mux 1 mask +#define ADC_EMUX_EM1_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM1_COMP0 0x00000010 // Analog comparator 0 event +#define ADC_EMUX_EM1_COMP1 0x00000020 // Analog comparator 1 event +#define ADC_EMUX_EM1_COMP2 0x00000030 // Analog comparator 2 event +#define ADC_EMUX_EM1_EXTERNAL 0x00000040 // External event +#define ADC_EMUX_EM1_TIMER 0x00000050 // Timer event +#define ADC_EMUX_EM1_PWM0 0x00000060 // PWM0 event +#define ADC_EMUX_EM1_PWM1 0x00000070 // PWM1 event +#define ADC_EMUX_EM1_PWM2 0x00000080 // PWM2 event +#define ADC_EMUX_EM1_ALWAYS 0x000000F0 // Always event +#define ADC_EMUX_EM0_MASK 0x0000000F // Event mux 0 mask +#define ADC_EMUX_EM0_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM0_COMP0 0x00000001 // Analog comparator 0 event +#define ADC_EMUX_EM0_COMP1 0x00000002 // Analog comparator 1 event +#define ADC_EMUX_EM0_COMP2 0x00000003 // Analog comparator 2 event +#define ADC_EMUX_EM0_EXTERNAL 0x00000004 // External event +#define ADC_EMUX_EM0_TIMER 0x00000005 // Timer event +#define ADC_EMUX_EM0_PWM0 0x00000006 // PWM0 event +#define ADC_EMUX_EM0_PWM1 0x00000007 // PWM1 event +#define ADC_EMUX_EM0_PWM2 0x00000008 // PWM2 event +#define ADC_EMUX_EM0_ALWAYS 0x0000000F // Always event +#define ADC_EMUX_EM0_SHIFT 0 // The shift for the first event +#define ADC_EMUX_EM1_SHIFT 4 // The shift for the second event +#define ADC_EMUX_EM2_SHIFT 8 // The shift for the third event +#define ADC_EMUX_EM3_SHIFT 12 // The shift for the fourth event + +//***************************************************************************** +// +// The following define the bit fields in the ADC_USTAT register. +// +//***************************************************************************** +#define ADC_USTAT_UV3 0x00000008 // Sample sequence 3 underflow +#define ADC_USTAT_UV2 0x00000004 // Sample sequence 2 underflow +#define ADC_USTAT_UV1 0x00000002 // Sample sequence 1 underflow +#define ADC_USTAT_UV0 0x00000001 // Sample sequence 0 underflow + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSPRI register. +// +//***************************************************************************** +#define ADC_SSPRI_SS3_MASK 0x00003000 // Sequencer 3 priority mask +#define ADC_SSPRI_SS3_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS3_2ND 0x00001000 // Second priority +#define ADC_SSPRI_SS3_3RD 0x00002000 // Third priority +#define ADC_SSPRI_SS3_4TH 0x00003000 // Fourth priority +#define ADC_SSPRI_SS2_MASK 0x00000300 // Sequencer 2 priority mask +#define ADC_SSPRI_SS2_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS2_2ND 0x00000100 // Second priority +#define ADC_SSPRI_SS2_3RD 0x00000200 // Third priority +#define ADC_SSPRI_SS2_4TH 0x00000300 // Fourth priority +#define ADC_SSPRI_SS1_MASK 0x00000030 // Sequencer 1 priority mask +#define ADC_SSPRI_SS1_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS1_2ND 0x00000010 // Second priority +#define ADC_SSPRI_SS1_3RD 0x00000020 // Third priority +#define ADC_SSPRI_SS1_4TH 0x00000030 // Fourth priority +#define ADC_SSPRI_SS0_MASK 0x00000003 // Sequencer 0 priority mask +#define ADC_SSPRI_SS0_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS0_2ND 0x00000001 // Second priority +#define ADC_SSPRI_SS0_3RD 0x00000002 // Third priority +#define ADC_SSPRI_SS0_4TH 0x00000003 // Fourth priority + +//***************************************************************************** +// +// The following define the bit fields in the ADC_PSSI register. +// +//***************************************************************************** +#define ADC_PSSI_SS3 0x00000008 // Trigger sample sequencer 3 +#define ADC_PSSI_SS2 0x00000004 // Trigger sample sequencer 2 +#define ADC_PSSI_SS1 0x00000002 // Trigger sample sequencer 1 +#define ADC_PSSI_SS0 0x00000001 // Trigger sample sequencer 0 + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SAC register. +// +//***************************************************************************** +#define ADC_SAC_AVG_OFF 0x00000000 // No hardware oversampling +#define ADC_SAC_AVG_2X 0x00000001 // 2x hardware oversampling +#define ADC_SAC_AVG_4X 0x00000002 // 4x hardware oversampling +#define ADC_SAC_AVG_8X 0x00000003 // 8x hardware oversampling +#define ADC_SAC_AVG_16X 0x00000004 // 16x hardware oversampling +#define ADC_SAC_AVG_32X 0x00000005 // 32x hardware oversampling +#define ADC_SAC_AVG_64X 0x00000006 // 64x hardware oversampling + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSMUX0, ADC_SSMUX1, +// ADC_SSMUX2, and ADC_SSMUX3 registers. Not all fields are present in all +// registers. +// +//***************************************************************************** +#define ADC_SSMUX_MUX7_MASK 0x70000000 // 8th mux select mask +#define ADC_SSMUX_MUX6_MASK 0x07000000 // 7th mux select mask +#define ADC_SSMUX_MUX5_MASK 0x00700000 // 6th mux select mask +#define ADC_SSMUX_MUX4_MASK 0x00070000 // 5th mux select mask +#define ADC_SSMUX_MUX3_MASK 0x00007000 // 4th mux select mask +#define ADC_SSMUX_MUX2_MASK 0x00000700 // 3rd mux select mask +#define ADC_SSMUX_MUX1_MASK 0x00000070 // 2nd mux select mask +#define ADC_SSMUX_MUX0_MASK 0x00000007 // 1st mux select mask +#define ADC_SSMUX_MUX7_SHIFT 28 +#define ADC_SSMUX_MUX6_SHIFT 24 +#define ADC_SSMUX_MUX5_SHIFT 20 +#define ADC_SSMUX_MUX4_SHIFT 16 +#define ADC_SSMUX_MUX3_SHIFT 12 +#define ADC_SSMUX_MUX2_SHIFT 8 +#define ADC_SSMUX_MUX1_SHIFT 4 +#define ADC_SSMUX_MUX0_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSCTL0, ADC_SSCTL1, +// ADC_SSCTL2, and ADC_SSCTL3 registers. Not all fields are present in all +// registers. +// +//***************************************************************************** +#define ADC_SSCTL_TS7 0x80000000 // 8th temperature sensor select +#define ADC_SSCTL_IE7 0x40000000 // 8th interrupt enable +#define ADC_SSCTL_END7 0x20000000 // 8th sequence end select +#define ADC_SSCTL_D7 0x10000000 // 8th differential select +#define ADC_SSCTL_TS6 0x08000000 // 7th temperature sensor select +#define ADC_SSCTL_IE6 0x04000000 // 7th interrupt enable +#define ADC_SSCTL_END6 0x02000000 // 7th sequence end select +#define ADC_SSCTL_D6 0x01000000 // 7th differential select +#define ADC_SSCTL_TS5 0x00800000 // 6th temperature sensor select +#define ADC_SSCTL_IE5 0x00400000 // 6th interrupt enable +#define ADC_SSCTL_END5 0x00200000 // 6th sequence end select +#define ADC_SSCTL_D5 0x00100000 // 6th differential select +#define ADC_SSCTL_TS4 0x00080000 // 5th temperature sensor select +#define ADC_SSCTL_IE4 0x00040000 // 5th interrupt enable +#define ADC_SSCTL_END4 0x00020000 // 5th sequence end select +#define ADC_SSCTL_D4 0x00010000 // 5th differential select +#define ADC_SSCTL_TS3 0x00008000 // 4th temperature sensor select +#define ADC_SSCTL_IE3 0x00004000 // 4th interrupt enable +#define ADC_SSCTL_END3 0x00002000 // 4th sequence end select +#define ADC_SSCTL_D3 0x00001000 // 4th differential select +#define ADC_SSCTL_TS2 0x00000800 // 3rd temperature sensor select +#define ADC_SSCTL_IE2 0x00000400 // 3rd interrupt enable +#define ADC_SSCTL_END2 0x00000200 // 3rd sequence end select +#define ADC_SSCTL_D2 0x00000100 // 3rd differential select +#define ADC_SSCTL_TS1 0x00000080 // 2nd temperature sensor select +#define ADC_SSCTL_IE1 0x00000040 // 2nd interrupt enable +#define ADC_SSCTL_END1 0x00000020 // 2nd sequence end select +#define ADC_SSCTL_D1 0x00000010 // 2nd differential select +#define ADC_SSCTL_TS0 0x00000008 // 1st temperature sensor select +#define ADC_SSCTL_IE0 0x00000004 // 1st interrupt enable +#define ADC_SSCTL_END0 0x00000002 // 1st sequence end select +#define ADC_SSCTL_D0 0x00000001 // 1st differential select + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSFIFO0, ADC_SSFIFO1, +// ADC_SSFIFO2, and ADC_SSFIFO3 registers. +// +//***************************************************************************** +#define ADC_SSFIFO_DATA_MASK 0x000003FF // Sample data +#define ADC_SSFIFO_DATA_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSFSTAT0, ADC_SSFSTAT1, +// ADC_SSFSTAT2, and ADC_SSFSTAT3 registers. +// +//***************************************************************************** +#define ADC_SSFSTAT_FULL 0x00001000 // FIFO is full +#define ADC_SSFSTAT_EMPTY 0x00000100 // FIFO is empty +#define ADC_SSFSTAT_HPTR 0x000000F0 // FIFO head pointer +#define ADC_SSFSTAT_TPTR 0x0000000F // FIFO tail pointer + +//***************************************************************************** +// +// The following define the bit fields in the ADC_TMLB register. +// +//***************************************************************************** +#define ADC_TMLB_LB 0x00000001 // Loopback control signals + +//***************************************************************************** +// +// The following define the bit fields in the loopback ADC data. +// +//***************************************************************************** +#define ADC_LB_CNT_MASK 0x000003C0 // Sample counter mask +#define ADC_LB_CONT 0x00000020 // Continuation sample +#define ADC_LB_DIFF 0x00000010 // Differential sample +#define ADC_LB_TS 0x00000008 // Temperature sensor sample +#define ADC_LB_MUX_MASK 0x00000007 // Input channel number mask +#define ADC_LB_CNT_SHIFT 6 // Sample counter shift +#define ADC_LB_MUX_SHIFT 0 // Input channel number shift + +#endif // __HW_ADC_H__ diff --git a/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_can.h b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_can.h new file mode 100644 index 000000000..02f7b7465 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_can.h @@ -0,0 +1,379 @@ +//***************************************************************************** +// +// hw_can.h - Defines and macros used when accessing the can. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_CAN_H__ +#define __HW_CAN_H__ + +//***************************************************************************** +// +// The following define the offsets of the can registers. +// +//***************************************************************************** +#define CAN_O_CTL 0x00000000 // Control register +#define CAN_O_STS 0x00000004 // Status register +#define CAN_O_ERR 0x00000008 // Error register +#define CAN_O_BIT 0x0000000C // Bit Timing register +#define CAN_O_INT 0x00000010 // Interrupt register +#define CAN_O_TST 0x00000014 // Test register +#define CAN_O_BRPE 0x00000018 // Baud Rate Prescaler register +#define CAN_O_IF1CRQ 0x00000020 // Interface 1 Command Request reg. +#define CAN_O_IF1CMSK 0x00000024 // Interface 1 Command Mask reg. +#define CAN_O_IF1MSK1 0x00000028 // Interface 1 Mask 1 register +#define CAN_O_IF1MSK2 0x0000002C // Interface 1 Mask 2 register +#define CAN_O_IF1ARB1 0x00000030 // Interface 1 Arbitration 1 reg. +#define CAN_O_IF1ARB2 0x00000034 // Interface 1 Arbitration 2 reg. +#define CAN_O_IF1MCTL 0x00000038 // Interface 1 Message Control reg. +#define CAN_O_IF1DA1 0x0000003C // Interface 1 DataA 1 register +#define CAN_O_IF1DA2 0x00000040 // Interface 1 DataA 2 register +#define CAN_O_IF1DB1 0x00000044 // Interface 1 DataB 1 register +#define CAN_O_IF1DB2 0x00000048 // Interface 1 DataB 2 register +#define CAN_O_IF2CRQ 0x00000080 // Interface 2 Command Request reg. +#define CAN_O_IF2CMSK 0x00000084 // Interface 2 Command Mask reg. +#define CAN_O_IF2MSK1 0x00000088 // Interface 2 Mask 1 register +#define CAN_O_IF2MSK2 0x0000008C // Interface 2 Mask 2 register +#define CAN_O_IF2ARB1 0x00000090 // Interface 2 Arbitration 1 reg. +#define CAN_O_IF2ARB2 0x00000094 // Interface 2 Arbitration 2 reg. +#define CAN_O_IF2MCTL 0x00000098 // Interface 2 Message Control reg. +#define CAN_O_IF2DA1 0x0000009C // Interface 2 DataA 1 register +#define CAN_O_IF2DA2 0x000000A0 // Interface 2 DataA 2 register +#define CAN_O_IF2DB1 0x000000A4 // Interface 2 DataB 1 register +#define CAN_O_IF2DB2 0x000000A8 // Interface 2 DataB 2 register +#define CAN_O_TXRQ1 0x00000100 // Transmission Request 1 register +#define CAN_O_TXRQ2 0x00000104 // Transmission Request 2 register +#define CAN_O_NWDA1 0x00000120 // New Data 1 register +#define CAN_O_NWDA2 0x00000124 // New Data 2 register +#define CAN_O_MSGINT1 0x00000140 // Intr. Pending in Msg Obj 1 reg. +#define CAN_O_MSGINT2 0x00000144 // Intr. Pending in Msg Obj 2 reg. +#define CAN_O_MSGVAL1 0x00000160 // Message Valid in Msg Obj 1 reg. +#define CAN_O_MSGVAL2 0x00000164 // Message Valid in Msg Obj 2 reg. + +//***************************************************************************** +// +// The following define the reset values of the can registers. +// +//***************************************************************************** +#define CAN_RV_CTL 0x00000001 +#define CAN_RV_STS 0x00000000 +#define CAN_RV_ERR 0x00000000 +#define CAN_RV_BIT 0x00002301 +#define CAN_RV_INT 0x00000000 +#define CAN_RV_TST 0x00000000 +#define CAN_RV_BRPE 0x00000000 +#define CAN_RV_IF1CRQ 0x00000001 +#define CAN_RV_IF1CMSK 0x00000000 +#define CAN_RV_IF1MSK1 0x0000FFFF +#define CAN_RV_IF1MSK2 0x0000FFFF +#define CAN_RV_IF1ARB1 0x00000000 +#define CAN_RV_IF1ARB2 0x00000000 +#define CAN_RV_IF1MCTL 0x00000000 +#define CAN_RV_IF1DA1 0x00000000 +#define CAN_RV_IF1DA2 0x00000000 +#define CAN_RV_IF1DB1 0x00000000 +#define CAN_RV_IF1DB2 0x00000000 +#define CAN_RV_IF2CRQ 0x00000001 +#define CAN_RV_IF2CMSK 0x00000000 +#define CAN_RV_IF2MSK1 0x0000FFFF +#define CAN_RV_IF2MSK2 0x0000FFFF +#define CAN_RV_IF2ARB1 0x00000000 +#define CAN_RV_IF2ARB2 0x00000000 +#define CAN_RV_IF2MCTL 0x00000000 +#define CAN_RV_IF2DA1 0x00000000 +#define CAN_RV_IF2DA2 0x00000000 +#define CAN_RV_IF2DB1 0x00000000 +#define CAN_RV_IF2DB2 0x00000000 +#define CAN_RV_TXRQ1 0x00000000 +#define CAN_RV_TXRQ2 0x00000000 +#define CAN_RV_NWDA1 0x00000000 +#define CAN_RV_NWDA2 0x00000000 +#define CAN_RV_MSGINT1 0x00000000 +#define CAN_RV_MSGINT2 0x00000000 +#define CAN_RV_MSGVAL1 0x00000000 +#define CAN_RV_MSGVAL2 0x00000000 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_CTL register. +// +//***************************************************************************** +#define CAN_CTL_TEST 0x00000080 // Test mode enable +#define CAN_CTL_CCE 0x00000040 // Configuration change enable +#define CAN_CTL_DAR 0x00000020 // Disable automatic retransmission +#define CAN_CTL_EIE 0x00000008 // Error interrupt enable +#define CAN_CTL_SIE 0x00000004 // Status change interrupt enable +#define CAN_CTL_IE 0x00000002 // Module interrupt enable +#define CAN_CTL_INIT 0x00000001 // Initialization + +//***************************************************************************** +// +// The following define the bit fields in the CAN_STS register. +// +//***************************************************************************** +#define CAN_STS_BOFF 0x00000080 // Bus Off status +#define CAN_STS_EWARN 0x00000040 // Error Warning status +#define CAN_STS_EPASS 0x00000020 // Error Passive status +#define CAN_STS_RXOK 0x00000010 // Received Message Successful +#define CAN_STS_TXOK 0x00000008 // Transmitted Message Successful +#define CAN_STS_LEC_MSK 0x00000007 // Last Error Code +#define CAN_STS_LEC_NONE 0x00000000 // No error +#define CAN_STS_LEC_STUFF 0x00000001 // Stuff error +#define CAN_STS_LEC_FORM 0x00000002 // Form(at) error +#define CAN_STS_LEC_ACK 0x00000003 // Ack error +#define CAN_STS_LEC_BIT1 0x00000004 // Bit 1 error +#define CAN_STS_LEC_BIT0 0x00000005 // Bit 0 error +#define CAN_STS_LEC_CRC 0x00000006 // CRC error + +//***************************************************************************** +// +// The following define the bit fields in the CAN_ERR register. +// +//***************************************************************************** +#define CAN_ERR_RP 0x00008000 // Receive error passive status +#define CAN_ERR_REC_MASK 0x00007F00 // Receive error counter status +#define CAN_ERR_REC_SHIFT 8 // Receive error counter bit pos +#define CAN_ERR_TEC_MASK 0x000000FF // Transmit error counter status +#define CAN_ERR_TEC_SHIFT 0 // Transmit error counter bit pos + +//***************************************************************************** +// +// The following define the bit fields in the CAN_BIT register. +// +//***************************************************************************** +#define CAN_BIT_TSEG2 0x00007000 // Time segment after sample point +#define CAN_BIT_TSEG1 0x00000F00 // Time segment before sample point +#define CAN_BIT_SJW 0x000000C0 // (Re)Synchronization jump width +#define CAN_BIT_BRP 0x0000003F // Baud rate prescaler + +//***************************************************************************** +// +// The following define the bit fields in the CAN_INT register. +// +//***************************************************************************** +#define CAN_INT_INTID_MSK 0x0000FFFF // Interrupt Identifier +#define CAN_INT_INTID_NONE 0x00000000 // No Interrupt Pending +#define CAN_INT_INTID_STATUS 0x00008000 // Status Interrupt + +//***************************************************************************** +// +// The following define the bit fields in the CAN_TST register. +// +//***************************************************************************** +#define CAN_TST_RX 0x00000080 // CAN_RX pin status +#define CAN_TST_TX_MSK 0x00000060 // Overide control of CAN_TX pin +#define CAN_TST_TX_CANCTL 0x00000000 // CAN core controls CAN_TX +#define CAN_TST_TX_SAMPLE 0x00000020 // Sample Point on CAN_TX +#define CAN_TST_TX_DOMINANT 0x00000040 // Dominant value on CAN_TX +#define CAN_TST_TX_RECESSIVE 0x00000060 // Recessive value on CAN_TX +#define CAN_TST_LBACK 0x00000010 // Loop back mode +#define CAN_TST_SILENT 0x00000008 // Silent mode +#define CAN_TST_BASIC 0x00000004 // Basic mode + +//***************************************************************************** +// +// The following define the bit fields in the CAN_BRPE register. +// +//***************************************************************************** +#define CAN_BRPE_BRPE 0x0000000F // Baud rate prescaler extension + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1CRQ and CAN_IF1CRQ +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFCRQ_BUSY 0x00008000 // Busy flag status +#define CAN_IFCRQ_MNUM_MSK 0x0000003F // Message Number + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1CMSK and CAN_IF2CMSK +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFCMSK_WRNRD 0x00000080 // Write, not Read +#define CAN_IFCMSK_MASK 0x00000040 // Access Mask Bits +#define CAN_IFCMSK_ARB 0x00000020 // Access Arbitration Bits +#define CAN_IFCMSK_CONTROL 0x00000010 // Access Control Bits +#define CAN_IFCMSK_CLRINTPND 0x00000008 // Clear interrupt pending Bit +#define CAN_IFCMSK_TXRQST 0x00000004 // Access Tx request bit (WRNRD=1) +#define CAN_IFCMSK_NEWDAT 0x00000004 // Access New Data bit (WRNRD=0) +#define CAN_IFCMSK_DATAA 0x00000002 // DataA access - bytes 0 to 3 +#define CAN_IFCMSK_DATAB 0x00000001 // DataB access - bytes 4 to 7 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1MSK1 and CAN_IF2MSK1 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFMSK1_MSK 0x0000FFFF // Identifier Mask + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1MSK2 and CAN_IF2MSK2 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFMSK2_MXTD 0x00008000 // Mask extended identifier +#define CAN_IFMSK2_MDIR 0x00004000 // Mask message direction +#define CAN_IFMSK2_MSK 0x00001FFF // Mask identifier + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1ARB1 and CAN_IF2ARB1 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFARB1_ID 0x0000FFFF // Identifier + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1ARB2 and CAN_IF2ARB2 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFARB2_MSGVAL 0x00008000 // Message valid +#define CAN_IFARB2_XTD 0x00004000 // Extended identifier +#define CAN_IFARB2_DIR 0x00002000 // Message direction +#define CAN_IFARB2_ID 0x00001FFF // Message identifier + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1MCTL and CAN_IF2MCTL +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFMCTL_NEWDAT 0x00008000 // New Data +#define CAN_IFMCTL_MSGLST 0x00004000 // Message lost +#define CAN_IFMCTL_INTPND 0x00002000 // Interrupt pending +#define CAN_IFMCTL_UMASK 0x00001000 // Use acceptance mask +#define CAN_IFMCTL_TXIE 0x00000800 // Transmit interrupt enable +#define CAN_IFMCTL_RXIE 0x00000400 // Receive interrupt enable +#define CAN_IFMCTL_RMTEN 0x00000200 // Remote enable +#define CAN_IFMCTL_TXRQST 0x00000100 // Transmit request +#define CAN_IFMCTL_EOB 0x00000080 // End of buffer +#define CAN_IFMCTL_DLC 0x0000000F // Data length code + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1DA1 and CAN_IF2DA1 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFDA1_DATA 0x0000FFFF // Data - bytes 1 and 0 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1DA2 and CAN_IF2DA2 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFDA2_DATA 0x0000FFFF // Data - bytes 3 and 2 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1DB1 and CAN_IF2DB1 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFDB1_DATA 0x0000FFFF // Data - bytes 5 and 4 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1DB2 and CAN_IF2DB2 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFDB2_DATA 0x0000FFFF // Data - bytes 7 and 6 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_TXRQ1 register. +// +//***************************************************************************** +#define CAN_TXRQ1_TXRQST 0x0000FFFF // Transmission Request Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_TXRQ2 register. +// +//***************************************************************************** +#define CAN_TXRQ2_TXRQST 0x0000FFFF // Transmission Request Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_NWDA1 register. +// +//***************************************************************************** +#define CAN_NWDA1_NEWDATA 0x0000FFFF // New Data Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_NWDA2 register. +// +//***************************************************************************** +#define CAN_NWDA2_NEWDATA 0x0000FFFF // New Data Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_MSGINT1 register. +// +//***************************************************************************** +#define CAN_MSGINT1_INTPND 0x0000FFFF // Interrupt Pending Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_MSGINT2 register. +// +//***************************************************************************** +#define CAN_MSGINT2_INTPND 0x0000FFFF // Interrupt Pending Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_MSGVAL1 register. +// +//***************************************************************************** +#define CAN_MSGVAL1_MSGVAL 0x0000FFFF // Message Valid Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_MSGVAL2 register. +// +//***************************************************************************** +#define CAN_MSGVAL2_MSGVAL 0x0000FFFF // Message Valid Bits + +#endif // __HW_CAN_H__ diff --git a/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_comp.h b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_comp.h new file mode 100644 index 000000000..d8b355ea9 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_comp.h @@ -0,0 +1,118 @@ +//***************************************************************************** +// +// hw_comp.h - Macros used when accessing the comparator hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_COMP_H__ +#define __HW_COMP_H__ + +//***************************************************************************** +// +// The following define the offsets of the comparator registers. +// +//***************************************************************************** +#define COMP_O_MIS 0x00000000 // Interrupt status register +#define COMP_O_RIS 0x00000004 // Raw interrupt status register +#define COMP_O_INTEN 0x00000008 // Interrupt enable register +#define COMP_O_REFCTL 0x00000010 // Reference voltage control reg. +#define COMP_O_ACSTAT0 0x00000020 // Comp0 status register +#define COMP_O_ACCTL0 0x00000024 // Comp0 control register +#define COMP_O_ACSTAT1 0x00000040 // Comp1 status register +#define COMP_O_ACCTL1 0x00000044 // Comp1 control register +#define COMP_O_ACSTAT2 0x00000060 // Comp2 status register +#define COMP_O_ACCTL2 0x00000064 // Comp2 control register + +//***************************************************************************** +// +// The following define the bit fields in the COMP_MIS, COMP_RIS, and +// COMP_INTEN registers. +// +//***************************************************************************** +#define COMP_INT_2 0x00000004 // Comp2 interrupt +#define COMP_INT_1 0x00000002 // Comp1 interrupt +#define COMP_INT_0 0x00000001 // Comp0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the COMP_REFCTL register. +// +//***************************************************************************** +#define COMP_REFCTL_EN 0x00000200 // Reference voltage enable +#define COMP_REFCTL_RNG 0x00000100 // Reference voltage range +#define COMP_REFCTL_VREF_MASK 0x0000000F // Reference voltage select mask +#define COMP_REFCTL_VREF_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the COMP_ACSTAT0, COMP_ACSTAT1, and +// COMP_ACSTAT2 registers. +// +//***************************************************************************** +#define COMP_ACSTAT_OVAL 0x00000002 // Comparator output value + +//***************************************************************************** +// +// The following define the bit fields in the COMP_ACCTL0, COMP_ACCTL1, and +// COMP_ACCTL2 registers. +// +//***************************************************************************** +#define COMP_ACCTL_TMASK 0x00000800 // Trigger enable +#define COMP_ACCTL_ASRCP_MASK 0x00000600 // Vin+ source select mask +#define COMP_ACCTL_ASRCP_PIN 0x00000000 // Dedicated Comp+ pin +#define COMP_ACCTL_ASRCP_PIN0 0x00000200 // Comp0+ pin +#define COMP_ACCTL_ASRCP_REF 0x00000400 // Internal voltage reference +#define COMP_ACCTL_ASRCP_RES 0x00000600 // Reserved +#define COMP_ACCTL_OEN 0x00000100 // Comparator output enable +#define COMP_ACCTL_TSVAL 0x00000080 // Trigger polarity select +#define COMP_ACCTL_TSEN_MASK 0x00000060 // Trigger sense mask +#define COMP_ACCTL_TSEN_LEVEL 0x00000000 // Trigger is level sense +#define COMP_ACCTL_TSEN_FALL 0x00000020 // Trigger is falling edge +#define COMP_ACCTL_TSEN_RISE 0x00000040 // Trigger is rising edge +#define COMP_ACCTL_TSEN_BOTH 0x00000060 // Trigger is both edges +#define COMP_ACCTL_ISLVAL 0x00000010 // Interrupt polarity select +#define COMP_ACCTL_ISEN_MASK 0x0000000C // Interrupt sense mask +#define COMP_ACCTL_ISEN_LEVEL 0x00000000 // Interrupt is level sense +#define COMP_ACCTL_ISEN_FALL 0x00000004 // Interrupt is falling edge +#define COMP_ACCTL_ISEN_RISE 0x00000008 // Interrupt is rising edge +#define COMP_ACCTL_ISEN_BOTH 0x0000000C // Interrupt is both edges +#define COMP_ACCTL_CINV 0x00000002 // Comparator output invert + +//***************************************************************************** +// +// The following define the reset values for the comparator registers. +// +//***************************************************************************** +#define COMP_RV_MIS 0x00000000 // Interrupt status register +#define COMP_RV_RIS 0x00000000 // Raw interrupt status register +#define COMP_RV_INTEN 0x00000000 // Interrupt enable register +#define COMP_RV_REFCTL 0x00000000 // Reference voltage control reg. +#define COMP_RV_ACSTAT0 0x00000000 // Comp0 status register +#define COMP_RV_ACCTL0 0x00000000 // Comp0 control register +#define COMP_RV_ACSTAT1 0x00000000 // Comp1 status register +#define COMP_RV_ACCTL1 0x00000000 // Comp1 control register +#define COMP_RV_ACSTAT2 0x00000000 // Comp2 status register +#define COMP_RV_ACCTL2 0x00000000 // Comp2 control register + +#endif // __HW_COMP_H__ diff --git a/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_ethernet.h b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_ethernet.h new file mode 100644 index 000000000..7a8d224cd --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_ethernet.h @@ -0,0 +1,205 @@ +//***************************************************************************** +// +// hw_ethernet.h - Macros used when accessing the ethernet hardware. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_ETHERNET_H__ +#define __HW_ETHERNET_H__ + +//***************************************************************************** +// +// The following define the offsets of the MAC registers in the Ethernet +// Controller. +// +//***************************************************************************** +#define MAC_O_IS 0x00000000 // Interrupt Status Register +#define MAC_O_IACK 0x00000000 // Interrupt Acknowledge Register +#define MAC_O_IM 0x00000004 // Interrupt Mask Register +#define MAC_O_RCTL 0x00000008 // Receive Control Register +#define MAC_O_TCTL 0x0000000C // Transmit Control Register +#define MAC_O_DATA 0x00000010 // Data Register +#define MAC_O_IA0 0x00000014 // Individual Address Register 0 +#define MAC_O_IA1 0x00000018 // Individual Address Register 1 +#define MAC_O_THR 0x0000001C // Threshold Register +#define MAC_O_MCTL 0x00000020 // Management Control Register +#define MAC_O_MDV 0x00000024 // Management Divider Register +#define MAC_O_MADD 0x00000028 // Management Address Register +#define MAC_O_MTXD 0x0000002C // Management Transmit Data Reg +#define MAC_O_MRXD 0x00000030 // Management Receive Data Reg +#define MAC_O_NP 0x00000034 // Number of Packets Register +#define MAC_O_TR 0x00000038 // Transmission Request Register + +//***************************************************************************** +// +// The following define the reset values of the MAC registers. +// +//***************************************************************************** +#define MAC_RV_IS 0x00000000 +#define MAC_RV_IACK 0x00000000 +#define MAC_RV_IM 0x0000007F +#define MAC_RV_RCTL 0x00000008 +#define MAC_RV_TCTL 0x00000000 +#define MAC_RV_DATA 0x00000000 +#define MAC_RV_IA0 0x00000000 +#define MAC_RV_IA1 0x00000000 +#define MAC_RV_THR 0x0000003F +#define MAC_RV_MCTL 0x00000000 +#define MAC_RV_MDV 0x00000080 +#define MAC_RV_MADD 0x00000000 +#define MAC_RV_MTXD 0x00000000 +#define MAC_RV_MRXD 0x00000000 +#define MAC_RV_NP 0x00000000 +#define MAC_RV_TR 0x00000000 + +//***************************************************************************** +// +// The following define the bit fields in the MAC_IS register. +// +//***************************************************************************** +#define MAC_IS_PHYINT 0x00000040 // PHY Interrupt +#define MAC_IS_MDINT 0x00000020 // MDI Transaction Complete +#define MAC_IS_RXER 0x00000010 // RX Error +#define MAC_IS_FOV 0x00000008 // RX FIFO Overrun +#define MAC_IS_TXEMP 0x00000004 // TX FIFO Empy +#define MAC_IS_TXER 0x00000002 // TX Error +#define MAC_IS_RXINT 0x00000001 // RX Packet Available + +//***************************************************************************** +// +// The following define the bit fields in the MAC_IACK register. +// +//***************************************************************************** +#define MAC_IACK_PHYINT 0x00000040 // Clear PHY Interrupt +#define MAC_IACK_MDINT 0x00000020 // Clear MDI Transaction Complete +#define MAC_IACK_RXER 0x00000010 // Clear RX Error +#define MAC_IACK_FOV 0x00000008 // Clear RX FIFO Overrun +#define MAC_IACK_TXEMP 0x00000004 // Clear TX FIFO Empy +#define MAC_IACK_TXER 0x00000002 // Clear TX Error +#define MAC_IACK_RXINT 0x00000001 // Clear RX Packet Available + +//***************************************************************************** +// +// The following define the bit fields in the MAC_IM register. +// +//***************************************************************************** +#define MAC_IM_PHYINTM 0x00000040 // Mask PHY Interrupt +#define MAC_IM_MDINTM 0x00000020 // Mask MDI Transaction Complete +#define MAC_IM_RXERM 0x00000010 // Mask RX Error +#define MAC_IM_FOVM 0x00000008 // Mask RX FIFO Overrun +#define MAC_IM_TXEMPM 0x00000004 // Mask TX FIFO Empy +#define MAC_IM_TXERM 0x00000002 // Mask TX Error +#define MAC_IM_RXINTM 0x00000001 // Mask RX Packet Available + +//***************************************************************************** +// +// The following define the bit fields in the MAC_RCTL register. +// +//***************************************************************************** +#define MAC_RCTL_RSTFIFO 0x00000010 // Clear the Receive FIFO +#define MAC_RCTL_BADCRC 0x00000008 // Reject Packets With Bad CRC +#define MAC_RCTL_PRMS 0x00000004 // Enable Promiscuous Mode +#define MAC_RCTL_AMUL 0x00000002 // Enable Multicast Packets +#define MAC_RCTL_RXEN 0x00000001 // Enable Ethernet Receiver + +//***************************************************************************** +// +// The following define the bit fields in the MAC_TCTL register. +// +//***************************************************************************** +#define MAC_TCTL_DUPLEX 0x00000010 // Enable Duplex mode +#define MAC_TCTL_CRC 0x00000004 // Enable CRC Generation +#define MAC_TCTL_PADEN 0x00000002 // Enable Automatic Padding +#define MAC_TCTL_TXEN 0x00000001 // Enable Ethernet Transmitter + +//***************************************************************************** +// +// The following define the bit fields in the MAC_IA0 register. +// +//***************************************************************************** +#define MAC_IA0_MACOCT4 0xFF000000 // 4th Octet of MAC address +#define MAC_IA0_MACOCT3 0x00FF0000 // 3rd Octet of MAC address +#define MAC_IA0_MACOCT2 0x0000FF00 // 2nd Octet of MAC address +#define MAC_IA0_MACOCT1 0x000000FF // 1st Octet of MAC address + +//***************************************************************************** +// +// The following define the bit fields in the MAC_IA1 register. +// +//***************************************************************************** +#define MAC_IA1_MACOCT6 0x0000FF00 // 6th Octet of MAC address +#define MAC_IA1_MACOCT5 0x000000FF // 5th Octet of MAC address + +//***************************************************************************** +// +// The following define the bit fields in the MAC_TXTH register. +// +//***************************************************************************** +#define MAC_THR_THRESH 0x0000003F // Transmit Threshold Value + +//***************************************************************************** +// +// The following define the bit fields in the MAC_MCTL register. +// +//***************************************************************************** +#define MAC_MCTL_REGADR 0x000000F8 // Address for Next MII Transaction +#define MAC_MCTL_WRITE 0x00000002 // Next MII Transaction is Write +#define MAC_MCTL_START 0x00000001 // Start MII Transaction + +//***************************************************************************** +// +// The following define the bit fields in the MAC_MDV register. +// +//***************************************************************************** +#define MAC_MDV_DIV 0x000000FF // Clock Divider for MDC for TX + +//***************************************************************************** +// +// The following define the bit fields in the MAC_MTXD register. +// +//***************************************************************************** +#define MAC_MTXD_MDTX 0x0000FFFF // Data for Next MII Transaction + +//***************************************************************************** +// +// The following define the bit fields in the MAC_MRXD register. +// +//***************************************************************************** +#define MAC_MRXD_MDRX 0x0000FFFF // Data Read from Last MII Trans. + +//***************************************************************************** +// +// The following define the bit fields in the MAC_NP register. +// +//***************************************************************************** +#define MAC_NP_NPR 0x0000003F // Number of RX Frames in FIFO + +//***************************************************************************** +// +// The following define the bit fields in the MAC_TXRQ register. +// +//***************************************************************************** +#define MAC_TR_NEWTX 0x00000001 // Start an Ethernet Transmission + +#endif // __HW_ETHERNET_H__ diff --git a/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_flash.h b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_flash.h new file mode 100644 index 000000000..c5bea3b26 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_flash.h @@ -0,0 +1,147 @@ +//***************************************************************************** +// +// hw_flash.h - Macros used when accessing the flash controller. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_FLASH_H__ +#define __HW_FLASH_H__ + +//***************************************************************************** +// +// The following define the offsets of the FLASH registers. +// +//***************************************************************************** +#define FLASH_FMA 0x400FD000 // Memory address register +#define FLASH_FMD 0x400FD004 // Memory data register +#define FLASH_FMC 0x400FD008 // Memory control register +#define FLASH_FCRIS 0x400FD00c // Raw interrupt status register +#define FLASH_FCIM 0x400FD010 // Interrupt mask register +#define FLASH_FCMISC 0x400FD014 // Interrupt status register +#define FLASH_FMPRE 0x400FE130 // FLASH read protect register +#define FLASH_FMPPE 0x400FE134 // FLASH program protect register +#define FLASH_USECRL 0x400FE140 // uSec reload register +#define FLASH_FMPRE0 0x400FE200 // FLASH read protect register 0 +#define FLASH_FMPRE1 0x400FE204 // FLASH read protect register 1 +#define FLASH_FMPRE2 0x400FE208 // FLASH read protect register 2 +#define FLASH_FMPRE3 0x400FE20C // FLASH read protect register 3 +#define FLASH_FMPPE0 0x400FE400 // FLASH program protect register 0 +#define FLASH_FMPPE1 0x400FE404 // FLASH program protect register 1 +#define FLASH_FMPPE2 0x400FE408 // FLASH program protect register 2 +#define FLASH_FMPPE3 0x400FE40C // FLASH program protect register 3 + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FMC register. +// +//***************************************************************************** +#define FLASH_FMC_WRKEY_MASK 0xFFFF0000 // FLASH write key mask +#define FLASH_FMC_WRKEY 0xA4420000 // FLASH write key +#define FLASH_FMC_COMT 0x00000008 // Commit user register +#define FLASH_FMC_MERASE 0x00000004 // Mass erase FLASH +#define FLASH_FMC_ERASE 0x00000002 // Erase FLASH page +#define FLASH_FMC_WRITE 0x00000001 // Write FLASH word + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FCRIS register. +// +//***************************************************************************** +#define FLASH_FCRIS_PROGRAM 0x00000002 // Programming status +#define FLASH_FCRIS_ACCESS 0x00000001 // Invalid access status + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FCIM register. +// +//***************************************************************************** +#define FLASH_FCIM_PROGRAM 0x00000002 // Programming mask +#define FLASH_FCIM_ACCESS 0x00000001 // Invalid access mask + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FMIS register. +// +//***************************************************************************** +#define FLASH_FCMISC_PROGRAM 0x00000002 // Programming status +#define FLASH_FCMISC_ACCESS 0x00000001 // Invalid access status + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FMPRE and FLASH_FMPPE +// registers. +// +//***************************************************************************** +#define FLASH_FMP_BLOCK_31 0x80000000 // Enable for block 31 +#define FLASH_FMP_BLOCK_30 0x40000000 // Enable for block 30 +#define FLASH_FMP_BLOCK_29 0x20000000 // Enable for block 29 +#define FLASH_FMP_BLOCK_28 0x10000000 // Enable for block 28 +#define FLASH_FMP_BLOCK_27 0x08000000 // Enable for block 27 +#define FLASH_FMP_BLOCK_26 0x04000000 // Enable for block 26 +#define FLASH_FMP_BLOCK_25 0x02000000 // Enable for block 25 +#define FLASH_FMP_BLOCK_24 0x01000000 // Enable for block 24 +#define FLASH_FMP_BLOCK_23 0x00800000 // Enable for block 23 +#define FLASH_FMP_BLOCK_22 0x00400000 // Enable for block 22 +#define FLASH_FMP_BLOCK_21 0x00200000 // Enable for block 21 +#define FLASH_FMP_BLOCK_20 0x00100000 // Enable for block 20 +#define FLASH_FMP_BLOCK_19 0x00080000 // Enable for block 19 +#define FLASH_FMP_BLOCK_18 0x00040000 // Enable for block 18 +#define FLASH_FMP_BLOCK_17 0x00020000 // Enable for block 17 +#define FLASH_FMP_BLOCK_16 0x00010000 // Enable for block 16 +#define FLASH_FMP_BLOCK_15 0x00008000 // Enable for block 15 +#define FLASH_FMP_BLOCK_14 0x00004000 // Enable for block 14 +#define FLASH_FMP_BLOCK_13 0x00002000 // Enable for block 13 +#define FLASH_FMP_BLOCK_12 0x00001000 // Enable for block 12 +#define FLASH_FMP_BLOCK_11 0x00000800 // Enable for block 11 +#define FLASH_FMP_BLOCK_10 0x00000400 // Enable for block 10 +#define FLASH_FMP_BLOCK_9 0x00000200 // Enable for block 9 +#define FLASH_FMP_BLOCK_8 0x00000100 // Enable for block 8 +#define FLASH_FMP_BLOCK_7 0x00000080 // Enable for block 7 +#define FLASH_FMP_BLOCK_6 0x00000040 // Enable for block 6 +#define FLASH_FMP_BLOCK_5 0x00000020 // Enable for block 5 +#define FLASH_FMP_BLOCK_4 0x00000010 // Enable for block 4 +#define FLASH_FMP_BLOCK_3 0x00000008 // Enable for block 3 +#define FLASH_FMP_BLOCK_2 0x00000004 // Enable for block 2 +#define FLASH_FMP_BLOCK_1 0x00000002 // Enable for block 1 +#define FLASH_FMP_BLOCK_0 0x00000001 // Enable for block 0 + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_USECRL register. +// +//***************************************************************************** +#define FLASH_USECRL_MASK 0x000000FF // Clock per uSec +#define FLASH_USECRL_SHIFT 0 + +//***************************************************************************** +// +// The erase size is the size of the FLASH block that is erased by an erase +// operation, and the protect size is the size of the FLASH block that is +// protected by each protection register. +// +//***************************************************************************** +#define FLASH_ERASE_SIZE 0x00000400 +#define FLASH_PROTECT_SIZE 0x00000800 + +#endif // __HW_FLASH_H__ diff --git a/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_gpio.h b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_gpio.h new file mode 100644 index 000000000..3596325a7 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_gpio.h @@ -0,0 +1,115 @@ +//***************************************************************************** +// +// hw_gpio.h - Defines and Macros for GPIO hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_GPIO_H__ +#define __HW_GPIO_H__ + +//***************************************************************************** +// +// GPIO Register Offsets. +// +//***************************************************************************** +#define GPIO_O_DATA 0x00000000 // Data register. +#define GPIO_O_DIR 0x00000400 // Data direction register. +#define GPIO_O_IS 0x00000404 // Interrupt sense register. +#define GPIO_O_IBE 0x00000408 // Interrupt both edges register. +#define GPIO_O_IEV 0x0000040C // Intterupt event register. +#define GPIO_O_IM 0x00000410 // Interrupt mask register. +#define GPIO_O_RIS 0x00000414 // Raw interrupt status register. +#define GPIO_O_MIS 0x00000418 // Masked interrupt status reg. +#define GPIO_O_ICR 0x0000041C // Interrupt clear register. +#define GPIO_O_AFSEL 0x00000420 // Mode control select register. +#define GPIO_O_DR2R 0x00000500 // 2ma drive select register. +#define GPIO_O_DR4R 0x00000504 // 4ma drive select register. +#define GPIO_O_DR8R 0x00000508 // 8ma drive select register. +#define GPIO_O_ODR 0x0000050C // Open drain select register. +#define GPIO_O_PUR 0x00000510 // Pull up select register. +#define GPIO_O_PDR 0x00000514 // Pull down select register. +#define GPIO_O_SLR 0x00000518 // Slew rate control enable reg. +#define GPIO_O_DEN 0x0000051C // Digital input enable register. +#define GPIO_O_LOCK 0x00000520 // Lock register. +#define GPIO_O_CR 0x00000524 // Commit register. +#define GPIO_O_PeriphID4 0x00000FD0 // +#define GPIO_O_PeriphID5 0x00000FD4 // +#define GPIO_O_PeriphID6 0x00000FD8 // +#define GPIO_O_PeriphID7 0x00000FDC // +#define GPIO_O_PeriphID0 0x00000FE0 // +#define GPIO_O_PeriphID1 0x00000FE4 // +#define GPIO_O_PeriphID2 0x00000FE8 // +#define GPIO_O_PeriphID3 0x00000FEC // +#define GPIO_O_PCellID0 0x00000FF0 // +#define GPIO_O_PCellID1 0x00000FF4 // +#define GPIO_O_PCellID2 0x00000FF8 // +#define GPIO_O_PCellID3 0x00000FFC // + +//***************************************************************************** +// +// The following define the bit fields in the GPIO_LOCK register. +// +//***************************************************************************** +#define GPIO_LOCK_LOCKED 0x00000001 // GPIO_CR register is locked +#define GPIO_LOCK_UNLOCKED 0x00000000 // GPIO_CR register is unlocked +#define GPIO_LOCK_KEY 0x1ACCE551 // Unlocks the GPIO_CR register + +//***************************************************************************** +// +// GPIO Register reset values. +// +//***************************************************************************** +#define GPIO_RV_DATA 0x00000000 // Data register reset value. +#define GPIO_RV_DIR 0x00000000 // Data direction reg RV. +#define GPIO_RV_IS 0x00000000 // Interrupt sense reg RV. +#define GPIO_RV_IBE 0x00000000 // Interrupt both edges reg RV. +#define GPIO_RV_IEV 0x00000000 // Intterupt event reg RV. +#define GPIO_RV_IM 0x00000000 // Interrupt mask reg RV. +#define GPIO_RV_RIS 0x00000000 // Raw interrupt status reg RV. +#define GPIO_RV_MIS 0x00000000 // Masked interrupt status reg RV. +#define GPIO_RV_IC 0x00000000 // Interrupt clear reg RV. +#define GPIO_RV_AFSEL 0x00000000 // Mode control select reg RV. +#define GPIO_RV_DR2R 0x000000FF // 2ma drive select reg RV. +#define GPIO_RV_DR4R 0x00000000 // 4ma drive select reg RV. +#define GPIO_RV_DR8R 0x00000000 // 8ma drive select reg RV. +#define GPIO_RV_ODR 0x00000000 // Open drain select reg RV. +#define GPIO_RV_PUR 0x000000FF // Pull up select reg RV. +#define GPIO_RV_PDR 0x00000000 // Pull down select reg RV. +#define GPIO_RV_SLR 0x00000000 // Slew rate control enable reg RV. +#define GPIO_RV_DEN 0x000000FF // Digital input enable reg RV. +#define GPIO_RV_LOCK 0x00000001 // Lock register RV. +#define GPIO_RV_PeriphID4 0x00000000 // +#define GPIO_RV_PeriphID5 0x00000000 // +#define GPIO_RV_PeriphID6 0x00000000 // +#define GPIO_RV_PeriphID7 0x00000000 // +#define GPIO_RV_PeriphID0 0x00000061 // +#define GPIO_RV_PeriphID1 0x00000010 // +#define GPIO_RV_PeriphID2 0x00000004 // +#define GPIO_RV_PeriphID3 0x00000000 // +#define GPIO_RV_PCellID0 0x0000000D // +#define GPIO_RV_PCellID1 0x000000F0 // +#define GPIO_RV_PCellID2 0x00000005 // +#define GPIO_RV_PCellID3 0x000000B1 // + +#endif // __HW_GPIO_H__ diff --git a/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_hibernate.h b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_hibernate.h new file mode 100644 index 000000000..ee730d4c5 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_hibernate.h @@ -0,0 +1,145 @@ +//***************************************************************************** +// +// hw_hibernate.h - Defines and Macros for the Hibernation module. +// +// Copyright (c) 2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_HIBERNATE_H__ +#define __HW_HIBERNATE_H__ + +//***************************************************************************** +// +// The following define the addresses of the hibernation module registers. +// +//***************************************************************************** +#define HIB_RTCC 0x400fc000 // Hibernate RTC counter +#define HIB_RTCM0 0x400fc004 // Hibernate RTC match 0 +#define HIB_RTCM1 0x400fc008 // Hibernate RTC match 1 +#define HIB_RTCLD 0x400fc00C // Hibernate RTC load +#define HIB_CTL 0x400fc010 // Hibernate RTC control +#define HIB_IM 0x400fc014 // Hibernate interrupt mask +#define HIB_RIS 0x400fc018 // Hibernate raw interrupt status +#define HIB_MIS 0x400fc01C // Hibernate masked interrupt stat +#define HIB_IC 0x400fc020 // Hibernate interrupt clear +#define HIB_RTCT 0x400fc024 // Hibernate RTC trim +#define HIB_DATA 0x400fc030 // Hibernate data area +#define HIB_DATA_END 0x400fc130 // end of data area, exclusive + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate RTC counter register. +// +//***************************************************************************** +#define HIB_RTCC_MASK 0xffffffff // RTC counter mask + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate RTC match 0 register. +// +//***************************************************************************** +#define HIB_RTCM0_MASK 0xffffffff // RTC match 0 mask + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate RTC match 1 register. +// +//***************************************************************************** +#define HIB_RTCM1_MASK 0xffffffff // RTC match 1 mask + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate RTC load register. +// +//***************************************************************************** +#define HIB_RTCLD_MASK 0xffffffff // RTC load mask + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate control register +// +//***************************************************************************** +#define HIB_CTL_VABORT 0x00000080 // low bat abort +#define HIB_CTL_CLK32EN 0x00000040 // enable clock/oscillator +#define HIB_CTL_LOWBATEN 0x00000020 // enable low battery detect +#define HIB_CTL_PINWEN 0x00000010 // enable wake on WAKE pin +#define HIB_CTL_RTCWEN 0x00000008 // enable wake on RTC match +#define HIB_CTL_CLKSEL 0x00000004 // clock input selection +#define HIB_CTL_HIBREQ 0x00000002 // request hibernation +#define HIB_CTL_RTCEN 0x00000001 // RTC enable + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate interrupt mask reg. +// +//***************************************************************************** +#define HIB_IM_EXTW 0x00000008 // wake from external pin interrupt +#define HIB_IM_LOWBAT 0x00000004 // low battery interrupt +#define HIB_IM_RTCALT1 0x00000002 // RTC match 1 interrupt +#define HIB_IM_RTCALT0 0x00000001 // RTC match 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate raw interrupt status. +// +//***************************************************************************** +#define HIB_RIS_EXTW 0x00000008 // wake from external pin interrupt +#define HIB_RIS_LOWBAT 0x00000004 // low battery interrupt +#define HIB_RIS_RTCALT1 0x00000002 // RTC match 1 interrupt +#define HIB_RID_RTCALT0 0x00000001 // RTC match 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate masked int status. +// +//***************************************************************************** +#define HIB_MIS_EXTW 0x00000008 // wake from external pin interrupt +#define HIB_MIS_LOWBAT 0x00000004 // low battery interrupt +#define HIB_MIS_RTCALT1 0x00000002 // RTC match 1 interrupt +#define HIB_MID_RTCALT0 0x00000001 // RTC match 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate interrupt clear reg. +// +//***************************************************************************** +#define HIB_IC_EXTW 0x00000008 // wake from external pin interrupt +#define HIB_IC_LOWBAT 0x00000004 // low battery interrupt +#define HIB_IC_RTCALT1 0x00000002 // RTC match 1 interrupt +#define HIB_IC_RTCALT0 0x00000001 // RTC match 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate RTC trim register. +// +//***************************************************************************** +#define HIB_RTCT_MASK 0x0000ffff // RTC trim mask + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate data register. +// +//***************************************************************************** +#define HIB_DATA_MASK 0xffffffff // NV memory data mask + +#endif // __HW_HIBERNATE_H__ diff --git a/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_i2c.h b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_i2c.h new file mode 100644 index 000000000..b90edb7df --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_i2c.h @@ -0,0 +1,197 @@ +//***************************************************************************** +// +// hw_i2c.h - Macros used when accessing the I2C master and slave hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_I2C_H__ +#define __HW_I2C_H__ + +//***************************************************************************** +// +// The following defines the offset between the I2C master and slave registers. +// +//***************************************************************************** +#define I2C_O_SLAVE 0x00000800 // Offset from master to slave + +//***************************************************************************** +// +// The following define the offsets of the I2C master registers. +// +//***************************************************************************** +#define I2C_MASTER_O_SA 0x00000000 // Slave address register +#define I2C_MASTER_O_CS 0x00000004 // Control and Status register +#define I2C_MASTER_O_DR 0x00000008 // Data register +#define I2C_MASTER_O_TPR 0x0000000C // Timer period register +#define I2C_MASTER_O_IMR 0x00000010 // Interrupt mask register +#define I2C_MASTER_O_RIS 0x00000014 // Raw interrupt status register +#define I2C_MASTER_O_MIS 0x00000018 // Masked interrupt status reg +#define I2C_MASTER_O_MICR 0x0000001c // Interrupt clear register +#define I2C_MASTER_O_CR 0x00000020 // Configuration register + +//***************************************************************************** +// +// The following define the offsets of the I2C slave registers. +// +//***************************************************************************** +#define I2C_SLAVE_O_OAR 0x00000000 // Own address register +#define I2C_SLAVE_O_CSR 0x00000004 // Control/Status register +#define I2C_SLAVE_O_DR 0x00000008 // Data register +#define I2C_SLAVE_O_IM 0x0000000C // Interrupt mask register +#define I2C_SLAVE_O_RIS 0x00000010 // Raw interrupt status register +#define I2C_SLAVE_O_MIS 0x00000014 // Masked interrupt status reg +#define I2C_SLAVE_O_SICR 0x00000018 // Interrupt clear register + +//***************************************************************************** +// +// The followng define the bit fields in the I2C master slave address register. +// +//***************************************************************************** +#define I2C_MASTER_SA_SA_MASK 0x000000FE // Slave address +#define I2C_MASTER_SA_RS 0x00000001 // Receive/send +#define I2C_MASTER_SA_SA_SHIFT 1 + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Control and Status +// register. +// +//***************************************************************************** +#define I2C_MASTER_CS_ACK 0x00000008 // Acknowlegde +#define I2C_MASTER_CS_STOP 0x00000004 // Stop +#define I2C_MASTER_CS_START 0x00000002 // Start +#define I2C_MASTER_CS_RUN 0x00000001 // Run +#define I2C_MASTER_CS_BUS_BUSY 0x00000040 // Bus busy +#define I2C_MASTER_CS_IDLE 0x00000020 // Idle +#define I2C_MASTER_CS_ARB_LOST 0x00000010 // Lost arbitration +#define I2C_MASTER_CS_DATA_ACK 0x00000008 // Data byte not acknowledged +#define I2C_MASTER_CS_ADDR_ACK 0x00000004 // Address byte not acknowledged +#define I2C_MASTER_CS_ERROR 0x00000002 // Error occurred +#define I2C_MASTER_CS_BUSY 0x00000001 // Controller is TX/RX data +#define I2C_MASTER_CS_ERR_MASK 0x0000001C + +//***************************************************************************** +// +// The following define values used in determining the contents of the I2C +// Master Timer Period register. +// +//***************************************************************************** +#define I2C_MASTER_TPR_SCL_HP 0x00000004 // SCL high period +#define I2C_MASTER_TPR_SCL_LP 0x00000006 // SCL low period +#define I2C_MASTER_TPR_SCL (I2C_MASTER_TPR_SCL_HP + I2C_MASTER_TPR_SCL_LP) +#define I2C_SCL_STANDARD 100000 // SCL standard frequency +#define I2C_SCL_FAST 400000 // SCL fast frequency + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Interrupt Mask +// register. +// +//***************************************************************************** +#define I2C_MASTER_IMR_IM 0x00000001 // Master interrupt mask + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Raw Interrupt Status +// register. +// +//***************************************************************************** +#define I2C_MASTER_RIS_RIS 0x00000001 // Master raw interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Masked Interrupt +// Status register. +// +//***************************************************************************** +#define I2C_MASTER_MIS_MIS 0x00000001 // Master masked interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Interrupt Clear +// register. +// +//***************************************************************************** +#define I2C_MASTER_MICR_IC 0x00000001 // Master interrupt clear + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Configuration +// register. +// +//***************************************************************************** +#define I2C_MASTER_CR_SFE 0x00000020 // Slave function enable +#define I2C_MASTER_CR_MFE 0x00000010 // Master function enable +#define I2C_MASTER_CR_LPBK 0x00000001 // Loopback enable + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Own Address register. +// +//***************************************************************************** +#define I2C_SLAVE_SOAR_OAR_MASK 0x0000007F // Slave address + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Control/Status +// register. +// +//***************************************************************************** +#define I2C_SLAVE_CSR_DA 0x00000001 // Enable the device +#define I2C_SLAVE_CSR_TREQ 0x00000002 // Transmit request received +#define I2C_SLAVE_CSR_RREQ 0x00000001 // Receive data from I2C master + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Interrupt Mask +// register. +// +//***************************************************************************** +#define I2C_SLAVE_IMR_IM 0x00000001 // Slave interrupt mask + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Raw Interrupt Status +// register. +// +//***************************************************************************** +#define I2C_SLAVE_RIS_RIS 0x00000001 // Slave raw interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Masked Interrupt +// Status register. +// +//***************************************************************************** +#define I2C_SLAVE_MIS_MIS 0x00000001 // Slave masked interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Interrupt Clear +// register. +// +//***************************************************************************** +#define I2C_SLAVE_SICR_IC 0x00000001 // Slave interrupt clear + +#endif // __HW_I2C_H__ diff --git a/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_ints.h b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_ints.h new file mode 100644 index 000000000..d2df4ee5b --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_ints.h @@ -0,0 +1,113 @@ +//***************************************************************************** +// +// hw_ints.h - Macros that define the interrupt assignment on Stellaris. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_INTS_H__ +#define __HW_INTS_H__ + +//***************************************************************************** +// +// The following define the fault assignments. +// +//***************************************************************************** +#define FAULT_NMI 2 // NMI fault +#define FAULT_HARD 3 // Hard fault +#define FAULT_MPU 4 // MPU fault +#define FAULT_BUS 5 // Bus fault +#define FAULT_USAGE 6 // Usage fault +#define FAULT_SVCALL 11 // SVCall +#define FAULT_DEBUG 12 // Debug monitor +#define FAULT_PENDSV 14 // PendSV +#define FAULT_SYSTICK 15 // System Tick + +//***************************************************************************** +// +// The following define the interrupt assignments. +// +//***************************************************************************** +#define INT_GPIOA 16 // GPIO Port A +#define INT_GPIOB 17 // GPIO Port B +#define INT_GPIOC 18 // GPIO Port C +#define INT_GPIOD 19 // GPIO Port D +#define INT_GPIOE 20 // GPIO Port E +#define INT_UART0 21 // UART0 Rx and Tx +#define INT_UART1 22 // UART1 Rx and Tx +#define INT_SSI 23 // SSI Rx and Tx +#define INT_SSI0 23 // SSI0 Rx and Tx +#define INT_I2C 24 // I2C Master and Slave +#define INT_I2C0 24 // I2C0 Master and Slave +#define INT_PWM_FAULT 25 // PWM Fault +#define INT_PWM0 26 // PWM Generator 0 +#define INT_PWM1 27 // PWM Generator 1 +#define INT_PWM2 28 // PWM Generator 2 +#define INT_QEI 29 // Quadrature Encoder +#define INT_QEI0 29 // Quadrature Encoder 0 +#define INT_ADC0 30 // ADC Sequence 0 +#define INT_ADC1 31 // ADC Sequence 1 +#define INT_ADC2 32 // ADC Sequence 2 +#define INT_ADC3 33 // ADC Sequence 3 +#define INT_WATCHDOG 34 // Watchdog timer +#define INT_TIMER0A 35 // Timer 0 subtimer A +#define INT_TIMER0B 36 // Timer 0 subtimer B +#define INT_TIMER1A 37 // Timer 1 subtimer A +#define INT_TIMER1B 38 // Timer 1 subtimer B +#define INT_TIMER2A 39 // Timer 2 subtimer A +#define INT_TIMER2B 40 // Timer 2 subtimer B +#define INT_COMP0 41 // Analog Comparator 0 +#define INT_COMP1 42 // Analog Comparator 1 +#define INT_COMP2 43 // Analog Comparator 2 +#define INT_SYSCTL 44 // System Control (PLL, OSC, BO) +#define INT_FLASH 45 // FLASH Control +#define INT_GPIOF 46 // GPIO Port F +#define INT_GPIOG 47 // GPIO Port G +#define INT_GPIOH 48 // GPIO Port H +#define INT_UART2 49 // UART2 Rx and Tx +#define INT_SSI1 50 // SSI1 Rx and Tx +#define INT_TIMER3A 51 // Timer 3 subtimer A +#define INT_TIMER3B 52 // Timer 3 subtimer B +#define INT_I2C1 53 // I2C1 Master and Slave +#define INT_QEI1 54 // Quadrature Encoder 1 +#define INT_CAN0 55 // CAN0 +#define INT_CAN1 56 // CAN1 +#define INT_ETH 58 // Ethernet +#define INT_HIBERNATE 59 // Hibernation module + +//***************************************************************************** +// +// The total number of interrupts. +// +//***************************************************************************** +#define NUM_INTERRUPTS 60 + +//***************************************************************************** +// +// The total number of priority levels. +// +//***************************************************************************** +#define NUM_PRIORITY 8 +#define NUM_PRIORITY_BITS 3 + +#endif // __HW_INTS_H__ diff --git a/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_memmap.h b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_memmap.h new file mode 100644 index 000000000..8ae2a06cd --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_memmap.h @@ -0,0 +1,80 @@ +//***************************************************************************** +// +// hw_memmap.h - Macros defining the memory map of Stellaris. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_MEMMAP_H__ +#define __HW_MEMMAP_H__ + +//***************************************************************************** +// +// The following define the base address of the memories and peripherals. +// +//***************************************************************************** +#define FLASH_BASE 0x00000000 // FLASH memory +#define SRAM_BASE 0x20000000 // SRAM memory +#define WATCHDOG_BASE 0x40000000 // Watchdog +#define GPIO_PORTA_BASE 0x40004000 // GPIO Port A +#define GPIO_PORTB_BASE 0x40005000 // GPIO Port B +#define GPIO_PORTC_BASE 0x40006000 // GPIO Port C +#define GPIO_PORTD_BASE 0x40007000 // GPIO Port D +#define SSI_BASE 0x40008000 // SSI +#define SSI0_BASE 0x40008000 // SSI0 +#define SSI1_BASE 0x40009000 // SSI1 +#define UART0_BASE 0x4000C000 // UART0 +#define UART1_BASE 0x4000D000 // UART1 +#define UART2_BASE 0x4000E000 // UART2 +#define I2C_MASTER_BASE 0x40020000 // I2C Master +#define I2C_SLAVE_BASE 0x40020800 // I2C Slave +#define I2C0_MASTER_BASE 0x40020000 // I2C0 Master +#define I2C0_SLAVE_BASE 0x40020800 // I2C0 Slave +#define I2C1_MASTER_BASE 0x40021000 // I2C1 Master +#define I2C1_SLAVE_BASE 0x40021800 // I2C1 Slave +#define GPIO_PORTE_BASE 0x40024000 // GPIO Port E +#define GPIO_PORTF_BASE 0x40025000 // GPIO Port F +#define GPIO_PORTG_BASE 0x40026000 // GPIO Port G +#define GPIO_PORTH_BASE 0x40027000 // GPIO Port H +#define PWM_BASE 0x40028000 // PWM +#define QEI_BASE 0x4002C000 // QEI +#define QEI0_BASE 0x4002C000 // QEI0 +#define QEI1_BASE 0x4002D000 // QEI1 +#define TIMER0_BASE 0x40030000 // Timer0 +#define TIMER1_BASE 0x40031000 // Timer1 +#define TIMER2_BASE 0x40032000 // Timer2 +#define TIMER3_BASE 0x40033000 // Timer3 +#define ADC_BASE 0x40038000 // ADC +#define COMP_BASE 0x4003C000 // Analog comparators +#define CAN0_BASE 0x40040000 // CAN0 +#define CAN1_BASE 0x40041000 // CAN1 +#define ETH_BASE 0x40048000 // Ethernet +#define FLASH_CTRL_BASE 0x400FD000 // FLASH Controller +#define SYSCTL_BASE 0x400FE000 // System Control +#define ITM_BASE 0xE0000000 // Instrumentation Trace Macrocell +#define DWT_BASE 0xE0001000 // Data Watchpoint and Trace +#define FPB_BASE 0xE0002000 // FLASH Patch and Breakpoint +#define NVIC_BASE 0xE000E000 // Nested Vectored Interrupt Ctrl +#define TPIU_BASE 0xE0040000 // Trace Port Interface Unit + +#endif // __HW_MEMMAP_H__ diff --git a/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_nvic.h b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_nvic.h new file mode 100644 index 000000000..68c8d7c7f --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_nvic.h @@ -0,0 +1,1050 @@ +//***************************************************************************** +// +// hw_nvic.h - Macros used when accessing the NVIC hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_NVIC_H__ +#define __HW_NVIC_H__ + +//***************************************************************************** +// +// The following define the addresses of the NVIC registers. +// +//***************************************************************************** +#define NVIC_INT_TYPE 0xE000E004 // Interrupt Controller Type Reg. +#define NVIC_ST_CTRL 0xE000E010 // SysTick Control and Status Reg. +#define NVIC_ST_RELOAD 0xE000E014 // SysTick Reload Value Register +#define NVIC_ST_CURRENT 0xE000E018 // SysTick Current Value Register +#define NVIC_ST_CAL 0xE000E01C // SysTick Calibration Value Reg. +#define NVIC_EN0 0xE000E100 // IRQ 0 to 31 Set Enable Register +#define NVIC_EN1 0xE000E104 // IRQ 32 to 63 Set Enable Register +#define NVIC_DIS0 0xE000E180 // IRQ 0 to 31 Clear Enable Reg. +#define NVIC_DIS1 0xE000E184 // IRQ 32 to 63 Clear Enable Reg. +#define NVIC_PEND0 0xE000E200 // IRQ 0 to 31 Set Pending Register +#define NVIC_PEND1 0xE000E204 // IRQ 32 to 63 Set Pending Reg. +#define NVIC_UNPEND0 0xE000E280 // IRQ 0 to 31 Clear Pending Reg. +#define NVIC_UNPEND1 0xE000E284 // IRQ 32 to 63 Clear Pending Reg. +#define NVIC_ACTIVE0 0xE000E300 // IRQ 0 to 31 Active Register +#define NVIC_ACTIVE1 0xE000E304 // IRQ 32 to 63 Active Register +#define NVIC_PRI0 0xE000E400 // IRQ 0 to 3 Priority Register +#define NVIC_PRI1 0xE000E404 // IRQ 4 to 7 Priority Register +#define NVIC_PRI2 0xE000E408 // IRQ 8 to 11 Priority Register +#define NVIC_PRI3 0xE000E40C // IRQ 12 to 15 Priority Register +#define NVIC_PRI4 0xE000E410 // IRQ 16 to 19 Priority Register +#define NVIC_PRI5 0xE000E414 // IRQ 20 to 23 Priority Register +#define NVIC_PRI6 0xE000E418 // IRQ 24 to 27 Priority Register +#define NVIC_PRI7 0xE000E41C // IRQ 28 to 31 Priority Register +#define NVIC_PRI8 0xE000E420 // IRQ 32 to 35 Priority Register +#define NVIC_PRI9 0xE000E424 // IRQ 36 to 39 Priority Register +#define NVIC_PRI10 0xE000E428 // IRQ 40 to 43 Priority Register +#define NVIC_CPUID 0xE000ED00 // CPUID Base Register +#define NVIC_INT_CTRL 0xE000ED04 // Interrupt Control State Register +#define NVIC_VTABLE 0xE000ED08 // Vector Table Offset Register +#define NVIC_APINT 0xE000ED0C // App. Int & Reset Control Reg. +#define NVIC_SYS_CTRL 0xE000ED10 // System Control Register +#define NVIC_CFG_CTRL 0xE000ED14 // Configuration Control Register +#define NVIC_SYS_PRI1 0xE000ED18 // Sys. Handlers 4 to 7 Priority +#define NVIC_SYS_PRI2 0xE000ED1C // Sys. Handlers 8 to 11 Priority +#define NVIC_SYS_PRI3 0xE000ED20 // Sys. Handlers 12 to 15 Priority +#define NVIC_SYS_HND_CTRL 0xE000ED24 // System Handler Control and State +#define NVIC_FAULT_STAT 0xE000ED28 // Configurable Fault Status Reg. +#define NVIC_HFAULT_STAT 0xE000ED2C // Hard Fault Status Register +#define NVIC_DEBUG_STAT 0xE000ED30 // Debug Status Register +#define NVIC_MM_ADDR 0xE000ED34 // Mem Manage Address Register +#define NVIC_FAULT_ADDR 0xE000ED38 // Bus Fault Address Register +#define NVIC_MPU_TYPE 0xE000ED90 // MPU Type Register +#define NVIC_MPU_CTRL 0xE000ED94 // MPU Control Register +#define NVIC_MPU_NUMBER 0xE000ED98 // MPU Region Number Register +#define NVIC_MPU_BASE 0xE000ED9C // MPU Region Base Address Register +#define NVIC_MPU_ATTR 0xE000EDA0 // MPU Region Attribute & Size Reg. +#define NVIC_DBG_CTRL 0xE000EDF0 // Debug Control and Status Reg. +#define NVIC_DBG_XFER 0xE000EDF4 // Debug Core Reg. Transfer Select +#define NVIC_DBG_DATA 0xE000EDF8 // Debug Core Register Data +#define NVIC_DBG_INT 0xE000EDFC // Debug Reset Interrupt Control +#define NVIC_SW_TRIG 0xE000EF00 // Software Trigger Interrupt Reg. + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_INT_TYPE register. +// +//***************************************************************************** +#define NVIC_INT_TYPE_LINES_M 0x0000001F // Number of interrupt lines (x32) +#define NVIC_INT_TYPE_LINES_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CTRL register. +// +//***************************************************************************** +#define NVIC_ST_CTRL_COUNT 0x00010000 // Count flag +#define NVIC_ST_CTRL_CLK_SRC 0x00000004 // Clock Source +#define NVIC_ST_CTRL_INTEN 0x00000002 // Interrupt enable +#define NVIC_ST_CTRL_ENABLE 0x00000001 // Counter mode + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_RELOAD register. +// +//***************************************************************************** +#define NVIC_ST_RELOAD_M 0x00FFFFFF // Counter load value +#define NVIC_ST_RELOAD_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CURRENT register. +// +//***************************************************************************** +#define NVIC_ST_CURRENT_M 0x00FFFFFF // Counter current value +#define NVIC_ST_CURRENT_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CAL register. +// +//***************************************************************************** +#define NVIC_ST_CAL_NOREF 0x80000000 // No reference clock +#define NVIC_ST_CAL_SKEW 0x40000000 // Clock skew +#define NVIC_ST_CAL_ONEMS_M 0x00FFFFFF // 1ms reference value +#define NVIC_ST_CAL_ONEMS_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EN0 register. +// +//***************************************************************************** +#define NVIC_EN0_INT31 0x80000000 // Interrupt 31 enable +#define NVIC_EN0_INT30 0x40000000 // Interrupt 30 enable +#define NVIC_EN0_INT29 0x20000000 // Interrupt 29 enable +#define NVIC_EN0_INT28 0x10000000 // Interrupt 28 enable +#define NVIC_EN0_INT27 0x08000000 // Interrupt 27 enable +#define NVIC_EN0_INT26 0x04000000 // Interrupt 26 enable +#define NVIC_EN0_INT25 0x02000000 // Interrupt 25 enable +#define NVIC_EN0_INT24 0x01000000 // Interrupt 24 enable +#define NVIC_EN0_INT23 0x00800000 // Interrupt 23 enable +#define NVIC_EN0_INT22 0x00400000 // Interrupt 22 enable +#define NVIC_EN0_INT21 0x00200000 // Interrupt 21 enable +#define NVIC_EN0_INT20 0x00100000 // Interrupt 20 enable +#define NVIC_EN0_INT19 0x00080000 // Interrupt 19 enable +#define NVIC_EN0_INT18 0x00040000 // Interrupt 18 enable +#define NVIC_EN0_INT17 0x00020000 // Interrupt 17 enable +#define NVIC_EN0_INT16 0x00010000 // Interrupt 16 enable +#define NVIC_EN0_INT15 0x00008000 // Interrupt 15 enable +#define NVIC_EN0_INT14 0x00004000 // Interrupt 14 enable +#define NVIC_EN0_INT13 0x00002000 // Interrupt 13 enable +#define NVIC_EN0_INT12 0x00001000 // Interrupt 12 enable +#define NVIC_EN0_INT11 0x00000800 // Interrupt 11 enable +#define NVIC_EN0_INT10 0x00000400 // Interrupt 10 enable +#define NVIC_EN0_INT9 0x00000200 // Interrupt 9 enable +#define NVIC_EN0_INT8 0x00000100 // Interrupt 8 enable +#define NVIC_EN0_INT7 0x00000080 // Interrupt 7 enable +#define NVIC_EN0_INT6 0x00000040 // Interrupt 6 enable +#define NVIC_EN0_INT5 0x00000020 // Interrupt 5 enable +#define NVIC_EN0_INT4 0x00000010 // Interrupt 4 enable +#define NVIC_EN0_INT3 0x00000008 // Interrupt 3 enable +#define NVIC_EN0_INT2 0x00000004 // Interrupt 2 enable +#define NVIC_EN0_INT1 0x00000002 // Interrupt 1 enable +#define NVIC_EN0_INT0 0x00000001 // Interrupt 0 enable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EN1 register. +// +//***************************************************************************** +#define NVIC_EN1_INT59 0x08000000 // Interrupt 59 enable +#define NVIC_EN1_INT58 0x04000000 // Interrupt 58 enable +#define NVIC_EN1_INT57 0x02000000 // Interrupt 57 enable +#define NVIC_EN1_INT56 0x01000000 // Interrupt 56 enable +#define NVIC_EN1_INT55 0x00800000 // Interrupt 55 enable +#define NVIC_EN1_INT54 0x00400000 // Interrupt 54 enable +#define NVIC_EN1_INT53 0x00200000 // Interrupt 53 enable +#define NVIC_EN1_INT52 0x00100000 // Interrupt 52 enable +#define NVIC_EN1_INT51 0x00080000 // Interrupt 51 enable +#define NVIC_EN1_INT50 0x00040000 // Interrupt 50 enable +#define NVIC_EN1_INT49 0x00020000 // Interrupt 49 enable +#define NVIC_EN1_INT48 0x00010000 // Interrupt 48 enable +#define NVIC_EN1_INT47 0x00008000 // Interrupt 47 enable +#define NVIC_EN1_INT46 0x00004000 // Interrupt 46 enable +#define NVIC_EN1_INT45 0x00002000 // Interrupt 45 enable +#define NVIC_EN1_INT44 0x00001000 // Interrupt 44 enable +#define NVIC_EN1_INT43 0x00000800 // Interrupt 43 enable +#define NVIC_EN1_INT42 0x00000400 // Interrupt 42 enable +#define NVIC_EN1_INT41 0x00000200 // Interrupt 41 enable +#define NVIC_EN1_INT40 0x00000100 // Interrupt 40 enable +#define NVIC_EN1_INT39 0x00000080 // Interrupt 39 enable +#define NVIC_EN1_INT38 0x00000040 // Interrupt 38 enable +#define NVIC_EN1_INT37 0x00000020 // Interrupt 37 enable +#define NVIC_EN1_INT36 0x00000010 // Interrupt 36 enable +#define NVIC_EN1_INT35 0x00000008 // Interrupt 35 enable +#define NVIC_EN1_INT34 0x00000004 // Interrupt 34 enable +#define NVIC_EN1_INT33 0x00000002 // Interrupt 33 enable +#define NVIC_EN1_INT32 0x00000001 // Interrupt 32 enable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DIS0 register. +// +//***************************************************************************** +#define NVIC_DIS0_INT31 0x80000000 // Interrupt 31 disable +#define NVIC_DIS0_INT30 0x40000000 // Interrupt 30 disable +#define NVIC_DIS0_INT29 0x20000000 // Interrupt 29 disable +#define NVIC_DIS0_INT28 0x10000000 // Interrupt 28 disable +#define NVIC_DIS0_INT27 0x08000000 // Interrupt 27 disable +#define NVIC_DIS0_INT26 0x04000000 // Interrupt 26 disable +#define NVIC_DIS0_INT25 0x02000000 // Interrupt 25 disable +#define NVIC_DIS0_INT24 0x01000000 // Interrupt 24 disable +#define NVIC_DIS0_INT23 0x00800000 // Interrupt 23 disable +#define NVIC_DIS0_INT22 0x00400000 // Interrupt 22 disable +#define NVIC_DIS0_INT21 0x00200000 // Interrupt 21 disable +#define NVIC_DIS0_INT20 0x00100000 // Interrupt 20 disable +#define NVIC_DIS0_INT19 0x00080000 // Interrupt 19 disable +#define NVIC_DIS0_INT18 0x00040000 // Interrupt 18 disable +#define NVIC_DIS0_INT17 0x00020000 // Interrupt 17 disable +#define NVIC_DIS0_INT16 0x00010000 // Interrupt 16 disable +#define NVIC_DIS0_INT15 0x00008000 // Interrupt 15 disable +#define NVIC_DIS0_INT14 0x00004000 // Interrupt 14 disable +#define NVIC_DIS0_INT13 0x00002000 // Interrupt 13 disable +#define NVIC_DIS0_INT12 0x00001000 // Interrupt 12 disable +#define NVIC_DIS0_INT11 0x00000800 // Interrupt 11 disable +#define NVIC_DIS0_INT10 0x00000400 // Interrupt 10 disable +#define NVIC_DIS0_INT9 0x00000200 // Interrupt 9 disable +#define NVIC_DIS0_INT8 0x00000100 // Interrupt 8 disable +#define NVIC_DIS0_INT7 0x00000080 // Interrupt 7 disable +#define NVIC_DIS0_INT6 0x00000040 // Interrupt 6 disable +#define NVIC_DIS0_INT5 0x00000020 // Interrupt 5 disable +#define NVIC_DIS0_INT4 0x00000010 // Interrupt 4 disable +#define NVIC_DIS0_INT3 0x00000008 // Interrupt 3 disable +#define NVIC_DIS0_INT2 0x00000004 // Interrupt 2 disable +#define NVIC_DIS0_INT1 0x00000002 // Interrupt 1 disable +#define NVIC_DIS0_INT0 0x00000001 // Interrupt 0 disable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DIS1 register. +// +//***************************************************************************** +#define NVIC_DIS1_INT59 0x08000000 // Interrupt 59 disable +#define NVIC_DIS1_INT58 0x04000000 // Interrupt 58 disable +#define NVIC_DIS1_INT57 0x02000000 // Interrupt 57 disable +#define NVIC_DIS1_INT56 0x01000000 // Interrupt 56 disable +#define NVIC_DIS1_INT55 0x00800000 // Interrupt 55 disable +#define NVIC_DIS1_INT54 0x00400000 // Interrupt 54 disable +#define NVIC_DIS1_INT53 0x00200000 // Interrupt 53 disable +#define NVIC_DIS1_INT52 0x00100000 // Interrupt 52 disable +#define NVIC_DIS1_INT51 0x00080000 // Interrupt 51 disable +#define NVIC_DIS1_INT50 0x00040000 // Interrupt 50 disable +#define NVIC_DIS1_INT49 0x00020000 // Interrupt 49 disable +#define NVIC_DIS1_INT48 0x00010000 // Interrupt 48 disable +#define NVIC_DIS1_INT47 0x00008000 // Interrupt 47 disable +#define NVIC_DIS1_INT46 0x00004000 // Interrupt 46 disable +#define NVIC_DIS1_INT45 0x00002000 // Interrupt 45 disable +#define NVIC_DIS1_INT44 0x00001000 // Interrupt 44 disable +#define NVIC_DIS1_INT43 0x00000800 // Interrupt 43 disable +#define NVIC_DIS1_INT42 0x00000400 // Interrupt 42 disable +#define NVIC_DIS1_INT41 0x00000200 // Interrupt 41 disable +#define NVIC_DIS1_INT40 0x00000100 // Interrupt 40 disable +#define NVIC_DIS1_INT39 0x00000080 // Interrupt 39 disable +#define NVIC_DIS1_INT38 0x00000040 // Interrupt 38 disable +#define NVIC_DIS1_INT37 0x00000020 // Interrupt 37 disable +#define NVIC_DIS1_INT36 0x00000010 // Interrupt 36 disable +#define NVIC_DIS1_INT35 0x00000008 // Interrupt 35 disable +#define NVIC_DIS1_INT34 0x00000004 // Interrupt 34 disable +#define NVIC_DIS1_INT33 0x00000002 // Interrupt 33 disable +#define NVIC_DIS1_INT32 0x00000001 // Interrupt 32 disable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PEND0 register. +// +//***************************************************************************** +#define NVIC_PEND0_INT31 0x80000000 // Interrupt 31 pend +#define NVIC_PEND0_INT30 0x40000000 // Interrupt 30 pend +#define NVIC_PEND0_INT29 0x20000000 // Interrupt 29 pend +#define NVIC_PEND0_INT28 0x10000000 // Interrupt 28 pend +#define NVIC_PEND0_INT27 0x08000000 // Interrupt 27 pend +#define NVIC_PEND0_INT26 0x04000000 // Interrupt 26 pend +#define NVIC_PEND0_INT25 0x02000000 // Interrupt 25 pend +#define NVIC_PEND0_INT24 0x01000000 // Interrupt 24 pend +#define NVIC_PEND0_INT23 0x00800000 // Interrupt 23 pend +#define NVIC_PEND0_INT22 0x00400000 // Interrupt 22 pend +#define NVIC_PEND0_INT21 0x00200000 // Interrupt 21 pend +#define NVIC_PEND0_INT20 0x00100000 // Interrupt 20 pend +#define NVIC_PEND0_INT19 0x00080000 // Interrupt 19 pend +#define NVIC_PEND0_INT18 0x00040000 // Interrupt 18 pend +#define NVIC_PEND0_INT17 0x00020000 // Interrupt 17 pend +#define NVIC_PEND0_INT16 0x00010000 // Interrupt 16 pend +#define NVIC_PEND0_INT15 0x00008000 // Interrupt 15 pend +#define NVIC_PEND0_INT14 0x00004000 // Interrupt 14 pend +#define NVIC_PEND0_INT13 0x00002000 // Interrupt 13 pend +#define NVIC_PEND0_INT12 0x00001000 // Interrupt 12 pend +#define NVIC_PEND0_INT11 0x00000800 // Interrupt 11 pend +#define NVIC_PEND0_INT10 0x00000400 // Interrupt 10 pend +#define NVIC_PEND0_INT9 0x00000200 // Interrupt 9 pend +#define NVIC_PEND0_INT8 0x00000100 // Interrupt 8 pend +#define NVIC_PEND0_INT7 0x00000080 // Interrupt 7 pend +#define NVIC_PEND0_INT6 0x00000040 // Interrupt 6 pend +#define NVIC_PEND0_INT5 0x00000020 // Interrupt 5 pend +#define NVIC_PEND0_INT4 0x00000010 // Interrupt 4 pend +#define NVIC_PEND0_INT3 0x00000008 // Interrupt 3 pend +#define NVIC_PEND0_INT2 0x00000004 // Interrupt 2 pend +#define NVIC_PEND0_INT1 0x00000002 // Interrupt 1 pend +#define NVIC_PEND0_INT0 0x00000001 // Interrupt 0 pend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PEND1 register. +// +//***************************************************************************** +#define NVIC_PEND1_INT59 0x08000000 // Interrupt 59 pend +#define NVIC_PEND1_INT58 0x04000000 // Interrupt 58 pend +#define NVIC_PEND1_INT57 0x02000000 // Interrupt 57 pend +#define NVIC_PEND1_INT56 0x01000000 // Interrupt 56 pend +#define NVIC_PEND1_INT55 0x00800000 // Interrupt 55 pend +#define NVIC_PEND1_INT54 0x00400000 // Interrupt 54 pend +#define NVIC_PEND1_INT53 0x00200000 // Interrupt 53 pend +#define NVIC_PEND1_INT52 0x00100000 // Interrupt 52 pend +#define NVIC_PEND1_INT51 0x00080000 // Interrupt 51 pend +#define NVIC_PEND1_INT50 0x00040000 // Interrupt 50 pend +#define NVIC_PEND1_INT49 0x00020000 // Interrupt 49 pend +#define NVIC_PEND1_INT48 0x00010000 // Interrupt 48 pend +#define NVIC_PEND1_INT47 0x00008000 // Interrupt 47 pend +#define NVIC_PEND1_INT46 0x00004000 // Interrupt 46 pend +#define NVIC_PEND1_INT45 0x00002000 // Interrupt 45 pend +#define NVIC_PEND1_INT44 0x00001000 // Interrupt 44 pend +#define NVIC_PEND1_INT43 0x00000800 // Interrupt 43 pend +#define NVIC_PEND1_INT42 0x00000400 // Interrupt 42 pend +#define NVIC_PEND1_INT41 0x00000200 // Interrupt 41 pend +#define NVIC_PEND1_INT40 0x00000100 // Interrupt 40 pend +#define NVIC_PEND1_INT39 0x00000080 // Interrupt 39 pend +#define NVIC_PEND1_INT38 0x00000040 // Interrupt 38 pend +#define NVIC_PEND1_INT37 0x00000020 // Interrupt 37 pend +#define NVIC_PEND1_INT36 0x00000010 // Interrupt 36 pend +#define NVIC_PEND1_INT35 0x00000008 // Interrupt 35 pend +#define NVIC_PEND1_INT34 0x00000004 // Interrupt 34 pend +#define NVIC_PEND1_INT33 0x00000002 // Interrupt 33 pend +#define NVIC_PEND1_INT32 0x00000001 // Interrupt 32 pend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_UNPEND0 register. +// +//***************************************************************************** +#define NVIC_UNPEND0_INT31 0x80000000 // Interrupt 31 unpend +#define NVIC_UNPEND0_INT30 0x40000000 // Interrupt 30 unpend +#define NVIC_UNPEND0_INT29 0x20000000 // Interrupt 29 unpend +#define NVIC_UNPEND0_INT28 0x10000000 // Interrupt 28 unpend +#define NVIC_UNPEND0_INT27 0x08000000 // Interrupt 27 unpend +#define NVIC_UNPEND0_INT26 0x04000000 // Interrupt 26 unpend +#define NVIC_UNPEND0_INT25 0x02000000 // Interrupt 25 unpend +#define NVIC_UNPEND0_INT24 0x01000000 // Interrupt 24 unpend +#define NVIC_UNPEND0_INT23 0x00800000 // Interrupt 23 unpend +#define NVIC_UNPEND0_INT22 0x00400000 // Interrupt 22 unpend +#define NVIC_UNPEND0_INT21 0x00200000 // Interrupt 21 unpend +#define NVIC_UNPEND0_INT20 0x00100000 // Interrupt 20 unpend +#define NVIC_UNPEND0_INT19 0x00080000 // Interrupt 19 unpend +#define NVIC_UNPEND0_INT18 0x00040000 // Interrupt 18 unpend +#define NVIC_UNPEND0_INT17 0x00020000 // Interrupt 17 unpend +#define NVIC_UNPEND0_INT16 0x00010000 // Interrupt 16 unpend +#define NVIC_UNPEND0_INT15 0x00008000 // Interrupt 15 unpend +#define NVIC_UNPEND0_INT14 0x00004000 // Interrupt 14 unpend +#define NVIC_UNPEND0_INT13 0x00002000 // Interrupt 13 unpend +#define NVIC_UNPEND0_INT12 0x00001000 // Interrupt 12 unpend +#define NVIC_UNPEND0_INT11 0x00000800 // Interrupt 11 unpend +#define NVIC_UNPEND0_INT10 0x00000400 // Interrupt 10 unpend +#define NVIC_UNPEND0_INT9 0x00000200 // Interrupt 9 unpend +#define NVIC_UNPEND0_INT8 0x00000100 // Interrupt 8 unpend +#define NVIC_UNPEND0_INT7 0x00000080 // Interrupt 7 unpend +#define NVIC_UNPEND0_INT6 0x00000040 // Interrupt 6 unpend +#define NVIC_UNPEND0_INT5 0x00000020 // Interrupt 5 unpend +#define NVIC_UNPEND0_INT4 0x00000010 // Interrupt 4 unpend +#define NVIC_UNPEND0_INT3 0x00000008 // Interrupt 3 unpend +#define NVIC_UNPEND0_INT2 0x00000004 // Interrupt 2 unpend +#define NVIC_UNPEND0_INT1 0x00000002 // Interrupt 1 unpend +#define NVIC_UNPEND0_INT0 0x00000001 // Interrupt 0 unpend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_UNPEND1 register. +// +//***************************************************************************** +#define NVIC_UNPEND1_INT59 0x08000000 // Interrupt 59 unpend +#define NVIC_UNPEND1_INT58 0x04000000 // Interrupt 58 unpend +#define NVIC_UNPEND1_INT57 0x02000000 // Interrupt 57 unpend +#define NVIC_UNPEND1_INT56 0x01000000 // Interrupt 56 unpend +#define NVIC_UNPEND1_INT55 0x00800000 // Interrupt 55 unpend +#define NVIC_UNPEND1_INT54 0x00400000 // Interrupt 54 unpend +#define NVIC_UNPEND1_INT53 0x00200000 // Interrupt 53 unpend +#define NVIC_UNPEND1_INT52 0x00100000 // Interrupt 52 unpend +#define NVIC_UNPEND1_INT51 0x00080000 // Interrupt 51 unpend +#define NVIC_UNPEND1_INT50 0x00040000 // Interrupt 50 unpend +#define NVIC_UNPEND1_INT49 0x00020000 // Interrupt 49 unpend +#define NVIC_UNPEND1_INT48 0x00010000 // Interrupt 48 unpend +#define NVIC_UNPEND1_INT47 0x00008000 // Interrupt 47 unpend +#define NVIC_UNPEND1_INT46 0x00004000 // Interrupt 46 unpend +#define NVIC_UNPEND1_INT45 0x00002000 // Interrupt 45 unpend +#define NVIC_UNPEND1_INT44 0x00001000 // Interrupt 44 unpend +#define NVIC_UNPEND1_INT43 0x00000800 // Interrupt 43 unpend +#define NVIC_UNPEND1_INT42 0x00000400 // Interrupt 42 unpend +#define NVIC_UNPEND1_INT41 0x00000200 // Interrupt 41 unpend +#define NVIC_UNPEND1_INT40 0x00000100 // Interrupt 40 unpend +#define NVIC_UNPEND1_INT39 0x00000080 // Interrupt 39 unpend +#define NVIC_UNPEND1_INT38 0x00000040 // Interrupt 38 unpend +#define NVIC_UNPEND1_INT37 0x00000020 // Interrupt 37 unpend +#define NVIC_UNPEND1_INT36 0x00000010 // Interrupt 36 unpend +#define NVIC_UNPEND1_INT35 0x00000008 // Interrupt 35 unpend +#define NVIC_UNPEND1_INT34 0x00000004 // Interrupt 34 unpend +#define NVIC_UNPEND1_INT33 0x00000002 // Interrupt 33 unpend +#define NVIC_UNPEND1_INT32 0x00000001 // Interrupt 32 unpend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ACTIVE0 register. +// +//***************************************************************************** +#define NVIC_ACTIVE0_INT31 0x80000000 // Interrupt 31 active +#define NVIC_ACTIVE0_INT30 0x40000000 // Interrupt 30 active +#define NVIC_ACTIVE0_INT29 0x20000000 // Interrupt 29 active +#define NVIC_ACTIVE0_INT28 0x10000000 // Interrupt 28 active +#define NVIC_ACTIVE0_INT27 0x08000000 // Interrupt 27 active +#define NVIC_ACTIVE0_INT26 0x04000000 // Interrupt 26 active +#define NVIC_ACTIVE0_INT25 0x02000000 // Interrupt 25 active +#define NVIC_ACTIVE0_INT24 0x01000000 // Interrupt 24 active +#define NVIC_ACTIVE0_INT23 0x00800000 // Interrupt 23 active +#define NVIC_ACTIVE0_INT22 0x00400000 // Interrupt 22 active +#define NVIC_ACTIVE0_INT21 0x00200000 // Interrupt 21 active +#define NVIC_ACTIVE0_INT20 0x00100000 // Interrupt 20 active +#define NVIC_ACTIVE0_INT19 0x00080000 // Interrupt 19 active +#define NVIC_ACTIVE0_INT18 0x00040000 // Interrupt 18 active +#define NVIC_ACTIVE0_INT17 0x00020000 // Interrupt 17 active +#define NVIC_ACTIVE0_INT16 0x00010000 // Interrupt 16 active +#define NVIC_ACTIVE0_INT15 0x00008000 // Interrupt 15 active +#define NVIC_ACTIVE0_INT14 0x00004000 // Interrupt 14 active +#define NVIC_ACTIVE0_INT13 0x00002000 // Interrupt 13 active +#define NVIC_ACTIVE0_INT12 0x00001000 // Interrupt 12 active +#define NVIC_ACTIVE0_INT11 0x00000800 // Interrupt 11 active +#define NVIC_ACTIVE0_INT10 0x00000400 // Interrupt 10 active +#define NVIC_ACTIVE0_INT9 0x00000200 // Interrupt 9 active +#define NVIC_ACTIVE0_INT8 0x00000100 // Interrupt 8 active +#define NVIC_ACTIVE0_INT7 0x00000080 // Interrupt 7 active +#define NVIC_ACTIVE0_INT6 0x00000040 // Interrupt 6 active +#define NVIC_ACTIVE0_INT5 0x00000020 // Interrupt 5 active +#define NVIC_ACTIVE0_INT4 0x00000010 // Interrupt 4 active +#define NVIC_ACTIVE0_INT3 0x00000008 // Interrupt 3 active +#define NVIC_ACTIVE0_INT2 0x00000004 // Interrupt 2 active +#define NVIC_ACTIVE0_INT1 0x00000002 // Interrupt 1 active +#define NVIC_ACTIVE0_INT0 0x00000001 // Interrupt 0 active + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ACTIVE1 register. +// +//***************************************************************************** +#define NVIC_ACTIVE1_INT59 0x08000000 // Interrupt 59 active +#define NVIC_ACTIVE1_INT58 0x04000000 // Interrupt 58 active +#define NVIC_ACTIVE1_INT57 0x02000000 // Interrupt 57 active +#define NVIC_ACTIVE1_INT56 0x01000000 // Interrupt 56 active +#define NVIC_ACTIVE1_INT55 0x00800000 // Interrupt 55 active +#define NVIC_ACTIVE1_INT54 0x00400000 // Interrupt 54 active +#define NVIC_ACTIVE1_INT53 0x00200000 // Interrupt 53 active +#define NVIC_ACTIVE1_INT52 0x00100000 // Interrupt 52 active +#define NVIC_ACTIVE1_INT51 0x00080000 // Interrupt 51 active +#define NVIC_ACTIVE1_INT50 0x00040000 // Interrupt 50 active +#define NVIC_ACTIVE1_INT49 0x00020000 // Interrupt 49 active +#define NVIC_ACTIVE1_INT48 0x00010000 // Interrupt 48 active +#define NVIC_ACTIVE1_INT47 0x00008000 // Interrupt 47 active +#define NVIC_ACTIVE1_INT46 0x00004000 // Interrupt 46 active +#define NVIC_ACTIVE1_INT45 0x00002000 // Interrupt 45 active +#define NVIC_ACTIVE1_INT44 0x00001000 // Interrupt 44 active +#define NVIC_ACTIVE1_INT43 0x00000800 // Interrupt 43 active +#define NVIC_ACTIVE1_INT42 0x00000400 // Interrupt 42 active +#define NVIC_ACTIVE1_INT41 0x00000200 // Interrupt 41 active +#define NVIC_ACTIVE1_INT40 0x00000100 // Interrupt 40 active +#define NVIC_ACTIVE1_INT39 0x00000080 // Interrupt 39 active +#define NVIC_ACTIVE1_INT38 0x00000040 // Interrupt 38 active +#define NVIC_ACTIVE1_INT37 0x00000020 // Interrupt 37 active +#define NVIC_ACTIVE1_INT36 0x00000010 // Interrupt 36 active +#define NVIC_ACTIVE1_INT35 0x00000008 // Interrupt 35 active +#define NVIC_ACTIVE1_INT34 0x00000004 // Interrupt 34 active +#define NVIC_ACTIVE1_INT33 0x00000002 // Interrupt 33 active +#define NVIC_ACTIVE1_INT32 0x00000001 // Interrupt 32 active + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI0 register. +// +//***************************************************************************** +#define NVIC_PRI0_INT3_M 0xFF000000 // Interrupt 3 priority mask +#define NVIC_PRI0_INT2_M 0x00FF0000 // Interrupt 2 priority mask +#define NVIC_PRI0_INT1_M 0x0000FF00 // Interrupt 1 priority mask +#define NVIC_PRI0_INT0_M 0x000000FF // Interrupt 0 priority mask +#define NVIC_PRI0_INT3_S 24 +#define NVIC_PRI0_INT2_S 16 +#define NVIC_PRI0_INT1_S 8 +#define NVIC_PRI0_INT0_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI1 register. +// +//***************************************************************************** +#define NVIC_PRI1_INT7_M 0xFF000000 // Interrupt 7 priority mask +#define NVIC_PRI1_INT6_M 0x00FF0000 // Interrupt 6 priority mask +#define NVIC_PRI1_INT5_M 0x0000FF00 // Interrupt 5 priority mask +#define NVIC_PRI1_INT4_M 0x000000FF // Interrupt 4 priority mask +#define NVIC_PRI1_INT7_S 24 +#define NVIC_PRI1_INT6_S 16 +#define NVIC_PRI1_INT5_S 8 +#define NVIC_PRI1_INT4_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI2 register. +// +//***************************************************************************** +#define NVIC_PRI2_INT11_M 0xFF000000 // Interrupt 11 priority mask +#define NVIC_PRI2_INT10_M 0x00FF0000 // Interrupt 10 priority mask +#define NVIC_PRI2_INT9_M 0x0000FF00 // Interrupt 9 priority mask +#define NVIC_PRI2_INT8_M 0x000000FF // Interrupt 8 priority mask +#define NVIC_PRI2_INT11_S 24 +#define NVIC_PRI2_INT10_S 16 +#define NVIC_PRI2_INT9_S 8 +#define NVIC_PRI2_INT8_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI3 register. +// +//***************************************************************************** +#define NVIC_PRI3_INT15_M 0xFF000000 // Interrupt 15 priority mask +#define NVIC_PRI3_INT14_M 0x00FF0000 // Interrupt 14 priority mask +#define NVIC_PRI3_INT13_M 0x0000FF00 // Interrupt 13 priority mask +#define NVIC_PRI3_INT12_M 0x000000FF // Interrupt 12 priority mask +#define NVIC_PRI3_INT15_S 24 +#define NVIC_PRI3_INT14_S 16 +#define NVIC_PRI3_INT13_S 8 +#define NVIC_PRI3_INT12_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI4 register. +// +//***************************************************************************** +#define NVIC_PRI4_INT19_M 0xFF000000 // Interrupt 19 priority mask +#define NVIC_PRI4_INT18_M 0x00FF0000 // Interrupt 18 priority mask +#define NVIC_PRI4_INT17_M 0x0000FF00 // Interrupt 17 priority mask +#define NVIC_PRI4_INT16_M 0x000000FF // Interrupt 16 priority mask +#define NVIC_PRI4_INT19_S 24 +#define NVIC_PRI4_INT18_S 16 +#define NVIC_PRI4_INT17_S 8 +#define NVIC_PRI4_INT16_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI5 register. +// +//***************************************************************************** +#define NVIC_PRI5_INT23_M 0xFF000000 // Interrupt 23 priority mask +#define NVIC_PRI5_INT22_M 0x00FF0000 // Interrupt 22 priority mask +#define NVIC_PRI5_INT21_M 0x0000FF00 // Interrupt 21 priority mask +#define NVIC_PRI5_INT20_M 0x000000FF // Interrupt 20 priority mask +#define NVIC_PRI5_INT23_S 24 +#define NVIC_PRI5_INT22_S 16 +#define NVIC_PRI5_INT21_S 8 +#define NVIC_PRI5_INT20_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI6 register. +// +//***************************************************************************** +#define NVIC_PRI6_INT27_M 0xFF000000 // Interrupt 27 priority mask +#define NVIC_PRI6_INT26_M 0x00FF0000 // Interrupt 26 priority mask +#define NVIC_PRI6_INT25_M 0x0000FF00 // Interrupt 25 priority mask +#define NVIC_PRI6_INT24_M 0x000000FF // Interrupt 24 priority mask +#define NVIC_PRI6_INT27_S 24 +#define NVIC_PRI6_INT26_S 16 +#define NVIC_PRI6_INT25_S 8 +#define NVIC_PRI6_INT24_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI7 register. +// +//***************************************************************************** +#define NVIC_PRI7_INT31_M 0xFF000000 // Interrupt 31 priority mask +#define NVIC_PRI7_INT30_M 0x00FF0000 // Interrupt 30 priority mask +#define NVIC_PRI7_INT29_M 0x0000FF00 // Interrupt 29 priority mask +#define NVIC_PRI7_INT28_M 0x000000FF // Interrupt 28 priority mask +#define NVIC_PRI7_INT31_S 24 +#define NVIC_PRI7_INT30_S 16 +#define NVIC_PRI7_INT29_S 8 +#define NVIC_PRI7_INT28_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI8 register. +// +//***************************************************************************** +#define NVIC_PRI8_INT35_M 0xFF000000 // Interrupt 35 priority mask +#define NVIC_PRI8_INT34_M 0x00FF0000 // Interrupt 34 priority mask +#define NVIC_PRI8_INT33_M 0x0000FF00 // Interrupt 33 priority mask +#define NVIC_PRI8_INT32_M 0x000000FF // Interrupt 32 priority mask +#define NVIC_PRI8_INT35_S 24 +#define NVIC_PRI8_INT34_S 16 +#define NVIC_PRI8_INT33_S 8 +#define NVIC_PRI8_INT32_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI9 register. +// +//***************************************************************************** +#define NVIC_PRI9_INT39_M 0xFF000000 // Interrupt 39 priority mask +#define NVIC_PRI9_INT38_M 0x00FF0000 // Interrupt 38 priority mask +#define NVIC_PRI9_INT37_M 0x0000FF00 // Interrupt 37 priority mask +#define NVIC_PRI9_INT36_M 0x000000FF // Interrupt 36 priority mask +#define NVIC_PRI9_INT39_S 24 +#define NVIC_PRI9_INT38_S 16 +#define NVIC_PRI9_INT37_S 8 +#define NVIC_PRI9_INT36_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI10 register. +// +//***************************************************************************** +#define NVIC_PRI10_INT43_M 0xFF000000 // Interrupt 43 priority mask +#define NVIC_PRI10_INT42_M 0x00FF0000 // Interrupt 42 priority mask +#define NVIC_PRI10_INT41_M 0x0000FF00 // Interrupt 41 priority mask +#define NVIC_PRI10_INT40_M 0x000000FF // Interrupt 40 priority mask +#define NVIC_PRI10_INT43_S 24 +#define NVIC_PRI10_INT42_S 16 +#define NVIC_PRI10_INT41_S 8 +#define NVIC_PRI10_INT40_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_CPUID register. +// +//***************************************************************************** +#define NVIC_CPUID_IMP_M 0xFF000000 // Implementer +#define NVIC_CPUID_VAR_M 0x00F00000 // Variant +#define NVIC_CPUID_PARTNO_M 0x0000FFF0 // Processor part number +#define NVIC_CPUID_REV_M 0x0000000F // Revision + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_INT_CTRL register. +// +//***************************************************************************** +#define NVIC_INT_CTRL_NMI_SET 0x80000000 // Pend a NMI +#define NVIC_INT_CTRL_PEND_SV 0x10000000 // Pend a PendSV +#define NVIC_INT_CTRL_UNPEND_SV 0x08000000 // Unpend a PendSV +#define NVIC_INT_CTRL_ISR_PRE 0x00800000 // Debug interrupt handling +#define NVIC_INT_CTRL_ISR_PEND 0x00400000 // Debug interrupt pending +#define NVIC_INT_CTRL_VEC_PEN_M 0x003FF000 // Highest pending exception +#define NVIC_INT_CTRL_RET_BASE 0x00000800 // Return to base +#define NVIC_INT_CTRL_VEC_ACT_M 0x000003FF // Current active exception +#define NVIC_INT_CTRL_VEC_PEN_S 12 +#define NVIC_INT_CTRL_VEC_ACT_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_VTABLE register. +// +//***************************************************************************** +#define NVIC_VTABLE_BASE 0x20000000 // Vector table base +#define NVIC_VTABLE_OFFSET_M 0x1FFFFF00 // Vector table offset +#define NVIC_VTABLE_OFFSET_S 8 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_APINT register. +// +//***************************************************************************** +#define NVIC_APINT_VECTKEY_M 0xFFFF0000 // Vector key mask +#define NVIC_APINT_VECTKEY 0x05FA0000 // Vector key +#define NVIC_APINT_ENDIANESS 0x00008000 // Data endianess +#define NVIC_APINT_PRIGROUP_M 0x00000700 // Priority group +#define NVIC_APINT_PRIGROUP_7_1 0x00000000 // Priority group 7.1 split +#define NVIC_APINT_PRIGROUP_6_2 0x00000100 // Priority group 6.2 split +#define NVIC_APINT_PRIGROUP_5_3 0x00000200 // Priority group 5.3 split +#define NVIC_APINT_PRIGROUP_4_4 0x00000300 // Priority group 4.4 split +#define NVIC_APINT_PRIGROUP_3_5 0x00000400 // Priority group 3.5 split +#define NVIC_APINT_PRIGROUP_2_6 0x00000500 // Priority group 2.6 split +#define NVIC_APINT_PRIGROUP_1_7 0x00000600 // Priority group 1.7 split +#define NVIC_APINT_PRIGROUP_0_8 0x00000700 // Priority group 0.8 split +#define NVIC_APINT_SYSRESETREQ 0x00000004 // System reset request +#define NVIC_APINT_VECT_CLR_ACT 0x00000002 // Clear active NMI/fault info +#define NVIC_APINT_VECT_RESET 0x00000001 // System reset + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_CTRL register. +// +//***************************************************************************** +#define NVIC_SYS_CTRL_SEVONPEND 0x00000010 // Wakeup on pend +#define NVIC_SYS_CTRL_SLEEPDEEP 0x00000004 // Deep sleep enable +#define NVIC_SYS_CTRL_SLEEPEXIT 0x00000002 // Sleep on ISR exit + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_CFG_CTRL register. +// +//***************************************************************************** +#define NVIC_CFG_CTRL_BFHFNMIGN 0x00000100 // Ignore bus fault in NMI/fault +#define NVIC_CFG_CTRL_DIV0 0x00000010 // Trap on divide by 0 +#define NVIC_CFG_CTRL_UNALIGNED 0x00000008 // Trap on unaligned access +#define NVIC_CFG_CTRL_DEEP_PEND 0x00000004 // Allow deep interrupt trigger +#define NVIC_CFG_CTRL_MAIN_PEND 0x00000002 // Allow main interrupt trigger +#define NVIC_CFG_CTRL_BASE_THR 0x00000001 // Thread state control + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI1 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI1_RES_M 0xFF000000 // Priority of reserved handler +#define NVIC_SYS_PRI1_USAGE_M 0x00FF0000 // Priority of usage fault handler +#define NVIC_SYS_PRI1_BUS_M 0x0000FF00 // Priority of bus fault handler +#define NVIC_SYS_PRI1_MEM_M 0x000000FF // Priority of mem manage handler +#define NVIC_SYS_PRI1_USAGE_S 16 +#define NVIC_SYS_PRI1_BUS_S 8 +#define NVIC_SYS_PRI1_MEM_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI2 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI2_SVC_M 0xFF000000 // Priority of SVCall handler +#define NVIC_SYS_PRI2_RES_M 0x00FFFFFF // Priority of reserved handlers +#define NVIC_SYS_PRI2_SVC_S 24 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI3 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI3_TICK_M 0xFF000000 // Priority of Sys Tick handler +#define NVIC_SYS_PRI3_PENDSV_M 0x00FF0000 // Priority of PendSV handler +#define NVIC_SYS_PRI3_RES_M 0x0000FF00 // Priority of reserved handler +#define NVIC_SYS_PRI3_DEBUG_M 0x000000FF // Priority of debug handler +#define NVIC_SYS_PRI3_TICK_S 24 +#define NVIC_SYS_PRI3_PENDSV_S 16 +#define NVIC_SYS_PRI3_DEBUG_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_HND_CTRL register. +// +//***************************************************************************** +#define NVIC_SYS_HND_CTRL_USAGE 0x00040000 // Usage fault enable +#define NVIC_SYS_HND_CTRL_BUS 0x00020000 // Bus fault enable +#define NVIC_SYS_HND_CTRL_MEM 0x00010000 // Mem manage fault enable +#define NVIC_SYS_HND_CTRL_SVC 0x00008000 // SVCall is pended +#define NVIC_SYS_HND_CTRL_BUSP 0x00004000 // Bus fault is pended +#define NVIC_SYS_HND_CTRL_TICK 0x00000800 // Sys tick is active +#define NVIC_SYS_HND_CTRL_PNDSV 0x00000400 // PendSV is active +#define NVIC_SYS_HND_CTRL_MON 0x00000100 // Monitor is active +#define NVIC_SYS_HND_CTRL_SVCA 0x00000080 // SVCall is active +#define NVIC_SYS_HND_CTRL_USGA 0x00000008 // Usage fault is active +#define NVIC_SYS_HND_CTRL_BUSA 0x00000002 // Bus fault is active +#define NVIC_SYS_HND_CTRL_MEMA 0x00000001 // Mem manage is active + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_FAULT_STAT register. +// +//***************************************************************************** +#define NVIC_FAULT_STAT_DIV0 0x02000000 // Divide by zero fault +#define NVIC_FAULT_STAT_UNALIGN 0x01000000 // Unaligned access fault +#define NVIC_FAULT_STAT_NOCP 0x00080000 // No coprocessor fault +#define NVIC_FAULT_STAT_INVPC 0x00040000 // Invalid PC fault +#define NVIC_FAULT_STAT_INVSTAT 0x00020000 // Invalid state fault +#define NVIC_FAULT_STAT_UNDEF 0x00010000 // Undefined instruction fault +#define NVIC_FAULT_STAT_BFARV 0x00008000 // BFAR is valid +#define NVIC_FAULT_STAT_BSTKE 0x00001000 // Stack bus fault +#define NVIC_FAULT_STAT_BUSTKE 0x00000800 // Unstack bus fault +#define NVIC_FAULT_STAT_IMPRE 0x00000400 // Imprecise data bus error +#define NVIC_FAULT_STAT_PRECISE 0x00000200 // Precise data bus error +#define NVIC_FAULT_STAT_IBUS 0x00000100 // Instruction bus fault +#define NVIC_FAULT_STAT_MMARV 0x00000080 // MMAR is valid +#define NVIC_FAULT_STAT_MSTKE 0x00000010 // Stack access violation +#define NVIC_FAULT_STAT_MUSTKE 0x00000008 // Unstack access violation +#define NVIC_FAULT_STAT_DERR 0x00000002 // Data access violation +#define NVIC_FAULT_STAT_IERR 0x00000001 // Instruction access violation + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_HFAULT_STAT register. +// +//***************************************************************************** +#define NVIC_HFAULT_STAT_DBG 0x80000000 // Debug event +#define NVIC_HFAULT_STAT_FORCED 0x40000000 // Cannot execute fault handler +#define NVIC_HFAULT_STAT_VECT 0x00000002 // Vector table read fault + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DEBUG_STAT register. +// +//***************************************************************************** +#define NVIC_DEBUG_STAT_EXTRNL 0x00000010 // EDBGRQ asserted +#define NVIC_DEBUG_STAT_VCATCH 0x00000008 // Vector catch +#define NVIC_DEBUG_STAT_DWTTRAP 0x00000004 // DWT match +#define NVIC_DEBUG_STAT_BKPT 0x00000002 // Breakpoint instruction +#define NVIC_DEBUG_STAT_HALTED 0x00000001 // Halt request + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MM_ADDR register. +// +//***************************************************************************** +#define NVIC_MM_ADDR_M 0xFFFFFFFF // Data fault address +#define NVIC_MM_ADDR_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_FAULT_ADDR register. +// +//***************************************************************************** +#define NVIC_FAULT_ADDR_M 0xFFFFFFFF // Data bus fault address +#define NVIC_FAULT_ADDR_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EXC_STACK register. +// +//***************************************************************************** +#define NVIC_EXC_STACK_DEEP 0x00000001 // Exception stack + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EXC_NUM register. +// +//***************************************************************************** +#define NVIC_EXC_NUM_M 0x000003FF // Exception number +#define NVIC_EXC_NUM_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_COPRO register. +// +//***************************************************************************** +#define NVIC_COPRO_15_M 0xC0000000 // Coprocessor 15 access mask +#define NVIC_COPRO_15_DENIED 0x00000000 // Coprocessor 15 access denied +#define NVIC_COPRO_15_PRIV 0x40000000 // Coprocessor 15 privileged addess +#define NVIC_COPRO_15_FULL 0xC0000000 // Coprocessor 15 full access +#define NVIC_COPRO_14_M 0x30000000 // Coprocessor 14 access mask +#define NVIC_COPRO_14_DENIED 0x00000000 // Coprocessor 14 access denied +#define NVIC_COPRO_14_PRIV 0x10000000 // Coprocessor 14 privileged addess +#define NVIC_COPRO_14_FULL 0x30000000 // Coprocessor 14 full access +#define NVIC_COPRO_13_M 0x0C000000 // Coprocessor 13 access mask +#define NVIC_COPRO_13_DENIED 0x00000000 // Coprocessor 13 access denied +#define NVIC_COPRO_13_PRIV 0x04000000 // Coprocessor 13 privileged addess +#define NVIC_COPRO_13_FULL 0x0C000000 // Coprocessor 13 full access +#define NVIC_COPRO_12_M 0x03000000 // Coprocessor 12 access mask +#define NVIC_COPRO_12_DENIED 0x00000000 // Coprocessor 12 access denied +#define NVIC_COPRO_12_PRIV 0x01000000 // Coprocessor 12 privileged addess +#define NVIC_COPRO_12_FULL 0x03000000 // Coprocessor 12 full access +#define NVIC_COPRO_11_M 0x00C00000 // Coprocessor 11 access mask +#define NVIC_COPRO_11_DENIED 0x00000000 // Coprocessor 11 access denied +#define NVIC_COPRO_11_PRIV 0x00400000 // Coprocessor 11 privileged addess +#define NVIC_COPRO_11_FULL 0x00C00000 // Coprocessor 11 full access +#define NVIC_COPRO_10_M 0x00300000 // Coprocessor 10 access mask +#define NVIC_COPRO_10_DENIED 0x00000000 // Coprocessor 10 access denied +#define NVIC_COPRO_10_PRIV 0x00100000 // Coprocessor 10 privileged addess +#define NVIC_COPRO_10_FULL 0x00300000 // Coprocessor 10 full access +#define NVIC_COPRO_9_M 0x000C0000 // Coprocessor 9 access mask +#define NVIC_COPRO_9_DENIED 0x00000000 // Coprocessor 9 access denied +#define NVIC_COPRO_9_PRIV 0x00040000 // Coprocessor 9 privileged addess +#define NVIC_COPRO_9_FULL 0x000C0000 // Coprocessor 9 full access +#define NVIC_COPRO_8_M 0x00030000 // Coprocessor 8 access mask +#define NVIC_COPRO_8_DENIED 0x00000000 // Coprocessor 8 access denied +#define NVIC_COPRO_8_PRIV 0x00010000 // Coprocessor 8 privileged addess +#define NVIC_COPRO_8_FULL 0x00030000 // Coprocessor 8 full access +#define NVIC_COPRO_7_M 0x0000C000 // Coprocessor 7 access mask +#define NVIC_COPRO_7_DENIED 0x00000000 // Coprocessor 7 access denied +#define NVIC_COPRO_7_PRIV 0x00004000 // Coprocessor 7 privileged addess +#define NVIC_COPRO_7_FULL 0x0000C000 // Coprocessor 7 full access +#define NVIC_COPRO_6_M 0x00003000 // Coprocessor 6 access mask +#define NVIC_COPRO_6_DENIED 0x00000000 // Coprocessor 6 access denied +#define NVIC_COPRO_6_PRIV 0x00001000 // Coprocessor 6 privileged addess +#define NVIC_COPRO_6_FULL 0x00003000 // Coprocessor 6 full access +#define NVIC_COPRO_5_M 0x00000C00 // Coprocessor 5 access mask +#define NVIC_COPRO_5_DENIED 0x00000000 // Coprocessor 5 access denied +#define NVIC_COPRO_5_PRIV 0x00000400 // Coprocessor 5 privileged addess +#define NVIC_COPRO_5_FULL 0x00000C00 // Coprocessor 5 full access +#define NVIC_COPRO_4_M 0x00000300 // Coprocessor 4 access mask +#define NVIC_COPRO_4_DENIED 0x00000000 // Coprocessor 4 access denied +#define NVIC_COPRO_4_PRIV 0x00000100 // Coprocessor 4 privileged addess +#define NVIC_COPRO_4_FULL 0x00000300 // Coprocessor 4 full access +#define NVIC_COPRO_3_M 0x000000C0 // Coprocessor 3 access mask +#define NVIC_COPRO_3_DENIED 0x00000000 // Coprocessor 3 access denied +#define NVIC_COPRO_3_PRIV 0x00000040 // Coprocessor 3 privileged addess +#define NVIC_COPRO_3_FULL 0x000000C0 // Coprocessor 3 full access +#define NVIC_COPRO_2_M 0x00000030 // Coprocessor 2 access mask +#define NVIC_COPRO_2_DENIED 0x00000000 // Coprocessor 2 access denied +#define NVIC_COPRO_2_PRIV 0x00000010 // Coprocessor 2 privileged addess +#define NVIC_COPRO_2_FULL 0x00000030 // Coprocessor 2 full access +#define NVIC_COPRO_1_M 0x0000000C // Coprocessor 1 access mask +#define NVIC_COPRO_1_DENIED 0x00000000 // Coprocessor 1 access denied +#define NVIC_COPRO_1_PRIV 0x00000004 // Coprocessor 1 privileged addess +#define NVIC_COPRO_1_FULL 0x0000000C // Coprocessor 1 full access +#define NVIC_COPRO_0_M 0x00000003 // Coprocessor 0 access mask +#define NVIC_COPRO_0_DENIED 0x00000000 // Coprocessor 0 access denied +#define NVIC_COPRO_0_PRIV 0x00000001 // Coprocessor 0 privileged addess +#define NVIC_COPRO_0_FULL 0x00000003 // Coprocessor 0 full access + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_TYPE register. +// +//***************************************************************************** +#define NVIC_MPU_TYPE_IREGION_M 0x00FF0000 // Number of I regions +#define NVIC_MPU_TYPE_DREGION_M 0x0000FF00 // Number of D regions +#define NVIC_MPU_TYPE_SEPARATE 0x00000001 // Separate or unified MPU +#define NVIC_MPU_TYPE_IREGION_S 16 +#define NVIC_MPU_TYPE_DREGION_S 8 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_CTRL register. +// +//***************************************************************************** +#define NVIC_MPU_CTRL_HFNMIENA 0x00000002 // MPU enabled during faults +#define NVIC_MPU_CTRL_ENABLE 0x00000001 // MPU enable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_NUMBER register. +// +//***************************************************************************** +#define NVIC_MPU_NUMBER_M 0x000000FF // MPU region to access +#define NVIC_MPU_NUMBER_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_BASE register. +// +//***************************************************************************** +#define NVIC_MPU_BASE_ADDR_M 0xFFFFFF00 // Base address +#define NVIC_MPU_BASE_VALID 0x00000010 // Region number valid +#define NVIC_MPU_BASE_REGION_M 0x0000000F // Region number +#define NVIC_MPU_BASE_ADDR_S 8 +#define NVIC_MPU_BASE_REGION_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_ATTR register. +// +//***************************************************************************** +#define NVIC_MPU_ATTR_ATTRS 0xFFFF0000 // Attributes +#define NVIC_MPU_ATTR_SRD 0x0000FF00 // Sub-region disable +#define NVIC_MPU_ATTR_SZENABLE 0x000000FF // Region size + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_CTRL register. +// +//***************************************************************************** +#define NVIC_DBG_CTRL_DBGKEY_M 0xFFFF0000 // Debug key mask +#define NVIC_DBG_CTRL_DBGKEY 0xA05F0000 // Debug key +#define NVIC_DBG_CTRL_MON_PEND 0x00008000 // Pend the monitor +#define NVIC_DBG_CTRL_MON_REQ 0x00004000 // Monitor request +#define NVIC_DBG_CTRL_MON_EN 0x00002000 // Debug monitor enable +#define NVIC_DBG_CTRL_MONSTEP 0x00001000 // Monitor step the core +#define NVIC_DBG_CTRL_S_SLEEP 0x00000400 // Core is sleeping +#define NVIC_DBG_CTRL_S_HALT 0x00000200 // Core status on halt +#define NVIC_DBG_CTRL_S_REGRDY 0x00000100 // Register read/write available +#define NVIC_DBG_CTRL_S_LOCKUP 0x00000080 // Core is locked up +#define NVIC_DBG_CTRL_C_RESET 0x00000010 // Reset the core +#define NVIC_DBG_CTRL_C_MASKINT 0x00000008 // Mask interrupts when stepping +#define NVIC_DBG_CTRL_C_STEP 0x00000004 // Step the core +#define NVIC_DBG_CTRL_C_HALT 0x00000002 // Halt the core +#define NVIC_DBG_CTRL_C_DEBUGEN 0x00000001 // Enable debug + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_XFER register. +// +//***************************************************************************** +#define NVIC_DBG_XFER_REG_WNR 0x00010000 // Write or not read +#define NVIC_DBG_XFER_REG_SEL_M 0x0000001F // Register +#define NVIC_DBG_XFER_REG_R0 0x00000000 // Register R0 +#define NVIC_DBG_XFER_REG_R1 0x00000001 // Register R1 +#define NVIC_DBG_XFER_REG_R2 0x00000002 // Register R2 +#define NVIC_DBG_XFER_REG_R3 0x00000003 // Register R3 +#define NVIC_DBG_XFER_REG_R4 0x00000004 // Register R4 +#define NVIC_DBG_XFER_REG_R5 0x00000005 // Register R5 +#define NVIC_DBG_XFER_REG_R6 0x00000006 // Register R6 +#define NVIC_DBG_XFER_REG_R7 0x00000007 // Register R7 +#define NVIC_DBG_XFER_REG_R8 0x00000008 // Register R8 +#define NVIC_DBG_XFER_REG_R9 0x00000009 // Register R9 +#define NVIC_DBG_XFER_REG_R10 0x0000000A // Register R10 +#define NVIC_DBG_XFER_REG_R11 0x0000000B // Register R11 +#define NVIC_DBG_XFER_REG_R12 0x0000000C // Register R12 +#define NVIC_DBG_XFER_REG_R13 0x0000000D // Register R13 +#define NVIC_DBG_XFER_REG_R14 0x0000000E // Register R14 +#define NVIC_DBG_XFER_REG_R15 0x0000000F // Register R15 +#define NVIC_DBG_XFER_REG_FLAGS 0x00000010 // xPSR/Flags register +#define NVIC_DBG_XFER_REG_MSP 0x00000011 // Main SP +#define NVIC_DBG_XFER_REG_PSP 0x00000012 // Process SP +#define NVIC_DBG_XFER_REG_DSP 0x00000013 // Deep SP +#define NVIC_DBG_XFER_REG_CFBP 0x00000014 // Control/Fault/BasePri/PriMask + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_DATA register. +// +//***************************************************************************** +#define NVIC_DBG_DATA_M 0xFFFFFFFF // Data temporary cache +#define NVIC_DBG_DATA_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_INT register. +// +//***************************************************************************** +#define NVIC_DBG_INT_HARDERR 0x00000400 // Debug trap on hard fault +#define NVIC_DBG_INT_INTERR 0x00000200 // Debug trap on interrupt errors +#define NVIC_DBG_INT_BUSERR 0x00000100 // Debug trap on bus error +#define NVIC_DBG_INT_STATERR 0x00000080 // Debug trap on usage fault state +#define NVIC_DBG_INT_CHKERR 0x00000040 // Debug trap on usage fault check +#define NVIC_DBG_INT_NOCPERR 0x00000020 // Debug trap on coprocessor error +#define NVIC_DBG_INT_MMERR 0x00000010 // Debug trap on mem manage fault +#define NVIC_DBG_INT_RESET 0x00000008 // Core reset status +#define NVIC_DBG_INT_RSTPENDCLR 0x00000004 // Clear pending core reset +#define NVIC_DBG_INT_RSTPENDING 0x00000002 // Core reset is pending +#define NVIC_DBG_INT_RSTVCATCH 0x00000001 // Reset vector catch + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SW_TRIG register. +// +//***************************************************************************** +#define NVIC_SW_TRIG_INTID_M 0x000003FF // Interrupt to trigger +#define NVIC_SW_TRIG_INTID_S 0 + +#endif // __HW_NVIC_H__ diff --git a/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_pwm.h b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_pwm.h new file mode 100644 index 000000000..53609c6f9 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_pwm.h @@ -0,0 +1,260 @@ +//***************************************************************************** +// +// hw_pwm.h - Defines and Macros for Pulse Width Modulation (PWM) ports +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_PWM_H__ +#define __HW_PWM_H__ + +//***************************************************************************** +// +// PWM Module Register Offsets. +// +//***************************************************************************** +#define PWM_O_CTL 0x00000000 // PWM Master Control register +#define PWM_O_SYNC 0x00000004 // PWM Time Base Sync register +#define PWM_O_ENABLE 0x00000008 // PWM Output Enable register +#define PWM_O_INVERT 0x0000000C // PWM Output Inversion register +#define PWM_O_FAULT 0x00000010 // PWM Output Fault register +#define PWM_O_INTEN 0x00000014 // PWM Interrupt Enable register +#define PWM_O_RIS 0x00000018 // PWM Interrupt Raw Status reg. +#define PWM_O_ISC 0x0000001C // PWM Interrupt Status register +#define PWM_O_STATUS 0x00000020 // PWM Status register + +//***************************************************************************** +// +// The following define the bit fields in the PWM Master Control register. +// +//***************************************************************************** +#define PWM_CTL_GLOBAL_SYNC2 0x00000004 // Global sync generator 2 +#define PWM_CTL_GLOBAL_SYNC1 0x00000002 // Global sync generator 1 +#define PWM_CTL_GLOBAL_SYNC0 0x00000001 // Global sync generator 0 + +//***************************************************************************** +// +// The following define the bit fields in the PWM Time Base Sync register. +// +//***************************************************************************** +#define PWM_SYNC_SYNC2 0x00000004 // Reset generator 2 counter +#define PWM_SYNC_SYNC1 0x00000002 // Reset generator 1 counter +#define PWM_SYNC_SYNC0 0x00000001 // Reset generator 0 counter + +//***************************************************************************** +// +// The following define the bit fields in the PWM Output Enable register. +// +//***************************************************************************** +#define PWM_ENABLE_PWM5EN 0x00000020 // PWM5 pin enable +#define PWM_ENABLE_PWM4EN 0x00000010 // PWM4 pin enable +#define PWM_ENABLE_PWM3EN 0x00000008 // PWM3 pin enable +#define PWM_ENABLE_PWM2EN 0x00000004 // PWM2 pin enable +#define PWM_ENABLE_PWM1EN 0x00000002 // PWM1 pin enable +#define PWM_ENABLE_PWM0EN 0x00000001 // PWM0 pin enable + +//***************************************************************************** +// +// The following define the bit fields in the PWM Inversion register. +// +//***************************************************************************** +#define PWM_INVERT_PWM5INV 0x00000020 // PWM5 pin invert +#define PWM_INVERT_PWM4INV 0x00000010 // PWM4 pin invert +#define PWM_INVERT_PWM3INV 0x00000008 // PWM3 pin invert +#define PWM_INVERT_PWM2INV 0x00000004 // PWM2 pin invert +#define PWM_INVERT_PWM1INV 0x00000002 // PWM1 pin invert +#define PWM_INVERT_PWM0INV 0x00000001 // PWM0 pin invert + +//***************************************************************************** +// +// The following define the bit fields in the PWM Fault register. +// +//***************************************************************************** +#define PWM_FAULT_FAULT5 0x00000020 // PWM5 pin fault +#define PWM_FAULT_FAULT4 0x00000010 // PWM5 pin fault +#define PWM_FAULT_FAULT3 0x00000008 // PWM5 pin fault +#define PWM_FAULT_FAULT2 0x00000004 // PWM5 pin fault +#define PWM_FAULT_FAULT1 0x00000002 // PWM5 pin fault +#define PWM_FAULT_FAULT0 0x00000001 // PWM5 pin fault + +//***************************************************************************** +// +// PWM Interrupt Register bit definitions. +// +//***************************************************************************** +#define PWM_INT_INTFAULT 0x00010000 // Fault interrupt pending + +//***************************************************************************** +// +// The following define the bit fields in the PWM Status register. +// +//***************************************************************************** +#define PWM_STATUS_FAULT 0x00000001 // Fault status + +//***************************************************************************** +// +// PWM Generator standard offsets. +// +//***************************************************************************** +#define PWM_GEN_0_OFFSET 0x00000040 // PWM0 base +#define PWM_GEN_1_OFFSET 0x00000080 // PWM1 base +#define PWM_GEN_2_OFFSET 0x000000C0 // PWM2 base + +#define PWM_O_X_CTL 0x00000000 // Gen Control Reg +#define PWM_O_X_INTEN 0x00000004 // Gen Int/Trig Enable Reg +#define PWM_O_X_RIS 0x00000008 // Gen Raw Int Status Reg +#define PWM_O_X_ISC 0x0000000C // Gen Int Status Reg +#define PWM_O_X_LOAD 0x00000010 // Gen Load Reg +#define PWM_O_X_COUNT 0x00000014 // Gen Counter Reg +#define PWM_O_X_CMPA 0x00000018 // Gen Compare A Reg +#define PWM_O_X_CMPB 0x0000001C // Gen Compare B Reg +#define PWM_O_X_GENA 0x00000020 // Gen Generator A Ctrl Reg +#define PWM_O_X_GENB 0x00000024 // Gen Generator B Ctrl Reg +#define PWM_O_X_DBCTL 0x00000028 // Gen Dead Band Ctrl Reg +#define PWM_O_X_DBRISE 0x0000002C // Gen DB Rising Edge Delay Reg +#define PWM_O_X_DBFALL 0x00000030 // Gen DB Falling Edge Delay Reg + +//***************************************************************************** +// +// PWM_X Control Register bit definitions. +// +//***************************************************************************** +#define PWM_X_CTL_ENABLE 0x00000001 // Master enable for gen block +#define PWM_X_CTL_MODE 0x00000002 // Counter mode, down or up/down +#define PWM_X_CTL_DEBUG 0x00000004 // Debug mode +#define PWM_X_CTL_LOADUPD 0x00000008 // Update mode for the load reg +#define PWM_X_CTL_CMPAUPD 0x00000010 // Update mode for comp A reg +#define PWM_X_CTL_CMPBUPD 0x00000020 // Update mode for comp B reg + +//***************************************************************************** +// +// PWM_X Interrupt/Trigger Enable Register bit definitions. +// +//***************************************************************************** +#define PWM_X_INTEN_INTCNTZERO 0x00000001 // Int if COUNT = 0 +#define PWM_X_INTEN_INTCNTLOAD 0x00000002 // Int if COUNT = LOAD +#define PWM_X_INTEN_INTCMPAU 0x00000004 // Int if COUNT = CMPA U +#define PWM_X_INTEN_INTCMPAD 0x00000008 // Int if COUNT = CMPA D +#define PWM_X_INTEN_INTCMPBU 0x00000010 // Int if COUNT = CMPA U +#define PWM_X_INTEN_INTCMPBD 0x00000020 // Int if COUNT = CMPA D +#define PWM_X_INTEN_TRCNTZERO 0x00000100 // Trig if COUNT = 0 +#define PWM_X_INTEN_TRCNTLOAD 0x00000200 // Trig if COUNT = LOAD +#define PWM_X_INTEN_TRCMPAU 0x00000400 // Trig if COUNT = CMPA U +#define PWM_X_INTEN_TRCMPAD 0x00000800 // Trig if COUNT = CMPA D +#define PWM_X_INTEN_TRCMPBU 0x00001000 // Trig if COUNT = CMPA U +#define PWM_X_INTEN_TRCMPBD 0x00002000 // Trig if COUNT = CMPA D + +//***************************************************************************** +// +// PWM_X Raw Interrupt Status Register bit definitions. +// +//***************************************************************************** +#define PWM_X_RIS_INTCNTZERO 0x00000001 // PWM_X_COUNT = 0 int +#define PWM_X_RIS_INTCNTLOAD 0x00000002 // PWM_X_COUNT = PWM_X_LOAD int +#define PWM_X_RIS_INTCMPAU 0x00000004 // PWM_X_COUNT = PWM_X_CMPA U int +#define PWM_X_RIS_INTCMPAD 0x00000008 // PWM_X_COUNT = PWM_X_CMPA D int +#define PWM_X_RIS_INTCMPBU 0x00000010 // PWM_X_COUNT = PWM_X_CMPB U int +#define PWM_X_RIS_INTCMPBD 0x00000020 // PWM_X_COUNT = PWM_X_CMPB D int + +//***************************************************************************** +// +// PWM_X Interrupt Status Register bit definitions. +// +//***************************************************************************** +#define PWM_X_INT_INTCNTZERO 0x00000001 // PWM_X_COUNT = 0 received +#define PWM_X_INT_INTCNTLOAD 0x00000002 // PWM_X_COUNT = PWM_X_LOAD rcvd +#define PWM_X_INT_INTCMPAU 0x00000004 // PWM_X_COUNT = PWM_X_CMPA U rcvd +#define PWM_X_INT_INTCMPAD 0x00000008 // PWM_X_COUNT = PWM_X_CMPA D rcvd +#define PWM_X_INT_INTCMPBU 0x00000010 // PWM_X_COUNT = PWM_X_CMPB U rcvd +#define PWM_X_INT_INTCMPBD 0x00000020 // PWM_X_COUNT = PWM_X_CMPB D rcvd + +//***************************************************************************** +// +// PWM_X Generator A/B Control Register bit definitions. +// +//***************************************************************************** +#define PWM_X_GEN_Y_ACTZERO 0x00000003 // Act PWM_X_COUNT = 0 +#define PWM_X_GEN_Y_ACTLOAD 0x0000000C // Act PWM_X_COUNT = PWM_X_LOAD +#define PWM_X_GEN_Y_ACTCMPAU 0x00000030 // Act PWM_X_COUNT = PWM_X_CMPA U +#define PWM_X_GEN_Y_ACTCMPAD 0x000000C0 // Act PWM_X_COUNT = PWM_X_CMPA D +#define PWM_X_GEN_Y_ACTCMPBU 0x00000300 // Act PWM_X_COUNT = PWM_X_CMPB U +#define PWM_X_GEN_Y_ACTCMPBD 0x00000C00 // Act PWM_X_COUNT = PWM_X_CMPB D + +//***************************************************************************** +// +// PWM_X Generator A/B Control Register action definitions. +// +//***************************************************************************** +#define PWM_GEN_ACT_NONE 0x0 // Do nothing +#define PWM_GEN_ACT_INV 0x1 // Invert the output signal +#define PWM_GEN_ACT_ZERO 0x2 // Set the output signal to zero +#define PWM_GEN_ACT_ONE 0x3 // Set the output signal to one +#define PWM_GEN_ACT_ZERO_SHIFT 0 // Shift amount for the zero action +#define PWM_GEN_ACT_LOAD_SHIFT 2 // Shift amount for the load action +#define PWM_GEN_ACT_A_UP_SHIFT 4 // Shift amount for the A up action +#define PWM_GEN_ACT_A_DN_SHIFT 6 // Shift amount for the A dn action +#define PWM_GEN_ACT_B_UP_SHIFT 8 // Shift amount for the B up action +#define PWM_GEN_ACT_B_DN_SHIFT 10 // Shift amount for the B dn action + +//***************************************************************************** +// +// PWM_X Dead Band Control Register bit definitions. +// +//***************************************************************************** +#define PWM_DBCTL_ENABLE 0x00000001 // Enable dead band insertion + +//***************************************************************************** +// +// PWM Register reset values. +// +//***************************************************************************** +#define PWM_RV_CTL 0x00000000 // Master control of the PWM module +#define PWM_RV_SYNC 0x00000000 // Counter synch for PWM generators +#define PWM_RV_ENABLE 0x00000000 // Master enable for the PWM + // output pins +#define PWM_RV_INVERT 0x00000000 // Inversion control for + // PWM output pins +#define PWM_RV_FAULT 0x00000000 // Fault handling for the PWM + // output pins +#define PWM_RV_INTEN 0x00000000 // Interrupt enable +#define PWM_RV_RIS 0x00000000 // Raw interrupt status +#define PWM_RV_ISC 0x00000000 // Interrupt status and clearing +#define PWM_RV_STATUS 0x00000000 // Status +#define PWM_RV_X_CTL 0x00000000 // Master control of the PWM + // generator block +#define PWM_RV_X_INTEN 0x00000000 // Interrupt and trigger enable +#define PWM_RV_X_RIS 0x00000000 // Raw interrupt status +#define PWM_RV_X_ISC 0x00000000 // Interrupt status and clearing +#define PWM_RV_X_LOAD 0x00000000 // The load value for the counter +#define PWM_RV_X_COUNT 0x00000000 // The current counter value +#define PWM_RV_X_CMPA 0x00000000 // The comparator A value +#define PWM_RV_X_CMPB 0x00000000 // The comparator B value +#define PWM_RV_X_GENA 0x00000000 // Controls PWM generator A +#define PWM_RV_X_GENB 0x00000000 // Controls PWM generator B +#define PWM_RV_X_DBCTL 0x00000000 // Control the dead band generator +#define PWM_RV_X_DBRISE 0x00000000 // The dead band rising edge delay + // count +#define PWM_RV_X_DBFALL 0x00000000 // The dead band falling edge delay + // count + +#endif // __HW_PWM_H__ diff --git a/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_qei.h b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_qei.h new file mode 100644 index 000000000..6d988ba95 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_qei.h @@ -0,0 +1,176 @@ +//***************************************************************************** +// +// hw_qei.h - Macros used when accessing the QEI hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_QEI_H__ +#define __HW_QEI_H__ + +//***************************************************************************** +// +// The following define the offsets of the QEI registers. +// +//***************************************************************************** +#define QEI_O_CTL 0x00000000 // Configuration and control reg. +#define QEI_O_STAT 0x00000004 // Status register +#define QEI_O_POS 0x00000008 // Current position register +#define QEI_O_MAXPOS 0x0000000C // Maximum position register +#define QEI_O_LOAD 0x00000010 // Velocity timer load register +#define QEI_O_TIME 0x00000014 // Velocity timer register +#define QEI_O_COUNT 0x00000018 // Velocity pulse count register +#define QEI_O_SPEED 0x0000001C // Velocity speed register +#define QEI_O_INTEN 0x00000020 // Interrupt enable register +#define QEI_O_RIS 0x00000024 // Raw interrupt status register +#define QEI_O_ISC 0x00000028 // Interrupt status register + +//***************************************************************************** +// +// The following define the bit fields in the QEI_CTL register. +// +//***************************************************************************** +#define QEI_CTL_STALLEN 0x00001000 // Stall enable +#define QEI_CTL_INVI 0x00000800 // Invert Index input +#define QEI_CTL_INVB 0x00000400 // Invert PhB input +#define QEI_CTL_INVA 0x00000200 // Invert PhA input +#define QEI_CTL_VELDIV_M 0x000001C0 // Velocity predivider mask +#define QEI_CTL_VELDIV_1 0x00000000 // Predivide by 1 +#define QEI_CTL_VELDIV_2 0x00000040 // Predivide by 2 +#define QEI_CTL_VELDIV_4 0x00000080 // Predivide by 4 +#define QEI_CTL_VELDIV_8 0x000000C0 // Predivide by 8 +#define QEI_CTL_VELDIV_16 0x00000100 // Predivide by 16 +#define QEI_CTL_VELDIV_32 0x00000140 // Predivide by 32 +#define QEI_CTL_VELDIV_64 0x00000180 // Predivide by 64 +#define QEI_CTL_VELDIV_128 0x000001C0 // Predivide by 128 +#define QEI_CTL_VELEN 0x00000020 // Velocity enable +#define QEI_CTL_RESMODE 0x00000010 // Position counter reset mode +#define QEI_CTL_CAPMODE 0x00000008 // Edge capture mode +#define QEI_CTL_SIGMODE 0x00000004 // Encoder signaling mode +#define QEI_CTL_SWAP 0x00000002 // Swap input signals +#define QEI_CTL_ENABLE 0x00000001 // QEI enable + +//***************************************************************************** +// +// The following define the bit fields in the QEI_STAT register. +// +//***************************************************************************** +#define QEI_STAT_DIRECTION 0x00000002 // Direction of rotation +#define QEI_STAT_ERROR 0x00000001 // Signalling error detected + +//***************************************************************************** +// +// The following define the bit fields in the QEI_POS register. +// +//***************************************************************************** +#define QEI_POS_M 0xFFFFFFFF // Current encoder position +#define QEI_POS_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_MAXPOS register. +// +//***************************************************************************** +#define QEI_MAXPOS_M 0xFFFFFFFF // Maximum encoder position +#define QEI_MAXPOS_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_LOAD register. +// +//***************************************************************************** +#define QEI_LOAD_M 0xFFFFFFFF // Velocity timer load value +#define QEI_LOAD_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_TIME register. +// +//***************************************************************************** +#define QEI_TIME_M 0xFFFFFFFF // Velocity timer current value +#define QEI_TIME_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_COUNT register. +// +//***************************************************************************** +#define QEI_COUNT_M 0xFFFFFFFF // Encoder running pulse count +#define QEI_COUNT_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_SPEED register. +// +//***************************************************************************** +#define QEI_SPEED_M 0xFFFFFFFF // Encoder pulse count +#define QEI_SPEED_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_INTEN register. +// +//***************************************************************************** +#define QEI_INTEN_ERROR 0x00000008 // Phase error detected +#define QEI_INTEN_DIR 0x00000004 // Direction change +#define QEI_INTEN_TIMER 0x00000002 // Velocity timer expired +#define QEI_INTEN_INDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// The following define the bit fields in the QEI_RIS register. +// +//***************************************************************************** +#define QEI_RIS_ERROR 0x00000008 // Phase error detected +#define QEI_RIS_DIR 0x00000004 // Direction change +#define QEI_RIS_TIMER 0x00000002 // Velocity timer expired +#define QEI_RIS_INDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// The following define the bit fields in the QEI_ISC register. +// +//***************************************************************************** +#define QEI_INT_ERROR 0x00000008 // Phase error detected +#define QEI_INT_DIR 0x00000004 // Direction change +#define QEI_INT_TIMER 0x00000002 // Velocity timer expired +#define QEI_INT_INDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// The following define the reset values for the QEI registers. +// +//***************************************************************************** +#define QEI_RV_CTL 0x00000000 // Configuration and control reg. +#define QEI_RV_STAT 0x00000000 // Status register +#define QEI_RV_POS 0x00000000 // Current position register +#define QEI_RV_MAXPOS 0x00000000 // Maximum position register +#define QEI_RV_LOAD 0x00000000 // Velocity timer load register +#define QEI_RV_TIME 0x00000000 // Velocity timer register +#define QEI_RV_COUNT 0x00000000 // Velocity pulse count register +#define QEI_RV_SPEED 0x00000000 // Velocity speed register +#define QEI_RV_INTEN 0x00000000 // Interrupt enable register +#define QEI_RV_RIS 0x00000000 // Raw interrupt status register +#define QEI_RV_ISC 0x00000000 // Interrupt status register + +#endif // __HW_QEI_H__ diff --git a/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_ssi.h b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_ssi.h new file mode 100644 index 000000000..2af758095 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_ssi.h @@ -0,0 +1,120 @@ +//***************************************************************************** +// +// hw_ssi.h - Macros used when accessing the SSI hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_SSI_H__ +#define __HW_SSI_H__ + +//***************************************************************************** +// +// The following define the offsets of the SSI registers. +// +//***************************************************************************** +#define SSI_O_CR0 0x00000000 // Control register 0 +#define SSI_O_CR1 0x00000004 // Control register 1 +#define SSI_O_DR 0x00000008 // Data register +#define SSI_O_SR 0x0000000C // Status register +#define SSI_O_CPSR 0x00000010 // Clock prescale register +#define SSI_O_IM 0x00000014 // Int mask set and clear register +#define SSI_O_RIS 0x00000018 // Raw interrupt register +#define SSI_O_MIS 0x0000001C // Masked interrupt register +#define SSI_O_ICR 0x00000020 // Interrupt clear register + +//***************************************************************************** +// +// The following define the bit fields in the SSI Control register 0. +// +//***************************************************************************** +#define SSI_CR0_SCR 0x0000FF00 // Serial clock rate +#define SSI_CR0_SPH 0x00000080 // SSPCLKOUT phase +#define SSI_CR0_SPO 0x00000040 // SSPCLKOUT polarity +#define SSI_CR0_FRF_MASK 0x00000030 // Frame format mask +#define SSI_CR0_FRF_MOTO 0x00000000 // Motorola SPI frame format +#define SSI_CR0_FRF_TI 0x00000010 // TI sync serial frame format +#define SSI_CR0_FRF_NMW 0x00000020 // National Microwire frame format +#define SSI_CR0_DSS 0x0000000F // Data size select +#define SSI_CR0_DSS_4 0x00000003 // 4 bit data +#define SSI_CR0_DSS_5 0x00000004 // 5 bit data +#define SSI_CR0_DSS_6 0x00000005 // 6 bit data +#define SSI_CR0_DSS_7 0x00000006 // 7 bit data +#define SSI_CR0_DSS_8 0x00000007 // 8 bit data +#define SSI_CR0_DSS_9 0x00000008 // 9 bit data +#define SSI_CR0_DSS_10 0x00000009 // 10 bit data +#define SSI_CR0_DSS_11 0x0000000A // 11 bit data +#define SSI_CR0_DSS_12 0x0000000B // 12 bit data +#define SSI_CR0_DSS_13 0x0000000C // 13 bit data +#define SSI_CR0_DSS_14 0x0000000D // 14 bit data +#define SSI_CR0_DSS_15 0x0000000E // 15 bit data +#define SSI_CR0_DSS_16 0x0000000F // 16 bit data + +//***************************************************************************** +// +// The following define the bit fields in the SSI Control register 1. +// +//***************************************************************************** +#define SSI_CR1_SOD 0x00000008 // Slave mode output disable +#define SSI_CR1_MS 0x00000004 // Master or slave mode select +#define SSI_CR1_SSE 0x00000002 // Sync serial port enable +#define SSI_CR1_LBM 0x00000001 // Loopback mode + +//***************************************************************************** +// +// The following define the bit fields in the SSI Status register. +// +//***************************************************************************** +#define SSI_SR_BSY 0x00000010 // SSI busy +#define SSI_SR_RFF 0x00000008 // RX FIFO full +#define SSI_SR_RNE 0x00000004 // RX FIFO not empty +#define SSI_SR_TNF 0x00000002 // TX FIFO not full +#define SSI_SR_TFE 0x00000001 // TX FIFO empty + +//***************************************************************************** +// +// The following define the bit fields in the SSI clock prescale register. +// +//***************************************************************************** +#define SSI_CPSR_CPSDVSR_MASK 0x000000FF // Clock prescale + +//***************************************************************************** +// +// The following define information concerning the SSI Data register. +// +//***************************************************************************** +#define TX_FIFO_SIZE (8) // Number of entries in the TX FIFO +#define RX_FIFO_SIZE (8) // Number of entries in the RX FIFO + +//***************************************************************************** +// +// The following define the bit fields in the interrupt mask set and clear, +// raw interrupt, masked interrupt, and interrupt clear registers. +// +//***************************************************************************** +#define SSI_INT_TXFF 0x00000008 // TX FIFO interrupt +#define SSI_INT_RXFF 0x00000004 // RX FIFO interrupt +#define SSI_INT_RXTO 0x00000002 // RX timeout interrupt +#define SSI_INT_RXOR 0x00000001 // RX overrun interrupt + +#endif // __HW_SSI_H__ diff --git a/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_sysctl.h b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_sysctl.h new file mode 100644 index 000000000..6a2d6312b --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_sysctl.h @@ -0,0 +1,659 @@ +//***************************************************************************** +// +// hw_sysctl.h - Macros used when accessing the system control hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_SYSCTL_H__ +#define __HW_SYSCTL_H__ + +//***************************************************************************** +// +// The following define the addresses of the system control registers. +// +//***************************************************************************** +#define SYSCTL_DID0 0x400fe000 // Device identification register 0 +#define SYSCTL_DID1 0x400fe004 // Device identification register 1 +#define SYSCTL_DC0 0x400fe008 // Device capabilities register 0 +#define SYSCTL_DC1 0x400fe010 // Device capabilities register 1 +#define SYSCTL_DC2 0x400fe014 // Device capabilities register 2 +#define SYSCTL_DC3 0x400fe018 // Device capabilities register 3 +#define SYSCTL_DC4 0x400fe01C // Device capabilities register 4 +#define SYSCTL_PBORCTL 0x400fe030 // POR/BOR reset control register +#define SYSCTL_LDOPCTL 0x400fe034 // LDO power control register +#define SYSCTL_SRCR0 0x400fe040 // Software reset control reg 0 +#define SYSCTL_SRCR1 0x400fe044 // Software reset control reg 1 +#define SYSCTL_SRCR2 0x400fe048 // Software reset control reg 2 +#define SYSCTL_RIS 0x400fe050 // Raw interrupt status register +#define SYSCTL_IMC 0x400fe054 // Interrupt mask/control register +#define SYSCTL_MISC 0x400fe058 // Interrupt status register +#define SYSCTL_RESC 0x400fe05c // Reset cause register +#define SYSCTL_RCC 0x400fe060 // Run-mode clock config register +#define SYSCTL_PLLCFG 0x400fe064 // PLL configuration register +#define SYSCTL_RCC2 0x400fe070 // Run-mode clock config register 2 +#define SYSCTL_RCGC0 0x400fe100 // Run-mode clock gating register 0 +#define SYSCTL_RCGC1 0x400fe104 // Run-mode clock gating register 1 +#define SYSCTL_RCGC2 0x400fe108 // Run-mode clock gating register 2 +#define SYSCTL_SCGC0 0x400fe110 // Sleep-mode clock gating reg 0 +#define SYSCTL_SCGC1 0x400fe114 // Sleep-mode clock gating reg 1 +#define SYSCTL_SCGC2 0x400fe118 // Sleep-mode clock gating reg 2 +#define SYSCTL_DCGC0 0x400fe120 // Deep Sleep-mode clock gate reg 0 +#define SYSCTL_DCGC1 0x400fe124 // Deep Sleep-mode clock gate reg 1 +#define SYSCTL_DCGC2 0x400fe128 // Deep Sleep-mode clock gate reg 2 +#define SYSCTL_DSLPCLKCFG 0x400fe144 // Deep Sleep-mode clock config reg +#define SYSCTL_CLKVCLR 0x400fe150 // Clock verifcation clear register +#define SYSCTL_LDOARST 0x400fe160 // LDO reset control register +#define SYSCTL_USER0 0x400fe1e0 // NV User Register 0 +#define SYSCTL_USER1 0x400fe1e4 // NV User Register 1 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DID0 register. +// +//***************************************************************************** +#define SYSCTL_DID0_VER_MASK 0x70000000 // DID0 version mask +#define SYSCTL_DID0_VER_0 0x00000000 // DID0 version 0 +#define SYSCTL_DID0_VER_1 0x10000000 // DID0 version 1 +#define SYSCTL_DID0_CLASS_MASK 0x00FF0000 // Device Class +#define SYSCTL_DID0_CLASS_SANDSTORM 0x00000000 // LM3Snnn Sandstorm Device +#define SYSCTL_DID0_CLASS_FURY 0x00010000 // LM3Snnnn Fury Device +#define SYSCTL_DID0_MAJ_MASK 0x0000FF00 // Major revision mask +#define SYSCTL_DID0_MAJ_A 0x00000000 // Major revision A +#define SYSCTL_DID0_MAJ_B 0x00000100 // Major revision B +#define SYSCTL_DID0_MAJ_C 0x00000200 // Major revision C +#define SYSCTL_DID0_MIN_MASK 0x000000FF // Minor revision mask +#define SYSCTL_DID0_MIN_0 0x00000000 // Minor revision 0 +#define SYSCTL_DID0_MIN_1 0x00000001 // Minor revision 1 +#define SYSCTL_DID0_MIN_2 0x00000002 // Minor revision 2 +#define SYSCTL_DID0_MIN_3 0x00000003 // Minor revision 3 +#define SYSCTL_DID0_MIN_4 0x00000004 // Minor revision 4 +#define SYSCTL_DID0_MIN_5 0x00000005 // Minor revision 5 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DID1 register. +// +//***************************************************************************** +#define SYSCTL_DID1_VER_MASK 0xF0000000 // Register version mask +#define SYSCTL_DID1_FAM_MASK 0x0F000000 // Family mask +#define SYSCTL_DID1_FAM_S 0x00000000 // Stellaris family +#define SYSCTL_DID1_PRTNO_MASK 0x00FF0000 // Part number mask +#define SYSCTL_DID1_PRTNO_101 0x00010000 // LM3S101 +#define SYSCTL_DID1_PRTNO_102 0x00020000 // LM3S102 +#define SYSCTL_DID1_PRTNO_301 0x00110000 // LM3S301 +#define SYSCTL_DID1_PRTNO_310 0x00120000 // LM3S310 +#define SYSCTL_DID1_PRTNO_315 0x00130000 // LM3S315 +#define SYSCTL_DID1_PRTNO_316 0x00140000 // LM3S316 +#define SYSCTL_DID1_PRTNO_317 0x00170000 // LM3S317 +#define SYSCTL_DID1_PRTNO_328 0x00150000 // LM3S328 +#define SYSCTL_DID1_PRTNO_601 0x00210000 // LM3S601 +#define SYSCTL_DID1_PRTNO_610 0x00220000 // LM3S610 +#define SYSCTL_DID1_PRTNO_611 0x00230000 // LM3S611 +#define SYSCTL_DID1_PRTNO_612 0x00240000 // LM3S612 +#define SYSCTL_DID1_PRTNO_613 0x00250000 // LM3S613 +#define SYSCTL_DID1_PRTNO_615 0x00260000 // LM3S615 +#define SYSCTL_DID1_PRTNO_617 0x00280000 // LM3S617 +#define SYSCTL_DID1_PRTNO_618 0x00290000 // LM3S618 +#define SYSCTL_DID1_PRTNO_628 0x00270000 // LM3S628 +#define SYSCTL_DID1_PRTNO_801 0x00310000 // LM3S801 +#define SYSCTL_DID1_PRTNO_811 0x00320000 // LM3S811 +#define SYSCTL_DID1_PRTNO_812 0x00330000 // LM3S812 +#define SYSCTL_DID1_PRTNO_815 0x00340000 // LM3S815 +#define SYSCTL_DID1_PRTNO_817 0x00360000 // LM3S817 +#define SYSCTL_DID1_PRTNO_818 0x00370000 // LM3S818 +#define SYSCTL_DID1_PRTNO_828 0x00350000 // LM3S828 +#define SYSCTL_DID1_PRTNO_2110 0x00510000 // LM3S2110 +#define SYSCTL_DID1_PRTNO_2139 0x00840000 // LM3S2139 +#define SYSCTL_DID1_PRTNO_2410 0x00A20000 // LM3S2410 +#define SYSCTL_DID1_PRTNO_2412 0x00590000 // LM3S2412 +#define SYSCTL_DID1_PRTNO_2432 0x00560000 // LM3S2432 +#define SYSCTL_DID1_PRTNO_2533 0x005A0000 // LM3S2533 +#define SYSCTL_DID1_PRTNO_2620 0x00570000 // LM3S2620 +#define SYSCTL_DID1_PRTNO_2637 0x00850000 // LM3S2637 +#define SYSCTL_DID1_PRTNO_2651 0x00530000 // LM3S2651 +#define SYSCTL_DID1_PRTNO_2730 0x00A40000 // LM3S2730 +#define SYSCTL_DID1_PRTNO_2739 0x00520000 // LM3S2739 +#define SYSCTL_DID1_PRTNO_2939 0x00540000 // LM3S2939 +#define SYSCTL_DID1_PRTNO_2948 0x008F0000 // LM3S2948 +#define SYSCTL_DID1_PRTNO_2950 0x00580000 // LM3S2950 +#define SYSCTL_DID1_PRTNO_2965 0x00550000 // LM3S2965 +#define SYSCTL_DID1_PRTNO_6100 0x00A10000 // LM3S6100 +#define SYSCTL_DID1_PRTNO_6110 0x00740000 // LM3S6110 +#define SYSCTL_DID1_PRTNO_6420 0x00A50000 // LM3S6420 +#define SYSCTL_DID1_PRTNO_6422 0x00820000 // LM3S6422 +#define SYSCTL_DID1_PRTNO_6432 0x00750000 // LM3S6432 +#define SYSCTL_DID1_PRTNO_6610 0x00710000 // LM3S6610 +#define SYSCTL_DID1_PRTNO_6633 0x00830000 // LM3S6633 +#define SYSCTL_DID1_PRTNO_6637 0x008B0000 // LM3S6637 +#define SYSCTL_DID1_PRTNO_6730 0x00A30000 // LM3S6730 +#define SYSCTL_DID1_PRTNO_6938 0x00890000 // LM3S6938 +#define SYSCTL_DID1_PRTNO_6952 0x00780000 // LM3S6952 +#define SYSCTL_DID1_PRTNO_6965 0x00730000 // LM3S6965 +#define SYSCTL_DID1_PINCNT_MASK 0x0000E000 // Pin count +#define SYSCTL_DID1_PINCNT_100 0x00004000 // 100 pin package +#define SYSCTL_DID1_TEMP_MASK 0x000000E0 // Temperature range mask +#define SYSCTL_DID1_TEMP_C 0x00000000 // Commercial temp range (0..70C) +#define SYSCTL_DID1_TEMP_I 0x00000020 // Industrial temp range (-40..85C) +#define SYSCTL_DID1_PKG_MASK 0x00000018 // Package mask +#define SYSCTL_DID1_PKG_28SOIC 0x00000000 // 28-pin SOIC +#define SYSCTL_DID1_PKG_48QFP 0x00000008 // 48-pin QFP +#define SYSCTL_DID1_ROHS 0x00000004 // Part is RoHS compliant +#define SYSCTL_DID1_QUAL_MASK 0x00000003 // Qualification status mask +#define SYSCTL_DID1_QUAL_ES 0x00000000 // Engineering sample (unqualified) +#define SYSCTL_DID1_QUAL_PP 0x00000001 // Pilot production (unqualified) +#define SYSCTL_DID1_QUAL_FQ 0x00000002 // Fully qualified +#define SYSCTL_DID1_PRTNO_SHIFT 16 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC0 register. +// +//***************************************************************************** +#define SYSCTL_DC0_SRAMSZ_MASK 0xFFFF0000 // SRAM size mask +#define SYSCTL_DC0_SRAMSZ_2KB 0x00070000 // 2 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_4KB 0x000F0000 // 4 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_8KB 0x001F0000 // 8 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_16KB 0x003F0000 // 16 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_32KB 0x007F0000 // 32 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_64KB 0x00FF0000 // 64 KB of SRAM +#define SYSCTL_DC0_FLASHSZ_MASK 0x0000FFFF // Flash size mask +#define SYSCTL_DC0_FLASHSZ_8KB 0x00000003 // 8 KB of flash +#define SYSCTL_DC0_FLASHSZ_16KB 0x00000007 // 16 KB of flash +#define SYSCTL_DC0_FLASHSZ_32KB 0x0000000F // 32 KB of flash +#define SYSCTL_DC0_FLASHSZ_64KB 0x0000001F // 64 KB of flash +#define SYSCTL_DC0_FLASHSZ_96KB 0x0000002F // 96 KB of flash +#define SYSCTL_DC0_FLASHSZ_128K 0x0000003F // 128 KB of flash +#define SYSCTL_DC0_FLASHSZ_256K 0x0000007F // 256 KB of flash + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC1 register. +// +//***************************************************************************** +#define SYSCTL_DC1_CAN1 0x02000000 // CAN1 module present +#define SYSCTL_DC1_CAN0 0x01000000 // CAN0 module present +#define SYSCTL_DC1_PWM 0x00100000 // PWM module present +#define SYSCTL_DC1_ADC 0x00010000 // ADC module present +#define SYSCTL_DC1_SYSDIV_MASK 0x0000F000 // Minimum system divider mask +#define SYSCTL_DC1_ADCSPD_MASK 0x00000F00 // ADC speed mask +#define SYSCTL_DC1_ADCSPD_1M 0x00000300 // 1Msps ADC +#define SYSCTL_DC1_ADCSPD_500K 0x00000200 // 500Ksps ADC +#define SYSCTL_DC1_ADCSPD_250K 0x00000100 // 250Ksps ADC +#define SYSCTL_DC1_ADCSPD_125K 0x00000000 // 125Ksps ADC +#define SYSCTL_DC1_MPU 0x00000080 // Cortex M3 MPU present +#define SYSCTL_DC1_HIB 0x00000040 // Hibernation module present +#define SYSCTL_DC1_TEMP 0x00000020 // Temperature sensor present +#define SYSCTL_DC1_PLL 0x00000010 // PLL present +#define SYSCTL_DC1_WDOG 0x00000008 // Watchdog present +#define SYSCTL_DC1_SWO 0x00000004 // Serial wire output present +#define SYSCTL_DC1_SWD 0x00000002 // Serial wire debug present +#define SYSCTL_DC1_JTAG 0x00000001 // JTAG debug present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC2 register. +// +//***************************************************************************** +#define SYSCTL_DC2_COMP2 0x04000000 // Analog comparator 2 present +#define SYSCTL_DC2_COMP1 0x02000000 // Analog comparator 1 present +#define SYSCTL_DC2_COMP0 0x01000000 // Analog comparator 0 present +#define SYSCTL_DC2_TIMER3 0x00080000 // Timer 3 present +#define SYSCTL_DC2_TIMER2 0x00040000 // Timer 2 present +#define SYSCTL_DC2_TIMER1 0x00020000 // Timer 1 present +#define SYSCTL_DC2_TIMER0 0x00010000 // Timer 0 present +#define SYSCTL_DC2_I2C1 0x00002000 // I2C 1 present +#define SYSCTL_DC2_I2C0 0x00001000 // I2C 0 present +#ifndef DEPRECATED +#define SYSCTL_DC2_I2C 0x00001000 // I2C present +#endif +#define SYSCTL_DC2_QEI1 0x00000200 // QEI 1 present +#define SYSCTL_DC2_QEI0 0x00000100 // QEI 0 present +#ifndef DEPRECATED +#define SYSCTL_DC2_QEI 0x00000100 // QEI present +#endif +#define SYSCTL_DC2_SSI1 0x00000020 // SSI 1 present +#define SYSCTL_DC2_SSI0 0x00000010 // SSI 0 present +#ifndef DEPRECATED +#define SYSCTL_DC2_SSI 0x00000010 // SSI present +#endif +#define SYSCTL_DC2_UART2 0x00000004 // UART 2 present +#define SYSCTL_DC2_UART1 0x00000002 // UART 1 present +#define SYSCTL_DC2_UART0 0x00000001 // UART 0 present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC3 register. +// +//***************************************************************************** +#define SYSCTL_DC3_32KHZ 0x80000000 // 32kHz pin present +#define SYSCTL_DC3_CCP5 0x20000000 // CCP5 pin present +#define SYSCTL_DC3_CCP4 0x10000000 // CCP4 pin present +#define SYSCTL_DC3_CCP3 0x08000000 // CCP3 pin present +#define SYSCTL_DC3_CCP2 0x04000000 // CCP2 pin present +#define SYSCTL_DC3_CCP1 0x02000000 // CCP1 pin present +#define SYSCTL_DC3_CCP0 0x01000000 // CCP0 pin present +#define SYSCTL_DC3_ADC7 0x00800000 // ADC7 pin present +#define SYSCTL_DC3_ADC6 0x00400000 // ADC6 pin present +#define SYSCTL_DC3_ADC5 0x00200000 // ADC5 pin present +#define SYSCTL_DC3_ADC4 0x00100000 // ADC4 pin present +#define SYSCTL_DC3_ADC3 0x00080000 // ADC3 pin present +#define SYSCTL_DC3_ADC2 0x00040000 // ADC2 pin present +#define SYSCTL_DC3_ADC1 0x00020000 // ADC1 pin present +#define SYSCTL_DC3_ADC0 0x00010000 // ADC0 pin present +#define SYSCTL_DC3_MC_FAULT0 0x00008000 // MC0 fault pin present +#define SYSCTL_DC3_C2O 0x00004000 // C2o pin present +#define SYSCTL_DC3_C2PLUS 0x00002000 // C2+ pin present +#define SYSCTL_DC3_C2MINUS 0x00001000 // C2- pin present +#define SYSCTL_DC3_C1O 0x00000800 // C1o pin present +#define SYSCTL_DC3_C1PLUS 0x00000400 // C1+ pin present +#define SYSCTL_DC3_C1MINUS 0x00000200 // C1- pin present +#define SYSCTL_DC3_C0O 0x00000100 // C0o pin present +#define SYSCTL_DC3_C0PLUS 0x00000080 // C0+ pin present +#define SYSCTL_DC3_C0MINUS 0x00000040 // C0- pin present +#define SYSCTL_DC3_PWM5 0x00000020 // PWM5 pin present +#define SYSCTL_DC3_PWM4 0x00000010 // PWM4 pin present +#define SYSCTL_DC3_PWM3 0x00000008 // PWM3 pin present +#define SYSCTL_DC3_PWM2 0x00000004 // PWM2 pin present +#define SYSCTL_DC3_PWM1 0x00000002 // PWM1 pin present +#define SYSCTL_DC3_PWM0 0x00000001 // PWM0 pin present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC4 register. +// +//***************************************************************************** +#define SYSCTL_DC4_ETH 0x50000000 // Ethernet present +#define SYSCTL_DC4_GPIOH 0x00000080 // GPIO port H present +#define SYSCTL_DC4_GPIOG 0x00000040 // GPIO port G present +#define SYSCTL_DC4_GPIOF 0x00000020 // GPIO port F present +#define SYSCTL_DC4_GPIOE 0x00000010 // GPIO port E present +#define SYSCTL_DC4_GPIOD 0x00000008 // GPIO port D present +#define SYSCTL_DC4_GPIOC 0x00000004 // GPIO port C present +#define SYSCTL_DC4_GPIOB 0x00000002 // GPIO port B present +#define SYSCTL_DC4_GPIOA 0x00000001 // GPIO port A present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_PBORCTL register. +// +//***************************************************************************** +#define SYSCTL_PBORCTL_BOR_MASK 0x0000FFFC // BOR wait timer +#define SYSCTL_PBORCTL_BORIOR 0x00000002 // BOR interrupt or reset +#define SYSCTL_PBORCTL_BORWT 0x00000001 // BOR wait and check for noise +#define SYSCTL_PBORCTL_BOR_SH 2 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_LDOPCTL register. +// +//***************************************************************************** +#define SYSCTL_LDOPCTL_MASK 0x0000003F // Voltage adjust mask +#define SYSCTL_LDOPCTL_2_25V 0x00000005 // LDO output of 2.25V +#define SYSCTL_LDOPCTL_2_30V 0x00000004 // LDO output of 2.30V +#define SYSCTL_LDOPCTL_2_35V 0x00000003 // LDO output of 2.35V +#define SYSCTL_LDOPCTL_2_40V 0x00000002 // LDO output of 2.40V +#define SYSCTL_LDOPCTL_2_45V 0x00000001 // LDO output of 2.45V +#define SYSCTL_LDOPCTL_2_50V 0x00000000 // LDO output of 2.50V +#define SYSCTL_LDOPCTL_2_55V 0x0000001F // LDO output of 2.55V +#define SYSCTL_LDOPCTL_2_60V 0x0000001E // LDO output of 2.60V +#define SYSCTL_LDOPCTL_2_65V 0x0000001D // LDO output of 2.65V +#define SYSCTL_LDOPCTL_2_70V 0x0000001C // LDO output of 2.70V +#define SYSCTL_LDOPCTL_2_75V 0x0000001B // LDO output of 2.75V + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR0, SYSCTL_RCGC0, +// SYSCTL_SCGC0, and SYSCTL_DCGC0 registers. +// +//***************************************************************************** +#define SYSCTL_SET0_CAN1 0x02000000 // CAN 1 module +#define SYSCTL_SET0_CAN0 0x01000000 // CAN 0 module +#define SYSCTL_SET0_PWM 0x00100000 // PWM module +#define SYSCTL_SET0_ADC 0x00010000 // ADC module +#define SYSCTL_SET0_ADCSPD_MASK 0x00000F00 // ADC speed mask +#define SYSCTL_SET0_ADCSPD_1M 0x00000300 // 1Msps ADC +#define SYSCTL_SET0_ADCSPD_500K 0x00000200 // 500Ksps ADC +#define SYSCTL_SET0_ADCSPD_250K 0x00000100 // 250Ksps ADC +#define SYSCTL_SET0_ADCSPD_125K 0x00000000 // 125Ksps ADC +#define SYSCTL_SET0_HIB 0x00000040 // Hibernation module +#define SYSCTL_SET0_WDOG 0x00000008 // Watchdog module + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR1, SYSCTL_RCGC1, +// SYSCTL_SCGC1, and SYSCTL_DCGC1 registers. +// +//***************************************************************************** +#define SYSCTL_SET1_COMP2 0x04000000 // Analog comparator module 2 +#define SYSCTL_SET1_COMP1 0x02000000 // Analog comparator module 1 +#define SYSCTL_SET1_COMP0 0x01000000 // Analog comparator module 0 +#define SYSCTL_SET1_TIMER3 0x00080000 // Timer module 3 +#define SYSCTL_SET1_TIMER2 0x00040000 // Timer module 2 +#define SYSCTL_SET1_TIMER1 0x00020000 // Timer module 1 +#define SYSCTL_SET1_TIMER0 0x00010000 // Timer module 0 +#define SYSCTL_SET1_I2C1 0x00002000 // I2C module 1 +#define SYSCTL_SET1_I2C0 0x00001000 // I2C module 0 +#ifndef DEPRECATED +#define SYSCTL_SET1_I2C 0x00001000 // I2C module +#endif +#define SYSCTL_SET1_QEI1 0x00000200 // QEI module 1 +#define SYSCTL_SET1_QEI0 0x00000100 // QEI module 0 +#ifndef DEPRECATED +#define SYSCTL_SET1_QEI 0x00000100 // QEI module +#endif +#define SYSCTL_SET1_SSI1 0x00000020 // SSI module 1 +#define SYSCTL_SET1_SSI0 0x00000010 // SSI module 0 +#ifndef DEPRECATED +#define SYSCTL_SET1_SSI 0x00000010 // SSI module +#endif +#define SYSCTL_SET1_UART2 0x00000004 // UART module 2 +#define SYSCTL_SET1_UART1 0x00000002 // UART module 1 +#define SYSCTL_SET1_UART0 0x00000001 // UART module 0 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR2, SYSCTL_RCGC2, +// SYSCTL_SCGC2, and SYSCTL_DCGC2 registers. +// +//***************************************************************************** +#define SYSCTL_SET2_ETH 0x50000000 // ETH module +#define SYSCTL_SET2_GPIOH 0x00000080 // GPIO H module +#define SYSCTL_SET2_GPIOG 0x00000040 // GPIO G module +#define SYSCTL_SET2_GPIOF 0x00000020 // GPIO F module +#define SYSCTL_SET2_GPIOE 0x00000010 // GPIO E module +#define SYSCTL_SET2_GPIOD 0x00000008 // GPIO D module +#define SYSCTL_SET2_GPIOC 0x00000004 // GPIO C module +#define SYSCTL_SET2_GPIOB 0x00000002 // GPIO B module +#define SYSCTL_SET2_GPIOA 0x00000001 // GIPO A module + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RIS, SYSCTL_IMC, and +// SYSCTL_IMS registers. +// +//***************************************************************************** +#define SYSCTL_INT_PLL_LOCK 0x00000040 // PLL lock interrupt +#define SYSCTL_INT_CUR_LIMIT 0x00000020 // Current limit interrupt +#define SYSCTL_INT_IOSC_FAIL 0x00000010 // Internal oscillator failure int +#define SYSCTL_INT_MOSC_FAIL 0x00000008 // Main oscillator failure int +#define SYSCTL_INT_POR 0x00000004 // Power on reset interrupt +#define SYSCTL_INT_BOR 0x00000002 // Brown out interrupt +#define SYSCTL_INT_PLL_FAIL 0x00000001 // PLL failure interrupt + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RESC register. +// +//***************************************************************************** +#define SYSCTL_RESC_LDO 0x00000020 // LDO power OK lost reset +#define SYSCTL_RESC_SW 0x00000010 // Software reset +#define SYSCTL_RESC_WDOG 0x00000008 // Watchdog reset +#define SYSCTL_RESC_BOR 0x00000004 // Brown-out reset +#define SYSCTL_RESC_POR 0x00000002 // Power on reset +#define SYSCTL_RESC_EXT 0x00000001 // External reset + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RCC register. +// +//***************************************************************************** +#define SYSCTL_RCC_ACG 0x08000000 // Automatic clock gating +#define SYSCTL_RCC_SYSDIV_MASK 0x07800000 // System clock divider +#define SYSCTL_RCC_SYSDIV_2 0x00800000 // System clock /2 +#define SYSCTL_RCC_SYSDIV_3 0x01000000 // System clock /3 +#define SYSCTL_RCC_SYSDIV_4 0x01800000 // System clock /4 +#define SYSCTL_RCC_SYSDIV_5 0x02000000 // System clock /5 +#define SYSCTL_RCC_SYSDIV_6 0x02800000 // System clock /6 +#define SYSCTL_RCC_SYSDIV_7 0x03000000 // System clock /7 +#define SYSCTL_RCC_SYSDIV_8 0x03800000 // System clock /8 +#define SYSCTL_RCC_SYSDIV_9 0x04000000 // System clock /9 +#define SYSCTL_RCC_SYSDIV_10 0x04800000 // System clock /10 +#define SYSCTL_RCC_SYSDIV_11 0x05000000 // System clock /11 +#define SYSCTL_RCC_SYSDIV_12 0x05800000 // System clock /12 +#define SYSCTL_RCC_SYSDIV_13 0x06000000 // System clock /13 +#define SYSCTL_RCC_SYSDIV_14 0x06800000 // System clock /14 +#define SYSCTL_RCC_SYSDIV_15 0x07000000 // System clock /15 +#define SYSCTL_RCC_SYSDIV_16 0x07800000 // System clock /16 +#define SYSCTL_RCC_USE_SYSDIV 0x00400000 // Use sytem clock divider +#define SYSCTL_RCC_USE_PWMDIV 0x00100000 // Use PWM clock divider +#define SYSCTL_RCC_PWMDIV_MASK 0x000E0000 // PWM clock divider +#define SYSCTL_RCC_PWMDIV_2 0x00000000 // PWM clock /2 +#define SYSCTL_RCC_PWMDIV_4 0x00020000 // PWM clock /4 +#define SYSCTL_RCC_PWMDIV_8 0x00040000 // PWM clock /8 +#define SYSCTL_RCC_PWMDIV_16 0x00060000 // PWM clock /16 +#define SYSCTL_RCC_PWMDIV_32 0x00080000 // PWM clock /32 +#define SYSCTL_RCC_PWMDIV_64 0x000A0000 // PWM clock /64 +#define SYSCTL_RCC_PWRDN 0x00002000 // PLL power down +#define SYSCTL_RCC_OE 0x00001000 // PLL output enable +#define SYSCTL_RCC_BYPASS 0x00000800 // PLL bypass +#define SYSCTL_RCC_PLLVER 0x00000400 // PLL verification timer enable +#define SYSCTL_RCC_XTAL_MASK 0x000003C0 // Crystal attached to main osc +#define SYSCTL_RCC_XTAL_3_57MHZ 0x00000100 // Using a 3.579545MHz crystal +#define SYSCTL_RCC_XTAL_3_68MHz 0x00000140 // Using a 3.6864MHz crystal +#define SYSCTL_RCC_XTAL_4MHz 0x00000180 // Using a 4MHz crystal +#define SYSCTL_RCC_XTAL_4_09MHZ 0x000001C0 // Using a 4.096MHz crystal +#define SYSCTL_RCC_XTAL_4_91MHZ 0x00000200 // Using a 4.9152MHz crystal +#define SYSCTL_RCC_XTAL_5MHZ 0x00000240 // Using a 5MHz crystal +#define SYSCTL_RCC_XTAL_5_12MHZ 0x00000280 // Using a 5.12MHz crystal +#define SYSCTL_RCC_XTAL_6MHZ 0x000002C0 // Using a 6MHz crystal +#define SYSCTL_RCC_XTAL_6_14MHZ 0x00000300 // Using a 6.144MHz crystal +#define SYSCTL_RCC_XTAL_7_37MHZ 0x00000340 // Using a 7.3728MHz crystal +#define SYSCTL_RCC_XTAL_8MHZ 0x00000380 // Using a 8MHz crystal +#define SYSCTL_RCC_XTAL_8_19MHZ 0x000003C0 // Using a 8.192MHz crystal +#define SYSCTL_RCC_OSCSRC_MASK 0x00000030 // Oscillator input select +#define SYSCTL_RCC_OSCSRC_MAIN 0x00000000 // Use the main oscillator +#define SYSCTL_RCC_OSCSRC_INT 0x00000010 // Use the internal oscillator +#define SYSCTL_RCC_OSCSRC_INT4 0x00000020 // Use the internal oscillator / 4 +#define SYSCTL_RCC_IOSCVER 0x00000008 // Int. osc. verification timer en +#define SYSCTL_RCC_MOSCVER 0x00000004 // Main osc. verification timer en +#define SYSCTL_RCC_IOSCDIS 0x00000002 // Internal oscillator disable +#define SYSCTL_RCC_MOSCDIS 0x00000001 // Main oscillator disable +#define SYSCTL_RCC_SYSDIV_SHIFT 23 // Shift to the SYSDIV field +#define SYSCTL_RCC_PWMDIV_SHIFT 17 // Shift to the PWMDIV field +#define SYSCTL_RCC_XTAL_SHIFT 6 // Shift to the XTAL field +#define SYSCTL_RCC_OSCSRC_SHIFT 4 // Shift to the OSCSRC field + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_PLLCFG register. +// +//***************************************************************************** +#define SYSCTL_PLLCFG_OD_MASK 0x0000C000 // Output divider +#define SYSCTL_PLLCFG_OD_1 0x00000000 // Output divider is 1 +#define SYSCTL_PLLCFG_OD_2 0x00004000 // Output divider is 2 +#define SYSCTL_PLLCFG_OD_4 0x00008000 // Output divider is 4 +#define SYSCTL_PLLCFG_F_MASK 0x00003FE0 // PLL multiplier +#define SYSCTL_PLLCFG_R_MASK 0x0000001F // Input predivider +#define SYSCTL_PLLCFG_F_SHIFT 5 +#define SYSCTL_PLLCFG_R_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RCC2 register. +// +//***************************************************************************** +#define SYSCTL_RCC2_USERCC2 0x80000000 // Use RCC2 +#define SYSCTL_RCC2_SYSDIV2_MSK 0x1F800000 // System clock divider +#define SYSCTL_RCC2_SYSDIV2_2 0x00800000 // System clock /2 +#define SYSCTL_RCC2_SYSDIV2_3 0x01000000 // System clock /3 +#define SYSCTL_RCC2_SYSDIV2_4 0x01800000 // System clock /4 +#define SYSCTL_RCC2_SYSDIV2_5 0x02000000 // System clock /5 +#define SYSCTL_RCC2_SYSDIV2_6 0x02800000 // System clock /6 +#define SYSCTL_RCC2_SYSDIV2_7 0x03000000 // System clock /7 +#define SYSCTL_RCC2_SYSDIV2_8 0x03800000 // System clock /8 +#define SYSCTL_RCC2_SYSDIV2_9 0x04000000 // System clock /9 +#define SYSCTL_RCC2_SYSDIV2_10 0x04800000 // System clock /10 +#define SYSCTL_RCC2_SYSDIV2_11 0x05000000 // System clock /11 +#define SYSCTL_RCC2_SYSDIV2_12 0x05800000 // System clock /12 +#define SYSCTL_RCC2_SYSDIV2_13 0x06000000 // System clock /13 +#define SYSCTL_RCC2_SYSDIV2_14 0x06800000 // System clock /14 +#define SYSCTL_RCC2_SYSDIV2_15 0x07000000 // System clock /15 +#define SYSCTL_RCC2_SYSDIV2_16 0x07800000 // System clock /16 +#define SYSCTL_RCC2_SYSDIV2_17 0x08000000 // System clock /17 +#define SYSCTL_RCC2_SYSDIV2_18 0x08800000 // System clock /18 +#define SYSCTL_RCC2_SYSDIV2_19 0x09000000 // System clock /19 +#define SYSCTL_RCC2_SYSDIV2_20 0x09800000 // System clock /20 +#define SYSCTL_RCC2_SYSDIV2_21 0x0A000000 // System clock /21 +#define SYSCTL_RCC2_SYSDIV2_22 0x0A800000 // System clock /22 +#define SYSCTL_RCC2_SYSDIV2_23 0x0B000000 // System clock /23 +#define SYSCTL_RCC2_SYSDIV2_24 0x0B800000 // System clock /24 +#define SYSCTL_RCC2_SYSDIV2_25 0x0C000000 // System clock /25 +#define SYSCTL_RCC2_SYSDIV2_26 0x0C800000 // System clock /26 +#define SYSCTL_RCC2_SYSDIV2_27 0x0D000000 // System clock /27 +#define SYSCTL_RCC2_SYSDIV2_28 0x0D800000 // System clock /28 +#define SYSCTL_RCC2_SYSDIV2_29 0x0E000000 // System clock /29 +#define SYSCTL_RCC2_SYSDIV2_30 0x0E800000 // System clock /30 +#define SYSCTL_RCC2_SYSDIV2_31 0x0F000000 // System clock /31 +#define SYSCTL_RCC2_SYSDIV2_32 0x0F800000 // System clock /32 +#define SYSCTL_RCC2_SYSDIV2_33 0x10000000 // System clock /33 +#define SYSCTL_RCC2_SYSDIV2_34 0x10800000 // System clock /34 +#define SYSCTL_RCC2_SYSDIV2_35 0x11000000 // System clock /35 +#define SYSCTL_RCC2_SYSDIV2_36 0x11800000 // System clock /36 +#define SYSCTL_RCC2_SYSDIV2_37 0x12000000 // System clock /37 +#define SYSCTL_RCC2_SYSDIV2_38 0x12800000 // System clock /38 +#define SYSCTL_RCC2_SYSDIV2_39 0x13000000 // System clock /39 +#define SYSCTL_RCC2_SYSDIV2_40 0x13800000 // System clock /40 +#define SYSCTL_RCC2_SYSDIV2_41 0x14000000 // System clock /41 +#define SYSCTL_RCC2_SYSDIV2_42 0x14800000 // System clock /42 +#define SYSCTL_RCC2_SYSDIV2_43 0x15000000 // System clock /43 +#define SYSCTL_RCC2_SYSDIV2_44 0x15800000 // System clock /44 +#define SYSCTL_RCC2_SYSDIV2_45 0x16000000 // System clock /45 +#define SYSCTL_RCC2_SYSDIV2_46 0x16800000 // System clock /46 +#define SYSCTL_RCC2_SYSDIV2_47 0x17000000 // System clock /47 +#define SYSCTL_RCC2_SYSDIV2_48 0x17800000 // System clock /48 +#define SYSCTL_RCC2_SYSDIV2_49 0x18000000 // System clock /49 +#define SYSCTL_RCC2_SYSDIV2_50 0x18800000 // System clock /50 +#define SYSCTL_RCC2_SYSDIV2_51 0x19000000 // System clock /51 +#define SYSCTL_RCC2_SYSDIV2_52 0x19800000 // System clock /52 +#define SYSCTL_RCC2_SYSDIV2_53 0x1A000000 // System clock /53 +#define SYSCTL_RCC2_SYSDIV2_54 0x1A800000 // System clock /54 +#define SYSCTL_RCC2_SYSDIV2_55 0x1B000000 // System clock /55 +#define SYSCTL_RCC2_SYSDIV2_56 0x1B800000 // System clock /56 +#define SYSCTL_RCC2_SYSDIV2_57 0x1C000000 // System clock /57 +#define SYSCTL_RCC2_SYSDIV2_58 0x1C800000 // System clock /58 +#define SYSCTL_RCC2_SYSDIV2_59 0x1D000000 // System clock /59 +#define SYSCTL_RCC2_SYSDIV2_60 0x1D800000 // System clock /60 +#define SYSCTL_RCC2_SYSDIV2_61 0x1E000000 // System clock /61 +#define SYSCTL_RCC2_SYSDIV2_62 0x1E800000 // System clock /62 +#define SYSCTL_RCC2_SYSDIV2_63 0x1F000000 // System clock /63 +#define SYSCTL_RCC2_SYSDIV2_64 0x1F800000 // System clock /64 +#define SYSCTL_RCC2_PWRDN2 0x00002000 // PLL power down +#define SYSCTL_RCC2_BYPASS2 0x00000800 // PLL bypass +#define SYSCTL_RCC2_OSCSRC2_MSK 0x00000070 // Oscillator input select +#define SYSCTL_RCC2_OSCSRC2_MO 0x00000000 // Use the main oscillator +#define SYSCTL_RCC2_OSCSRC2_IO 0x00000010 // Use the internal oscillator +#define SYSCTL_RCC2_OSCSRC2_IO4 0x00000020 // Use the internal oscillator / 4 +#define SYSCTL_RCC2_OSCSRC2_30 0x00000030 // Use the 30 KHz internal osc. +#define SYSCTL_RCC2_OSCSRC2_32 0x00000070 // Use the 32 KHz external osc. + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DSLPCLKCFG register. +// +//***************************************************************************** +#define SYSCTL_DSLPCLKCFG_D_MSK 0x1f800000 // Deep sleep system clock override +#define SYSCTL_DSLPCLKCFG_D_2 0x00800000 // System clock /2 +#define SYSCTL_DSLPCLKCFG_D_3 0x01000000 // System clock /3 +#define SYSCTL_DSLPCLKCFG_D_4 0x01800000 // System clock /4 +#define SYSCTL_DSLPCLKCFG_D_5 0x02000000 // System clock /5 +#define SYSCTL_DSLPCLKCFG_D_6 0x02800000 // System clock /6 +#define SYSCTL_DSLPCLKCFG_D_7 0x03000000 // System clock /7 +#define SYSCTL_DSLPCLKCFG_D_8 0x03800000 // System clock /8 +#define SYSCTL_DSLPCLKCFG_D_9 0x04000000 // System clock /9 +#define SYSCTL_DSLPCLKCFG_D_10 0x04800000 // System clock /10 +#define SYSCTL_DSLPCLKCFG_D_11 0x05000000 // System clock /11 +#define SYSCTL_DSLPCLKCFG_D_12 0x05800000 // System clock /12 +#define SYSCTL_DSLPCLKCFG_D_13 0x06000000 // System clock /13 +#define SYSCTL_DSLPCLKCFG_D_14 0x06800000 // System clock /14 +#define SYSCTL_DSLPCLKCFG_D_15 0x07000000 // System clock /15 +#define SYSCTL_DSLPCLKCFG_D_16 0x07800000 // System clock /16 +#define SYSCTL_DSLPCLKCFG_D_17 0x08000000 // System clock /17 +#define SYSCTL_DSLPCLKCFG_D_18 0x08800000 // System clock /18 +#define SYSCTL_DSLPCLKCFG_D_19 0x09000000 // System clock /19 +#define SYSCTL_DSLPCLKCFG_D_20 0x09800000 // System clock /20 +#define SYSCTL_DSLPCLKCFG_D_21 0x0A000000 // System clock /21 +#define SYSCTL_DSLPCLKCFG_D_22 0x0A800000 // System clock /22 +#define SYSCTL_DSLPCLKCFG_D_23 0x0B000000 // System clock /23 +#define SYSCTL_DSLPCLKCFG_D_24 0x0B800000 // System clock /24 +#define SYSCTL_DSLPCLKCFG_D_25 0x0C000000 // System clock /25 +#define SYSCTL_DSLPCLKCFG_D_26 0x0C800000 // System clock /26 +#define SYSCTL_DSLPCLKCFG_D_27 0x0D000000 // System clock /27 +#define SYSCTL_DSLPCLKCFG_D_28 0x0D800000 // System clock /28 +#define SYSCTL_DSLPCLKCFG_D_29 0x0E000000 // System clock /29 +#define SYSCTL_DSLPCLKCFG_D_30 0x0E800000 // System clock /30 +#define SYSCTL_DSLPCLKCFG_D_31 0x0F000000 // System clock /31 +#define SYSCTL_DSLPCLKCFG_D_32 0x0F800000 // System clock /32 +#define SYSCTL_DSLPCLKCFG_D_33 0x10000000 // System clock /33 +#define SYSCTL_DSLPCLKCFG_D_34 0x10800000 // System clock /34 +#define SYSCTL_DSLPCLKCFG_D_35 0x11000000 // System clock /35 +#define SYSCTL_DSLPCLKCFG_D_36 0x11800000 // System clock /36 +#define SYSCTL_DSLPCLKCFG_D_37 0x12000000 // System clock /37 +#define SYSCTL_DSLPCLKCFG_D_38 0x12800000 // System clock /38 +#define SYSCTL_DSLPCLKCFG_D_39 0x13000000 // System clock /39 +#define SYSCTL_DSLPCLKCFG_D_40 0x13800000 // System clock /40 +#define SYSCTL_DSLPCLKCFG_D_41 0x14000000 // System clock /41 +#define SYSCTL_DSLPCLKCFG_D_42 0x14800000 // System clock /42 +#define SYSCTL_DSLPCLKCFG_D_43 0x15000000 // System clock /43 +#define SYSCTL_DSLPCLKCFG_D_44 0x15800000 // System clock /44 +#define SYSCTL_DSLPCLKCFG_D_45 0x16000000 // System clock /45 +#define SYSCTL_DSLPCLKCFG_D_46 0x16800000 // System clock /46 +#define SYSCTL_DSLPCLKCFG_D_47 0x17000000 // System clock /47 +#define SYSCTL_DSLPCLKCFG_D_48 0x17800000 // System clock /48 +#define SYSCTL_DSLPCLKCFG_D_49 0x18000000 // System clock /49 +#define SYSCTL_DSLPCLKCFG_D_50 0x18800000 // System clock /50 +#define SYSCTL_DSLPCLKCFG_D_51 0x19000000 // System clock /51 +#define SYSCTL_DSLPCLKCFG_D_52 0x19800000 // System clock /52 +#define SYSCTL_DSLPCLKCFG_D_53 0x1A000000 // System clock /53 +#define SYSCTL_DSLPCLKCFG_D_54 0x1A800000 // System clock /54 +#define SYSCTL_DSLPCLKCFG_D_55 0x1B000000 // System clock /55 +#define SYSCTL_DSLPCLKCFG_D_56 0x1B800000 // System clock /56 +#define SYSCTL_DSLPCLKCFG_D_57 0x1C000000 // System clock /57 +#define SYSCTL_DSLPCLKCFG_D_58 0x1C800000 // System clock /58 +#define SYSCTL_DSLPCLKCFG_D_59 0x1D000000 // System clock /59 +#define SYSCTL_DSLPCLKCFG_D_60 0x1D800000 // System clock /60 +#define SYSCTL_DSLPCLKCFG_D_61 0x1E000000 // System clock /61 +#define SYSCTL_DSLPCLKCFG_D_62 0x1E800000 // System clock /62 +#define SYSCTL_DSLPCLKCFG_D_63 0x1F000000 // System clock /63 +#define SYSCTL_DSLPCLKCFG_D_64 0x1F800000 // System clock /64 +#define SYSCTL_DSLPCLKCFG_O_MSK 0x00000070 // Deep sleep oscillator override +#define SYSCTL_DSLPCLKCFG_O_IGN 0x00000000 // Do not override +#define SYSCTL_DSLPCLKCFG_O_IO 0x00000010 // Use the internal oscillator +#define SYSCTL_DSLPCLKCFG_O_30 0x00000030 // Use the 30 KHz internal osc. +#define SYSCTL_DSLPCLKCFG_O_32 0x00000070 // Use the 32 KHz external osc. + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_CLKVCLR register. +// +//***************************************************************************** +#define SYSCTL_CLKVCLR_CLR 0x00000001 // Clear clock verification fault + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_LDOARST register. +// +//***************************************************************************** +#define SYSCTL_LDOARST_ARST 0x00000001 // Allow LDO to reset device + +#endif // __HW_SYSCTL_H__ diff --git a/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_timer.h b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_timer.h new file mode 100644 index 000000000..eb58abf65 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_timer.h @@ -0,0 +1,235 @@ +//***************************************************************************** +// +// hw_timer.h - Defines and macros used when accessing the timer. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_TIMER_H__ +#define __HW_TIMER_H__ + +//***************************************************************************** +// +// The following define the offsets of the timer registers. +// +//***************************************************************************** +#define TIMER_O_CFG 0x00000000 // Configuration register +#define TIMER_O_TAMR 0x00000004 // TimerA mode register +#define TIMER_O_TBMR 0x00000008 // TimerB mode register +#define TIMER_O_CTL 0x0000000C // Control register +#define TIMER_O_IMR 0x00000018 // Interrupt mask register +#define TIMER_O_RIS 0x0000001C // Interrupt status register +#define TIMER_O_MIS 0x00000020 // Masked interrupt status reg. +#define TIMER_O_ICR 0x00000024 // Interrupt clear register +#define TIMER_O_TAILR 0x00000028 // TimerA interval load register +#define TIMER_O_TBILR 0x0000002C // TimerB interval load register +#define TIMER_O_TAMATCHR 0x00000030 // TimerA match register +#define TIMER_O_TBMATCHR 0x00000034 // TimerB match register +#define TIMER_O_TAPR 0x00000038 // TimerA prescale register +#define TIMER_O_TBPR 0x0000003C // TimerB prescale register +#define TIMER_O_TAPMR 0x00000040 // TimerA prescale match register +#define TIMER_O_TBPMR 0x00000044 // TimerB prescale match register +#define TIMER_O_TAR 0x00000048 // TimerA register +#define TIMER_O_TBR 0x0000004C // TimerB register + +//***************************************************************************** +// +// The following define the reset values of the timer registers. +// +//***************************************************************************** +#define TIMER_RV_CFG 0x00000000 // Configuration register RV +#define TIMER_RV_TAMR 0x00000000 // TimerA mode register RV +#define TIMER_RV_TBMR 0x00000000 // TimerB mode register RV +#define TIMER_RV_CTL 0x00000000 // Control register RV +#define TIMER_RV_IMR 0x00000000 // Interrupt mask register RV +#define TIMER_RV_RIS 0x00000000 // Interrupt status register RV +#define TIMER_RV_MIS 0x00000000 // Masked interrupt status reg RV +#define TIMER_RV_ICR 0x00000000 // Interrupt clear register RV +#define TIMER_RV_TAILR 0xFFFFFFFF // TimerA interval load reg RV +#define TIMER_RV_TBILR 0x0000FFFF // TimerB interval load reg RV +#define TIMER_RV_TAMATCHR 0xFFFFFFFF // TimerA match register RV +#define TIMER_RV_TBMATCHR 0x0000FFFF // TimerB match register RV +#define TIMER_RV_TAPR 0x00000000 // TimerA prescale register RV +#define TIMER_RV_TBPR 0x00000000 // TimerB prescale register RV +#define TIMER_RV_TAPMR 0x00000000 // TimerA prescale match reg RV +#define TIMER_RV_TBPMR 0x00000000 // TimerB prescale match regi RV +#define TIMER_RV_TAR 0xFFFFFFFF // TimerA register RV +#define TIMER_RV_TBR 0x0000FFFF // TimerB register RV + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_CFG register. +// +//***************************************************************************** +#define TIMER_CFG_CFG_MSK 0x00000007 // Configuration options mask +#define TIMER_CFG_16_BIT 0x00000004 // Two 16 bit timers +#define TIMER_CFG_32_BIT_RTC 0x00000001 // 32 bit RTC +#define TIMER_CFG_32_BIT_TIMER 0x00000000 // 32 bit timer + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TnMR register. +// +//***************************************************************************** +#define TIMER_TNMR_TNAMS 0x00000008 // Alternate mode select +#define TIMER_TNMR_TNCMR 0x00000004 // Capture mode - count or time +#define TIMER_TNMR_TNTMR_MSK 0x00000003 // Timer mode mask +#define TIMER_TNMR_TNTMR_CAP 0x00000003 // Mode - capture +#define TIMER_TNMR_TNTMR_PERIOD 0x00000002 // Mode - periodic +#define TIMER_TNMR_TNTMR_1_SHOT 0x00000001 // Mode - one shot + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_CTL register. +// +//***************************************************************************** +#define TIMER_CTL_TBPWML 0x00004000 // TimerB PWM output level invert +#define TIMER_CTL_TBOTE 0x00002000 // TimerB output trigger enable +#define TIMER_CTL_TBEVENT_MSK 0x00000C00 // TimerB event mode mask +#define TIMER_CTL_TBEVENT_BOTH 0x00000C00 // TimerB event mode - both edges +#define TIMER_CTL_TBEVENT_NEG 0x00000400 // TimerB event mode - neg edge +#define TIMER_CTL_TBEVENT_POS 0x00000000 // TimerB event mode - pos edge +#define TIMER_CTL_TBSTALL 0x00000200 // TimerB stall enable +#define TIMER_CTL_TBEN 0x00000100 // TimerB enable +#define TIMER_CTL_TAPWML 0x00000040 // TimerA PWM output level invert +#define TIMER_CTL_TAOTE 0x00000020 // TimerA output trigger enable +#define TIMER_CTL_RTCEN 0x00000010 // RTC counter enable +#define TIMER_CTL_TAEVENT_MSK 0x0000000C // TimerA event mode mask +#define TIMER_CTL_TAEVENT_BOTH 0x0000000C // TimerA event mode - both edges +#define TIMER_CTL_TAEVENT_NEG 0x00000004 // TimerA event mode - neg edge +#define TIMER_CTL_TAEVENT_POS 0x00000000 // TimerA event mode - pos edge +#define TIMER_CTL_TASTALL 0x00000002 // TimerA stall enable +#define TIMER_CTL_TAEN 0x00000001 // TimerA enable + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_IMR register. +// +//***************************************************************************** +#define TIMER_IMR_CBEIM 0x00000400 // CaptureB event interrupt mask +#define TIMER_IMR_CBMIM 0x00000200 // CaptureB match interrupt mask +#define TIMER_IMR_TBTOIM 0x00000100 // TimerB time out interrupt mask +#define TIMER_IMR_RTCIM 0x00000008 // RTC interrupt mask +#define TIMER_IMR_CAEIM 0x00000004 // CaptureA event interrupt mask +#define TIMER_IMR_CAMIM 0x00000002 // CaptureA match interrupt mask +#define TIMER_IMR_TATOIM 0x00000001 // TimerA time out interrupt mask + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_RIS register. +// +//***************************************************************************** +#define TIMER_RIS_CBERIS 0x00000400 // CaptureB event raw int status +#define TIMER_RIS_CBMRIS 0x00000200 // CaptureB match raw int status +#define TIMER_RIS_TBTORIS 0x00000100 // TimerB time out raw int status +#define TIMER_RIS_RTCRIS 0x00000008 // RTC raw int status +#define TIMER_RIS_CAERIS 0x00000004 // CaptureA event raw int status +#define TIMER_RIS_CAMRIS 0x00000002 // CaptureA match raw int status +#define TIMER_RIS_TATORIS 0x00000001 // TimerA time out raw int status + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_MIS register. +// +//***************************************************************************** +#define TIMER_RIS_CBEMIS 0x00000400 // CaptureB event masked int status +#define TIMER_RIS_CBMMIS 0x00000200 // CaptureB match masked int status +#define TIMER_RIS_TBTOMIS 0x00000100 // TimerB time out masked int stat +#define TIMER_RIS_RTCMIS 0x00000008 // RTC masked int status +#define TIMER_RIS_CAEMIS 0x00000004 // CaptureA event masked int status +#define TIMER_RIS_CAMMIS 0x00000002 // CaptureA match masked int status +#define TIMER_RIS_TATOMIS 0x00000001 // TimerA time out masked int stat + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_ICR register. +// +//***************************************************************************** +#define TIMER_ICR_CBECINT 0x00000400 // CaptureB event interrupt clear +#define TIMER_ICR_CBMCINT 0x00000200 // CaptureB match interrupt clear +#define TIMER_ICR_TBTOCINT 0x00000100 // TimerB time out interrupt clear +#define TIMER_ICR_RTCCINT 0x00000008 // RTC interrupt clear +#define TIMER_ICR_CAECINT 0x00000004 // CaptureA event interrupt clear +#define TIMER_ICR_CAMCINT 0x00000002 // CaptureA match interrupt clear +#define TIMER_ICR_TATOCINT 0x00000001 // TimerA time out interrupt clear + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TAILR register. +// +//***************************************************************************** +#define TIMER_TAILR_TAILRH 0xFFFF0000 // TimerB load val in 32 bit mode +#define TIMER_TAILR_TAILRL 0x0000FFFF // TimerA interval load value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TBILR register. +// +//***************************************************************************** +#define TIMER_TBILR_TBILRL 0x0000FFFF // TimerB interval load value + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TAMATCHR register. +// +//***************************************************************************** +#define TIMER_TAMATCHR_TAMRH 0xFFFF0000 // TimerB match val in 32 bit mode +#define TIMER_TAMATCHR_TAMRL 0x0000FFFF // TimerA match value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TBMATCHR register. +// +//***************************************************************************** +#define TIMER_TBMATCHR_TBMRL 0x0000FFFF // TimerB match load value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TnPR register. +// +//***************************************************************************** +#define TIMER_TNPR_TNPSR 0x000000FF // TimerN prescale value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TnPMR register. +// +//***************************************************************************** +#define TIMER_TNPMR_TNPSMR 0x000000FF // TimerN prescale match value + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TAR register. +// +//***************************************************************************** +#define TIMER_TAR_TARH 0xFFFF0000 // TimerB val in 32 bit mode +#define TIMER_TAR_TARL 0x0000FFFF // TimerA value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TBR register. +// +//***************************************************************************** +#define TIMER_TBR_TBRL 0x0000FFFF // TimerB value + +#endif // __HW_TIMER_H__ diff --git a/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_types.h b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_types.h new file mode 100644 index 000000000..974a85594 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_types.h @@ -0,0 +1,129 @@ +//***************************************************************************** +// +// hw_types.h - Common types and macros. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_TYPES_H__ +#define __HW_TYPES_H__ + +//***************************************************************************** +// +// Define a boolean type, and values for true and false. +// +//***************************************************************************** +typedef unsigned char tBoolean; + +#ifndef true +#define true 1 +#endif + +#ifndef false +#define false 0 +#endif + +//***************************************************************************** +// +// Macros for hardware access, both direct and via the bit-band region. +// +//***************************************************************************** +#define HWREG(x) \ + (*((volatile unsigned long *)(x))) +#define HWREGH(x) \ + (*((volatile unsigned short *)(x))) +#define HWREGB(x) \ + (*((volatile unsigned char *)(x))) +#define HWREGBITW(x, b) \ + HWREG(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) +#define HWREGBITH(x, b) \ + HWREGH(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) +#define HWREGBITB(x, b) \ + HWREGB(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) + +//***************************************************************************** +// +// Helper Macros for determining silicon revisions, etc. +// +// These macros will be used by Driverlib at "run-time" to create necessary +// conditional code blocks that will allow a single version of the Driverlib +// "binary" code to support multiple(all) Stellaris silicon revisions. +// +// It is expected that these macros will be used inside of a standard 'C' +// conditional block of code, e.g. +// +// if(DEVICE_IS_SANDSTORM()) +// { +// do some Sandstorm specific code here. +// } +// +// By default, these macros will be defined as run-time checks of the +// appropriate register(s) to allow creation of run-time conditional code +// blocks for a common DriverLib across the entire Stellaris family. +// +// However, if code-space optimization is required, these macros can be "hard- +// coded" for a specific version of Stellaris silicon. Many compilers will +// then detect the "hard-coded" conditionals, and appropriately optimize the +// code blocks, eliminating any "unreachable" code. This would result in +// a smaller Driverlib, thus producing a smaller final application size, but +// at the cost of limiting the Driverlib binary to a specific Stellaris +// silicon revision. +// +//***************************************************************************** +#ifndef DEVICE_IS_SANDSTORM +#define DEVICE_IS_SANDSTORM \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_VER_MASK) == SYSCTL_DID0_VER_0) || \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_VER_MASK) == SYSCTL_DID0_VER_1) && \ + ((HWREG(SYSCTL_DID0) & SYSCTL_DID0_CLASS_MASK) == \ + SYSCTL_DID0_CLASS_SANDSTORM))) +#endif + +#ifndef DEVICE_IS_FURY +#define DEVICE_IS_FURY \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_VER_MASK) == SYSCTL_DID0_VER_1) && \ + ((HWREG(SYSCTL_DID0) & SYSCTL_DID0_CLASS_MASK) == \ + SYSCTL_DID0_CLASS_FURY)) +#endif + +#ifndef DEVICE_IS_REVA2 +#define DEVICE_IS_REVA2 \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MAJ_MASK) == SYSCTL_DID0_MAJ_A) && \ + ((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MIN_MASK) == SYSCTL_DID0_MIN_2)) +#endif + +#ifndef DEVICE_IS_REVC1 +#define DEVICE_IS_REVC1 \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MAJ_MASK) == SYSCTL_DID0_MAJ_C) && \ + ((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MIN_MASK) == SYSCTL_DID0_MIN_1)) +#endif + +#ifndef DEVICE_IS_REVC2 +#define DEVICE_IS_REVC2 \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MAJ_MASK) == SYSCTL_DID0_MAJ_C) && \ + ((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MIN_MASK) == SYSCTL_DID0_MIN_2)) +#endif + +#endif // __HW_TYPES_H__ diff --git a/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_uart.h b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_uart.h new file mode 100644 index 000000000..e5bb1c47e --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_uart.h @@ -0,0 +1,241 @@ +//***************************************************************************** +// +// hw_uart.h - Macros and defines used when accessing the UART hardware +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_UART_H__ +#define __HW_UART_H__ + +//***************************************************************************** +// +// UART Register Offsets. +// +//***************************************************************************** +#define UART_O_DR 0x00000000 // Data Register +#define UART_O_RSR 0x00000004 // Receive Status Register (read) +#define UART_O_ECR 0x00000004 // Error Clear Register (write) +#define UART_O_FR 0x00000018 // Flag Register (read only) +#define UART_O_IBRD 0x00000024 // Integer Baud Rate Divisor Reg +#define UART_O_FBRD 0x00000028 // Fractional Baud Rate Divisor Reg +#define UART_O_LCR_H 0x0000002C // Line Control Register, HIGH byte +#define UART_O_CTL 0x00000030 // Control Register +#define UART_O_IFLS 0x00000034 // Interrupt FIFO Level Select Reg +#define UART_O_IM 0x00000038 // Interrupt Mask Set/Clear Reg +#define UART_O_RIS 0x0000003C // Raw Interrupt Status Register +#define UART_O_MIS 0x00000040 // Masked Interrupt Status Register +#define UART_O_ICR 0x00000044 // Interrupt Clear Register +#define UART_O_PeriphID4 0x00000FD0 // +#define UART_O_PeriphID5 0x00000FD4 // +#define UART_O_PeriphID6 0x00000FD8 // +#define UART_O_PeriphID7 0x00000FDC // +#define UART_O_PeriphID0 0x00000FE0 // +#define UART_O_PeriphID1 0x00000FE4 // +#define UART_O_PeriphID2 0x00000FE8 // +#define UART_O_PeriphID3 0x00000FEC // +#define UART_O_PCellID0 0x00000FF0 // +#define UART_O_PCellID1 0x00000FF4 // +#define UART_O_PCellID2 0x00000FF8 // +#define UART_O_PCellID3 0x00000FFC // + +//***************************************************************************** +// +// Data Register bits +// +//***************************************************************************** +#define UART_DR_OE 0x00000800 // Overrun Error +#define UART_DR_BE 0x00000400 // Break Error +#define UART_DR_PE 0x00000200 // Parity Error +#define UART_DR_FE 0x00000100 // Framing Error +#define UART_DR_DATA_MASK 0x000000FF // UART data + +//***************************************************************************** +// +// Receive Status Register bits +// +//***************************************************************************** +#define UART_RSR_OE 0x00000008 // Overrun Error +#define UART_RSR_BE 0x00000004 // Break Error +#define UART_RSR_PE 0x00000002 // Parity Error +#define UART_RSR_FE 0x00000001 // Framing Error + +//***************************************************************************** +// +// Flag Register bits +// +//***************************************************************************** +#define UART_FR_TXFE 0x00000080 // TX FIFO Empty +#define UART_FR_RXFF 0x00000040 // RX FIFO Full +#define UART_FR_TXFF 0x00000020 // TX FIFO Full +#define UART_FR_RXFE 0x00000010 // RX FIFO Empty +#define UART_FR_BUSY 0x00000008 // UART Busy + +//***************************************************************************** +// +// Integer baud-rate divisor +// +//***************************************************************************** +#define UART_IBRD_DIVINT_MASK 0x0000FFFF // Integer baud-rate divisor + +//***************************************************************************** +// +// Fractional baud-rate divisor +// +//***************************************************************************** +#define UART_FBRD_DIVFRAC_MASK 0x0000003F // Fractional baud-rate divisor + +//***************************************************************************** +// +// Line Control Register High bits +// +//***************************************************************************** +#define UART_LCR_H_SPS 0x00000080 // Stick Parity Select +#define UART_LCR_H_WLEN 0x00000060 // Word length +#define UART_LCR_H_WLEN_8 0x00000060 // 8 bit data +#define UART_LCR_H_WLEN_7 0x00000040 // 7 bit data +#define UART_LCR_H_WLEN_6 0x00000020 // 6 bit data +#define UART_LCR_H_WLEN_5 0x00000000 // 5 bit data +#define UART_LCR_H_FEN 0x00000010 // Enable FIFO +#define UART_LCR_H_STP2 0x00000008 // Two Stop Bits Select +#define UART_LCR_H_EPS 0x00000004 // Even Parity Select +#define UART_LCR_H_PEN 0x00000002 // Parity Enable +#define UART_LCR_H_BRK 0x00000001 // Send Break + +//***************************************************************************** +// +// Control Register bits +// +//***************************************************************************** +#define UART_CTL_RXE 0x00000200 // Receive Enable +#define UART_CTL_TXE 0x00000100 // Transmit Enable +#define UART_CTL_LBE 0x00000080 // Loopback Enable +#define UART_CTL_SIRLP 0x00000004 // SIR (IrDA) Low Power Enable +#define UART_CTL_SIREN 0x00000002 // SIR (IrDA) Enable +#define UART_CTL_UARTEN 0x00000001 // UART Enable + +//***************************************************************************** +// +// Interrupt FIFO Level Select Register bits +// +//***************************************************************************** +#define UART_IFLS_RX1_8 0x00000000 // 1/8 Full +#define UART_IFLS_RX2_8 0x00000010 // 1/4 Full +#define UART_IFLS_RX4_8 0x00000020 // 1/2 Full +#define UART_IFLS_RX6_8 0x00000030 // 3/4 Full +#define UART_IFLS_RX7_8 0x00000040 // 7/8 Full +#define UART_IFLS_TX1_8 0x00000000 // 1/8 Full +#define UART_IFLS_TX2_8 0x00000001 // 1/4 Full +#define UART_IFLS_TX4_8 0x00000002 // 1/2 Full +#define UART_IFLS_TX6_8 0x00000003 // 3/4 Full +#define UART_IFLS_TX7_8 0x00000004 // 7/8 Full + +//***************************************************************************** +// +// Interrupt Mask Set/Clear Register bits +// +//***************************************************************************** +#define UART_IM_OEIM 0x00000400 // Overrun Error Interrupt Mask +#define UART_IM_BEIM 0x00000200 // Break Error Interrupt Mask +#define UART_IM_PEIM 0x00000100 // Parity Error Interrupt Mask +#define UART_IM_FEIM 0x00000080 // Framing Error Interrupt Mask +#define UART_IM_RTIM 0x00000040 // Receive Timeout Interrupt Mask +#define UART_IM_TXIM 0x00000020 // Transmit Interrupt Mask +#define UART_IM_RXIM 0x00000010 // Receive Interrupt Mask + +//***************************************************************************** +// +// Raw Interrupt Status Register +// +//***************************************************************************** +#define UART_RIS_OERIS 0x00000400 // Overrun Error Interrupt Status +#define UART_RIS_BERIS 0x00000200 // Break Error Interrupt Status +#define UART_RIS_PERIS 0x00000100 // Parity Error Interrupt Status +#define UART_RIS_FERIS 0x00000080 // Framing Error Interrupt Status +#define UART_RIS_RTRIS 0x00000040 // Receive Timeout Interrupt Status +#define UART_RIS_TXRIS 0x00000020 // Transmit Interrupt Status +#define UART_RIS_RXRIS 0x00000010 // Receive Interrupt Status + +//***************************************************************************** +// +// Masked Interrupt Status Register +// +//***************************************************************************** +#define UART_MIS_OEMIS 0x00000400 // Overrun Error Interrupt Status +#define UART_MIS_BEMIS 0x00000200 // Break Error Interrupt Status +#define UART_MIS_PEMIS 0x00000100 // Parity Error Interrupt Status +#define UART_MIS_FEMIS 0x00000080 // Framing Error Interrupt Status +#define UART_MIS_RTMIS 0x00000040 // Receive Timeout Interrupt Status +#define UART_MIS_TXMIS 0x00000020 // Transmit Interrupt Status +#define UART_MIS_RXMIS 0x00000010 // Receive Interrupt Status + +//***************************************************************************** +// +// Interrupt Clear Register bits +// +//***************************************************************************** +#define UART_ICR_OEIC 0x00000400 // Overrun Error Interrupt Clear +#define UART_ICR_BEIC 0x00000200 // Break Error Interrupt Clear +#define UART_ICR_PEIC 0x00000100 // Parity Error Interrupt Clear +#define UART_ICR_FEIC 0x00000080 // Framing Error Interrupt Clear +#define UART_ICR_RTIC 0x00000040 // Receive Timeout Interrupt Clear +#define UART_ICR_TXIC 0x00000020 // Transmit Interrupt Clear +#define UART_ICR_RXIC 0x00000010 // Receive Interrupt Clear + +#define UART_RSR_ANY (UART_RSR_OE | \ + UART_RSR_BE | \ + UART_RSR_PE | \ + UART_RSR_FE) + +//***************************************************************************** +// +// Reset Values for UART Registers. +// +//***************************************************************************** +#define UART_RV_DR 0x00000000 +#define UART_RV_RSR 0x00000000 +#define UART_RV_ECR 0x00000000 +#define UART_RV_FR 0x00000090 +#define UART_RV_IBRD 0x00000000 +#define UART_RV_FBRD 0x00000000 +#define UART_RV_LCR_H 0x00000000 +#define UART_RV_CTL 0x00000300 +#define UART_RV_IFLS 0x00000012 +#define UART_RV_IM 0x00000000 +#define UART_RV_RIS 0x00000000 +#define UART_RV_MIS 0x00000000 +#define UART_RV_ICR 0x00000000 +#define UART_RV_PeriphID4 0x00000000 +#define UART_RV_PeriphID5 0x00000000 +#define UART_RV_PeriphID6 0x00000000 +#define UART_RV_PeriphID7 0x00000000 +#define UART_RV_PeriphID0 0x00000011 +#define UART_RV_PeriphID1 0x00000000 +#define UART_RV_PeriphID2 0x00000018 +#define UART_RV_PeriphID3 0x00000001 +#define UART_RV_PCellID0 0x0000000D +#define UART_RV_PCellID1 0x000000F0 +#define UART_RV_PCellID2 0x00000005 +#define UART_RV_PCellID3 0x000000B1 + +#endif // __HW_UART_H__ diff --git a/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_watchdog.h b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_watchdog.h new file mode 100644 index 000000000..7a3b5a8d9 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/hw_watchdog.h @@ -0,0 +1,116 @@ +//***************************************************************************** +// +// hw_watchdog.h - Macros used when accessing the Watchdog Timer hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_WATCHDOG_H__ +#define __HW_WATCHDOG_H__ + +//***************************************************************************** +// +// The following define the offsets of the Watchdog Timer registers. +// +//***************************************************************************** +#define WDT_O_LOAD 0x00000000 // Load register +#define WDT_O_VALUE 0x00000004 // Current value register +#define WDT_O_CTL 0x00000008 // Control register +#define WDT_O_ICR 0x0000000C // Interrupt clear register +#define WDT_O_RIS 0x00000010 // Raw interrupt status register +#define WDT_O_MIS 0x00000014 // Masked interrupt status register +#define WDT_O_TEST 0x00000418 // Test register +#define WDT_O_LOCK 0x00000C00 // Lock register +#define WDT_O_PeriphID4 0x00000FD0 // +#define WDT_O_PeriphID5 0x00000FD4 // +#define WDT_O_PeriphID6 0x00000FD8 // +#define WDT_O_PeriphID7 0x00000FDC // +#define WDT_O_PeriphID0 0x00000FE0 // +#define WDT_O_PeriphID1 0x00000FE4 // +#define WDT_O_PeriphID2 0x00000FE8 // +#define WDT_O_PeriphID3 0x00000FEC // +#define WDT_O_PCellID0 0x00000FF0 // +#define WDT_O_PCellID1 0x00000FF4 // +#define WDT_O_PCellID2 0x00000FF8 // +#define WDT_O_PCellID3 0x00000FFC // + +//***************************************************************************** +// +// The following define the bit fields in the WDT_CTL register. +// +//***************************************************************************** +#define WDT_CTL_RESEN 0x00000002 // Enable reset output +#define WDT_CTL_INTEN 0x00000001 // Enable the WDT counter and int + +//***************************************************************************** +// +// The following define the bit fields in the WDT_ISR, WDT_RIS, and WDT_MIS +// registers. +// +//***************************************************************************** +#define WDT_INT_TIMEOUT 0x00000001 // Watchdog timer expired + +//***************************************************************************** +// +// The following define the bit fields in the WDT_TEST register. +// +//***************************************************************************** +#define WDT_TEST_STALL 0x00000100 // Watchdog stall enable +#ifndef DEPRECATED +#define WDT_TEST_STALL_EN 0x00000100 // Watchdog stall enable +#endif + +//***************************************************************************** +// +// The following define the bit fields in the WDT_LOCK register. +// +//***************************************************************************** +#define WDT_LOCK_LOCKED 0x00000001 // Watchdog timer is locked +#define WDT_LOCK_UNLOCKED 0x00000000 // Watchdog timer is unlocked +#define WDT_LOCK_UNLOCK 0x1ACCE551 // Unlocks the watchdog timer + +//***************************************************************************** +// +// The following define the reset values for the WDT registers. +// +//***************************************************************************** +#define WDT_RV_LOAD 0xFFFFFFFF // Load register +#define WDT_RV_VALUE 0xFFFFFFFF // Current value register +#define WDT_RV_CTL 0x00000000 // Control register +#define WDT_RV_RIS 0x00000000 // Raw interrupt status register +#define WDT_RV_MIS 0x00000000 // Masked interrupt status register +#define WDT_RV_LOCK 0x00000000 // Lock register +#define WDT_RV_PeriphID4 0x00000000 // +#define WDT_RV_PeriphID5 0x00000000 // +#define WDT_RV_PeriphID6 0x00000000 // +#define WDT_RV_PeriphID7 0x00000000 // +#define WDT_RV_PeriphID0 0x00000005 // +#define WDT_RV_PeriphID1 0x00000018 // +#define WDT_RV_PeriphID2 0x00000018 // +#define WDT_RV_PeriphID3 0x00000001 // +#define WDT_RV_PCellID0 0x0000000D // +#define WDT_RV_PCellID1 0x000000F0 // +#define WDT_RV_PCellID2 0x00000005 // +#define WDT_RV_PCellID3 0x000000B1 // + +#endif // __HW_WATCHDOG_H__ diff --git a/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/i2c.h b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/i2c.h new file mode 100644 index 000000000..46a28eeb5 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/i2c.h @@ -0,0 +1,137 @@ +//***************************************************************************** +// +// i2c.h - Prototypes for the I2C Driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __I2C_H__ +#define __I2C_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Defines for the API. +// +//***************************************************************************** +//***************************************************************************** +// +// Interrupt defines. +// +//***************************************************************************** +#define I2C_INT_MASTER 0x00000001 +#define I2C_INT_SLAVE 0x00000002 + +//***************************************************************************** +// +// I2C Master commands. +// +//***************************************************************************** +#define I2C_MASTER_CMD_SINGLE_SEND \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_SINGLE_RECEIVE \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_START \ + (I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_CONT \ + (I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_FINISH \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_ERROR_STOP \ + (I2C_MASTER_CS_STOP) +#define I2C_MASTER_CMD_BURST_RECEIVE_START \ + (I2C_MASTER_CS_ACK | I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_RECEIVE_CONT \ + (I2C_MASTER_CS_ACK | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_RECEIVE_FINISH \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_RUN) + +//***************************************************************************** +// +// I2C Master error status. +// +//***************************************************************************** +#define I2C_MASTER_ERR_NONE 0 +#define I2C_MASTER_ERR_ADDR_ACK 0x00000004 +#define I2C_MASTER_ERR_DATA_ACK 0x00000008 +#define I2C_MASTER_ERR_ARB_LOST 0x00000010 + +//***************************************************************************** +// +// I2C Slave action requests +// +//***************************************************************************** +#define I2C_SLAVE_ACT_NONE 0 +#define I2C_SLAVE_ACT_RREQ 0x00000001 // Master has sent data +#define I2C_SLAVE_ACT_TREQ 0x00000002 // Master has requested data + +//***************************************************************************** +// Miscellaneous I2C driver definitions. +//***************************************************************************** +#define I2C_MASTER_MAX_RETRIES 1000 // Number of retries + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void I2CIntRegister(unsigned long ulBase, void(fnHandler)(void)); +extern void I2CIntUnregister(unsigned long ulBase); +extern tBoolean I2CMasterBusBusy(unsigned long ulBase); +extern tBoolean I2CMasterBusy(unsigned long ulBase); +extern void I2CMasterControl(unsigned long ulBase, unsigned long ulCmd); +extern unsigned long I2CMasterDataGet(unsigned long ulBase); +extern void I2CMasterDataPut(unsigned long ulBase, unsigned char ucData); +extern void I2CMasterDisable(unsigned long ulBase); +extern void I2CMasterEnable(unsigned long ulBase); +extern unsigned long I2CMasterErr(unsigned long ulBase); +extern void I2CMasterInit(unsigned long ulBase, tBoolean bFast); +extern void I2CMasterIntClear(unsigned long ulBase); +extern void I2CMasterIntDisable(unsigned long ulBase); +extern void I2CMasterIntEnable(unsigned long ulBase); +extern tBoolean I2CMasterIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void I2CMasterSlaveAddrSet(unsigned long ulBase, + unsigned char ucSlaveAddr, + tBoolean bReceive); +extern unsigned long I2CSlaveDataGet(unsigned long ulBase); +extern void I2CSlaveDataPut(unsigned long ulBase, unsigned char ucData); +extern void I2CSlaveDisable(unsigned long ulBase); +extern void I2CSlaveEnable(unsigned long ulBase); +extern void I2CSlaveInit(unsigned long ulBase, unsigned char ucSlaveAddr); +extern void I2CSlaveIntClear(unsigned long ulBase); +extern void I2CSlaveIntDisable(unsigned long ulBase); +extern void I2CSlaveIntEnable(unsigned long ulBase); +extern tBoolean I2CSlaveIntStatus(unsigned long ulBase, tBoolean bMasked); +extern unsigned long I2CSlaveStatus(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __I2C_H__ diff --git a/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/interrupt.h b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/interrupt.h new file mode 100644 index 000000000..1ce70f16b --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/interrupt.h @@ -0,0 +1,57 @@ +//***************************************************************************** +// +// interrupt.h - Prototypes for the NVIC Interrupt Controller Driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __INTERRUPT_H__ +#define __INTERRUPT_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void IntMasterEnable(void); +extern void IntMasterDisable(void); +extern void IntRegister(unsigned long ulInterrupt, void (*pfnHandler)(void)); +extern void IntUnregister(unsigned long ulInterrupt); +extern void IntPriorityGroupingSet(unsigned long ulBits); +extern unsigned long IntPriorityGroupingGet(void); +extern void IntPrioritySet(unsigned long ulInterrupt, + unsigned char ucPriority); +extern long IntPriorityGet(unsigned long ulInterrupt); +extern void IntEnable(unsigned long ulInterrupt); +extern void IntDisable(unsigned long ulInterrupt); + +#ifdef __cplusplus +} +#endif + +#endif // __INTERRUPT_H__ diff --git a/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/lmi_flash.h b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/lmi_flash.h new file mode 100644 index 000000000..75d30c41c --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/lmi_flash.h @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// flash.h - Prototypes for the flash driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __FLASH_H__ +#define __FLASH_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to FlashProtectSet(), and returned by +// FlashProtectGet(). +// +//***************************************************************************** +typedef enum +{ + FlashReadWrite, // Flash can be read and written + FlashReadOnly, // Flash can only be read + FlashExecuteOnly // Flash can only be executed +} +tFlashProtection; + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern unsigned long FlashUsecGet(void); +extern void FlashUsecSet(unsigned long ulClocks); +extern long FlashErase(unsigned long ulAddress); +extern long FlashProgram(unsigned long *pulData, unsigned long ulAddress, + unsigned long ulCount); +extern tFlashProtection FlashProtectGet(unsigned long ulAddress); +extern long FlashProtectSet(unsigned long ulAddress, + tFlashProtection eProtect); +extern long FlashProtectSave(void); +extern long FlashUserGet(unsigned long *pulUser0, unsigned long *pulUser1); +extern long FlashUserSet(unsigned long ulUser0, unsigned long ulUser1); +extern long FlashUserSave(void); +extern void FlashIntRegister(void (*pfnHandler)(void)); +extern void FlashIntUnregister(void); +extern void FlashIntEnable(unsigned long ulIntFlags); +extern void FlashIntDisable(unsigned long ulIntFlags); +extern unsigned long FlashIntGetStatus(tBoolean bMasked); +extern void FlashIntClear(unsigned long ulIntFlags); + +#ifdef __cplusplus +} +#endif + +#endif // __FLASH_H__ diff --git a/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/lmi_timer.h b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/lmi_timer.h new file mode 100644 index 000000000..85b3160ab --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/lmi_timer.h @@ -0,0 +1,137 @@ +//***************************************************************************** +// +// timer.h - Prototypes for the timer module +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __TIMER_H__ +#define __TIMER_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to TimerConfigure as the ulConfig parameter. +// +//***************************************************************************** +#define TIMER_CFG_32_BIT_OS 0x00000001 // 32-bit one-shot timer +#define TIMER_CFG_32_BIT_PER 0x00000002 // 32-bit periodic timer +#define TIMER_CFG_32_RTC 0x01000000 // 32-bit RTC timer +#define TIMER_CFG_16_BIT_PAIR 0x04000000 // Two 16-bit timers +#define TIMER_CFG_A_ONE_SHOT 0x00000001 // Timer A one-shot timer +#define TIMER_CFG_A_PERIODIC 0x00000002 // Timer A periodic timer +#define TIMER_CFG_A_CAP_COUNT 0x00000003 // Timer A event counter +#define TIMER_CFG_A_CAP_TIME 0x00000007 // Timer A event timer +#define TIMER_CFG_A_PWM 0x0000000A // Timer A PWM output +#define TIMER_CFG_B_ONE_SHOT 0x00000100 // Timer B one-shot timer +#define TIMER_CFG_B_PERIODIC 0x00000200 // Timer B periodic timer +#define TIMER_CFG_B_CAP_COUNT 0x00000300 // Timer B event counter +#define TIMER_CFG_B_CAP_TIME 0x00000700 // Timer B event timer +#define TIMER_CFG_B_PWM 0x00000A00 // Timer B PWM output + +//***************************************************************************** +// +// Values that can be passed to TimerIntEnable, TimerIntDisable, and +// TimerIntClear as the ulIntFlags parameter, and returned from TimerIntStatus. +// +//***************************************************************************** +#define TIMER_CAPB_EVENT 0x00000400 // CaptureB event interrupt +#define TIMER_CAPB_MATCH 0x00000200 // CaptureB match interrupt +#define TIMER_TIMB_TIMEOUT 0x00000100 // TimerB time out interrupt +#define TIMER_RTC_MATCH 0x00000008 // RTC interrupt mask +#define TIMER_CAPA_EVENT 0x00000004 // CaptureA event interrupt +#define TIMER_CAPA_MATCH 0x00000002 // CaptureA match interrupt +#define TIMER_TIMA_TIMEOUT 0x00000001 // TimerA time out interrupt + +//***************************************************************************** +// +// Values that can be passed to TimerControlEvent as the ulEvent parameter. +// +//***************************************************************************** +#define TIMER_EVENT_POS_EDGE 0x00000000 // Count positive edges +#define TIMER_EVENT_NEG_EDGE 0x00000404 // Count negative edges +#define TIMER_EVENT_BOTH_EDGES 0x00000C0C // Count both edges + +//***************************************************************************** +// +// Values that can be passed to most of the timer APIs as the ulTimer +// parameter. +// +//***************************************************************************** +#define TIMER_A 0x000000ff // Timer A +#define TIMER_B 0x0000ff00 // Timer B +#define TIMER_BOTH 0x0000ffff // Timer Both + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void TimerEnable(unsigned long ulBase, unsigned long ulTimer); +extern void TimerDisable(unsigned long ulBase, unsigned long ulTimer); +extern void TimerConfigure(unsigned long ulBase, unsigned long ulConfig); +extern void TimerControlLevel(unsigned long ulBase, unsigned long ulTimer, + tBoolean bInvert); +extern void TimerControlTrigger(unsigned long ulBase, unsigned long ulTimer, + tBoolean bEnable); +extern void TimerControlEvent(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulEvent); +extern void TimerControlStall(unsigned long ulBase, unsigned long ulTimer, + tBoolean bStall); +extern void TimerRTCEnable(unsigned long ulBase); +extern void TimerRTCDisable(unsigned long ulBase); +extern void TimerPrescaleSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerPrescaleGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerPrescaleMatchSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerPrescaleMatchGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerLoadSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerLoadGet(unsigned long ulBase, unsigned long ulTimer); +extern unsigned long TimerValueGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerMatchSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerMatchGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerIntRegister(unsigned long ulBase, unsigned long ulTimer, + void (*pfnHandler)(void)); +extern void TimerIntUnregister(unsigned long ulBase, unsigned long ulTimer); +extern void TimerIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void TimerIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long TimerIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void TimerIntClear(unsigned long ulBase, unsigned long ulIntFlags); +extern void TimerQuiesce(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __TIMER_H__ diff --git a/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/osram128x64x4.c b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/osram128x64x4.c new file mode 100644 index 000000000..3353a82e6 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/osram128x64x4.c @@ -0,0 +1,933 @@ +//***************************************************************************** +// +// osram128x64x4.c - Driver for the OSRAM 128x64x4 graphical OLED display. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup ek_lm3sx965_api +//! @{ +// +//***************************************************************************** + +#include "hw_ssi.h" +#include "hw_memmap.h" +#include "hw_sysctl.h" +#include "hw_types.h" +#include "debug.h" +#include "gpio.h" +#include "ssi.h" +#include "sysctl.h" +#include "osram128x64x4.h" + +//***************************************************************************** +// +// Flag to indicate if SSI port is enabled for OSRAM usage. +// +//***************************************************************************** +static volatile tBoolean g_bSSIEnabled = false; + +//***************************************************************************** +// +// Define the OSRAM 128x64x4 Remap Setting(s). This will be used in +// several places in the code to switch between vertical and horizontal +// address incrementing. +// +// The Remap Command (0xA0) takes one 8-bit parameter. The parameter is +// defined as follows. +// +// Bit 7: Reserved +// Bit 6: Disable(0)/Enable(1) COM Split Odd Even +// When enabled, the COM signals are split Odd on one side, even on +// the other. Otherwise, they are split 0-39 on one side, 40-79 on +// the other. +// Bit 5: Reserved +// Bit 4: Disable(0)/Enable(1) COM Remap +// When Enabled, ROW 0-79 map to COM 79-0 (i.e. reverse row order) +// Bit 3: Reserved +// Bit 2: Horizontal(0)/Vertical(1) Address Increment +// When set, data RAM address will increment along the column rather +// than along the row. +// Bit 1: Disable(0)/Enable(1) Nibble Remap +// When enabled, the upper and lower nibbles in the DATA bus for access +// to the data RAM are swapped. +// Bit 0: Disable(0)/Enable(1) Column Address Remap +// When enabled, DATA RAM columns 0-63 are remapped to Segment Columns +// 127-0. +// +//***************************************************************************** +#define OSRAM_INIT_REMAP 0x52 +#define OSRAM_INIT_OFFSET 0x4C +static const unsigned char g_pucOSRAM128x64x4VerticalInc[] = { 0xA0, 0x56 }; +static const unsigned char g_pucOSRAM128x64x4HorizontalInc[] = { 0xA0, 0x52 }; + +//***************************************************************************** +// +// A 5x7 font (in a 6x8 cell, where the sixth column is omitted from this +// table) for displaying text on the OLED display. The data is organized as +// bytes from the left column to the right column, with each byte containing +// the top row in the LSB and the bottom row in the MSB. +// +// Note: This is the same font data that is used in the EK-LM3S811 +// osram96x16x1 driver. The single bit-per-pixel is expaned in the StringDraw +// function to the appropriate four bit-per-pixel gray scale format. +// +//***************************************************************************** +static const unsigned char g_pucFont[96][5] = +{ + { 0x00, 0x00, 0x00, 0x00, 0x00 }, // " " + { 0x00, 0x00, 0x4f, 0x00, 0x00 }, // ! + { 0x00, 0x07, 0x00, 0x07, 0x00 }, // " + { 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // # + { 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $ + { 0x23, 0x13, 0x08, 0x64, 0x62 }, // % + { 0x36, 0x49, 0x55, 0x22, 0x50 }, // & + { 0x00, 0x05, 0x03, 0x00, 0x00 }, // ' + { 0x00, 0x1c, 0x22, 0x41, 0x00 }, // ( + { 0x00, 0x41, 0x22, 0x1c, 0x00 }, // ) + { 0x14, 0x08, 0x3e, 0x08, 0x14 }, // * + { 0x08, 0x08, 0x3e, 0x08, 0x08 }, // + + { 0x00, 0x50, 0x30, 0x00, 0x00 }, // , + { 0x08, 0x08, 0x08, 0x08, 0x08 }, // - + { 0x00, 0x60, 0x60, 0x00, 0x00 }, // . + { 0x20, 0x10, 0x08, 0x04, 0x02 }, // / + { 0x3e, 0x51, 0x49, 0x45, 0x3e }, // 0 + { 0x00, 0x42, 0x7f, 0x40, 0x00 }, // 1 + { 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2 + { 0x21, 0x41, 0x45, 0x4b, 0x31 }, // 3 + { 0x18, 0x14, 0x12, 0x7f, 0x10 }, // 4 + { 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5 + { 0x3c, 0x4a, 0x49, 0x49, 0x30 }, // 6 + { 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7 + { 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8 + { 0x06, 0x49, 0x49, 0x29, 0x1e }, // 9 + { 0x00, 0x36, 0x36, 0x00, 0x00 }, // : + { 0x00, 0x56, 0x36, 0x00, 0x00 }, // ; + { 0x08, 0x14, 0x22, 0x41, 0x00 }, // < + { 0x14, 0x14, 0x14, 0x14, 0x14 }, // = + { 0x00, 0x41, 0x22, 0x14, 0x08 }, // > + { 0x02, 0x01, 0x51, 0x09, 0x06 }, // ? + { 0x32, 0x49, 0x79, 0x41, 0x3e }, // @ + { 0x7e, 0x11, 0x11, 0x11, 0x7e }, // A + { 0x7f, 0x49, 0x49, 0x49, 0x36 }, // B + { 0x3e, 0x41, 0x41, 0x41, 0x22 }, // C + { 0x7f, 0x41, 0x41, 0x22, 0x1c }, // D + { 0x7f, 0x49, 0x49, 0x49, 0x41 }, // E + { 0x7f, 0x09, 0x09, 0x09, 0x01 }, // F + { 0x3e, 0x41, 0x49, 0x49, 0x7a }, // G + { 0x7f, 0x08, 0x08, 0x08, 0x7f }, // H + { 0x00, 0x41, 0x7f, 0x41, 0x00 }, // I + { 0x20, 0x40, 0x41, 0x3f, 0x01 }, // J + { 0x7f, 0x08, 0x14, 0x22, 0x41 }, // K + { 0x7f, 0x40, 0x40, 0x40, 0x40 }, // L + { 0x7f, 0x02, 0x0c, 0x02, 0x7f }, // M + { 0x7f, 0x04, 0x08, 0x10, 0x7f }, // N + { 0x3e, 0x41, 0x41, 0x41, 0x3e }, // O + { 0x7f, 0x09, 0x09, 0x09, 0x06 }, // P + { 0x3e, 0x41, 0x51, 0x21, 0x5e }, // Q + { 0x7f, 0x09, 0x19, 0x29, 0x46 }, // R + { 0x46, 0x49, 0x49, 0x49, 0x31 }, // S + { 0x01, 0x01, 0x7f, 0x01, 0x01 }, // T + { 0x3f, 0x40, 0x40, 0x40, 0x3f }, // U + { 0x1f, 0x20, 0x40, 0x20, 0x1f }, // V + { 0x3f, 0x40, 0x38, 0x40, 0x3f }, // W + { 0x63, 0x14, 0x08, 0x14, 0x63 }, // X + { 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y + { 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z + { 0x00, 0x7f, 0x41, 0x41, 0x00 }, // [ + { 0x02, 0x04, 0x08, 0x10, 0x20 }, // "\" + { 0x00, 0x41, 0x41, 0x7f, 0x00 }, // ] + { 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^ + { 0x40, 0x40, 0x40, 0x40, 0x40 }, // _ + { 0x00, 0x01, 0x02, 0x04, 0x00 }, // ` + { 0x20, 0x54, 0x54, 0x54, 0x78 }, // a + { 0x7f, 0x48, 0x44, 0x44, 0x38 }, // b + { 0x38, 0x44, 0x44, 0x44, 0x20 }, // c + { 0x38, 0x44, 0x44, 0x48, 0x7f }, // d + { 0x38, 0x54, 0x54, 0x54, 0x18 }, // e + { 0x08, 0x7e, 0x09, 0x01, 0x02 }, // f + { 0x0c, 0x52, 0x52, 0x52, 0x3e }, // g + { 0x7f, 0x08, 0x04, 0x04, 0x78 }, // h + { 0x00, 0x44, 0x7d, 0x40, 0x00 }, // i + { 0x20, 0x40, 0x44, 0x3d, 0x00 }, // j + { 0x7f, 0x10, 0x28, 0x44, 0x00 }, // k + { 0x00, 0x41, 0x7f, 0x40, 0x00 }, // l + { 0x7c, 0x04, 0x18, 0x04, 0x78 }, // m + { 0x7c, 0x08, 0x04, 0x04, 0x78 }, // n + { 0x38, 0x44, 0x44, 0x44, 0x38 }, // o + { 0x7c, 0x14, 0x14, 0x14, 0x08 }, // p + { 0x08, 0x14, 0x14, 0x18, 0x7c }, // q + { 0x7c, 0x08, 0x04, 0x04, 0x08 }, // r + { 0x48, 0x54, 0x54, 0x54, 0x20 }, // s + { 0x04, 0x3f, 0x44, 0x40, 0x20 }, // t + { 0x3c, 0x40, 0x40, 0x20, 0x7c }, // u + { 0x1c, 0x20, 0x40, 0x20, 0x1c }, // v + { 0x3c, 0x40, 0x30, 0x40, 0x3c }, // w + { 0x44, 0x28, 0x10, 0x28, 0x44 }, // x + { 0x0c, 0x50, 0x50, 0x50, 0x3c }, // y + { 0x44, 0x64, 0x54, 0x4c, 0x44 }, // z + { 0x00, 0x08, 0x36, 0x41, 0x00 }, // { + { 0x00, 0x00, 0x7f, 0x00, 0x00 }, // | + { 0x00, 0x41, 0x36, 0x08, 0x00 }, // } + { 0x02, 0x01, 0x02, 0x04, 0x02 }, // ~ + { 0x02, 0x01, 0x02, 0x04, 0x02 }, // ~ +}; + +//***************************************************************************** +// +// The sequence of commands used to initialize the SSD0303 controller. Each +// command is described as follows: there is a byte specifying the number of +// bytes in the command sequence, followed by that many bytes of command data. +// Note: This initialization sequence is derived from OSRAM App Note AN018. +// +//***************************************************************************** +static const unsigned char g_pucOSRAM128x64x4Init[] = +{ + // + // Column Address + // + 4, 0x15, 0, 63, 0xe3, + + // + // Row Address + // + 4, 0x75, 0, 63, 0xe3, + + // + // Contrast Control + // + 3, 0x81, 50, 0xe3, + + // + // Half Current Range + // + 2, 0x85, 0xe3, + + // + // Display Re-map + // + 3, 0xA0, OSRAM_INIT_REMAP, 0xe3, + + // + // Display Start Line + // + 3, 0xA1, 0, 0xe3, + + // + // Display Offset + // + 3, 0xA2, OSRAM_INIT_OFFSET, 0xe3, + + // + // Display Mode Normal + // + 2, 0xA4, 0xe3, + + // + // Multiplex Ratio + // + 3, 0xA8, 63, 0xe3, + + // + // Phase Length + // + 3, 0xB1, 0x22, 0xe3, + + // + // Row Period + // + 3, 0xB2, 70, 0xe3, + + // + // Display Clock Divide + // + 3, 0xB3, 0xF1, 0xe3, + + // + // VSL + // + 3, 0xBF, 0x0D, 0xe3, + + // + // VCOMH + // + 3, 0xBE, 0x02, 0xe3, + + // + // VP + // + 3, 0xBC, 0x10, 0xe3, + + // + // Gamma + // + 10, 0xB8, 0x01, 0x11, 0x22, 0x32, 0x43, 0x54, 0x65, 0x76, 0xe3, + + // + // Set DC-DC + 3, 0xAD, 0x03, 0xe3, + + // + // Display ON/OFF + // + 2, 0xAF, 0xe3, +}; + +//***************************************************************************** +// +//! \internal +//! +//! Write a sequence of command bytes to the SSD0323 controller. +//! +//! The data is written in a polled fashion; this function will not return +//! until the entire byte sequence has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +OSRAMWriteCommand(const unsigned char *pucBuffer, unsigned long ulCount) +{ + unsigned long ulTemp; + + // + // Return iff SSI port is not enabled for OSRAM. + // + if(!g_bSSIEnabled) + { + return; + } + + // + // Clear the command/control bit to enable command mode. + // + GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_7, 0); + + // + // Loop while there are more bytes left to be transferred. + // + while(ulCount != 0) + { + // + // Write the next byte to the controller. + // + SSIDataPut(SSI0_BASE, *pucBuffer++); + + // + // Dummy read to drain the fifo and time the GPIO signal. + // + SSIDataGet(SSI0_BASE, &ulTemp); + + // + // Decrement the BYTE counter. + // + ulCount--; + } +} + +//***************************************************************************** +// +//! \internal +//! +//! Write a sequence of data bytes to the SSD0323 controller. +//! +//! The data is written in a polled fashion; this function will not return +//! until the entire byte sequence has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +OSRAMWriteData(const unsigned char *pucBuffer, unsigned long ulCount) +{ + unsigned long ulTemp; + + // + // Return iff SSI port is not enabled for OSRAM. + // + if(!g_bSSIEnabled) + { + return; + } + + // + // Set the command/control bit to enable data mode. + // + GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_PIN_7); + + // + // Loop while there are more bytes left to be transferred. + // + while(ulCount != 0) + { + // + // Write the next byte to the controller. + // + SSIDataPut(SSI0_BASE, *pucBuffer++); + + // + // Dummy read to drain the fifo and time the GPIO signal. + // + SSIDataGet(SSI0_BASE, &ulTemp); + + // + // Decrement the BYTE counter. + // + ulCount--; + } +} + +//***************************************************************************** +// +//! Clears the OLED display. +//! +//! This function will clear the display RAM. All pixels in the display will +//! be turned off. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Clear(void) +{ + static const unsigned char pucCommand1[] = { 0x15, 0, 63 }; + static const unsigned char pucCommand2[] = { 0x75, 0, 79 }; + unsigned long ulRow, ulColumn; + static unsigned char pucZeroBuffer[8] = { 0, 0, 0, 0, 0, 0, 0, 0}; + + // + // Set the window to fill the entire display. + // + OSRAMWriteCommand(pucCommand1, sizeof(pucCommand1)); + OSRAMWriteCommand(pucCommand2, sizeof(pucCommand2)); + OSRAMWriteCommand(g_pucOSRAM128x64x4VerticalInc, + sizeof(g_pucOSRAM128x64x4VerticalInc)); + + // + // In vertical address increment mode, loop through each column, filling + // each row with 0. + // + for(ulColumn = 0; ulColumn < (128/2); ulColumn++) + { + // + // 8 rows (bytes) per row of text. + // + for(ulRow = 0; ulRow < 80; ulRow += 8) + { + OSRAMWriteData(pucZeroBuffer, sizeof(pucZeroBuffer)); + } + } +} + +//***************************************************************************** +// +//! Displays a string on the OLED display. +//! +//! \param pcStr is a pointer to the string to display. +//! \param ulX is the horizontal position to display the string, specified in +//! columns from the left edge of the display. +//! \param ulY is the vertical position to display the string, specified in +//! rows from the top edge of the display. +//! \param ucLevel is the 4-bit grey scale value to be used for displayed text. +//! +//! This function will draw a string on the display. Only the ASCII characters +//! between 32 (space) and 126 (tilde) are supported; other characters will +//! result in random data being draw on the display (based on whatever appears +//! before/after the font in memory). The font is mono-spaced, so characters +//! such as "i" and "l" have more white space around them than characters such +//! as "m" or "w". +//! +//! If the drawing of the string reaches the right edge of the display, no more +//! characters will be drawn. Therefore, special care is not required to avoid +//! supplying a string that is "too long" to display. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \note Because the OLED display packs 2 pixels of data in a single byte, the +//! parameter \e ulX must be an even column number (e.g. 0, 2, 4, etc). +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4StringDraw(const char *pcStr, unsigned long ulX, + unsigned long ulY, unsigned char ucLevel) +{ + static unsigned char pucBuffer[8]; + unsigned long ulIdx1, ulIdx2; + unsigned char ucTemp; + + // + // Check the arguments. + // + ASSERT(ulX < 128); + ASSERT((ulX & 1) == 0); + ASSERT(ulY < 64); + ASSERT(ucLevel < 16); + + // + // Setup a window starting at the specified column and row, ending + // at the right edge of the display and 8 rows down (single character row). + // + pucBuffer[0] = 0x15; + pucBuffer[1] = ulX / 2; + pucBuffer[2] = 63; + OSRAMWriteCommand(pucBuffer, 3); + pucBuffer[0] = 0x75; + pucBuffer[1] = ulY; + pucBuffer[2] = ulY + 7; + OSRAMWriteCommand(pucBuffer, 3); + OSRAMWriteCommand(g_pucOSRAM128x64x4VerticalInc, + sizeof(g_pucOSRAM128x64x4VerticalInc)); + + // + // Loop while there are more characters in the string. + // + while(*pcStr != 0) + { + // + // Get a working copy of the current character and convert to an + // index into the character bit-map array. + // + ucTemp = *pcStr; + ucTemp &= 0x7F; + if(ucTemp < ' ') + { + ucTemp = ' '; + } + else + { + ucTemp -= ' '; + } + + // + // Build and display the character buffer. + // + for(ulIdx1 = 0; ulIdx1 < 3; ulIdx1++) + { + // + // Convert two columns of 1-bit font data into a single data + // byte column of 4-bit font data. + // + for(ulIdx2 = 0; ulIdx2 < 8; ulIdx2++) + { + pucBuffer[ulIdx2] = 0; + if(g_pucFont[ucTemp][ulIdx1*2] & (1 << ulIdx2)) + { + pucBuffer[ulIdx2] = ((ucLevel << 4) & 0xf0); + } + if((ulIdx1 < 2) && + (g_pucFont[ucTemp][ulIdx1*2+1] & (1 << ulIdx2))) + { + pucBuffer[ulIdx2] |= ((ucLevel << 0) & 0x0f); + } + } + + // + // If there is room, dump the single data byte column to the + // display. Otherwise, bail out. + // + if(ulX < 126) + { + OSRAMWriteData(pucBuffer, 8); + ulX += 2; + } + else + { + return; + } + } + + // + // Advance to the next character. + // + pcStr++; + } +} + +//***************************************************************************** +// +//! Displays an image on the OLED display. +//! +//! \param pucImage is a pointer to the image data. +//! \param ulX is the horizontal position to display this image, specified in +//! columns from the left edge of the display. +//! \param ulY is the vertical position to display this image, specified in +//! rows from the top of the display. +//! \param ulWidth is the width of the image, specified in columns. +//! \param ulHeight is the height of the image, specified in rows. +//! +//! This function will display a bitmap graphic on the display. Because of the +//! format of the display RAM, the starting column (/e ulX) and the number of +//! columns (/e ulWidth) must be an integer multiple of two. +//! +//! The image data is organized with the first row of image data appearing left +//! to right, followed immediately by the second row of image data. Each byte +//! contains the data for two columns in the current row, with the leftmost +//! column being contained in bits 7:4 and the rightmost column being contained +//! in bits 3:0. +//! +//! For example, an image six columns wide and seven scan lines tall would +//! be arranged as follows (showing how the twenty one bytes of the image would +//! appear on the display): +//! +//! \verbatim +//! +-------------------+-------------------+-------------------+ +//! | Byte 0 | Byte 1 | Byte 2 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 3 | Byte 4 | Byte 5 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 6 | Byte 7 | Byte 8 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 9 | Byte 10 | Byte 11 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 12 | Byte 13 | Byte 14 | +//! +---------+---------+---------+--3------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 15 | Byte 16 | Byte 17 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 18 | Byte 19 | Byte 20 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! \endverbatim +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by` +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4ImageDraw(const unsigned char *pucImage, unsigned long ulX, + unsigned long ulY, unsigned long ulWidth, + unsigned long ulHeight) +{ + static unsigned char pucBuffer[8]; + + // + // Check the arguments. + // + ASSERT(ulX < 128); + ASSERT((ulX & 1) == 0); + ASSERT(ulY < 64); + ASSERT((ulX + ulWidth) <= 128); + ASSERT((ulY + ulHeight) <= 64); + ASSERT((ulWidth & 1) == 0); + + // + // Setup a window starting at the specified column and row, and ending + // at the column + width and row+height. + // + pucBuffer[0] = 0x15; + pucBuffer[1] = ulX / 2; + pucBuffer[2] = (ulX + ulWidth - 2) / 2; + OSRAMWriteCommand(pucBuffer, 3); + pucBuffer[0] = 0x75; + pucBuffer[1] = ulY; + pucBuffer[2] = ulY + ulHeight - 1; + OSRAMWriteCommand(pucBuffer, 3); + OSRAMWriteCommand(g_pucOSRAM128x64x4HorizontalInc, + sizeof(g_pucOSRAM128x64x4HorizontalInc)); + + // + // Loop while there are more rows to display. + // + while(ulHeight--) + { + // + // Write this row of image data. + // + OSRAMWriteData(pucImage, (ulWidth / 2)); + + // + // Advance to the next row of the image. + // + pucImage += (ulWidth / 2); + } +} + +//***************************************************************************** +// +//! Enable the SSI component of the OLED display driver. +//! +//! \param ulFrequency specifies the SSI Clock Frequency to be used. +//! +//! This function initializes the SSI interface to the OLED display. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Enable(unsigned long ulFrequency) +{ + unsigned long ulTemp; + + // + // Disable the SSI port. + // + SSIDisable(SSI0_BASE); + + // + // Configure the SSI0 port for master mode. + // + SSIConfig(SSI0_BASE, SSI_FRF_MOTO_MODE_2, SSI_MODE_MASTER, ulFrequency, 8); + + // + // (Re)Enable SSI control of the FSS pin. + // + GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_3); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + + // + // Enable the SSI port. + // + SSIEnable(SSI0_BASE); + + // + // Drain the receive fifo. + // + while(SSIDataNonBlockingGet(SSI0_BASE, &ulTemp) != 0) + { + } + + // + // Indicate that the OSRAM driver can use the SSI Port. + // + g_bSSIEnabled = true; +} + +//***************************************************************************** +// +//! Enable the SSI component of the OLED display driver. +//! +//! \param ulFrequency specifies the SSI Clock Frequency to be used. +//! +//! This function initializes the SSI interface to the OLED display. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Disable(void) +{ + unsigned long ulTemp; + + // + // Indicate that the OSRAM driver can no longer use the SSI Port. + // + g_bSSIEnabled = false; + + // + // Drain the receive fifo. + // + while(SSIDataNonBlockingGet(SSI0_BASE, &ulTemp) != 0) + { + } + + // + // Disable the SSI port. + // + SSIDisable(SSI0_BASE); + + // + // Disable SSI control of the FSS pin. + // + GPIODirModeSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_DIR_MODE_OUT); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_PIN_3); + +} + +//***************************************************************************** +// +//! Initialize the OLED display. +//! +//! \param ulFrequency specifies the SSI Clock Frequency to be used. +//! +//! This function initializes the SSI interface to the OLED display and +//! configures the SSD0323 controller on the panel. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Init(unsigned long ulFrequency) +{ + unsigned long ulIdx; + + // + // Enable the SSI0 and GPIO port blocks as they are needed by this driver. + // + SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); + + // + // Configure the SSI0CLK and SSIOTX pins for SSI operation. + // + GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_5); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_2, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_5, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + + // + // Configure the PC7 pin as a D/Cn signal for OLED device. + // + GPIODirModeSet(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_DIR_MODE_OUT); + GPIOPadConfigSet(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD); + GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_PIN_7); + + // + // Configure and enable the SSI0 port for master mode. + // + OSRAM128x64x4Enable(ulFrequency); + + // + // Clear the frame buffer. + // + OSRAM128x64x4Clear(); + + // + // Initialize the SSD0323 controller. Loop through the initialization + // sequence array, sending each command "string" to the controller. + // + for(ulIdx = 0; ulIdx < sizeof(g_pucOSRAM128x64x4Init); + ulIdx += g_pucOSRAM128x64x4Init[ulIdx] + 1) + { + // + // Send this command. + // + OSRAMWriteCommand(g_pucOSRAM128x64x4Init + ulIdx + 1, + g_pucOSRAM128x64x4Init[ulIdx] - 1); + } +} + +//***************************************************************************** +// +//! Turns on the OLED display. +//! +//! This function will turn on the OLED display, causing it to display the +//! contents of its internal frame buffer. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4DisplayOn(void) +{ + unsigned long ulIdx; + + // + // Initialize the SSD0323 controller. Loop through the initialization + // sequence array, sending each command "string" to the controller. + // + for(ulIdx = 0; ulIdx < sizeof(g_pucOSRAM128x64x4Init); + ulIdx += g_pucOSRAM128x64x4Init[ulIdx] + 1) + { + // + // Send this command. + // + OSRAMWriteCommand(g_pucOSRAM128x64x4Init + ulIdx + 1, + g_pucOSRAM128x64x4Init[ulIdx] - 1); + } +} + +//***************************************************************************** +// +//! Turns off the OLED display. +//! +//! This function will turn off the OLED display. This will stop the scanning +//! of the panel and turn off the on-chip DC-DC converter, preventing damage to +//! the panel due to burn-in (it has similar characters to a CRT in this +//! respect). +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4DisplayOff(void) +{ + static const unsigned char pucCommand1[] = + { + 0xAE, 0xAD, 0x02 + }; + + // + // Turn off the DC-DC converter and the display. + // + OSRAMWriteCommand(pucCommand1, sizeof(pucCommand1)); +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/osram128x64x4.h b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/osram128x64x4.h new file mode 100644 index 000000000..2ba7cb956 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/osram128x64x4.h @@ -0,0 +1,63 @@ +//***************************************************************************** +// +// osram128x64x4.h - Prototypes for the driver for the OSRAM 128x64x4 graphical +// OLED display. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __OSRAM128X64X4_H__ +#define __OSRAM128X64X4_H__ + +//***************************************************************************** +// +// Prototypes for the driver APIs. +// +//***************************************************************************** +extern void OSRAM128x64x4Clear(void); +extern void OSRAM128x64x4StringDraw(const char *pcStr, + unsigned long ulX, + unsigned long ulY, + unsigned char ucLevel); +extern void OSRAM128x64x4ImageDraw(const unsigned char *pucImage, + unsigned long ulX, + unsigned long ulY, + unsigned long ulWidth, + unsigned long ulHeight); +extern void OSRAM128x64x4Init(unsigned long ulFrequency); +extern void OSRAM128x64x4Enable(unsigned long ulFrequency); +extern void OSRAM128x64x4Disable(void); +extern void OSRAM128x64x4DisplayOn(void); +extern void OSRAM128x64x4DisplayOff(void); + +//***************************************************************************** +// +// The following macro(s) map old names for the OSRAM functions to the new +// names. In new code, the new names should be used in favor of the old names. +// +//***************************************************************************** +#ifndef DEPRECATED +#define OSRAM128x64x1InitSSI OSRAM128x64x4Enable +#endif + +#endif // __OSRAM128X64X4_H__ diff --git a/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/pwm.h b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/pwm.h new file mode 100644 index 000000000..bb67fda19 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/pwm.h @@ -0,0 +1,161 @@ +//***************************************************************************** +// +// pwm.h - API function protoypes for Pulse Width Modulation (PWM) ports +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __PWM_H__ +#define __PWM_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following defines are passed to PWMGenConfigure() as the ulConfig +// parameter and specify the configuration of the PWM generator. +// +//***************************************************************************** +#define PWM_GEN_MODE_DOWN 0x00000000 // Down count mode +#define PWM_GEN_MODE_UP_DOWN 0x00000002 // Up/Down count mode +#define PWM_GEN_MODE_SYNC 0x00000038 // Synchronous updates +#define PWM_GEN_MODE_NO_SYNC 0x00000000 // Immediate updates +#define PWM_GEN_MODE_DBG_RUN 0x00000004 // Continue running in debug mode +#define PWM_GEN_MODE_DBG_STOP 0x00000000 // Stop running in debug mode + +//***************************************************************************** +// +// Defines for enabling, disabling, and clearing PWM generator interrupts and +// triggers. +// +//***************************************************************************** +#define PWM_INT_CNT_ZERO 0x00000001 // Int if COUNT = 0 +#define PWM_INT_CNT_LOAD 0x00000002 // Int if COUNT = LOAD +#define PWM_INT_CNT_AU 0x00000004 // Int if COUNT = CMPA U +#define PWM_INT_CNT_AD 0x00000008 // Int if COUNT = CMPA D +#define PWM_INT_CNT_BU 0x00000010 // Int if COUNT = CMPA U +#define PWM_INT_CNT_BD 0x00000020 // Int if COUNT = CMPA D +#define PWM_TR_CNT_ZERO 0x00000100 // Trig if COUNT = 0 +#define PWM_TR_CNT_LOAD 0x00000200 // Trig if COUNT = LOAD +#define PWM_TR_CNT_AU 0x00000400 // Trig if COUNT = CMPA U +#define PWM_TR_CNT_AD 0x00000800 // Trig if COUNT = CMPA D +#define PWM_TR_CNT_BU 0x00001000 // Trig if COUNT = CMPA U +#define PWM_TR_CNT_BD 0x00002000 // Trig if COUNT = CMPA D + +//***************************************************************************** +// +// Defines for enabling, disabling, and clearing PWM interrupts. +// +//***************************************************************************** +#define PWM_INT_GEN_0 0x00000001 // Generator 0 interrupt +#define PWM_INT_GEN_1 0x00000002 // Generator 1 interrupt +#define PWM_INT_GEN_2 0x00000004 // Generator 2 interrupt +#define PWM_INT_FAULT 0x00010000 // Fault interrupt + +//***************************************************************************** +// +// Defines to identify the generators within a module. +// +//***************************************************************************** +#define PWM_GEN_0 0x00000040 // Offset address of Gen0 +#define PWM_GEN_1 0x00000080 // Offset address of Gen1 +#define PWM_GEN_2 0x000000C0 // Offset address of Gen2 + +#define PWM_GEN_0_BIT 0x00000001 // Bit-wise ID for Gen0 +#define PWM_GEN_1_BIT 0x00000002 // Bit-wise ID for Gen1 +#define PWM_GEN_2_BIT 0x00000004 // Bit-wise ID for Gen2 + +//***************************************************************************** +// +// Defines to identify the outputs within a module. +// +//***************************************************************************** +#define PWM_OUT_0 0x00000040 // Encoded offset address of PWM0 +#define PWM_OUT_1 0x00000041 // Encoded offset address of PWM1 +#define PWM_OUT_2 0x00000082 // Encoded offset address of PWM2 +#define PWM_OUT_3 0x00000083 // Encoded offset address of PWM3 +#define PWM_OUT_4 0x000000C4 // Encoded offset address of PWM4 +#define PWM_OUT_5 0x000000C5 // Encoded offset address of PWM5 + +#define PWM_OUT_0_BIT 0x00000001 // Bit-wise ID for PWM0 +#define PWM_OUT_1_BIT 0x00000002 // Bit-wise ID for PWM1 +#define PWM_OUT_2_BIT 0x00000004 // Bit-wise ID for PWM2 +#define PWM_OUT_3_BIT 0x00000008 // Bit-wise ID for PWM3 +#define PWM_OUT_4_BIT 0x00000010 // Bit-wise ID for PWM4 +#define PWM_OUT_5_BIT 0x00000020 // Bit-wise ID for PWM5 + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void PWMGenConfigure(unsigned long ulBase, unsigned long ulGen, + unsigned long ulConfig); +extern void PWMGenPeriodSet(unsigned long ulBase, unsigned long ulGen, + unsigned long ulPeriod); +extern unsigned long PWMGenPeriodGet(unsigned long ulBase, + unsigned long ulGen); +extern void PWMGenEnable(unsigned long ulBase, unsigned long ulGen); +extern void PWMGenDisable(unsigned long ulBase, unsigned long ulGen); +extern void PWMPulseWidthSet(unsigned long ulBase, unsigned long ulPWMOut, + unsigned long ulWidth); +extern unsigned long PWMPulseWidthGet(unsigned long ulBase, + unsigned long ulPWMOut); +extern void PWMDeadBandEnable(unsigned long ulBase, unsigned long ulGen, + unsigned short usRise, unsigned short usFall); +extern void PWMDeadBandDisable(unsigned long ulBase, unsigned long ulGen); +extern void PWMSyncUpdate(unsigned long ulBase, unsigned long ulGenBits); +extern void PWMSyncTimeBase(unsigned long ulBase, unsigned long ulGenBits); +extern void PWMOutputState(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bEnable); +extern void PWMOutputInvert(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bInvert); +extern void PWMOutputFault(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bFaultKill); +extern void PWMGenIntRegister(unsigned long ulBase, unsigned long ulGen, + void (*pfnIntHandler)(void)); +extern void PWMGenIntUnregister(unsigned long ulBase, unsigned long ulGen); +extern void PWMFaultIntRegister(unsigned long ulBase, + void (*pfnIntHandler)(void)); +extern void PWMFaultIntUnregister(unsigned long ulBase); +extern void PWMGenIntTrigEnable(unsigned long ulBase, unsigned long ulGen, + unsigned long ulIntTrig); +extern void PWMGenIntTrigDisable(unsigned long ulBase, unsigned long ulGen, + unsigned long ulIntTrig); +extern unsigned long PWMGenIntStatus(unsigned long ulBase, unsigned long ulGen, + tBoolean bMasked); +extern void PWMGenIntClear(unsigned long ulBase, unsigned long ulGen, + unsigned long ulInts); +extern void PWMIntEnable(unsigned long ulBase, unsigned long ulGenFault); +extern void PWMIntDisable(unsigned long ulBase, unsigned long ulGenFault); +extern void PWMFaultIntClear(unsigned long ulBase); +extern unsigned long PWMIntStatus(unsigned long ulBase, tBoolean bMasked); + +#ifdef __cplusplus +} +#endif + +#endif // __PWM_H__ diff --git a/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/qei.h b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/qei.h new file mode 100644 index 000000000..89d5b20bc --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/qei.h @@ -0,0 +1,104 @@ +//***************************************************************************** +// +// qei.h - Prototypes for the Quadrature Encoder Driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __QEI_H__ +#define __QEI_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to QEIConfigure as the ulConfig paramater. +// +//***************************************************************************** +#define QEI_CONFIG_CAPTURE_A 0x00000000 // Count on ChA edges only +#define QEI_CONFIG_CAPTURE_A_B 0x00000008 // Count on ChA and ChB edges +#define QEI_CONFIG_NO_RESET 0x00000000 // Do not reset on index pulse +#define QEI_CONFIG_RESET_IDX 0x00000010 // Reset position on index pulse +#define QEI_CONFIG_QUADRATURE 0x00000000 // ChA and ChB are quadrature +#define QEI_CONFIG_CLOCK_DIR 0x00000004 // ChA and ChB are clock and dir +#define QEI_CONFIG_NO_SWAP 0x00000000 // Do not swap ChA and ChB +#define QEI_CONFIG_SWAP 0x00000002 // Swap ChA and ChB + +//***************************************************************************** +// +// Values that can be passed to QEIVelocityConfigure as the ulPreDiv parameter. +// +//***************************************************************************** +#define QEI_VELDIV_1 0x00000000 // Predivide by 1 +#define QEI_VELDIV_2 0x00000040 // Predivide by 2 +#define QEI_VELDIV_4 0x00000080 // Predivide by 4 +#define QEI_VELDIV_8 0x000000C0 // Predivide by 8 +#define QEI_VELDIV_16 0x00000100 // Predivide by 16 +#define QEI_VELDIV_32 0x00000140 // Predivide by 32 +#define QEI_VELDIV_64 0x00000180 // Predivide by 64 +#define QEI_VELDIV_128 0x000001C0 // Predivide by 128 + +//***************************************************************************** +// +// Values that can be passed to QEIEnableInts, QEIDisableInts, and QEIClearInts +// as the ulIntFlags parameter, and returned by QEIGetIntStatus. +// +//***************************************************************************** +#define QEI_INTERROR 0x00000008 // Phase error detected +#define QEI_INTDIR 0x00000004 // Direction change +#define QEI_INTTIMER 0x00000002 // Velocity timer expired +#define QEI_INTINDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void QEIEnable(unsigned long ulBase); +extern void QEIDisable(unsigned long ulBase); +extern void QEIConfigure(unsigned long ulBase, unsigned long ulConfig, + unsigned long ulMaxPosition); +extern unsigned long QEIPositionGet(unsigned long ulBase); +extern void QEIPositionSet(unsigned long ulBase, unsigned long ulPosition); +extern long QEIDirectionGet(unsigned long ulBase); +extern tBoolean QEIErrorGet(unsigned long ulBase); +extern void QEIVelocityEnable(unsigned long ulBase); +extern void QEIVelocityDisable(unsigned long ulBase); +extern void QEIVelocityConfigure(unsigned long ulBase, unsigned long ulPreDiv, + unsigned long ulPeriod); +extern unsigned long QEIVelocityGet(unsigned long ulBase); +extern void QEIIntRegister(unsigned long ulBase, void (*pfnHandler)(void)); +extern void QEIIntUnregister(unsigned long ulBase); +extern void QEIIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void QEIIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long QEIIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void QEIIntClear(unsigned long ulBase, unsigned long ulIntFlags); + +#ifdef __cplusplus +} +#endif + +#endif // __QEI_H__ diff --git a/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/ssi.h b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/ssi.h new file mode 100644 index 000000000..227b6bd9b --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/ssi.h @@ -0,0 +1,89 @@ +//***************************************************************************** +// +// ssi.h - Prototypes for the Synchronous Serial Interface Driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __SSI_H__ +#define __SSI_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to SSIIntEnable, SSIIntDisable, and SSIIntClear +// as the ulIntFlags parameter, and returned by SSIIntStatus. +// +//***************************************************************************** +#define SSI_TXFF 0x00000008 // TX FIFO half empty or less +#define SSI_RXFF 0x00000004 // RX FIFO half full or less +#define SSI_RXTO 0x00000002 // RX timeout +#define SSI_RXOR 0x00000001 // RX overrun + +//***************************************************************************** +// +// Values that can be passed to SSIConfig. +// +//***************************************************************************** +#define SSI_FRF_MOTO_MODE_0 0x00000000 // Moto fmt, polarity 0, phase 0 +#define SSI_FRF_MOTO_MODE_1 0x00000002 // Moto fmt, polarity 0, phase 1 +#define SSI_FRF_MOTO_MODE_2 0x00000001 // Moto fmt, polarity 1, phase 0 +#define SSI_FRF_MOTO_MODE_3 0x00000003 // Moto fmt, polarity 1, phase 1 +#define SSI_FRF_TI 0x00000010 // TI frame format +#define SSI_FRF_NMW 0x00000020 // National MicroWire frame format + +#define SSI_MODE_MASTER 0x00000000 // SSI master +#define SSI_MODE_SLAVE 0x00000001 // SSI slave +#define SSI_MODE_SLAVE_OD 0x00000002 // SSI slave with output disabled + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void SSIConfig(unsigned long ulBase, unsigned long ulProtocol, + unsigned long ulMode, unsigned long ulBitRate, + unsigned long ulDataWidth); +extern void SSIDataGet(unsigned long ulBase, unsigned long *pulData); +extern long SSIDataNonBlockingGet(unsigned long ulBase, + unsigned long *pulData); +extern void SSIDataPut(unsigned long ulBase, unsigned long ulData); +extern long SSIDataNonBlockingPut(unsigned long ulBase, unsigned long ulData); +extern void SSIDisable(unsigned long ulBase); +extern void SSIEnable(unsigned long ulBase); +extern void SSIIntClear(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntRegister(unsigned long ulBase, void(*pfnHandler)(void)); +extern unsigned long SSIIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void SSIIntUnregister(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __SSI_H__ diff --git a/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/sysctl.h b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/sysctl.h new file mode 100644 index 000000000..d2efbca0d --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/sysctl.h @@ -0,0 +1,301 @@ +//***************************************************************************** +// +// sysctl.h - Prototypes for the system control driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __SYSCTL_H__ +#define __SYSCTL_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following are values that can be passed to the +// SysCtlPeripheralPresent(), SysCtlPeripheralEnable(), +// SysCtlPeripheralDisable(), and SysCtlPeripheralReset() APIs as the +// ulPeripheral parameter. The peripherals in the fourth group (upper nibble +// is 3) can only be used with the SysCtlPeripheralPresent() API. +// +//***************************************************************************** +#define SYSCTL_PERIPH_PWM 0x00100010 // PWM +#define SYSCTL_PERIPH_ADC 0x00100001 // ADC +#define SYSCTL_PERIPH_HIBERNATE 0x00000040 // Hibernation module +#define SYSCTL_PERIPH_WDOG 0x00000008 // Watchdog +#define SYSCTL_PERIPH_CAN0 0x00100100 // CAN 0 +#define SYSCTL_PERIPH_CAN1 0x00100200 // CAN 1 +#define SYSCTL_PERIPH_UART0 0x10000001 // UART 0 +#define SYSCTL_PERIPH_UART1 0x10000002 // UART 1 +#define SYSCTL_PERIPH_UART2 0x10000004 // UART 2 +#define SYSCTL_PERIPH_SSI 0x10000010 // SSI +#define SYSCTL_PERIPH_SSI0 0x10000010 // SSI 0 +#define SYSCTL_PERIPH_SSI1 0x10000020 // SSI 1 +#define SYSCTL_PERIPH_QEI 0x10000100 // QEI +#define SYSCTL_PERIPH_QEI0 0x10000100 // QEI 0 +#define SYSCTL_PERIPH_QEI1 0x10000200 // QEI 1 +#define SYSCTL_PERIPH_I2C 0x10001000 // I2C +#define SYSCTL_PERIPH_I2C0 0x10001000 // I2C 0 +#define SYSCTL_PERIPH_I2C1 0x10004000 // I2C 1 +#define SYSCTL_PERIPH_TIMER0 0x10100001 // Timer 0 +#define SYSCTL_PERIPH_TIMER1 0x10100002 // Timer 1 +#define SYSCTL_PERIPH_TIMER2 0x10100004 // Timer 2 +#define SYSCTL_PERIPH_TIMER3 0x10100008 // Timer 3 +#define SYSCTL_PERIPH_COMP0 0x10100100 // Analog comparator 0 +#define SYSCTL_PERIPH_COMP1 0x10100200 // Analog comparator 1 +#define SYSCTL_PERIPH_COMP2 0x10100400 // Analog comparator 2 +#define SYSCTL_PERIPH_GPIOA 0x20000001 // GPIO A +#define SYSCTL_PERIPH_GPIOB 0x20000002 // GPIO B +#define SYSCTL_PERIPH_GPIOC 0x20000004 // GPIO C +#define SYSCTL_PERIPH_GPIOD 0x20000008 // GPIO D +#define SYSCTL_PERIPH_GPIOE 0x20000010 // GPIO E +#define SYSCTL_PERIPH_GPIOF 0x20000020 // GPIO F +#define SYSCTL_PERIPH_GPIOG 0x20000040 // GPIO G +#define SYSCTL_PERIPH_GPIOH 0x20000080 // GPIO H +#define SYSCTL_PERIPH_ETH 0x20105000 // ETH +#define SYSCTL_PERIPH_MPU 0x30000080 // Cortex M3 MPU +#define SYSCTL_PERIPH_TEMP 0x30000020 // Temperature sensor +#define SYSCTL_PERIPH_PLL 0x30000010 // PLL + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlPinPresent() API +// as the ulPin parameter. +// +//***************************************************************************** +#define SYSCTL_PIN_PWM0 0x00000001 // PWM0 pin +#define SYSCTL_PIN_PWM1 0x00000002 // PWM1 pin +#define SYSCTL_PIN_PWM2 0x00000004 // PWM2 pin +#define SYSCTL_PIN_PWM3 0x00000008 // PWM3 pin +#define SYSCTL_PIN_PWM4 0x00000010 // PWM4 pin +#define SYSCTL_PIN_PWM5 0x00000020 // PWM5 pin +#define SYSCTL_PIN_C0MINUS 0x00000040 // C0- pin +#define SYSCTL_PIN_C0PLUS 0x00000080 // C0+ pin +#define SYSCTL_PIN_C0O 0x00000100 // C0o pin +#define SYSCTL_PIN_C1MINUS 0x00000200 // C1- pin +#define SYSCTL_PIN_C1PLUS 0x00000400 // C1+ pin +#define SYSCTL_PIN_C1O 0x00000800 // C1o pin +#define SYSCTL_PIN_C2MINUS 0x00001000 // C2- pin +#define SYSCTL_PIN_C2PLUS 0x00002000 // C2+ pin +#define SYSCTL_PIN_C2O 0x00004000 // C2o pin +#define SYSCTL_PIN_MC_FAULT0 0x00008000 // MC0 Fault pin +#define SYSCTL_PIN_ADC0 0x00010000 // ADC0 pin +#define SYSCTL_PIN_ADC1 0x00020000 // ADC1 pin +#define SYSCTL_PIN_ADC2 0x00040000 // ADC2 pin +#define SYSCTL_PIN_ADC3 0x00080000 // ADC3 pin +#define SYSCTL_PIN_ADC4 0x00100000 // ADC4 pin +#define SYSCTL_PIN_ADC5 0x00200000 // ADC5 pin +#define SYSCTL_PIN_ADC6 0x00400000 // ADC6 pin +#define SYSCTL_PIN_ADC7 0x00800000 // ADC7 pin +#define SYSCTL_PIN_CCP0 0x01000000 // CCP0 pin +#define SYSCTL_PIN_CCP1 0x02000000 // CCP1 pin +#define SYSCTL_PIN_CCP2 0x04000000 // CCP2 pin +#define SYSCTL_PIN_CCP3 0x08000000 // CCP3 pin +#define SYSCTL_PIN_CCP4 0x10000000 // CCP4 pin +#define SYSCTL_PIN_CCP5 0x20000000 // CCP5 pin +#define SYSCTL_PIN_32KHZ 0x80000000 // 32kHz pin + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlLDOSet() API as +// the ulVoltage value, or returned by the SysCtlLDOGet() API. +// +//***************************************************************************** +#define SYSCTL_LDO_2_25V 0x00000005 // LDO output of 2.25V +#define SYSCTL_LDO_2_30V 0x00000004 // LDO output of 2.30V +#define SYSCTL_LDO_2_35V 0x00000003 // LDO output of 2.35V +#define SYSCTL_LDO_2_40V 0x00000002 // LDO output of 2.40V +#define SYSCTL_LDO_2_45V 0x00000001 // LDO output of 2.45V +#define SYSCTL_LDO_2_50V 0x00000000 // LDO output of 2.50V +#define SYSCTL_LDO_2_55V 0x0000001f // LDO output of 2.55V +#define SYSCTL_LDO_2_60V 0x0000001e // LDO output of 2.60V +#define SYSCTL_LDO_2_65V 0x0000001d // LDO output of 2.65V +#define SYSCTL_LDO_2_70V 0x0000001c // LDO output of 2.70V +#define SYSCTL_LDO_2_75V 0x0000001b // LDO output of 2.75V + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlLDOConfigSet() API. +// +//***************************************************************************** +#define SYSCTL_LDOCFG_ARST 0x00000001 // Allow LDO failure to reset +#define SYSCTL_LDOCFG_NORST 0x00000000 // Do not reset on LDO failure + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlIntEnable(), +// SysCtlIntDisable(), and SysCtlIntClear() APIs, or returned in the bit mask +// by the SysCtlIntStatus() API. +// +//***************************************************************************** +#define SYSCTL_INT_PLL_LOCK 0x00000040 // PLL lock interrupt +#define SYSCTL_INT_CUR_LIMIT 0x00000020 // Current limit interrupt +#define SYSCTL_INT_IOSC_FAIL 0x00000010 // Internal oscillator failure int +#define SYSCTL_INT_MOSC_FAIL 0x00000008 // Main oscillator failure int +#define SYSCTL_INT_POR 0x00000004 // Power on reset interrupt +#define SYSCTL_INT_BOR 0x00000002 // Brown out interrupt +#define SYSCTL_INT_PLL_FAIL 0x00000001 // PLL failure interrupt + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlResetCauseClear() +// API or returned by the SysCtlResetCauseGet() API. +// +//***************************************************************************** +#define SYSCTL_CAUSE_LDO 0x00000020 // LDO power not OK reset +#define SYSCTL_CAUSE_SW 0x00000010 // Software reset +#define SYSCTL_CAUSE_WDOG 0x00000008 // Watchdog reset +#define SYSCTL_CAUSE_BOR 0x00000004 // Brown-out reset +#define SYSCTL_CAUSE_POR 0x00000002 // Power on reset +#define SYSCTL_CAUSE_EXT 0x00000001 // External reset + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlBrownOutConfigSet() +// API as the ulConfig parameter. +// +//***************************************************************************** +#define SYSCTL_BOR_RESET 0x00000002 // Reset instead of interrupting +#define SYSCTL_BOR_RESAMPLE 0x00000001 // Resample BOR before asserting + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlPWMClockSet() API +// as the ulConfig parameter, and can be returned by the SysCtlPWMClockGet() +// API. +// +//***************************************************************************** +#define SYSCTL_PWMDIV_1 0x00000000 // PWM clock is processor clock /1 +#define SYSCTL_PWMDIV_2 0x00100000 // PWM clock is processor clock /2 +#define SYSCTL_PWMDIV_4 0x00120000 // PWM clock is processor clock /4 +#define SYSCTL_PWMDIV_8 0x00140000 // PWM clock is processor clock /8 +#define SYSCTL_PWMDIV_16 0x00160000 // PWM clock is processor clock /16 +#define SYSCTL_PWMDIV_32 0x00180000 // PWM clock is processor clock /32 +#define SYSCTL_PWMDIV_64 0x001A0000 // PWM clock is processor clock /64 + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlADCSpeedSet() API +// as the ulSpeed parameter, and can be returned by the SyCtlADCSpeedGet() +// API. +// +//***************************************************************************** +#define SYSCTL_ADCSPEED_1MSPS 0x00000300 // 1,000,000 samples per second +#define SYSCTL_ADCSPEED_500KSPS 0x00000200 // 500,000 samples per second +#define SYSCTL_ADCSPEED_250KSPS 0x00000100 // 250,000 samples per second +#define SYSCTL_ADCSPEED_125KSPS 0x00000000 // 125,000 samples per second + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlClockSet() API as +// the ulConfig parameter. +// +//***************************************************************************** +#define SYSCTL_SYSDIV_1 0x07800000 // Processor clock is osc/pll /1 +#define SYSCTL_SYSDIV_2 0x00C00000 // Processor clock is osc/pll /2 +#define SYSCTL_SYSDIV_3 0x01400000 // Processor clock is osc/pll /3 +#define SYSCTL_SYSDIV_4 0x01C00000 // Processor clock is osc/pll /4 +#define SYSCTL_SYSDIV_5 0x02400000 // Processor clock is osc/pll /5 +#define SYSCTL_SYSDIV_6 0x02C00000 // Processor clock is osc/pll /6 +#define SYSCTL_SYSDIV_7 0x03400000 // Processor clock is osc/pll /7 +#define SYSCTL_SYSDIV_8 0x03C00000 // Processor clock is osc/pll /8 +#define SYSCTL_SYSDIV_9 0x04400000 // Processor clock is osc/pll /9 +#define SYSCTL_SYSDIV_10 0x04C00000 // Processor clock is osc/pll /10 +#define SYSCTL_SYSDIV_11 0x05400000 // Processor clock is osc/pll /11 +#define SYSCTL_SYSDIV_12 0x05C00000 // Processor clock is osc/pll /12 +#define SYSCTL_SYSDIV_13 0x06400000 // Processor clock is osc/pll /13 +#define SYSCTL_SYSDIV_14 0x06C00000 // Processor clock is osc/pll /14 +#define SYSCTL_SYSDIV_15 0x07400000 // Processor clock is osc/pll /15 +#define SYSCTL_SYSDIV_16 0x07C00000 // Processor clock is osc/pll /16 +#define SYSCTL_USE_PLL 0x00000000 // System clock is the PLL clock +#define SYSCTL_USE_OSC 0x00003800 // System clock is the osc clock +#define SYSCTL_XTAL_3_57MHZ 0x00000100 // External crystal is 3.579545MHz +#define SYSCTL_XTAL_3_68MHZ 0x00000140 // External crystal is 3.6864MHz +#define SYSCTL_XTAL_4MHZ 0x00000180 // External crystal is 4MHz +#define SYSCTL_XTAL_4_09MHZ 0x000001C0 // External crystal is 4.096MHz +#define SYSCTL_XTAL_4_91MHZ 0x00000200 // External crystal is 4.9152MHz +#define SYSCTL_XTAL_5MHZ 0x00000240 // External crystal is 5MHz +#define SYSCTL_XTAL_5_12MHZ 0x00000280 // External crystal is 5.12MHz +#define SYSCTL_XTAL_6MHZ 0x000002C0 // External crystal is 6MHz +#define SYSCTL_XTAL_6_14MHZ 0x00000300 // External crystal is 6.144MHz +#define SYSCTL_XTAL_7_37MHZ 0x00000340 // External crystal is 7.3728MHz +#define SYSCTL_XTAL_8MHZ 0x00000380 // External crystal is 8MHz +#define SYSCTL_XTAL_8_19MHZ 0x000003C0 // External crystal is 8.192MHz +#define SYSCTL_OSC_MAIN 0x00000000 // Oscillator source is main osc +#define SYSCTL_OSC_INT 0x00000010 // Oscillator source is int. osc +#define SYSCTL_OSC_INT4 0x00000020 // Oscillator source is int. osc /4 +#define SYSCTL_INT_OSC_DIS 0x00000002 // Disable internal oscillator +#define SYSCTL_MAIN_OSC_DIS 0x00000001 // Disable main oscillator + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern unsigned long SysCtlSRAMSizeGet(void); +extern unsigned long SysCtlFlashSizeGet(void); +extern tBoolean SysCtlPinPresent(unsigned long ulPin); +extern tBoolean SysCtlPeripheralPresent(unsigned long ulPeripheral); +extern void SysCtlPeripheralReset(unsigned long ulPeripheral); +extern void SysCtlPeripheralEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralSleepEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralSleepDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDeepSleepEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDeepSleepDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralClockGating(tBoolean bEnable); +extern void SysCtlIntRegister(void (*pfnHandler)(void)); +extern void SysCtlIntUnregister(void); +extern void SysCtlIntEnable(unsigned long ulInts); +extern void SysCtlIntDisable(unsigned long ulInts); +extern void SysCtlIntClear(unsigned long ulInts); +extern unsigned long SysCtlIntStatus(tBoolean bMasked); +extern void SysCtlLDOSet(unsigned long ulVoltage); +extern unsigned long SysCtlLDOGet(void); +extern void SysCtlLDOConfigSet(unsigned long ulConfig); +extern void SysCtlReset(void); +extern void SysCtlSleep(void); +extern void SysCtlDeepSleep(void); +extern unsigned long SysCtlResetCauseGet(void); +extern void SysCtlResetCauseClear(unsigned long ulCauses); +extern void SysCtlBrownOutConfigSet(unsigned long ulConfig, + unsigned long ulDelay); +extern void SysCtlClockSet(unsigned long ulConfig); +extern unsigned long SysCtlClockGet(void); +extern void SysCtlPWMClockSet(unsigned long ulConfig); +extern unsigned long SysCtlPWMClockGet(void); +extern void SysCtlADCSpeedSet(unsigned long ulSpeed); +extern unsigned long SysCtlADCSpeedGet(void); +extern void SysCtlIOSCVerificationSet(tBoolean bEnable); +extern void SysCtlMOSCVerificationSet(tBoolean bEnable); +extern void SysCtlPLLVerificationSet(tBoolean bEnable); +extern void SysCtlClkVerificationClear(void); + +#ifdef __cplusplus +} +#endif + +#endif // __SYSCTL_H__ diff --git a/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/systick.h b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/systick.h new file mode 100644 index 000000000..f89bf65b8 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/systick.h @@ -0,0 +1,55 @@ +//***************************************************************************** +// +// systick.h - Prototypes for the SysTick driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __SYSTICK_H__ +#define __SYSTICK_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void SysTickEnable(void); +extern void SysTickDisable(void); +extern void SysTickIntRegister(void (*pfnHandler)(void)); +extern void SysTickIntUnregister(void); +extern void SysTickIntEnable(void); +extern void SysTickIntDisable(void); +extern void SysTickPeriodSet(unsigned long ulPeriod); +extern unsigned long SysTickPeriodGet(void); +extern unsigned long SysTickValueGet(void); + +#ifdef __cplusplus +} +#endif + +#endif // __SYSTICK_H__ diff --git a/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/uart.h b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/uart.h new file mode 100644 index 000000000..a0e16db33 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/uart.h @@ -0,0 +1,104 @@ +//***************************************************************************** +// +// uart.h - Defines and Macros for the UART. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __UART_H__ +#define __UART_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to UARTIntEnable, UARTIntDisable, and UARTIntClear +// as the ulIntFlags parameter, and returned from UARTIntStatus. +// +//***************************************************************************** +#define UART_INT_OE 0x400 // Overrun Error Interrupt Mask +#define UART_INT_BE 0x200 // Break Error Interrupt Mask +#define UART_INT_PE 0x100 // Parity Error Interrupt Mask +#define UART_INT_FE 0x080 // Framing Error Interrupt Mask +#define UART_INT_RT 0x040 // Receive Timeout Interrupt Mask +#define UART_INT_TX 0x020 // Transmit Interrupt Mask +#define UART_INT_RX 0x010 // Receive Interrupt Mask + +//***************************************************************************** +// +// Values that can be passed to UARTConfigSet as the ulConfig parameter and +// returned by UARTConfigGet in the pulConfig parameter. Additionally, the +// UART_CONFIG_PAR_* subset can be passed to UARTParityModeSet as the ulParity +// parameter, and are returned by UARTParityModeGet. +// +//***************************************************************************** +#define UART_CONFIG_WLEN_8 0x00000060 // 8 bit data +#define UART_CONFIG_WLEN_7 0x00000040 // 7 bit data +#define UART_CONFIG_WLEN_6 0x00000020 // 6 bit data +#define UART_CONFIG_WLEN_5 0x00000000 // 5 bit data +#define UART_CONFIG_STOP_ONE 0x00000000 // One stop bit +#define UART_CONFIG_STOP_TWO 0x00000008 // Two stop bits +#define UART_CONFIG_PAR_NONE 0x00000000 // No parity +#define UART_CONFIG_PAR_EVEN 0x00000006 // Even parity +#define UART_CONFIG_PAR_ODD 0x00000002 // Odd parity +#define UART_CONFIG_PAR_ONE 0x00000086 // Parity bit is one +#define UART_CONFIG_PAR_ZERO 0x00000082 // Parity bit is zero + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void UARTParityModeSet(unsigned long ulBase, unsigned long ulParity); +extern unsigned long UARTParityModeGet(unsigned long ulBase); +extern void UARTConfigSet(unsigned long ulBase, unsigned long ulBaud, + unsigned long ulConfig); +extern void UARTConfigGet(unsigned long ulBase, unsigned long *pulBaud, + unsigned long *pulConfig); +extern void UARTEnable(unsigned long ulBase); +extern void UARTDisable(unsigned long ulBase); +extern void UARTEnableSIR(unsigned long ulBase, tBoolean bLowPower); +extern void UARTDisableSIR(unsigned long ulBase); +extern tBoolean UARTCharsAvail(unsigned long ulBase); +extern tBoolean UARTSpaceAvail(unsigned long ulBase); +extern long UARTCharNonBlockingGet(unsigned long ulBase); +extern long UARTCharGet(unsigned long ulBase); +extern tBoolean UARTCharNonBlockingPut(unsigned long ulBase, + unsigned char ucData); +extern void UARTCharPut(unsigned long ulBase, unsigned char ucData); +extern void UARTBreakCtl(unsigned long ulBase, tBoolean bBreakState); +extern void UARTIntRegister(unsigned long ulBase, void(*pfnHandler)(void)); +extern void UARTIntUnregister(unsigned long ulBase); +extern void UARTIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void UARTIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long UARTIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void UARTIntClear(unsigned long ulBase, unsigned long ulIntFlags); + +#ifdef __cplusplus +} +#endif + +#endif // __UART_H__ diff --git a/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/watchdog.h b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/watchdog.h new file mode 100644 index 000000000..2d0ad37a0 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/LuminaryDrivers/watchdog.h @@ -0,0 +1,63 @@ +//***************************************************************************** +// +// watchdog.h - Prototypes for the Watchdog Timer API +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __WATCHDOG_H__ +#define __WATCHDOG_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern tBoolean WatchdogRunning(unsigned long ulBase); +extern void WatchdogEnable(unsigned long ulBase); +extern void WatchdogResetEnable(unsigned long ulBase); +extern void WatchdogResetDisable(unsigned long ulBase); +extern void WatchdogLock(unsigned long ulBase); +extern void WatchdogUnlock(unsigned long ulBase); +extern tBoolean WatchdogLockState(unsigned long ulBase); +extern void WatchdogReloadSet(unsigned long ulBase, unsigned long ulLoadVal); +extern unsigned long WatchdogReloadGet(unsigned long ulBase); +extern unsigned long WatchdogValueGet(unsigned long ulBase); +extern void WatchdogIntRegister(unsigned long ulBase, void(*pfnHandler)(void)); +extern void WatchdogIntUnregister(unsigned long ulBase); +extern void WatchdogIntEnable(unsigned long ulBase); +extern unsigned long WatchdogIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void WatchdogIntClear(unsigned long ulBase); +extern void WatchdogStallDisable(unsigned long ulBase); +extern void WatchdogStallDisable(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __WATCHDOG_H__ diff --git a/Demo/CORTEX_LM3S2965_KEIL/ParTest/ParTest.c b/Demo/CORTEX_LM3S2965_KEIL/ParTest/ParTest.c new file mode 100644 index 000000000..f16ae6291 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/ParTest/ParTest.c @@ -0,0 +1,83 @@ +/* + FreeRTOS.org V4.3.0 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + + Also see http://www.SafeRTOS.com for an IEC 61508 compliant version along + with commercial development and support options. + *************************************************************************** +*/ + +/*----------------------------------------------------------- + * Simple parallel port IO routines. + *-----------------------------------------------------------*/ + +/* +*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Demo includes. */ +#include "partest.h" + +/* Library includes. */ +#include "hw_types.h" +#include "gpio.h" +#include "hw_memmap.h" + + +/*-----------------------------------------------------------*/ + +void vParTestInitialise( void ) +{ + GPIODirModeSet( GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_DIR_MODE_OUT ); + GPIOPadConfigSet( GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD ); + GPIOPinWrite( GPIO_PORTF_BASE, GPIO_PIN_0, 0 ); +} +/*-----------------------------------------------------------*/ + +void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue ) +{ + /* There is only one LED. */ + ( void ) uxLED; + + GPIOPinWrite( GPIO_PORTF_BASE, GPIO_PIN_0, xValue ); +} +/*-----------------------------------------------------------*/ + +unsigned portBASE_TYPE uxParTestGetLED( unsigned portBASE_TYPE uxLED ) +{ + /* There is only one LED. */ + ( void ) uxLED; + + return GPIOPinRead( GPIO_PORTF_BASE, GPIO_PIN_0 ); +} + + diff --git a/Demo/CORTEX_LM3S2965_KEIL/RTOSDemo.Opt b/Demo/CORTEX_LM3S2965_KEIL/RTOSDemo.Opt new file mode 100644 index 000000000..3fc7df23e --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/RTOSDemo.Opt @@ -0,0 +1,55 @@ +### uVision2 Project, (C) Keil Software +### Do not modify ! + + cExt (*.c) + aExt (*.s*; *.src; *.a*) + oExt (*.obj) + lExt (*.lib) + tExt (*.txt; *.h; *.inc) + pExt (*.plm) + CppX (*.cpp) + DaveTm { 0,0,0,0,0,0,0,0 } + +Target (FreeRTOS_Demo), 0x0004 // Tools: 'ARM-ADS' +GRPOPT 1,(Demo_Source),0,0,0 +GRPOPT 2,(Libraries),0,0,0 +GRPOPT 3,(RTOS_Source),0,0,0 + +OPTFFF 1,1,1,0,0,0,0,0,<..\Common\Minimal\BlockQ.c> +OPTFFF 1,2,1,0,0,0,0,0,<..\Common\Minimal\blocktim.c> +OPTFFF 1,3,1,0,0,0,0,0,<..\Common\Minimal\death.c> +OPTFFF 1,4,1,0,0,0,0,0,<..\Common\Minimal\integer.c> +OPTFFF 1,5,1,0,0,0,0,0,<.\main.c> +OPTFFF 1,6,1,0,0,0,0,0,<.\ParTest\ParTest.c> +OPTFFF 1,7,1,0,0,0,0,0,<..\Common\Minimal\PollQ.c> +OPTFFF 1,8,1,0,0,0,0,0,<..\Common\Minimal\semtest.c> +OPTFFF 1,9,2,570425344,0,0,0,0,<.\startup_rvmdk.S> +OPTFFF 1,10,1,0,0,0,0,0,<.\timertest.c> +OPTFFF 1,11,5,0,0,0,0,0,<.\FreeRTOSConfig.h> +OPTFFF 2,12,4,0,0,0,0,0,<.\LuminaryDrivers\driverlib.lib> +OPTFFF 2,13,1,0,0,0,0,0,<.\LuminaryDrivers\osram128x64x4.c> +OPTFFF 3,14,1,0,0,0,0,0,<..\..\Source\tasks.c> +OPTFFF 3,15,1,0,0,0,0,0,<..\..\Source\list.c> +OPTFFF 3,16,1,0,0,0,0,0,<..\..\Source\queue.c> +OPTFFF 3,17,1,0,0,0,0,0,<..\..\Source\portable\RVDS\ARM_CM3\port.c> +OPTFFF 3,18,1,0,0,0,0,0,<..\..\Source\portable\MemMang\heap_2.c> + + +TARGOPT 1, (FreeRTOS_Demo) + ADSCLK=6000000 + OPTTT 1,1,1,0 + OPTHX 1,65535,0,0,0 + OPTLX 79,66,8,<.\rvmdk\> + OPTOX 16 + OPTLT 1,1,1,0,1,1,0,1,0,0,0,0 + OPTXL 1,1,1,1,1,1,1,0,0 + OPTFL 1,0,1 + OPTAX 255 + OPTBL 0,(Data Sheet) + OPTDL (SARMCM3.DLL)()(DLM.DLL)(-pLM3S2965)(SARMCM3.DLL)()(TLM.DLL)(-pLM3S2965) + OPTDBG 48126,3,()()()()()()()()()() (BIN\lmidk-agdi.dll)()()() + OPTDF 0x0 + OPTLE <> + OPTLC <> +EndOpt + diff --git a/Demo/CORTEX_LM3S2965_KEIL/RTOSDemo.Uv2 b/Demo/CORTEX_LM3S2965_KEIL/RTOSDemo.Uv2 new file mode 100644 index 000000000..745475b8e --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/RTOSDemo.Uv2 @@ -0,0 +1,118 @@ +### uVision2 Project, (C) Keil Software +### Do not modify ! + +Target (FreeRTOS_Demo), 0x0004 // Tools: 'ARM-ADS' + +Group (Demo_Source) +Group (Libraries) +Group (RTOS_Source) + +File 1,1,<..\Common\Minimal\BlockQ.c> 0x46520544 +File 1,1,<..\Common\Minimal\blocktim.c> 0x46520544 +File 1,1,<..\Common\Minimal\death.c> 0x46520544 +File 1,1,<..\Common\Minimal\integer.c> 0x46520544 +File 1,1,<.\main.c> 0x4664B508 +File 1,1,<.\ParTest\ParTest.c> 0x46520580 +File 1,1,<..\Common\Minimal\PollQ.c> 0x46520544 +File 1,1,<..\Common\Minimal\semtest.c> 0x46520544 +File 1,2,<.\startup_rvmdk.S> 0x4664BAF8 +File 1,1,<.\timertest.c> 0x46520544 +File 1,5,<.\FreeRTOSConfig.h> 0x46638356 +File 2,4,<.\LuminaryDrivers\driverlib.lib> 0x46647F6C +File 2,1,<.\LuminaryDrivers\osram128x64x4.c> 0x46649D66 +File 3,1,<..\..\Source\tasks.c> 0x46520544 +File 3,1,<..\..\Source\list.c> 0x46520544 +File 3,1,<..\..\Source\queue.c> 0x46520544 +File 3,1,<..\..\Source\portable\RVDS\ARM_CM3\port.c> 0x44FB69B0 +File 3,1,<..\..\Source\portable\MemMang\heap_2.c> 0x46520580 + + +Options 1,0,0 // Target 'FreeRTOS_Demo' + Device (LM3S2965) + Vendor (Luminary Micro) + Cpu (IRAM(0x20000000-0x2000FFFF) IROM(0-0x3FFFF) CLOCK(6000000) CPUTYPE("Cortex-M3")) + FlashUt () + StupF ("STARTUP\Luminary\Startup.s" ("Luminary Startup Code")) + FlashDR (UL2CM3(-UU0101L5E -O14 -S0 -C0 -N00("ARM Cortex-M3") -D00(1BA00477) -L00(4) -FO7 -FD20000000 -FC800 -FN1 -FF0LM3S_256 -FS00 -FL040000)) + DevID (4322) + Rgf (LM3Sxxxx.H) + Mem () + C () + A () + RL () + OH () + DBC_IFX () + DBC_CMS () + DBC_AMS () + DBC_LMS () + UseEnv=0 + EnvBin () + EnvInc () + EnvLib () + EnvReg (ÿLuminary\) + OrgReg (ÿLuminary\) + TgStat=16 + OutDir (.\rvmdk\) + OutName (RTOSDemo) + GenApp=1 + GenLib=0 + GenHex=0 + Debug=1 + Browse=1 + LstDir (.\rvmdk\) + HexSel=1 + MG32K=0 + TGMORE=0 + RunUsr 0 1 + RunUsr 1 0 <> + BrunUsr 0 0 <> + BrunUsr 1 0 <> + CrunUsr 0 0 <> + CrunUsr 1 0 <> + SVCSID <> + GLFLAGS=1790 + ADSFLGA { 16,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + ACPUTYP ("Cortex-M3") + ADSTFLGA { 0,12,0,2,99,0,0,66,0,0,0,0,0,0,0,0,0,0,0,0 } + OCMADSOCM { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + OCMADSIRAM { 0,0,0,0,32,0,0,1,0 } + OCMADSIROM { 1,0,0,0,0,0,0,4,0 } + OCMADSXRAM { 0,0,0,0,0,0,0,0,0 } + OCR_RVCT { 1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,4,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,1,0,0,0,0,0,0,0,0,0,0 } + RV_STAVEC () + ADSCCFLG { 9,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + ADSCMISC () + ADSCDEFN (RVDS_ARMCM3_LM3S102) + ADSCUDEF () + ADSCINCD (.;.\LuminaryDrivers;..\..\Source\portable\RVDS\ARM_CM3;..\..\Source\include;..\Common\include) + ADSASFLG { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + ADSAMISC () + ADSADEFN () + ADSAUDEF () + ADSAINCD () + PropFld { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + IncBld=1 + AlwaysBuild=0 + GenAsm=0 + AsmAsm=0 + PublicsOnly=0 + StopCode=3 + CustArgs () + LibMods () + ADSLDFG { 17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + ADSLDTA (0x00000000) + ADSLDDA (0x20000000) + ADSLDSC () + ADSLDIB () + ADSLDIC () + ADSLDMC (--entry Reset_Handler) + ADSLDIF () + ADSLDDW () + OPTDL (SARMCM3.DLL)()(DLM.DLL)(-pLM3S2965)(SARMCM3.DLL)()(TLM.DLL)(-pLM3S2965) + OPTDBG 48126,3,()()()()()()()()()() (BIN\lmidk-agdi.dll)()()() + FLASH1 { 1,0,0,0,1,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0 } + FLASH2 (BIN\lmidk-agdi.dll) + FLASH3 ("" ()) + FLASH4 () +EndOpt + diff --git a/Demo/CORTEX_LM3S2965_KEIL/bitmap.h b/Demo/CORTEX_LM3S2965_KEIL/bitmap.h new file mode 100644 index 000000000..02ce0b365 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/bitmap.h @@ -0,0 +1,171 @@ +#ifndef BITMAP_H +#define BITMAP_H + +const unsigned char pucImage[] = +{ +0x00, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0x00, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa0, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, +0x00, 0x8f, 0xff, 0xff, 0xf8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x88, 0x88, 0x88, +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x78, 0x8f, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x88, 0x77, 0x77, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xf0, 0x00, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, +0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x08, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, +0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0x00, 0x8f, 0x00, 0xff, +0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x78, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x07, +0x00, 0x70, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, +0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0x88, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x07, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf8, +0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x8f, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0x87, 0x77, +0x77, 0x77, 0x78, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x88, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf8, 0x87, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, +0x78, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xff, 0x80, 0x00, 0x8f, 0x8f, 0xff, 0x87, 0x77, 0x77, 0x77, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, +0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x8f, 0x07, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, +0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x07, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, +0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0f, 0x00, 0x8f, 0x00, 0xff, +0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, +0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, +0x78, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x70, 0x08, 0x00, 0x88, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x88, 0x88, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, +0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x70, 0x07, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x87, 0x88, +0x88, 0x8f, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x7f, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf7, 0x88, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf7, +0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x88, 0x88, 0x88, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0x87, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, +0x00, 0x00, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, +0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x07, 0xff, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xff, 0xff, 0x88, 0x88, 0x88, 0x88, +0xff, 0xff, 0xff, 0xff, 0x88, 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x87, 0x77, 0x77, 0x77, +0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0x00, 0x0f, 0x70, 0x08, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0x00, 0x07, 0x70, 0x07, +0x88, 0x88, 0x88, 0xff, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x70, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x08, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x08, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa0, 0x00, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, +0x00 }; + +#define bmpBITMAP_HEIGHT 50 +#define bmpBITMAP_WIDTH 128 + +#endif diff --git a/Demo/CORTEX_LM3S2965_KEIL/lcd_message.h b/Demo/CORTEX_LM3S2965_KEIL/lcd_message.h new file mode 100644 index 000000000..ced7a1dbc --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/lcd_message.h @@ -0,0 +1,9 @@ +#ifndef LCD_MESSAGE_H +#define LCD_MESSAGE_H + +typedef struct +{ + char *pcMessage; +} xOLEDMessage; + +#endif /* LCD_MESSAGE_H */ diff --git a/Demo/CORTEX_LM3S2965_KEIL/main.c b/Demo/CORTEX_LM3S2965_KEIL/main.c new file mode 100644 index 000000000..9a0216cd2 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/main.c @@ -0,0 +1,313 @@ +/* + FreeRTOS.org V4.3.0 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + *************************************************************************** +*/ + + +/* + * Creates all the demo application tasks, then starts the scheduler. The WEB + * documentation provides more details of the standard demo application tasks. + * In addition to the standard demo tasks, the following tasks and tests are + * defined and/or created within this file: + * + * "Fast Interrupt Test" - A high frequency periodic interrupt is generated + * using a free running timer to demonstrate the use of the + * configKERNEL_INTERRUPT_PRIORITY configuration constant. The interrupt + * service routine measures the number of processor clocks that occur between + * each interrupt - and in so doing measures the jitter in the interrupt timing. + * The maximum measured jitter time is latched in the ulMaxJitter variable, and + * displayed on the OLED display by the 'Check' task as described below. The + * fast interrupt is configured and handled in the timertest.c source file. + * + * "OLED" task - the OLED task is a 'gatekeeper' task. It is the only task that + * is permitted to access the display directly. Other tasks wishing to write a + * message to the OLED send the message on a queue to the OLED task instead of + * accessing the OLED themselves. The OLED task just blocks on the queue waiting + * for messages - waking and displaying the messages as they arrive. + * + * "Check" task - This only executes every five seconds but has the highest + * priority so is guaranteed to get processor time. Its main function is to + * check that all the standard demo tasks are still operational. Should any + * unexpected behaviour within a demo task be discovered the 'check' task will + * write an error to the OLED (via the OLED task). If all the demo tasks are + * executing with their expected behaviour then the check task writes PASS + * along with the max jitter time to the OLED (again via the OLED task), as + * described above. + * + */ + + + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "Task.h" +#include "queue.h" +#include "semphr.h" + +/* Demo app includes. */ +#include "BlockQ.h" +#include "death.h" +#include "integer.h" +#include "blocktim.h" +#include "flash.h" +#include "partest.h" +#include "semtest.h" +#include "pollq.h" +#include "lcd_message.h" +#include "bitmap.h" + +/* Hardware library includes. */ +#include "hw_memmap.h" +#include "hw_types.h" +#include "sysctl.h" +#include "gpio.h" +#include "osram128x64x4.h" + +/*-----------------------------------------------------------*/ + +/* The time between cycles of the 'check' task. */ +#define mainCHECK_DELAY ( ( portTickType ) 5000 / portTICK_RATE_MS ) + +/* The check task uses the sprintf function so requires a little more stack too. */ +#define mainCHECK_TASK_STACK_SIZE ( configMINIMAL_STACK_SIZE + 50 ) + +/* Task priorities. */ +#define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2 ) +#define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 ) +#define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 ) +#define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 ) +#define mainCREATOR_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 ) +#define mainINTEGER_TASK_PRIORITY ( tskIDLE_PRIORITY ) + +/* The maximum number of message that can be waiting for display at any one +time. */ +#define mainOLED_QUEUE_SIZE ( 3 ) + +/* Dimensions the buffer into which the jitter time is written. */ +#define mainMAX_MSG_LEN 25 + +/* The period of the system clock in nano seconds. This is used to calculate +the jitter time in nano seconds. */ +#define mainNS_PER_CLOCK ( ( unsigned portLONG ) ( ( 1.0 / ( double ) configCPU_CLOCK_HZ ) * 1000000000.0 ) ) + +/* Constants used when writing strings to the display. */ +#define mainCHARACTER_HEIGHT ( 9 ) +#define mainMAX_ROWS ( mainCHARACTER_HEIGHT * 7 ) +#define mainFULL_SCALE ( 15 ) +#define ulSSI_FREQUENCY 1000000 + +/*-----------------------------------------------------------*/ + +/* + * Checks the status of all the demo tasks then prints a message to the + * display. The message will be either PASS - an include in brackets the + * maximum measured jitter time (as described at the to of the file), or a + * message that describes which of the standard demo tasks an error has been + * discovered in. + * + * Messages are not written directly to the terminal, but passed to vOLEDTask + * via a queue. + */ +static void vCheckTask( void *pvParameters ); + +/* + * The display is written two by more than one task so is controlled by a + * 'gatekeeper' task. This is the only task that is actually permitted to + * access the display directly. Other tasks wanting to display a message send + * the message to the gatekeeper. + */ +static void vOLEDTask( void *pvParameters ); + +/* + * Configure the hardware for the demo. + */ +static void prvSetupHardware( void ); + +/* + * Configures the high frequency timers - those used to measure the timing + * jitter while the real time kernel is executing. + */ +extern void vSetupTimer( void ); + +/*-----------------------------------------------------------*/ + +/* The queue used to send messages to the OLED task. */ +xQueueHandle xOLEDQueue; + +/* The welcome text. */ +const portCHAR * const pcWelcomeMessage = " www.FreeRTOS.org"; + +/*-----------------------------------------------------------*/ + +int main( void ) +{ + prvSetupHardware(); + + /* Create the queue used by the OLED task. Messages for display on the OLED + are received via this queue. */ + xOLEDQueue = xQueueCreate( mainOLED_QUEUE_SIZE, sizeof( xOLEDMessage ) ); + + /* Start the standard demo tasks. */ + vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY ); + vCreateBlockTimeTasks(); + vStartSemaphoreTasks( mainSEM_TEST_PRIORITY ); + vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY ); + vStartIntegerMathTasks( mainINTEGER_TASK_PRIORITY ); + + /* Start the tasks defined within this file/specific to this demo. */ + xTaskCreate( vCheckTask, ( signed portCHAR * ) "Check", mainCHECK_TASK_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL ); + xTaskCreate( vOLEDTask, ( signed portCHAR * ) "OLED", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL ); + + /* The suicide tasks must be created last as they need to know how many + tasks were running prior to their creation in order to ascertain whether + or not the correct/expected number of tasks are running at any given time. */ + vCreateSuicidalTasks( mainCREATOR_TASK_PRIORITY ); + + /* Configure the high frequency interrupt used to measure the interrupt + jitter time. */ + #ifdef __ICCARM__ + vSetupTimer(); + #endif + + /* Start the scheduler. */ + vTaskStartScheduler(); + + /* Will only get here if there was insufficient memory to create the idle + task. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void prvSetupHardware( void ) +{ + /* Set the clocking to run from the PLL at 50 MHz */ + SysCtlClockSet( SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ ); + + /* Enable Port F for Ethernet LEDs + LED0 Bit 3 Output + LED1 Bit 2 Output */ + SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOF ); + GPIODirModeSet( GPIO_PORTF_BASE, (GPIO_PIN_2 | GPIO_PIN_3), GPIO_DIR_MODE_HW ); + GPIOPadConfigSet( GPIO_PORTF_BASE, (GPIO_PIN_2 | GPIO_PIN_3 ), GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD ); + + vParTestInitialise(); +} +/*-----------------------------------------------------------*/ + +static void vCheckTask( void *pvParameters ) +{ +portTickType xLastExecutionTime; +xOLEDMessage xMessage; +static portCHAR cPassMessage[ mainMAX_MSG_LEN ]; +extern unsigned portLONG ulMaxJitter; + + xLastExecutionTime = xTaskGetTickCount(); + xMessage.pcMessage = cPassMessage; + + for( ;; ) + { + /* Perform this check every mainCHECK_DELAY milliseconds. */ + vTaskDelayUntil( &xLastExecutionTime, mainCHECK_DELAY ); + + /* Has an error been found in any task? */ + + if( xAreBlockingQueuesStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN BLOCK Q"; + } + else if( xAreBlockTimeTestTasksStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN BLOCK TIME"; + } + else if( xAreSemaphoreTasksStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN SEMAPHORE"; + } + else if( xArePollingQueuesStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN POLL Q"; + } + else if( xIsCreateTaskStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN CREATE"; + } + else if( xAreIntegerMathsTaskStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN MATH"; + } + else + { + #ifdef __ICCARM__ + sprintf( cPassMessage, "PASS [%uns]", ulMaxJitter * mainNS_PER_CLOCK ); + #else + sprintf( cPassMessage, "PASS" ); + #endif + } + + /* Send the message to the OLED gatekeeper for display. */ + xQueueSend( xOLEDQueue, &xMessage, portMAX_DELAY ); + } +} +/*-----------------------------------------------------------*/ + + + +void vOLEDTask( void *pvParameters ) +{ +xOLEDMessage xMessage; +unsigned portLONG ulY = mainMAX_ROWS; + + /* Initialise the OLED and display a startup message. */ + OSRAM128x64x4Init( ulSSI_FREQUENCY ); + + OSRAM128x64x4StringDraw( " POWERED BY FreeRTOS", 0, 0, mainFULL_SCALE ); + OSRAM128x64x4ImageDraw( pucImage, 0, mainCHARACTER_HEIGHT + 1, bmpBITMAP_WIDTH, bmpBITMAP_HEIGHT ); + + for( ;; ) + { + /* Wait for a message to arrive that requires displaying. */ + xQueueReceive( xOLEDQueue, &xMessage, portMAX_DELAY ); + + /* Write the message on the next available row. */ + ulY += mainCHARACTER_HEIGHT; + if( ulY >= mainMAX_ROWS ) + { + ulY = mainCHARACTER_HEIGHT; + OSRAM128x64x4Clear(); + OSRAM128x64x4StringDraw( pcWelcomeMessage, 0, 0, mainFULL_SCALE ); + } + + /* Display the message. */ + OSRAM128x64x4StringDraw( xMessage.pcMessage, 0, ulY, mainFULL_SCALE ); + } +} diff --git a/Demo/CORTEX_LM3S2965_KEIL/startup_rvmdk.S b/Demo/CORTEX_LM3S2965_KEIL/startup_rvmdk.S new file mode 100644 index 000000000..1682047b9 --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/startup_rvmdk.S @@ -0,0 +1,247 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2007 Luminary Micro, Inc. All rights reserved. +; +; Software License Agreement +; +; Luminary Micro, Inc. (LMI) is supplying this software for use solely and +; exclusively on LMI's microcontroller products. +; +; The software is owned by LMI and/or its suppliers, and is protected under +; applicable copyright laws. All rights are reserved. Any use in violation +; of the foregoing restrictions may subject the user to criminal sanctions +; under applicable laws, as well as to civil liability for the breach of the +; terms and conditions of this license. +; +; THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +; OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +; MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +; LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +; CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 1408 of the Stellaris Peripheral Driver Library. +; +;****************************************************************************** + +;****************************************************************************** +; +; 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 + +;****************************************************************************** +; +; 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 ; MPU Fault Handler + DCD IntDefaultHandler ; Bus Fault Handler + DCD IntDefaultHandler ; 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 + EXTERN xPortPendSVHandler + DCD xPortPendSVHandler ; PendSV Handler + EXTERN xPortSysTickHandler + DCD xPortSysTickHandler ; 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 + DCD IntDefaultHandler ; UART1 + DCD IntDefaultHandler ; SSI + DCD IntDefaultHandler ; I2C + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog + EXTERN Timer0IntHandler + DCD Timer0IntHandler ; Timer 0A + DCD IntDefaultHandler ; Timer 0B + DCD IntDefaultHandler ; Timer 1A + DCD IntDefaultHandler ; Timer 1B + DCD IntDefaultHandler ; Timer 2A + DCD IntDefaultHandler ; Timer 2B + DCD IntDefaultHandler ; Comp 0 + DCD IntDefaultHandler ; Comp 1 + DCD IntDefaultHandler ; Comp 2 + DCD IntDefaultHandler ; System Control + 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 IntDefaultHandler ; Ethernet + DCD IntDefaultHandler ; Hibernate + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; 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. It will then call __rt_entry, which will be either the + ; C library version or the one supplied here depending on the + ; configured startup type. + ; + 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/Demo/CORTEX_LM3S2965_KEIL/timertest.c b/Demo/CORTEX_LM3S2965_KEIL/timertest.c new file mode 100644 index 000000000..2eddbfcda --- /dev/null +++ b/Demo/CORTEX_LM3S2965_KEIL/timertest.c @@ -0,0 +1,133 @@ +/* + FreeRTOS.org V4.3.0 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + + Also see http://www.SafeRTOS.com for an IEC 61508 compliant version along + with commercial development and support options. + *************************************************************************** +*/ + +/* High speed timer test as described in main.c. */ + +/* Scheduler includes. */ +#include "FreeRTOS.h" + +/* Library includes. */ +#include "hw_ints.h" +#include "hw_memmap.h" +#include "hw_types.h" +#include "interrupt.h" +#include "sysctl.h" +#include "LMI_timer.h" + +/* The set frequency of the interrupt. Deviations from this are measured as +the jitter. */ +#define timerINTERRUPT_FREQUENCY ( 20000UL ) + +/* The expected time between each of the timer interrupts - if the jitter was +zero. */ +#define timerEXPECTED_DIFFERENCE_VALUE ( configCPU_CLOCK_HZ / timerINTERRUPT_FREQUENCY ) + +/* The highest available interrupt priority. */ +#define timerHIGHEST_PRIORITY ( 0 ) + +/* Misc defines. */ +#define timerMAX_32BIT_VALUE ( 0xffffffffUL ) +#define timerTIMER_1_COUNT_VALUE ( * ( ( unsigned long * ) ( TIMER1_BASE + 0x48 ) ) ) + +/*-----------------------------------------------------------*/ + +/* Interrupt handler in which the jitter is measured. */ +void Timer0IntHandler( void ); + +/* Stores the value of the maximum recorded jitter between interrupts. */ +unsigned portLONG ulMaxJitter = 0; + +/*-----------------------------------------------------------*/ + +void vSetupTimer( void ) +{ +unsigned long ulFrequency; + + /* Timer zero is used to generate the interrupts, and timer 1 is used + to measure the jitter. */ + SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER0 ); + SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER1 ); + TimerConfigure( TIMER0_BASE, TIMER_CFG_32_BIT_PER ); + TimerConfigure( TIMER1_BASE, TIMER_CFG_32_BIT_PER ); + + /* Set the timer interrupt to be above the kernel - highest. */ + IntPrioritySet( INT_TIMER0A, timerHIGHEST_PRIORITY ); + + /* Just used to measure time. */ + TimerLoadSet(TIMER1_BASE, TIMER_A, timerMAX_32BIT_VALUE ); + + /* The rate at which the timer will interrupt. */ + ulFrequency = configCPU_CLOCK_HZ / timerINTERRUPT_FREQUENCY; + TimerLoadSet( TIMER0_BASE, TIMER_A, ulFrequency ); + IntEnable( INT_TIMER0A ); + TimerIntEnable( TIMER0_BASE, TIMER_TIMA_TIMEOUT ); + + /* Enable both timers. */ + TimerEnable( TIMER0_BASE, TIMER_A ); + TimerEnable( TIMER1_BASE, TIMER_A ); +} +/*-----------------------------------------------------------*/ + +void Timer0IntHandler( void ) +{ +unsigned portLONG ulDifference, ulCurrentCount; +static portLONG ulMaxDifference = 0, ulLastCount = 0; + + /* We use the timer 1 counter value to measure the clock cycles between + the timer 0 interrupts. */ + ulCurrentCount = timerTIMER_1_COUNT_VALUE; + + if( ulCurrentCount < ulLastCount ) + { + /* How many times has timer 1 counted since the last interrupt? */ + ulDifference = ulLastCount - ulCurrentCount; + + /* Is this the largest difference we have measured yet? */ + if( ulDifference > ulMaxDifference ) + { + ulMaxDifference = ulDifference; + ulMaxJitter = ulMaxDifference - timerEXPECTED_DIFFERENCE_VALUE; + } + } + + ulLastCount = ulCurrentCount; + + TimerIntClear( TIMER0_BASE, TIMER_TIMA_TIMEOUT ); +} + + + + + diff --git a/Demo/CORTEX_LM3S6965_GCC/FreeRTOSConfig.h b/Demo/CORTEX_LM3S6965_GCC/FreeRTOSConfig.h new file mode 100644 index 000000000..e41bcd6a6 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/FreeRTOSConfig.h @@ -0,0 +1,80 @@ +/* + FreeRTOS.org V4.3.0 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + + Also see http://www.SafeRTOS.com for an IEC 61508 compliant version along + with commercial development and support options. + *************************************************************************** +*/ + +#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. + *----------------------------------------------------------*/ + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 0 +#define configUSE_TICK_HOOK 0 +#define configCPU_CLOCK_HZ ( ( unsigned portLONG ) 50000000 ) +#define configTICK_RATE_HZ ( ( portTickType ) 1000 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned portSHORT ) 70 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 12000 ) ) +#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 configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 ) +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +/* 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 0 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 + + +#define configKERNEL_INTERRUPT_PRIORITY 255 + + +#endif /* FREERTOS_CONFIG_H */ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/LM3Sxxx.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/LM3Sxxx.h new file mode 100644 index 000000000..11952d416 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/LM3Sxxx.h @@ -0,0 +1,64 @@ +//***************************************************************************** +// +// LM3Sxxx.h - Header file for Luminary Micro LM3Sxxx microcontrollers. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __LM3SXXX_H__ +#define __LM3SXXX_H__ + +#include "hw_adc.h" +#include "hw_comp.h" +#include "hw_flash.h" +#include "hw_gpio.h" +#include "hw_i2c.h" +#include "hw_ints.h" +#include "hw_memmap.h" +#include "hw_nvic.h" +#include "hw_pwm.h" +#include "hw_qei.h" +#include "hw_ssi.h" +#include "hw_sysctl.h" +#include "hw_timer.h" +#include "hw_types.h" +#include "hw_uart.h" +#include "hw_watchdog.h" +#include "adc.h" +#include "comp.h" +#include "cpu.h" +#include "debug.h" +#include "flash.h" +#include "gpio.h" +#include "i2c.h" +#include "interrupt.h" +#include "pwm.h" +#include "qei.h" +#include "ssi.h" +#include "sysctl.h" +#include "systick.h" +#include "timer.h" +#include "uart.h" +#include "watchdog.h" + +#endif // __LM3SXXX_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/LM3Sxxxx.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/LM3Sxxxx.h new file mode 100644 index 000000000..bafb07cda --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/LM3Sxxxx.h @@ -0,0 +1,70 @@ +//***************************************************************************** +// +// LM3Sxxxx.h - Header file for Luminary Micro LM3Sxxxx microcontrollers. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __LM3SXXXX_H__ +#define __LM3SXXXX_H__ + +#include "hw_adc.h" +#include "hw_can.h" +#include "hw_comp.h" +#include "hw_ethernet.h" +#include "hw_flash.h" +#include "hw_gpio.h" +#include "hw_hibernate.h" +#include "hw_i2c.h" +#include "hw_ints.h" +#include "hw_memmap.h" +#include "hw_nvic.h" +#include "hw_pwm.h" +#include "hw_qei.h" +#include "hw_ssi.h" +#include "hw_sysctl.h" +#include "hw_timer.h" +#include "hw_types.h" +#include "hw_uart.h" +#include "hw_watchdog.h" +#include "adc.h" +#include "can.h" +#include "comp.h" +#include "cpu.h" +#include "debug.h" +#include "ethernet.h" +#include "flash.h" +#include "gpio.h" +#include "hibernate.h" +#include "i2c.h" +#include "interrupt.h" +#include "pwm.h" +#include "qei.h" +#include "ssi.h" +#include "sysctl.h" +#include "systick.h" +#include "timer.h" +#include "uart.h" +#include "watchdog.h" + +#endif // __LM3SXXXX_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/_flash.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/_flash.h new file mode 100644 index 000000000..75d30c41c --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/_flash.h @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// flash.h - Prototypes for the flash driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __FLASH_H__ +#define __FLASH_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to FlashProtectSet(), and returned by +// FlashProtectGet(). +// +//***************************************************************************** +typedef enum +{ + FlashReadWrite, // Flash can be read and written + FlashReadOnly, // Flash can only be read + FlashExecuteOnly // Flash can only be executed +} +tFlashProtection; + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern unsigned long FlashUsecGet(void); +extern void FlashUsecSet(unsigned long ulClocks); +extern long FlashErase(unsigned long ulAddress); +extern long FlashProgram(unsigned long *pulData, unsigned long ulAddress, + unsigned long ulCount); +extern tFlashProtection FlashProtectGet(unsigned long ulAddress); +extern long FlashProtectSet(unsigned long ulAddress, + tFlashProtection eProtect); +extern long FlashProtectSave(void); +extern long FlashUserGet(unsigned long *pulUser0, unsigned long *pulUser1); +extern long FlashUserSet(unsigned long ulUser0, unsigned long ulUser1); +extern long FlashUserSave(void); +extern void FlashIntRegister(void (*pfnHandler)(void)); +extern void FlashIntUnregister(void); +extern void FlashIntEnable(unsigned long ulIntFlags); +extern void FlashIntDisable(unsigned long ulIntFlags); +extern unsigned long FlashIntGetStatus(tBoolean bMasked); +extern void FlashIntClear(unsigned long ulIntFlags); + +#ifdef __cplusplus +} +#endif + +#endif // __FLASH_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/_timer.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/_timer.h new file mode 100644 index 000000000..85b3160ab --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/_timer.h @@ -0,0 +1,137 @@ +//***************************************************************************** +// +// timer.h - Prototypes for the timer module +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __TIMER_H__ +#define __TIMER_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to TimerConfigure as the ulConfig parameter. +// +//***************************************************************************** +#define TIMER_CFG_32_BIT_OS 0x00000001 // 32-bit one-shot timer +#define TIMER_CFG_32_BIT_PER 0x00000002 // 32-bit periodic timer +#define TIMER_CFG_32_RTC 0x01000000 // 32-bit RTC timer +#define TIMER_CFG_16_BIT_PAIR 0x04000000 // Two 16-bit timers +#define TIMER_CFG_A_ONE_SHOT 0x00000001 // Timer A one-shot timer +#define TIMER_CFG_A_PERIODIC 0x00000002 // Timer A periodic timer +#define TIMER_CFG_A_CAP_COUNT 0x00000003 // Timer A event counter +#define TIMER_CFG_A_CAP_TIME 0x00000007 // Timer A event timer +#define TIMER_CFG_A_PWM 0x0000000A // Timer A PWM output +#define TIMER_CFG_B_ONE_SHOT 0x00000100 // Timer B one-shot timer +#define TIMER_CFG_B_PERIODIC 0x00000200 // Timer B periodic timer +#define TIMER_CFG_B_CAP_COUNT 0x00000300 // Timer B event counter +#define TIMER_CFG_B_CAP_TIME 0x00000700 // Timer B event timer +#define TIMER_CFG_B_PWM 0x00000A00 // Timer B PWM output + +//***************************************************************************** +// +// Values that can be passed to TimerIntEnable, TimerIntDisable, and +// TimerIntClear as the ulIntFlags parameter, and returned from TimerIntStatus. +// +//***************************************************************************** +#define TIMER_CAPB_EVENT 0x00000400 // CaptureB event interrupt +#define TIMER_CAPB_MATCH 0x00000200 // CaptureB match interrupt +#define TIMER_TIMB_TIMEOUT 0x00000100 // TimerB time out interrupt +#define TIMER_RTC_MATCH 0x00000008 // RTC interrupt mask +#define TIMER_CAPA_EVENT 0x00000004 // CaptureA event interrupt +#define TIMER_CAPA_MATCH 0x00000002 // CaptureA match interrupt +#define TIMER_TIMA_TIMEOUT 0x00000001 // TimerA time out interrupt + +//***************************************************************************** +// +// Values that can be passed to TimerControlEvent as the ulEvent parameter. +// +//***************************************************************************** +#define TIMER_EVENT_POS_EDGE 0x00000000 // Count positive edges +#define TIMER_EVENT_NEG_EDGE 0x00000404 // Count negative edges +#define TIMER_EVENT_BOTH_EDGES 0x00000C0C // Count both edges + +//***************************************************************************** +// +// Values that can be passed to most of the timer APIs as the ulTimer +// parameter. +// +//***************************************************************************** +#define TIMER_A 0x000000ff // Timer A +#define TIMER_B 0x0000ff00 // Timer B +#define TIMER_BOTH 0x0000ffff // Timer Both + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void TimerEnable(unsigned long ulBase, unsigned long ulTimer); +extern void TimerDisable(unsigned long ulBase, unsigned long ulTimer); +extern void TimerConfigure(unsigned long ulBase, unsigned long ulConfig); +extern void TimerControlLevel(unsigned long ulBase, unsigned long ulTimer, + tBoolean bInvert); +extern void TimerControlTrigger(unsigned long ulBase, unsigned long ulTimer, + tBoolean bEnable); +extern void TimerControlEvent(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulEvent); +extern void TimerControlStall(unsigned long ulBase, unsigned long ulTimer, + tBoolean bStall); +extern void TimerRTCEnable(unsigned long ulBase); +extern void TimerRTCDisable(unsigned long ulBase); +extern void TimerPrescaleSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerPrescaleGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerPrescaleMatchSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerPrescaleMatchGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerLoadSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerLoadGet(unsigned long ulBase, unsigned long ulTimer); +extern unsigned long TimerValueGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerMatchSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerMatchGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerIntRegister(unsigned long ulBase, unsigned long ulTimer, + void (*pfnHandler)(void)); +extern void TimerIntUnregister(unsigned long ulBase, unsigned long ulTimer); +extern void TimerIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void TimerIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long TimerIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void TimerIntClear(unsigned long ulBase, unsigned long ulIntFlags); +extern void TimerQuiesce(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __TIMER_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/adc.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/adc.h new file mode 100644 index 000000000..7533ccfd8 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/adc.h @@ -0,0 +1,130 @@ +//***************************************************************************** +// +// adc.h - ADC headers for using the ADC driver functions. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __ADC_H__ +#define __ADC_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to ADCSequenceConfigure as the ulTrigger +// parameter. +// +//***************************************************************************** +#define ADC_TRIGGER_PROCESSOR 0x00000000 // Processor event +#define ADC_TRIGGER_COMP0 0x00000001 // Analog comparator 0 event +#define ADC_TRIGGER_COMP1 0x00000002 // Analog comparator 1 event +#define ADC_TRIGGER_COMP2 0x00000003 // Analog comparator 2 event +#define ADC_TRIGGER_EXTERNAL 0x00000004 // External event +#define ADC_TRIGGER_TIMER 0x00000005 // Timer event +#define ADC_TRIGGER_PWM0 0x00000006 // PWM0 event +#define ADC_TRIGGER_PWM1 0x00000007 // PWM1 event +#define ADC_TRIGGER_PWM2 0x00000008 // PWM2 event +#define ADC_TRIGGER_ALWAYS 0x0000000F // Always event + +//***************************************************************************** +// +// Values that can be passed to ADCSequenceStepConfigure as the ulConfig +// parameter. +// +//***************************************************************************** +#define ADC_CTL_TS 0x00000080 // Temperature sensor select +#define ADC_CTL_IE 0x00000040 // Interrupt enable +#define ADC_CTL_END 0x00000020 // Sequence end select +#define ADC_CTL_D 0x00000010 // Differential select +#define ADC_CTL_CH0 0x00000000 // Input channel 0 +#define ADC_CTL_CH1 0x00000001 // Input channel 1 +#define ADC_CTL_CH2 0x00000002 // Input channel 2 +#define ADC_CTL_CH3 0x00000003 // Input channel 3 +#define ADC_CTL_CH4 0x00000004 // Input channel 4 +#define ADC_CTL_CH5 0x00000005 // Input channel 5 +#define ADC_CTL_CH6 0x00000006 // Input channel 6 +#define ADC_CTL_CH7 0x00000007 // Input channel 7 + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void ADCIntRegister(unsigned long ulBase, unsigned long ulSequenceNum, + void (*pfnHandler)(void)); +extern void ADCIntUnregister(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCIntDisable(unsigned long ulBase, unsigned long ulSequenceNum); +extern void ADCIntEnable(unsigned long ulBase, unsigned long ulSequenceNum); +extern unsigned long ADCIntStatus(unsigned long ulBase, + unsigned long ulSequenceNum, + tBoolean bMasked); +extern void ADCIntClear(unsigned long ulBase, unsigned long ulSequenceNum); +extern void ADCSequenceEnable(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCSequenceDisable(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCSequenceConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulTrigger, + unsigned long ulPriority); +extern void ADCSequenceStepConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulStep, + unsigned long ulConfig); +extern long ADCSequenceOverflow(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCSequenceOverflowClear(unsigned long ulBase, + unsigned long ulSequenceNum); +extern long ADCSequenceUnderflow(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCSequenceUnderflowClear(unsigned long ulBase, + unsigned long ulSequenceNum); +extern long ADCSequenceDataGet(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long *pulBuffer); +extern void ADCProcessorTrigger(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCSoftwareOversampleConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulFactor); +extern void ADCSoftwareOversampleStepConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulStep, + unsigned long ulConfig); +extern void ADCSoftwareOversampleDataGet(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long *pulBuffer, + unsigned long ulCount); +extern void ADCHardwareOversampleConfigure(unsigned long ulBase, + unsigned long ulFactor); + +#ifdef __cplusplus +} +#endif + +#endif // __ADC_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/can.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/can.h new file mode 100644 index 000000000..bdd623304 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/can.h @@ -0,0 +1,441 @@ +//***************************************************************************** +// +// can.h - Defines and Macros for the CAN controller. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __CAN_H__ +#define __CAN_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup can_api +//! @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// Miscellaneous defines for Message ID Types +// +//***************************************************************************** + +//***************************************************************************** +// +//! These are the flags used by the tCANMsgObject variable when calling the +//! the CANMessageSet() and CANMessageGet() APIs. +// +//***************************************************************************** +typedef enum +{ + // + //! This indicates that transmit interrupts should be enabled, or are + //! enabled. + // + MSG_OBJ_TX_INT_ENABLE = 0x00000001, + + // + //! This indicates that receive interrupts should be enabled or are + //! enabled. + // + MSG_OBJ_RX_INT_ENABLE = 0x00000002, + + // + //! This indicates that a message object will use or is using an extended + //! identifier. + // + MSG_OBJ_EXTENDED_ID = 0x00000004, + + // + //! This indicates that a message object will use or is using filtering + //! based on the object's message Identifier. + // + MSG_OBJ_USE_ID_FILTER = 0x00000008, + + // + //! This indicates that new data was available in the message object. + // + MSG_OBJ_NEW_DATA = 0x00000080, + + // + //! This indicates that data was lost since this message object was last + //! read. + // + MSG_OBJ_DATA_LOST = 0x00000100, + + // + //! This indicates that a message object will use or is using filtering + //! based on the direction of the transfer. If the direction filtering is + //! used then ID filtering must also be enabled. + // + MSG_OBJ_USE_DIR_FILTER = (0x00000010 | MSG_OBJ_USE_ID_FILTER), + + // + //! This indicates that a message object will use or is using message + //! identifier filtering based of the the extended identifier. + //! If the extended identifier filtering is used then ID filtering must + //! also be enabled. + // + MSG_OBJ_USE_EXT_FILTER = (0x00000020 | MSG_OBJ_USE_ID_FILTER), + + // + //! This indicates that a message object is a remote frame. + // + MSG_OBJ_REMOTE_FRAME = 0x00000040, + + // + //! This indicates that a message object has no flags set. + // + MSG_OBJ_NO_FLAGS = 0x00000000 +} +tCANObjFlags; + +//***************************************************************************** +// +//! This define is used with the #tCANObjFlags enumerated values to allow +//! checking only status flags and not configuration flags. +// +//***************************************************************************** +#define MSG_OBJ_STATUS_MASK (MSG_OBJ_NEW_DATA | MSG_OBJ_DATA_LOST) + +//***************************************************************************** +// +//! This structure used for encapsulating all the items associated with a CAN +//! message object in the CAN controller. +// +//***************************************************************************** +typedef struct +{ + // + //! The CAN message identifier used for 11 or 29 bit identifiers. + // + unsigned long ulMsgID; + + // + //! The message identifier mask used when identifier filtering is enabled. + // + unsigned long ulMsgIDMask; + + // + //! This value holds various status flags and settings specified by + //! tCANObjFlags. + // + unsigned long ulFlags; + + // + //! This value is the number of bytes of data in the message object. + // + unsigned long ulMsgLen; + + // + //! This is a pointer to the message object's data. + // + unsigned char *pucMsgData; +} +tCANMsgObject; + +//***************************************************************************** +// +//! This structure is used for encapsulating the values associated with setting +//! up the bit timing for a CAN controller. The structure is used when calling +//! the CANGetBitTiming and CANSetBitTiming functions. +// +//***************************************************************************** +typedef struct +{ + // + //! This value holds the sum of the Synchronization, Propagation, and Phase + //! Buffer 1 segments, measured in time quanta. The valid values for this + //! setting range from 2 to 16. + // + unsigned int uSyncPropPhase1Seg; + + // + //! This value holds the Phase Buffer 2 segment in time quanta. The valid + //! values for this setting range from 1 to 8. + // + unsigned int uPhase2Seg; + + // + //! This value holds the Resynchronization Jump Width in time quanta. The + //! valid values for this setting range from 1 to 4. + // + unsigned int uSJW; + + // + //! This value holds the CAN_CLK divider used to determine time quanta. + //! The valid values for this setting range from 1 to 1023. + // + unsigned int uQuantumPrescaler; + +} +tCANBitClkParms; + +//***************************************************************************** +// +//! This data type is used to identify the interrupt status register. This is +//! used when calling the a CANIntStatus() function. +// +//***************************************************************************** +typedef enum +{ + // + //! Read the CAN interrupt status information. + // + CAN_INT_STS_CAUSE, + + // + //! Read a message object's interrupt status. + // + CAN_INT_STS_OBJECT +} +tCANIntStsReg; + +//***************************************************************************** +// +//! This data type is used to identify which of the several status registers +//! to read when calling the CANStatusGet() function. +// +//***************************************************************************** +typedef enum +{ + // + //! Read the full CAN controller status. + // + CAN_STS_CONTROL, + + // + //! Read the full 32 bit mask of message objects with a transmit request + //! set. + // + CAN_STS_TXREQUEST, + + // + //! Read the full 32 bit mask of message objects with a new data available. + // + CAN_STS_NEWDAT, + + // + //! Read the full 32 bit mask of message objects that are enabled. + // + CAN_STS_MSGVAL +} +tCANStsReg; + +//***************************************************************************** +// +//! These definitions are used to specify interrupt sources to CANIntEnable() +//! and CANIntDisable(). +// +//***************************************************************************** +typedef enum +{ + // + //! This flag is used to allow a CAN controller to generate error + //! interrupts. + // + CAN_INT_ERROR = 0x00000008, + + // + //! This flag is used to allow a CAN controller to generate status + //! interrupts. + // + CAN_INT_STATUS = 0x00000004, + + // + //! This flag is used to allow a CAN controller to generate any CAN + //! interrupts. If this is not set then no interrupts will be generated by + //! the CAN controller. + // + CAN_INT_MASTER = 0x00000002 +} +tCANIntFlags; + +//***************************************************************************** +// +//! This definition is used to determine the type of message object that will +//! be set up via a call to the CANMessageSet() API. +// +//***************************************************************************** +typedef enum +{ + // + //! Transmit message object. + // + MSG_OBJ_TYPE_TX, + + // + //! Transmit remote request message object + // + MSG_OBJ_TYPE_TX_REMOTE, + + // + //! Receive message object. + // + MSG_OBJ_TYPE_RX, + + // + //! Receive remote request message object. + // + MSG_OBJ_TYPE_RX_REMOTE, + + // + //! Remote frame receive remote, with auto-transmit message object. + // + MSG_OBJ_TYPE_RXTX_REMOTE +} +tMsgObjType; + +//***************************************************************************** +// +//! The following enumeration contains all error or status indicators that +//! can be returned when calling the CANStatusGet() API. +// +//***************************************************************************** +typedef enum +{ + // + //! CAN controller has entered a Bus Off state. + // + CAN_STATUS_BUS_OFF = 0x00000080, + + // + //! CAN controller error level has reached warning level. + // + CAN_STATUS_EWARN = 0x00000040, + + // + //! CAN controller error level has reached error passive level. + // + CAN_STATUS_EPASS = 0x00000020, + + // + //! A message was received successfully since the last read of this status. + // + CAN_STATUS_RXOK = 0x00000010, + + // + //! A message was transmitted successfully since the last read of this + //! status. + // + CAN_STATUS_TXOK = 0x00000008, + + // + //! This is the mask for the last error code field. + // + CAN_STATUS_LEC_MSK = 0x00000007, + + // + //! There was no error. + // + CAN_STATUS_LEC_NONE = 0x00000000, + + // + //! A bit stuffing error has occurred. + // + CAN_STATUS_LEC_STUFF = 0x00000001, + + // + //! A formatting error has occurred. + // + CAN_STATUS_LEC_FORM = 0x00000002, + + // + //! An acknowledge error has occurred. + // + CAN_STATUS_LEC_ACK = 0x00000003, + + // + //! The bus remained a bit level of 1 for longer than is allowed. + // + CAN_STATUS_LEC_BIT1 = 0x00000004, + + // + //! The bus remained a bit level of 0 for longer than is allowed. + // + CAN_STATUS_LEC_BIT0 = 0x00000005, + + // + //! A CRC error has occurred. + // + CAN_STATUS_LEC_CRC = 0x00000006, + + // + //! This is the mask for the CAN Last Error Code (LEC). + // + CAN_STATUS_LEC_MASK = 0x00000007 +} +tCANStatusCtrl; + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void CANInit(unsigned long ulBase); +extern void CANEnable(unsigned long ulBase); +extern void CANDisable(unsigned long ulBase); +extern void CANSetBitTiming(unsigned long ulBase, tCANBitClkParms *pClkParms); +extern void CANGetBitTiming(unsigned long ulBase, tCANBitClkParms *pClkParms); +extern unsigned long CANReadReg(unsigned long ulRegAddress); +extern void CANWriteReg(unsigned long ulRegAddress, unsigned long ulRegValue); +extern void CANMessageSet(unsigned long ulBase, unsigned long ulObjID, + tCANMsgObject *pMsgObject, tMsgObjType eMsgType); +extern void CANMessageGet(unsigned long ulBase, unsigned long ulObjID, + tCANMsgObject *pMsgObject, tBoolean bClrPendingInt); +extern unsigned long CANStatusGet(unsigned long ulBase, tCANStsReg eStatusReg); +extern void CANMessageClear(unsigned long ulBase, unsigned long ulObjID); +extern void CANIntRegister(unsigned long ulBase, void (*pfnHandler)(void)); +extern void CANIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void CANIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern void CANIntClear(unsigned long ulBase, unsigned long ulIntClr); +extern unsigned long CANIntStatus(unsigned long ulBase, + tCANIntStsReg eIntStsReg); +extern tBoolean CANRetryGet(unsigned long ulBase); +extern void CANRetrySet(unsigned long ulBase, tBoolean bAutoRetry); +extern tBoolean CANErrCntrGet(unsigned long ulBase, unsigned long *pulRxCount, + unsigned long *pulTxCount); +extern long CANGetIntNumber(unsigned long ulBase); +extern void CANReadDataReg(unsigned char *pucData, unsigned long *pulRegister, + int iSize); +extern void CANWriteDataReg(unsigned char *pucData, unsigned long *pulRegister, + int iSize); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +#ifdef __cplusplus +} +#endif + +#endif // __CAN_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/comp.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/comp.h new file mode 100644 index 000000000..60fa1e04e --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/comp.h @@ -0,0 +1,122 @@ +//***************************************************************************** +// +// comp.h - Prototypes for the analog comparator driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __COMP_H__ +#define __COMP_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to ComparatorConfigure() as the ulConfig +// parameter. For each group (i.e. COMP_TRIG_xxx, COMP_INT_xxx, etc.), one of +// the values may be selected and ORed together will values from the other +// groups. +// +//***************************************************************************** +#define COMP_TRIG_NONE 0x00000000 // No ADC trigger +#define COMP_TRIG_HIGH 0x00000880 // Trigger when high +#define COMP_TRIG_LOW 0x00000800 // Trigger when low +#define COMP_TRIG_FALL 0x00000820 // Trigger on falling edge +#define COMP_TRIG_RISE 0x00000840 // Trigger on rising edge +#define COMP_TRIG_BOTH 0x00000860 // Trigger on both edges +#define COMP_INT_HIGH 0x00000010 // Interrupt when high +#define COMP_INT_LOW 0x00000000 // Interrupt when low +#define COMP_INT_FALL 0x00000004 // Interrupt on falling edge +#define COMP_INT_RISE 0x00000008 // Interrupt on rising edge +#define COMP_INT_BOTH 0x0000000C // Interrupt on both edges +#define COMP_ASRCP_PIN 0x00000000 // Dedicated Comp+ pin +#define COMP_ASRCP_PIN0 0x00000200 // Comp0+ pin +#define COMP_ASRCP_REF 0x00000400 // Internal voltage reference +#ifndef DEPRECATED +#define COMP_OUTPUT_NONE 0x00000000 // No comparator output +#endif +#define COMP_OUTPUT_NORMAL 0x00000000 // Comparator output normal +#define COMP_OUTPUT_INVERT 0x00000002 // Comparator output inverted + +//***************************************************************************** +// +// Values that can be passed to ComparatorSetRef() as the ulRef parameter. +// +//***************************************************************************** +#define COMP_REF_OFF 0x00000000 // Turn off the internal reference +#define COMP_REF_0V 0x00000300 // Internal reference of 0V +#define COMP_REF_0_1375V 0x00000301 // Internal reference of 0.1375V +#define COMP_REF_0_275V 0x00000302 // Internal reference of 0.275V +#define COMP_REF_0_4125V 0x00000303 // Internal reference of 0.4125V +#define COMP_REF_0_55V 0x00000304 // Internal reference of 0.55V +#define COMP_REF_0_6875V 0x00000305 // Internal reference of 0.6875V +#define COMP_REF_0_825V 0x00000306 // Internal reference of 0.825V +#define COMP_REF_0_928125V 0x00000201 // Internal reference of 0.928125V +#define COMP_REF_0_9625V 0x00000307 // Internal reference of 0.9625V +#define COMP_REF_1_03125V 0x00000202 // Internal reference of 1.03125V +#define COMP_REF_1_134375V 0x00000203 // Internal reference of 1.134375V +#define COMP_REF_1_1V 0x00000308 // Internal reference of 1.1V +#define COMP_REF_1_2375V 0x00000309 // Internal reference of 1.2375V +#define COMP_REF_1_340625V 0x00000205 // Internal reference of 1.340625V +#define COMP_REF_1_375V 0x0000030A // Internal reference of 1.375V +#define COMP_REF_1_44375V 0x00000206 // Internal reference of 1.44375V +#define COMP_REF_1_5125V 0x0000030B // Internal reference of 1.5125V +#define COMP_REF_1_546875V 0x00000207 // Internal reference of 1.546875V +#define COMP_REF_1_65V 0x0000030C // Internal reference of 1.65V +#define COMP_REF_1_753125V 0x00000209 // Internal reference of 1.753125V +#define COMP_REF_1_7875V 0x0000030D // Internal reference of 1.7875V +#define COMP_REF_1_85625V 0x0000020A // Internal reference of 1.85625V +#define COMP_REF_1_925V 0x0000030E // Internal reference of 1.925V +#define COMP_REF_1_959375V 0x0000020B // Internal reference of 1.959375V +#define COMP_REF_2_0625V 0x0000030F // Internal reference of 2.0625V +#define COMP_REF_2_165625V 0x0000020D // Internal reference of 2.165625V +#define COMP_REF_2_26875V 0x0000020E // Internal reference of 2.26875V +#define COMP_REF_2_371875V 0x0000020F // Internal reference of 2.371875V + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void ComparatorConfigure(unsigned long ulBase, unsigned long ulComp, + unsigned long ulConfig); +extern void ComparatorRefSet(unsigned long ulBase, unsigned long ulRef); +extern tBoolean ComparatorValueGet(unsigned long ulBase, unsigned long ulComp); +extern void ComparatorIntRegister(unsigned long ulBase, unsigned long ulComp, + void (*pfnHandler)(void)); +extern void ComparatorIntUnregister(unsigned long ulBase, + unsigned long ulComp); +extern void ComparatorIntEnable(unsigned long ulBase, unsigned long ulComp); +extern void ComparatorIntDisable(unsigned long ulBase, unsigned long ulComp); +extern tBoolean ComparatorIntStatus(unsigned long ulBase, unsigned long ulComp, + tBoolean bMasked); +extern void ComparatorIntClear(unsigned long ulBase, unsigned long ulComp); + +#ifdef __cplusplus +} +#endif + +#endif // __COMP_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/cpu.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/cpu.h new file mode 100644 index 000000000..f21f82221 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/cpu.h @@ -0,0 +1,40 @@ +//***************************************************************************** +// +// cpu.h - Prototypes for the CPU instruction wrapper functions. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __CPU_H__ +#define __CPU_H__ + +//***************************************************************************** +// +// Prototypes. +// +//***************************************************************************** +extern void CPUcpsid(void); +extern void CPUcpsie(void); +extern void CPUwfi(void); + +#endif // __CPU_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/debug.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/debug.h new file mode 100644 index 000000000..c64b8fc2d --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/debug.h @@ -0,0 +1,56 @@ +//***************************************************************************** +// +// debug.h - Macros for assisting debug of the driver library. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __DEBUG_H__ +#define __DEBUG_H__ + +//***************************************************************************** +// +// Prototype for the function that is called when an invalid argument is passed +// to an API. This is only used when doing a DEBUG build. +// +//***************************************************************************** +extern void __error__(char *pcFilename, unsigned long ulLine); + +//***************************************************************************** +// +// The ASSERT macro, which does the actual assertion checking. Typically, this +// will be for procedure arguments. +// +//***************************************************************************** +#ifdef DEBUG +#define ASSERT(expr) { \ + if(!(expr)) \ + { \ + __error__(__FILE__, __LINE__); \ + } \ + } +#else +#define ASSERT(expr) +#endif + +#endif // __DEBUG_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/ethernet.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/ethernet.h new file mode 100644 index 000000000..127763f2c --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/ethernet.h @@ -0,0 +1,254 @@ +//***************************************************************************** +// +// ethernet.h - Defines and Macros for the ethernet module. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __ETHERNET_H__ +#define __ETHERNET_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to EthernetConfigSet as the ulConfig value, and +// returned from EthernetConfigGet. +// +//***************************************************************************** +#define ETH_CFG_RX_BADCRCDIS 0x000800 // Disable RX BAD CRC Packets +#define ETH_CFG_RX_PRMSEN 0x000400 // Enable RX Promiscuous +#define ETH_CFG_RX_AMULEN 0x000200 // Enable RX Multicast +#define ETH_CFG_TX_DPLXEN 0x000010 // Enable TX Duplex Mode +#define ETH_CFG_TX_CRCEN 0x000004 // Enable TX CRC Generation +#define ETH_CFG_TX_PADEN 0x000002 // Enable TX Padding + +//***************************************************************************** +// +// Values that can be passed to EthernetIntEnable, EthernetIntDisable, and +// EthernetIntClear as the ulIntFlags parameter, and returned from +// EthernetIntStatus. +// +//***************************************************************************** +#define ETH_INT_PHY 0x040 // PHY Event/Interrupt +#define ETH_INT_MDIO 0x020 // Management Transaction +#define ETH_INT_RXER 0x010 // RX Error +#define ETH_INT_RXOF 0x008 // RX FIFO Overrun +#define ETH_INT_TX 0x004 // TX Complete +#define ETH_INT_TXER 0x002 // TX Error +#define ETH_INT_RX 0x001 // RX Complete + +//***************************************************************************** +// +// The following define values that can be passed as register addresses to +// EthernetPHYRead and EthernetPHYWrite. +// +//***************************************************************************** +#define PHY_MR0 0 // Control +#define PHY_MR1 1 // Status +#define PHY_MR2 2 // PHY Identifier 1 +#define PHY_MR3 3 // PHY Identifier 2 +#define PHY_MR4 4 // Auto-Neg. Advertisement +#define PHY_MR5 5 // Auto-Neg. Link Partner Ability +#define PHY_MR6 6 // Auto-Neg. Expansion + // 7-15 Reserved/Not Implemented +#define PHY_MR16 16 // Vendor Specific +#define PHY_MR17 17 // Interrupt Control/Status +#define PHY_MR18 18 // Diagnostic Register +#define PHY_MR19 19 // Transceiver Control + // 20-22 Reserved +#define PHY_MR23 23 // LED Configuration Register +#define PHY_MR24 24 // MDI/MDIX Control Register + // 25-31 Reserved/Not Implemented + +//***************************************************************************** +// +// The following define bit fields in the ETH_MR0 register +// +//***************************************************************************** +#define PHY_MR0_RESET 0x8000 // Reset the PHY +#define PHY_MR0_LOOPBK 0x4000 // TXD to RXD Loopback +#define PHY_MR0_SPEEDSL 0x2000 // Speed Selection +#define PHY_MR0_SPEEDSL_10 0x0000 // Speed Selection 10BASE-T +#define PHY_MR0_SPEEDSL_100 0x2000 // Speed Selection 100BASE-T +#define PHY_MR0_ANEGEN 0x1000 // Auto-Negotiation Enable +#define PHY_MR0_PWRDN 0x0800 // Power Down +#define PHY_MR0_RANEG 0x0200 // Restart Auto-Negotiation +#define PHY_MR0_DUPLEX 0x0100 // Enable full duplex +#define PHY_MR0_DUPLEX_HALF 0x0000 // Enable half duplex mode +#define PHY_MR0_DUPLEX_FULL 0x0100 // Enable full duplex mode + +//***************************************************************************** +// +// The following define bit fields in the ETH_MR1 register +// +//***************************************************************************** +#define PHY_MR1_ANEGC 0x0020 // Auto-Negotiate Complete +#define PHY_MR1_RFAULT 0x0010 // Remove Fault Detected +#define PHY_MR1_LINK 0x0004 // Link Established +#define PHY_MR1_JAB 0x0002 // Jabber Condition Detected + +//***************************************************************************** +// +// The following define bit fields in the ETH_MR17 register +// +//***************************************************************************** +#define PHY_MR17_RXER_IE 0x4000 // Enable Receive Error Interrupt +#define PHY_MR17_LSCHG_IE 0x0400 // Enable Link Status Change Int. +#define PHY_MR17_ANEGCOMP_IE 0x0100 // Enable Auto-Negotiate Cmpl. Int. +#define PHY_MR17_RXER_INT 0x0040 // Receive Error Interrupt +#define PHY_MR17_LSCHG_INT 0x0004 // Link Status Change Interrupt +#define PHY_MR17_ANEGCOMP_INT 0x0001 // Auto-Negotiate Complete Int. + +//***************************************************************************** +// +// The following define bit fields in the ETH_MR18 register +// +//***************************************************************************** +#define PHY_MR18_ANEGF 0x1000 // Auto-Negotiate Failed +#define PHY_MR18_DPLX 0x0800 // Duplex Mode Negotiated +#define PHY_MR18_DPLX_HALF 0x0000 // Half Duplex Mode Negotiated +#define PHY_MR18_DPLX_FULL 0x0800 // Full Duplex Mode Negotiated +#define PHY_MR18_RATE 0x0400 // Rate Negotiated +#define PHY_MR18_RATE_10 0x0000 // Rate Negotiated is 10BASE-T +#define PHY_MR18_RATE_100 0x0400 // Rate Negotiated is 100BASE-TX + +//***************************************************************************** +// +// The following define bit fields in the ETH_MR23 register +// +//***************************************************************************** +#define PHY_MR23_LED1 0x00f0 // LED1 Configuration +#define PHY_MR23_LED1_LINK 0x0000 // LED1 is Link Status +#define PHY_MR23_LED1_RXTX 0x0010 // LED1 is RX or TX Activity +#define PHY_MR23_LED1_TX 0x0020 // LED1 is TX Activity +#define PHY_MR23_LED1_RX 0x0030 // LED1 is RX Activity +#define PHY_MR23_LED1_COL 0x0040 // LED1 is RX Activity +#define PHY_MR23_LED1_100 0x0050 // LED1 is RX Activity +#define PHY_MR23_LED1_10 0x0060 // LED1 is RX Activity +#define PHY_MR23_LED1_DUPLEX 0x0070 // LED1 is RX Activity +#define PHY_MR23_LED1_LINKACT 0x0080 // LED1 is Link Status + Activity +#define PHY_MR23_LED0 0x000f // LED0 Configuration +#define PHY_MR23_LED0_LINK 0x0000 // LED0 is Link Status +#define PHY_MR23_LED0_RXTX 0x0001 // LED0 is RX or TX Activity +#define PHY_MR23_LED0_TX 0x0002 // LED0 is TX Activity +#define PHY_MR23_LED0_RX 0x0003 // LED0 is RX Activity +#define PHY_MR23_LED0_COL 0x0004 // LED0 is RX Activity +#define PHY_MR23_LED0_100 0x0005 // LED0 is RX Activity +#define PHY_MR23_LED0_10 0x0006 // LED0 is RX Activity +#define PHY_MR23_LED0_DUPLEX 0x0007 // LED0 is RX Activity +#define PHY_MR23_LED0_LINKACT 0x0008 // LED0 is Link Status + Activity + +//***************************************************************************** +// +// The following define bit fields in the ETH_MR24 register +// +//***************************************************************************** +#define PHY_MR24_MDIX 0x0020 // Auto-Switching Configuration +#define PHY_MR24_MDIX_NORMAL 0x0000 // Auto-Switching in passthrough +#define PHY_MR23_MDIX_CROSSOVER 0x0020 // Auto-Switching in crossover + +//***************************************************************************** +// +// Helper Macros for Ethernet Processing +// +//***************************************************************************** +// +// htonl/ntohl - big endian/little endian byte swapping macros for +// 32-bit (long) values +// +//***************************************************************************** +#ifndef htonl + #define htonl(a) \ + ((((a) >> 24) & 0x000000ff) | \ + (((a) >> 8) & 0x0000ff00) | \ + (((a) << 8) & 0x00ff0000) | \ + (((a) << 24) & 0xff000000)) +#endif + +#ifndef ntohl + #define ntohl(a) htonl((a)) +#endif + +//***************************************************************************** +// +// htons/ntohs - big endian/little endian byte swapping macros for +// 16-bit (short) values +// +//***************************************************************************** +#ifndef htons + #define htons(a) \ + ((((a) >> 8) & 0x00ff) | \ + (((a) << 8) & 0xff00)) +#endif + +#ifndef ntohs + #define ntohs(a) htons((a)) +#endif + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void EthernetInit(unsigned long ulBase); +extern void EthernetConfigSet(unsigned long ulBase, unsigned long ulConfig); +extern unsigned long EthernetConfigGet(unsigned long ulBase); +extern void EthernetMACAddrSet(unsigned long ulBase, + unsigned char *pucMACAddr); +extern void EthernetMACAddrGet(unsigned long ulBase, + unsigned char *pucMACAddr); +extern void EthernetEnable(unsigned long ulBase); +extern void EthernetDisable(unsigned long ulBase); +extern tBoolean EthernetPacketAvail(unsigned long ulBase); +extern tBoolean EthernetSpaceAvail(unsigned long ulBase); +extern long EthernetPacketNonBlockingGet(unsigned long ulBase, + unsigned char *pucBuf, + long lBufLen); +extern long EthernetPacketGet(unsigned long ulBase, unsigned char *pucBuf, + long lBufLen); +extern long EthernetPacketNonBlockingPut(unsigned long ulBase, + unsigned char *pucBuf, + long lBufLen); +extern long EthernetPacketPut(unsigned long ulBase, unsigned char *pucBuf, + long lBufLen); +extern void EthernetIntRegister(unsigned long ulBase, + void (*pfnHandler)(void)); +extern void EthernetIntUnregister(unsigned long ulBase); +extern void EthernetIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void EthernetIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long EthernetIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void EthernetIntClear(unsigned long ulBase, unsigned long ulIntFlags); +extern void EthernetPHYWrite(unsigned long ulBase, unsigned char ucRegAddr, + unsigned long ulData); +extern unsigned long EthernetPHYRead(unsigned long ulBase, + unsigned char ucRegAddr); + +#ifdef __cplusplus +} +#endif + +#endif // __ETHERNET_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/gpio.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/gpio.h new file mode 100644 index 000000000..6e74f9d4f --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/gpio.h @@ -0,0 +1,138 @@ +//***************************************************************************** +// +// gpio.h - Defines and Macros for GPIO API. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __GPIO_H__ +#define __GPIO_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following values define the bit field for the ucPins argument to several +// of the APIs. +// +//***************************************************************************** +#define GPIO_PIN_0 0x00000001 // GPIO pin 0 +#define GPIO_PIN_1 0x00000002 // GPIO pin 1 +#define GPIO_PIN_2 0x00000004 // GPIO pin 2 +#define GPIO_PIN_3 0x00000008 // GPIO pin 3 +#define GPIO_PIN_4 0x00000010 // GPIO pin 4 +#define GPIO_PIN_5 0x00000020 // GPIO pin 5 +#define GPIO_PIN_6 0x00000040 // GPIO pin 6 +#define GPIO_PIN_7 0x00000080 // GPIO pin 7 + +//***************************************************************************** +// +// Values that can be passed to GPIODirModeSet as the ulPinIO parameter, and +// returned from GPIODirModeGet. +// +//***************************************************************************** +#define GPIO_DIR_MODE_IN 0x00000000 // Pin is a GPIO input +#define GPIO_DIR_MODE_OUT 0x00000001 // Pin is a GPIO output +#define GPIO_DIR_MODE_HW 0x00000002 // Pin is a peripheral function + +//***************************************************************************** +// +// Values that can be passed to GPIOIntTypeSet as the ulIntType parameter, and +// returned from GPIOIntTypeGet. +// +//***************************************************************************** +#define GPIO_FALLING_EDGE 0x00000000 // Interrupt on falling edge +#define GPIO_RISING_EDGE 0x00000004 // Interrupt on rising edge +#define GPIO_BOTH_EDGES 0x00000001 // Interrupt on both edges +#define GPIO_LOW_LEVEL 0x00000002 // Interrupt on low level +#define GPIO_HIGH_LEVEL 0x00000007 // Interrupt on high level + +//***************************************************************************** +// +// Values that can be passed to GPIOPadConfigSet as the ulStrength parameter, +// and returned by GPIOPadConfigGet in the *pulStrength parameter. +// +//***************************************************************************** +#define GPIO_STRENGTH_2MA 0x00000001 // 2mA drive strength +#define GPIO_STRENGTH_4MA 0x00000002 // 4mA drive strength +#define GPIO_STRENGTH_8MA 0x00000004 // 8mA drive strength +#define GPIO_STRENGTH_8MA_SC 0x0000000C // 8mA drive with slew rate control + +//***************************************************************************** +// +// Values that can be passed to GPIOPadConfigSet as the ulPadType parameter, +// and returned by GPIOPadConfigGet in the *pulPadType parameter. +// +//***************************************************************************** +#define GPIO_PIN_TYPE_STD 0x00000008 // Push-pull +#define GPIO_PIN_TYPE_STD_WPU 0x0000000A // Push-pull with weak pull-up +#define GPIO_PIN_TYPE_STD_WPD 0x0000000C // Push-pull with weak pull-down +#define GPIO_PIN_TYPE_OD 0x00000009 // Open-drain +#define GPIO_PIN_TYPE_OD_WPU 0x0000000B // Open-drain with weak pull-up +#define GPIO_PIN_TYPE_OD_WPD 0x0000000D // Open-drain with weak pull-down +#define GPIO_PIN_TYPE_ANALOG 0x00000000 // Analog comparator + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void GPIODirModeSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulPinIO); +extern unsigned long GPIODirModeGet(unsigned long ulPort, unsigned char ucPin); +extern void GPIOIntTypeSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulIntType); +extern unsigned long GPIOIntTypeGet(unsigned long ulPort, unsigned char ucPin); +extern void GPIOPadConfigSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulStrength, + unsigned long ulPadType); +extern void GPIOPadConfigGet(unsigned long ulPort, unsigned char ucPin, + unsigned long *pulStrength, + unsigned long *pulPadType); +extern void GPIOPinIntEnable(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinIntDisable(unsigned long ulPort, unsigned char ucPins); +extern long GPIOPinIntStatus(unsigned long ulPort, tBoolean bMasked); +extern void GPIOPinIntClear(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPortIntRegister(unsigned long ulPort, + void (*pfIntHandler)(void)); +extern void GPIOPortIntUnregister(unsigned long ulPort); +extern long GPIOPinRead(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinWrite(unsigned long ulPort, unsigned char ucPins, + unsigned char ucVal); +extern void GPIOPinTypeComparator(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeI2C(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypePWM(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeQEI(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeSSI(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeTimer(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeUART(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeCAN(unsigned long ulPort, unsigned char ucPins); + +#ifdef __cplusplus +} +#endif + +#endif // __GPIO_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hibernate.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hibernate.h new file mode 100644 index 000000000..69a8c144a --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hibernate.h @@ -0,0 +1,107 @@ +//***************************************************************************** +// +// hibernate.h - API definition for the Hibernation module. +// +// Copyright (c) 2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HIBERNATE_H__ +#define __HIBERNATE_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Macros needed for selecting the clock source for HibernateClockSelect() +// +//***************************************************************************** +#define HIBERNATE_CLOCK_SEL_RAW 0x04 +#define HIBERNATE_CLOCK_SEL_DIV128 0x00 + +//***************************************************************************** +// +// Macros need to configure wake events for HibernateWakeSet() +// +//***************************************************************************** +#define HIBERNATE_WAKE_PIN 0x10 +#define HIBERNATE_WAKE_RTC 0x08 + +//***************************************************************************** +// +// Macros needed to configure low battery detect for HibernateLowBatSet() +// +//***************************************************************************** +#define HIBERNATE_LOW_BAT_DETECT 0x20 +#define HIBERNATE_LOW_BAT_ABORT 0xA0 + +//***************************************************************************** +// +// Macros defining interrupt source bits for the interrupt functions. +// +//***************************************************************************** +#define HIBERNATE_INT_PIN_WAKE 0x08 +#define HIBERNATE_INT_LOW_BAT 0x04 +#define HIBERNATE_INT_RTC_MATCH_0 0x01 +#define HIBERNATE_INT_RTC_MATCH_1 0x02 + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void HibernateEnable(void); +extern void HibernateDisable(void); +extern void HibernateClockSelect(unsigned long ulClockInput); +extern void HibernateRTCEnable(void); +extern void HibernateRTCDisable(void); +extern void HibernateWakeSet(unsigned long ulWakeFlags); +extern unsigned long HibernateWakeGet(void); +extern void HibernateLowBatSet(unsigned long ulLowBatFlags); +extern unsigned long HibernateLowBatGet(void); +extern void HibernateRTCSet(unsigned long ulRTCValue); +extern unsigned long HibernateRTCGet(void); +extern void HibernateRTCMatch0Set(unsigned long ulMatch); +extern unsigned long HibernateRTCMatch0Get(void); +extern void HibernateRTCMatch1Set(unsigned long ulMatch); +extern unsigned long HibernateRTCMatch1Get(void); +extern void HibernateRTCTrimSet(unsigned long ulTrim); +extern unsigned long HibernateRTCTrimGet(void); +extern void HibernateDataSet(unsigned long *pulData, unsigned long ulCount); +extern void HibernateDataGet(unsigned long *pulData, unsigned long ulCount); +extern void HibernateRequest(void); +extern void HibernateIntEnable(unsigned long ulIntFlags); +extern void HibernateIntDisable(unsigned long ulIntFlags); +extern void HibernateIntRegister(void (*pfnHandler)(void)); +extern void HibernateIntUnregister(void); +extern unsigned long HibernateIntStatus(tBoolean bMasked); +extern void HibernateIntClear(unsigned long ulIntFlags); +extern unsigned int HibernateIsActive(void); + +#ifdef __cplusplus +} +#endif + +#endif // __HIBERNATE_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_adc.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_adc.h new file mode 100644 index 000000000..932d3f26e --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_adc.h @@ -0,0 +1,343 @@ +//***************************************************************************** +// +// hw_adc.h - Macros used when accessing the ADC hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_ADC_H__ +#define __HW_ADC_H__ + +//***************************************************************************** +// +// The following define the offsets of the ADC registers. +// +//***************************************************************************** +#define ADC_O_ACTSS 0x00000000 // Active sample register +#define ADC_O_RIS 0x00000004 // Raw interrupt status register +#define ADC_O_IM 0x00000008 // Interrupt mask register +#define ADC_O_ISC 0x0000000C // Interrupt status/clear register +#define ADC_O_OSTAT 0x00000010 // Overflow status register +#define ADC_O_EMUX 0x00000014 // Event multiplexer select reg. +#define ADC_O_USTAT 0x00000018 // Underflow status register +#define ADC_O_SSPRI 0x00000020 // Channel priority register +#define ADC_O_PSSI 0x00000028 // Processor sample initiate reg. +#define ADC_O_SAC 0x00000030 // Sample Averaging Control reg. +#define ADC_O_SSMUX0 0x00000040 // Multiplexer select 0 register +#define ADC_O_SSCTL0 0x00000044 // Sample sequence control 0 reg. +#define ADC_O_SSFIFO0 0x00000048 // Result FIFO 0 register +#define ADC_O_SSFSTAT0 0x0000004C // FIFO 0 status register +#define ADC_O_SSMUX1 0x00000060 // Multiplexer select 1 register +#define ADC_O_SSCTL1 0x00000064 // Sample sequence control 1 reg. +#define ADC_O_SSFIFO1 0x00000068 // Result FIFO 1 register +#define ADC_O_SSFSTAT1 0x0000006C // FIFO 1 status register +#define ADC_O_SSMUX2 0x00000080 // Multiplexer select 2 register +#define ADC_O_SSCTL2 0x00000084 // Sample sequence control 2 reg. +#define ADC_O_SSFIFO2 0x00000088 // Result FIFO 2 register +#define ADC_O_SSFSTAT2 0x0000008C // FIFO 2 status register +#define ADC_O_SSMUX3 0x000000A0 // Multiplexer select 3 register +#define ADC_O_SSCTL3 0x000000A4 // Sample sequence control 3 reg. +#define ADC_O_SSFIFO3 0x000000A8 // Result FIFO 3 register +#define ADC_O_SSFSTAT3 0x000000AC // FIFO 3 status register +#define ADC_O_TMLB 0x00000100 // Test mode loopback register + +//***************************************************************************** +// +// The following define the offsets of the ADC sequence registers. +// +//***************************************************************************** +#define ADC_O_SEQ 0x00000040 // Offset to the first sequence +#define ADC_O_SEQ_STEP 0x00000020 // Increment to the next sequence +#define ADC_O_X_SSMUX 0x00000000 // Multiplexer select register +#define ADC_O_X_SSCTL 0x00000004 // Sample sequence control register +#define ADC_O_X_SSFIFO 0x00000008 // Result FIFO register +#define ADC_O_X_SSFSTAT 0x0000000C // FIFO status register + +//***************************************************************************** +// +// The following define the bit fields in the ADC_ACTSS register. +// +//***************************************************************************** +#define ADC_ACTSS_ASEN3 0x00000008 // Sample sequence 3 enable +#define ADC_ACTSS_ASEN2 0x00000004 // Sample sequence 2 enable +#define ADC_ACTSS_ASEN1 0x00000002 // Sample sequence 1 enable +#define ADC_ACTSS_ASEN0 0x00000001 // Sample sequence 0 enable + +//***************************************************************************** +// +// The following define the bit fields in the ADC_RIS register. +// +//***************************************************************************** +#define ADC_RIS_INR3 0x00000008 // Sample sequence 3 interrupt +#define ADC_RIS_INR2 0x00000004 // Sample sequence 2 interrupt +#define ADC_RIS_INR1 0x00000002 // Sample sequence 1 interrupt +#define ADC_RIS_INR0 0x00000001 // Sample sequence 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the ADC_IM register. +// +//***************************************************************************** +#define ADC_IM_MASK3 0x00000008 // Sample sequence 3 mask +#define ADC_IM_MASK2 0x00000004 // Sample sequence 2 mask +#define ADC_IM_MASK1 0x00000002 // Sample sequence 1 mask +#define ADC_IM_MASK0 0x00000001 // Sample sequence 0 mask + +//***************************************************************************** +// +// The following define the bit fields in the ADC_ISC register. +// +//***************************************************************************** +#define ADC_ISC_IN3 0x00000008 // Sample sequence 3 interrupt +#define ADC_ISC_IN2 0x00000004 // Sample sequence 2 interrupt +#define ADC_ISC_IN1 0x00000002 // Sample sequence 1 interrupt +#define ADC_ISC_IN0 0x00000001 // Sample sequence 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the ADC_OSTAT register. +// +//***************************************************************************** +#define ADC_OSTAT_OV3 0x00000008 // Sample sequence 3 overflow +#define ADC_OSTAT_OV2 0x00000004 // Sample sequence 2 overflow +#define ADC_OSTAT_OV1 0x00000002 // Sample sequence 1 overflow +#define ADC_OSTAT_OV0 0x00000001 // Sample sequence 0 overflow + +//***************************************************************************** +// +// The following define the bit fields in the ADC_EMUX register. +// +//***************************************************************************** +#define ADC_EMUX_EM3_MASK 0x0000F000 // Event mux 3 mask +#define ADC_EMUX_EM3_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM3_COMP0 0x00001000 // Analog comparator 0 event +#define ADC_EMUX_EM3_COMP1 0x00002000 // Analog comparator 1 event +#define ADC_EMUX_EM3_COMP2 0x00003000 // Analog comparator 2 event +#define ADC_EMUX_EM3_EXTERNAL 0x00004000 // External event +#define ADC_EMUX_EM3_TIMER 0x00005000 // Timer event +#define ADC_EMUX_EM3_PWM0 0x00006000 // PWM0 event +#define ADC_EMUX_EM3_PWM1 0x00007000 // PWM1 event +#define ADC_EMUX_EM3_PWM2 0x00008000 // PWM2 event +#define ADC_EMUX_EM3_ALWAYS 0x0000F000 // Always event +#define ADC_EMUX_EM2_MASK 0x00000F00 // Event mux 2 mask +#define ADC_EMUX_EM2_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM2_COMP0 0x00000100 // Analog comparator 0 event +#define ADC_EMUX_EM2_COMP1 0x00000200 // Analog comparator 1 event +#define ADC_EMUX_EM2_COMP2 0x00000300 // Analog comparator 2 event +#define ADC_EMUX_EM2_EXTERNAL 0x00000400 // External event +#define ADC_EMUX_EM2_TIMER 0x00000500 // Timer event +#define ADC_EMUX_EM2_PWM0 0x00000600 // PWM0 event +#define ADC_EMUX_EM2_PWM1 0x00000700 // PWM1 event +#define ADC_EMUX_EM2_PWM2 0x00000800 // PWM2 event +#define ADC_EMUX_EM2_ALWAYS 0x00000F00 // Always event +#define ADC_EMUX_EM1_MASK 0x000000F0 // Event mux 1 mask +#define ADC_EMUX_EM1_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM1_COMP0 0x00000010 // Analog comparator 0 event +#define ADC_EMUX_EM1_COMP1 0x00000020 // Analog comparator 1 event +#define ADC_EMUX_EM1_COMP2 0x00000030 // Analog comparator 2 event +#define ADC_EMUX_EM1_EXTERNAL 0x00000040 // External event +#define ADC_EMUX_EM1_TIMER 0x00000050 // Timer event +#define ADC_EMUX_EM1_PWM0 0x00000060 // PWM0 event +#define ADC_EMUX_EM1_PWM1 0x00000070 // PWM1 event +#define ADC_EMUX_EM1_PWM2 0x00000080 // PWM2 event +#define ADC_EMUX_EM1_ALWAYS 0x000000F0 // Always event +#define ADC_EMUX_EM0_MASK 0x0000000F // Event mux 0 mask +#define ADC_EMUX_EM0_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM0_COMP0 0x00000001 // Analog comparator 0 event +#define ADC_EMUX_EM0_COMP1 0x00000002 // Analog comparator 1 event +#define ADC_EMUX_EM0_COMP2 0x00000003 // Analog comparator 2 event +#define ADC_EMUX_EM0_EXTERNAL 0x00000004 // External event +#define ADC_EMUX_EM0_TIMER 0x00000005 // Timer event +#define ADC_EMUX_EM0_PWM0 0x00000006 // PWM0 event +#define ADC_EMUX_EM0_PWM1 0x00000007 // PWM1 event +#define ADC_EMUX_EM0_PWM2 0x00000008 // PWM2 event +#define ADC_EMUX_EM0_ALWAYS 0x0000000F // Always event +#define ADC_EMUX_EM0_SHIFT 0 // The shift for the first event +#define ADC_EMUX_EM1_SHIFT 4 // The shift for the second event +#define ADC_EMUX_EM2_SHIFT 8 // The shift for the third event +#define ADC_EMUX_EM3_SHIFT 12 // The shift for the fourth event + +//***************************************************************************** +// +// The following define the bit fields in the ADC_USTAT register. +// +//***************************************************************************** +#define ADC_USTAT_UV3 0x00000008 // Sample sequence 3 underflow +#define ADC_USTAT_UV2 0x00000004 // Sample sequence 2 underflow +#define ADC_USTAT_UV1 0x00000002 // Sample sequence 1 underflow +#define ADC_USTAT_UV0 0x00000001 // Sample sequence 0 underflow + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSPRI register. +// +//***************************************************************************** +#define ADC_SSPRI_SS3_MASK 0x00003000 // Sequencer 3 priority mask +#define ADC_SSPRI_SS3_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS3_2ND 0x00001000 // Second priority +#define ADC_SSPRI_SS3_3RD 0x00002000 // Third priority +#define ADC_SSPRI_SS3_4TH 0x00003000 // Fourth priority +#define ADC_SSPRI_SS2_MASK 0x00000300 // Sequencer 2 priority mask +#define ADC_SSPRI_SS2_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS2_2ND 0x00000100 // Second priority +#define ADC_SSPRI_SS2_3RD 0x00000200 // Third priority +#define ADC_SSPRI_SS2_4TH 0x00000300 // Fourth priority +#define ADC_SSPRI_SS1_MASK 0x00000030 // Sequencer 1 priority mask +#define ADC_SSPRI_SS1_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS1_2ND 0x00000010 // Second priority +#define ADC_SSPRI_SS1_3RD 0x00000020 // Third priority +#define ADC_SSPRI_SS1_4TH 0x00000030 // Fourth priority +#define ADC_SSPRI_SS0_MASK 0x00000003 // Sequencer 0 priority mask +#define ADC_SSPRI_SS0_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS0_2ND 0x00000001 // Second priority +#define ADC_SSPRI_SS0_3RD 0x00000002 // Third priority +#define ADC_SSPRI_SS0_4TH 0x00000003 // Fourth priority + +//***************************************************************************** +// +// The following define the bit fields in the ADC_PSSI register. +// +//***************************************************************************** +#define ADC_PSSI_SS3 0x00000008 // Trigger sample sequencer 3 +#define ADC_PSSI_SS2 0x00000004 // Trigger sample sequencer 2 +#define ADC_PSSI_SS1 0x00000002 // Trigger sample sequencer 1 +#define ADC_PSSI_SS0 0x00000001 // Trigger sample sequencer 0 + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SAC register. +// +//***************************************************************************** +#define ADC_SAC_AVG_OFF 0x00000000 // No hardware oversampling +#define ADC_SAC_AVG_2X 0x00000001 // 2x hardware oversampling +#define ADC_SAC_AVG_4X 0x00000002 // 4x hardware oversampling +#define ADC_SAC_AVG_8X 0x00000003 // 8x hardware oversampling +#define ADC_SAC_AVG_16X 0x00000004 // 16x hardware oversampling +#define ADC_SAC_AVG_32X 0x00000005 // 32x hardware oversampling +#define ADC_SAC_AVG_64X 0x00000006 // 64x hardware oversampling + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSMUX0, ADC_SSMUX1, +// ADC_SSMUX2, and ADC_SSMUX3 registers. Not all fields are present in all +// registers. +// +//***************************************************************************** +#define ADC_SSMUX_MUX7_MASK 0x70000000 // 8th mux select mask +#define ADC_SSMUX_MUX6_MASK 0x07000000 // 7th mux select mask +#define ADC_SSMUX_MUX5_MASK 0x00700000 // 6th mux select mask +#define ADC_SSMUX_MUX4_MASK 0x00070000 // 5th mux select mask +#define ADC_SSMUX_MUX3_MASK 0x00007000 // 4th mux select mask +#define ADC_SSMUX_MUX2_MASK 0x00000700 // 3rd mux select mask +#define ADC_SSMUX_MUX1_MASK 0x00000070 // 2nd mux select mask +#define ADC_SSMUX_MUX0_MASK 0x00000007 // 1st mux select mask +#define ADC_SSMUX_MUX7_SHIFT 28 +#define ADC_SSMUX_MUX6_SHIFT 24 +#define ADC_SSMUX_MUX5_SHIFT 20 +#define ADC_SSMUX_MUX4_SHIFT 16 +#define ADC_SSMUX_MUX3_SHIFT 12 +#define ADC_SSMUX_MUX2_SHIFT 8 +#define ADC_SSMUX_MUX1_SHIFT 4 +#define ADC_SSMUX_MUX0_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSCTL0, ADC_SSCTL1, +// ADC_SSCTL2, and ADC_SSCTL3 registers. Not all fields are present in all +// registers. +// +//***************************************************************************** +#define ADC_SSCTL_TS7 0x80000000 // 8th temperature sensor select +#define ADC_SSCTL_IE7 0x40000000 // 8th interrupt enable +#define ADC_SSCTL_END7 0x20000000 // 8th sequence end select +#define ADC_SSCTL_D7 0x10000000 // 8th differential select +#define ADC_SSCTL_TS6 0x08000000 // 7th temperature sensor select +#define ADC_SSCTL_IE6 0x04000000 // 7th interrupt enable +#define ADC_SSCTL_END6 0x02000000 // 7th sequence end select +#define ADC_SSCTL_D6 0x01000000 // 7th differential select +#define ADC_SSCTL_TS5 0x00800000 // 6th temperature sensor select +#define ADC_SSCTL_IE5 0x00400000 // 6th interrupt enable +#define ADC_SSCTL_END5 0x00200000 // 6th sequence end select +#define ADC_SSCTL_D5 0x00100000 // 6th differential select +#define ADC_SSCTL_TS4 0x00080000 // 5th temperature sensor select +#define ADC_SSCTL_IE4 0x00040000 // 5th interrupt enable +#define ADC_SSCTL_END4 0x00020000 // 5th sequence end select +#define ADC_SSCTL_D4 0x00010000 // 5th differential select +#define ADC_SSCTL_TS3 0x00008000 // 4th temperature sensor select +#define ADC_SSCTL_IE3 0x00004000 // 4th interrupt enable +#define ADC_SSCTL_END3 0x00002000 // 4th sequence end select +#define ADC_SSCTL_D3 0x00001000 // 4th differential select +#define ADC_SSCTL_TS2 0x00000800 // 3rd temperature sensor select +#define ADC_SSCTL_IE2 0x00000400 // 3rd interrupt enable +#define ADC_SSCTL_END2 0x00000200 // 3rd sequence end select +#define ADC_SSCTL_D2 0x00000100 // 3rd differential select +#define ADC_SSCTL_TS1 0x00000080 // 2nd temperature sensor select +#define ADC_SSCTL_IE1 0x00000040 // 2nd interrupt enable +#define ADC_SSCTL_END1 0x00000020 // 2nd sequence end select +#define ADC_SSCTL_D1 0x00000010 // 2nd differential select +#define ADC_SSCTL_TS0 0x00000008 // 1st temperature sensor select +#define ADC_SSCTL_IE0 0x00000004 // 1st interrupt enable +#define ADC_SSCTL_END0 0x00000002 // 1st sequence end select +#define ADC_SSCTL_D0 0x00000001 // 1st differential select + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSFIFO0, ADC_SSFIFO1, +// ADC_SSFIFO2, and ADC_SSFIFO3 registers. +// +//***************************************************************************** +#define ADC_SSFIFO_DATA_MASK 0x000003FF // Sample data +#define ADC_SSFIFO_DATA_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSFSTAT0, ADC_SSFSTAT1, +// ADC_SSFSTAT2, and ADC_SSFSTAT3 registers. +// +//***************************************************************************** +#define ADC_SSFSTAT_FULL 0x00001000 // FIFO is full +#define ADC_SSFSTAT_EMPTY 0x00000100 // FIFO is empty +#define ADC_SSFSTAT_HPTR 0x000000F0 // FIFO head pointer +#define ADC_SSFSTAT_TPTR 0x0000000F // FIFO tail pointer + +//***************************************************************************** +// +// The following define the bit fields in the ADC_TMLB register. +// +//***************************************************************************** +#define ADC_TMLB_LB 0x00000001 // Loopback control signals + +//***************************************************************************** +// +// The following define the bit fields in the loopback ADC data. +// +//***************************************************************************** +#define ADC_LB_CNT_MASK 0x000003C0 // Sample counter mask +#define ADC_LB_CONT 0x00000020 // Continuation sample +#define ADC_LB_DIFF 0x00000010 // Differential sample +#define ADC_LB_TS 0x00000008 // Temperature sensor sample +#define ADC_LB_MUX_MASK 0x00000007 // Input channel number mask +#define ADC_LB_CNT_SHIFT 6 // Sample counter shift +#define ADC_LB_MUX_SHIFT 0 // Input channel number shift + +#endif // __HW_ADC_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_can.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_can.h new file mode 100644 index 000000000..02f7b7465 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_can.h @@ -0,0 +1,379 @@ +//***************************************************************************** +// +// hw_can.h - Defines and macros used when accessing the can. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_CAN_H__ +#define __HW_CAN_H__ + +//***************************************************************************** +// +// The following define the offsets of the can registers. +// +//***************************************************************************** +#define CAN_O_CTL 0x00000000 // Control register +#define CAN_O_STS 0x00000004 // Status register +#define CAN_O_ERR 0x00000008 // Error register +#define CAN_O_BIT 0x0000000C // Bit Timing register +#define CAN_O_INT 0x00000010 // Interrupt register +#define CAN_O_TST 0x00000014 // Test register +#define CAN_O_BRPE 0x00000018 // Baud Rate Prescaler register +#define CAN_O_IF1CRQ 0x00000020 // Interface 1 Command Request reg. +#define CAN_O_IF1CMSK 0x00000024 // Interface 1 Command Mask reg. +#define CAN_O_IF1MSK1 0x00000028 // Interface 1 Mask 1 register +#define CAN_O_IF1MSK2 0x0000002C // Interface 1 Mask 2 register +#define CAN_O_IF1ARB1 0x00000030 // Interface 1 Arbitration 1 reg. +#define CAN_O_IF1ARB2 0x00000034 // Interface 1 Arbitration 2 reg. +#define CAN_O_IF1MCTL 0x00000038 // Interface 1 Message Control reg. +#define CAN_O_IF1DA1 0x0000003C // Interface 1 DataA 1 register +#define CAN_O_IF1DA2 0x00000040 // Interface 1 DataA 2 register +#define CAN_O_IF1DB1 0x00000044 // Interface 1 DataB 1 register +#define CAN_O_IF1DB2 0x00000048 // Interface 1 DataB 2 register +#define CAN_O_IF2CRQ 0x00000080 // Interface 2 Command Request reg. +#define CAN_O_IF2CMSK 0x00000084 // Interface 2 Command Mask reg. +#define CAN_O_IF2MSK1 0x00000088 // Interface 2 Mask 1 register +#define CAN_O_IF2MSK2 0x0000008C // Interface 2 Mask 2 register +#define CAN_O_IF2ARB1 0x00000090 // Interface 2 Arbitration 1 reg. +#define CAN_O_IF2ARB2 0x00000094 // Interface 2 Arbitration 2 reg. +#define CAN_O_IF2MCTL 0x00000098 // Interface 2 Message Control reg. +#define CAN_O_IF2DA1 0x0000009C // Interface 2 DataA 1 register +#define CAN_O_IF2DA2 0x000000A0 // Interface 2 DataA 2 register +#define CAN_O_IF2DB1 0x000000A4 // Interface 2 DataB 1 register +#define CAN_O_IF2DB2 0x000000A8 // Interface 2 DataB 2 register +#define CAN_O_TXRQ1 0x00000100 // Transmission Request 1 register +#define CAN_O_TXRQ2 0x00000104 // Transmission Request 2 register +#define CAN_O_NWDA1 0x00000120 // New Data 1 register +#define CAN_O_NWDA2 0x00000124 // New Data 2 register +#define CAN_O_MSGINT1 0x00000140 // Intr. Pending in Msg Obj 1 reg. +#define CAN_O_MSGINT2 0x00000144 // Intr. Pending in Msg Obj 2 reg. +#define CAN_O_MSGVAL1 0x00000160 // Message Valid in Msg Obj 1 reg. +#define CAN_O_MSGVAL2 0x00000164 // Message Valid in Msg Obj 2 reg. + +//***************************************************************************** +// +// The following define the reset values of the can registers. +// +//***************************************************************************** +#define CAN_RV_CTL 0x00000001 +#define CAN_RV_STS 0x00000000 +#define CAN_RV_ERR 0x00000000 +#define CAN_RV_BIT 0x00002301 +#define CAN_RV_INT 0x00000000 +#define CAN_RV_TST 0x00000000 +#define CAN_RV_BRPE 0x00000000 +#define CAN_RV_IF1CRQ 0x00000001 +#define CAN_RV_IF1CMSK 0x00000000 +#define CAN_RV_IF1MSK1 0x0000FFFF +#define CAN_RV_IF1MSK2 0x0000FFFF +#define CAN_RV_IF1ARB1 0x00000000 +#define CAN_RV_IF1ARB2 0x00000000 +#define CAN_RV_IF1MCTL 0x00000000 +#define CAN_RV_IF1DA1 0x00000000 +#define CAN_RV_IF1DA2 0x00000000 +#define CAN_RV_IF1DB1 0x00000000 +#define CAN_RV_IF1DB2 0x00000000 +#define CAN_RV_IF2CRQ 0x00000001 +#define CAN_RV_IF2CMSK 0x00000000 +#define CAN_RV_IF2MSK1 0x0000FFFF +#define CAN_RV_IF2MSK2 0x0000FFFF +#define CAN_RV_IF2ARB1 0x00000000 +#define CAN_RV_IF2ARB2 0x00000000 +#define CAN_RV_IF2MCTL 0x00000000 +#define CAN_RV_IF2DA1 0x00000000 +#define CAN_RV_IF2DA2 0x00000000 +#define CAN_RV_IF2DB1 0x00000000 +#define CAN_RV_IF2DB2 0x00000000 +#define CAN_RV_TXRQ1 0x00000000 +#define CAN_RV_TXRQ2 0x00000000 +#define CAN_RV_NWDA1 0x00000000 +#define CAN_RV_NWDA2 0x00000000 +#define CAN_RV_MSGINT1 0x00000000 +#define CAN_RV_MSGINT2 0x00000000 +#define CAN_RV_MSGVAL1 0x00000000 +#define CAN_RV_MSGVAL2 0x00000000 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_CTL register. +// +//***************************************************************************** +#define CAN_CTL_TEST 0x00000080 // Test mode enable +#define CAN_CTL_CCE 0x00000040 // Configuration change enable +#define CAN_CTL_DAR 0x00000020 // Disable automatic retransmission +#define CAN_CTL_EIE 0x00000008 // Error interrupt enable +#define CAN_CTL_SIE 0x00000004 // Status change interrupt enable +#define CAN_CTL_IE 0x00000002 // Module interrupt enable +#define CAN_CTL_INIT 0x00000001 // Initialization + +//***************************************************************************** +// +// The following define the bit fields in the CAN_STS register. +// +//***************************************************************************** +#define CAN_STS_BOFF 0x00000080 // Bus Off status +#define CAN_STS_EWARN 0x00000040 // Error Warning status +#define CAN_STS_EPASS 0x00000020 // Error Passive status +#define CAN_STS_RXOK 0x00000010 // Received Message Successful +#define CAN_STS_TXOK 0x00000008 // Transmitted Message Successful +#define CAN_STS_LEC_MSK 0x00000007 // Last Error Code +#define CAN_STS_LEC_NONE 0x00000000 // No error +#define CAN_STS_LEC_STUFF 0x00000001 // Stuff error +#define CAN_STS_LEC_FORM 0x00000002 // Form(at) error +#define CAN_STS_LEC_ACK 0x00000003 // Ack error +#define CAN_STS_LEC_BIT1 0x00000004 // Bit 1 error +#define CAN_STS_LEC_BIT0 0x00000005 // Bit 0 error +#define CAN_STS_LEC_CRC 0x00000006 // CRC error + +//***************************************************************************** +// +// The following define the bit fields in the CAN_ERR register. +// +//***************************************************************************** +#define CAN_ERR_RP 0x00008000 // Receive error passive status +#define CAN_ERR_REC_MASK 0x00007F00 // Receive error counter status +#define CAN_ERR_REC_SHIFT 8 // Receive error counter bit pos +#define CAN_ERR_TEC_MASK 0x000000FF // Transmit error counter status +#define CAN_ERR_TEC_SHIFT 0 // Transmit error counter bit pos + +//***************************************************************************** +// +// The following define the bit fields in the CAN_BIT register. +// +//***************************************************************************** +#define CAN_BIT_TSEG2 0x00007000 // Time segment after sample point +#define CAN_BIT_TSEG1 0x00000F00 // Time segment before sample point +#define CAN_BIT_SJW 0x000000C0 // (Re)Synchronization jump width +#define CAN_BIT_BRP 0x0000003F // Baud rate prescaler + +//***************************************************************************** +// +// The following define the bit fields in the CAN_INT register. +// +//***************************************************************************** +#define CAN_INT_INTID_MSK 0x0000FFFF // Interrupt Identifier +#define CAN_INT_INTID_NONE 0x00000000 // No Interrupt Pending +#define CAN_INT_INTID_STATUS 0x00008000 // Status Interrupt + +//***************************************************************************** +// +// The following define the bit fields in the CAN_TST register. +// +//***************************************************************************** +#define CAN_TST_RX 0x00000080 // CAN_RX pin status +#define CAN_TST_TX_MSK 0x00000060 // Overide control of CAN_TX pin +#define CAN_TST_TX_CANCTL 0x00000000 // CAN core controls CAN_TX +#define CAN_TST_TX_SAMPLE 0x00000020 // Sample Point on CAN_TX +#define CAN_TST_TX_DOMINANT 0x00000040 // Dominant value on CAN_TX +#define CAN_TST_TX_RECESSIVE 0x00000060 // Recessive value on CAN_TX +#define CAN_TST_LBACK 0x00000010 // Loop back mode +#define CAN_TST_SILENT 0x00000008 // Silent mode +#define CAN_TST_BASIC 0x00000004 // Basic mode + +//***************************************************************************** +// +// The following define the bit fields in the CAN_BRPE register. +// +//***************************************************************************** +#define CAN_BRPE_BRPE 0x0000000F // Baud rate prescaler extension + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1CRQ and CAN_IF1CRQ +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFCRQ_BUSY 0x00008000 // Busy flag status +#define CAN_IFCRQ_MNUM_MSK 0x0000003F // Message Number + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1CMSK and CAN_IF2CMSK +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFCMSK_WRNRD 0x00000080 // Write, not Read +#define CAN_IFCMSK_MASK 0x00000040 // Access Mask Bits +#define CAN_IFCMSK_ARB 0x00000020 // Access Arbitration Bits +#define CAN_IFCMSK_CONTROL 0x00000010 // Access Control Bits +#define CAN_IFCMSK_CLRINTPND 0x00000008 // Clear interrupt pending Bit +#define CAN_IFCMSK_TXRQST 0x00000004 // Access Tx request bit (WRNRD=1) +#define CAN_IFCMSK_NEWDAT 0x00000004 // Access New Data bit (WRNRD=0) +#define CAN_IFCMSK_DATAA 0x00000002 // DataA access - bytes 0 to 3 +#define CAN_IFCMSK_DATAB 0x00000001 // DataB access - bytes 4 to 7 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1MSK1 and CAN_IF2MSK1 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFMSK1_MSK 0x0000FFFF // Identifier Mask + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1MSK2 and CAN_IF2MSK2 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFMSK2_MXTD 0x00008000 // Mask extended identifier +#define CAN_IFMSK2_MDIR 0x00004000 // Mask message direction +#define CAN_IFMSK2_MSK 0x00001FFF // Mask identifier + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1ARB1 and CAN_IF2ARB1 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFARB1_ID 0x0000FFFF // Identifier + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1ARB2 and CAN_IF2ARB2 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFARB2_MSGVAL 0x00008000 // Message valid +#define CAN_IFARB2_XTD 0x00004000 // Extended identifier +#define CAN_IFARB2_DIR 0x00002000 // Message direction +#define CAN_IFARB2_ID 0x00001FFF // Message identifier + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1MCTL and CAN_IF2MCTL +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFMCTL_NEWDAT 0x00008000 // New Data +#define CAN_IFMCTL_MSGLST 0x00004000 // Message lost +#define CAN_IFMCTL_INTPND 0x00002000 // Interrupt pending +#define CAN_IFMCTL_UMASK 0x00001000 // Use acceptance mask +#define CAN_IFMCTL_TXIE 0x00000800 // Transmit interrupt enable +#define CAN_IFMCTL_RXIE 0x00000400 // Receive interrupt enable +#define CAN_IFMCTL_RMTEN 0x00000200 // Remote enable +#define CAN_IFMCTL_TXRQST 0x00000100 // Transmit request +#define CAN_IFMCTL_EOB 0x00000080 // End of buffer +#define CAN_IFMCTL_DLC 0x0000000F // Data length code + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1DA1 and CAN_IF2DA1 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFDA1_DATA 0x0000FFFF // Data - bytes 1 and 0 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1DA2 and CAN_IF2DA2 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFDA2_DATA 0x0000FFFF // Data - bytes 3 and 2 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1DB1 and CAN_IF2DB1 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFDB1_DATA 0x0000FFFF // Data - bytes 5 and 4 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1DB2 and CAN_IF2DB2 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFDB2_DATA 0x0000FFFF // Data - bytes 7 and 6 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_TXRQ1 register. +// +//***************************************************************************** +#define CAN_TXRQ1_TXRQST 0x0000FFFF // Transmission Request Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_TXRQ2 register. +// +//***************************************************************************** +#define CAN_TXRQ2_TXRQST 0x0000FFFF // Transmission Request Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_NWDA1 register. +// +//***************************************************************************** +#define CAN_NWDA1_NEWDATA 0x0000FFFF // New Data Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_NWDA2 register. +// +//***************************************************************************** +#define CAN_NWDA2_NEWDATA 0x0000FFFF // New Data Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_MSGINT1 register. +// +//***************************************************************************** +#define CAN_MSGINT1_INTPND 0x0000FFFF // Interrupt Pending Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_MSGINT2 register. +// +//***************************************************************************** +#define CAN_MSGINT2_INTPND 0x0000FFFF // Interrupt Pending Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_MSGVAL1 register. +// +//***************************************************************************** +#define CAN_MSGVAL1_MSGVAL 0x0000FFFF // Message Valid Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_MSGVAL2 register. +// +//***************************************************************************** +#define CAN_MSGVAL2_MSGVAL 0x0000FFFF // Message Valid Bits + +#endif // __HW_CAN_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_comp.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_comp.h new file mode 100644 index 000000000..d8b355ea9 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_comp.h @@ -0,0 +1,118 @@ +//***************************************************************************** +// +// hw_comp.h - Macros used when accessing the comparator hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_COMP_H__ +#define __HW_COMP_H__ + +//***************************************************************************** +// +// The following define the offsets of the comparator registers. +// +//***************************************************************************** +#define COMP_O_MIS 0x00000000 // Interrupt status register +#define COMP_O_RIS 0x00000004 // Raw interrupt status register +#define COMP_O_INTEN 0x00000008 // Interrupt enable register +#define COMP_O_REFCTL 0x00000010 // Reference voltage control reg. +#define COMP_O_ACSTAT0 0x00000020 // Comp0 status register +#define COMP_O_ACCTL0 0x00000024 // Comp0 control register +#define COMP_O_ACSTAT1 0x00000040 // Comp1 status register +#define COMP_O_ACCTL1 0x00000044 // Comp1 control register +#define COMP_O_ACSTAT2 0x00000060 // Comp2 status register +#define COMP_O_ACCTL2 0x00000064 // Comp2 control register + +//***************************************************************************** +// +// The following define the bit fields in the COMP_MIS, COMP_RIS, and +// COMP_INTEN registers. +// +//***************************************************************************** +#define COMP_INT_2 0x00000004 // Comp2 interrupt +#define COMP_INT_1 0x00000002 // Comp1 interrupt +#define COMP_INT_0 0x00000001 // Comp0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the COMP_REFCTL register. +// +//***************************************************************************** +#define COMP_REFCTL_EN 0x00000200 // Reference voltage enable +#define COMP_REFCTL_RNG 0x00000100 // Reference voltage range +#define COMP_REFCTL_VREF_MASK 0x0000000F // Reference voltage select mask +#define COMP_REFCTL_VREF_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the COMP_ACSTAT0, COMP_ACSTAT1, and +// COMP_ACSTAT2 registers. +// +//***************************************************************************** +#define COMP_ACSTAT_OVAL 0x00000002 // Comparator output value + +//***************************************************************************** +// +// The following define the bit fields in the COMP_ACCTL0, COMP_ACCTL1, and +// COMP_ACCTL2 registers. +// +//***************************************************************************** +#define COMP_ACCTL_TMASK 0x00000800 // Trigger enable +#define COMP_ACCTL_ASRCP_MASK 0x00000600 // Vin+ source select mask +#define COMP_ACCTL_ASRCP_PIN 0x00000000 // Dedicated Comp+ pin +#define COMP_ACCTL_ASRCP_PIN0 0x00000200 // Comp0+ pin +#define COMP_ACCTL_ASRCP_REF 0x00000400 // Internal voltage reference +#define COMP_ACCTL_ASRCP_RES 0x00000600 // Reserved +#define COMP_ACCTL_OEN 0x00000100 // Comparator output enable +#define COMP_ACCTL_TSVAL 0x00000080 // Trigger polarity select +#define COMP_ACCTL_TSEN_MASK 0x00000060 // Trigger sense mask +#define COMP_ACCTL_TSEN_LEVEL 0x00000000 // Trigger is level sense +#define COMP_ACCTL_TSEN_FALL 0x00000020 // Trigger is falling edge +#define COMP_ACCTL_TSEN_RISE 0x00000040 // Trigger is rising edge +#define COMP_ACCTL_TSEN_BOTH 0x00000060 // Trigger is both edges +#define COMP_ACCTL_ISLVAL 0x00000010 // Interrupt polarity select +#define COMP_ACCTL_ISEN_MASK 0x0000000C // Interrupt sense mask +#define COMP_ACCTL_ISEN_LEVEL 0x00000000 // Interrupt is level sense +#define COMP_ACCTL_ISEN_FALL 0x00000004 // Interrupt is falling edge +#define COMP_ACCTL_ISEN_RISE 0x00000008 // Interrupt is rising edge +#define COMP_ACCTL_ISEN_BOTH 0x0000000C // Interrupt is both edges +#define COMP_ACCTL_CINV 0x00000002 // Comparator output invert + +//***************************************************************************** +// +// The following define the reset values for the comparator registers. +// +//***************************************************************************** +#define COMP_RV_MIS 0x00000000 // Interrupt status register +#define COMP_RV_RIS 0x00000000 // Raw interrupt status register +#define COMP_RV_INTEN 0x00000000 // Interrupt enable register +#define COMP_RV_REFCTL 0x00000000 // Reference voltage control reg. +#define COMP_RV_ACSTAT0 0x00000000 // Comp0 status register +#define COMP_RV_ACCTL0 0x00000000 // Comp0 control register +#define COMP_RV_ACSTAT1 0x00000000 // Comp1 status register +#define COMP_RV_ACCTL1 0x00000000 // Comp1 control register +#define COMP_RV_ACSTAT2 0x00000000 // Comp2 status register +#define COMP_RV_ACCTL2 0x00000000 // Comp2 control register + +#endif // __HW_COMP_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_ethernet.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_ethernet.h new file mode 100644 index 000000000..7a8d224cd --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_ethernet.h @@ -0,0 +1,205 @@ +//***************************************************************************** +// +// hw_ethernet.h - Macros used when accessing the ethernet hardware. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_ETHERNET_H__ +#define __HW_ETHERNET_H__ + +//***************************************************************************** +// +// The following define the offsets of the MAC registers in the Ethernet +// Controller. +// +//***************************************************************************** +#define MAC_O_IS 0x00000000 // Interrupt Status Register +#define MAC_O_IACK 0x00000000 // Interrupt Acknowledge Register +#define MAC_O_IM 0x00000004 // Interrupt Mask Register +#define MAC_O_RCTL 0x00000008 // Receive Control Register +#define MAC_O_TCTL 0x0000000C // Transmit Control Register +#define MAC_O_DATA 0x00000010 // Data Register +#define MAC_O_IA0 0x00000014 // Individual Address Register 0 +#define MAC_O_IA1 0x00000018 // Individual Address Register 1 +#define MAC_O_THR 0x0000001C // Threshold Register +#define MAC_O_MCTL 0x00000020 // Management Control Register +#define MAC_O_MDV 0x00000024 // Management Divider Register +#define MAC_O_MADD 0x00000028 // Management Address Register +#define MAC_O_MTXD 0x0000002C // Management Transmit Data Reg +#define MAC_O_MRXD 0x00000030 // Management Receive Data Reg +#define MAC_O_NP 0x00000034 // Number of Packets Register +#define MAC_O_TR 0x00000038 // Transmission Request Register + +//***************************************************************************** +// +// The following define the reset values of the MAC registers. +// +//***************************************************************************** +#define MAC_RV_IS 0x00000000 +#define MAC_RV_IACK 0x00000000 +#define MAC_RV_IM 0x0000007F +#define MAC_RV_RCTL 0x00000008 +#define MAC_RV_TCTL 0x00000000 +#define MAC_RV_DATA 0x00000000 +#define MAC_RV_IA0 0x00000000 +#define MAC_RV_IA1 0x00000000 +#define MAC_RV_THR 0x0000003F +#define MAC_RV_MCTL 0x00000000 +#define MAC_RV_MDV 0x00000080 +#define MAC_RV_MADD 0x00000000 +#define MAC_RV_MTXD 0x00000000 +#define MAC_RV_MRXD 0x00000000 +#define MAC_RV_NP 0x00000000 +#define MAC_RV_TR 0x00000000 + +//***************************************************************************** +// +// The following define the bit fields in the MAC_IS register. +// +//***************************************************************************** +#define MAC_IS_PHYINT 0x00000040 // PHY Interrupt +#define MAC_IS_MDINT 0x00000020 // MDI Transaction Complete +#define MAC_IS_RXER 0x00000010 // RX Error +#define MAC_IS_FOV 0x00000008 // RX FIFO Overrun +#define MAC_IS_TXEMP 0x00000004 // TX FIFO Empy +#define MAC_IS_TXER 0x00000002 // TX Error +#define MAC_IS_RXINT 0x00000001 // RX Packet Available + +//***************************************************************************** +// +// The following define the bit fields in the MAC_IACK register. +// +//***************************************************************************** +#define MAC_IACK_PHYINT 0x00000040 // Clear PHY Interrupt +#define MAC_IACK_MDINT 0x00000020 // Clear MDI Transaction Complete +#define MAC_IACK_RXER 0x00000010 // Clear RX Error +#define MAC_IACK_FOV 0x00000008 // Clear RX FIFO Overrun +#define MAC_IACK_TXEMP 0x00000004 // Clear TX FIFO Empy +#define MAC_IACK_TXER 0x00000002 // Clear TX Error +#define MAC_IACK_RXINT 0x00000001 // Clear RX Packet Available + +//***************************************************************************** +// +// The following define the bit fields in the MAC_IM register. +// +//***************************************************************************** +#define MAC_IM_PHYINTM 0x00000040 // Mask PHY Interrupt +#define MAC_IM_MDINTM 0x00000020 // Mask MDI Transaction Complete +#define MAC_IM_RXERM 0x00000010 // Mask RX Error +#define MAC_IM_FOVM 0x00000008 // Mask RX FIFO Overrun +#define MAC_IM_TXEMPM 0x00000004 // Mask TX FIFO Empy +#define MAC_IM_TXERM 0x00000002 // Mask TX Error +#define MAC_IM_RXINTM 0x00000001 // Mask RX Packet Available + +//***************************************************************************** +// +// The following define the bit fields in the MAC_RCTL register. +// +//***************************************************************************** +#define MAC_RCTL_RSTFIFO 0x00000010 // Clear the Receive FIFO +#define MAC_RCTL_BADCRC 0x00000008 // Reject Packets With Bad CRC +#define MAC_RCTL_PRMS 0x00000004 // Enable Promiscuous Mode +#define MAC_RCTL_AMUL 0x00000002 // Enable Multicast Packets +#define MAC_RCTL_RXEN 0x00000001 // Enable Ethernet Receiver + +//***************************************************************************** +// +// The following define the bit fields in the MAC_TCTL register. +// +//***************************************************************************** +#define MAC_TCTL_DUPLEX 0x00000010 // Enable Duplex mode +#define MAC_TCTL_CRC 0x00000004 // Enable CRC Generation +#define MAC_TCTL_PADEN 0x00000002 // Enable Automatic Padding +#define MAC_TCTL_TXEN 0x00000001 // Enable Ethernet Transmitter + +//***************************************************************************** +// +// The following define the bit fields in the MAC_IA0 register. +// +//***************************************************************************** +#define MAC_IA0_MACOCT4 0xFF000000 // 4th Octet of MAC address +#define MAC_IA0_MACOCT3 0x00FF0000 // 3rd Octet of MAC address +#define MAC_IA0_MACOCT2 0x0000FF00 // 2nd Octet of MAC address +#define MAC_IA0_MACOCT1 0x000000FF // 1st Octet of MAC address + +//***************************************************************************** +// +// The following define the bit fields in the MAC_IA1 register. +// +//***************************************************************************** +#define MAC_IA1_MACOCT6 0x0000FF00 // 6th Octet of MAC address +#define MAC_IA1_MACOCT5 0x000000FF // 5th Octet of MAC address + +//***************************************************************************** +// +// The following define the bit fields in the MAC_TXTH register. +// +//***************************************************************************** +#define MAC_THR_THRESH 0x0000003F // Transmit Threshold Value + +//***************************************************************************** +// +// The following define the bit fields in the MAC_MCTL register. +// +//***************************************************************************** +#define MAC_MCTL_REGADR 0x000000F8 // Address for Next MII Transaction +#define MAC_MCTL_WRITE 0x00000002 // Next MII Transaction is Write +#define MAC_MCTL_START 0x00000001 // Start MII Transaction + +//***************************************************************************** +// +// The following define the bit fields in the MAC_MDV register. +// +//***************************************************************************** +#define MAC_MDV_DIV 0x000000FF // Clock Divider for MDC for TX + +//***************************************************************************** +// +// The following define the bit fields in the MAC_MTXD register. +// +//***************************************************************************** +#define MAC_MTXD_MDTX 0x0000FFFF // Data for Next MII Transaction + +//***************************************************************************** +// +// The following define the bit fields in the MAC_MRXD register. +// +//***************************************************************************** +#define MAC_MRXD_MDRX 0x0000FFFF // Data Read from Last MII Trans. + +//***************************************************************************** +// +// The following define the bit fields in the MAC_NP register. +// +//***************************************************************************** +#define MAC_NP_NPR 0x0000003F // Number of RX Frames in FIFO + +//***************************************************************************** +// +// The following define the bit fields in the MAC_TXRQ register. +// +//***************************************************************************** +#define MAC_TR_NEWTX 0x00000001 // Start an Ethernet Transmission + +#endif // __HW_ETHERNET_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_flash.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_flash.h new file mode 100644 index 000000000..c5bea3b26 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_flash.h @@ -0,0 +1,147 @@ +//***************************************************************************** +// +// hw_flash.h - Macros used when accessing the flash controller. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_FLASH_H__ +#define __HW_FLASH_H__ + +//***************************************************************************** +// +// The following define the offsets of the FLASH registers. +// +//***************************************************************************** +#define FLASH_FMA 0x400FD000 // Memory address register +#define FLASH_FMD 0x400FD004 // Memory data register +#define FLASH_FMC 0x400FD008 // Memory control register +#define FLASH_FCRIS 0x400FD00c // Raw interrupt status register +#define FLASH_FCIM 0x400FD010 // Interrupt mask register +#define FLASH_FCMISC 0x400FD014 // Interrupt status register +#define FLASH_FMPRE 0x400FE130 // FLASH read protect register +#define FLASH_FMPPE 0x400FE134 // FLASH program protect register +#define FLASH_USECRL 0x400FE140 // uSec reload register +#define FLASH_FMPRE0 0x400FE200 // FLASH read protect register 0 +#define FLASH_FMPRE1 0x400FE204 // FLASH read protect register 1 +#define FLASH_FMPRE2 0x400FE208 // FLASH read protect register 2 +#define FLASH_FMPRE3 0x400FE20C // FLASH read protect register 3 +#define FLASH_FMPPE0 0x400FE400 // FLASH program protect register 0 +#define FLASH_FMPPE1 0x400FE404 // FLASH program protect register 1 +#define FLASH_FMPPE2 0x400FE408 // FLASH program protect register 2 +#define FLASH_FMPPE3 0x400FE40C // FLASH program protect register 3 + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FMC register. +// +//***************************************************************************** +#define FLASH_FMC_WRKEY_MASK 0xFFFF0000 // FLASH write key mask +#define FLASH_FMC_WRKEY 0xA4420000 // FLASH write key +#define FLASH_FMC_COMT 0x00000008 // Commit user register +#define FLASH_FMC_MERASE 0x00000004 // Mass erase FLASH +#define FLASH_FMC_ERASE 0x00000002 // Erase FLASH page +#define FLASH_FMC_WRITE 0x00000001 // Write FLASH word + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FCRIS register. +// +//***************************************************************************** +#define FLASH_FCRIS_PROGRAM 0x00000002 // Programming status +#define FLASH_FCRIS_ACCESS 0x00000001 // Invalid access status + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FCIM register. +// +//***************************************************************************** +#define FLASH_FCIM_PROGRAM 0x00000002 // Programming mask +#define FLASH_FCIM_ACCESS 0x00000001 // Invalid access mask + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FMIS register. +// +//***************************************************************************** +#define FLASH_FCMISC_PROGRAM 0x00000002 // Programming status +#define FLASH_FCMISC_ACCESS 0x00000001 // Invalid access status + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FMPRE and FLASH_FMPPE +// registers. +// +//***************************************************************************** +#define FLASH_FMP_BLOCK_31 0x80000000 // Enable for block 31 +#define FLASH_FMP_BLOCK_30 0x40000000 // Enable for block 30 +#define FLASH_FMP_BLOCK_29 0x20000000 // Enable for block 29 +#define FLASH_FMP_BLOCK_28 0x10000000 // Enable for block 28 +#define FLASH_FMP_BLOCK_27 0x08000000 // Enable for block 27 +#define FLASH_FMP_BLOCK_26 0x04000000 // Enable for block 26 +#define FLASH_FMP_BLOCK_25 0x02000000 // Enable for block 25 +#define FLASH_FMP_BLOCK_24 0x01000000 // Enable for block 24 +#define FLASH_FMP_BLOCK_23 0x00800000 // Enable for block 23 +#define FLASH_FMP_BLOCK_22 0x00400000 // Enable for block 22 +#define FLASH_FMP_BLOCK_21 0x00200000 // Enable for block 21 +#define FLASH_FMP_BLOCK_20 0x00100000 // Enable for block 20 +#define FLASH_FMP_BLOCK_19 0x00080000 // Enable for block 19 +#define FLASH_FMP_BLOCK_18 0x00040000 // Enable for block 18 +#define FLASH_FMP_BLOCK_17 0x00020000 // Enable for block 17 +#define FLASH_FMP_BLOCK_16 0x00010000 // Enable for block 16 +#define FLASH_FMP_BLOCK_15 0x00008000 // Enable for block 15 +#define FLASH_FMP_BLOCK_14 0x00004000 // Enable for block 14 +#define FLASH_FMP_BLOCK_13 0x00002000 // Enable for block 13 +#define FLASH_FMP_BLOCK_12 0x00001000 // Enable for block 12 +#define FLASH_FMP_BLOCK_11 0x00000800 // Enable for block 11 +#define FLASH_FMP_BLOCK_10 0x00000400 // Enable for block 10 +#define FLASH_FMP_BLOCK_9 0x00000200 // Enable for block 9 +#define FLASH_FMP_BLOCK_8 0x00000100 // Enable for block 8 +#define FLASH_FMP_BLOCK_7 0x00000080 // Enable for block 7 +#define FLASH_FMP_BLOCK_6 0x00000040 // Enable for block 6 +#define FLASH_FMP_BLOCK_5 0x00000020 // Enable for block 5 +#define FLASH_FMP_BLOCK_4 0x00000010 // Enable for block 4 +#define FLASH_FMP_BLOCK_3 0x00000008 // Enable for block 3 +#define FLASH_FMP_BLOCK_2 0x00000004 // Enable for block 2 +#define FLASH_FMP_BLOCK_1 0x00000002 // Enable for block 1 +#define FLASH_FMP_BLOCK_0 0x00000001 // Enable for block 0 + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_USECRL register. +// +//***************************************************************************** +#define FLASH_USECRL_MASK 0x000000FF // Clock per uSec +#define FLASH_USECRL_SHIFT 0 + +//***************************************************************************** +// +// The erase size is the size of the FLASH block that is erased by an erase +// operation, and the protect size is the size of the FLASH block that is +// protected by each protection register. +// +//***************************************************************************** +#define FLASH_ERASE_SIZE 0x00000400 +#define FLASH_PROTECT_SIZE 0x00000800 + +#endif // __HW_FLASH_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_gpio.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_gpio.h new file mode 100644 index 000000000..3596325a7 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_gpio.h @@ -0,0 +1,115 @@ +//***************************************************************************** +// +// hw_gpio.h - Defines and Macros for GPIO hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_GPIO_H__ +#define __HW_GPIO_H__ + +//***************************************************************************** +// +// GPIO Register Offsets. +// +//***************************************************************************** +#define GPIO_O_DATA 0x00000000 // Data register. +#define GPIO_O_DIR 0x00000400 // Data direction register. +#define GPIO_O_IS 0x00000404 // Interrupt sense register. +#define GPIO_O_IBE 0x00000408 // Interrupt both edges register. +#define GPIO_O_IEV 0x0000040C // Intterupt event register. +#define GPIO_O_IM 0x00000410 // Interrupt mask register. +#define GPIO_O_RIS 0x00000414 // Raw interrupt status register. +#define GPIO_O_MIS 0x00000418 // Masked interrupt status reg. +#define GPIO_O_ICR 0x0000041C // Interrupt clear register. +#define GPIO_O_AFSEL 0x00000420 // Mode control select register. +#define GPIO_O_DR2R 0x00000500 // 2ma drive select register. +#define GPIO_O_DR4R 0x00000504 // 4ma drive select register. +#define GPIO_O_DR8R 0x00000508 // 8ma drive select register. +#define GPIO_O_ODR 0x0000050C // Open drain select register. +#define GPIO_O_PUR 0x00000510 // Pull up select register. +#define GPIO_O_PDR 0x00000514 // Pull down select register. +#define GPIO_O_SLR 0x00000518 // Slew rate control enable reg. +#define GPIO_O_DEN 0x0000051C // Digital input enable register. +#define GPIO_O_LOCK 0x00000520 // Lock register. +#define GPIO_O_CR 0x00000524 // Commit register. +#define GPIO_O_PeriphID4 0x00000FD0 // +#define GPIO_O_PeriphID5 0x00000FD4 // +#define GPIO_O_PeriphID6 0x00000FD8 // +#define GPIO_O_PeriphID7 0x00000FDC // +#define GPIO_O_PeriphID0 0x00000FE0 // +#define GPIO_O_PeriphID1 0x00000FE4 // +#define GPIO_O_PeriphID2 0x00000FE8 // +#define GPIO_O_PeriphID3 0x00000FEC // +#define GPIO_O_PCellID0 0x00000FF0 // +#define GPIO_O_PCellID1 0x00000FF4 // +#define GPIO_O_PCellID2 0x00000FF8 // +#define GPIO_O_PCellID3 0x00000FFC // + +//***************************************************************************** +// +// The following define the bit fields in the GPIO_LOCK register. +// +//***************************************************************************** +#define GPIO_LOCK_LOCKED 0x00000001 // GPIO_CR register is locked +#define GPIO_LOCK_UNLOCKED 0x00000000 // GPIO_CR register is unlocked +#define GPIO_LOCK_KEY 0x1ACCE551 // Unlocks the GPIO_CR register + +//***************************************************************************** +// +// GPIO Register reset values. +// +//***************************************************************************** +#define GPIO_RV_DATA 0x00000000 // Data register reset value. +#define GPIO_RV_DIR 0x00000000 // Data direction reg RV. +#define GPIO_RV_IS 0x00000000 // Interrupt sense reg RV. +#define GPIO_RV_IBE 0x00000000 // Interrupt both edges reg RV. +#define GPIO_RV_IEV 0x00000000 // Intterupt event reg RV. +#define GPIO_RV_IM 0x00000000 // Interrupt mask reg RV. +#define GPIO_RV_RIS 0x00000000 // Raw interrupt status reg RV. +#define GPIO_RV_MIS 0x00000000 // Masked interrupt status reg RV. +#define GPIO_RV_IC 0x00000000 // Interrupt clear reg RV. +#define GPIO_RV_AFSEL 0x00000000 // Mode control select reg RV. +#define GPIO_RV_DR2R 0x000000FF // 2ma drive select reg RV. +#define GPIO_RV_DR4R 0x00000000 // 4ma drive select reg RV. +#define GPIO_RV_DR8R 0x00000000 // 8ma drive select reg RV. +#define GPIO_RV_ODR 0x00000000 // Open drain select reg RV. +#define GPIO_RV_PUR 0x000000FF // Pull up select reg RV. +#define GPIO_RV_PDR 0x00000000 // Pull down select reg RV. +#define GPIO_RV_SLR 0x00000000 // Slew rate control enable reg RV. +#define GPIO_RV_DEN 0x000000FF // Digital input enable reg RV. +#define GPIO_RV_LOCK 0x00000001 // Lock register RV. +#define GPIO_RV_PeriphID4 0x00000000 // +#define GPIO_RV_PeriphID5 0x00000000 // +#define GPIO_RV_PeriphID6 0x00000000 // +#define GPIO_RV_PeriphID7 0x00000000 // +#define GPIO_RV_PeriphID0 0x00000061 // +#define GPIO_RV_PeriphID1 0x00000010 // +#define GPIO_RV_PeriphID2 0x00000004 // +#define GPIO_RV_PeriphID3 0x00000000 // +#define GPIO_RV_PCellID0 0x0000000D // +#define GPIO_RV_PCellID1 0x000000F0 // +#define GPIO_RV_PCellID2 0x00000005 // +#define GPIO_RV_PCellID3 0x000000B1 // + +#endif // __HW_GPIO_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_hibernate.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_hibernate.h new file mode 100644 index 000000000..ee730d4c5 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_hibernate.h @@ -0,0 +1,145 @@ +//***************************************************************************** +// +// hw_hibernate.h - Defines and Macros for the Hibernation module. +// +// Copyright (c) 2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_HIBERNATE_H__ +#define __HW_HIBERNATE_H__ + +//***************************************************************************** +// +// The following define the addresses of the hibernation module registers. +// +//***************************************************************************** +#define HIB_RTCC 0x400fc000 // Hibernate RTC counter +#define HIB_RTCM0 0x400fc004 // Hibernate RTC match 0 +#define HIB_RTCM1 0x400fc008 // Hibernate RTC match 1 +#define HIB_RTCLD 0x400fc00C // Hibernate RTC load +#define HIB_CTL 0x400fc010 // Hibernate RTC control +#define HIB_IM 0x400fc014 // Hibernate interrupt mask +#define HIB_RIS 0x400fc018 // Hibernate raw interrupt status +#define HIB_MIS 0x400fc01C // Hibernate masked interrupt stat +#define HIB_IC 0x400fc020 // Hibernate interrupt clear +#define HIB_RTCT 0x400fc024 // Hibernate RTC trim +#define HIB_DATA 0x400fc030 // Hibernate data area +#define HIB_DATA_END 0x400fc130 // end of data area, exclusive + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate RTC counter register. +// +//***************************************************************************** +#define HIB_RTCC_MASK 0xffffffff // RTC counter mask + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate RTC match 0 register. +// +//***************************************************************************** +#define HIB_RTCM0_MASK 0xffffffff // RTC match 0 mask + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate RTC match 1 register. +// +//***************************************************************************** +#define HIB_RTCM1_MASK 0xffffffff // RTC match 1 mask + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate RTC load register. +// +//***************************************************************************** +#define HIB_RTCLD_MASK 0xffffffff // RTC load mask + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate control register +// +//***************************************************************************** +#define HIB_CTL_VABORT 0x00000080 // low bat abort +#define HIB_CTL_CLK32EN 0x00000040 // enable clock/oscillator +#define HIB_CTL_LOWBATEN 0x00000020 // enable low battery detect +#define HIB_CTL_PINWEN 0x00000010 // enable wake on WAKE pin +#define HIB_CTL_RTCWEN 0x00000008 // enable wake on RTC match +#define HIB_CTL_CLKSEL 0x00000004 // clock input selection +#define HIB_CTL_HIBREQ 0x00000002 // request hibernation +#define HIB_CTL_RTCEN 0x00000001 // RTC enable + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate interrupt mask reg. +// +//***************************************************************************** +#define HIB_IM_EXTW 0x00000008 // wake from external pin interrupt +#define HIB_IM_LOWBAT 0x00000004 // low battery interrupt +#define HIB_IM_RTCALT1 0x00000002 // RTC match 1 interrupt +#define HIB_IM_RTCALT0 0x00000001 // RTC match 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate raw interrupt status. +// +//***************************************************************************** +#define HIB_RIS_EXTW 0x00000008 // wake from external pin interrupt +#define HIB_RIS_LOWBAT 0x00000004 // low battery interrupt +#define HIB_RIS_RTCALT1 0x00000002 // RTC match 1 interrupt +#define HIB_RID_RTCALT0 0x00000001 // RTC match 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate masked int status. +// +//***************************************************************************** +#define HIB_MIS_EXTW 0x00000008 // wake from external pin interrupt +#define HIB_MIS_LOWBAT 0x00000004 // low battery interrupt +#define HIB_MIS_RTCALT1 0x00000002 // RTC match 1 interrupt +#define HIB_MID_RTCALT0 0x00000001 // RTC match 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate interrupt clear reg. +// +//***************************************************************************** +#define HIB_IC_EXTW 0x00000008 // wake from external pin interrupt +#define HIB_IC_LOWBAT 0x00000004 // low battery interrupt +#define HIB_IC_RTCALT1 0x00000002 // RTC match 1 interrupt +#define HIB_IC_RTCALT0 0x00000001 // RTC match 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate RTC trim register. +// +//***************************************************************************** +#define HIB_RTCT_MASK 0x0000ffff // RTC trim mask + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate data register. +// +//***************************************************************************** +#define HIB_DATA_MASK 0xffffffff // NV memory data mask + +#endif // __HW_HIBERNATE_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_i2c.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_i2c.h new file mode 100644 index 000000000..b90edb7df --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_i2c.h @@ -0,0 +1,197 @@ +//***************************************************************************** +// +// hw_i2c.h - Macros used when accessing the I2C master and slave hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_I2C_H__ +#define __HW_I2C_H__ + +//***************************************************************************** +// +// The following defines the offset between the I2C master and slave registers. +// +//***************************************************************************** +#define I2C_O_SLAVE 0x00000800 // Offset from master to slave + +//***************************************************************************** +// +// The following define the offsets of the I2C master registers. +// +//***************************************************************************** +#define I2C_MASTER_O_SA 0x00000000 // Slave address register +#define I2C_MASTER_O_CS 0x00000004 // Control and Status register +#define I2C_MASTER_O_DR 0x00000008 // Data register +#define I2C_MASTER_O_TPR 0x0000000C // Timer period register +#define I2C_MASTER_O_IMR 0x00000010 // Interrupt mask register +#define I2C_MASTER_O_RIS 0x00000014 // Raw interrupt status register +#define I2C_MASTER_O_MIS 0x00000018 // Masked interrupt status reg +#define I2C_MASTER_O_MICR 0x0000001c // Interrupt clear register +#define I2C_MASTER_O_CR 0x00000020 // Configuration register + +//***************************************************************************** +// +// The following define the offsets of the I2C slave registers. +// +//***************************************************************************** +#define I2C_SLAVE_O_OAR 0x00000000 // Own address register +#define I2C_SLAVE_O_CSR 0x00000004 // Control/Status register +#define I2C_SLAVE_O_DR 0x00000008 // Data register +#define I2C_SLAVE_O_IM 0x0000000C // Interrupt mask register +#define I2C_SLAVE_O_RIS 0x00000010 // Raw interrupt status register +#define I2C_SLAVE_O_MIS 0x00000014 // Masked interrupt status reg +#define I2C_SLAVE_O_SICR 0x00000018 // Interrupt clear register + +//***************************************************************************** +// +// The followng define the bit fields in the I2C master slave address register. +// +//***************************************************************************** +#define I2C_MASTER_SA_SA_MASK 0x000000FE // Slave address +#define I2C_MASTER_SA_RS 0x00000001 // Receive/send +#define I2C_MASTER_SA_SA_SHIFT 1 + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Control and Status +// register. +// +//***************************************************************************** +#define I2C_MASTER_CS_ACK 0x00000008 // Acknowlegde +#define I2C_MASTER_CS_STOP 0x00000004 // Stop +#define I2C_MASTER_CS_START 0x00000002 // Start +#define I2C_MASTER_CS_RUN 0x00000001 // Run +#define I2C_MASTER_CS_BUS_BUSY 0x00000040 // Bus busy +#define I2C_MASTER_CS_IDLE 0x00000020 // Idle +#define I2C_MASTER_CS_ARB_LOST 0x00000010 // Lost arbitration +#define I2C_MASTER_CS_DATA_ACK 0x00000008 // Data byte not acknowledged +#define I2C_MASTER_CS_ADDR_ACK 0x00000004 // Address byte not acknowledged +#define I2C_MASTER_CS_ERROR 0x00000002 // Error occurred +#define I2C_MASTER_CS_BUSY 0x00000001 // Controller is TX/RX data +#define I2C_MASTER_CS_ERR_MASK 0x0000001C + +//***************************************************************************** +// +// The following define values used in determining the contents of the I2C +// Master Timer Period register. +// +//***************************************************************************** +#define I2C_MASTER_TPR_SCL_HP 0x00000004 // SCL high period +#define I2C_MASTER_TPR_SCL_LP 0x00000006 // SCL low period +#define I2C_MASTER_TPR_SCL (I2C_MASTER_TPR_SCL_HP + I2C_MASTER_TPR_SCL_LP) +#define I2C_SCL_STANDARD 100000 // SCL standard frequency +#define I2C_SCL_FAST 400000 // SCL fast frequency + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Interrupt Mask +// register. +// +//***************************************************************************** +#define I2C_MASTER_IMR_IM 0x00000001 // Master interrupt mask + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Raw Interrupt Status +// register. +// +//***************************************************************************** +#define I2C_MASTER_RIS_RIS 0x00000001 // Master raw interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Masked Interrupt +// Status register. +// +//***************************************************************************** +#define I2C_MASTER_MIS_MIS 0x00000001 // Master masked interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Interrupt Clear +// register. +// +//***************************************************************************** +#define I2C_MASTER_MICR_IC 0x00000001 // Master interrupt clear + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Configuration +// register. +// +//***************************************************************************** +#define I2C_MASTER_CR_SFE 0x00000020 // Slave function enable +#define I2C_MASTER_CR_MFE 0x00000010 // Master function enable +#define I2C_MASTER_CR_LPBK 0x00000001 // Loopback enable + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Own Address register. +// +//***************************************************************************** +#define I2C_SLAVE_SOAR_OAR_MASK 0x0000007F // Slave address + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Control/Status +// register. +// +//***************************************************************************** +#define I2C_SLAVE_CSR_DA 0x00000001 // Enable the device +#define I2C_SLAVE_CSR_TREQ 0x00000002 // Transmit request received +#define I2C_SLAVE_CSR_RREQ 0x00000001 // Receive data from I2C master + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Interrupt Mask +// register. +// +//***************************************************************************** +#define I2C_SLAVE_IMR_IM 0x00000001 // Slave interrupt mask + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Raw Interrupt Status +// register. +// +//***************************************************************************** +#define I2C_SLAVE_RIS_RIS 0x00000001 // Slave raw interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Masked Interrupt +// Status register. +// +//***************************************************************************** +#define I2C_SLAVE_MIS_MIS 0x00000001 // Slave masked interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Interrupt Clear +// register. +// +//***************************************************************************** +#define I2C_SLAVE_SICR_IC 0x00000001 // Slave interrupt clear + +#endif // __HW_I2C_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_ints.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_ints.h new file mode 100644 index 000000000..d2df4ee5b --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_ints.h @@ -0,0 +1,113 @@ +//***************************************************************************** +// +// hw_ints.h - Macros that define the interrupt assignment on Stellaris. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_INTS_H__ +#define __HW_INTS_H__ + +//***************************************************************************** +// +// The following define the fault assignments. +// +//***************************************************************************** +#define FAULT_NMI 2 // NMI fault +#define FAULT_HARD 3 // Hard fault +#define FAULT_MPU 4 // MPU fault +#define FAULT_BUS 5 // Bus fault +#define FAULT_USAGE 6 // Usage fault +#define FAULT_SVCALL 11 // SVCall +#define FAULT_DEBUG 12 // Debug monitor +#define FAULT_PENDSV 14 // PendSV +#define FAULT_SYSTICK 15 // System Tick + +//***************************************************************************** +// +// The following define the interrupt assignments. +// +//***************************************************************************** +#define INT_GPIOA 16 // GPIO Port A +#define INT_GPIOB 17 // GPIO Port B +#define INT_GPIOC 18 // GPIO Port C +#define INT_GPIOD 19 // GPIO Port D +#define INT_GPIOE 20 // GPIO Port E +#define INT_UART0 21 // UART0 Rx and Tx +#define INT_UART1 22 // UART1 Rx and Tx +#define INT_SSI 23 // SSI Rx and Tx +#define INT_SSI0 23 // SSI0 Rx and Tx +#define INT_I2C 24 // I2C Master and Slave +#define INT_I2C0 24 // I2C0 Master and Slave +#define INT_PWM_FAULT 25 // PWM Fault +#define INT_PWM0 26 // PWM Generator 0 +#define INT_PWM1 27 // PWM Generator 1 +#define INT_PWM2 28 // PWM Generator 2 +#define INT_QEI 29 // Quadrature Encoder +#define INT_QEI0 29 // Quadrature Encoder 0 +#define INT_ADC0 30 // ADC Sequence 0 +#define INT_ADC1 31 // ADC Sequence 1 +#define INT_ADC2 32 // ADC Sequence 2 +#define INT_ADC3 33 // ADC Sequence 3 +#define INT_WATCHDOG 34 // Watchdog timer +#define INT_TIMER0A 35 // Timer 0 subtimer A +#define INT_TIMER0B 36 // Timer 0 subtimer B +#define INT_TIMER1A 37 // Timer 1 subtimer A +#define INT_TIMER1B 38 // Timer 1 subtimer B +#define INT_TIMER2A 39 // Timer 2 subtimer A +#define INT_TIMER2B 40 // Timer 2 subtimer B +#define INT_COMP0 41 // Analog Comparator 0 +#define INT_COMP1 42 // Analog Comparator 1 +#define INT_COMP2 43 // Analog Comparator 2 +#define INT_SYSCTL 44 // System Control (PLL, OSC, BO) +#define INT_FLASH 45 // FLASH Control +#define INT_GPIOF 46 // GPIO Port F +#define INT_GPIOG 47 // GPIO Port G +#define INT_GPIOH 48 // GPIO Port H +#define INT_UART2 49 // UART2 Rx and Tx +#define INT_SSI1 50 // SSI1 Rx and Tx +#define INT_TIMER3A 51 // Timer 3 subtimer A +#define INT_TIMER3B 52 // Timer 3 subtimer B +#define INT_I2C1 53 // I2C1 Master and Slave +#define INT_QEI1 54 // Quadrature Encoder 1 +#define INT_CAN0 55 // CAN0 +#define INT_CAN1 56 // CAN1 +#define INT_ETH 58 // Ethernet +#define INT_HIBERNATE 59 // Hibernation module + +//***************************************************************************** +// +// The total number of interrupts. +// +//***************************************************************************** +#define NUM_INTERRUPTS 60 + +//***************************************************************************** +// +// The total number of priority levels. +// +//***************************************************************************** +#define NUM_PRIORITY 8 +#define NUM_PRIORITY_BITS 3 + +#endif // __HW_INTS_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_memmap.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_memmap.h new file mode 100644 index 000000000..8ae2a06cd --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_memmap.h @@ -0,0 +1,80 @@ +//***************************************************************************** +// +// hw_memmap.h - Macros defining the memory map of Stellaris. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_MEMMAP_H__ +#define __HW_MEMMAP_H__ + +//***************************************************************************** +// +// The following define the base address of the memories and peripherals. +// +//***************************************************************************** +#define FLASH_BASE 0x00000000 // FLASH memory +#define SRAM_BASE 0x20000000 // SRAM memory +#define WATCHDOG_BASE 0x40000000 // Watchdog +#define GPIO_PORTA_BASE 0x40004000 // GPIO Port A +#define GPIO_PORTB_BASE 0x40005000 // GPIO Port B +#define GPIO_PORTC_BASE 0x40006000 // GPIO Port C +#define GPIO_PORTD_BASE 0x40007000 // GPIO Port D +#define SSI_BASE 0x40008000 // SSI +#define SSI0_BASE 0x40008000 // SSI0 +#define SSI1_BASE 0x40009000 // SSI1 +#define UART0_BASE 0x4000C000 // UART0 +#define UART1_BASE 0x4000D000 // UART1 +#define UART2_BASE 0x4000E000 // UART2 +#define I2C_MASTER_BASE 0x40020000 // I2C Master +#define I2C_SLAVE_BASE 0x40020800 // I2C Slave +#define I2C0_MASTER_BASE 0x40020000 // I2C0 Master +#define I2C0_SLAVE_BASE 0x40020800 // I2C0 Slave +#define I2C1_MASTER_BASE 0x40021000 // I2C1 Master +#define I2C1_SLAVE_BASE 0x40021800 // I2C1 Slave +#define GPIO_PORTE_BASE 0x40024000 // GPIO Port E +#define GPIO_PORTF_BASE 0x40025000 // GPIO Port F +#define GPIO_PORTG_BASE 0x40026000 // GPIO Port G +#define GPIO_PORTH_BASE 0x40027000 // GPIO Port H +#define PWM_BASE 0x40028000 // PWM +#define QEI_BASE 0x4002C000 // QEI +#define QEI0_BASE 0x4002C000 // QEI0 +#define QEI1_BASE 0x4002D000 // QEI1 +#define TIMER0_BASE 0x40030000 // Timer0 +#define TIMER1_BASE 0x40031000 // Timer1 +#define TIMER2_BASE 0x40032000 // Timer2 +#define TIMER3_BASE 0x40033000 // Timer3 +#define ADC_BASE 0x40038000 // ADC +#define COMP_BASE 0x4003C000 // Analog comparators +#define CAN0_BASE 0x40040000 // CAN0 +#define CAN1_BASE 0x40041000 // CAN1 +#define ETH_BASE 0x40048000 // Ethernet +#define FLASH_CTRL_BASE 0x400FD000 // FLASH Controller +#define SYSCTL_BASE 0x400FE000 // System Control +#define ITM_BASE 0xE0000000 // Instrumentation Trace Macrocell +#define DWT_BASE 0xE0001000 // Data Watchpoint and Trace +#define FPB_BASE 0xE0002000 // FLASH Patch and Breakpoint +#define NVIC_BASE 0xE000E000 // Nested Vectored Interrupt Ctrl +#define TPIU_BASE 0xE0040000 // Trace Port Interface Unit + +#endif // __HW_MEMMAP_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_nvic.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_nvic.h new file mode 100644 index 000000000..68c8d7c7f --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_nvic.h @@ -0,0 +1,1050 @@ +//***************************************************************************** +// +// hw_nvic.h - Macros used when accessing the NVIC hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_NVIC_H__ +#define __HW_NVIC_H__ + +//***************************************************************************** +// +// The following define the addresses of the NVIC registers. +// +//***************************************************************************** +#define NVIC_INT_TYPE 0xE000E004 // Interrupt Controller Type Reg. +#define NVIC_ST_CTRL 0xE000E010 // SysTick Control and Status Reg. +#define NVIC_ST_RELOAD 0xE000E014 // SysTick Reload Value Register +#define NVIC_ST_CURRENT 0xE000E018 // SysTick Current Value Register +#define NVIC_ST_CAL 0xE000E01C // SysTick Calibration Value Reg. +#define NVIC_EN0 0xE000E100 // IRQ 0 to 31 Set Enable Register +#define NVIC_EN1 0xE000E104 // IRQ 32 to 63 Set Enable Register +#define NVIC_DIS0 0xE000E180 // IRQ 0 to 31 Clear Enable Reg. +#define NVIC_DIS1 0xE000E184 // IRQ 32 to 63 Clear Enable Reg. +#define NVIC_PEND0 0xE000E200 // IRQ 0 to 31 Set Pending Register +#define NVIC_PEND1 0xE000E204 // IRQ 32 to 63 Set Pending Reg. +#define NVIC_UNPEND0 0xE000E280 // IRQ 0 to 31 Clear Pending Reg. +#define NVIC_UNPEND1 0xE000E284 // IRQ 32 to 63 Clear Pending Reg. +#define NVIC_ACTIVE0 0xE000E300 // IRQ 0 to 31 Active Register +#define NVIC_ACTIVE1 0xE000E304 // IRQ 32 to 63 Active Register +#define NVIC_PRI0 0xE000E400 // IRQ 0 to 3 Priority Register +#define NVIC_PRI1 0xE000E404 // IRQ 4 to 7 Priority Register +#define NVIC_PRI2 0xE000E408 // IRQ 8 to 11 Priority Register +#define NVIC_PRI3 0xE000E40C // IRQ 12 to 15 Priority Register +#define NVIC_PRI4 0xE000E410 // IRQ 16 to 19 Priority Register +#define NVIC_PRI5 0xE000E414 // IRQ 20 to 23 Priority Register +#define NVIC_PRI6 0xE000E418 // IRQ 24 to 27 Priority Register +#define NVIC_PRI7 0xE000E41C // IRQ 28 to 31 Priority Register +#define NVIC_PRI8 0xE000E420 // IRQ 32 to 35 Priority Register +#define NVIC_PRI9 0xE000E424 // IRQ 36 to 39 Priority Register +#define NVIC_PRI10 0xE000E428 // IRQ 40 to 43 Priority Register +#define NVIC_CPUID 0xE000ED00 // CPUID Base Register +#define NVIC_INT_CTRL 0xE000ED04 // Interrupt Control State Register +#define NVIC_VTABLE 0xE000ED08 // Vector Table Offset Register +#define NVIC_APINT 0xE000ED0C // App. Int & Reset Control Reg. +#define NVIC_SYS_CTRL 0xE000ED10 // System Control Register +#define NVIC_CFG_CTRL 0xE000ED14 // Configuration Control Register +#define NVIC_SYS_PRI1 0xE000ED18 // Sys. Handlers 4 to 7 Priority +#define NVIC_SYS_PRI2 0xE000ED1C // Sys. Handlers 8 to 11 Priority +#define NVIC_SYS_PRI3 0xE000ED20 // Sys. Handlers 12 to 15 Priority +#define NVIC_SYS_HND_CTRL 0xE000ED24 // System Handler Control and State +#define NVIC_FAULT_STAT 0xE000ED28 // Configurable Fault Status Reg. +#define NVIC_HFAULT_STAT 0xE000ED2C // Hard Fault Status Register +#define NVIC_DEBUG_STAT 0xE000ED30 // Debug Status Register +#define NVIC_MM_ADDR 0xE000ED34 // Mem Manage Address Register +#define NVIC_FAULT_ADDR 0xE000ED38 // Bus Fault Address Register +#define NVIC_MPU_TYPE 0xE000ED90 // MPU Type Register +#define NVIC_MPU_CTRL 0xE000ED94 // MPU Control Register +#define NVIC_MPU_NUMBER 0xE000ED98 // MPU Region Number Register +#define NVIC_MPU_BASE 0xE000ED9C // MPU Region Base Address Register +#define NVIC_MPU_ATTR 0xE000EDA0 // MPU Region Attribute & Size Reg. +#define NVIC_DBG_CTRL 0xE000EDF0 // Debug Control and Status Reg. +#define NVIC_DBG_XFER 0xE000EDF4 // Debug Core Reg. Transfer Select +#define NVIC_DBG_DATA 0xE000EDF8 // Debug Core Register Data +#define NVIC_DBG_INT 0xE000EDFC // Debug Reset Interrupt Control +#define NVIC_SW_TRIG 0xE000EF00 // Software Trigger Interrupt Reg. + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_INT_TYPE register. +// +//***************************************************************************** +#define NVIC_INT_TYPE_LINES_M 0x0000001F // Number of interrupt lines (x32) +#define NVIC_INT_TYPE_LINES_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CTRL register. +// +//***************************************************************************** +#define NVIC_ST_CTRL_COUNT 0x00010000 // Count flag +#define NVIC_ST_CTRL_CLK_SRC 0x00000004 // Clock Source +#define NVIC_ST_CTRL_INTEN 0x00000002 // Interrupt enable +#define NVIC_ST_CTRL_ENABLE 0x00000001 // Counter mode + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_RELOAD register. +// +//***************************************************************************** +#define NVIC_ST_RELOAD_M 0x00FFFFFF // Counter load value +#define NVIC_ST_RELOAD_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CURRENT register. +// +//***************************************************************************** +#define NVIC_ST_CURRENT_M 0x00FFFFFF // Counter current value +#define NVIC_ST_CURRENT_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CAL register. +// +//***************************************************************************** +#define NVIC_ST_CAL_NOREF 0x80000000 // No reference clock +#define NVIC_ST_CAL_SKEW 0x40000000 // Clock skew +#define NVIC_ST_CAL_ONEMS_M 0x00FFFFFF // 1ms reference value +#define NVIC_ST_CAL_ONEMS_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EN0 register. +// +//***************************************************************************** +#define NVIC_EN0_INT31 0x80000000 // Interrupt 31 enable +#define NVIC_EN0_INT30 0x40000000 // Interrupt 30 enable +#define NVIC_EN0_INT29 0x20000000 // Interrupt 29 enable +#define NVIC_EN0_INT28 0x10000000 // Interrupt 28 enable +#define NVIC_EN0_INT27 0x08000000 // Interrupt 27 enable +#define NVIC_EN0_INT26 0x04000000 // Interrupt 26 enable +#define NVIC_EN0_INT25 0x02000000 // Interrupt 25 enable +#define NVIC_EN0_INT24 0x01000000 // Interrupt 24 enable +#define NVIC_EN0_INT23 0x00800000 // Interrupt 23 enable +#define NVIC_EN0_INT22 0x00400000 // Interrupt 22 enable +#define NVIC_EN0_INT21 0x00200000 // Interrupt 21 enable +#define NVIC_EN0_INT20 0x00100000 // Interrupt 20 enable +#define NVIC_EN0_INT19 0x00080000 // Interrupt 19 enable +#define NVIC_EN0_INT18 0x00040000 // Interrupt 18 enable +#define NVIC_EN0_INT17 0x00020000 // Interrupt 17 enable +#define NVIC_EN0_INT16 0x00010000 // Interrupt 16 enable +#define NVIC_EN0_INT15 0x00008000 // Interrupt 15 enable +#define NVIC_EN0_INT14 0x00004000 // Interrupt 14 enable +#define NVIC_EN0_INT13 0x00002000 // Interrupt 13 enable +#define NVIC_EN0_INT12 0x00001000 // Interrupt 12 enable +#define NVIC_EN0_INT11 0x00000800 // Interrupt 11 enable +#define NVIC_EN0_INT10 0x00000400 // Interrupt 10 enable +#define NVIC_EN0_INT9 0x00000200 // Interrupt 9 enable +#define NVIC_EN0_INT8 0x00000100 // Interrupt 8 enable +#define NVIC_EN0_INT7 0x00000080 // Interrupt 7 enable +#define NVIC_EN0_INT6 0x00000040 // Interrupt 6 enable +#define NVIC_EN0_INT5 0x00000020 // Interrupt 5 enable +#define NVIC_EN0_INT4 0x00000010 // Interrupt 4 enable +#define NVIC_EN0_INT3 0x00000008 // Interrupt 3 enable +#define NVIC_EN0_INT2 0x00000004 // Interrupt 2 enable +#define NVIC_EN0_INT1 0x00000002 // Interrupt 1 enable +#define NVIC_EN0_INT0 0x00000001 // Interrupt 0 enable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EN1 register. +// +//***************************************************************************** +#define NVIC_EN1_INT59 0x08000000 // Interrupt 59 enable +#define NVIC_EN1_INT58 0x04000000 // Interrupt 58 enable +#define NVIC_EN1_INT57 0x02000000 // Interrupt 57 enable +#define NVIC_EN1_INT56 0x01000000 // Interrupt 56 enable +#define NVIC_EN1_INT55 0x00800000 // Interrupt 55 enable +#define NVIC_EN1_INT54 0x00400000 // Interrupt 54 enable +#define NVIC_EN1_INT53 0x00200000 // Interrupt 53 enable +#define NVIC_EN1_INT52 0x00100000 // Interrupt 52 enable +#define NVIC_EN1_INT51 0x00080000 // Interrupt 51 enable +#define NVIC_EN1_INT50 0x00040000 // Interrupt 50 enable +#define NVIC_EN1_INT49 0x00020000 // Interrupt 49 enable +#define NVIC_EN1_INT48 0x00010000 // Interrupt 48 enable +#define NVIC_EN1_INT47 0x00008000 // Interrupt 47 enable +#define NVIC_EN1_INT46 0x00004000 // Interrupt 46 enable +#define NVIC_EN1_INT45 0x00002000 // Interrupt 45 enable +#define NVIC_EN1_INT44 0x00001000 // Interrupt 44 enable +#define NVIC_EN1_INT43 0x00000800 // Interrupt 43 enable +#define NVIC_EN1_INT42 0x00000400 // Interrupt 42 enable +#define NVIC_EN1_INT41 0x00000200 // Interrupt 41 enable +#define NVIC_EN1_INT40 0x00000100 // Interrupt 40 enable +#define NVIC_EN1_INT39 0x00000080 // Interrupt 39 enable +#define NVIC_EN1_INT38 0x00000040 // Interrupt 38 enable +#define NVIC_EN1_INT37 0x00000020 // Interrupt 37 enable +#define NVIC_EN1_INT36 0x00000010 // Interrupt 36 enable +#define NVIC_EN1_INT35 0x00000008 // Interrupt 35 enable +#define NVIC_EN1_INT34 0x00000004 // Interrupt 34 enable +#define NVIC_EN1_INT33 0x00000002 // Interrupt 33 enable +#define NVIC_EN1_INT32 0x00000001 // Interrupt 32 enable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DIS0 register. +// +//***************************************************************************** +#define NVIC_DIS0_INT31 0x80000000 // Interrupt 31 disable +#define NVIC_DIS0_INT30 0x40000000 // Interrupt 30 disable +#define NVIC_DIS0_INT29 0x20000000 // Interrupt 29 disable +#define NVIC_DIS0_INT28 0x10000000 // Interrupt 28 disable +#define NVIC_DIS0_INT27 0x08000000 // Interrupt 27 disable +#define NVIC_DIS0_INT26 0x04000000 // Interrupt 26 disable +#define NVIC_DIS0_INT25 0x02000000 // Interrupt 25 disable +#define NVIC_DIS0_INT24 0x01000000 // Interrupt 24 disable +#define NVIC_DIS0_INT23 0x00800000 // Interrupt 23 disable +#define NVIC_DIS0_INT22 0x00400000 // Interrupt 22 disable +#define NVIC_DIS0_INT21 0x00200000 // Interrupt 21 disable +#define NVIC_DIS0_INT20 0x00100000 // Interrupt 20 disable +#define NVIC_DIS0_INT19 0x00080000 // Interrupt 19 disable +#define NVIC_DIS0_INT18 0x00040000 // Interrupt 18 disable +#define NVIC_DIS0_INT17 0x00020000 // Interrupt 17 disable +#define NVIC_DIS0_INT16 0x00010000 // Interrupt 16 disable +#define NVIC_DIS0_INT15 0x00008000 // Interrupt 15 disable +#define NVIC_DIS0_INT14 0x00004000 // Interrupt 14 disable +#define NVIC_DIS0_INT13 0x00002000 // Interrupt 13 disable +#define NVIC_DIS0_INT12 0x00001000 // Interrupt 12 disable +#define NVIC_DIS0_INT11 0x00000800 // Interrupt 11 disable +#define NVIC_DIS0_INT10 0x00000400 // Interrupt 10 disable +#define NVIC_DIS0_INT9 0x00000200 // Interrupt 9 disable +#define NVIC_DIS0_INT8 0x00000100 // Interrupt 8 disable +#define NVIC_DIS0_INT7 0x00000080 // Interrupt 7 disable +#define NVIC_DIS0_INT6 0x00000040 // Interrupt 6 disable +#define NVIC_DIS0_INT5 0x00000020 // Interrupt 5 disable +#define NVIC_DIS0_INT4 0x00000010 // Interrupt 4 disable +#define NVIC_DIS0_INT3 0x00000008 // Interrupt 3 disable +#define NVIC_DIS0_INT2 0x00000004 // Interrupt 2 disable +#define NVIC_DIS0_INT1 0x00000002 // Interrupt 1 disable +#define NVIC_DIS0_INT0 0x00000001 // Interrupt 0 disable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DIS1 register. +// +//***************************************************************************** +#define NVIC_DIS1_INT59 0x08000000 // Interrupt 59 disable +#define NVIC_DIS1_INT58 0x04000000 // Interrupt 58 disable +#define NVIC_DIS1_INT57 0x02000000 // Interrupt 57 disable +#define NVIC_DIS1_INT56 0x01000000 // Interrupt 56 disable +#define NVIC_DIS1_INT55 0x00800000 // Interrupt 55 disable +#define NVIC_DIS1_INT54 0x00400000 // Interrupt 54 disable +#define NVIC_DIS1_INT53 0x00200000 // Interrupt 53 disable +#define NVIC_DIS1_INT52 0x00100000 // Interrupt 52 disable +#define NVIC_DIS1_INT51 0x00080000 // Interrupt 51 disable +#define NVIC_DIS1_INT50 0x00040000 // Interrupt 50 disable +#define NVIC_DIS1_INT49 0x00020000 // Interrupt 49 disable +#define NVIC_DIS1_INT48 0x00010000 // Interrupt 48 disable +#define NVIC_DIS1_INT47 0x00008000 // Interrupt 47 disable +#define NVIC_DIS1_INT46 0x00004000 // Interrupt 46 disable +#define NVIC_DIS1_INT45 0x00002000 // Interrupt 45 disable +#define NVIC_DIS1_INT44 0x00001000 // Interrupt 44 disable +#define NVIC_DIS1_INT43 0x00000800 // Interrupt 43 disable +#define NVIC_DIS1_INT42 0x00000400 // Interrupt 42 disable +#define NVIC_DIS1_INT41 0x00000200 // Interrupt 41 disable +#define NVIC_DIS1_INT40 0x00000100 // Interrupt 40 disable +#define NVIC_DIS1_INT39 0x00000080 // Interrupt 39 disable +#define NVIC_DIS1_INT38 0x00000040 // Interrupt 38 disable +#define NVIC_DIS1_INT37 0x00000020 // Interrupt 37 disable +#define NVIC_DIS1_INT36 0x00000010 // Interrupt 36 disable +#define NVIC_DIS1_INT35 0x00000008 // Interrupt 35 disable +#define NVIC_DIS1_INT34 0x00000004 // Interrupt 34 disable +#define NVIC_DIS1_INT33 0x00000002 // Interrupt 33 disable +#define NVIC_DIS1_INT32 0x00000001 // Interrupt 32 disable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PEND0 register. +// +//***************************************************************************** +#define NVIC_PEND0_INT31 0x80000000 // Interrupt 31 pend +#define NVIC_PEND0_INT30 0x40000000 // Interrupt 30 pend +#define NVIC_PEND0_INT29 0x20000000 // Interrupt 29 pend +#define NVIC_PEND0_INT28 0x10000000 // Interrupt 28 pend +#define NVIC_PEND0_INT27 0x08000000 // Interrupt 27 pend +#define NVIC_PEND0_INT26 0x04000000 // Interrupt 26 pend +#define NVIC_PEND0_INT25 0x02000000 // Interrupt 25 pend +#define NVIC_PEND0_INT24 0x01000000 // Interrupt 24 pend +#define NVIC_PEND0_INT23 0x00800000 // Interrupt 23 pend +#define NVIC_PEND0_INT22 0x00400000 // Interrupt 22 pend +#define NVIC_PEND0_INT21 0x00200000 // Interrupt 21 pend +#define NVIC_PEND0_INT20 0x00100000 // Interrupt 20 pend +#define NVIC_PEND0_INT19 0x00080000 // Interrupt 19 pend +#define NVIC_PEND0_INT18 0x00040000 // Interrupt 18 pend +#define NVIC_PEND0_INT17 0x00020000 // Interrupt 17 pend +#define NVIC_PEND0_INT16 0x00010000 // Interrupt 16 pend +#define NVIC_PEND0_INT15 0x00008000 // Interrupt 15 pend +#define NVIC_PEND0_INT14 0x00004000 // Interrupt 14 pend +#define NVIC_PEND0_INT13 0x00002000 // Interrupt 13 pend +#define NVIC_PEND0_INT12 0x00001000 // Interrupt 12 pend +#define NVIC_PEND0_INT11 0x00000800 // Interrupt 11 pend +#define NVIC_PEND0_INT10 0x00000400 // Interrupt 10 pend +#define NVIC_PEND0_INT9 0x00000200 // Interrupt 9 pend +#define NVIC_PEND0_INT8 0x00000100 // Interrupt 8 pend +#define NVIC_PEND0_INT7 0x00000080 // Interrupt 7 pend +#define NVIC_PEND0_INT6 0x00000040 // Interrupt 6 pend +#define NVIC_PEND0_INT5 0x00000020 // Interrupt 5 pend +#define NVIC_PEND0_INT4 0x00000010 // Interrupt 4 pend +#define NVIC_PEND0_INT3 0x00000008 // Interrupt 3 pend +#define NVIC_PEND0_INT2 0x00000004 // Interrupt 2 pend +#define NVIC_PEND0_INT1 0x00000002 // Interrupt 1 pend +#define NVIC_PEND0_INT0 0x00000001 // Interrupt 0 pend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PEND1 register. +// +//***************************************************************************** +#define NVIC_PEND1_INT59 0x08000000 // Interrupt 59 pend +#define NVIC_PEND1_INT58 0x04000000 // Interrupt 58 pend +#define NVIC_PEND1_INT57 0x02000000 // Interrupt 57 pend +#define NVIC_PEND1_INT56 0x01000000 // Interrupt 56 pend +#define NVIC_PEND1_INT55 0x00800000 // Interrupt 55 pend +#define NVIC_PEND1_INT54 0x00400000 // Interrupt 54 pend +#define NVIC_PEND1_INT53 0x00200000 // Interrupt 53 pend +#define NVIC_PEND1_INT52 0x00100000 // Interrupt 52 pend +#define NVIC_PEND1_INT51 0x00080000 // Interrupt 51 pend +#define NVIC_PEND1_INT50 0x00040000 // Interrupt 50 pend +#define NVIC_PEND1_INT49 0x00020000 // Interrupt 49 pend +#define NVIC_PEND1_INT48 0x00010000 // Interrupt 48 pend +#define NVIC_PEND1_INT47 0x00008000 // Interrupt 47 pend +#define NVIC_PEND1_INT46 0x00004000 // Interrupt 46 pend +#define NVIC_PEND1_INT45 0x00002000 // Interrupt 45 pend +#define NVIC_PEND1_INT44 0x00001000 // Interrupt 44 pend +#define NVIC_PEND1_INT43 0x00000800 // Interrupt 43 pend +#define NVIC_PEND1_INT42 0x00000400 // Interrupt 42 pend +#define NVIC_PEND1_INT41 0x00000200 // Interrupt 41 pend +#define NVIC_PEND1_INT40 0x00000100 // Interrupt 40 pend +#define NVIC_PEND1_INT39 0x00000080 // Interrupt 39 pend +#define NVIC_PEND1_INT38 0x00000040 // Interrupt 38 pend +#define NVIC_PEND1_INT37 0x00000020 // Interrupt 37 pend +#define NVIC_PEND1_INT36 0x00000010 // Interrupt 36 pend +#define NVIC_PEND1_INT35 0x00000008 // Interrupt 35 pend +#define NVIC_PEND1_INT34 0x00000004 // Interrupt 34 pend +#define NVIC_PEND1_INT33 0x00000002 // Interrupt 33 pend +#define NVIC_PEND1_INT32 0x00000001 // Interrupt 32 pend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_UNPEND0 register. +// +//***************************************************************************** +#define NVIC_UNPEND0_INT31 0x80000000 // Interrupt 31 unpend +#define NVIC_UNPEND0_INT30 0x40000000 // Interrupt 30 unpend +#define NVIC_UNPEND0_INT29 0x20000000 // Interrupt 29 unpend +#define NVIC_UNPEND0_INT28 0x10000000 // Interrupt 28 unpend +#define NVIC_UNPEND0_INT27 0x08000000 // Interrupt 27 unpend +#define NVIC_UNPEND0_INT26 0x04000000 // Interrupt 26 unpend +#define NVIC_UNPEND0_INT25 0x02000000 // Interrupt 25 unpend +#define NVIC_UNPEND0_INT24 0x01000000 // Interrupt 24 unpend +#define NVIC_UNPEND0_INT23 0x00800000 // Interrupt 23 unpend +#define NVIC_UNPEND0_INT22 0x00400000 // Interrupt 22 unpend +#define NVIC_UNPEND0_INT21 0x00200000 // Interrupt 21 unpend +#define NVIC_UNPEND0_INT20 0x00100000 // Interrupt 20 unpend +#define NVIC_UNPEND0_INT19 0x00080000 // Interrupt 19 unpend +#define NVIC_UNPEND0_INT18 0x00040000 // Interrupt 18 unpend +#define NVIC_UNPEND0_INT17 0x00020000 // Interrupt 17 unpend +#define NVIC_UNPEND0_INT16 0x00010000 // Interrupt 16 unpend +#define NVIC_UNPEND0_INT15 0x00008000 // Interrupt 15 unpend +#define NVIC_UNPEND0_INT14 0x00004000 // Interrupt 14 unpend +#define NVIC_UNPEND0_INT13 0x00002000 // Interrupt 13 unpend +#define NVIC_UNPEND0_INT12 0x00001000 // Interrupt 12 unpend +#define NVIC_UNPEND0_INT11 0x00000800 // Interrupt 11 unpend +#define NVIC_UNPEND0_INT10 0x00000400 // Interrupt 10 unpend +#define NVIC_UNPEND0_INT9 0x00000200 // Interrupt 9 unpend +#define NVIC_UNPEND0_INT8 0x00000100 // Interrupt 8 unpend +#define NVIC_UNPEND0_INT7 0x00000080 // Interrupt 7 unpend +#define NVIC_UNPEND0_INT6 0x00000040 // Interrupt 6 unpend +#define NVIC_UNPEND0_INT5 0x00000020 // Interrupt 5 unpend +#define NVIC_UNPEND0_INT4 0x00000010 // Interrupt 4 unpend +#define NVIC_UNPEND0_INT3 0x00000008 // Interrupt 3 unpend +#define NVIC_UNPEND0_INT2 0x00000004 // Interrupt 2 unpend +#define NVIC_UNPEND0_INT1 0x00000002 // Interrupt 1 unpend +#define NVIC_UNPEND0_INT0 0x00000001 // Interrupt 0 unpend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_UNPEND1 register. +// +//***************************************************************************** +#define NVIC_UNPEND1_INT59 0x08000000 // Interrupt 59 unpend +#define NVIC_UNPEND1_INT58 0x04000000 // Interrupt 58 unpend +#define NVIC_UNPEND1_INT57 0x02000000 // Interrupt 57 unpend +#define NVIC_UNPEND1_INT56 0x01000000 // Interrupt 56 unpend +#define NVIC_UNPEND1_INT55 0x00800000 // Interrupt 55 unpend +#define NVIC_UNPEND1_INT54 0x00400000 // Interrupt 54 unpend +#define NVIC_UNPEND1_INT53 0x00200000 // Interrupt 53 unpend +#define NVIC_UNPEND1_INT52 0x00100000 // Interrupt 52 unpend +#define NVIC_UNPEND1_INT51 0x00080000 // Interrupt 51 unpend +#define NVIC_UNPEND1_INT50 0x00040000 // Interrupt 50 unpend +#define NVIC_UNPEND1_INT49 0x00020000 // Interrupt 49 unpend +#define NVIC_UNPEND1_INT48 0x00010000 // Interrupt 48 unpend +#define NVIC_UNPEND1_INT47 0x00008000 // Interrupt 47 unpend +#define NVIC_UNPEND1_INT46 0x00004000 // Interrupt 46 unpend +#define NVIC_UNPEND1_INT45 0x00002000 // Interrupt 45 unpend +#define NVIC_UNPEND1_INT44 0x00001000 // Interrupt 44 unpend +#define NVIC_UNPEND1_INT43 0x00000800 // Interrupt 43 unpend +#define NVIC_UNPEND1_INT42 0x00000400 // Interrupt 42 unpend +#define NVIC_UNPEND1_INT41 0x00000200 // Interrupt 41 unpend +#define NVIC_UNPEND1_INT40 0x00000100 // Interrupt 40 unpend +#define NVIC_UNPEND1_INT39 0x00000080 // Interrupt 39 unpend +#define NVIC_UNPEND1_INT38 0x00000040 // Interrupt 38 unpend +#define NVIC_UNPEND1_INT37 0x00000020 // Interrupt 37 unpend +#define NVIC_UNPEND1_INT36 0x00000010 // Interrupt 36 unpend +#define NVIC_UNPEND1_INT35 0x00000008 // Interrupt 35 unpend +#define NVIC_UNPEND1_INT34 0x00000004 // Interrupt 34 unpend +#define NVIC_UNPEND1_INT33 0x00000002 // Interrupt 33 unpend +#define NVIC_UNPEND1_INT32 0x00000001 // Interrupt 32 unpend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ACTIVE0 register. +// +//***************************************************************************** +#define NVIC_ACTIVE0_INT31 0x80000000 // Interrupt 31 active +#define NVIC_ACTIVE0_INT30 0x40000000 // Interrupt 30 active +#define NVIC_ACTIVE0_INT29 0x20000000 // Interrupt 29 active +#define NVIC_ACTIVE0_INT28 0x10000000 // Interrupt 28 active +#define NVIC_ACTIVE0_INT27 0x08000000 // Interrupt 27 active +#define NVIC_ACTIVE0_INT26 0x04000000 // Interrupt 26 active +#define NVIC_ACTIVE0_INT25 0x02000000 // Interrupt 25 active +#define NVIC_ACTIVE0_INT24 0x01000000 // Interrupt 24 active +#define NVIC_ACTIVE0_INT23 0x00800000 // Interrupt 23 active +#define NVIC_ACTIVE0_INT22 0x00400000 // Interrupt 22 active +#define NVIC_ACTIVE0_INT21 0x00200000 // Interrupt 21 active +#define NVIC_ACTIVE0_INT20 0x00100000 // Interrupt 20 active +#define NVIC_ACTIVE0_INT19 0x00080000 // Interrupt 19 active +#define NVIC_ACTIVE0_INT18 0x00040000 // Interrupt 18 active +#define NVIC_ACTIVE0_INT17 0x00020000 // Interrupt 17 active +#define NVIC_ACTIVE0_INT16 0x00010000 // Interrupt 16 active +#define NVIC_ACTIVE0_INT15 0x00008000 // Interrupt 15 active +#define NVIC_ACTIVE0_INT14 0x00004000 // Interrupt 14 active +#define NVIC_ACTIVE0_INT13 0x00002000 // Interrupt 13 active +#define NVIC_ACTIVE0_INT12 0x00001000 // Interrupt 12 active +#define NVIC_ACTIVE0_INT11 0x00000800 // Interrupt 11 active +#define NVIC_ACTIVE0_INT10 0x00000400 // Interrupt 10 active +#define NVIC_ACTIVE0_INT9 0x00000200 // Interrupt 9 active +#define NVIC_ACTIVE0_INT8 0x00000100 // Interrupt 8 active +#define NVIC_ACTIVE0_INT7 0x00000080 // Interrupt 7 active +#define NVIC_ACTIVE0_INT6 0x00000040 // Interrupt 6 active +#define NVIC_ACTIVE0_INT5 0x00000020 // Interrupt 5 active +#define NVIC_ACTIVE0_INT4 0x00000010 // Interrupt 4 active +#define NVIC_ACTIVE0_INT3 0x00000008 // Interrupt 3 active +#define NVIC_ACTIVE0_INT2 0x00000004 // Interrupt 2 active +#define NVIC_ACTIVE0_INT1 0x00000002 // Interrupt 1 active +#define NVIC_ACTIVE0_INT0 0x00000001 // Interrupt 0 active + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ACTIVE1 register. +// +//***************************************************************************** +#define NVIC_ACTIVE1_INT59 0x08000000 // Interrupt 59 active +#define NVIC_ACTIVE1_INT58 0x04000000 // Interrupt 58 active +#define NVIC_ACTIVE1_INT57 0x02000000 // Interrupt 57 active +#define NVIC_ACTIVE1_INT56 0x01000000 // Interrupt 56 active +#define NVIC_ACTIVE1_INT55 0x00800000 // Interrupt 55 active +#define NVIC_ACTIVE1_INT54 0x00400000 // Interrupt 54 active +#define NVIC_ACTIVE1_INT53 0x00200000 // Interrupt 53 active +#define NVIC_ACTIVE1_INT52 0x00100000 // Interrupt 52 active +#define NVIC_ACTIVE1_INT51 0x00080000 // Interrupt 51 active +#define NVIC_ACTIVE1_INT50 0x00040000 // Interrupt 50 active +#define NVIC_ACTIVE1_INT49 0x00020000 // Interrupt 49 active +#define NVIC_ACTIVE1_INT48 0x00010000 // Interrupt 48 active +#define NVIC_ACTIVE1_INT47 0x00008000 // Interrupt 47 active +#define NVIC_ACTIVE1_INT46 0x00004000 // Interrupt 46 active +#define NVIC_ACTIVE1_INT45 0x00002000 // Interrupt 45 active +#define NVIC_ACTIVE1_INT44 0x00001000 // Interrupt 44 active +#define NVIC_ACTIVE1_INT43 0x00000800 // Interrupt 43 active +#define NVIC_ACTIVE1_INT42 0x00000400 // Interrupt 42 active +#define NVIC_ACTIVE1_INT41 0x00000200 // Interrupt 41 active +#define NVIC_ACTIVE1_INT40 0x00000100 // Interrupt 40 active +#define NVIC_ACTIVE1_INT39 0x00000080 // Interrupt 39 active +#define NVIC_ACTIVE1_INT38 0x00000040 // Interrupt 38 active +#define NVIC_ACTIVE1_INT37 0x00000020 // Interrupt 37 active +#define NVIC_ACTIVE1_INT36 0x00000010 // Interrupt 36 active +#define NVIC_ACTIVE1_INT35 0x00000008 // Interrupt 35 active +#define NVIC_ACTIVE1_INT34 0x00000004 // Interrupt 34 active +#define NVIC_ACTIVE1_INT33 0x00000002 // Interrupt 33 active +#define NVIC_ACTIVE1_INT32 0x00000001 // Interrupt 32 active + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI0 register. +// +//***************************************************************************** +#define NVIC_PRI0_INT3_M 0xFF000000 // Interrupt 3 priority mask +#define NVIC_PRI0_INT2_M 0x00FF0000 // Interrupt 2 priority mask +#define NVIC_PRI0_INT1_M 0x0000FF00 // Interrupt 1 priority mask +#define NVIC_PRI0_INT0_M 0x000000FF // Interrupt 0 priority mask +#define NVIC_PRI0_INT3_S 24 +#define NVIC_PRI0_INT2_S 16 +#define NVIC_PRI0_INT1_S 8 +#define NVIC_PRI0_INT0_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI1 register. +// +//***************************************************************************** +#define NVIC_PRI1_INT7_M 0xFF000000 // Interrupt 7 priority mask +#define NVIC_PRI1_INT6_M 0x00FF0000 // Interrupt 6 priority mask +#define NVIC_PRI1_INT5_M 0x0000FF00 // Interrupt 5 priority mask +#define NVIC_PRI1_INT4_M 0x000000FF // Interrupt 4 priority mask +#define NVIC_PRI1_INT7_S 24 +#define NVIC_PRI1_INT6_S 16 +#define NVIC_PRI1_INT5_S 8 +#define NVIC_PRI1_INT4_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI2 register. +// +//***************************************************************************** +#define NVIC_PRI2_INT11_M 0xFF000000 // Interrupt 11 priority mask +#define NVIC_PRI2_INT10_M 0x00FF0000 // Interrupt 10 priority mask +#define NVIC_PRI2_INT9_M 0x0000FF00 // Interrupt 9 priority mask +#define NVIC_PRI2_INT8_M 0x000000FF // Interrupt 8 priority mask +#define NVIC_PRI2_INT11_S 24 +#define NVIC_PRI2_INT10_S 16 +#define NVIC_PRI2_INT9_S 8 +#define NVIC_PRI2_INT8_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI3 register. +// +//***************************************************************************** +#define NVIC_PRI3_INT15_M 0xFF000000 // Interrupt 15 priority mask +#define NVIC_PRI3_INT14_M 0x00FF0000 // Interrupt 14 priority mask +#define NVIC_PRI3_INT13_M 0x0000FF00 // Interrupt 13 priority mask +#define NVIC_PRI3_INT12_M 0x000000FF // Interrupt 12 priority mask +#define NVIC_PRI3_INT15_S 24 +#define NVIC_PRI3_INT14_S 16 +#define NVIC_PRI3_INT13_S 8 +#define NVIC_PRI3_INT12_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI4 register. +// +//***************************************************************************** +#define NVIC_PRI4_INT19_M 0xFF000000 // Interrupt 19 priority mask +#define NVIC_PRI4_INT18_M 0x00FF0000 // Interrupt 18 priority mask +#define NVIC_PRI4_INT17_M 0x0000FF00 // Interrupt 17 priority mask +#define NVIC_PRI4_INT16_M 0x000000FF // Interrupt 16 priority mask +#define NVIC_PRI4_INT19_S 24 +#define NVIC_PRI4_INT18_S 16 +#define NVIC_PRI4_INT17_S 8 +#define NVIC_PRI4_INT16_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI5 register. +// +//***************************************************************************** +#define NVIC_PRI5_INT23_M 0xFF000000 // Interrupt 23 priority mask +#define NVIC_PRI5_INT22_M 0x00FF0000 // Interrupt 22 priority mask +#define NVIC_PRI5_INT21_M 0x0000FF00 // Interrupt 21 priority mask +#define NVIC_PRI5_INT20_M 0x000000FF // Interrupt 20 priority mask +#define NVIC_PRI5_INT23_S 24 +#define NVIC_PRI5_INT22_S 16 +#define NVIC_PRI5_INT21_S 8 +#define NVIC_PRI5_INT20_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI6 register. +// +//***************************************************************************** +#define NVIC_PRI6_INT27_M 0xFF000000 // Interrupt 27 priority mask +#define NVIC_PRI6_INT26_M 0x00FF0000 // Interrupt 26 priority mask +#define NVIC_PRI6_INT25_M 0x0000FF00 // Interrupt 25 priority mask +#define NVIC_PRI6_INT24_M 0x000000FF // Interrupt 24 priority mask +#define NVIC_PRI6_INT27_S 24 +#define NVIC_PRI6_INT26_S 16 +#define NVIC_PRI6_INT25_S 8 +#define NVIC_PRI6_INT24_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI7 register. +// +//***************************************************************************** +#define NVIC_PRI7_INT31_M 0xFF000000 // Interrupt 31 priority mask +#define NVIC_PRI7_INT30_M 0x00FF0000 // Interrupt 30 priority mask +#define NVIC_PRI7_INT29_M 0x0000FF00 // Interrupt 29 priority mask +#define NVIC_PRI7_INT28_M 0x000000FF // Interrupt 28 priority mask +#define NVIC_PRI7_INT31_S 24 +#define NVIC_PRI7_INT30_S 16 +#define NVIC_PRI7_INT29_S 8 +#define NVIC_PRI7_INT28_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI8 register. +// +//***************************************************************************** +#define NVIC_PRI8_INT35_M 0xFF000000 // Interrupt 35 priority mask +#define NVIC_PRI8_INT34_M 0x00FF0000 // Interrupt 34 priority mask +#define NVIC_PRI8_INT33_M 0x0000FF00 // Interrupt 33 priority mask +#define NVIC_PRI8_INT32_M 0x000000FF // Interrupt 32 priority mask +#define NVIC_PRI8_INT35_S 24 +#define NVIC_PRI8_INT34_S 16 +#define NVIC_PRI8_INT33_S 8 +#define NVIC_PRI8_INT32_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI9 register. +// +//***************************************************************************** +#define NVIC_PRI9_INT39_M 0xFF000000 // Interrupt 39 priority mask +#define NVIC_PRI9_INT38_M 0x00FF0000 // Interrupt 38 priority mask +#define NVIC_PRI9_INT37_M 0x0000FF00 // Interrupt 37 priority mask +#define NVIC_PRI9_INT36_M 0x000000FF // Interrupt 36 priority mask +#define NVIC_PRI9_INT39_S 24 +#define NVIC_PRI9_INT38_S 16 +#define NVIC_PRI9_INT37_S 8 +#define NVIC_PRI9_INT36_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI10 register. +// +//***************************************************************************** +#define NVIC_PRI10_INT43_M 0xFF000000 // Interrupt 43 priority mask +#define NVIC_PRI10_INT42_M 0x00FF0000 // Interrupt 42 priority mask +#define NVIC_PRI10_INT41_M 0x0000FF00 // Interrupt 41 priority mask +#define NVIC_PRI10_INT40_M 0x000000FF // Interrupt 40 priority mask +#define NVIC_PRI10_INT43_S 24 +#define NVIC_PRI10_INT42_S 16 +#define NVIC_PRI10_INT41_S 8 +#define NVIC_PRI10_INT40_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_CPUID register. +// +//***************************************************************************** +#define NVIC_CPUID_IMP_M 0xFF000000 // Implementer +#define NVIC_CPUID_VAR_M 0x00F00000 // Variant +#define NVIC_CPUID_PARTNO_M 0x0000FFF0 // Processor part number +#define NVIC_CPUID_REV_M 0x0000000F // Revision + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_INT_CTRL register. +// +//***************************************************************************** +#define NVIC_INT_CTRL_NMI_SET 0x80000000 // Pend a NMI +#define NVIC_INT_CTRL_PEND_SV 0x10000000 // Pend a PendSV +#define NVIC_INT_CTRL_UNPEND_SV 0x08000000 // Unpend a PendSV +#define NVIC_INT_CTRL_ISR_PRE 0x00800000 // Debug interrupt handling +#define NVIC_INT_CTRL_ISR_PEND 0x00400000 // Debug interrupt pending +#define NVIC_INT_CTRL_VEC_PEN_M 0x003FF000 // Highest pending exception +#define NVIC_INT_CTRL_RET_BASE 0x00000800 // Return to base +#define NVIC_INT_CTRL_VEC_ACT_M 0x000003FF // Current active exception +#define NVIC_INT_CTRL_VEC_PEN_S 12 +#define NVIC_INT_CTRL_VEC_ACT_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_VTABLE register. +// +//***************************************************************************** +#define NVIC_VTABLE_BASE 0x20000000 // Vector table base +#define NVIC_VTABLE_OFFSET_M 0x1FFFFF00 // Vector table offset +#define NVIC_VTABLE_OFFSET_S 8 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_APINT register. +// +//***************************************************************************** +#define NVIC_APINT_VECTKEY_M 0xFFFF0000 // Vector key mask +#define NVIC_APINT_VECTKEY 0x05FA0000 // Vector key +#define NVIC_APINT_ENDIANESS 0x00008000 // Data endianess +#define NVIC_APINT_PRIGROUP_M 0x00000700 // Priority group +#define NVIC_APINT_PRIGROUP_7_1 0x00000000 // Priority group 7.1 split +#define NVIC_APINT_PRIGROUP_6_2 0x00000100 // Priority group 6.2 split +#define NVIC_APINT_PRIGROUP_5_3 0x00000200 // Priority group 5.3 split +#define NVIC_APINT_PRIGROUP_4_4 0x00000300 // Priority group 4.4 split +#define NVIC_APINT_PRIGROUP_3_5 0x00000400 // Priority group 3.5 split +#define NVIC_APINT_PRIGROUP_2_6 0x00000500 // Priority group 2.6 split +#define NVIC_APINT_PRIGROUP_1_7 0x00000600 // Priority group 1.7 split +#define NVIC_APINT_PRIGROUP_0_8 0x00000700 // Priority group 0.8 split +#define NVIC_APINT_SYSRESETREQ 0x00000004 // System reset request +#define NVIC_APINT_VECT_CLR_ACT 0x00000002 // Clear active NMI/fault info +#define NVIC_APINT_VECT_RESET 0x00000001 // System reset + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_CTRL register. +// +//***************************************************************************** +#define NVIC_SYS_CTRL_SEVONPEND 0x00000010 // Wakeup on pend +#define NVIC_SYS_CTRL_SLEEPDEEP 0x00000004 // Deep sleep enable +#define NVIC_SYS_CTRL_SLEEPEXIT 0x00000002 // Sleep on ISR exit + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_CFG_CTRL register. +// +//***************************************************************************** +#define NVIC_CFG_CTRL_BFHFNMIGN 0x00000100 // Ignore bus fault in NMI/fault +#define NVIC_CFG_CTRL_DIV0 0x00000010 // Trap on divide by 0 +#define NVIC_CFG_CTRL_UNALIGNED 0x00000008 // Trap on unaligned access +#define NVIC_CFG_CTRL_DEEP_PEND 0x00000004 // Allow deep interrupt trigger +#define NVIC_CFG_CTRL_MAIN_PEND 0x00000002 // Allow main interrupt trigger +#define NVIC_CFG_CTRL_BASE_THR 0x00000001 // Thread state control + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI1 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI1_RES_M 0xFF000000 // Priority of reserved handler +#define NVIC_SYS_PRI1_USAGE_M 0x00FF0000 // Priority of usage fault handler +#define NVIC_SYS_PRI1_BUS_M 0x0000FF00 // Priority of bus fault handler +#define NVIC_SYS_PRI1_MEM_M 0x000000FF // Priority of mem manage handler +#define NVIC_SYS_PRI1_USAGE_S 16 +#define NVIC_SYS_PRI1_BUS_S 8 +#define NVIC_SYS_PRI1_MEM_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI2 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI2_SVC_M 0xFF000000 // Priority of SVCall handler +#define NVIC_SYS_PRI2_RES_M 0x00FFFFFF // Priority of reserved handlers +#define NVIC_SYS_PRI2_SVC_S 24 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI3 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI3_TICK_M 0xFF000000 // Priority of Sys Tick handler +#define NVIC_SYS_PRI3_PENDSV_M 0x00FF0000 // Priority of PendSV handler +#define NVIC_SYS_PRI3_RES_M 0x0000FF00 // Priority of reserved handler +#define NVIC_SYS_PRI3_DEBUG_M 0x000000FF // Priority of debug handler +#define NVIC_SYS_PRI3_TICK_S 24 +#define NVIC_SYS_PRI3_PENDSV_S 16 +#define NVIC_SYS_PRI3_DEBUG_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_HND_CTRL register. +// +//***************************************************************************** +#define NVIC_SYS_HND_CTRL_USAGE 0x00040000 // Usage fault enable +#define NVIC_SYS_HND_CTRL_BUS 0x00020000 // Bus fault enable +#define NVIC_SYS_HND_CTRL_MEM 0x00010000 // Mem manage fault enable +#define NVIC_SYS_HND_CTRL_SVC 0x00008000 // SVCall is pended +#define NVIC_SYS_HND_CTRL_BUSP 0x00004000 // Bus fault is pended +#define NVIC_SYS_HND_CTRL_TICK 0x00000800 // Sys tick is active +#define NVIC_SYS_HND_CTRL_PNDSV 0x00000400 // PendSV is active +#define NVIC_SYS_HND_CTRL_MON 0x00000100 // Monitor is active +#define NVIC_SYS_HND_CTRL_SVCA 0x00000080 // SVCall is active +#define NVIC_SYS_HND_CTRL_USGA 0x00000008 // Usage fault is active +#define NVIC_SYS_HND_CTRL_BUSA 0x00000002 // Bus fault is active +#define NVIC_SYS_HND_CTRL_MEMA 0x00000001 // Mem manage is active + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_FAULT_STAT register. +// +//***************************************************************************** +#define NVIC_FAULT_STAT_DIV0 0x02000000 // Divide by zero fault +#define NVIC_FAULT_STAT_UNALIGN 0x01000000 // Unaligned access fault +#define NVIC_FAULT_STAT_NOCP 0x00080000 // No coprocessor fault +#define NVIC_FAULT_STAT_INVPC 0x00040000 // Invalid PC fault +#define NVIC_FAULT_STAT_INVSTAT 0x00020000 // Invalid state fault +#define NVIC_FAULT_STAT_UNDEF 0x00010000 // Undefined instruction fault +#define NVIC_FAULT_STAT_BFARV 0x00008000 // BFAR is valid +#define NVIC_FAULT_STAT_BSTKE 0x00001000 // Stack bus fault +#define NVIC_FAULT_STAT_BUSTKE 0x00000800 // Unstack bus fault +#define NVIC_FAULT_STAT_IMPRE 0x00000400 // Imprecise data bus error +#define NVIC_FAULT_STAT_PRECISE 0x00000200 // Precise data bus error +#define NVIC_FAULT_STAT_IBUS 0x00000100 // Instruction bus fault +#define NVIC_FAULT_STAT_MMARV 0x00000080 // MMAR is valid +#define NVIC_FAULT_STAT_MSTKE 0x00000010 // Stack access violation +#define NVIC_FAULT_STAT_MUSTKE 0x00000008 // Unstack access violation +#define NVIC_FAULT_STAT_DERR 0x00000002 // Data access violation +#define NVIC_FAULT_STAT_IERR 0x00000001 // Instruction access violation + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_HFAULT_STAT register. +// +//***************************************************************************** +#define NVIC_HFAULT_STAT_DBG 0x80000000 // Debug event +#define NVIC_HFAULT_STAT_FORCED 0x40000000 // Cannot execute fault handler +#define NVIC_HFAULT_STAT_VECT 0x00000002 // Vector table read fault + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DEBUG_STAT register. +// +//***************************************************************************** +#define NVIC_DEBUG_STAT_EXTRNL 0x00000010 // EDBGRQ asserted +#define NVIC_DEBUG_STAT_VCATCH 0x00000008 // Vector catch +#define NVIC_DEBUG_STAT_DWTTRAP 0x00000004 // DWT match +#define NVIC_DEBUG_STAT_BKPT 0x00000002 // Breakpoint instruction +#define NVIC_DEBUG_STAT_HALTED 0x00000001 // Halt request + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MM_ADDR register. +// +//***************************************************************************** +#define NVIC_MM_ADDR_M 0xFFFFFFFF // Data fault address +#define NVIC_MM_ADDR_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_FAULT_ADDR register. +// +//***************************************************************************** +#define NVIC_FAULT_ADDR_M 0xFFFFFFFF // Data bus fault address +#define NVIC_FAULT_ADDR_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EXC_STACK register. +// +//***************************************************************************** +#define NVIC_EXC_STACK_DEEP 0x00000001 // Exception stack + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EXC_NUM register. +// +//***************************************************************************** +#define NVIC_EXC_NUM_M 0x000003FF // Exception number +#define NVIC_EXC_NUM_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_COPRO register. +// +//***************************************************************************** +#define NVIC_COPRO_15_M 0xC0000000 // Coprocessor 15 access mask +#define NVIC_COPRO_15_DENIED 0x00000000 // Coprocessor 15 access denied +#define NVIC_COPRO_15_PRIV 0x40000000 // Coprocessor 15 privileged addess +#define NVIC_COPRO_15_FULL 0xC0000000 // Coprocessor 15 full access +#define NVIC_COPRO_14_M 0x30000000 // Coprocessor 14 access mask +#define NVIC_COPRO_14_DENIED 0x00000000 // Coprocessor 14 access denied +#define NVIC_COPRO_14_PRIV 0x10000000 // Coprocessor 14 privileged addess +#define NVIC_COPRO_14_FULL 0x30000000 // Coprocessor 14 full access +#define NVIC_COPRO_13_M 0x0C000000 // Coprocessor 13 access mask +#define NVIC_COPRO_13_DENIED 0x00000000 // Coprocessor 13 access denied +#define NVIC_COPRO_13_PRIV 0x04000000 // Coprocessor 13 privileged addess +#define NVIC_COPRO_13_FULL 0x0C000000 // Coprocessor 13 full access +#define NVIC_COPRO_12_M 0x03000000 // Coprocessor 12 access mask +#define NVIC_COPRO_12_DENIED 0x00000000 // Coprocessor 12 access denied +#define NVIC_COPRO_12_PRIV 0x01000000 // Coprocessor 12 privileged addess +#define NVIC_COPRO_12_FULL 0x03000000 // Coprocessor 12 full access +#define NVIC_COPRO_11_M 0x00C00000 // Coprocessor 11 access mask +#define NVIC_COPRO_11_DENIED 0x00000000 // Coprocessor 11 access denied +#define NVIC_COPRO_11_PRIV 0x00400000 // Coprocessor 11 privileged addess +#define NVIC_COPRO_11_FULL 0x00C00000 // Coprocessor 11 full access +#define NVIC_COPRO_10_M 0x00300000 // Coprocessor 10 access mask +#define NVIC_COPRO_10_DENIED 0x00000000 // Coprocessor 10 access denied +#define NVIC_COPRO_10_PRIV 0x00100000 // Coprocessor 10 privileged addess +#define NVIC_COPRO_10_FULL 0x00300000 // Coprocessor 10 full access +#define NVIC_COPRO_9_M 0x000C0000 // Coprocessor 9 access mask +#define NVIC_COPRO_9_DENIED 0x00000000 // Coprocessor 9 access denied +#define NVIC_COPRO_9_PRIV 0x00040000 // Coprocessor 9 privileged addess +#define NVIC_COPRO_9_FULL 0x000C0000 // Coprocessor 9 full access +#define NVIC_COPRO_8_M 0x00030000 // Coprocessor 8 access mask +#define NVIC_COPRO_8_DENIED 0x00000000 // Coprocessor 8 access denied +#define NVIC_COPRO_8_PRIV 0x00010000 // Coprocessor 8 privileged addess +#define NVIC_COPRO_8_FULL 0x00030000 // Coprocessor 8 full access +#define NVIC_COPRO_7_M 0x0000C000 // Coprocessor 7 access mask +#define NVIC_COPRO_7_DENIED 0x00000000 // Coprocessor 7 access denied +#define NVIC_COPRO_7_PRIV 0x00004000 // Coprocessor 7 privileged addess +#define NVIC_COPRO_7_FULL 0x0000C000 // Coprocessor 7 full access +#define NVIC_COPRO_6_M 0x00003000 // Coprocessor 6 access mask +#define NVIC_COPRO_6_DENIED 0x00000000 // Coprocessor 6 access denied +#define NVIC_COPRO_6_PRIV 0x00001000 // Coprocessor 6 privileged addess +#define NVIC_COPRO_6_FULL 0x00003000 // Coprocessor 6 full access +#define NVIC_COPRO_5_M 0x00000C00 // Coprocessor 5 access mask +#define NVIC_COPRO_5_DENIED 0x00000000 // Coprocessor 5 access denied +#define NVIC_COPRO_5_PRIV 0x00000400 // Coprocessor 5 privileged addess +#define NVIC_COPRO_5_FULL 0x00000C00 // Coprocessor 5 full access +#define NVIC_COPRO_4_M 0x00000300 // Coprocessor 4 access mask +#define NVIC_COPRO_4_DENIED 0x00000000 // Coprocessor 4 access denied +#define NVIC_COPRO_4_PRIV 0x00000100 // Coprocessor 4 privileged addess +#define NVIC_COPRO_4_FULL 0x00000300 // Coprocessor 4 full access +#define NVIC_COPRO_3_M 0x000000C0 // Coprocessor 3 access mask +#define NVIC_COPRO_3_DENIED 0x00000000 // Coprocessor 3 access denied +#define NVIC_COPRO_3_PRIV 0x00000040 // Coprocessor 3 privileged addess +#define NVIC_COPRO_3_FULL 0x000000C0 // Coprocessor 3 full access +#define NVIC_COPRO_2_M 0x00000030 // Coprocessor 2 access mask +#define NVIC_COPRO_2_DENIED 0x00000000 // Coprocessor 2 access denied +#define NVIC_COPRO_2_PRIV 0x00000010 // Coprocessor 2 privileged addess +#define NVIC_COPRO_2_FULL 0x00000030 // Coprocessor 2 full access +#define NVIC_COPRO_1_M 0x0000000C // Coprocessor 1 access mask +#define NVIC_COPRO_1_DENIED 0x00000000 // Coprocessor 1 access denied +#define NVIC_COPRO_1_PRIV 0x00000004 // Coprocessor 1 privileged addess +#define NVIC_COPRO_1_FULL 0x0000000C // Coprocessor 1 full access +#define NVIC_COPRO_0_M 0x00000003 // Coprocessor 0 access mask +#define NVIC_COPRO_0_DENIED 0x00000000 // Coprocessor 0 access denied +#define NVIC_COPRO_0_PRIV 0x00000001 // Coprocessor 0 privileged addess +#define NVIC_COPRO_0_FULL 0x00000003 // Coprocessor 0 full access + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_TYPE register. +// +//***************************************************************************** +#define NVIC_MPU_TYPE_IREGION_M 0x00FF0000 // Number of I regions +#define NVIC_MPU_TYPE_DREGION_M 0x0000FF00 // Number of D regions +#define NVIC_MPU_TYPE_SEPARATE 0x00000001 // Separate or unified MPU +#define NVIC_MPU_TYPE_IREGION_S 16 +#define NVIC_MPU_TYPE_DREGION_S 8 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_CTRL register. +// +//***************************************************************************** +#define NVIC_MPU_CTRL_HFNMIENA 0x00000002 // MPU enabled during faults +#define NVIC_MPU_CTRL_ENABLE 0x00000001 // MPU enable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_NUMBER register. +// +//***************************************************************************** +#define NVIC_MPU_NUMBER_M 0x000000FF // MPU region to access +#define NVIC_MPU_NUMBER_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_BASE register. +// +//***************************************************************************** +#define NVIC_MPU_BASE_ADDR_M 0xFFFFFF00 // Base address +#define NVIC_MPU_BASE_VALID 0x00000010 // Region number valid +#define NVIC_MPU_BASE_REGION_M 0x0000000F // Region number +#define NVIC_MPU_BASE_ADDR_S 8 +#define NVIC_MPU_BASE_REGION_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_ATTR register. +// +//***************************************************************************** +#define NVIC_MPU_ATTR_ATTRS 0xFFFF0000 // Attributes +#define NVIC_MPU_ATTR_SRD 0x0000FF00 // Sub-region disable +#define NVIC_MPU_ATTR_SZENABLE 0x000000FF // Region size + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_CTRL register. +// +//***************************************************************************** +#define NVIC_DBG_CTRL_DBGKEY_M 0xFFFF0000 // Debug key mask +#define NVIC_DBG_CTRL_DBGKEY 0xA05F0000 // Debug key +#define NVIC_DBG_CTRL_MON_PEND 0x00008000 // Pend the monitor +#define NVIC_DBG_CTRL_MON_REQ 0x00004000 // Monitor request +#define NVIC_DBG_CTRL_MON_EN 0x00002000 // Debug monitor enable +#define NVIC_DBG_CTRL_MONSTEP 0x00001000 // Monitor step the core +#define NVIC_DBG_CTRL_S_SLEEP 0x00000400 // Core is sleeping +#define NVIC_DBG_CTRL_S_HALT 0x00000200 // Core status on halt +#define NVIC_DBG_CTRL_S_REGRDY 0x00000100 // Register read/write available +#define NVIC_DBG_CTRL_S_LOCKUP 0x00000080 // Core is locked up +#define NVIC_DBG_CTRL_C_RESET 0x00000010 // Reset the core +#define NVIC_DBG_CTRL_C_MASKINT 0x00000008 // Mask interrupts when stepping +#define NVIC_DBG_CTRL_C_STEP 0x00000004 // Step the core +#define NVIC_DBG_CTRL_C_HALT 0x00000002 // Halt the core +#define NVIC_DBG_CTRL_C_DEBUGEN 0x00000001 // Enable debug + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_XFER register. +// +//***************************************************************************** +#define NVIC_DBG_XFER_REG_WNR 0x00010000 // Write or not read +#define NVIC_DBG_XFER_REG_SEL_M 0x0000001F // Register +#define NVIC_DBG_XFER_REG_R0 0x00000000 // Register R0 +#define NVIC_DBG_XFER_REG_R1 0x00000001 // Register R1 +#define NVIC_DBG_XFER_REG_R2 0x00000002 // Register R2 +#define NVIC_DBG_XFER_REG_R3 0x00000003 // Register R3 +#define NVIC_DBG_XFER_REG_R4 0x00000004 // Register R4 +#define NVIC_DBG_XFER_REG_R5 0x00000005 // Register R5 +#define NVIC_DBG_XFER_REG_R6 0x00000006 // Register R6 +#define NVIC_DBG_XFER_REG_R7 0x00000007 // Register R7 +#define NVIC_DBG_XFER_REG_R8 0x00000008 // Register R8 +#define NVIC_DBG_XFER_REG_R9 0x00000009 // Register R9 +#define NVIC_DBG_XFER_REG_R10 0x0000000A // Register R10 +#define NVIC_DBG_XFER_REG_R11 0x0000000B // Register R11 +#define NVIC_DBG_XFER_REG_R12 0x0000000C // Register R12 +#define NVIC_DBG_XFER_REG_R13 0x0000000D // Register R13 +#define NVIC_DBG_XFER_REG_R14 0x0000000E // Register R14 +#define NVIC_DBG_XFER_REG_R15 0x0000000F // Register R15 +#define NVIC_DBG_XFER_REG_FLAGS 0x00000010 // xPSR/Flags register +#define NVIC_DBG_XFER_REG_MSP 0x00000011 // Main SP +#define NVIC_DBG_XFER_REG_PSP 0x00000012 // Process SP +#define NVIC_DBG_XFER_REG_DSP 0x00000013 // Deep SP +#define NVIC_DBG_XFER_REG_CFBP 0x00000014 // Control/Fault/BasePri/PriMask + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_DATA register. +// +//***************************************************************************** +#define NVIC_DBG_DATA_M 0xFFFFFFFF // Data temporary cache +#define NVIC_DBG_DATA_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_INT register. +// +//***************************************************************************** +#define NVIC_DBG_INT_HARDERR 0x00000400 // Debug trap on hard fault +#define NVIC_DBG_INT_INTERR 0x00000200 // Debug trap on interrupt errors +#define NVIC_DBG_INT_BUSERR 0x00000100 // Debug trap on bus error +#define NVIC_DBG_INT_STATERR 0x00000080 // Debug trap on usage fault state +#define NVIC_DBG_INT_CHKERR 0x00000040 // Debug trap on usage fault check +#define NVIC_DBG_INT_NOCPERR 0x00000020 // Debug trap on coprocessor error +#define NVIC_DBG_INT_MMERR 0x00000010 // Debug trap on mem manage fault +#define NVIC_DBG_INT_RESET 0x00000008 // Core reset status +#define NVIC_DBG_INT_RSTPENDCLR 0x00000004 // Clear pending core reset +#define NVIC_DBG_INT_RSTPENDING 0x00000002 // Core reset is pending +#define NVIC_DBG_INT_RSTVCATCH 0x00000001 // Reset vector catch + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SW_TRIG register. +// +//***************************************************************************** +#define NVIC_SW_TRIG_INTID_M 0x000003FF // Interrupt to trigger +#define NVIC_SW_TRIG_INTID_S 0 + +#endif // __HW_NVIC_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_pwm.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_pwm.h new file mode 100644 index 000000000..53609c6f9 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_pwm.h @@ -0,0 +1,260 @@ +//***************************************************************************** +// +// hw_pwm.h - Defines and Macros for Pulse Width Modulation (PWM) ports +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_PWM_H__ +#define __HW_PWM_H__ + +//***************************************************************************** +// +// PWM Module Register Offsets. +// +//***************************************************************************** +#define PWM_O_CTL 0x00000000 // PWM Master Control register +#define PWM_O_SYNC 0x00000004 // PWM Time Base Sync register +#define PWM_O_ENABLE 0x00000008 // PWM Output Enable register +#define PWM_O_INVERT 0x0000000C // PWM Output Inversion register +#define PWM_O_FAULT 0x00000010 // PWM Output Fault register +#define PWM_O_INTEN 0x00000014 // PWM Interrupt Enable register +#define PWM_O_RIS 0x00000018 // PWM Interrupt Raw Status reg. +#define PWM_O_ISC 0x0000001C // PWM Interrupt Status register +#define PWM_O_STATUS 0x00000020 // PWM Status register + +//***************************************************************************** +// +// The following define the bit fields in the PWM Master Control register. +// +//***************************************************************************** +#define PWM_CTL_GLOBAL_SYNC2 0x00000004 // Global sync generator 2 +#define PWM_CTL_GLOBAL_SYNC1 0x00000002 // Global sync generator 1 +#define PWM_CTL_GLOBAL_SYNC0 0x00000001 // Global sync generator 0 + +//***************************************************************************** +// +// The following define the bit fields in the PWM Time Base Sync register. +// +//***************************************************************************** +#define PWM_SYNC_SYNC2 0x00000004 // Reset generator 2 counter +#define PWM_SYNC_SYNC1 0x00000002 // Reset generator 1 counter +#define PWM_SYNC_SYNC0 0x00000001 // Reset generator 0 counter + +//***************************************************************************** +// +// The following define the bit fields in the PWM Output Enable register. +// +//***************************************************************************** +#define PWM_ENABLE_PWM5EN 0x00000020 // PWM5 pin enable +#define PWM_ENABLE_PWM4EN 0x00000010 // PWM4 pin enable +#define PWM_ENABLE_PWM3EN 0x00000008 // PWM3 pin enable +#define PWM_ENABLE_PWM2EN 0x00000004 // PWM2 pin enable +#define PWM_ENABLE_PWM1EN 0x00000002 // PWM1 pin enable +#define PWM_ENABLE_PWM0EN 0x00000001 // PWM0 pin enable + +//***************************************************************************** +// +// The following define the bit fields in the PWM Inversion register. +// +//***************************************************************************** +#define PWM_INVERT_PWM5INV 0x00000020 // PWM5 pin invert +#define PWM_INVERT_PWM4INV 0x00000010 // PWM4 pin invert +#define PWM_INVERT_PWM3INV 0x00000008 // PWM3 pin invert +#define PWM_INVERT_PWM2INV 0x00000004 // PWM2 pin invert +#define PWM_INVERT_PWM1INV 0x00000002 // PWM1 pin invert +#define PWM_INVERT_PWM0INV 0x00000001 // PWM0 pin invert + +//***************************************************************************** +// +// The following define the bit fields in the PWM Fault register. +// +//***************************************************************************** +#define PWM_FAULT_FAULT5 0x00000020 // PWM5 pin fault +#define PWM_FAULT_FAULT4 0x00000010 // PWM5 pin fault +#define PWM_FAULT_FAULT3 0x00000008 // PWM5 pin fault +#define PWM_FAULT_FAULT2 0x00000004 // PWM5 pin fault +#define PWM_FAULT_FAULT1 0x00000002 // PWM5 pin fault +#define PWM_FAULT_FAULT0 0x00000001 // PWM5 pin fault + +//***************************************************************************** +// +// PWM Interrupt Register bit definitions. +// +//***************************************************************************** +#define PWM_INT_INTFAULT 0x00010000 // Fault interrupt pending + +//***************************************************************************** +// +// The following define the bit fields in the PWM Status register. +// +//***************************************************************************** +#define PWM_STATUS_FAULT 0x00000001 // Fault status + +//***************************************************************************** +// +// PWM Generator standard offsets. +// +//***************************************************************************** +#define PWM_GEN_0_OFFSET 0x00000040 // PWM0 base +#define PWM_GEN_1_OFFSET 0x00000080 // PWM1 base +#define PWM_GEN_2_OFFSET 0x000000C0 // PWM2 base + +#define PWM_O_X_CTL 0x00000000 // Gen Control Reg +#define PWM_O_X_INTEN 0x00000004 // Gen Int/Trig Enable Reg +#define PWM_O_X_RIS 0x00000008 // Gen Raw Int Status Reg +#define PWM_O_X_ISC 0x0000000C // Gen Int Status Reg +#define PWM_O_X_LOAD 0x00000010 // Gen Load Reg +#define PWM_O_X_COUNT 0x00000014 // Gen Counter Reg +#define PWM_O_X_CMPA 0x00000018 // Gen Compare A Reg +#define PWM_O_X_CMPB 0x0000001C // Gen Compare B Reg +#define PWM_O_X_GENA 0x00000020 // Gen Generator A Ctrl Reg +#define PWM_O_X_GENB 0x00000024 // Gen Generator B Ctrl Reg +#define PWM_O_X_DBCTL 0x00000028 // Gen Dead Band Ctrl Reg +#define PWM_O_X_DBRISE 0x0000002C // Gen DB Rising Edge Delay Reg +#define PWM_O_X_DBFALL 0x00000030 // Gen DB Falling Edge Delay Reg + +//***************************************************************************** +// +// PWM_X Control Register bit definitions. +// +//***************************************************************************** +#define PWM_X_CTL_ENABLE 0x00000001 // Master enable for gen block +#define PWM_X_CTL_MODE 0x00000002 // Counter mode, down or up/down +#define PWM_X_CTL_DEBUG 0x00000004 // Debug mode +#define PWM_X_CTL_LOADUPD 0x00000008 // Update mode for the load reg +#define PWM_X_CTL_CMPAUPD 0x00000010 // Update mode for comp A reg +#define PWM_X_CTL_CMPBUPD 0x00000020 // Update mode for comp B reg + +//***************************************************************************** +// +// PWM_X Interrupt/Trigger Enable Register bit definitions. +// +//***************************************************************************** +#define PWM_X_INTEN_INTCNTZERO 0x00000001 // Int if COUNT = 0 +#define PWM_X_INTEN_INTCNTLOAD 0x00000002 // Int if COUNT = LOAD +#define PWM_X_INTEN_INTCMPAU 0x00000004 // Int if COUNT = CMPA U +#define PWM_X_INTEN_INTCMPAD 0x00000008 // Int if COUNT = CMPA D +#define PWM_X_INTEN_INTCMPBU 0x00000010 // Int if COUNT = CMPA U +#define PWM_X_INTEN_INTCMPBD 0x00000020 // Int if COUNT = CMPA D +#define PWM_X_INTEN_TRCNTZERO 0x00000100 // Trig if COUNT = 0 +#define PWM_X_INTEN_TRCNTLOAD 0x00000200 // Trig if COUNT = LOAD +#define PWM_X_INTEN_TRCMPAU 0x00000400 // Trig if COUNT = CMPA U +#define PWM_X_INTEN_TRCMPAD 0x00000800 // Trig if COUNT = CMPA D +#define PWM_X_INTEN_TRCMPBU 0x00001000 // Trig if COUNT = CMPA U +#define PWM_X_INTEN_TRCMPBD 0x00002000 // Trig if COUNT = CMPA D + +//***************************************************************************** +// +// PWM_X Raw Interrupt Status Register bit definitions. +// +//***************************************************************************** +#define PWM_X_RIS_INTCNTZERO 0x00000001 // PWM_X_COUNT = 0 int +#define PWM_X_RIS_INTCNTLOAD 0x00000002 // PWM_X_COUNT = PWM_X_LOAD int +#define PWM_X_RIS_INTCMPAU 0x00000004 // PWM_X_COUNT = PWM_X_CMPA U int +#define PWM_X_RIS_INTCMPAD 0x00000008 // PWM_X_COUNT = PWM_X_CMPA D int +#define PWM_X_RIS_INTCMPBU 0x00000010 // PWM_X_COUNT = PWM_X_CMPB U int +#define PWM_X_RIS_INTCMPBD 0x00000020 // PWM_X_COUNT = PWM_X_CMPB D int + +//***************************************************************************** +// +// PWM_X Interrupt Status Register bit definitions. +// +//***************************************************************************** +#define PWM_X_INT_INTCNTZERO 0x00000001 // PWM_X_COUNT = 0 received +#define PWM_X_INT_INTCNTLOAD 0x00000002 // PWM_X_COUNT = PWM_X_LOAD rcvd +#define PWM_X_INT_INTCMPAU 0x00000004 // PWM_X_COUNT = PWM_X_CMPA U rcvd +#define PWM_X_INT_INTCMPAD 0x00000008 // PWM_X_COUNT = PWM_X_CMPA D rcvd +#define PWM_X_INT_INTCMPBU 0x00000010 // PWM_X_COUNT = PWM_X_CMPB U rcvd +#define PWM_X_INT_INTCMPBD 0x00000020 // PWM_X_COUNT = PWM_X_CMPB D rcvd + +//***************************************************************************** +// +// PWM_X Generator A/B Control Register bit definitions. +// +//***************************************************************************** +#define PWM_X_GEN_Y_ACTZERO 0x00000003 // Act PWM_X_COUNT = 0 +#define PWM_X_GEN_Y_ACTLOAD 0x0000000C // Act PWM_X_COUNT = PWM_X_LOAD +#define PWM_X_GEN_Y_ACTCMPAU 0x00000030 // Act PWM_X_COUNT = PWM_X_CMPA U +#define PWM_X_GEN_Y_ACTCMPAD 0x000000C0 // Act PWM_X_COUNT = PWM_X_CMPA D +#define PWM_X_GEN_Y_ACTCMPBU 0x00000300 // Act PWM_X_COUNT = PWM_X_CMPB U +#define PWM_X_GEN_Y_ACTCMPBD 0x00000C00 // Act PWM_X_COUNT = PWM_X_CMPB D + +//***************************************************************************** +// +// PWM_X Generator A/B Control Register action definitions. +// +//***************************************************************************** +#define PWM_GEN_ACT_NONE 0x0 // Do nothing +#define PWM_GEN_ACT_INV 0x1 // Invert the output signal +#define PWM_GEN_ACT_ZERO 0x2 // Set the output signal to zero +#define PWM_GEN_ACT_ONE 0x3 // Set the output signal to one +#define PWM_GEN_ACT_ZERO_SHIFT 0 // Shift amount for the zero action +#define PWM_GEN_ACT_LOAD_SHIFT 2 // Shift amount for the load action +#define PWM_GEN_ACT_A_UP_SHIFT 4 // Shift amount for the A up action +#define PWM_GEN_ACT_A_DN_SHIFT 6 // Shift amount for the A dn action +#define PWM_GEN_ACT_B_UP_SHIFT 8 // Shift amount for the B up action +#define PWM_GEN_ACT_B_DN_SHIFT 10 // Shift amount for the B dn action + +//***************************************************************************** +// +// PWM_X Dead Band Control Register bit definitions. +// +//***************************************************************************** +#define PWM_DBCTL_ENABLE 0x00000001 // Enable dead band insertion + +//***************************************************************************** +// +// PWM Register reset values. +// +//***************************************************************************** +#define PWM_RV_CTL 0x00000000 // Master control of the PWM module +#define PWM_RV_SYNC 0x00000000 // Counter synch for PWM generators +#define PWM_RV_ENABLE 0x00000000 // Master enable for the PWM + // output pins +#define PWM_RV_INVERT 0x00000000 // Inversion control for + // PWM output pins +#define PWM_RV_FAULT 0x00000000 // Fault handling for the PWM + // output pins +#define PWM_RV_INTEN 0x00000000 // Interrupt enable +#define PWM_RV_RIS 0x00000000 // Raw interrupt status +#define PWM_RV_ISC 0x00000000 // Interrupt status and clearing +#define PWM_RV_STATUS 0x00000000 // Status +#define PWM_RV_X_CTL 0x00000000 // Master control of the PWM + // generator block +#define PWM_RV_X_INTEN 0x00000000 // Interrupt and trigger enable +#define PWM_RV_X_RIS 0x00000000 // Raw interrupt status +#define PWM_RV_X_ISC 0x00000000 // Interrupt status and clearing +#define PWM_RV_X_LOAD 0x00000000 // The load value for the counter +#define PWM_RV_X_COUNT 0x00000000 // The current counter value +#define PWM_RV_X_CMPA 0x00000000 // The comparator A value +#define PWM_RV_X_CMPB 0x00000000 // The comparator B value +#define PWM_RV_X_GENA 0x00000000 // Controls PWM generator A +#define PWM_RV_X_GENB 0x00000000 // Controls PWM generator B +#define PWM_RV_X_DBCTL 0x00000000 // Control the dead band generator +#define PWM_RV_X_DBRISE 0x00000000 // The dead band rising edge delay + // count +#define PWM_RV_X_DBFALL 0x00000000 // The dead band falling edge delay + // count + +#endif // __HW_PWM_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_qei.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_qei.h new file mode 100644 index 000000000..6d988ba95 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_qei.h @@ -0,0 +1,176 @@ +//***************************************************************************** +// +// hw_qei.h - Macros used when accessing the QEI hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_QEI_H__ +#define __HW_QEI_H__ + +//***************************************************************************** +// +// The following define the offsets of the QEI registers. +// +//***************************************************************************** +#define QEI_O_CTL 0x00000000 // Configuration and control reg. +#define QEI_O_STAT 0x00000004 // Status register +#define QEI_O_POS 0x00000008 // Current position register +#define QEI_O_MAXPOS 0x0000000C // Maximum position register +#define QEI_O_LOAD 0x00000010 // Velocity timer load register +#define QEI_O_TIME 0x00000014 // Velocity timer register +#define QEI_O_COUNT 0x00000018 // Velocity pulse count register +#define QEI_O_SPEED 0x0000001C // Velocity speed register +#define QEI_O_INTEN 0x00000020 // Interrupt enable register +#define QEI_O_RIS 0x00000024 // Raw interrupt status register +#define QEI_O_ISC 0x00000028 // Interrupt status register + +//***************************************************************************** +// +// The following define the bit fields in the QEI_CTL register. +// +//***************************************************************************** +#define QEI_CTL_STALLEN 0x00001000 // Stall enable +#define QEI_CTL_INVI 0x00000800 // Invert Index input +#define QEI_CTL_INVB 0x00000400 // Invert PhB input +#define QEI_CTL_INVA 0x00000200 // Invert PhA input +#define QEI_CTL_VELDIV_M 0x000001C0 // Velocity predivider mask +#define QEI_CTL_VELDIV_1 0x00000000 // Predivide by 1 +#define QEI_CTL_VELDIV_2 0x00000040 // Predivide by 2 +#define QEI_CTL_VELDIV_4 0x00000080 // Predivide by 4 +#define QEI_CTL_VELDIV_8 0x000000C0 // Predivide by 8 +#define QEI_CTL_VELDIV_16 0x00000100 // Predivide by 16 +#define QEI_CTL_VELDIV_32 0x00000140 // Predivide by 32 +#define QEI_CTL_VELDIV_64 0x00000180 // Predivide by 64 +#define QEI_CTL_VELDIV_128 0x000001C0 // Predivide by 128 +#define QEI_CTL_VELEN 0x00000020 // Velocity enable +#define QEI_CTL_RESMODE 0x00000010 // Position counter reset mode +#define QEI_CTL_CAPMODE 0x00000008 // Edge capture mode +#define QEI_CTL_SIGMODE 0x00000004 // Encoder signaling mode +#define QEI_CTL_SWAP 0x00000002 // Swap input signals +#define QEI_CTL_ENABLE 0x00000001 // QEI enable + +//***************************************************************************** +// +// The following define the bit fields in the QEI_STAT register. +// +//***************************************************************************** +#define QEI_STAT_DIRECTION 0x00000002 // Direction of rotation +#define QEI_STAT_ERROR 0x00000001 // Signalling error detected + +//***************************************************************************** +// +// The following define the bit fields in the QEI_POS register. +// +//***************************************************************************** +#define QEI_POS_M 0xFFFFFFFF // Current encoder position +#define QEI_POS_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_MAXPOS register. +// +//***************************************************************************** +#define QEI_MAXPOS_M 0xFFFFFFFF // Maximum encoder position +#define QEI_MAXPOS_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_LOAD register. +// +//***************************************************************************** +#define QEI_LOAD_M 0xFFFFFFFF // Velocity timer load value +#define QEI_LOAD_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_TIME register. +// +//***************************************************************************** +#define QEI_TIME_M 0xFFFFFFFF // Velocity timer current value +#define QEI_TIME_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_COUNT register. +// +//***************************************************************************** +#define QEI_COUNT_M 0xFFFFFFFF // Encoder running pulse count +#define QEI_COUNT_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_SPEED register. +// +//***************************************************************************** +#define QEI_SPEED_M 0xFFFFFFFF // Encoder pulse count +#define QEI_SPEED_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_INTEN register. +// +//***************************************************************************** +#define QEI_INTEN_ERROR 0x00000008 // Phase error detected +#define QEI_INTEN_DIR 0x00000004 // Direction change +#define QEI_INTEN_TIMER 0x00000002 // Velocity timer expired +#define QEI_INTEN_INDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// The following define the bit fields in the QEI_RIS register. +// +//***************************************************************************** +#define QEI_RIS_ERROR 0x00000008 // Phase error detected +#define QEI_RIS_DIR 0x00000004 // Direction change +#define QEI_RIS_TIMER 0x00000002 // Velocity timer expired +#define QEI_RIS_INDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// The following define the bit fields in the QEI_ISC register. +// +//***************************************************************************** +#define QEI_INT_ERROR 0x00000008 // Phase error detected +#define QEI_INT_DIR 0x00000004 // Direction change +#define QEI_INT_TIMER 0x00000002 // Velocity timer expired +#define QEI_INT_INDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// The following define the reset values for the QEI registers. +// +//***************************************************************************** +#define QEI_RV_CTL 0x00000000 // Configuration and control reg. +#define QEI_RV_STAT 0x00000000 // Status register +#define QEI_RV_POS 0x00000000 // Current position register +#define QEI_RV_MAXPOS 0x00000000 // Maximum position register +#define QEI_RV_LOAD 0x00000000 // Velocity timer load register +#define QEI_RV_TIME 0x00000000 // Velocity timer register +#define QEI_RV_COUNT 0x00000000 // Velocity pulse count register +#define QEI_RV_SPEED 0x00000000 // Velocity speed register +#define QEI_RV_INTEN 0x00000000 // Interrupt enable register +#define QEI_RV_RIS 0x00000000 // Raw interrupt status register +#define QEI_RV_ISC 0x00000000 // Interrupt status register + +#endif // __HW_QEI_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_ssi.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_ssi.h new file mode 100644 index 000000000..2af758095 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_ssi.h @@ -0,0 +1,120 @@ +//***************************************************************************** +// +// hw_ssi.h - Macros used when accessing the SSI hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_SSI_H__ +#define __HW_SSI_H__ + +//***************************************************************************** +// +// The following define the offsets of the SSI registers. +// +//***************************************************************************** +#define SSI_O_CR0 0x00000000 // Control register 0 +#define SSI_O_CR1 0x00000004 // Control register 1 +#define SSI_O_DR 0x00000008 // Data register +#define SSI_O_SR 0x0000000C // Status register +#define SSI_O_CPSR 0x00000010 // Clock prescale register +#define SSI_O_IM 0x00000014 // Int mask set and clear register +#define SSI_O_RIS 0x00000018 // Raw interrupt register +#define SSI_O_MIS 0x0000001C // Masked interrupt register +#define SSI_O_ICR 0x00000020 // Interrupt clear register + +//***************************************************************************** +// +// The following define the bit fields in the SSI Control register 0. +// +//***************************************************************************** +#define SSI_CR0_SCR 0x0000FF00 // Serial clock rate +#define SSI_CR0_SPH 0x00000080 // SSPCLKOUT phase +#define SSI_CR0_SPO 0x00000040 // SSPCLKOUT polarity +#define SSI_CR0_FRF_MASK 0x00000030 // Frame format mask +#define SSI_CR0_FRF_MOTO 0x00000000 // Motorola SPI frame format +#define SSI_CR0_FRF_TI 0x00000010 // TI sync serial frame format +#define SSI_CR0_FRF_NMW 0x00000020 // National Microwire frame format +#define SSI_CR0_DSS 0x0000000F // Data size select +#define SSI_CR0_DSS_4 0x00000003 // 4 bit data +#define SSI_CR0_DSS_5 0x00000004 // 5 bit data +#define SSI_CR0_DSS_6 0x00000005 // 6 bit data +#define SSI_CR0_DSS_7 0x00000006 // 7 bit data +#define SSI_CR0_DSS_8 0x00000007 // 8 bit data +#define SSI_CR0_DSS_9 0x00000008 // 9 bit data +#define SSI_CR0_DSS_10 0x00000009 // 10 bit data +#define SSI_CR0_DSS_11 0x0000000A // 11 bit data +#define SSI_CR0_DSS_12 0x0000000B // 12 bit data +#define SSI_CR0_DSS_13 0x0000000C // 13 bit data +#define SSI_CR0_DSS_14 0x0000000D // 14 bit data +#define SSI_CR0_DSS_15 0x0000000E // 15 bit data +#define SSI_CR0_DSS_16 0x0000000F // 16 bit data + +//***************************************************************************** +// +// The following define the bit fields in the SSI Control register 1. +// +//***************************************************************************** +#define SSI_CR1_SOD 0x00000008 // Slave mode output disable +#define SSI_CR1_MS 0x00000004 // Master or slave mode select +#define SSI_CR1_SSE 0x00000002 // Sync serial port enable +#define SSI_CR1_LBM 0x00000001 // Loopback mode + +//***************************************************************************** +// +// The following define the bit fields in the SSI Status register. +// +//***************************************************************************** +#define SSI_SR_BSY 0x00000010 // SSI busy +#define SSI_SR_RFF 0x00000008 // RX FIFO full +#define SSI_SR_RNE 0x00000004 // RX FIFO not empty +#define SSI_SR_TNF 0x00000002 // TX FIFO not full +#define SSI_SR_TFE 0x00000001 // TX FIFO empty + +//***************************************************************************** +// +// The following define the bit fields in the SSI clock prescale register. +// +//***************************************************************************** +#define SSI_CPSR_CPSDVSR_MASK 0x000000FF // Clock prescale + +//***************************************************************************** +// +// The following define information concerning the SSI Data register. +// +//***************************************************************************** +#define TX_FIFO_SIZE (8) // Number of entries in the TX FIFO +#define RX_FIFO_SIZE (8) // Number of entries in the RX FIFO + +//***************************************************************************** +// +// The following define the bit fields in the interrupt mask set and clear, +// raw interrupt, masked interrupt, and interrupt clear registers. +// +//***************************************************************************** +#define SSI_INT_TXFF 0x00000008 // TX FIFO interrupt +#define SSI_INT_RXFF 0x00000004 // RX FIFO interrupt +#define SSI_INT_RXTO 0x00000002 // RX timeout interrupt +#define SSI_INT_RXOR 0x00000001 // RX overrun interrupt + +#endif // __HW_SSI_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_sysctl.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_sysctl.h new file mode 100644 index 000000000..6a2d6312b --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_sysctl.h @@ -0,0 +1,659 @@ +//***************************************************************************** +// +// hw_sysctl.h - Macros used when accessing the system control hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_SYSCTL_H__ +#define __HW_SYSCTL_H__ + +//***************************************************************************** +// +// The following define the addresses of the system control registers. +// +//***************************************************************************** +#define SYSCTL_DID0 0x400fe000 // Device identification register 0 +#define SYSCTL_DID1 0x400fe004 // Device identification register 1 +#define SYSCTL_DC0 0x400fe008 // Device capabilities register 0 +#define SYSCTL_DC1 0x400fe010 // Device capabilities register 1 +#define SYSCTL_DC2 0x400fe014 // Device capabilities register 2 +#define SYSCTL_DC3 0x400fe018 // Device capabilities register 3 +#define SYSCTL_DC4 0x400fe01C // Device capabilities register 4 +#define SYSCTL_PBORCTL 0x400fe030 // POR/BOR reset control register +#define SYSCTL_LDOPCTL 0x400fe034 // LDO power control register +#define SYSCTL_SRCR0 0x400fe040 // Software reset control reg 0 +#define SYSCTL_SRCR1 0x400fe044 // Software reset control reg 1 +#define SYSCTL_SRCR2 0x400fe048 // Software reset control reg 2 +#define SYSCTL_RIS 0x400fe050 // Raw interrupt status register +#define SYSCTL_IMC 0x400fe054 // Interrupt mask/control register +#define SYSCTL_MISC 0x400fe058 // Interrupt status register +#define SYSCTL_RESC 0x400fe05c // Reset cause register +#define SYSCTL_RCC 0x400fe060 // Run-mode clock config register +#define SYSCTL_PLLCFG 0x400fe064 // PLL configuration register +#define SYSCTL_RCC2 0x400fe070 // Run-mode clock config register 2 +#define SYSCTL_RCGC0 0x400fe100 // Run-mode clock gating register 0 +#define SYSCTL_RCGC1 0x400fe104 // Run-mode clock gating register 1 +#define SYSCTL_RCGC2 0x400fe108 // Run-mode clock gating register 2 +#define SYSCTL_SCGC0 0x400fe110 // Sleep-mode clock gating reg 0 +#define SYSCTL_SCGC1 0x400fe114 // Sleep-mode clock gating reg 1 +#define SYSCTL_SCGC2 0x400fe118 // Sleep-mode clock gating reg 2 +#define SYSCTL_DCGC0 0x400fe120 // Deep Sleep-mode clock gate reg 0 +#define SYSCTL_DCGC1 0x400fe124 // Deep Sleep-mode clock gate reg 1 +#define SYSCTL_DCGC2 0x400fe128 // Deep Sleep-mode clock gate reg 2 +#define SYSCTL_DSLPCLKCFG 0x400fe144 // Deep Sleep-mode clock config reg +#define SYSCTL_CLKVCLR 0x400fe150 // Clock verifcation clear register +#define SYSCTL_LDOARST 0x400fe160 // LDO reset control register +#define SYSCTL_USER0 0x400fe1e0 // NV User Register 0 +#define SYSCTL_USER1 0x400fe1e4 // NV User Register 1 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DID0 register. +// +//***************************************************************************** +#define SYSCTL_DID0_VER_MASK 0x70000000 // DID0 version mask +#define SYSCTL_DID0_VER_0 0x00000000 // DID0 version 0 +#define SYSCTL_DID0_VER_1 0x10000000 // DID0 version 1 +#define SYSCTL_DID0_CLASS_MASK 0x00FF0000 // Device Class +#define SYSCTL_DID0_CLASS_SANDSTORM 0x00000000 // LM3Snnn Sandstorm Device +#define SYSCTL_DID0_CLASS_FURY 0x00010000 // LM3Snnnn Fury Device +#define SYSCTL_DID0_MAJ_MASK 0x0000FF00 // Major revision mask +#define SYSCTL_DID0_MAJ_A 0x00000000 // Major revision A +#define SYSCTL_DID0_MAJ_B 0x00000100 // Major revision B +#define SYSCTL_DID0_MAJ_C 0x00000200 // Major revision C +#define SYSCTL_DID0_MIN_MASK 0x000000FF // Minor revision mask +#define SYSCTL_DID0_MIN_0 0x00000000 // Minor revision 0 +#define SYSCTL_DID0_MIN_1 0x00000001 // Minor revision 1 +#define SYSCTL_DID0_MIN_2 0x00000002 // Minor revision 2 +#define SYSCTL_DID0_MIN_3 0x00000003 // Minor revision 3 +#define SYSCTL_DID0_MIN_4 0x00000004 // Minor revision 4 +#define SYSCTL_DID0_MIN_5 0x00000005 // Minor revision 5 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DID1 register. +// +//***************************************************************************** +#define SYSCTL_DID1_VER_MASK 0xF0000000 // Register version mask +#define SYSCTL_DID1_FAM_MASK 0x0F000000 // Family mask +#define SYSCTL_DID1_FAM_S 0x00000000 // Stellaris family +#define SYSCTL_DID1_PRTNO_MASK 0x00FF0000 // Part number mask +#define SYSCTL_DID1_PRTNO_101 0x00010000 // LM3S101 +#define SYSCTL_DID1_PRTNO_102 0x00020000 // LM3S102 +#define SYSCTL_DID1_PRTNO_301 0x00110000 // LM3S301 +#define SYSCTL_DID1_PRTNO_310 0x00120000 // LM3S310 +#define SYSCTL_DID1_PRTNO_315 0x00130000 // LM3S315 +#define SYSCTL_DID1_PRTNO_316 0x00140000 // LM3S316 +#define SYSCTL_DID1_PRTNO_317 0x00170000 // LM3S317 +#define SYSCTL_DID1_PRTNO_328 0x00150000 // LM3S328 +#define SYSCTL_DID1_PRTNO_601 0x00210000 // LM3S601 +#define SYSCTL_DID1_PRTNO_610 0x00220000 // LM3S610 +#define SYSCTL_DID1_PRTNO_611 0x00230000 // LM3S611 +#define SYSCTL_DID1_PRTNO_612 0x00240000 // LM3S612 +#define SYSCTL_DID1_PRTNO_613 0x00250000 // LM3S613 +#define SYSCTL_DID1_PRTNO_615 0x00260000 // LM3S615 +#define SYSCTL_DID1_PRTNO_617 0x00280000 // LM3S617 +#define SYSCTL_DID1_PRTNO_618 0x00290000 // LM3S618 +#define SYSCTL_DID1_PRTNO_628 0x00270000 // LM3S628 +#define SYSCTL_DID1_PRTNO_801 0x00310000 // LM3S801 +#define SYSCTL_DID1_PRTNO_811 0x00320000 // LM3S811 +#define SYSCTL_DID1_PRTNO_812 0x00330000 // LM3S812 +#define SYSCTL_DID1_PRTNO_815 0x00340000 // LM3S815 +#define SYSCTL_DID1_PRTNO_817 0x00360000 // LM3S817 +#define SYSCTL_DID1_PRTNO_818 0x00370000 // LM3S818 +#define SYSCTL_DID1_PRTNO_828 0x00350000 // LM3S828 +#define SYSCTL_DID1_PRTNO_2110 0x00510000 // LM3S2110 +#define SYSCTL_DID1_PRTNO_2139 0x00840000 // LM3S2139 +#define SYSCTL_DID1_PRTNO_2410 0x00A20000 // LM3S2410 +#define SYSCTL_DID1_PRTNO_2412 0x00590000 // LM3S2412 +#define SYSCTL_DID1_PRTNO_2432 0x00560000 // LM3S2432 +#define SYSCTL_DID1_PRTNO_2533 0x005A0000 // LM3S2533 +#define SYSCTL_DID1_PRTNO_2620 0x00570000 // LM3S2620 +#define SYSCTL_DID1_PRTNO_2637 0x00850000 // LM3S2637 +#define SYSCTL_DID1_PRTNO_2651 0x00530000 // LM3S2651 +#define SYSCTL_DID1_PRTNO_2730 0x00A40000 // LM3S2730 +#define SYSCTL_DID1_PRTNO_2739 0x00520000 // LM3S2739 +#define SYSCTL_DID1_PRTNO_2939 0x00540000 // LM3S2939 +#define SYSCTL_DID1_PRTNO_2948 0x008F0000 // LM3S2948 +#define SYSCTL_DID1_PRTNO_2950 0x00580000 // LM3S2950 +#define SYSCTL_DID1_PRTNO_2965 0x00550000 // LM3S2965 +#define SYSCTL_DID1_PRTNO_6100 0x00A10000 // LM3S6100 +#define SYSCTL_DID1_PRTNO_6110 0x00740000 // LM3S6110 +#define SYSCTL_DID1_PRTNO_6420 0x00A50000 // LM3S6420 +#define SYSCTL_DID1_PRTNO_6422 0x00820000 // LM3S6422 +#define SYSCTL_DID1_PRTNO_6432 0x00750000 // LM3S6432 +#define SYSCTL_DID1_PRTNO_6610 0x00710000 // LM3S6610 +#define SYSCTL_DID1_PRTNO_6633 0x00830000 // LM3S6633 +#define SYSCTL_DID1_PRTNO_6637 0x008B0000 // LM3S6637 +#define SYSCTL_DID1_PRTNO_6730 0x00A30000 // LM3S6730 +#define SYSCTL_DID1_PRTNO_6938 0x00890000 // LM3S6938 +#define SYSCTL_DID1_PRTNO_6952 0x00780000 // LM3S6952 +#define SYSCTL_DID1_PRTNO_6965 0x00730000 // LM3S6965 +#define SYSCTL_DID1_PINCNT_MASK 0x0000E000 // Pin count +#define SYSCTL_DID1_PINCNT_100 0x00004000 // 100 pin package +#define SYSCTL_DID1_TEMP_MASK 0x000000E0 // Temperature range mask +#define SYSCTL_DID1_TEMP_C 0x00000000 // Commercial temp range (0..70C) +#define SYSCTL_DID1_TEMP_I 0x00000020 // Industrial temp range (-40..85C) +#define SYSCTL_DID1_PKG_MASK 0x00000018 // Package mask +#define SYSCTL_DID1_PKG_28SOIC 0x00000000 // 28-pin SOIC +#define SYSCTL_DID1_PKG_48QFP 0x00000008 // 48-pin QFP +#define SYSCTL_DID1_ROHS 0x00000004 // Part is RoHS compliant +#define SYSCTL_DID1_QUAL_MASK 0x00000003 // Qualification status mask +#define SYSCTL_DID1_QUAL_ES 0x00000000 // Engineering sample (unqualified) +#define SYSCTL_DID1_QUAL_PP 0x00000001 // Pilot production (unqualified) +#define SYSCTL_DID1_QUAL_FQ 0x00000002 // Fully qualified +#define SYSCTL_DID1_PRTNO_SHIFT 16 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC0 register. +// +//***************************************************************************** +#define SYSCTL_DC0_SRAMSZ_MASK 0xFFFF0000 // SRAM size mask +#define SYSCTL_DC0_SRAMSZ_2KB 0x00070000 // 2 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_4KB 0x000F0000 // 4 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_8KB 0x001F0000 // 8 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_16KB 0x003F0000 // 16 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_32KB 0x007F0000 // 32 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_64KB 0x00FF0000 // 64 KB of SRAM +#define SYSCTL_DC0_FLASHSZ_MASK 0x0000FFFF // Flash size mask +#define SYSCTL_DC0_FLASHSZ_8KB 0x00000003 // 8 KB of flash +#define SYSCTL_DC0_FLASHSZ_16KB 0x00000007 // 16 KB of flash +#define SYSCTL_DC0_FLASHSZ_32KB 0x0000000F // 32 KB of flash +#define SYSCTL_DC0_FLASHSZ_64KB 0x0000001F // 64 KB of flash +#define SYSCTL_DC0_FLASHSZ_96KB 0x0000002F // 96 KB of flash +#define SYSCTL_DC0_FLASHSZ_128K 0x0000003F // 128 KB of flash +#define SYSCTL_DC0_FLASHSZ_256K 0x0000007F // 256 KB of flash + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC1 register. +// +//***************************************************************************** +#define SYSCTL_DC1_CAN1 0x02000000 // CAN1 module present +#define SYSCTL_DC1_CAN0 0x01000000 // CAN0 module present +#define SYSCTL_DC1_PWM 0x00100000 // PWM module present +#define SYSCTL_DC1_ADC 0x00010000 // ADC module present +#define SYSCTL_DC1_SYSDIV_MASK 0x0000F000 // Minimum system divider mask +#define SYSCTL_DC1_ADCSPD_MASK 0x00000F00 // ADC speed mask +#define SYSCTL_DC1_ADCSPD_1M 0x00000300 // 1Msps ADC +#define SYSCTL_DC1_ADCSPD_500K 0x00000200 // 500Ksps ADC +#define SYSCTL_DC1_ADCSPD_250K 0x00000100 // 250Ksps ADC +#define SYSCTL_DC1_ADCSPD_125K 0x00000000 // 125Ksps ADC +#define SYSCTL_DC1_MPU 0x00000080 // Cortex M3 MPU present +#define SYSCTL_DC1_HIB 0x00000040 // Hibernation module present +#define SYSCTL_DC1_TEMP 0x00000020 // Temperature sensor present +#define SYSCTL_DC1_PLL 0x00000010 // PLL present +#define SYSCTL_DC1_WDOG 0x00000008 // Watchdog present +#define SYSCTL_DC1_SWO 0x00000004 // Serial wire output present +#define SYSCTL_DC1_SWD 0x00000002 // Serial wire debug present +#define SYSCTL_DC1_JTAG 0x00000001 // JTAG debug present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC2 register. +// +//***************************************************************************** +#define SYSCTL_DC2_COMP2 0x04000000 // Analog comparator 2 present +#define SYSCTL_DC2_COMP1 0x02000000 // Analog comparator 1 present +#define SYSCTL_DC2_COMP0 0x01000000 // Analog comparator 0 present +#define SYSCTL_DC2_TIMER3 0x00080000 // Timer 3 present +#define SYSCTL_DC2_TIMER2 0x00040000 // Timer 2 present +#define SYSCTL_DC2_TIMER1 0x00020000 // Timer 1 present +#define SYSCTL_DC2_TIMER0 0x00010000 // Timer 0 present +#define SYSCTL_DC2_I2C1 0x00002000 // I2C 1 present +#define SYSCTL_DC2_I2C0 0x00001000 // I2C 0 present +#ifndef DEPRECATED +#define SYSCTL_DC2_I2C 0x00001000 // I2C present +#endif +#define SYSCTL_DC2_QEI1 0x00000200 // QEI 1 present +#define SYSCTL_DC2_QEI0 0x00000100 // QEI 0 present +#ifndef DEPRECATED +#define SYSCTL_DC2_QEI 0x00000100 // QEI present +#endif +#define SYSCTL_DC2_SSI1 0x00000020 // SSI 1 present +#define SYSCTL_DC2_SSI0 0x00000010 // SSI 0 present +#ifndef DEPRECATED +#define SYSCTL_DC2_SSI 0x00000010 // SSI present +#endif +#define SYSCTL_DC2_UART2 0x00000004 // UART 2 present +#define SYSCTL_DC2_UART1 0x00000002 // UART 1 present +#define SYSCTL_DC2_UART0 0x00000001 // UART 0 present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC3 register. +// +//***************************************************************************** +#define SYSCTL_DC3_32KHZ 0x80000000 // 32kHz pin present +#define SYSCTL_DC3_CCP5 0x20000000 // CCP5 pin present +#define SYSCTL_DC3_CCP4 0x10000000 // CCP4 pin present +#define SYSCTL_DC3_CCP3 0x08000000 // CCP3 pin present +#define SYSCTL_DC3_CCP2 0x04000000 // CCP2 pin present +#define SYSCTL_DC3_CCP1 0x02000000 // CCP1 pin present +#define SYSCTL_DC3_CCP0 0x01000000 // CCP0 pin present +#define SYSCTL_DC3_ADC7 0x00800000 // ADC7 pin present +#define SYSCTL_DC3_ADC6 0x00400000 // ADC6 pin present +#define SYSCTL_DC3_ADC5 0x00200000 // ADC5 pin present +#define SYSCTL_DC3_ADC4 0x00100000 // ADC4 pin present +#define SYSCTL_DC3_ADC3 0x00080000 // ADC3 pin present +#define SYSCTL_DC3_ADC2 0x00040000 // ADC2 pin present +#define SYSCTL_DC3_ADC1 0x00020000 // ADC1 pin present +#define SYSCTL_DC3_ADC0 0x00010000 // ADC0 pin present +#define SYSCTL_DC3_MC_FAULT0 0x00008000 // MC0 fault pin present +#define SYSCTL_DC3_C2O 0x00004000 // C2o pin present +#define SYSCTL_DC3_C2PLUS 0x00002000 // C2+ pin present +#define SYSCTL_DC3_C2MINUS 0x00001000 // C2- pin present +#define SYSCTL_DC3_C1O 0x00000800 // C1o pin present +#define SYSCTL_DC3_C1PLUS 0x00000400 // C1+ pin present +#define SYSCTL_DC3_C1MINUS 0x00000200 // C1- pin present +#define SYSCTL_DC3_C0O 0x00000100 // C0o pin present +#define SYSCTL_DC3_C0PLUS 0x00000080 // C0+ pin present +#define SYSCTL_DC3_C0MINUS 0x00000040 // C0- pin present +#define SYSCTL_DC3_PWM5 0x00000020 // PWM5 pin present +#define SYSCTL_DC3_PWM4 0x00000010 // PWM4 pin present +#define SYSCTL_DC3_PWM3 0x00000008 // PWM3 pin present +#define SYSCTL_DC3_PWM2 0x00000004 // PWM2 pin present +#define SYSCTL_DC3_PWM1 0x00000002 // PWM1 pin present +#define SYSCTL_DC3_PWM0 0x00000001 // PWM0 pin present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC4 register. +// +//***************************************************************************** +#define SYSCTL_DC4_ETH 0x50000000 // Ethernet present +#define SYSCTL_DC4_GPIOH 0x00000080 // GPIO port H present +#define SYSCTL_DC4_GPIOG 0x00000040 // GPIO port G present +#define SYSCTL_DC4_GPIOF 0x00000020 // GPIO port F present +#define SYSCTL_DC4_GPIOE 0x00000010 // GPIO port E present +#define SYSCTL_DC4_GPIOD 0x00000008 // GPIO port D present +#define SYSCTL_DC4_GPIOC 0x00000004 // GPIO port C present +#define SYSCTL_DC4_GPIOB 0x00000002 // GPIO port B present +#define SYSCTL_DC4_GPIOA 0x00000001 // GPIO port A present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_PBORCTL register. +// +//***************************************************************************** +#define SYSCTL_PBORCTL_BOR_MASK 0x0000FFFC // BOR wait timer +#define SYSCTL_PBORCTL_BORIOR 0x00000002 // BOR interrupt or reset +#define SYSCTL_PBORCTL_BORWT 0x00000001 // BOR wait and check for noise +#define SYSCTL_PBORCTL_BOR_SH 2 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_LDOPCTL register. +// +//***************************************************************************** +#define SYSCTL_LDOPCTL_MASK 0x0000003F // Voltage adjust mask +#define SYSCTL_LDOPCTL_2_25V 0x00000005 // LDO output of 2.25V +#define SYSCTL_LDOPCTL_2_30V 0x00000004 // LDO output of 2.30V +#define SYSCTL_LDOPCTL_2_35V 0x00000003 // LDO output of 2.35V +#define SYSCTL_LDOPCTL_2_40V 0x00000002 // LDO output of 2.40V +#define SYSCTL_LDOPCTL_2_45V 0x00000001 // LDO output of 2.45V +#define SYSCTL_LDOPCTL_2_50V 0x00000000 // LDO output of 2.50V +#define SYSCTL_LDOPCTL_2_55V 0x0000001F // LDO output of 2.55V +#define SYSCTL_LDOPCTL_2_60V 0x0000001E // LDO output of 2.60V +#define SYSCTL_LDOPCTL_2_65V 0x0000001D // LDO output of 2.65V +#define SYSCTL_LDOPCTL_2_70V 0x0000001C // LDO output of 2.70V +#define SYSCTL_LDOPCTL_2_75V 0x0000001B // LDO output of 2.75V + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR0, SYSCTL_RCGC0, +// SYSCTL_SCGC0, and SYSCTL_DCGC0 registers. +// +//***************************************************************************** +#define SYSCTL_SET0_CAN1 0x02000000 // CAN 1 module +#define SYSCTL_SET0_CAN0 0x01000000 // CAN 0 module +#define SYSCTL_SET0_PWM 0x00100000 // PWM module +#define SYSCTL_SET0_ADC 0x00010000 // ADC module +#define SYSCTL_SET0_ADCSPD_MASK 0x00000F00 // ADC speed mask +#define SYSCTL_SET0_ADCSPD_1M 0x00000300 // 1Msps ADC +#define SYSCTL_SET0_ADCSPD_500K 0x00000200 // 500Ksps ADC +#define SYSCTL_SET0_ADCSPD_250K 0x00000100 // 250Ksps ADC +#define SYSCTL_SET0_ADCSPD_125K 0x00000000 // 125Ksps ADC +#define SYSCTL_SET0_HIB 0x00000040 // Hibernation module +#define SYSCTL_SET0_WDOG 0x00000008 // Watchdog module + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR1, SYSCTL_RCGC1, +// SYSCTL_SCGC1, and SYSCTL_DCGC1 registers. +// +//***************************************************************************** +#define SYSCTL_SET1_COMP2 0x04000000 // Analog comparator module 2 +#define SYSCTL_SET1_COMP1 0x02000000 // Analog comparator module 1 +#define SYSCTL_SET1_COMP0 0x01000000 // Analog comparator module 0 +#define SYSCTL_SET1_TIMER3 0x00080000 // Timer module 3 +#define SYSCTL_SET1_TIMER2 0x00040000 // Timer module 2 +#define SYSCTL_SET1_TIMER1 0x00020000 // Timer module 1 +#define SYSCTL_SET1_TIMER0 0x00010000 // Timer module 0 +#define SYSCTL_SET1_I2C1 0x00002000 // I2C module 1 +#define SYSCTL_SET1_I2C0 0x00001000 // I2C module 0 +#ifndef DEPRECATED +#define SYSCTL_SET1_I2C 0x00001000 // I2C module +#endif +#define SYSCTL_SET1_QEI1 0x00000200 // QEI module 1 +#define SYSCTL_SET1_QEI0 0x00000100 // QEI module 0 +#ifndef DEPRECATED +#define SYSCTL_SET1_QEI 0x00000100 // QEI module +#endif +#define SYSCTL_SET1_SSI1 0x00000020 // SSI module 1 +#define SYSCTL_SET1_SSI0 0x00000010 // SSI module 0 +#ifndef DEPRECATED +#define SYSCTL_SET1_SSI 0x00000010 // SSI module +#endif +#define SYSCTL_SET1_UART2 0x00000004 // UART module 2 +#define SYSCTL_SET1_UART1 0x00000002 // UART module 1 +#define SYSCTL_SET1_UART0 0x00000001 // UART module 0 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR2, SYSCTL_RCGC2, +// SYSCTL_SCGC2, and SYSCTL_DCGC2 registers. +// +//***************************************************************************** +#define SYSCTL_SET2_ETH 0x50000000 // ETH module +#define SYSCTL_SET2_GPIOH 0x00000080 // GPIO H module +#define SYSCTL_SET2_GPIOG 0x00000040 // GPIO G module +#define SYSCTL_SET2_GPIOF 0x00000020 // GPIO F module +#define SYSCTL_SET2_GPIOE 0x00000010 // GPIO E module +#define SYSCTL_SET2_GPIOD 0x00000008 // GPIO D module +#define SYSCTL_SET2_GPIOC 0x00000004 // GPIO C module +#define SYSCTL_SET2_GPIOB 0x00000002 // GPIO B module +#define SYSCTL_SET2_GPIOA 0x00000001 // GIPO A module + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RIS, SYSCTL_IMC, and +// SYSCTL_IMS registers. +// +//***************************************************************************** +#define SYSCTL_INT_PLL_LOCK 0x00000040 // PLL lock interrupt +#define SYSCTL_INT_CUR_LIMIT 0x00000020 // Current limit interrupt +#define SYSCTL_INT_IOSC_FAIL 0x00000010 // Internal oscillator failure int +#define SYSCTL_INT_MOSC_FAIL 0x00000008 // Main oscillator failure int +#define SYSCTL_INT_POR 0x00000004 // Power on reset interrupt +#define SYSCTL_INT_BOR 0x00000002 // Brown out interrupt +#define SYSCTL_INT_PLL_FAIL 0x00000001 // PLL failure interrupt + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RESC register. +// +//***************************************************************************** +#define SYSCTL_RESC_LDO 0x00000020 // LDO power OK lost reset +#define SYSCTL_RESC_SW 0x00000010 // Software reset +#define SYSCTL_RESC_WDOG 0x00000008 // Watchdog reset +#define SYSCTL_RESC_BOR 0x00000004 // Brown-out reset +#define SYSCTL_RESC_POR 0x00000002 // Power on reset +#define SYSCTL_RESC_EXT 0x00000001 // External reset + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RCC register. +// +//***************************************************************************** +#define SYSCTL_RCC_ACG 0x08000000 // Automatic clock gating +#define SYSCTL_RCC_SYSDIV_MASK 0x07800000 // System clock divider +#define SYSCTL_RCC_SYSDIV_2 0x00800000 // System clock /2 +#define SYSCTL_RCC_SYSDIV_3 0x01000000 // System clock /3 +#define SYSCTL_RCC_SYSDIV_4 0x01800000 // System clock /4 +#define SYSCTL_RCC_SYSDIV_5 0x02000000 // System clock /5 +#define SYSCTL_RCC_SYSDIV_6 0x02800000 // System clock /6 +#define SYSCTL_RCC_SYSDIV_7 0x03000000 // System clock /7 +#define SYSCTL_RCC_SYSDIV_8 0x03800000 // System clock /8 +#define SYSCTL_RCC_SYSDIV_9 0x04000000 // System clock /9 +#define SYSCTL_RCC_SYSDIV_10 0x04800000 // System clock /10 +#define SYSCTL_RCC_SYSDIV_11 0x05000000 // System clock /11 +#define SYSCTL_RCC_SYSDIV_12 0x05800000 // System clock /12 +#define SYSCTL_RCC_SYSDIV_13 0x06000000 // System clock /13 +#define SYSCTL_RCC_SYSDIV_14 0x06800000 // System clock /14 +#define SYSCTL_RCC_SYSDIV_15 0x07000000 // System clock /15 +#define SYSCTL_RCC_SYSDIV_16 0x07800000 // System clock /16 +#define SYSCTL_RCC_USE_SYSDIV 0x00400000 // Use sytem clock divider +#define SYSCTL_RCC_USE_PWMDIV 0x00100000 // Use PWM clock divider +#define SYSCTL_RCC_PWMDIV_MASK 0x000E0000 // PWM clock divider +#define SYSCTL_RCC_PWMDIV_2 0x00000000 // PWM clock /2 +#define SYSCTL_RCC_PWMDIV_4 0x00020000 // PWM clock /4 +#define SYSCTL_RCC_PWMDIV_8 0x00040000 // PWM clock /8 +#define SYSCTL_RCC_PWMDIV_16 0x00060000 // PWM clock /16 +#define SYSCTL_RCC_PWMDIV_32 0x00080000 // PWM clock /32 +#define SYSCTL_RCC_PWMDIV_64 0x000A0000 // PWM clock /64 +#define SYSCTL_RCC_PWRDN 0x00002000 // PLL power down +#define SYSCTL_RCC_OE 0x00001000 // PLL output enable +#define SYSCTL_RCC_BYPASS 0x00000800 // PLL bypass +#define SYSCTL_RCC_PLLVER 0x00000400 // PLL verification timer enable +#define SYSCTL_RCC_XTAL_MASK 0x000003C0 // Crystal attached to main osc +#define SYSCTL_RCC_XTAL_3_57MHZ 0x00000100 // Using a 3.579545MHz crystal +#define SYSCTL_RCC_XTAL_3_68MHz 0x00000140 // Using a 3.6864MHz crystal +#define SYSCTL_RCC_XTAL_4MHz 0x00000180 // Using a 4MHz crystal +#define SYSCTL_RCC_XTAL_4_09MHZ 0x000001C0 // Using a 4.096MHz crystal +#define SYSCTL_RCC_XTAL_4_91MHZ 0x00000200 // Using a 4.9152MHz crystal +#define SYSCTL_RCC_XTAL_5MHZ 0x00000240 // Using a 5MHz crystal +#define SYSCTL_RCC_XTAL_5_12MHZ 0x00000280 // Using a 5.12MHz crystal +#define SYSCTL_RCC_XTAL_6MHZ 0x000002C0 // Using a 6MHz crystal +#define SYSCTL_RCC_XTAL_6_14MHZ 0x00000300 // Using a 6.144MHz crystal +#define SYSCTL_RCC_XTAL_7_37MHZ 0x00000340 // Using a 7.3728MHz crystal +#define SYSCTL_RCC_XTAL_8MHZ 0x00000380 // Using a 8MHz crystal +#define SYSCTL_RCC_XTAL_8_19MHZ 0x000003C0 // Using a 8.192MHz crystal +#define SYSCTL_RCC_OSCSRC_MASK 0x00000030 // Oscillator input select +#define SYSCTL_RCC_OSCSRC_MAIN 0x00000000 // Use the main oscillator +#define SYSCTL_RCC_OSCSRC_INT 0x00000010 // Use the internal oscillator +#define SYSCTL_RCC_OSCSRC_INT4 0x00000020 // Use the internal oscillator / 4 +#define SYSCTL_RCC_IOSCVER 0x00000008 // Int. osc. verification timer en +#define SYSCTL_RCC_MOSCVER 0x00000004 // Main osc. verification timer en +#define SYSCTL_RCC_IOSCDIS 0x00000002 // Internal oscillator disable +#define SYSCTL_RCC_MOSCDIS 0x00000001 // Main oscillator disable +#define SYSCTL_RCC_SYSDIV_SHIFT 23 // Shift to the SYSDIV field +#define SYSCTL_RCC_PWMDIV_SHIFT 17 // Shift to the PWMDIV field +#define SYSCTL_RCC_XTAL_SHIFT 6 // Shift to the XTAL field +#define SYSCTL_RCC_OSCSRC_SHIFT 4 // Shift to the OSCSRC field + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_PLLCFG register. +// +//***************************************************************************** +#define SYSCTL_PLLCFG_OD_MASK 0x0000C000 // Output divider +#define SYSCTL_PLLCFG_OD_1 0x00000000 // Output divider is 1 +#define SYSCTL_PLLCFG_OD_2 0x00004000 // Output divider is 2 +#define SYSCTL_PLLCFG_OD_4 0x00008000 // Output divider is 4 +#define SYSCTL_PLLCFG_F_MASK 0x00003FE0 // PLL multiplier +#define SYSCTL_PLLCFG_R_MASK 0x0000001F // Input predivider +#define SYSCTL_PLLCFG_F_SHIFT 5 +#define SYSCTL_PLLCFG_R_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RCC2 register. +// +//***************************************************************************** +#define SYSCTL_RCC2_USERCC2 0x80000000 // Use RCC2 +#define SYSCTL_RCC2_SYSDIV2_MSK 0x1F800000 // System clock divider +#define SYSCTL_RCC2_SYSDIV2_2 0x00800000 // System clock /2 +#define SYSCTL_RCC2_SYSDIV2_3 0x01000000 // System clock /3 +#define SYSCTL_RCC2_SYSDIV2_4 0x01800000 // System clock /4 +#define SYSCTL_RCC2_SYSDIV2_5 0x02000000 // System clock /5 +#define SYSCTL_RCC2_SYSDIV2_6 0x02800000 // System clock /6 +#define SYSCTL_RCC2_SYSDIV2_7 0x03000000 // System clock /7 +#define SYSCTL_RCC2_SYSDIV2_8 0x03800000 // System clock /8 +#define SYSCTL_RCC2_SYSDIV2_9 0x04000000 // System clock /9 +#define SYSCTL_RCC2_SYSDIV2_10 0x04800000 // System clock /10 +#define SYSCTL_RCC2_SYSDIV2_11 0x05000000 // System clock /11 +#define SYSCTL_RCC2_SYSDIV2_12 0x05800000 // System clock /12 +#define SYSCTL_RCC2_SYSDIV2_13 0x06000000 // System clock /13 +#define SYSCTL_RCC2_SYSDIV2_14 0x06800000 // System clock /14 +#define SYSCTL_RCC2_SYSDIV2_15 0x07000000 // System clock /15 +#define SYSCTL_RCC2_SYSDIV2_16 0x07800000 // System clock /16 +#define SYSCTL_RCC2_SYSDIV2_17 0x08000000 // System clock /17 +#define SYSCTL_RCC2_SYSDIV2_18 0x08800000 // System clock /18 +#define SYSCTL_RCC2_SYSDIV2_19 0x09000000 // System clock /19 +#define SYSCTL_RCC2_SYSDIV2_20 0x09800000 // System clock /20 +#define SYSCTL_RCC2_SYSDIV2_21 0x0A000000 // System clock /21 +#define SYSCTL_RCC2_SYSDIV2_22 0x0A800000 // System clock /22 +#define SYSCTL_RCC2_SYSDIV2_23 0x0B000000 // System clock /23 +#define SYSCTL_RCC2_SYSDIV2_24 0x0B800000 // System clock /24 +#define SYSCTL_RCC2_SYSDIV2_25 0x0C000000 // System clock /25 +#define SYSCTL_RCC2_SYSDIV2_26 0x0C800000 // System clock /26 +#define SYSCTL_RCC2_SYSDIV2_27 0x0D000000 // System clock /27 +#define SYSCTL_RCC2_SYSDIV2_28 0x0D800000 // System clock /28 +#define SYSCTL_RCC2_SYSDIV2_29 0x0E000000 // System clock /29 +#define SYSCTL_RCC2_SYSDIV2_30 0x0E800000 // System clock /30 +#define SYSCTL_RCC2_SYSDIV2_31 0x0F000000 // System clock /31 +#define SYSCTL_RCC2_SYSDIV2_32 0x0F800000 // System clock /32 +#define SYSCTL_RCC2_SYSDIV2_33 0x10000000 // System clock /33 +#define SYSCTL_RCC2_SYSDIV2_34 0x10800000 // System clock /34 +#define SYSCTL_RCC2_SYSDIV2_35 0x11000000 // System clock /35 +#define SYSCTL_RCC2_SYSDIV2_36 0x11800000 // System clock /36 +#define SYSCTL_RCC2_SYSDIV2_37 0x12000000 // System clock /37 +#define SYSCTL_RCC2_SYSDIV2_38 0x12800000 // System clock /38 +#define SYSCTL_RCC2_SYSDIV2_39 0x13000000 // System clock /39 +#define SYSCTL_RCC2_SYSDIV2_40 0x13800000 // System clock /40 +#define SYSCTL_RCC2_SYSDIV2_41 0x14000000 // System clock /41 +#define SYSCTL_RCC2_SYSDIV2_42 0x14800000 // System clock /42 +#define SYSCTL_RCC2_SYSDIV2_43 0x15000000 // System clock /43 +#define SYSCTL_RCC2_SYSDIV2_44 0x15800000 // System clock /44 +#define SYSCTL_RCC2_SYSDIV2_45 0x16000000 // System clock /45 +#define SYSCTL_RCC2_SYSDIV2_46 0x16800000 // System clock /46 +#define SYSCTL_RCC2_SYSDIV2_47 0x17000000 // System clock /47 +#define SYSCTL_RCC2_SYSDIV2_48 0x17800000 // System clock /48 +#define SYSCTL_RCC2_SYSDIV2_49 0x18000000 // System clock /49 +#define SYSCTL_RCC2_SYSDIV2_50 0x18800000 // System clock /50 +#define SYSCTL_RCC2_SYSDIV2_51 0x19000000 // System clock /51 +#define SYSCTL_RCC2_SYSDIV2_52 0x19800000 // System clock /52 +#define SYSCTL_RCC2_SYSDIV2_53 0x1A000000 // System clock /53 +#define SYSCTL_RCC2_SYSDIV2_54 0x1A800000 // System clock /54 +#define SYSCTL_RCC2_SYSDIV2_55 0x1B000000 // System clock /55 +#define SYSCTL_RCC2_SYSDIV2_56 0x1B800000 // System clock /56 +#define SYSCTL_RCC2_SYSDIV2_57 0x1C000000 // System clock /57 +#define SYSCTL_RCC2_SYSDIV2_58 0x1C800000 // System clock /58 +#define SYSCTL_RCC2_SYSDIV2_59 0x1D000000 // System clock /59 +#define SYSCTL_RCC2_SYSDIV2_60 0x1D800000 // System clock /60 +#define SYSCTL_RCC2_SYSDIV2_61 0x1E000000 // System clock /61 +#define SYSCTL_RCC2_SYSDIV2_62 0x1E800000 // System clock /62 +#define SYSCTL_RCC2_SYSDIV2_63 0x1F000000 // System clock /63 +#define SYSCTL_RCC2_SYSDIV2_64 0x1F800000 // System clock /64 +#define SYSCTL_RCC2_PWRDN2 0x00002000 // PLL power down +#define SYSCTL_RCC2_BYPASS2 0x00000800 // PLL bypass +#define SYSCTL_RCC2_OSCSRC2_MSK 0x00000070 // Oscillator input select +#define SYSCTL_RCC2_OSCSRC2_MO 0x00000000 // Use the main oscillator +#define SYSCTL_RCC2_OSCSRC2_IO 0x00000010 // Use the internal oscillator +#define SYSCTL_RCC2_OSCSRC2_IO4 0x00000020 // Use the internal oscillator / 4 +#define SYSCTL_RCC2_OSCSRC2_30 0x00000030 // Use the 30 KHz internal osc. +#define SYSCTL_RCC2_OSCSRC2_32 0x00000070 // Use the 32 KHz external osc. + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DSLPCLKCFG register. +// +//***************************************************************************** +#define SYSCTL_DSLPCLKCFG_D_MSK 0x1f800000 // Deep sleep system clock override +#define SYSCTL_DSLPCLKCFG_D_2 0x00800000 // System clock /2 +#define SYSCTL_DSLPCLKCFG_D_3 0x01000000 // System clock /3 +#define SYSCTL_DSLPCLKCFG_D_4 0x01800000 // System clock /4 +#define SYSCTL_DSLPCLKCFG_D_5 0x02000000 // System clock /5 +#define SYSCTL_DSLPCLKCFG_D_6 0x02800000 // System clock /6 +#define SYSCTL_DSLPCLKCFG_D_7 0x03000000 // System clock /7 +#define SYSCTL_DSLPCLKCFG_D_8 0x03800000 // System clock /8 +#define SYSCTL_DSLPCLKCFG_D_9 0x04000000 // System clock /9 +#define SYSCTL_DSLPCLKCFG_D_10 0x04800000 // System clock /10 +#define SYSCTL_DSLPCLKCFG_D_11 0x05000000 // System clock /11 +#define SYSCTL_DSLPCLKCFG_D_12 0x05800000 // System clock /12 +#define SYSCTL_DSLPCLKCFG_D_13 0x06000000 // System clock /13 +#define SYSCTL_DSLPCLKCFG_D_14 0x06800000 // System clock /14 +#define SYSCTL_DSLPCLKCFG_D_15 0x07000000 // System clock /15 +#define SYSCTL_DSLPCLKCFG_D_16 0x07800000 // System clock /16 +#define SYSCTL_DSLPCLKCFG_D_17 0x08000000 // System clock /17 +#define SYSCTL_DSLPCLKCFG_D_18 0x08800000 // System clock /18 +#define SYSCTL_DSLPCLKCFG_D_19 0x09000000 // System clock /19 +#define SYSCTL_DSLPCLKCFG_D_20 0x09800000 // System clock /20 +#define SYSCTL_DSLPCLKCFG_D_21 0x0A000000 // System clock /21 +#define SYSCTL_DSLPCLKCFG_D_22 0x0A800000 // System clock /22 +#define SYSCTL_DSLPCLKCFG_D_23 0x0B000000 // System clock /23 +#define SYSCTL_DSLPCLKCFG_D_24 0x0B800000 // System clock /24 +#define SYSCTL_DSLPCLKCFG_D_25 0x0C000000 // System clock /25 +#define SYSCTL_DSLPCLKCFG_D_26 0x0C800000 // System clock /26 +#define SYSCTL_DSLPCLKCFG_D_27 0x0D000000 // System clock /27 +#define SYSCTL_DSLPCLKCFG_D_28 0x0D800000 // System clock /28 +#define SYSCTL_DSLPCLKCFG_D_29 0x0E000000 // System clock /29 +#define SYSCTL_DSLPCLKCFG_D_30 0x0E800000 // System clock /30 +#define SYSCTL_DSLPCLKCFG_D_31 0x0F000000 // System clock /31 +#define SYSCTL_DSLPCLKCFG_D_32 0x0F800000 // System clock /32 +#define SYSCTL_DSLPCLKCFG_D_33 0x10000000 // System clock /33 +#define SYSCTL_DSLPCLKCFG_D_34 0x10800000 // System clock /34 +#define SYSCTL_DSLPCLKCFG_D_35 0x11000000 // System clock /35 +#define SYSCTL_DSLPCLKCFG_D_36 0x11800000 // System clock /36 +#define SYSCTL_DSLPCLKCFG_D_37 0x12000000 // System clock /37 +#define SYSCTL_DSLPCLKCFG_D_38 0x12800000 // System clock /38 +#define SYSCTL_DSLPCLKCFG_D_39 0x13000000 // System clock /39 +#define SYSCTL_DSLPCLKCFG_D_40 0x13800000 // System clock /40 +#define SYSCTL_DSLPCLKCFG_D_41 0x14000000 // System clock /41 +#define SYSCTL_DSLPCLKCFG_D_42 0x14800000 // System clock /42 +#define SYSCTL_DSLPCLKCFG_D_43 0x15000000 // System clock /43 +#define SYSCTL_DSLPCLKCFG_D_44 0x15800000 // System clock /44 +#define SYSCTL_DSLPCLKCFG_D_45 0x16000000 // System clock /45 +#define SYSCTL_DSLPCLKCFG_D_46 0x16800000 // System clock /46 +#define SYSCTL_DSLPCLKCFG_D_47 0x17000000 // System clock /47 +#define SYSCTL_DSLPCLKCFG_D_48 0x17800000 // System clock /48 +#define SYSCTL_DSLPCLKCFG_D_49 0x18000000 // System clock /49 +#define SYSCTL_DSLPCLKCFG_D_50 0x18800000 // System clock /50 +#define SYSCTL_DSLPCLKCFG_D_51 0x19000000 // System clock /51 +#define SYSCTL_DSLPCLKCFG_D_52 0x19800000 // System clock /52 +#define SYSCTL_DSLPCLKCFG_D_53 0x1A000000 // System clock /53 +#define SYSCTL_DSLPCLKCFG_D_54 0x1A800000 // System clock /54 +#define SYSCTL_DSLPCLKCFG_D_55 0x1B000000 // System clock /55 +#define SYSCTL_DSLPCLKCFG_D_56 0x1B800000 // System clock /56 +#define SYSCTL_DSLPCLKCFG_D_57 0x1C000000 // System clock /57 +#define SYSCTL_DSLPCLKCFG_D_58 0x1C800000 // System clock /58 +#define SYSCTL_DSLPCLKCFG_D_59 0x1D000000 // System clock /59 +#define SYSCTL_DSLPCLKCFG_D_60 0x1D800000 // System clock /60 +#define SYSCTL_DSLPCLKCFG_D_61 0x1E000000 // System clock /61 +#define SYSCTL_DSLPCLKCFG_D_62 0x1E800000 // System clock /62 +#define SYSCTL_DSLPCLKCFG_D_63 0x1F000000 // System clock /63 +#define SYSCTL_DSLPCLKCFG_D_64 0x1F800000 // System clock /64 +#define SYSCTL_DSLPCLKCFG_O_MSK 0x00000070 // Deep sleep oscillator override +#define SYSCTL_DSLPCLKCFG_O_IGN 0x00000000 // Do not override +#define SYSCTL_DSLPCLKCFG_O_IO 0x00000010 // Use the internal oscillator +#define SYSCTL_DSLPCLKCFG_O_30 0x00000030 // Use the 30 KHz internal osc. +#define SYSCTL_DSLPCLKCFG_O_32 0x00000070 // Use the 32 KHz external osc. + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_CLKVCLR register. +// +//***************************************************************************** +#define SYSCTL_CLKVCLR_CLR 0x00000001 // Clear clock verification fault + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_LDOARST register. +// +//***************************************************************************** +#define SYSCTL_LDOARST_ARST 0x00000001 // Allow LDO to reset device + +#endif // __HW_SYSCTL_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_timer.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_timer.h new file mode 100644 index 000000000..eb58abf65 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_timer.h @@ -0,0 +1,235 @@ +//***************************************************************************** +// +// hw_timer.h - Defines and macros used when accessing the timer. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_TIMER_H__ +#define __HW_TIMER_H__ + +//***************************************************************************** +// +// The following define the offsets of the timer registers. +// +//***************************************************************************** +#define TIMER_O_CFG 0x00000000 // Configuration register +#define TIMER_O_TAMR 0x00000004 // TimerA mode register +#define TIMER_O_TBMR 0x00000008 // TimerB mode register +#define TIMER_O_CTL 0x0000000C // Control register +#define TIMER_O_IMR 0x00000018 // Interrupt mask register +#define TIMER_O_RIS 0x0000001C // Interrupt status register +#define TIMER_O_MIS 0x00000020 // Masked interrupt status reg. +#define TIMER_O_ICR 0x00000024 // Interrupt clear register +#define TIMER_O_TAILR 0x00000028 // TimerA interval load register +#define TIMER_O_TBILR 0x0000002C // TimerB interval load register +#define TIMER_O_TAMATCHR 0x00000030 // TimerA match register +#define TIMER_O_TBMATCHR 0x00000034 // TimerB match register +#define TIMER_O_TAPR 0x00000038 // TimerA prescale register +#define TIMER_O_TBPR 0x0000003C // TimerB prescale register +#define TIMER_O_TAPMR 0x00000040 // TimerA prescale match register +#define TIMER_O_TBPMR 0x00000044 // TimerB prescale match register +#define TIMER_O_TAR 0x00000048 // TimerA register +#define TIMER_O_TBR 0x0000004C // TimerB register + +//***************************************************************************** +// +// The following define the reset values of the timer registers. +// +//***************************************************************************** +#define TIMER_RV_CFG 0x00000000 // Configuration register RV +#define TIMER_RV_TAMR 0x00000000 // TimerA mode register RV +#define TIMER_RV_TBMR 0x00000000 // TimerB mode register RV +#define TIMER_RV_CTL 0x00000000 // Control register RV +#define TIMER_RV_IMR 0x00000000 // Interrupt mask register RV +#define TIMER_RV_RIS 0x00000000 // Interrupt status register RV +#define TIMER_RV_MIS 0x00000000 // Masked interrupt status reg RV +#define TIMER_RV_ICR 0x00000000 // Interrupt clear register RV +#define TIMER_RV_TAILR 0xFFFFFFFF // TimerA interval load reg RV +#define TIMER_RV_TBILR 0x0000FFFF // TimerB interval load reg RV +#define TIMER_RV_TAMATCHR 0xFFFFFFFF // TimerA match register RV +#define TIMER_RV_TBMATCHR 0x0000FFFF // TimerB match register RV +#define TIMER_RV_TAPR 0x00000000 // TimerA prescale register RV +#define TIMER_RV_TBPR 0x00000000 // TimerB prescale register RV +#define TIMER_RV_TAPMR 0x00000000 // TimerA prescale match reg RV +#define TIMER_RV_TBPMR 0x00000000 // TimerB prescale match regi RV +#define TIMER_RV_TAR 0xFFFFFFFF // TimerA register RV +#define TIMER_RV_TBR 0x0000FFFF // TimerB register RV + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_CFG register. +// +//***************************************************************************** +#define TIMER_CFG_CFG_MSK 0x00000007 // Configuration options mask +#define TIMER_CFG_16_BIT 0x00000004 // Two 16 bit timers +#define TIMER_CFG_32_BIT_RTC 0x00000001 // 32 bit RTC +#define TIMER_CFG_32_BIT_TIMER 0x00000000 // 32 bit timer + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TnMR register. +// +//***************************************************************************** +#define TIMER_TNMR_TNAMS 0x00000008 // Alternate mode select +#define TIMER_TNMR_TNCMR 0x00000004 // Capture mode - count or time +#define TIMER_TNMR_TNTMR_MSK 0x00000003 // Timer mode mask +#define TIMER_TNMR_TNTMR_CAP 0x00000003 // Mode - capture +#define TIMER_TNMR_TNTMR_PERIOD 0x00000002 // Mode - periodic +#define TIMER_TNMR_TNTMR_1_SHOT 0x00000001 // Mode - one shot + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_CTL register. +// +//***************************************************************************** +#define TIMER_CTL_TBPWML 0x00004000 // TimerB PWM output level invert +#define TIMER_CTL_TBOTE 0x00002000 // TimerB output trigger enable +#define TIMER_CTL_TBEVENT_MSK 0x00000C00 // TimerB event mode mask +#define TIMER_CTL_TBEVENT_BOTH 0x00000C00 // TimerB event mode - both edges +#define TIMER_CTL_TBEVENT_NEG 0x00000400 // TimerB event mode - neg edge +#define TIMER_CTL_TBEVENT_POS 0x00000000 // TimerB event mode - pos edge +#define TIMER_CTL_TBSTALL 0x00000200 // TimerB stall enable +#define TIMER_CTL_TBEN 0x00000100 // TimerB enable +#define TIMER_CTL_TAPWML 0x00000040 // TimerA PWM output level invert +#define TIMER_CTL_TAOTE 0x00000020 // TimerA output trigger enable +#define TIMER_CTL_RTCEN 0x00000010 // RTC counter enable +#define TIMER_CTL_TAEVENT_MSK 0x0000000C // TimerA event mode mask +#define TIMER_CTL_TAEVENT_BOTH 0x0000000C // TimerA event mode - both edges +#define TIMER_CTL_TAEVENT_NEG 0x00000004 // TimerA event mode - neg edge +#define TIMER_CTL_TAEVENT_POS 0x00000000 // TimerA event mode - pos edge +#define TIMER_CTL_TASTALL 0x00000002 // TimerA stall enable +#define TIMER_CTL_TAEN 0x00000001 // TimerA enable + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_IMR register. +// +//***************************************************************************** +#define TIMER_IMR_CBEIM 0x00000400 // CaptureB event interrupt mask +#define TIMER_IMR_CBMIM 0x00000200 // CaptureB match interrupt mask +#define TIMER_IMR_TBTOIM 0x00000100 // TimerB time out interrupt mask +#define TIMER_IMR_RTCIM 0x00000008 // RTC interrupt mask +#define TIMER_IMR_CAEIM 0x00000004 // CaptureA event interrupt mask +#define TIMER_IMR_CAMIM 0x00000002 // CaptureA match interrupt mask +#define TIMER_IMR_TATOIM 0x00000001 // TimerA time out interrupt mask + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_RIS register. +// +//***************************************************************************** +#define TIMER_RIS_CBERIS 0x00000400 // CaptureB event raw int status +#define TIMER_RIS_CBMRIS 0x00000200 // CaptureB match raw int status +#define TIMER_RIS_TBTORIS 0x00000100 // TimerB time out raw int status +#define TIMER_RIS_RTCRIS 0x00000008 // RTC raw int status +#define TIMER_RIS_CAERIS 0x00000004 // CaptureA event raw int status +#define TIMER_RIS_CAMRIS 0x00000002 // CaptureA match raw int status +#define TIMER_RIS_TATORIS 0x00000001 // TimerA time out raw int status + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_MIS register. +// +//***************************************************************************** +#define TIMER_RIS_CBEMIS 0x00000400 // CaptureB event masked int status +#define TIMER_RIS_CBMMIS 0x00000200 // CaptureB match masked int status +#define TIMER_RIS_TBTOMIS 0x00000100 // TimerB time out masked int stat +#define TIMER_RIS_RTCMIS 0x00000008 // RTC masked int status +#define TIMER_RIS_CAEMIS 0x00000004 // CaptureA event masked int status +#define TIMER_RIS_CAMMIS 0x00000002 // CaptureA match masked int status +#define TIMER_RIS_TATOMIS 0x00000001 // TimerA time out masked int stat + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_ICR register. +// +//***************************************************************************** +#define TIMER_ICR_CBECINT 0x00000400 // CaptureB event interrupt clear +#define TIMER_ICR_CBMCINT 0x00000200 // CaptureB match interrupt clear +#define TIMER_ICR_TBTOCINT 0x00000100 // TimerB time out interrupt clear +#define TIMER_ICR_RTCCINT 0x00000008 // RTC interrupt clear +#define TIMER_ICR_CAECINT 0x00000004 // CaptureA event interrupt clear +#define TIMER_ICR_CAMCINT 0x00000002 // CaptureA match interrupt clear +#define TIMER_ICR_TATOCINT 0x00000001 // TimerA time out interrupt clear + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TAILR register. +// +//***************************************************************************** +#define TIMER_TAILR_TAILRH 0xFFFF0000 // TimerB load val in 32 bit mode +#define TIMER_TAILR_TAILRL 0x0000FFFF // TimerA interval load value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TBILR register. +// +//***************************************************************************** +#define TIMER_TBILR_TBILRL 0x0000FFFF // TimerB interval load value + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TAMATCHR register. +// +//***************************************************************************** +#define TIMER_TAMATCHR_TAMRH 0xFFFF0000 // TimerB match val in 32 bit mode +#define TIMER_TAMATCHR_TAMRL 0x0000FFFF // TimerA match value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TBMATCHR register. +// +//***************************************************************************** +#define TIMER_TBMATCHR_TBMRL 0x0000FFFF // TimerB match load value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TnPR register. +// +//***************************************************************************** +#define TIMER_TNPR_TNPSR 0x000000FF // TimerN prescale value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TnPMR register. +// +//***************************************************************************** +#define TIMER_TNPMR_TNPSMR 0x000000FF // TimerN prescale match value + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TAR register. +// +//***************************************************************************** +#define TIMER_TAR_TARH 0xFFFF0000 // TimerB val in 32 bit mode +#define TIMER_TAR_TARL 0x0000FFFF // TimerA value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TBR register. +// +//***************************************************************************** +#define TIMER_TBR_TBRL 0x0000FFFF // TimerB value + +#endif // __HW_TIMER_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_types.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_types.h new file mode 100644 index 000000000..974a85594 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_types.h @@ -0,0 +1,129 @@ +//***************************************************************************** +// +// hw_types.h - Common types and macros. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_TYPES_H__ +#define __HW_TYPES_H__ + +//***************************************************************************** +// +// Define a boolean type, and values for true and false. +// +//***************************************************************************** +typedef unsigned char tBoolean; + +#ifndef true +#define true 1 +#endif + +#ifndef false +#define false 0 +#endif + +//***************************************************************************** +// +// Macros for hardware access, both direct and via the bit-band region. +// +//***************************************************************************** +#define HWREG(x) \ + (*((volatile unsigned long *)(x))) +#define HWREGH(x) \ + (*((volatile unsigned short *)(x))) +#define HWREGB(x) \ + (*((volatile unsigned char *)(x))) +#define HWREGBITW(x, b) \ + HWREG(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) +#define HWREGBITH(x, b) \ + HWREGH(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) +#define HWREGBITB(x, b) \ + HWREGB(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) + +//***************************************************************************** +// +// Helper Macros for determining silicon revisions, etc. +// +// These macros will be used by Driverlib at "run-time" to create necessary +// conditional code blocks that will allow a single version of the Driverlib +// "binary" code to support multiple(all) Stellaris silicon revisions. +// +// It is expected that these macros will be used inside of a standard 'C' +// conditional block of code, e.g. +// +// if(DEVICE_IS_SANDSTORM()) +// { +// do some Sandstorm specific code here. +// } +// +// By default, these macros will be defined as run-time checks of the +// appropriate register(s) to allow creation of run-time conditional code +// blocks for a common DriverLib across the entire Stellaris family. +// +// However, if code-space optimization is required, these macros can be "hard- +// coded" for a specific version of Stellaris silicon. Many compilers will +// then detect the "hard-coded" conditionals, and appropriately optimize the +// code blocks, eliminating any "unreachable" code. This would result in +// a smaller Driverlib, thus producing a smaller final application size, but +// at the cost of limiting the Driverlib binary to a specific Stellaris +// silicon revision. +// +//***************************************************************************** +#ifndef DEVICE_IS_SANDSTORM +#define DEVICE_IS_SANDSTORM \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_VER_MASK) == SYSCTL_DID0_VER_0) || \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_VER_MASK) == SYSCTL_DID0_VER_1) && \ + ((HWREG(SYSCTL_DID0) & SYSCTL_DID0_CLASS_MASK) == \ + SYSCTL_DID0_CLASS_SANDSTORM))) +#endif + +#ifndef DEVICE_IS_FURY +#define DEVICE_IS_FURY \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_VER_MASK) == SYSCTL_DID0_VER_1) && \ + ((HWREG(SYSCTL_DID0) & SYSCTL_DID0_CLASS_MASK) == \ + SYSCTL_DID0_CLASS_FURY)) +#endif + +#ifndef DEVICE_IS_REVA2 +#define DEVICE_IS_REVA2 \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MAJ_MASK) == SYSCTL_DID0_MAJ_A) && \ + ((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MIN_MASK) == SYSCTL_DID0_MIN_2)) +#endif + +#ifndef DEVICE_IS_REVC1 +#define DEVICE_IS_REVC1 \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MAJ_MASK) == SYSCTL_DID0_MAJ_C) && \ + ((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MIN_MASK) == SYSCTL_DID0_MIN_1)) +#endif + +#ifndef DEVICE_IS_REVC2 +#define DEVICE_IS_REVC2 \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MAJ_MASK) == SYSCTL_DID0_MAJ_C) && \ + ((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MIN_MASK) == SYSCTL_DID0_MIN_2)) +#endif + +#endif // __HW_TYPES_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_uart.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_uart.h new file mode 100644 index 000000000..e5bb1c47e --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_uart.h @@ -0,0 +1,241 @@ +//***************************************************************************** +// +// hw_uart.h - Macros and defines used when accessing the UART hardware +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_UART_H__ +#define __HW_UART_H__ + +//***************************************************************************** +// +// UART Register Offsets. +// +//***************************************************************************** +#define UART_O_DR 0x00000000 // Data Register +#define UART_O_RSR 0x00000004 // Receive Status Register (read) +#define UART_O_ECR 0x00000004 // Error Clear Register (write) +#define UART_O_FR 0x00000018 // Flag Register (read only) +#define UART_O_IBRD 0x00000024 // Integer Baud Rate Divisor Reg +#define UART_O_FBRD 0x00000028 // Fractional Baud Rate Divisor Reg +#define UART_O_LCR_H 0x0000002C // Line Control Register, HIGH byte +#define UART_O_CTL 0x00000030 // Control Register +#define UART_O_IFLS 0x00000034 // Interrupt FIFO Level Select Reg +#define UART_O_IM 0x00000038 // Interrupt Mask Set/Clear Reg +#define UART_O_RIS 0x0000003C // Raw Interrupt Status Register +#define UART_O_MIS 0x00000040 // Masked Interrupt Status Register +#define UART_O_ICR 0x00000044 // Interrupt Clear Register +#define UART_O_PeriphID4 0x00000FD0 // +#define UART_O_PeriphID5 0x00000FD4 // +#define UART_O_PeriphID6 0x00000FD8 // +#define UART_O_PeriphID7 0x00000FDC // +#define UART_O_PeriphID0 0x00000FE0 // +#define UART_O_PeriphID1 0x00000FE4 // +#define UART_O_PeriphID2 0x00000FE8 // +#define UART_O_PeriphID3 0x00000FEC // +#define UART_O_PCellID0 0x00000FF0 // +#define UART_O_PCellID1 0x00000FF4 // +#define UART_O_PCellID2 0x00000FF8 // +#define UART_O_PCellID3 0x00000FFC // + +//***************************************************************************** +// +// Data Register bits +// +//***************************************************************************** +#define UART_DR_OE 0x00000800 // Overrun Error +#define UART_DR_BE 0x00000400 // Break Error +#define UART_DR_PE 0x00000200 // Parity Error +#define UART_DR_FE 0x00000100 // Framing Error +#define UART_DR_DATA_MASK 0x000000FF // UART data + +//***************************************************************************** +// +// Receive Status Register bits +// +//***************************************************************************** +#define UART_RSR_OE 0x00000008 // Overrun Error +#define UART_RSR_BE 0x00000004 // Break Error +#define UART_RSR_PE 0x00000002 // Parity Error +#define UART_RSR_FE 0x00000001 // Framing Error + +//***************************************************************************** +// +// Flag Register bits +// +//***************************************************************************** +#define UART_FR_TXFE 0x00000080 // TX FIFO Empty +#define UART_FR_RXFF 0x00000040 // RX FIFO Full +#define UART_FR_TXFF 0x00000020 // TX FIFO Full +#define UART_FR_RXFE 0x00000010 // RX FIFO Empty +#define UART_FR_BUSY 0x00000008 // UART Busy + +//***************************************************************************** +// +// Integer baud-rate divisor +// +//***************************************************************************** +#define UART_IBRD_DIVINT_MASK 0x0000FFFF // Integer baud-rate divisor + +//***************************************************************************** +// +// Fractional baud-rate divisor +// +//***************************************************************************** +#define UART_FBRD_DIVFRAC_MASK 0x0000003F // Fractional baud-rate divisor + +//***************************************************************************** +// +// Line Control Register High bits +// +//***************************************************************************** +#define UART_LCR_H_SPS 0x00000080 // Stick Parity Select +#define UART_LCR_H_WLEN 0x00000060 // Word length +#define UART_LCR_H_WLEN_8 0x00000060 // 8 bit data +#define UART_LCR_H_WLEN_7 0x00000040 // 7 bit data +#define UART_LCR_H_WLEN_6 0x00000020 // 6 bit data +#define UART_LCR_H_WLEN_5 0x00000000 // 5 bit data +#define UART_LCR_H_FEN 0x00000010 // Enable FIFO +#define UART_LCR_H_STP2 0x00000008 // Two Stop Bits Select +#define UART_LCR_H_EPS 0x00000004 // Even Parity Select +#define UART_LCR_H_PEN 0x00000002 // Parity Enable +#define UART_LCR_H_BRK 0x00000001 // Send Break + +//***************************************************************************** +// +// Control Register bits +// +//***************************************************************************** +#define UART_CTL_RXE 0x00000200 // Receive Enable +#define UART_CTL_TXE 0x00000100 // Transmit Enable +#define UART_CTL_LBE 0x00000080 // Loopback Enable +#define UART_CTL_SIRLP 0x00000004 // SIR (IrDA) Low Power Enable +#define UART_CTL_SIREN 0x00000002 // SIR (IrDA) Enable +#define UART_CTL_UARTEN 0x00000001 // UART Enable + +//***************************************************************************** +// +// Interrupt FIFO Level Select Register bits +// +//***************************************************************************** +#define UART_IFLS_RX1_8 0x00000000 // 1/8 Full +#define UART_IFLS_RX2_8 0x00000010 // 1/4 Full +#define UART_IFLS_RX4_8 0x00000020 // 1/2 Full +#define UART_IFLS_RX6_8 0x00000030 // 3/4 Full +#define UART_IFLS_RX7_8 0x00000040 // 7/8 Full +#define UART_IFLS_TX1_8 0x00000000 // 1/8 Full +#define UART_IFLS_TX2_8 0x00000001 // 1/4 Full +#define UART_IFLS_TX4_8 0x00000002 // 1/2 Full +#define UART_IFLS_TX6_8 0x00000003 // 3/4 Full +#define UART_IFLS_TX7_8 0x00000004 // 7/8 Full + +//***************************************************************************** +// +// Interrupt Mask Set/Clear Register bits +// +//***************************************************************************** +#define UART_IM_OEIM 0x00000400 // Overrun Error Interrupt Mask +#define UART_IM_BEIM 0x00000200 // Break Error Interrupt Mask +#define UART_IM_PEIM 0x00000100 // Parity Error Interrupt Mask +#define UART_IM_FEIM 0x00000080 // Framing Error Interrupt Mask +#define UART_IM_RTIM 0x00000040 // Receive Timeout Interrupt Mask +#define UART_IM_TXIM 0x00000020 // Transmit Interrupt Mask +#define UART_IM_RXIM 0x00000010 // Receive Interrupt Mask + +//***************************************************************************** +// +// Raw Interrupt Status Register +// +//***************************************************************************** +#define UART_RIS_OERIS 0x00000400 // Overrun Error Interrupt Status +#define UART_RIS_BERIS 0x00000200 // Break Error Interrupt Status +#define UART_RIS_PERIS 0x00000100 // Parity Error Interrupt Status +#define UART_RIS_FERIS 0x00000080 // Framing Error Interrupt Status +#define UART_RIS_RTRIS 0x00000040 // Receive Timeout Interrupt Status +#define UART_RIS_TXRIS 0x00000020 // Transmit Interrupt Status +#define UART_RIS_RXRIS 0x00000010 // Receive Interrupt Status + +//***************************************************************************** +// +// Masked Interrupt Status Register +// +//***************************************************************************** +#define UART_MIS_OEMIS 0x00000400 // Overrun Error Interrupt Status +#define UART_MIS_BEMIS 0x00000200 // Break Error Interrupt Status +#define UART_MIS_PEMIS 0x00000100 // Parity Error Interrupt Status +#define UART_MIS_FEMIS 0x00000080 // Framing Error Interrupt Status +#define UART_MIS_RTMIS 0x00000040 // Receive Timeout Interrupt Status +#define UART_MIS_TXMIS 0x00000020 // Transmit Interrupt Status +#define UART_MIS_RXMIS 0x00000010 // Receive Interrupt Status + +//***************************************************************************** +// +// Interrupt Clear Register bits +// +//***************************************************************************** +#define UART_ICR_OEIC 0x00000400 // Overrun Error Interrupt Clear +#define UART_ICR_BEIC 0x00000200 // Break Error Interrupt Clear +#define UART_ICR_PEIC 0x00000100 // Parity Error Interrupt Clear +#define UART_ICR_FEIC 0x00000080 // Framing Error Interrupt Clear +#define UART_ICR_RTIC 0x00000040 // Receive Timeout Interrupt Clear +#define UART_ICR_TXIC 0x00000020 // Transmit Interrupt Clear +#define UART_ICR_RXIC 0x00000010 // Receive Interrupt Clear + +#define UART_RSR_ANY (UART_RSR_OE | \ + UART_RSR_BE | \ + UART_RSR_PE | \ + UART_RSR_FE) + +//***************************************************************************** +// +// Reset Values for UART Registers. +// +//***************************************************************************** +#define UART_RV_DR 0x00000000 +#define UART_RV_RSR 0x00000000 +#define UART_RV_ECR 0x00000000 +#define UART_RV_FR 0x00000090 +#define UART_RV_IBRD 0x00000000 +#define UART_RV_FBRD 0x00000000 +#define UART_RV_LCR_H 0x00000000 +#define UART_RV_CTL 0x00000300 +#define UART_RV_IFLS 0x00000012 +#define UART_RV_IM 0x00000000 +#define UART_RV_RIS 0x00000000 +#define UART_RV_MIS 0x00000000 +#define UART_RV_ICR 0x00000000 +#define UART_RV_PeriphID4 0x00000000 +#define UART_RV_PeriphID5 0x00000000 +#define UART_RV_PeriphID6 0x00000000 +#define UART_RV_PeriphID7 0x00000000 +#define UART_RV_PeriphID0 0x00000011 +#define UART_RV_PeriphID1 0x00000000 +#define UART_RV_PeriphID2 0x00000018 +#define UART_RV_PeriphID3 0x00000001 +#define UART_RV_PCellID0 0x0000000D +#define UART_RV_PCellID1 0x000000F0 +#define UART_RV_PCellID2 0x00000005 +#define UART_RV_PCellID3 0x000000B1 + +#endif // __HW_UART_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_watchdog.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_watchdog.h new file mode 100644 index 000000000..7a3b5a8d9 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/hw_watchdog.h @@ -0,0 +1,116 @@ +//***************************************************************************** +// +// hw_watchdog.h - Macros used when accessing the Watchdog Timer hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_WATCHDOG_H__ +#define __HW_WATCHDOG_H__ + +//***************************************************************************** +// +// The following define the offsets of the Watchdog Timer registers. +// +//***************************************************************************** +#define WDT_O_LOAD 0x00000000 // Load register +#define WDT_O_VALUE 0x00000004 // Current value register +#define WDT_O_CTL 0x00000008 // Control register +#define WDT_O_ICR 0x0000000C // Interrupt clear register +#define WDT_O_RIS 0x00000010 // Raw interrupt status register +#define WDT_O_MIS 0x00000014 // Masked interrupt status register +#define WDT_O_TEST 0x00000418 // Test register +#define WDT_O_LOCK 0x00000C00 // Lock register +#define WDT_O_PeriphID4 0x00000FD0 // +#define WDT_O_PeriphID5 0x00000FD4 // +#define WDT_O_PeriphID6 0x00000FD8 // +#define WDT_O_PeriphID7 0x00000FDC // +#define WDT_O_PeriphID0 0x00000FE0 // +#define WDT_O_PeriphID1 0x00000FE4 // +#define WDT_O_PeriphID2 0x00000FE8 // +#define WDT_O_PeriphID3 0x00000FEC // +#define WDT_O_PCellID0 0x00000FF0 // +#define WDT_O_PCellID1 0x00000FF4 // +#define WDT_O_PCellID2 0x00000FF8 // +#define WDT_O_PCellID3 0x00000FFC // + +//***************************************************************************** +// +// The following define the bit fields in the WDT_CTL register. +// +//***************************************************************************** +#define WDT_CTL_RESEN 0x00000002 // Enable reset output +#define WDT_CTL_INTEN 0x00000001 // Enable the WDT counter and int + +//***************************************************************************** +// +// The following define the bit fields in the WDT_ISR, WDT_RIS, and WDT_MIS +// registers. +// +//***************************************************************************** +#define WDT_INT_TIMEOUT 0x00000001 // Watchdog timer expired + +//***************************************************************************** +// +// The following define the bit fields in the WDT_TEST register. +// +//***************************************************************************** +#define WDT_TEST_STALL 0x00000100 // Watchdog stall enable +#ifndef DEPRECATED +#define WDT_TEST_STALL_EN 0x00000100 // Watchdog stall enable +#endif + +//***************************************************************************** +// +// The following define the bit fields in the WDT_LOCK register. +// +//***************************************************************************** +#define WDT_LOCK_LOCKED 0x00000001 // Watchdog timer is locked +#define WDT_LOCK_UNLOCKED 0x00000000 // Watchdog timer is unlocked +#define WDT_LOCK_UNLOCK 0x1ACCE551 // Unlocks the watchdog timer + +//***************************************************************************** +// +// The following define the reset values for the WDT registers. +// +//***************************************************************************** +#define WDT_RV_LOAD 0xFFFFFFFF // Load register +#define WDT_RV_VALUE 0xFFFFFFFF // Current value register +#define WDT_RV_CTL 0x00000000 // Control register +#define WDT_RV_RIS 0x00000000 // Raw interrupt status register +#define WDT_RV_MIS 0x00000000 // Masked interrupt status register +#define WDT_RV_LOCK 0x00000000 // Lock register +#define WDT_RV_PeriphID4 0x00000000 // +#define WDT_RV_PeriphID5 0x00000000 // +#define WDT_RV_PeriphID6 0x00000000 // +#define WDT_RV_PeriphID7 0x00000000 // +#define WDT_RV_PeriphID0 0x00000005 // +#define WDT_RV_PeriphID1 0x00000018 // +#define WDT_RV_PeriphID2 0x00000018 // +#define WDT_RV_PeriphID3 0x00000001 // +#define WDT_RV_PCellID0 0x0000000D // +#define WDT_RV_PCellID1 0x000000F0 // +#define WDT_RV_PCellID2 0x00000005 // +#define WDT_RV_PCellID3 0x000000B1 // + +#endif // __HW_WATCHDOG_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/i2c.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/i2c.h new file mode 100644 index 000000000..46a28eeb5 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/i2c.h @@ -0,0 +1,137 @@ +//***************************************************************************** +// +// i2c.h - Prototypes for the I2C Driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __I2C_H__ +#define __I2C_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Defines for the API. +// +//***************************************************************************** +//***************************************************************************** +// +// Interrupt defines. +// +//***************************************************************************** +#define I2C_INT_MASTER 0x00000001 +#define I2C_INT_SLAVE 0x00000002 + +//***************************************************************************** +// +// I2C Master commands. +// +//***************************************************************************** +#define I2C_MASTER_CMD_SINGLE_SEND \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_SINGLE_RECEIVE \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_START \ + (I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_CONT \ + (I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_FINISH \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_ERROR_STOP \ + (I2C_MASTER_CS_STOP) +#define I2C_MASTER_CMD_BURST_RECEIVE_START \ + (I2C_MASTER_CS_ACK | I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_RECEIVE_CONT \ + (I2C_MASTER_CS_ACK | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_RECEIVE_FINISH \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_RUN) + +//***************************************************************************** +// +// I2C Master error status. +// +//***************************************************************************** +#define I2C_MASTER_ERR_NONE 0 +#define I2C_MASTER_ERR_ADDR_ACK 0x00000004 +#define I2C_MASTER_ERR_DATA_ACK 0x00000008 +#define I2C_MASTER_ERR_ARB_LOST 0x00000010 + +//***************************************************************************** +// +// I2C Slave action requests +// +//***************************************************************************** +#define I2C_SLAVE_ACT_NONE 0 +#define I2C_SLAVE_ACT_RREQ 0x00000001 // Master has sent data +#define I2C_SLAVE_ACT_TREQ 0x00000002 // Master has requested data + +//***************************************************************************** +// Miscellaneous I2C driver definitions. +//***************************************************************************** +#define I2C_MASTER_MAX_RETRIES 1000 // Number of retries + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void I2CIntRegister(unsigned long ulBase, void(fnHandler)(void)); +extern void I2CIntUnregister(unsigned long ulBase); +extern tBoolean I2CMasterBusBusy(unsigned long ulBase); +extern tBoolean I2CMasterBusy(unsigned long ulBase); +extern void I2CMasterControl(unsigned long ulBase, unsigned long ulCmd); +extern unsigned long I2CMasterDataGet(unsigned long ulBase); +extern void I2CMasterDataPut(unsigned long ulBase, unsigned char ucData); +extern void I2CMasterDisable(unsigned long ulBase); +extern void I2CMasterEnable(unsigned long ulBase); +extern unsigned long I2CMasterErr(unsigned long ulBase); +extern void I2CMasterInit(unsigned long ulBase, tBoolean bFast); +extern void I2CMasterIntClear(unsigned long ulBase); +extern void I2CMasterIntDisable(unsigned long ulBase); +extern void I2CMasterIntEnable(unsigned long ulBase); +extern tBoolean I2CMasterIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void I2CMasterSlaveAddrSet(unsigned long ulBase, + unsigned char ucSlaveAddr, + tBoolean bReceive); +extern unsigned long I2CSlaveDataGet(unsigned long ulBase); +extern void I2CSlaveDataPut(unsigned long ulBase, unsigned char ucData); +extern void I2CSlaveDisable(unsigned long ulBase); +extern void I2CSlaveEnable(unsigned long ulBase); +extern void I2CSlaveInit(unsigned long ulBase, unsigned char ucSlaveAddr); +extern void I2CSlaveIntClear(unsigned long ulBase); +extern void I2CSlaveIntDisable(unsigned long ulBase); +extern void I2CSlaveIntEnable(unsigned long ulBase); +extern tBoolean I2CSlaveIntStatus(unsigned long ulBase, tBoolean bMasked); +extern unsigned long I2CSlaveStatus(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __I2C_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/interrupt.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/interrupt.h new file mode 100644 index 000000000..1ce70f16b --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/interrupt.h @@ -0,0 +1,57 @@ +//***************************************************************************** +// +// interrupt.h - Prototypes for the NVIC Interrupt Controller Driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __INTERRUPT_H__ +#define __INTERRUPT_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void IntMasterEnable(void); +extern void IntMasterDisable(void); +extern void IntRegister(unsigned long ulInterrupt, void (*pfnHandler)(void)); +extern void IntUnregister(unsigned long ulInterrupt); +extern void IntPriorityGroupingSet(unsigned long ulBits); +extern unsigned long IntPriorityGroupingGet(void); +extern void IntPrioritySet(unsigned long ulInterrupt, + unsigned char ucPriority); +extern long IntPriorityGet(unsigned long ulInterrupt); +extern void IntEnable(unsigned long ulInterrupt); +extern void IntDisable(unsigned long ulInterrupt); + +#ifdef __cplusplus +} +#endif + +#endif // __INTERRUPT_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/libdriver.a b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/libdriver.a new file mode 100644 index 0000000000000000000000000000000000000000..b5de5a193bc316196a75daed3f28ddb1a0d16b1a GIT binary patch literal 88936 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 literal 0 HcmV?d00001 diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/lmi_flash.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/lmi_flash.h new file mode 100644 index 000000000..75d30c41c --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/lmi_flash.h @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// flash.h - Prototypes for the flash driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __FLASH_H__ +#define __FLASH_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to FlashProtectSet(), and returned by +// FlashProtectGet(). +// +//***************************************************************************** +typedef enum +{ + FlashReadWrite, // Flash can be read and written + FlashReadOnly, // Flash can only be read + FlashExecuteOnly // Flash can only be executed +} +tFlashProtection; + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern unsigned long FlashUsecGet(void); +extern void FlashUsecSet(unsigned long ulClocks); +extern long FlashErase(unsigned long ulAddress); +extern long FlashProgram(unsigned long *pulData, unsigned long ulAddress, + unsigned long ulCount); +extern tFlashProtection FlashProtectGet(unsigned long ulAddress); +extern long FlashProtectSet(unsigned long ulAddress, + tFlashProtection eProtect); +extern long FlashProtectSave(void); +extern long FlashUserGet(unsigned long *pulUser0, unsigned long *pulUser1); +extern long FlashUserSet(unsigned long ulUser0, unsigned long ulUser1); +extern long FlashUserSave(void); +extern void FlashIntRegister(void (*pfnHandler)(void)); +extern void FlashIntUnregister(void); +extern void FlashIntEnable(unsigned long ulIntFlags); +extern void FlashIntDisable(unsigned long ulIntFlags); +extern unsigned long FlashIntGetStatus(tBoolean bMasked); +extern void FlashIntClear(unsigned long ulIntFlags); + +#ifdef __cplusplus +} +#endif + +#endif // __FLASH_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/lmi_timer.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/lmi_timer.h new file mode 100644 index 000000000..85b3160ab --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/lmi_timer.h @@ -0,0 +1,137 @@ +//***************************************************************************** +// +// timer.h - Prototypes for the timer module +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __TIMER_H__ +#define __TIMER_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to TimerConfigure as the ulConfig parameter. +// +//***************************************************************************** +#define TIMER_CFG_32_BIT_OS 0x00000001 // 32-bit one-shot timer +#define TIMER_CFG_32_BIT_PER 0x00000002 // 32-bit periodic timer +#define TIMER_CFG_32_RTC 0x01000000 // 32-bit RTC timer +#define TIMER_CFG_16_BIT_PAIR 0x04000000 // Two 16-bit timers +#define TIMER_CFG_A_ONE_SHOT 0x00000001 // Timer A one-shot timer +#define TIMER_CFG_A_PERIODIC 0x00000002 // Timer A periodic timer +#define TIMER_CFG_A_CAP_COUNT 0x00000003 // Timer A event counter +#define TIMER_CFG_A_CAP_TIME 0x00000007 // Timer A event timer +#define TIMER_CFG_A_PWM 0x0000000A // Timer A PWM output +#define TIMER_CFG_B_ONE_SHOT 0x00000100 // Timer B one-shot timer +#define TIMER_CFG_B_PERIODIC 0x00000200 // Timer B periodic timer +#define TIMER_CFG_B_CAP_COUNT 0x00000300 // Timer B event counter +#define TIMER_CFG_B_CAP_TIME 0x00000700 // Timer B event timer +#define TIMER_CFG_B_PWM 0x00000A00 // Timer B PWM output + +//***************************************************************************** +// +// Values that can be passed to TimerIntEnable, TimerIntDisable, and +// TimerIntClear as the ulIntFlags parameter, and returned from TimerIntStatus. +// +//***************************************************************************** +#define TIMER_CAPB_EVENT 0x00000400 // CaptureB event interrupt +#define TIMER_CAPB_MATCH 0x00000200 // CaptureB match interrupt +#define TIMER_TIMB_TIMEOUT 0x00000100 // TimerB time out interrupt +#define TIMER_RTC_MATCH 0x00000008 // RTC interrupt mask +#define TIMER_CAPA_EVENT 0x00000004 // CaptureA event interrupt +#define TIMER_CAPA_MATCH 0x00000002 // CaptureA match interrupt +#define TIMER_TIMA_TIMEOUT 0x00000001 // TimerA time out interrupt + +//***************************************************************************** +// +// Values that can be passed to TimerControlEvent as the ulEvent parameter. +// +//***************************************************************************** +#define TIMER_EVENT_POS_EDGE 0x00000000 // Count positive edges +#define TIMER_EVENT_NEG_EDGE 0x00000404 // Count negative edges +#define TIMER_EVENT_BOTH_EDGES 0x00000C0C // Count both edges + +//***************************************************************************** +// +// Values that can be passed to most of the timer APIs as the ulTimer +// parameter. +// +//***************************************************************************** +#define TIMER_A 0x000000ff // Timer A +#define TIMER_B 0x0000ff00 // Timer B +#define TIMER_BOTH 0x0000ffff // Timer Both + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void TimerEnable(unsigned long ulBase, unsigned long ulTimer); +extern void TimerDisable(unsigned long ulBase, unsigned long ulTimer); +extern void TimerConfigure(unsigned long ulBase, unsigned long ulConfig); +extern void TimerControlLevel(unsigned long ulBase, unsigned long ulTimer, + tBoolean bInvert); +extern void TimerControlTrigger(unsigned long ulBase, unsigned long ulTimer, + tBoolean bEnable); +extern void TimerControlEvent(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulEvent); +extern void TimerControlStall(unsigned long ulBase, unsigned long ulTimer, + tBoolean bStall); +extern void TimerRTCEnable(unsigned long ulBase); +extern void TimerRTCDisable(unsigned long ulBase); +extern void TimerPrescaleSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerPrescaleGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerPrescaleMatchSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerPrescaleMatchGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerLoadSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerLoadGet(unsigned long ulBase, unsigned long ulTimer); +extern unsigned long TimerValueGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerMatchSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerMatchGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerIntRegister(unsigned long ulBase, unsigned long ulTimer, + void (*pfnHandler)(void)); +extern void TimerIntUnregister(unsigned long ulBase, unsigned long ulTimer); +extern void TimerIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void TimerIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long TimerIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void TimerIntClear(unsigned long ulBase, unsigned long ulIntFlags); +extern void TimerQuiesce(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __TIMER_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/osram128x64x4.c b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/osram128x64x4.c new file mode 100644 index 000000000..3353a82e6 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/osram128x64x4.c @@ -0,0 +1,933 @@ +//***************************************************************************** +// +// osram128x64x4.c - Driver for the OSRAM 128x64x4 graphical OLED display. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup ek_lm3sx965_api +//! @{ +// +//***************************************************************************** + +#include "hw_ssi.h" +#include "hw_memmap.h" +#include "hw_sysctl.h" +#include "hw_types.h" +#include "debug.h" +#include "gpio.h" +#include "ssi.h" +#include "sysctl.h" +#include "osram128x64x4.h" + +//***************************************************************************** +// +// Flag to indicate if SSI port is enabled for OSRAM usage. +// +//***************************************************************************** +static volatile tBoolean g_bSSIEnabled = false; + +//***************************************************************************** +// +// Define the OSRAM 128x64x4 Remap Setting(s). This will be used in +// several places in the code to switch between vertical and horizontal +// address incrementing. +// +// The Remap Command (0xA0) takes one 8-bit parameter. The parameter is +// defined as follows. +// +// Bit 7: Reserved +// Bit 6: Disable(0)/Enable(1) COM Split Odd Even +// When enabled, the COM signals are split Odd on one side, even on +// the other. Otherwise, they are split 0-39 on one side, 40-79 on +// the other. +// Bit 5: Reserved +// Bit 4: Disable(0)/Enable(1) COM Remap +// When Enabled, ROW 0-79 map to COM 79-0 (i.e. reverse row order) +// Bit 3: Reserved +// Bit 2: Horizontal(0)/Vertical(1) Address Increment +// When set, data RAM address will increment along the column rather +// than along the row. +// Bit 1: Disable(0)/Enable(1) Nibble Remap +// When enabled, the upper and lower nibbles in the DATA bus for access +// to the data RAM are swapped. +// Bit 0: Disable(0)/Enable(1) Column Address Remap +// When enabled, DATA RAM columns 0-63 are remapped to Segment Columns +// 127-0. +// +//***************************************************************************** +#define OSRAM_INIT_REMAP 0x52 +#define OSRAM_INIT_OFFSET 0x4C +static const unsigned char g_pucOSRAM128x64x4VerticalInc[] = { 0xA0, 0x56 }; +static const unsigned char g_pucOSRAM128x64x4HorizontalInc[] = { 0xA0, 0x52 }; + +//***************************************************************************** +// +// A 5x7 font (in a 6x8 cell, where the sixth column is omitted from this +// table) for displaying text on the OLED display. The data is organized as +// bytes from the left column to the right column, with each byte containing +// the top row in the LSB and the bottom row in the MSB. +// +// Note: This is the same font data that is used in the EK-LM3S811 +// osram96x16x1 driver. The single bit-per-pixel is expaned in the StringDraw +// function to the appropriate four bit-per-pixel gray scale format. +// +//***************************************************************************** +static const unsigned char g_pucFont[96][5] = +{ + { 0x00, 0x00, 0x00, 0x00, 0x00 }, // " " + { 0x00, 0x00, 0x4f, 0x00, 0x00 }, // ! + { 0x00, 0x07, 0x00, 0x07, 0x00 }, // " + { 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // # + { 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $ + { 0x23, 0x13, 0x08, 0x64, 0x62 }, // % + { 0x36, 0x49, 0x55, 0x22, 0x50 }, // & + { 0x00, 0x05, 0x03, 0x00, 0x00 }, // ' + { 0x00, 0x1c, 0x22, 0x41, 0x00 }, // ( + { 0x00, 0x41, 0x22, 0x1c, 0x00 }, // ) + { 0x14, 0x08, 0x3e, 0x08, 0x14 }, // * + { 0x08, 0x08, 0x3e, 0x08, 0x08 }, // + + { 0x00, 0x50, 0x30, 0x00, 0x00 }, // , + { 0x08, 0x08, 0x08, 0x08, 0x08 }, // - + { 0x00, 0x60, 0x60, 0x00, 0x00 }, // . + { 0x20, 0x10, 0x08, 0x04, 0x02 }, // / + { 0x3e, 0x51, 0x49, 0x45, 0x3e }, // 0 + { 0x00, 0x42, 0x7f, 0x40, 0x00 }, // 1 + { 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2 + { 0x21, 0x41, 0x45, 0x4b, 0x31 }, // 3 + { 0x18, 0x14, 0x12, 0x7f, 0x10 }, // 4 + { 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5 + { 0x3c, 0x4a, 0x49, 0x49, 0x30 }, // 6 + { 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7 + { 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8 + { 0x06, 0x49, 0x49, 0x29, 0x1e }, // 9 + { 0x00, 0x36, 0x36, 0x00, 0x00 }, // : + { 0x00, 0x56, 0x36, 0x00, 0x00 }, // ; + { 0x08, 0x14, 0x22, 0x41, 0x00 }, // < + { 0x14, 0x14, 0x14, 0x14, 0x14 }, // = + { 0x00, 0x41, 0x22, 0x14, 0x08 }, // > + { 0x02, 0x01, 0x51, 0x09, 0x06 }, // ? + { 0x32, 0x49, 0x79, 0x41, 0x3e }, // @ + { 0x7e, 0x11, 0x11, 0x11, 0x7e }, // A + { 0x7f, 0x49, 0x49, 0x49, 0x36 }, // B + { 0x3e, 0x41, 0x41, 0x41, 0x22 }, // C + { 0x7f, 0x41, 0x41, 0x22, 0x1c }, // D + { 0x7f, 0x49, 0x49, 0x49, 0x41 }, // E + { 0x7f, 0x09, 0x09, 0x09, 0x01 }, // F + { 0x3e, 0x41, 0x49, 0x49, 0x7a }, // G + { 0x7f, 0x08, 0x08, 0x08, 0x7f }, // H + { 0x00, 0x41, 0x7f, 0x41, 0x00 }, // I + { 0x20, 0x40, 0x41, 0x3f, 0x01 }, // J + { 0x7f, 0x08, 0x14, 0x22, 0x41 }, // K + { 0x7f, 0x40, 0x40, 0x40, 0x40 }, // L + { 0x7f, 0x02, 0x0c, 0x02, 0x7f }, // M + { 0x7f, 0x04, 0x08, 0x10, 0x7f }, // N + { 0x3e, 0x41, 0x41, 0x41, 0x3e }, // O + { 0x7f, 0x09, 0x09, 0x09, 0x06 }, // P + { 0x3e, 0x41, 0x51, 0x21, 0x5e }, // Q + { 0x7f, 0x09, 0x19, 0x29, 0x46 }, // R + { 0x46, 0x49, 0x49, 0x49, 0x31 }, // S + { 0x01, 0x01, 0x7f, 0x01, 0x01 }, // T + { 0x3f, 0x40, 0x40, 0x40, 0x3f }, // U + { 0x1f, 0x20, 0x40, 0x20, 0x1f }, // V + { 0x3f, 0x40, 0x38, 0x40, 0x3f }, // W + { 0x63, 0x14, 0x08, 0x14, 0x63 }, // X + { 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y + { 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z + { 0x00, 0x7f, 0x41, 0x41, 0x00 }, // [ + { 0x02, 0x04, 0x08, 0x10, 0x20 }, // "\" + { 0x00, 0x41, 0x41, 0x7f, 0x00 }, // ] + { 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^ + { 0x40, 0x40, 0x40, 0x40, 0x40 }, // _ + { 0x00, 0x01, 0x02, 0x04, 0x00 }, // ` + { 0x20, 0x54, 0x54, 0x54, 0x78 }, // a + { 0x7f, 0x48, 0x44, 0x44, 0x38 }, // b + { 0x38, 0x44, 0x44, 0x44, 0x20 }, // c + { 0x38, 0x44, 0x44, 0x48, 0x7f }, // d + { 0x38, 0x54, 0x54, 0x54, 0x18 }, // e + { 0x08, 0x7e, 0x09, 0x01, 0x02 }, // f + { 0x0c, 0x52, 0x52, 0x52, 0x3e }, // g + { 0x7f, 0x08, 0x04, 0x04, 0x78 }, // h + { 0x00, 0x44, 0x7d, 0x40, 0x00 }, // i + { 0x20, 0x40, 0x44, 0x3d, 0x00 }, // j + { 0x7f, 0x10, 0x28, 0x44, 0x00 }, // k + { 0x00, 0x41, 0x7f, 0x40, 0x00 }, // l + { 0x7c, 0x04, 0x18, 0x04, 0x78 }, // m + { 0x7c, 0x08, 0x04, 0x04, 0x78 }, // n + { 0x38, 0x44, 0x44, 0x44, 0x38 }, // o + { 0x7c, 0x14, 0x14, 0x14, 0x08 }, // p + { 0x08, 0x14, 0x14, 0x18, 0x7c }, // q + { 0x7c, 0x08, 0x04, 0x04, 0x08 }, // r + { 0x48, 0x54, 0x54, 0x54, 0x20 }, // s + { 0x04, 0x3f, 0x44, 0x40, 0x20 }, // t + { 0x3c, 0x40, 0x40, 0x20, 0x7c }, // u + { 0x1c, 0x20, 0x40, 0x20, 0x1c }, // v + { 0x3c, 0x40, 0x30, 0x40, 0x3c }, // w + { 0x44, 0x28, 0x10, 0x28, 0x44 }, // x + { 0x0c, 0x50, 0x50, 0x50, 0x3c }, // y + { 0x44, 0x64, 0x54, 0x4c, 0x44 }, // z + { 0x00, 0x08, 0x36, 0x41, 0x00 }, // { + { 0x00, 0x00, 0x7f, 0x00, 0x00 }, // | + { 0x00, 0x41, 0x36, 0x08, 0x00 }, // } + { 0x02, 0x01, 0x02, 0x04, 0x02 }, // ~ + { 0x02, 0x01, 0x02, 0x04, 0x02 }, // ~ +}; + +//***************************************************************************** +// +// The sequence of commands used to initialize the SSD0303 controller. Each +// command is described as follows: there is a byte specifying the number of +// bytes in the command sequence, followed by that many bytes of command data. +// Note: This initialization sequence is derived from OSRAM App Note AN018. +// +//***************************************************************************** +static const unsigned char g_pucOSRAM128x64x4Init[] = +{ + // + // Column Address + // + 4, 0x15, 0, 63, 0xe3, + + // + // Row Address + // + 4, 0x75, 0, 63, 0xe3, + + // + // Contrast Control + // + 3, 0x81, 50, 0xe3, + + // + // Half Current Range + // + 2, 0x85, 0xe3, + + // + // Display Re-map + // + 3, 0xA0, OSRAM_INIT_REMAP, 0xe3, + + // + // Display Start Line + // + 3, 0xA1, 0, 0xe3, + + // + // Display Offset + // + 3, 0xA2, OSRAM_INIT_OFFSET, 0xe3, + + // + // Display Mode Normal + // + 2, 0xA4, 0xe3, + + // + // Multiplex Ratio + // + 3, 0xA8, 63, 0xe3, + + // + // Phase Length + // + 3, 0xB1, 0x22, 0xe3, + + // + // Row Period + // + 3, 0xB2, 70, 0xe3, + + // + // Display Clock Divide + // + 3, 0xB3, 0xF1, 0xe3, + + // + // VSL + // + 3, 0xBF, 0x0D, 0xe3, + + // + // VCOMH + // + 3, 0xBE, 0x02, 0xe3, + + // + // VP + // + 3, 0xBC, 0x10, 0xe3, + + // + // Gamma + // + 10, 0xB8, 0x01, 0x11, 0x22, 0x32, 0x43, 0x54, 0x65, 0x76, 0xe3, + + // + // Set DC-DC + 3, 0xAD, 0x03, 0xe3, + + // + // Display ON/OFF + // + 2, 0xAF, 0xe3, +}; + +//***************************************************************************** +// +//! \internal +//! +//! Write a sequence of command bytes to the SSD0323 controller. +//! +//! The data is written in a polled fashion; this function will not return +//! until the entire byte sequence has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +OSRAMWriteCommand(const unsigned char *pucBuffer, unsigned long ulCount) +{ + unsigned long ulTemp; + + // + // Return iff SSI port is not enabled for OSRAM. + // + if(!g_bSSIEnabled) + { + return; + } + + // + // Clear the command/control bit to enable command mode. + // + GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_7, 0); + + // + // Loop while there are more bytes left to be transferred. + // + while(ulCount != 0) + { + // + // Write the next byte to the controller. + // + SSIDataPut(SSI0_BASE, *pucBuffer++); + + // + // Dummy read to drain the fifo and time the GPIO signal. + // + SSIDataGet(SSI0_BASE, &ulTemp); + + // + // Decrement the BYTE counter. + // + ulCount--; + } +} + +//***************************************************************************** +// +//! \internal +//! +//! Write a sequence of data bytes to the SSD0323 controller. +//! +//! The data is written in a polled fashion; this function will not return +//! until the entire byte sequence has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +OSRAMWriteData(const unsigned char *pucBuffer, unsigned long ulCount) +{ + unsigned long ulTemp; + + // + // Return iff SSI port is not enabled for OSRAM. + // + if(!g_bSSIEnabled) + { + return; + } + + // + // Set the command/control bit to enable data mode. + // + GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_PIN_7); + + // + // Loop while there are more bytes left to be transferred. + // + while(ulCount != 0) + { + // + // Write the next byte to the controller. + // + SSIDataPut(SSI0_BASE, *pucBuffer++); + + // + // Dummy read to drain the fifo and time the GPIO signal. + // + SSIDataGet(SSI0_BASE, &ulTemp); + + // + // Decrement the BYTE counter. + // + ulCount--; + } +} + +//***************************************************************************** +// +//! Clears the OLED display. +//! +//! This function will clear the display RAM. All pixels in the display will +//! be turned off. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Clear(void) +{ + static const unsigned char pucCommand1[] = { 0x15, 0, 63 }; + static const unsigned char pucCommand2[] = { 0x75, 0, 79 }; + unsigned long ulRow, ulColumn; + static unsigned char pucZeroBuffer[8] = { 0, 0, 0, 0, 0, 0, 0, 0}; + + // + // Set the window to fill the entire display. + // + OSRAMWriteCommand(pucCommand1, sizeof(pucCommand1)); + OSRAMWriteCommand(pucCommand2, sizeof(pucCommand2)); + OSRAMWriteCommand(g_pucOSRAM128x64x4VerticalInc, + sizeof(g_pucOSRAM128x64x4VerticalInc)); + + // + // In vertical address increment mode, loop through each column, filling + // each row with 0. + // + for(ulColumn = 0; ulColumn < (128/2); ulColumn++) + { + // + // 8 rows (bytes) per row of text. + // + for(ulRow = 0; ulRow < 80; ulRow += 8) + { + OSRAMWriteData(pucZeroBuffer, sizeof(pucZeroBuffer)); + } + } +} + +//***************************************************************************** +// +//! Displays a string on the OLED display. +//! +//! \param pcStr is a pointer to the string to display. +//! \param ulX is the horizontal position to display the string, specified in +//! columns from the left edge of the display. +//! \param ulY is the vertical position to display the string, specified in +//! rows from the top edge of the display. +//! \param ucLevel is the 4-bit grey scale value to be used for displayed text. +//! +//! This function will draw a string on the display. Only the ASCII characters +//! between 32 (space) and 126 (tilde) are supported; other characters will +//! result in random data being draw on the display (based on whatever appears +//! before/after the font in memory). The font is mono-spaced, so characters +//! such as "i" and "l" have more white space around them than characters such +//! as "m" or "w". +//! +//! If the drawing of the string reaches the right edge of the display, no more +//! characters will be drawn. Therefore, special care is not required to avoid +//! supplying a string that is "too long" to display. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \note Because the OLED display packs 2 pixels of data in a single byte, the +//! parameter \e ulX must be an even column number (e.g. 0, 2, 4, etc). +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4StringDraw(const char *pcStr, unsigned long ulX, + unsigned long ulY, unsigned char ucLevel) +{ + static unsigned char pucBuffer[8]; + unsigned long ulIdx1, ulIdx2; + unsigned char ucTemp; + + // + // Check the arguments. + // + ASSERT(ulX < 128); + ASSERT((ulX & 1) == 0); + ASSERT(ulY < 64); + ASSERT(ucLevel < 16); + + // + // Setup a window starting at the specified column and row, ending + // at the right edge of the display and 8 rows down (single character row). + // + pucBuffer[0] = 0x15; + pucBuffer[1] = ulX / 2; + pucBuffer[2] = 63; + OSRAMWriteCommand(pucBuffer, 3); + pucBuffer[0] = 0x75; + pucBuffer[1] = ulY; + pucBuffer[2] = ulY + 7; + OSRAMWriteCommand(pucBuffer, 3); + OSRAMWriteCommand(g_pucOSRAM128x64x4VerticalInc, + sizeof(g_pucOSRAM128x64x4VerticalInc)); + + // + // Loop while there are more characters in the string. + // + while(*pcStr != 0) + { + // + // Get a working copy of the current character and convert to an + // index into the character bit-map array. + // + ucTemp = *pcStr; + ucTemp &= 0x7F; + if(ucTemp < ' ') + { + ucTemp = ' '; + } + else + { + ucTemp -= ' '; + } + + // + // Build and display the character buffer. + // + for(ulIdx1 = 0; ulIdx1 < 3; ulIdx1++) + { + // + // Convert two columns of 1-bit font data into a single data + // byte column of 4-bit font data. + // + for(ulIdx2 = 0; ulIdx2 < 8; ulIdx2++) + { + pucBuffer[ulIdx2] = 0; + if(g_pucFont[ucTemp][ulIdx1*2] & (1 << ulIdx2)) + { + pucBuffer[ulIdx2] = ((ucLevel << 4) & 0xf0); + } + if((ulIdx1 < 2) && + (g_pucFont[ucTemp][ulIdx1*2+1] & (1 << ulIdx2))) + { + pucBuffer[ulIdx2] |= ((ucLevel << 0) & 0x0f); + } + } + + // + // If there is room, dump the single data byte column to the + // display. Otherwise, bail out. + // + if(ulX < 126) + { + OSRAMWriteData(pucBuffer, 8); + ulX += 2; + } + else + { + return; + } + } + + // + // Advance to the next character. + // + pcStr++; + } +} + +//***************************************************************************** +// +//! Displays an image on the OLED display. +//! +//! \param pucImage is a pointer to the image data. +//! \param ulX is the horizontal position to display this image, specified in +//! columns from the left edge of the display. +//! \param ulY is the vertical position to display this image, specified in +//! rows from the top of the display. +//! \param ulWidth is the width of the image, specified in columns. +//! \param ulHeight is the height of the image, specified in rows. +//! +//! This function will display a bitmap graphic on the display. Because of the +//! format of the display RAM, the starting column (/e ulX) and the number of +//! columns (/e ulWidth) must be an integer multiple of two. +//! +//! The image data is organized with the first row of image data appearing left +//! to right, followed immediately by the second row of image data. Each byte +//! contains the data for two columns in the current row, with the leftmost +//! column being contained in bits 7:4 and the rightmost column being contained +//! in bits 3:0. +//! +//! For example, an image six columns wide and seven scan lines tall would +//! be arranged as follows (showing how the twenty one bytes of the image would +//! appear on the display): +//! +//! \verbatim +//! +-------------------+-------------------+-------------------+ +//! | Byte 0 | Byte 1 | Byte 2 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 3 | Byte 4 | Byte 5 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 6 | Byte 7 | Byte 8 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 9 | Byte 10 | Byte 11 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 12 | Byte 13 | Byte 14 | +//! +---------+---------+---------+--3------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 15 | Byte 16 | Byte 17 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 18 | Byte 19 | Byte 20 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! \endverbatim +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by` +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4ImageDraw(const unsigned char *pucImage, unsigned long ulX, + unsigned long ulY, unsigned long ulWidth, + unsigned long ulHeight) +{ + static unsigned char pucBuffer[8]; + + // + // Check the arguments. + // + ASSERT(ulX < 128); + ASSERT((ulX & 1) == 0); + ASSERT(ulY < 64); + ASSERT((ulX + ulWidth) <= 128); + ASSERT((ulY + ulHeight) <= 64); + ASSERT((ulWidth & 1) == 0); + + // + // Setup a window starting at the specified column and row, and ending + // at the column + width and row+height. + // + pucBuffer[0] = 0x15; + pucBuffer[1] = ulX / 2; + pucBuffer[2] = (ulX + ulWidth - 2) / 2; + OSRAMWriteCommand(pucBuffer, 3); + pucBuffer[0] = 0x75; + pucBuffer[1] = ulY; + pucBuffer[2] = ulY + ulHeight - 1; + OSRAMWriteCommand(pucBuffer, 3); + OSRAMWriteCommand(g_pucOSRAM128x64x4HorizontalInc, + sizeof(g_pucOSRAM128x64x4HorizontalInc)); + + // + // Loop while there are more rows to display. + // + while(ulHeight--) + { + // + // Write this row of image data. + // + OSRAMWriteData(pucImage, (ulWidth / 2)); + + // + // Advance to the next row of the image. + // + pucImage += (ulWidth / 2); + } +} + +//***************************************************************************** +// +//! Enable the SSI component of the OLED display driver. +//! +//! \param ulFrequency specifies the SSI Clock Frequency to be used. +//! +//! This function initializes the SSI interface to the OLED display. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Enable(unsigned long ulFrequency) +{ + unsigned long ulTemp; + + // + // Disable the SSI port. + // + SSIDisable(SSI0_BASE); + + // + // Configure the SSI0 port for master mode. + // + SSIConfig(SSI0_BASE, SSI_FRF_MOTO_MODE_2, SSI_MODE_MASTER, ulFrequency, 8); + + // + // (Re)Enable SSI control of the FSS pin. + // + GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_3); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + + // + // Enable the SSI port. + // + SSIEnable(SSI0_BASE); + + // + // Drain the receive fifo. + // + while(SSIDataNonBlockingGet(SSI0_BASE, &ulTemp) != 0) + { + } + + // + // Indicate that the OSRAM driver can use the SSI Port. + // + g_bSSIEnabled = true; +} + +//***************************************************************************** +// +//! Enable the SSI component of the OLED display driver. +//! +//! \param ulFrequency specifies the SSI Clock Frequency to be used. +//! +//! This function initializes the SSI interface to the OLED display. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Disable(void) +{ + unsigned long ulTemp; + + // + // Indicate that the OSRAM driver can no longer use the SSI Port. + // + g_bSSIEnabled = false; + + // + // Drain the receive fifo. + // + while(SSIDataNonBlockingGet(SSI0_BASE, &ulTemp) != 0) + { + } + + // + // Disable the SSI port. + // + SSIDisable(SSI0_BASE); + + // + // Disable SSI control of the FSS pin. + // + GPIODirModeSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_DIR_MODE_OUT); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_PIN_3); + +} + +//***************************************************************************** +// +//! Initialize the OLED display. +//! +//! \param ulFrequency specifies the SSI Clock Frequency to be used. +//! +//! This function initializes the SSI interface to the OLED display and +//! configures the SSD0323 controller on the panel. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Init(unsigned long ulFrequency) +{ + unsigned long ulIdx; + + // + // Enable the SSI0 and GPIO port blocks as they are needed by this driver. + // + SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); + + // + // Configure the SSI0CLK and SSIOTX pins for SSI operation. + // + GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_5); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_2, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_5, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + + // + // Configure the PC7 pin as a D/Cn signal for OLED device. + // + GPIODirModeSet(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_DIR_MODE_OUT); + GPIOPadConfigSet(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD); + GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_PIN_7); + + // + // Configure and enable the SSI0 port for master mode. + // + OSRAM128x64x4Enable(ulFrequency); + + // + // Clear the frame buffer. + // + OSRAM128x64x4Clear(); + + // + // Initialize the SSD0323 controller. Loop through the initialization + // sequence array, sending each command "string" to the controller. + // + for(ulIdx = 0; ulIdx < sizeof(g_pucOSRAM128x64x4Init); + ulIdx += g_pucOSRAM128x64x4Init[ulIdx] + 1) + { + // + // Send this command. + // + OSRAMWriteCommand(g_pucOSRAM128x64x4Init + ulIdx + 1, + g_pucOSRAM128x64x4Init[ulIdx] - 1); + } +} + +//***************************************************************************** +// +//! Turns on the OLED display. +//! +//! This function will turn on the OLED display, causing it to display the +//! contents of its internal frame buffer. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4DisplayOn(void) +{ + unsigned long ulIdx; + + // + // Initialize the SSD0323 controller. Loop through the initialization + // sequence array, sending each command "string" to the controller. + // + for(ulIdx = 0; ulIdx < sizeof(g_pucOSRAM128x64x4Init); + ulIdx += g_pucOSRAM128x64x4Init[ulIdx] + 1) + { + // + // Send this command. + // + OSRAMWriteCommand(g_pucOSRAM128x64x4Init + ulIdx + 1, + g_pucOSRAM128x64x4Init[ulIdx] - 1); + } +} + +//***************************************************************************** +// +//! Turns off the OLED display. +//! +//! This function will turn off the OLED display. This will stop the scanning +//! of the panel and turn off the on-chip DC-DC converter, preventing damage to +//! the panel due to burn-in (it has similar characters to a CRT in this +//! respect). +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4DisplayOff(void) +{ + static const unsigned char pucCommand1[] = + { + 0xAE, 0xAD, 0x02 + }; + + // + // Turn off the DC-DC converter and the display. + // + OSRAMWriteCommand(pucCommand1, sizeof(pucCommand1)); +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/osram128x64x4.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/osram128x64x4.h new file mode 100644 index 000000000..2ba7cb956 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/osram128x64x4.h @@ -0,0 +1,63 @@ +//***************************************************************************** +// +// osram128x64x4.h - Prototypes for the driver for the OSRAM 128x64x4 graphical +// OLED display. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __OSRAM128X64X4_H__ +#define __OSRAM128X64X4_H__ + +//***************************************************************************** +// +// Prototypes for the driver APIs. +// +//***************************************************************************** +extern void OSRAM128x64x4Clear(void); +extern void OSRAM128x64x4StringDraw(const char *pcStr, + unsigned long ulX, + unsigned long ulY, + unsigned char ucLevel); +extern void OSRAM128x64x4ImageDraw(const unsigned char *pucImage, + unsigned long ulX, + unsigned long ulY, + unsigned long ulWidth, + unsigned long ulHeight); +extern void OSRAM128x64x4Init(unsigned long ulFrequency); +extern void OSRAM128x64x4Enable(unsigned long ulFrequency); +extern void OSRAM128x64x4Disable(void); +extern void OSRAM128x64x4DisplayOn(void); +extern void OSRAM128x64x4DisplayOff(void); + +//***************************************************************************** +// +// The following macro(s) map old names for the OSRAM functions to the new +// names. In new code, the new names should be used in favor of the old names. +// +//***************************************************************************** +#ifndef DEPRECATED +#define OSRAM128x64x1InitSSI OSRAM128x64x4Enable +#endif + +#endif // __OSRAM128X64X4_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/pwm.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/pwm.h new file mode 100644 index 000000000..bb67fda19 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/pwm.h @@ -0,0 +1,161 @@ +//***************************************************************************** +// +// pwm.h - API function protoypes for Pulse Width Modulation (PWM) ports +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __PWM_H__ +#define __PWM_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following defines are passed to PWMGenConfigure() as the ulConfig +// parameter and specify the configuration of the PWM generator. +// +//***************************************************************************** +#define PWM_GEN_MODE_DOWN 0x00000000 // Down count mode +#define PWM_GEN_MODE_UP_DOWN 0x00000002 // Up/Down count mode +#define PWM_GEN_MODE_SYNC 0x00000038 // Synchronous updates +#define PWM_GEN_MODE_NO_SYNC 0x00000000 // Immediate updates +#define PWM_GEN_MODE_DBG_RUN 0x00000004 // Continue running in debug mode +#define PWM_GEN_MODE_DBG_STOP 0x00000000 // Stop running in debug mode + +//***************************************************************************** +// +// Defines for enabling, disabling, and clearing PWM generator interrupts and +// triggers. +// +//***************************************************************************** +#define PWM_INT_CNT_ZERO 0x00000001 // Int if COUNT = 0 +#define PWM_INT_CNT_LOAD 0x00000002 // Int if COUNT = LOAD +#define PWM_INT_CNT_AU 0x00000004 // Int if COUNT = CMPA U +#define PWM_INT_CNT_AD 0x00000008 // Int if COUNT = CMPA D +#define PWM_INT_CNT_BU 0x00000010 // Int if COUNT = CMPA U +#define PWM_INT_CNT_BD 0x00000020 // Int if COUNT = CMPA D +#define PWM_TR_CNT_ZERO 0x00000100 // Trig if COUNT = 0 +#define PWM_TR_CNT_LOAD 0x00000200 // Trig if COUNT = LOAD +#define PWM_TR_CNT_AU 0x00000400 // Trig if COUNT = CMPA U +#define PWM_TR_CNT_AD 0x00000800 // Trig if COUNT = CMPA D +#define PWM_TR_CNT_BU 0x00001000 // Trig if COUNT = CMPA U +#define PWM_TR_CNT_BD 0x00002000 // Trig if COUNT = CMPA D + +//***************************************************************************** +// +// Defines for enabling, disabling, and clearing PWM interrupts. +// +//***************************************************************************** +#define PWM_INT_GEN_0 0x00000001 // Generator 0 interrupt +#define PWM_INT_GEN_1 0x00000002 // Generator 1 interrupt +#define PWM_INT_GEN_2 0x00000004 // Generator 2 interrupt +#define PWM_INT_FAULT 0x00010000 // Fault interrupt + +//***************************************************************************** +// +// Defines to identify the generators within a module. +// +//***************************************************************************** +#define PWM_GEN_0 0x00000040 // Offset address of Gen0 +#define PWM_GEN_1 0x00000080 // Offset address of Gen1 +#define PWM_GEN_2 0x000000C0 // Offset address of Gen2 + +#define PWM_GEN_0_BIT 0x00000001 // Bit-wise ID for Gen0 +#define PWM_GEN_1_BIT 0x00000002 // Bit-wise ID for Gen1 +#define PWM_GEN_2_BIT 0x00000004 // Bit-wise ID for Gen2 + +//***************************************************************************** +// +// Defines to identify the outputs within a module. +// +//***************************************************************************** +#define PWM_OUT_0 0x00000040 // Encoded offset address of PWM0 +#define PWM_OUT_1 0x00000041 // Encoded offset address of PWM1 +#define PWM_OUT_2 0x00000082 // Encoded offset address of PWM2 +#define PWM_OUT_3 0x00000083 // Encoded offset address of PWM3 +#define PWM_OUT_4 0x000000C4 // Encoded offset address of PWM4 +#define PWM_OUT_5 0x000000C5 // Encoded offset address of PWM5 + +#define PWM_OUT_0_BIT 0x00000001 // Bit-wise ID for PWM0 +#define PWM_OUT_1_BIT 0x00000002 // Bit-wise ID for PWM1 +#define PWM_OUT_2_BIT 0x00000004 // Bit-wise ID for PWM2 +#define PWM_OUT_3_BIT 0x00000008 // Bit-wise ID for PWM3 +#define PWM_OUT_4_BIT 0x00000010 // Bit-wise ID for PWM4 +#define PWM_OUT_5_BIT 0x00000020 // Bit-wise ID for PWM5 + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void PWMGenConfigure(unsigned long ulBase, unsigned long ulGen, + unsigned long ulConfig); +extern void PWMGenPeriodSet(unsigned long ulBase, unsigned long ulGen, + unsigned long ulPeriod); +extern unsigned long PWMGenPeriodGet(unsigned long ulBase, + unsigned long ulGen); +extern void PWMGenEnable(unsigned long ulBase, unsigned long ulGen); +extern void PWMGenDisable(unsigned long ulBase, unsigned long ulGen); +extern void PWMPulseWidthSet(unsigned long ulBase, unsigned long ulPWMOut, + unsigned long ulWidth); +extern unsigned long PWMPulseWidthGet(unsigned long ulBase, + unsigned long ulPWMOut); +extern void PWMDeadBandEnable(unsigned long ulBase, unsigned long ulGen, + unsigned short usRise, unsigned short usFall); +extern void PWMDeadBandDisable(unsigned long ulBase, unsigned long ulGen); +extern void PWMSyncUpdate(unsigned long ulBase, unsigned long ulGenBits); +extern void PWMSyncTimeBase(unsigned long ulBase, unsigned long ulGenBits); +extern void PWMOutputState(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bEnable); +extern void PWMOutputInvert(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bInvert); +extern void PWMOutputFault(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bFaultKill); +extern void PWMGenIntRegister(unsigned long ulBase, unsigned long ulGen, + void (*pfnIntHandler)(void)); +extern void PWMGenIntUnregister(unsigned long ulBase, unsigned long ulGen); +extern void PWMFaultIntRegister(unsigned long ulBase, + void (*pfnIntHandler)(void)); +extern void PWMFaultIntUnregister(unsigned long ulBase); +extern void PWMGenIntTrigEnable(unsigned long ulBase, unsigned long ulGen, + unsigned long ulIntTrig); +extern void PWMGenIntTrigDisable(unsigned long ulBase, unsigned long ulGen, + unsigned long ulIntTrig); +extern unsigned long PWMGenIntStatus(unsigned long ulBase, unsigned long ulGen, + tBoolean bMasked); +extern void PWMGenIntClear(unsigned long ulBase, unsigned long ulGen, + unsigned long ulInts); +extern void PWMIntEnable(unsigned long ulBase, unsigned long ulGenFault); +extern void PWMIntDisable(unsigned long ulBase, unsigned long ulGenFault); +extern void PWMFaultIntClear(unsigned long ulBase); +extern unsigned long PWMIntStatus(unsigned long ulBase, tBoolean bMasked); + +#ifdef __cplusplus +} +#endif + +#endif // __PWM_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/qei.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/qei.h new file mode 100644 index 000000000..89d5b20bc --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/qei.h @@ -0,0 +1,104 @@ +//***************************************************************************** +// +// qei.h - Prototypes for the Quadrature Encoder Driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __QEI_H__ +#define __QEI_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to QEIConfigure as the ulConfig paramater. +// +//***************************************************************************** +#define QEI_CONFIG_CAPTURE_A 0x00000000 // Count on ChA edges only +#define QEI_CONFIG_CAPTURE_A_B 0x00000008 // Count on ChA and ChB edges +#define QEI_CONFIG_NO_RESET 0x00000000 // Do not reset on index pulse +#define QEI_CONFIG_RESET_IDX 0x00000010 // Reset position on index pulse +#define QEI_CONFIG_QUADRATURE 0x00000000 // ChA and ChB are quadrature +#define QEI_CONFIG_CLOCK_DIR 0x00000004 // ChA and ChB are clock and dir +#define QEI_CONFIG_NO_SWAP 0x00000000 // Do not swap ChA and ChB +#define QEI_CONFIG_SWAP 0x00000002 // Swap ChA and ChB + +//***************************************************************************** +// +// Values that can be passed to QEIVelocityConfigure as the ulPreDiv parameter. +// +//***************************************************************************** +#define QEI_VELDIV_1 0x00000000 // Predivide by 1 +#define QEI_VELDIV_2 0x00000040 // Predivide by 2 +#define QEI_VELDIV_4 0x00000080 // Predivide by 4 +#define QEI_VELDIV_8 0x000000C0 // Predivide by 8 +#define QEI_VELDIV_16 0x00000100 // Predivide by 16 +#define QEI_VELDIV_32 0x00000140 // Predivide by 32 +#define QEI_VELDIV_64 0x00000180 // Predivide by 64 +#define QEI_VELDIV_128 0x000001C0 // Predivide by 128 + +//***************************************************************************** +// +// Values that can be passed to QEIEnableInts, QEIDisableInts, and QEIClearInts +// as the ulIntFlags parameter, and returned by QEIGetIntStatus. +// +//***************************************************************************** +#define QEI_INTERROR 0x00000008 // Phase error detected +#define QEI_INTDIR 0x00000004 // Direction change +#define QEI_INTTIMER 0x00000002 // Velocity timer expired +#define QEI_INTINDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void QEIEnable(unsigned long ulBase); +extern void QEIDisable(unsigned long ulBase); +extern void QEIConfigure(unsigned long ulBase, unsigned long ulConfig, + unsigned long ulMaxPosition); +extern unsigned long QEIPositionGet(unsigned long ulBase); +extern void QEIPositionSet(unsigned long ulBase, unsigned long ulPosition); +extern long QEIDirectionGet(unsigned long ulBase); +extern tBoolean QEIErrorGet(unsigned long ulBase); +extern void QEIVelocityEnable(unsigned long ulBase); +extern void QEIVelocityDisable(unsigned long ulBase); +extern void QEIVelocityConfigure(unsigned long ulBase, unsigned long ulPreDiv, + unsigned long ulPeriod); +extern unsigned long QEIVelocityGet(unsigned long ulBase); +extern void QEIIntRegister(unsigned long ulBase, void (*pfnHandler)(void)); +extern void QEIIntUnregister(unsigned long ulBase); +extern void QEIIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void QEIIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long QEIIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void QEIIntClear(unsigned long ulBase, unsigned long ulIntFlags); + +#ifdef __cplusplus +} +#endif + +#endif // __QEI_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/ssi.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/ssi.h new file mode 100644 index 000000000..227b6bd9b --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/ssi.h @@ -0,0 +1,89 @@ +//***************************************************************************** +// +// ssi.h - Prototypes for the Synchronous Serial Interface Driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __SSI_H__ +#define __SSI_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to SSIIntEnable, SSIIntDisable, and SSIIntClear +// as the ulIntFlags parameter, and returned by SSIIntStatus. +// +//***************************************************************************** +#define SSI_TXFF 0x00000008 // TX FIFO half empty or less +#define SSI_RXFF 0x00000004 // RX FIFO half full or less +#define SSI_RXTO 0x00000002 // RX timeout +#define SSI_RXOR 0x00000001 // RX overrun + +//***************************************************************************** +// +// Values that can be passed to SSIConfig. +// +//***************************************************************************** +#define SSI_FRF_MOTO_MODE_0 0x00000000 // Moto fmt, polarity 0, phase 0 +#define SSI_FRF_MOTO_MODE_1 0x00000002 // Moto fmt, polarity 0, phase 1 +#define SSI_FRF_MOTO_MODE_2 0x00000001 // Moto fmt, polarity 1, phase 0 +#define SSI_FRF_MOTO_MODE_3 0x00000003 // Moto fmt, polarity 1, phase 1 +#define SSI_FRF_TI 0x00000010 // TI frame format +#define SSI_FRF_NMW 0x00000020 // National MicroWire frame format + +#define SSI_MODE_MASTER 0x00000000 // SSI master +#define SSI_MODE_SLAVE 0x00000001 // SSI slave +#define SSI_MODE_SLAVE_OD 0x00000002 // SSI slave with output disabled + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void SSIConfig(unsigned long ulBase, unsigned long ulProtocol, + unsigned long ulMode, unsigned long ulBitRate, + unsigned long ulDataWidth); +extern void SSIDataGet(unsigned long ulBase, unsigned long *pulData); +extern long SSIDataNonBlockingGet(unsigned long ulBase, + unsigned long *pulData); +extern void SSIDataPut(unsigned long ulBase, unsigned long ulData); +extern long SSIDataNonBlockingPut(unsigned long ulBase, unsigned long ulData); +extern void SSIDisable(unsigned long ulBase); +extern void SSIEnable(unsigned long ulBase); +extern void SSIIntClear(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntRegister(unsigned long ulBase, void(*pfnHandler)(void)); +extern unsigned long SSIIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void SSIIntUnregister(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __SSI_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/sysctl.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/sysctl.h new file mode 100644 index 000000000..d2efbca0d --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/sysctl.h @@ -0,0 +1,301 @@ +//***************************************************************************** +// +// sysctl.h - Prototypes for the system control driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __SYSCTL_H__ +#define __SYSCTL_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following are values that can be passed to the +// SysCtlPeripheralPresent(), SysCtlPeripheralEnable(), +// SysCtlPeripheralDisable(), and SysCtlPeripheralReset() APIs as the +// ulPeripheral parameter. The peripherals in the fourth group (upper nibble +// is 3) can only be used with the SysCtlPeripheralPresent() API. +// +//***************************************************************************** +#define SYSCTL_PERIPH_PWM 0x00100010 // PWM +#define SYSCTL_PERIPH_ADC 0x00100001 // ADC +#define SYSCTL_PERIPH_HIBERNATE 0x00000040 // Hibernation module +#define SYSCTL_PERIPH_WDOG 0x00000008 // Watchdog +#define SYSCTL_PERIPH_CAN0 0x00100100 // CAN 0 +#define SYSCTL_PERIPH_CAN1 0x00100200 // CAN 1 +#define SYSCTL_PERIPH_UART0 0x10000001 // UART 0 +#define SYSCTL_PERIPH_UART1 0x10000002 // UART 1 +#define SYSCTL_PERIPH_UART2 0x10000004 // UART 2 +#define SYSCTL_PERIPH_SSI 0x10000010 // SSI +#define SYSCTL_PERIPH_SSI0 0x10000010 // SSI 0 +#define SYSCTL_PERIPH_SSI1 0x10000020 // SSI 1 +#define SYSCTL_PERIPH_QEI 0x10000100 // QEI +#define SYSCTL_PERIPH_QEI0 0x10000100 // QEI 0 +#define SYSCTL_PERIPH_QEI1 0x10000200 // QEI 1 +#define SYSCTL_PERIPH_I2C 0x10001000 // I2C +#define SYSCTL_PERIPH_I2C0 0x10001000 // I2C 0 +#define SYSCTL_PERIPH_I2C1 0x10004000 // I2C 1 +#define SYSCTL_PERIPH_TIMER0 0x10100001 // Timer 0 +#define SYSCTL_PERIPH_TIMER1 0x10100002 // Timer 1 +#define SYSCTL_PERIPH_TIMER2 0x10100004 // Timer 2 +#define SYSCTL_PERIPH_TIMER3 0x10100008 // Timer 3 +#define SYSCTL_PERIPH_COMP0 0x10100100 // Analog comparator 0 +#define SYSCTL_PERIPH_COMP1 0x10100200 // Analog comparator 1 +#define SYSCTL_PERIPH_COMP2 0x10100400 // Analog comparator 2 +#define SYSCTL_PERIPH_GPIOA 0x20000001 // GPIO A +#define SYSCTL_PERIPH_GPIOB 0x20000002 // GPIO B +#define SYSCTL_PERIPH_GPIOC 0x20000004 // GPIO C +#define SYSCTL_PERIPH_GPIOD 0x20000008 // GPIO D +#define SYSCTL_PERIPH_GPIOE 0x20000010 // GPIO E +#define SYSCTL_PERIPH_GPIOF 0x20000020 // GPIO F +#define SYSCTL_PERIPH_GPIOG 0x20000040 // GPIO G +#define SYSCTL_PERIPH_GPIOH 0x20000080 // GPIO H +#define SYSCTL_PERIPH_ETH 0x20105000 // ETH +#define SYSCTL_PERIPH_MPU 0x30000080 // Cortex M3 MPU +#define SYSCTL_PERIPH_TEMP 0x30000020 // Temperature sensor +#define SYSCTL_PERIPH_PLL 0x30000010 // PLL + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlPinPresent() API +// as the ulPin parameter. +// +//***************************************************************************** +#define SYSCTL_PIN_PWM0 0x00000001 // PWM0 pin +#define SYSCTL_PIN_PWM1 0x00000002 // PWM1 pin +#define SYSCTL_PIN_PWM2 0x00000004 // PWM2 pin +#define SYSCTL_PIN_PWM3 0x00000008 // PWM3 pin +#define SYSCTL_PIN_PWM4 0x00000010 // PWM4 pin +#define SYSCTL_PIN_PWM5 0x00000020 // PWM5 pin +#define SYSCTL_PIN_C0MINUS 0x00000040 // C0- pin +#define SYSCTL_PIN_C0PLUS 0x00000080 // C0+ pin +#define SYSCTL_PIN_C0O 0x00000100 // C0o pin +#define SYSCTL_PIN_C1MINUS 0x00000200 // C1- pin +#define SYSCTL_PIN_C1PLUS 0x00000400 // C1+ pin +#define SYSCTL_PIN_C1O 0x00000800 // C1o pin +#define SYSCTL_PIN_C2MINUS 0x00001000 // C2- pin +#define SYSCTL_PIN_C2PLUS 0x00002000 // C2+ pin +#define SYSCTL_PIN_C2O 0x00004000 // C2o pin +#define SYSCTL_PIN_MC_FAULT0 0x00008000 // MC0 Fault pin +#define SYSCTL_PIN_ADC0 0x00010000 // ADC0 pin +#define SYSCTL_PIN_ADC1 0x00020000 // ADC1 pin +#define SYSCTL_PIN_ADC2 0x00040000 // ADC2 pin +#define SYSCTL_PIN_ADC3 0x00080000 // ADC3 pin +#define SYSCTL_PIN_ADC4 0x00100000 // ADC4 pin +#define SYSCTL_PIN_ADC5 0x00200000 // ADC5 pin +#define SYSCTL_PIN_ADC6 0x00400000 // ADC6 pin +#define SYSCTL_PIN_ADC7 0x00800000 // ADC7 pin +#define SYSCTL_PIN_CCP0 0x01000000 // CCP0 pin +#define SYSCTL_PIN_CCP1 0x02000000 // CCP1 pin +#define SYSCTL_PIN_CCP2 0x04000000 // CCP2 pin +#define SYSCTL_PIN_CCP3 0x08000000 // CCP3 pin +#define SYSCTL_PIN_CCP4 0x10000000 // CCP4 pin +#define SYSCTL_PIN_CCP5 0x20000000 // CCP5 pin +#define SYSCTL_PIN_32KHZ 0x80000000 // 32kHz pin + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlLDOSet() API as +// the ulVoltage value, or returned by the SysCtlLDOGet() API. +// +//***************************************************************************** +#define SYSCTL_LDO_2_25V 0x00000005 // LDO output of 2.25V +#define SYSCTL_LDO_2_30V 0x00000004 // LDO output of 2.30V +#define SYSCTL_LDO_2_35V 0x00000003 // LDO output of 2.35V +#define SYSCTL_LDO_2_40V 0x00000002 // LDO output of 2.40V +#define SYSCTL_LDO_2_45V 0x00000001 // LDO output of 2.45V +#define SYSCTL_LDO_2_50V 0x00000000 // LDO output of 2.50V +#define SYSCTL_LDO_2_55V 0x0000001f // LDO output of 2.55V +#define SYSCTL_LDO_2_60V 0x0000001e // LDO output of 2.60V +#define SYSCTL_LDO_2_65V 0x0000001d // LDO output of 2.65V +#define SYSCTL_LDO_2_70V 0x0000001c // LDO output of 2.70V +#define SYSCTL_LDO_2_75V 0x0000001b // LDO output of 2.75V + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlLDOConfigSet() API. +// +//***************************************************************************** +#define SYSCTL_LDOCFG_ARST 0x00000001 // Allow LDO failure to reset +#define SYSCTL_LDOCFG_NORST 0x00000000 // Do not reset on LDO failure + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlIntEnable(), +// SysCtlIntDisable(), and SysCtlIntClear() APIs, or returned in the bit mask +// by the SysCtlIntStatus() API. +// +//***************************************************************************** +#define SYSCTL_INT_PLL_LOCK 0x00000040 // PLL lock interrupt +#define SYSCTL_INT_CUR_LIMIT 0x00000020 // Current limit interrupt +#define SYSCTL_INT_IOSC_FAIL 0x00000010 // Internal oscillator failure int +#define SYSCTL_INT_MOSC_FAIL 0x00000008 // Main oscillator failure int +#define SYSCTL_INT_POR 0x00000004 // Power on reset interrupt +#define SYSCTL_INT_BOR 0x00000002 // Brown out interrupt +#define SYSCTL_INT_PLL_FAIL 0x00000001 // PLL failure interrupt + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlResetCauseClear() +// API or returned by the SysCtlResetCauseGet() API. +// +//***************************************************************************** +#define SYSCTL_CAUSE_LDO 0x00000020 // LDO power not OK reset +#define SYSCTL_CAUSE_SW 0x00000010 // Software reset +#define SYSCTL_CAUSE_WDOG 0x00000008 // Watchdog reset +#define SYSCTL_CAUSE_BOR 0x00000004 // Brown-out reset +#define SYSCTL_CAUSE_POR 0x00000002 // Power on reset +#define SYSCTL_CAUSE_EXT 0x00000001 // External reset + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlBrownOutConfigSet() +// API as the ulConfig parameter. +// +//***************************************************************************** +#define SYSCTL_BOR_RESET 0x00000002 // Reset instead of interrupting +#define SYSCTL_BOR_RESAMPLE 0x00000001 // Resample BOR before asserting + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlPWMClockSet() API +// as the ulConfig parameter, and can be returned by the SysCtlPWMClockGet() +// API. +// +//***************************************************************************** +#define SYSCTL_PWMDIV_1 0x00000000 // PWM clock is processor clock /1 +#define SYSCTL_PWMDIV_2 0x00100000 // PWM clock is processor clock /2 +#define SYSCTL_PWMDIV_4 0x00120000 // PWM clock is processor clock /4 +#define SYSCTL_PWMDIV_8 0x00140000 // PWM clock is processor clock /8 +#define SYSCTL_PWMDIV_16 0x00160000 // PWM clock is processor clock /16 +#define SYSCTL_PWMDIV_32 0x00180000 // PWM clock is processor clock /32 +#define SYSCTL_PWMDIV_64 0x001A0000 // PWM clock is processor clock /64 + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlADCSpeedSet() API +// as the ulSpeed parameter, and can be returned by the SyCtlADCSpeedGet() +// API. +// +//***************************************************************************** +#define SYSCTL_ADCSPEED_1MSPS 0x00000300 // 1,000,000 samples per second +#define SYSCTL_ADCSPEED_500KSPS 0x00000200 // 500,000 samples per second +#define SYSCTL_ADCSPEED_250KSPS 0x00000100 // 250,000 samples per second +#define SYSCTL_ADCSPEED_125KSPS 0x00000000 // 125,000 samples per second + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlClockSet() API as +// the ulConfig parameter. +// +//***************************************************************************** +#define SYSCTL_SYSDIV_1 0x07800000 // Processor clock is osc/pll /1 +#define SYSCTL_SYSDIV_2 0x00C00000 // Processor clock is osc/pll /2 +#define SYSCTL_SYSDIV_3 0x01400000 // Processor clock is osc/pll /3 +#define SYSCTL_SYSDIV_4 0x01C00000 // Processor clock is osc/pll /4 +#define SYSCTL_SYSDIV_5 0x02400000 // Processor clock is osc/pll /5 +#define SYSCTL_SYSDIV_6 0x02C00000 // Processor clock is osc/pll /6 +#define SYSCTL_SYSDIV_7 0x03400000 // Processor clock is osc/pll /7 +#define SYSCTL_SYSDIV_8 0x03C00000 // Processor clock is osc/pll /8 +#define SYSCTL_SYSDIV_9 0x04400000 // Processor clock is osc/pll /9 +#define SYSCTL_SYSDIV_10 0x04C00000 // Processor clock is osc/pll /10 +#define SYSCTL_SYSDIV_11 0x05400000 // Processor clock is osc/pll /11 +#define SYSCTL_SYSDIV_12 0x05C00000 // Processor clock is osc/pll /12 +#define SYSCTL_SYSDIV_13 0x06400000 // Processor clock is osc/pll /13 +#define SYSCTL_SYSDIV_14 0x06C00000 // Processor clock is osc/pll /14 +#define SYSCTL_SYSDIV_15 0x07400000 // Processor clock is osc/pll /15 +#define SYSCTL_SYSDIV_16 0x07C00000 // Processor clock is osc/pll /16 +#define SYSCTL_USE_PLL 0x00000000 // System clock is the PLL clock +#define SYSCTL_USE_OSC 0x00003800 // System clock is the osc clock +#define SYSCTL_XTAL_3_57MHZ 0x00000100 // External crystal is 3.579545MHz +#define SYSCTL_XTAL_3_68MHZ 0x00000140 // External crystal is 3.6864MHz +#define SYSCTL_XTAL_4MHZ 0x00000180 // External crystal is 4MHz +#define SYSCTL_XTAL_4_09MHZ 0x000001C0 // External crystal is 4.096MHz +#define SYSCTL_XTAL_4_91MHZ 0x00000200 // External crystal is 4.9152MHz +#define SYSCTL_XTAL_5MHZ 0x00000240 // External crystal is 5MHz +#define SYSCTL_XTAL_5_12MHZ 0x00000280 // External crystal is 5.12MHz +#define SYSCTL_XTAL_6MHZ 0x000002C0 // External crystal is 6MHz +#define SYSCTL_XTAL_6_14MHZ 0x00000300 // External crystal is 6.144MHz +#define SYSCTL_XTAL_7_37MHZ 0x00000340 // External crystal is 7.3728MHz +#define SYSCTL_XTAL_8MHZ 0x00000380 // External crystal is 8MHz +#define SYSCTL_XTAL_8_19MHZ 0x000003C0 // External crystal is 8.192MHz +#define SYSCTL_OSC_MAIN 0x00000000 // Oscillator source is main osc +#define SYSCTL_OSC_INT 0x00000010 // Oscillator source is int. osc +#define SYSCTL_OSC_INT4 0x00000020 // Oscillator source is int. osc /4 +#define SYSCTL_INT_OSC_DIS 0x00000002 // Disable internal oscillator +#define SYSCTL_MAIN_OSC_DIS 0x00000001 // Disable main oscillator + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern unsigned long SysCtlSRAMSizeGet(void); +extern unsigned long SysCtlFlashSizeGet(void); +extern tBoolean SysCtlPinPresent(unsigned long ulPin); +extern tBoolean SysCtlPeripheralPresent(unsigned long ulPeripheral); +extern void SysCtlPeripheralReset(unsigned long ulPeripheral); +extern void SysCtlPeripheralEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralSleepEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralSleepDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDeepSleepEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDeepSleepDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralClockGating(tBoolean bEnable); +extern void SysCtlIntRegister(void (*pfnHandler)(void)); +extern void SysCtlIntUnregister(void); +extern void SysCtlIntEnable(unsigned long ulInts); +extern void SysCtlIntDisable(unsigned long ulInts); +extern void SysCtlIntClear(unsigned long ulInts); +extern unsigned long SysCtlIntStatus(tBoolean bMasked); +extern void SysCtlLDOSet(unsigned long ulVoltage); +extern unsigned long SysCtlLDOGet(void); +extern void SysCtlLDOConfigSet(unsigned long ulConfig); +extern void SysCtlReset(void); +extern void SysCtlSleep(void); +extern void SysCtlDeepSleep(void); +extern unsigned long SysCtlResetCauseGet(void); +extern void SysCtlResetCauseClear(unsigned long ulCauses); +extern void SysCtlBrownOutConfigSet(unsigned long ulConfig, + unsigned long ulDelay); +extern void SysCtlClockSet(unsigned long ulConfig); +extern unsigned long SysCtlClockGet(void); +extern void SysCtlPWMClockSet(unsigned long ulConfig); +extern unsigned long SysCtlPWMClockGet(void); +extern void SysCtlADCSpeedSet(unsigned long ulSpeed); +extern unsigned long SysCtlADCSpeedGet(void); +extern void SysCtlIOSCVerificationSet(tBoolean bEnable); +extern void SysCtlMOSCVerificationSet(tBoolean bEnable); +extern void SysCtlPLLVerificationSet(tBoolean bEnable); +extern void SysCtlClkVerificationClear(void); + +#ifdef __cplusplus +} +#endif + +#endif // __SYSCTL_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/systick.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/systick.h new file mode 100644 index 000000000..f89bf65b8 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/systick.h @@ -0,0 +1,55 @@ +//***************************************************************************** +// +// systick.h - Prototypes for the SysTick driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __SYSTICK_H__ +#define __SYSTICK_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void SysTickEnable(void); +extern void SysTickDisable(void); +extern void SysTickIntRegister(void (*pfnHandler)(void)); +extern void SysTickIntUnregister(void); +extern void SysTickIntEnable(void); +extern void SysTickIntDisable(void); +extern void SysTickPeriodSet(unsigned long ulPeriod); +extern unsigned long SysTickPeriodGet(void); +extern unsigned long SysTickValueGet(void); + +#ifdef __cplusplus +} +#endif + +#endif // __SYSTICK_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/uart.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/uart.h new file mode 100644 index 000000000..a0e16db33 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/uart.h @@ -0,0 +1,104 @@ +//***************************************************************************** +// +// uart.h - Defines and Macros for the UART. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __UART_H__ +#define __UART_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to UARTIntEnable, UARTIntDisable, and UARTIntClear +// as the ulIntFlags parameter, and returned from UARTIntStatus. +// +//***************************************************************************** +#define UART_INT_OE 0x400 // Overrun Error Interrupt Mask +#define UART_INT_BE 0x200 // Break Error Interrupt Mask +#define UART_INT_PE 0x100 // Parity Error Interrupt Mask +#define UART_INT_FE 0x080 // Framing Error Interrupt Mask +#define UART_INT_RT 0x040 // Receive Timeout Interrupt Mask +#define UART_INT_TX 0x020 // Transmit Interrupt Mask +#define UART_INT_RX 0x010 // Receive Interrupt Mask + +//***************************************************************************** +// +// Values that can be passed to UARTConfigSet as the ulConfig parameter and +// returned by UARTConfigGet in the pulConfig parameter. Additionally, the +// UART_CONFIG_PAR_* subset can be passed to UARTParityModeSet as the ulParity +// parameter, and are returned by UARTParityModeGet. +// +//***************************************************************************** +#define UART_CONFIG_WLEN_8 0x00000060 // 8 bit data +#define UART_CONFIG_WLEN_7 0x00000040 // 7 bit data +#define UART_CONFIG_WLEN_6 0x00000020 // 6 bit data +#define UART_CONFIG_WLEN_5 0x00000000 // 5 bit data +#define UART_CONFIG_STOP_ONE 0x00000000 // One stop bit +#define UART_CONFIG_STOP_TWO 0x00000008 // Two stop bits +#define UART_CONFIG_PAR_NONE 0x00000000 // No parity +#define UART_CONFIG_PAR_EVEN 0x00000006 // Even parity +#define UART_CONFIG_PAR_ODD 0x00000002 // Odd parity +#define UART_CONFIG_PAR_ONE 0x00000086 // Parity bit is one +#define UART_CONFIG_PAR_ZERO 0x00000082 // Parity bit is zero + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void UARTParityModeSet(unsigned long ulBase, unsigned long ulParity); +extern unsigned long UARTParityModeGet(unsigned long ulBase); +extern void UARTConfigSet(unsigned long ulBase, unsigned long ulBaud, + unsigned long ulConfig); +extern void UARTConfigGet(unsigned long ulBase, unsigned long *pulBaud, + unsigned long *pulConfig); +extern void UARTEnable(unsigned long ulBase); +extern void UARTDisable(unsigned long ulBase); +extern void UARTEnableSIR(unsigned long ulBase, tBoolean bLowPower); +extern void UARTDisableSIR(unsigned long ulBase); +extern tBoolean UARTCharsAvail(unsigned long ulBase); +extern tBoolean UARTSpaceAvail(unsigned long ulBase); +extern long UARTCharNonBlockingGet(unsigned long ulBase); +extern long UARTCharGet(unsigned long ulBase); +extern tBoolean UARTCharNonBlockingPut(unsigned long ulBase, + unsigned char ucData); +extern void UARTCharPut(unsigned long ulBase, unsigned char ucData); +extern void UARTBreakCtl(unsigned long ulBase, tBoolean bBreakState); +extern void UARTIntRegister(unsigned long ulBase, void(*pfnHandler)(void)); +extern void UARTIntUnregister(unsigned long ulBase); +extern void UARTIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void UARTIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long UARTIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void UARTIntClear(unsigned long ulBase, unsigned long ulIntFlags); + +#ifdef __cplusplus +} +#endif + +#endif // __UART_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/ustdlib.c b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/ustdlib.c new file mode 100644 index 000000000..35de3580a --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/ustdlib.c @@ -0,0 +1,620 @@ +//***************************************************************************** +// +// ustdlib.c - Simple standard library functions. +// +// Copyright (c) 2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +//***************************************************************************** + +#include +#include +#include "debug.h" + +//***************************************************************************** +// +//! \addtogroup utilities_api +//! @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// A mapping from an integer between 0 and 15 to its ASCII character +// equivalent. +// +//***************************************************************************** +static const char * const g_pcHex = "0123456789abcdef"; + +//***************************************************************************** +// +//! A simple sprintf function supporting \%c, \%d, \%s, \%u, \%x, and \%X. +//! +//! \param pcBuf is the buffer where the converted string is stored. +//! \param pcString is the format string. +//! \param ... are the optional arguments, which depend on the contents of the +//! format string. +//! +//! This function is very similar to the C library sprintf() function. +//! Only the following formatting characters are supported: +//! +//! - \%c to print a character +//! - \%d to print a decimal value +//! - \%s to print a string +//! - \%u to print an unsigned decimal value +//! - \%x to print a hexadecimal value using lower case letters +//! - \%X to print a hexadecimal value using lower case letters (not upper case +//! letters as would typically be used) +//! - \%\% to print out a \% character +//! +//! For \%d, \%u, \%x, and \%X, an optional number may reside between the \% +//! and the format character, which specifies the minimum number of characters +//! to use for that value; if preceeded by a 0 then the extra characters will +//! be filled with zeros instead of spaces. For example, ``\%8d'' will use +//! eight characters to print the decimal value with spaces added to reach +//! eight; ``\%08d'' will use eight characters as well but will add zeros +//! instead of spaces. +//! +//! The type of the arguments after \b pcString must match the requirements of +//! the format string. For example, if an integer was passed where a string +//! was expected, an error of some kind will most likely occur. +//! +//! The caller must ensure that the buffer pcBuf is large enough to hold the +//! entire converted string, including the null termination character. +//! +//! \return None. +// +//***************************************************************************** +int +uvsnprintf(char *pcBuf, unsigned long ulSize, const char *pcString, + va_list vaArgP) +{ + unsigned long ulIdx, ulValue, ulPos, ulCount, ulBase; + char *pcStr, cFill, *pcOriginalBuf = pcBuf; + + // + // Check the arguments. + // + ASSERT(pcString != 0); + ASSERT(pcBuf != 0); + ASSERT(ulSize != 0); + + // + // Adjust buffer size limit to allow one space for null termination. + // + if(ulSize) + { + ulSize--; + } + + // + // Loop while there are more characters in the string, and + // there is more room in the destination buffer. + // + while(*pcString && ulSize) + { + // + // Find the first non-% character, or the end of the string. + // + for(ulIdx = 0; (pcString[ulIdx] != '%') && (pcString[ulIdx] != '\0'); + ulIdx++) + { + } + + // + // Limit the number of characters that can be copied to the + // space remaining in the buffer. + // + if(ulIdx > ulSize) + { + ulIdx = ulSize; + } + + // + // Write this portion of the string and update the buffer pointer. + // + strncpy(pcBuf, pcString, ulIdx); + pcBuf += ulIdx; + + // + // Update the size limit, and check to see if the buffer + // limit is reached. + // + ulSize -= ulIdx; + if(ulSize == 0) + { + break; + } + + // + // Skip the portion of the string that was written. + // + pcString += ulIdx; + + // + // See if the next character is a %. + // + if(*pcString == '%') + { + // + // Skip the %. + // + pcString++; + + // + // Set the digit count to zero, and the fill character to space + // (i.e. to the defaults). + // + ulCount = 0; + cFill = ' '; + + // + // It may be necessary to get back here to process more characters. + // Goto's aren't pretty, but effective. I feel extremely dirty for + // using not one but two of the beasts. + // +again: + + // + // Determine how to handle the next character. + // + switch(*pcString++) + { + // + // Handle the digit characters. + // + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + // + // If this is a zero, and it is the first digit, then the + // fill character is a zero instead of a space. + // + if((pcString[-1] == '0') && (ulCount == 0)) + { + cFill = '0'; + } + + // + // Update the digit count. + // + ulCount *= 10; + ulCount += pcString[-1] - '0'; + + // + // Get the next character. + // + goto again; + } + + // + // Handle the %c command. + // + case 'c': + { + // + // Get the value from the varargs. + // + ulValue = va_arg(vaArgP, unsigned long); + + // + // Print out the character. + // + *pcBuf++ = (char)ulValue; + + // + // Decrement the buffer limit. + // + ulSize--; + + // + // This command has been handled. + // + break; + } + + // + // Handle the %d command. + // + case 'd': + { + // + // Get the value from the varargs. + // + ulValue = va_arg(vaArgP, unsigned long); + + // + // Reset the buffer position. + // + ulPos = 0; + + // + // If the value is negative, make it positive and stick a + // minus sign in the beginning of the buffer. + // + if((long)ulValue < 0) + { + *pcBuf++ = '-'; + ulPos++; + ulValue = -(long)ulValue; + + // + // Decrement the buffer size limit and check + // if the limit is reached. + // + ulSize--; + if(ulSize == 0) + { + break; + } + } + + // + // Set the base to 10. + // + ulBase = 10; + + // + // Convert the value to ASCII. + // + goto convert; + } + + // + // Handle the %s command. + // + case 's': + { + // + // Get the string pointer from the varargs. + // + pcStr = va_arg(vaArgP, char *); + + // + // Determine the length of the string. + // + for(ulIdx = 0; pcStr[ulIdx] != '\0'; ulIdx++) + { + } + + // + // Limit the number of characters that can be copied to the + // space remaining in the buffer. + // + if(ulIdx > ulSize) + { + ulIdx = ulSize; + } + + // + // Write the string and update the buffer pointer. + // + strncpy(pcBuf, pcStr, ulIdx); + pcBuf += ulIdx; + + // + // Decrement the buffer size limit. + // + ulSize -= ulIdx; + + // + // + // This command has been handled. + // + break; + } + + // + // Handle the %u command. + // + case 'u': + { + // + // Get the value from the varargs. + // + ulValue = va_arg(vaArgP, unsigned long); + + // + // Reset the buffer position. + // + ulPos = 0; + + // + // Set the base to 10. + // + ulBase = 10; + + // + // Convert the value to ASCII. + // + goto convert; + } + + // + // Handle the %x and %X commands. Note that they are treated + // identically; i.e. %X will use lower case letters for a-f + // instead of the upper case letters is should use. + // + case 'x': + case 'X': + { + // + // Get the value from the varargs. + // + ulValue = va_arg(vaArgP, unsigned long); + + // + // Reset the buffer position. + // + ulPos = 0; + + // + // Set the base to 16. + // + ulBase = 16; + + // + // Determine the number of digits in the string version of + // the value. + // +convert: + for(ulIdx = 1; + (((ulIdx * ulBase) <= ulValue) && + (((ulIdx * ulBase) / ulBase) == ulIdx)); + ulIdx *= ulBase, ulCount--) + { + } + + // + // Provide additional padding at the beginning of the + // string conversion if needed. + // + if((ulCount > 1) && (ulCount < 16)) + { + for(ulCount--; ulCount; ulCount--) + { + *pcBuf++ = cFill; + ulPos++; + + // + // Decrement buffer size and check to see if + // buffer limit is reached. + // + ulSize--; + if(ulSize == 0) + { + break; + } + } + } + + // + // Convert the value into a string. + // + for(; ulIdx; ulIdx /= ulBase) + { + *pcBuf++ = g_pcHex[(ulValue / ulIdx) % ulBase]; + ulPos++; + + // + // Decrement buffer size and check to see if + // buffer limit is reached. + // + ulSize--; + if(ulSize == 0) + { + break; + } + } + + // + // This command has been handled. + // + break; + } + + // + // Handle the %% command. + // + case '%': + { + // + // Simply write a single %. + // + *pcBuf++ = pcString[-1]; + ulSize--; + + // + // This command has been handled. + // + break; + } + + // + // Handle all other commands. + // + default: + { + // + // Indicate an error. + // + if(ulSize > 5) + { + strncpy(pcBuf, "ERROR", 5); + pcBuf += 5; + ulSize -= 5; + } + + // + // This command has been handled. + // + break; + } + } + } + } + + // + // Null terminate the string in the buffer. + // + *pcBuf = 0; + return ( int ) pcBuf - ( int ) pcOriginalBuf; +} + +//***************************************************************************** +// +//! A simple sprintf function supporting \%c, \%d, \%s, \%u, \%x, and \%X. +//! +//! \param pcBuf is the buffer where the converted string is stored. +//! \param pcString is the format string. +//! \param ... are the optional arguments, which depend on the contents of the +//! format string. +//! +//! This function is very similar to the C library sprintf() function. +//! Only the following formatting characters are supported: +//! +//! - \%c to print a character +//! - \%d to print a decimal value +//! - \%s to print a string +//! - \%u to print an unsigned decimal value +//! - \%x to print a hexadecimal value using lower case letters +//! - \%X to print a hexadecimal value using lower case letters (not upper case +//! letters as would typically be used) +//! - \%\% to print out a \% character +//! +//! For \%d, \%u, \%x, and \%X, an optional number may reside between the \% +//! and the format character, which specifies the minimum number of characters +//! to use for that value; if preceeded by a 0 then the extra characters will +//! be filled with zeros instead of spaces. For example, ``\%8d'' will use +//! eight characters to print the decimal value with spaces added to reach +//! eight; ``\%08d'' will use eight characters as well but will add zeros +//! instead of spaces. +//! +//! The type of the arguments after \b pcString must match the requirements of +//! the format string. For example, if an integer was passed where a string +//! was expected, an error of some kind will most likely occur. +//! +//! The caller must ensure that the buffer pcBuf is large enough to hold the +//! entire converted string, including the null termination character. +//! +//! \return None. +// +//***************************************************************************** +void +usprintf(char *pcBuf, const char *pcString, ...) +{ + va_list vaArgP; + + // + // Start the varargs processing. + // + va_start(vaArgP, pcString); + + // + // Call vsnprintf to perform the conversion. Use a + // large number for the buffer size. + // + uvsnprintf(pcBuf, 0xffff, pcString, vaArgP); + + // + // End the varargs processing. + // + va_end(vaArgP); +} + +//***************************************************************************** +// +//! A simple snprintf function supporting \%c, \%d, \%s, \%u, \%x, and \%X. +//! +//! \param pcBuf is the buffer where the converted string is stored. +//! \param ulSize is the size of the buffer. +//! \param pcString is the format string. +//! \param ... are the optional arguments, which depend on the contents of the +//! format string. +//! +//! This function is very similar to the C library sprintf() function. +//! Only the following formatting characters are supported: +//! +//! - \%c to print a character +//! - \%d to print a decimal value +//! - \%s to print a string +//! - \%u to print an unsigned decimal value +//! - \%x to print a hexadecimal value using lower case letters +//! - \%X to print a hexadecimal value using lower case letters (not upper case +//! letters as would typically be used) +//! - \%\% to print out a \% character +//! +//! For \%d, \%u, \%x, and \%X, an optional number may reside between the \% +//! and the format character, which specifies the minimum number of characters +//! to use for that value; if preceeded by a 0 then the extra characters will +//! be filled with zeros instead of spaces. For example, ``\%8d'' will use +//! eight characters to print the decimal value with spaces added to reach +//! eight; ``\%08d'' will use eight characters as well but will add zeros +//! instead of spaces. +//! +//! The type of the arguments after \b pcString must match the requirements of +//! the format string. For example, if an integer was passed where a string +//! was expected, an error of some kind will most likely occur. +//! +//! The function will copy at most \b ulSize - 1 characters into the +//! buffer \b pcBuf. One space is reserved in the buffer for the null +//! termination character. +//! +//! \return None. +// +//***************************************************************************** +int +usnprintf(char *pcBuf, unsigned long ulSize, const char *pcString, ...) +{ +int iReturn; + + va_list vaArgP; + + // + // Start the varargs processing. + // + va_start(vaArgP, pcString); + + // + // Call vsnprintf to perform the conversion. + // + iReturn = uvsnprintf(pcBuf, ulSize, pcString, vaArgP); + + // + // End the varargs processing. + // + va_end(vaArgP); + + return iReturn; +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/ustdlib.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/ustdlib.h new file mode 100644 index 000000000..f950d8173 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/ustdlib.h @@ -0,0 +1,46 @@ +//***************************************************************************** +// +// uartstdlib.h - Prototypes for simple standard library functions. +// +// Copyright (c) 2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// +//***************************************************************************** + +#ifndef __UARTSTDLIB_H__ +#define __UARTSTDLIB_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void usprintf(char *, const char *pcString, ...); + +#ifdef __cplusplus +} +#endif + +#endif // __UARTSTDLIB_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/watchdog.h b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/watchdog.h new file mode 100644 index 000000000..2d0ad37a0 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/LuminaryDrivers/watchdog.h @@ -0,0 +1,63 @@ +//***************************************************************************** +// +// watchdog.h - Prototypes for the Watchdog Timer API +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __WATCHDOG_H__ +#define __WATCHDOG_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern tBoolean WatchdogRunning(unsigned long ulBase); +extern void WatchdogEnable(unsigned long ulBase); +extern void WatchdogResetEnable(unsigned long ulBase); +extern void WatchdogResetDisable(unsigned long ulBase); +extern void WatchdogLock(unsigned long ulBase); +extern void WatchdogUnlock(unsigned long ulBase); +extern tBoolean WatchdogLockState(unsigned long ulBase); +extern void WatchdogReloadSet(unsigned long ulBase, unsigned long ulLoadVal); +extern unsigned long WatchdogReloadGet(unsigned long ulBase); +extern unsigned long WatchdogValueGet(unsigned long ulBase); +extern void WatchdogIntRegister(unsigned long ulBase, void(*pfnHandler)(void)); +extern void WatchdogIntUnregister(unsigned long ulBase); +extern void WatchdogIntEnable(unsigned long ulBase); +extern unsigned long WatchdogIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void WatchdogIntClear(unsigned long ulBase); +extern void WatchdogStallDisable(unsigned long ulBase); +extern void WatchdogStallDisable(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __WATCHDOG_H__ diff --git a/Demo/CORTEX_LM3S6965_GCC/Makefile b/Demo/CORTEX_LM3S6965_GCC/Makefile new file mode 100644 index 000000000..e2460af75 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/Makefile @@ -0,0 +1,101 @@ +#****************************************************************************** +# +# Makefile - Rules for building the driver library and examples. +# +# Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +# +# Software License Agreement +# +# Luminary Micro, Inc. (LMI) is supplying this software for use solely and +# exclusively on LMI's Stellaris Family of microcontroller products. +# +# The software is owned by LMI and/or its suppliers, and is protected under +# applicable copyright laws. All rights are reserved. Any use in violation +# of the foregoing restrictions may subject the user to criminal sanctions +# under applicable laws, as well as to civil liability for the breach of the +# terms and conditions of this license. +# +# THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +# OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +# LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +# CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +# +#****************************************************************************** + +include makedefs + +RTOS_SOURCE_DIR=../../Source +DEMO_SOURCE_DIR=../Common/Minimal +UIP_SOURCE_DIR=../Common/ethernet/uIP/uip-1.0/uip + +CFLAGS+=-I LuminaryDrivers -I . -I ${RTOS_SOURCE_DIR}/include -I ${RTOS_SOURCE_DIR}/portable/GCC/ARM_CM3 -I ${UIP_SOURCE_DIR} -I webserver -I ../Common/include -D GCC_ARMCM3_LM3S102 -D inline= -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -D sprintf=usprintf -D snprintf=usnprintf -D printf=uipprintf + +VPATH=${RTOS_SOURCE_DIR}:${RTOS_SOURCE_DIR}/portable/MemMang:${RTOS_SOURCE_DIR}/portable/GCC/ARM_CM3:${DEMO_SOURCE_DIR}:${UIP_SOURCE_DIR}:init:LuminaryDrivers:ParTest:webserver + +OBJS=${COMPILER}/main.o \ + ${COMPILER}/list.o \ + ${COMPILER}/queue.o \ + ${COMPILER}/tasks.o \ + ${COMPILER}/port.o \ + ${COMPILER}/heap_2.o \ + ${COMPILER}/BlockQ.o \ + ${COMPILER}/PollQ.o \ + ${COMPILER}/integer.o \ + ${COMPILER}/semtest.o \ + ${COMPILER}/osram128x64x4.o \ + ${COMPILER}/ustdlib.o \ + ${COMPILER}/blocktim.o \ + ${COMPILER}/death.o \ + ${COMPILER}/ParTest.o \ + ${COMPILER}/timertest.o \ + ${COMPILER}/emac.o \ + ${COMPILER}/http-strings.o \ + ${COMPILER}/httpd-cgi.o \ + ${COMPILER}/httpd-fs.o \ + ${COMPILER}/httpd.o \ + ${COMPILER}/psock.o \ + ${COMPILER}/timer.o \ + ${COMPILER}/uip.o \ + ${COMPILER}/uip_arp.o \ + ${COMPILER}/uIP_Task.o + +INIT_OBJS= ${COMPILER}/startup.o + +LIBS= LuminaryDrivers/libdriver.a + + +# +# The default rule, which causes init to be built. +# +all: ${COMPILER} \ + ${COMPILER}/RTOSDemo.axf \ + +# +# The rule to clean out all the build products +# + +clean: + @rm -rf ${COMPILER} ${wildcard *.bin} RTOSDemo.axf + +# +# The rule to create the target directory +# +${COMPILER}: + @mkdir ${COMPILER} + +${COMPILER}/RTOSDemo.axf: ${INIT_OBJS} ${OBJS} ${LIBS} +SCATTER_RTOSDemo=standalone.ld +ENTRY_RTOSDemo=ResetISR + +# +# +# Include the automatically generated dependency files. +# +-include ${wildcard ${COMPILER}/*.d} __dummy__ + + + + + + diff --git a/Demo/CORTEX_LM3S6965_GCC/ParTest/ParTest.c b/Demo/CORTEX_LM3S6965_GCC/ParTest/ParTest.c new file mode 100644 index 000000000..f16ae6291 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/ParTest/ParTest.c @@ -0,0 +1,83 @@ +/* + FreeRTOS.org V4.3.0 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + + Also see http://www.SafeRTOS.com for an IEC 61508 compliant version along + with commercial development and support options. + *************************************************************************** +*/ + +/*----------------------------------------------------------- + * Simple parallel port IO routines. + *-----------------------------------------------------------*/ + +/* +*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Demo includes. */ +#include "partest.h" + +/* Library includes. */ +#include "hw_types.h" +#include "gpio.h" +#include "hw_memmap.h" + + +/*-----------------------------------------------------------*/ + +void vParTestInitialise( void ) +{ + GPIODirModeSet( GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_DIR_MODE_OUT ); + GPIOPadConfigSet( GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD ); + GPIOPinWrite( GPIO_PORTF_BASE, GPIO_PIN_0, 0 ); +} +/*-----------------------------------------------------------*/ + +void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue ) +{ + /* There is only one LED. */ + ( void ) uxLED; + + GPIOPinWrite( GPIO_PORTF_BASE, GPIO_PIN_0, xValue ); +} +/*-----------------------------------------------------------*/ + +unsigned portBASE_TYPE uxParTestGetLED( unsigned portBASE_TYPE uxLED ) +{ + /* There is only one LED. */ + ( void ) uxLED; + + return GPIOPinRead( GPIO_PORTF_BASE, GPIO_PIN_0 ); +} + + diff --git a/Demo/CORTEX_LM3S6965_GCC/bitmap.h b/Demo/CORTEX_LM3S6965_GCC/bitmap.h new file mode 100644 index 000000000..02ce0b365 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/bitmap.h @@ -0,0 +1,171 @@ +#ifndef BITMAP_H +#define BITMAP_H + +const unsigned char pucImage[] = +{ +0x00, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0x00, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa0, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, +0x00, 0x8f, 0xff, 0xff, 0xf8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x88, 0x88, 0x88, +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x78, 0x8f, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x88, 0x77, 0x77, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xf0, 0x00, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, +0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x08, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, +0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0x00, 0x8f, 0x00, 0xff, +0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x78, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x07, +0x00, 0x70, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, +0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0x88, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x07, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf8, +0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x8f, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0x87, 0x77, +0x77, 0x77, 0x78, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x88, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf8, 0x87, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, +0x78, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xff, 0x80, 0x00, 0x8f, 0x8f, 0xff, 0x87, 0x77, 0x77, 0x77, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, +0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x8f, 0x07, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, +0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x07, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, +0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0f, 0x00, 0x8f, 0x00, 0xff, +0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, +0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, +0x78, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x70, 0x08, 0x00, 0x88, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x88, 0x88, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, +0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x70, 0x07, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x87, 0x88, +0x88, 0x8f, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x7f, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf7, 0x88, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf7, +0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x88, 0x88, 0x88, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0x87, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, +0x00, 0x00, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, +0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x07, 0xff, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xff, 0xff, 0x88, 0x88, 0x88, 0x88, +0xff, 0xff, 0xff, 0xff, 0x88, 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x87, 0x77, 0x77, 0x77, +0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0x00, 0x0f, 0x70, 0x08, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0x00, 0x07, 0x70, 0x07, +0x88, 0x88, 0x88, 0xff, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x70, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x08, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x08, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa0, 0x00, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, +0x00 }; + +#define bmpBITMAP_HEIGHT 50 +#define bmpBITMAP_WIDTH 128 + +#endif diff --git a/Demo/CORTEX_LM3S6965_GCC/lcd_message.h b/Demo/CORTEX_LM3S6965_GCC/lcd_message.h new file mode 100644 index 000000000..ced7a1dbc --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/lcd_message.h @@ -0,0 +1,9 @@ +#ifndef LCD_MESSAGE_H +#define LCD_MESSAGE_H + +typedef struct +{ + char *pcMessage; +} xOLEDMessage; + +#endif /* LCD_MESSAGE_H */ diff --git a/Demo/CORTEX_LM3S6965_GCC/main.c b/Demo/CORTEX_LM3S6965_GCC/main.c new file mode 100644 index 000000000..a95b43107 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/main.c @@ -0,0 +1,331 @@ +/* + FreeRTOS.org V4.3.0 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + *************************************************************************** +*/ + + +/* + * Creates all the demo application tasks, then starts the scheduler. The WEB + * documentation provides more details of the standard demo application tasks. + * In addition to the standard demo tasks, the following tasks and tests are + * defined and/or created within this file: + * + * "Fast Interrupt Test" - A high frequency periodic interrupt is generated + * using a free running timer to demonstrate the use of the + * configKERNEL_INTERRUPT_PRIORITY configuration constant. The interrupt + * service routine measures the number of processor clocks that occur between + * each interrupt - and in so doing measures the jitter in the interrupt timing. + * The maximum measured jitter time is latched in the ulMaxJitter variable, and + * displayed on the OLED display by the 'Check' task as described below. The + * fast interrupt is configured and handled in the timertest.c source file. + * + * "OLED" task - the OLED task is a 'gatekeeper' task. It is the only task that + * is permitted to access the display directly. Other tasks wishing to write a + * message to the OLED send the message on a queue to the OLED task instead of + * accessing the OLED themselves. The OLED task just blocks on the queue waiting + * for messages - waking and displaying the messages as they arrive. + * + * "Check" task - This only executes every five seconds but has the highest + * priority so is guaranteed to get processor time. Its main function is to + * check that all the standard demo tasks are still operational. Should any + * unexpected behaviour within a demo task be discovered the 'check' task will + * write an error to the OLED (via the OLED task). If all the demo tasks are + * executing with their expected behaviour then the check task writes PASS + * along with the max jitter time to the OLED (again via the OLED task), as + * described above. + * + * "uIP" task - This is the task that handles the uIP stack. All TCP/IP + * processing is performed in this task. + */ + + + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "Task.h" +#include "queue.h" +#include "semphr.h" + +/* Demo app includes. */ +#include "BlockQ.h" +#include "death.h" +#include "integer.h" +#include "blocktim.h" +#include "flash.h" +#include "partest.h" +#include "semtest.h" +#include "pollq.h" +#include "lcd_message.h" +#include "bitmap.h" + +/* Hardware library includes. */ +#include "hw_memmap.h" +#include "hw_types.h" +#include "sysctl.h" +#include "gpio.h" +#include "osram128x64x4.h" + +/*-----------------------------------------------------------*/ + +/* The time between cycles of the 'check' task. */ +#define mainCHECK_DELAY ( ( portTickType ) 5000 / portTICK_RATE_MS ) + +/* Size of the stack allocated to the uIP task. */ +#define mainBASIC_WEB_STACK_SIZE ( configMINIMAL_STACK_SIZE * 2 ) + +/* The check task uses the sprintf function so requires a little more stack too. */ +#define mainCHECK_TASK_STACK_SIZE ( configMINIMAL_STACK_SIZE + 50 ) + +/* Task priorities. */ +#define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2 ) +#define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 ) +#define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 ) +#define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 ) +#define mainCREATOR_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 ) +#define mainINTEGER_TASK_PRIORITY ( tskIDLE_PRIORITY ) + +/* The maximum number of message that can be waiting for display at any one +time. */ +#define mainOLED_QUEUE_SIZE ( 3 ) + +/* Dimensions the buffer into which the jitter time is written. */ +#define mainMAX_MSG_LEN 25 + +/* The period of the system clock in nano seconds. This is used to calculate +the jitter time in nano seconds. */ +#define mainNS_PER_CLOCK ( ( unsigned portLONG ) ( ( 1.0 / ( double ) configCPU_CLOCK_HZ ) * 1000000000.0 ) ) + +/* Constants used when writing strings to the display. */ +#define mainCHARACTER_HEIGHT ( 9 ) +#define mainMAX_ROWS ( mainCHARACTER_HEIGHT * 7 ) +#define mainFULL_SCALE ( 15 ) +#define ulSSI_FREQUENCY 1000000 + +/*-----------------------------------------------------------*/ + +/* + * Checks the status of all the demo tasks then prints a message to the + * display. The message will be either PASS - an include in brackets the + * maximum measured jitter time (as described at the to of the file), or a + * message that describes which of the standard demo tasks an error has been + * discovered in. + * + * Messages are not written directly to the terminal, but passed to vOLEDTask + * via a queue. + */ +static void vCheckTask( void *pvParameters ); + +/* + * The task that handles the uIP stack. All TCP/IP processing is performed in + * this task. + */ +extern void vuIP_Task( void *pvParameters ); + +/* + * The display is written two by more than one task so is controlled by a + * 'gatekeeper' task. This is the only task that is actually permitted to + * access the display directly. Other tasks wanting to display a message send + * the message to the gatekeeper. + */ +static void vOLEDTask( void *pvParameters ); + +/* + * Configure the hardware for the demo. + */ +static void prvSetupHardware( void ); + +/* + * Configures the high frequency timers - those used to measure the timing + * jitter while the real time kernel is executing. + */ +extern void vSetupTimer( void ); + +/*-----------------------------------------------------------*/ + +/* The queue used to send messages to the OLED task. */ +xQueueHandle xOLEDQueue; + +/* The welcome text. */ +const portCHAR * const pcWelcomeMessage = " www.FreeRTOS.org"; + +/*-----------------------------------------------------------*/ + +int main( void ) +{ + prvSetupHardware(); + + /* Create the queue used by the OLED task. Messages for display on the OLED + are received via this queue. */ + xOLEDQueue = xQueueCreate( mainOLED_QUEUE_SIZE, sizeof( xOLEDMessage ) ); + + /* Create the uIP task. */ + xTaskCreate( vuIP_Task, ( signed portCHAR * ) "uIP", mainBASIC_WEB_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY - 1, NULL ); + + /* Start the standard demo tasks. */ + vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY ); + vCreateBlockTimeTasks(); + vStartSemaphoreTasks( mainSEM_TEST_PRIORITY ); + vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY ); + vStartIntegerMathTasks( mainINTEGER_TASK_PRIORITY ); + + /* Start the tasks defined within this file/specific to this demo. */ + xTaskCreate( vCheckTask, ( signed portCHAR * ) "Check", mainCHECK_TASK_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL ); + xTaskCreate( vOLEDTask, ( signed portCHAR * ) "OLED", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL ); + + /* The suicide tasks must be created last as they need to know how many + tasks were running prior to their creation in order to ascertain whether + or not the correct/expected number of tasks are running at any given time. */ + vCreateSuicidalTasks( mainCREATOR_TASK_PRIORITY ); + + /* Configure the high frequency interrupt used to measure the interrupt + jitter time. */ + #ifdef __ICCARM__ + vSetupTimer(); + #endif + + /* Start the scheduler. */ + vTaskStartScheduler(); + + /* Will only get here if there was insufficient memory to create the idle + task. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void prvSetupHardware( void ) +{ + /* Set the clocking to run from the PLL at 50 MHz */ + SysCtlClockSet( SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ ); + + /* Enable/Reset the Ethernet Controller */ + SysCtlPeripheralEnable( SYSCTL_PERIPH_ETH ); + SysCtlPeripheralReset( SYSCTL_PERIPH_ETH ); + + /* Enable Port F for Ethernet LEDs + LED0 Bit 3 Output + LED1 Bit 2 Output */ + SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOF ); + GPIODirModeSet( GPIO_PORTF_BASE, (GPIO_PIN_2 | GPIO_PIN_3), GPIO_DIR_MODE_HW ); + GPIOPadConfigSet( GPIO_PORTF_BASE, (GPIO_PIN_2 | GPIO_PIN_3 ), GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD ); + + vParTestInitialise(); +} +/*-----------------------------------------------------------*/ + +static void vCheckTask( void *pvParameters ) +{ +portTickType xLastExecutionTime; +xOLEDMessage xMessage; +static portCHAR cPassMessage[ mainMAX_MSG_LEN ]; +extern unsigned portLONG ulMaxJitter; + + xLastExecutionTime = xTaskGetTickCount(); + xMessage.pcMessage = cPassMessage; + + for( ;; ) + { + /* Perform this check every mainCHECK_DELAY milliseconds. */ + vTaskDelayUntil( &xLastExecutionTime, mainCHECK_DELAY ); + + /* Has an error been found in any task? */ + + if( xAreBlockingQueuesStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN BLOCK Q"; + } + else if( xAreBlockTimeTestTasksStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN BLOCK TIME"; + } + else if( xAreSemaphoreTasksStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN SEMAPHORE"; + } + else if( xArePollingQueuesStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN POLL Q"; + } + else if( xIsCreateTaskStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN CREATE"; + } + else if( xAreIntegerMathsTaskStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN MATH"; + } + else + { + #ifdef __ICCARM__ + sprintf( cPassMessage, "PASS [%uns]", ulMaxJitter * mainNS_PER_CLOCK ); + #else + sprintf( cPassMessage, "PASS" ); + #endif + } + + /* Send the message to the OLED gatekeeper for display. */ + xQueueSend( xOLEDQueue, &xMessage, portMAX_DELAY ); + } +} +/*-----------------------------------------------------------*/ + + + +void vOLEDTask( void *pvParameters ) +{ +xOLEDMessage xMessage; +unsigned portLONG ulY = mainMAX_ROWS; + + /* Initialise the OLED and display a startup message. */ + OSRAM128x64x4Init( ulSSI_FREQUENCY ); + + OSRAM128x64x4StringDraw( " POWERED BY FreeRTOS", 0, 0, mainFULL_SCALE ); + OSRAM128x64x4ImageDraw( pucImage, 0, mainCHARACTER_HEIGHT + 1, bmpBITMAP_WIDTH, bmpBITMAP_HEIGHT ); + + for( ;; ) + { + /* Wait for a message to arrive that requires displaying. */ + xQueueReceive( xOLEDQueue, &xMessage, portMAX_DELAY ); + + /* Write the message on the next available row. */ + ulY += mainCHARACTER_HEIGHT; + if( ulY >= mainMAX_ROWS ) + { + ulY = mainCHARACTER_HEIGHT; + OSRAM128x64x4Clear(); + OSRAM128x64x4StringDraw( pcWelcomeMessage, 0, 0, mainFULL_SCALE ); + } + + /* Display the message. */ + OSRAM128x64x4StringDraw( xMessage.pcMessage, 0, ulY, mainFULL_SCALE ); + } +} diff --git a/Demo/CORTEX_LM3S6965_GCC/makedefs b/Demo/CORTEX_LM3S6965_GCC/makedefs new file mode 100644 index 000000000..efd7530d4 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/makedefs @@ -0,0 +1,208 @@ +#****************************************************************************** +# +# makedefs - Definitions common to all makefiles. +# +# Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +# +# Software License Agreement +# +# Luminary Micro, Inc. (LMI) is supplying this software for use solely and +# exclusively on LMI's Stellaris Family of microcontroller products. +# +# The software is owned by LMI and/or its suppliers, and is protected under +# applicable copyright laws. All rights are reserved. Any use in violation +# of the foregoing restrictions may subject the user to criminal sanctions +# under applicable laws, as well as to civil liability for the breach of the +# terms and conditions of this license. +# +# THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +# OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +# LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +# CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +# +#****************************************************************************** + +#****************************************************************************** +# +# Get the operating system name. If this is Cygwin, the .d files will be +# munged to convert c: into /cygdrive/c so that "make" will be happy with the +# auto-generated dependencies. +# +#****************************************************************************** +os:=${shell uname -s} + +#****************************************************************************** +# +# The compiler to be used. +# +#****************************************************************************** +ifndef COMPILER +COMPILER=gcc +endif + +#****************************************************************************** +# +# The debugger to be used. +# +#****************************************************************************** +ifndef DEBUGGER +DEBUGGER=gdb +endif + +#****************************************************************************** +# +# Definitions for using GCC. +# +#****************************************************************************** +ifeq (${COMPILER}, gcc) + +# +# The command for calling the compiler. +# +CC=arm-stellaris-eabi-gcc + +# +# The flags passed to the assembler. +# +AFLAGS=-mthumb \ + -mcpu=cortex-m3 \ + -MD + +# +# The flags passed to the compiler. +# +CFLAGS=-mthumb \ + -mcpu=cortex-m3 \ + -O2 \ + -MD + +# +# The command for calling the library archiver. +# +AR=arm-stellaris-eabi-ar + +# +# The command for calling the linker. +# +LD=arm-stellaris-eabi-ld + +# +# The flags passed to the linker. +# +LDFLAGS= -Map gcc/out.map + +# +# Get the location of libgcc.a from the GCC front-end. +# +LIBGCC=${shell ${CC} -mthumb -march=armv6t2 -print-libgcc-file-name} + +# +# Get the location of libc.a from the GCC front-end. +# +LIBC=${shell ${CC} -mthumb -march=armv6t2 -print-file-name=libc.a} + +# +# The command for extracting images from the linked executables. +# +OBJCOPY=arm-stellaris-eabi-objcopy + +endif + +#****************************************************************************** +# +# Tell the compiler to include debugging information if the DEBUG environment +# variable is set. +# +#****************************************************************************** +ifdef DEBUG +CFLAGS += -g +endif + +#****************************************************************************** +# +# The rule for building the object file from each C source file. +# +#****************************************************************************** +${COMPILER}/%.o: %.c + @if [ 'x${VERBOSE}' = x ]; \ + then \ + echo " CC ${<}"; \ + else \ + echo ${CC} ${CFLAGS} -D${COMPILER} -o ${@} -c ${<}; \ + fi + @${CC} ${CFLAGS} -D${COMPILER} -o ${@} -c ${<} +ifeq (${COMPILER}, rvds) + @mv -f ${notdir ${@:.o=.d}} ${COMPILER} +endif +ifneq ($(findstring CYGWIN, ${os}), ) + @perl -i.bak -p -e 's/[Cc]:/\/cygdrive\/c/g' ${@:.o=.d} +endif + +#****************************************************************************** +# +# The rule for building the object file from each assembly source file. +# +#****************************************************************************** +${COMPILER}/%.o: %.S + @if [ 'x${VERBOSE}' = x ]; \ + then \ + echo " CC ${<}"; \ + else \ + echo ${CC} ${AFLAGS} -D${COMPILER} -o ${@} -c ${<}; \ + fi +ifeq (${COMPILER}, rvds) + @${CC} ${AFLAGS} -D${COMPILER} -E ${<} > ${@:.o=_.S} + @${CC} ${AFLAGS} -o ${@} -c ${@:.o=_.S} + @rm ${@:.o=_.S} + @${CC} ${AFLAGS} -D${COMPILER} --md -E ${<} + @sed 's,,${@},g' ${notdir ${<:.S=.d}} > ${@:.o=.d} + @rm ${notdir ${<:.S=.d}} +endif +ifeq (${COMPILER}, gcc) + @${CC} ${AFLAGS} -D${COMPILER} -o ${@} -c ${<} +endif +ifneq ($(findstring CYGWIN, ${os}), ) + @perl -i.bak -p -e 's/[Cc]:/\/cygdrive\/c/g' ${@:.o=.d} +endif + +#****************************************************************************** +# +# The rule for creating an object library. +# +#****************************************************************************** +${COMPILER}/%.a: + @if [ 'x${VERBOSE}' = x ]; \ + then \ + echo " AR ${@}"; \ + else \ + echo ${AR} -cr ${@} ${^}; \ + fi + @${AR} -cr ${@} ${^} + +#****************************************************************************** +# +# The rule for linking the application. +# +#****************************************************************************** +${COMPILER}/%.axf: + @if [ 'x${VERBOSE}' = x ]; \ + then \ + echo " LD ${@}"; \ + fi +ifeq (${COMPILER}, gcc) + @if [ 'x${VERBOSE}' != x ]; \ + then \ + echo ${LD} -T ${SCATTER_${notdir ${@:.axf=}}} \ + --entry ${ENTRY_${notdir ${@:.axf=}}} \ + ${LDFLAGSgcc_${notdir ${@:.axf=}}} \ + ${LDFLAGS} -o ${@} ${^} \ + '${LIBC}' '${LIBGCC}'; \ + fi + @${LD} -T ${SCATTER_${notdir ${@:.axf=}}} \ + --entry ${ENTRY_${notdir ${@:.axf=}}} \ + ${LDFLAGSgcc_${notdir ${@:.axf=}}} \ + ${LDFLAGS} -o ${@} ${^} \ + '${LIBC}' '${LIBGCC}' + @${OBJCOPY} -O binary ${@} ${@:.axf=.bin} +endif diff --git a/Demo/CORTEX_LM3S6965_GCC/standalone.ld b/Demo/CORTEX_LM3S6965_GCC/standalone.ld new file mode 100644 index 000000000..35111445b --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/standalone.ld @@ -0,0 +1,60 @@ +/****************************************************************************** + * + * standalone.ld - Linker script for applications using startup.c and + * DriverLib. + * + * Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. + * + * Software License Agreement + * + * Luminary Micro, Inc. (LMI) is supplying this software for use solely and + * exclusively on LMI's microcontroller products. + * + * The software is owned by LMI and/or its suppliers, and is protected under + * applicable copyright laws. All rights are reserved. Any use in violation + * of the foregoing restrictions may subject the user to criminal sanctions + * under applicable laws, as well as to civil liability for the breach of the + * terms and conditions of this license. + * + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 1392 of the Stellaris Peripheral Driver Library. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 256K + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 64K +} + +SECTIONS +{ + .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/Demo/CORTEX_LM3S6965_GCC/startup.c b/Demo/CORTEX_LM3S6965_GCC/startup.c new file mode 100644 index 000000000..6fec1cf34 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/startup.c @@ -0,0 +1,248 @@ +//***************************************************************************** +// +// startup.c - Boot code for Stellaris. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1392 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +// 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); +extern void xPortPendSVHandler(void); +extern void xPortSysTickHandler(void); +extern void vEMAC_ISR(void); +extern void Timer0IntHandler(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +#ifndef STACK_SIZE +#define STACK_SIZE 64 +#endif +static unsigned long pulStack[STACK_SIZE]; + +//***************************************************************************** +// +// The minimal vector table for a Cortex M3. Note that the proper constructs +// must be placed on this to ensure that it ends up at physical address +// 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((unsigned long)pulStack + sizeof(pulStack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // 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, // SSI Rx and Tx + IntDefaultHandler, // I2C Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder + 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 + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 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 + vEMAC_ISR, // Ethernet + IntDefaultHandler // Hibernate +}; + +//***************************************************************************** +// +// 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 unsigned long _etext; +extern unsigned long _data; +extern unsigned long _edata; +extern unsigned long _bss; +extern unsigned long _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 main() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + unsigned long *pulSrc, *pulDest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pulSrc = &_etext; + for(pulDest = &_data; pulDest < &_edata; ) + { + *pulDest++ = *pulSrc++; + } + + // + // Zero fill the bss segment. + // + for(pulDest = &_bss; pulDest < &_ebss; ) + { + *pulDest++ = 0; + } + + // + // 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) + { + } +} + +//***************************************************************************** +// +// A dummy printf function to satisfy the calls to printf from uip. This +// avoids pulling in the run-time library. +// +//***************************************************************************** +int +uipprintf(const char *fmt, ...) +{ + return(0); +} + diff --git a/Demo/CORTEX_LM3S6965_GCC/timertest.c b/Demo/CORTEX_LM3S6965_GCC/timertest.c new file mode 100644 index 000000000..2eddbfcda --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/timertest.c @@ -0,0 +1,133 @@ +/* + FreeRTOS.org V4.3.0 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + + Also see http://www.SafeRTOS.com for an IEC 61508 compliant version along + with commercial development and support options. + *************************************************************************** +*/ + +/* High speed timer test as described in main.c. */ + +/* Scheduler includes. */ +#include "FreeRTOS.h" + +/* Library includes. */ +#include "hw_ints.h" +#include "hw_memmap.h" +#include "hw_types.h" +#include "interrupt.h" +#include "sysctl.h" +#include "LMI_timer.h" + +/* The set frequency of the interrupt. Deviations from this are measured as +the jitter. */ +#define timerINTERRUPT_FREQUENCY ( 20000UL ) + +/* The expected time between each of the timer interrupts - if the jitter was +zero. */ +#define timerEXPECTED_DIFFERENCE_VALUE ( configCPU_CLOCK_HZ / timerINTERRUPT_FREQUENCY ) + +/* The highest available interrupt priority. */ +#define timerHIGHEST_PRIORITY ( 0 ) + +/* Misc defines. */ +#define timerMAX_32BIT_VALUE ( 0xffffffffUL ) +#define timerTIMER_1_COUNT_VALUE ( * ( ( unsigned long * ) ( TIMER1_BASE + 0x48 ) ) ) + +/*-----------------------------------------------------------*/ + +/* Interrupt handler in which the jitter is measured. */ +void Timer0IntHandler( void ); + +/* Stores the value of the maximum recorded jitter between interrupts. */ +unsigned portLONG ulMaxJitter = 0; + +/*-----------------------------------------------------------*/ + +void vSetupTimer( void ) +{ +unsigned long ulFrequency; + + /* Timer zero is used to generate the interrupts, and timer 1 is used + to measure the jitter. */ + SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER0 ); + SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER1 ); + TimerConfigure( TIMER0_BASE, TIMER_CFG_32_BIT_PER ); + TimerConfigure( TIMER1_BASE, TIMER_CFG_32_BIT_PER ); + + /* Set the timer interrupt to be above the kernel - highest. */ + IntPrioritySet( INT_TIMER0A, timerHIGHEST_PRIORITY ); + + /* Just used to measure time. */ + TimerLoadSet(TIMER1_BASE, TIMER_A, timerMAX_32BIT_VALUE ); + + /* The rate at which the timer will interrupt. */ + ulFrequency = configCPU_CLOCK_HZ / timerINTERRUPT_FREQUENCY; + TimerLoadSet( TIMER0_BASE, TIMER_A, ulFrequency ); + IntEnable( INT_TIMER0A ); + TimerIntEnable( TIMER0_BASE, TIMER_TIMA_TIMEOUT ); + + /* Enable both timers. */ + TimerEnable( TIMER0_BASE, TIMER_A ); + TimerEnable( TIMER1_BASE, TIMER_A ); +} +/*-----------------------------------------------------------*/ + +void Timer0IntHandler( void ) +{ +unsigned portLONG ulDifference, ulCurrentCount; +static portLONG ulMaxDifference = 0, ulLastCount = 0; + + /* We use the timer 1 counter value to measure the clock cycles between + the timer 0 interrupts. */ + ulCurrentCount = timerTIMER_1_COUNT_VALUE; + + if( ulCurrentCount < ulLastCount ) + { + /* How many times has timer 1 counted since the last interrupt? */ + ulDifference = ulLastCount - ulCurrentCount; + + /* Is this the largest difference we have measured yet? */ + if( ulDifference > ulMaxDifference ) + { + ulMaxDifference = ulDifference; + ulMaxJitter = ulMaxDifference - timerEXPECTED_DIFFERENCE_VALUE; + } + } + + ulLastCount = ulCurrentCount; + + TimerIntClear( TIMER0_BASE, TIMER_TIMA_TIMEOUT ); +} + + + + + diff --git a/Demo/CORTEX_LM3S6965_GCC/webserver/Makefile.webserver b/Demo/CORTEX_LM3S6965_GCC/webserver/Makefile.webserver new file mode 100644 index 000000000..f38c47a72 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/webserver/Makefile.webserver @@ -0,0 +1 @@ +APP_SOURCES += httpd.c http-strings.c httpd-fs.c httpd-cgi.c diff --git a/Demo/CORTEX_LM3S6965_GCC/webserver/clock-arch.h b/Demo/CORTEX_LM3S6965_GCC/webserver/clock-arch.h new file mode 100644 index 000000000..cde657b62 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/webserver/clock-arch.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2006, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: clock-arch.h,v 1.2 2006/06/12 08:00:31 adam Exp $ + */ + +#ifndef __CLOCK_ARCH_H__ +#define __CLOCK_ARCH_H__ + +#include "FreeRTOS.h" + +typedef unsigned long clock_time_t; +#define CLOCK_CONF_SECOND configTICK_RATE_HZ + +#endif /* __CLOCK_ARCH_H__ */ diff --git a/Demo/CORTEX_LM3S6965_GCC/webserver/emac.c b/Demo/CORTEX_LM3S6965_GCC/webserver/emac.c new file mode 100644 index 000000000..77e21c399 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/webserver/emac.c @@ -0,0 +1,281 @@ +/* + FreeRTOS.org V4.3.0 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + *************************************************************************** +*/ + +/* Kernel includes. */ +#include "FreeRTOS.h" +#include "Semphr.h" +#include "task.h" + +/* Demo includes. */ +#include "EMAC.h" + +/* uIP includes. */ +#include "uip.h" + +/* Hardware library includes. */ +#include "hw_types.h" +#include "hw_memmap.h" +#include "hw_ints.h" +#include "hw_ethernet.h" +#include "ethernet.h" +#include "interrupt.h" + +#define emacNUM_RX_BUFFERS 5 +#define emacFRAM_SIZE_BYTES 2 +#define macNEGOTIATE_DELAY 2000 +#define macWAIT_SEND_TIME ( 10 ) + +/* The task that handles the MAC peripheral. This is created at a high +priority and is effectively a deferred interrupt handler. The peripheral +handling is deferred to a task to prevent the entire FIFO having to be read +from within an ISR. */ +void vMACHandleTask( void *pvParameters ); + +/*-----------------------------------------------------------*/ + +/* The semaphore used to wake the uIP task when data arrives. */ +xSemaphoreHandle xEMACSemaphore = NULL; + +/* The semaphore used to wake the interrupt handler task. The peripheral +is processed at the task level to prevent the need to read the entire FIFO from +within the ISR itself. */ +xSemaphoreHandle xMACInterruptSemaphore = NULL; + +/* The buffer used by the uIP stack. In this case the pointer is used to +point to one of the Rx buffers. */ +unsigned portCHAR *uip_buf; + +/* Buffers into which Rx data is placed. */ +static unsigned portCHAR ucRxBuffers[ emacNUM_RX_BUFFERS ][ UIP_BUFSIZE + ( 4 * emacFRAM_SIZE_BYTES ) ]; + +/* The length of the data within each of the Rx buffers. */ +static unsigned portLONG ulRxLength[ emacNUM_RX_BUFFERS ]; + +/* Used to keep a track of the number of bytes to transmit. */ +static unsigned portLONG ulNextTxSpace; + +/*-----------------------------------------------------------*/ + +portBASE_TYPE vInitEMAC( void ) +{ +unsigned long ulTemp; +portBASE_TYPE xReturn; + + /* Ensure all interrupts are disabled. */ + EthernetIntDisable( ETH_BASE, ( ETH_INT_PHY | ETH_INT_MDIO | ETH_INT_RXER | ETH_INT_RXOF | ETH_INT_TX | ETH_INT_TXER | ETH_INT_RX)); + + /* Clear any interrupts that were already pending. */ + ulTemp = EthernetIntStatus( ETH_BASE, pdFALSE ); + EthernetIntClear( ETH_BASE, ulTemp ); + + /* Initialise the MAC and connect. */ + EthernetInit( ETH_BASE ); + EthernetConfigSet( ETH_BASE, ( ETH_CFG_TX_DPLXEN | ETH_CFG_TX_CRCEN | ETH_CFG_TX_PADEN ) ); + EthernetEnable( ETH_BASE ); + + /* Mark each Rx buffer as empty. */ + for( ulTemp = 0; ulTemp < emacNUM_RX_BUFFERS; ulTemp++ ) + { + ulRxLength[ ulTemp ] = 0; + } + + /* Create the queue and task used to defer the MAC processing to the + task level. */ + vSemaphoreCreateBinary( xMACInterruptSemaphore ); + xSemaphoreTake( xMACInterruptSemaphore, 0 ); + xReturn = xTaskCreate( vMACHandleTask, ( signed portCHAR * ) "MAC", configMINIMAL_STACK_SIZE, NULL, configMAX_PRIORITIES - 1, NULL ); + vTaskDelay( macNEGOTIATE_DELAY ); + + /* We are only interested in Rx interrupts. */ + IntPrioritySet( INT_ETH, configKERNEL_INTERRUPT_PRIORITY ); + IntEnable( INT_ETH ); + EthernetIntEnable(ETH_BASE, ETH_INT_RX); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +unsigned int uiGetEMACRxData( unsigned char *ucBuffer ) +{ +static unsigned long ulNextRxBuffer = 0; +unsigned int iLen; + + iLen = ulRxLength[ ulNextRxBuffer ]; + + if( iLen != 0 ) + { + /* Leave room for the size at the start of the buffer. */ + uip_buf = &( ucRxBuffers[ ulNextRxBuffer ][ 2 ] ); + + ulRxLength[ ulNextRxBuffer ] = 0; + + ulNextRxBuffer++; + if( ulNextRxBuffer >= emacNUM_RX_BUFFERS ) + { + ulNextRxBuffer = 0; + } + } + + return iLen; +} +/*-----------------------------------------------------------*/ + +void vInitialiseSend( void ) +{ + /* Set the index to the first byte to send - skipping over the size + bytes. */ + ulNextTxSpace = 2; +} +/*-----------------------------------------------------------*/ + +void vIncrementTxLength( unsigned portLONG ulLength ) +{ + ulNextTxSpace += ulLength; +} +/*-----------------------------------------------------------*/ + +void vSendBufferToMAC( void ) +{ +unsigned long *pulSource; +unsigned portSHORT * pus; +unsigned portLONG ulNextWord; + + /* Locate the data to be send. */ + pus = ( unsigned portSHORT * ) uip_buf; + + /* Add in the size of the data. */ + pus--; + *pus = ulNextTxSpace; + + /* Wait for data to be sent if there is no space immediately. */ + while( !EthernetSpaceAvail( ETH_BASE ) ) + { + vTaskDelay( macWAIT_SEND_TIME ); + } + + pulSource = ( unsigned portLONG * ) pus; + + for( ulNextWord = 0; ulNextWord < ulNextTxSpace; ulNextWord += sizeof( unsigned portLONG ) ) + { + HWREG(ETH_BASE + MAC_O_DATA) = *pulSource; + pulSource++; + } + + /* Go. */ + HWREG( ETH_BASE + MAC_O_TR ) = MAC_TR_NEWTX; +} +/*-----------------------------------------------------------*/ + +void vEMAC_ISR( void ) +{ +portBASE_TYPE xSwitchRequired = pdFALSE; +unsigned portLONG ulTemp; + + /* Clear the interrupt. */ + ulTemp = EthernetIntStatus( ETH_BASE, pdFALSE ); + EthernetIntClear( ETH_BASE, ulTemp ); + + /* Was it an Rx interrupt? */ + if( ulTemp & ETH_INT_RX ) + { + xSwitchRequired = pdTRUE; + xSemaphoreGiveFromISR( xMACInterruptSemaphore, pdFALSE ); + EthernetIntDisable( ETH_BASE, ETH_INT_RX ); + } + + /* Switch to the uIP task. */ + portEND_SWITCHING_ISR( xSwitchRequired ); +} +/*-----------------------------------------------------------*/ + +void vMACHandleTask( void *pvParameters ) +{ +unsigned long ulLen = 0, i; +unsigned portLONG ulLength, ulInt; +unsigned long *pulBuffer; +static unsigned portLONG ulNextRxBuffer = 0; +portBASE_TYPE xSwitchRequired = pdFALSE; + + for( ;; ) + { + /* Wait for something to do. */ + xSemaphoreTake( xMACInterruptSemaphore, portMAX_DELAY ); + + while( ( ulInt = ( EthernetIntStatus( ETH_BASE, pdFALSE ) & ETH_INT_RX ) ) != 0 ) + { + ulLength = HWREG( ETH_BASE + MAC_O_DATA ); + + /* Leave room at the start of the buffer for the size. */ + pulBuffer = ( unsigned long * ) &( ucRxBuffers[ ulNextRxBuffer ][ 2 ] ); + *pulBuffer = ( ulLength >> 16 ); + + /* Get the size of the data. */ + pulBuffer = ( unsigned long * ) &( ucRxBuffers[ ulNextRxBuffer ][ 4 ] ); + ulLength &= 0xFFFF; + + if( ulLength > 4 ) + { + ulLength -= 4; + + if( ulLength >= UIP_BUFSIZE ) + { + /* The data won't fit in our buffer. Ensure we don't + try to write into the buffer. */ + ulLength = 0; + } + + /* Read out the data into our buffer. */ + for( i = 0; i < ulLength; i += sizeof( unsigned portLONG ) ) + { + *pulBuffer = HWREG( ETH_BASE + MAC_O_DATA ); + pulBuffer++; + } + + /* Store the length of the data into the separate array. */ + ulRxLength[ ulNextRxBuffer ] = ulLength; + + /* Use the next buffer the next time through. */ + ulNextRxBuffer++; + if( ulNextRxBuffer >= emacNUM_RX_BUFFERS ) + { + ulNextRxBuffer = 0; + } + + /* Ensure the uIP task is not blocked as data has arrived. */ + xSemaphoreGive( xEMACSemaphore ); + } + } + + EthernetIntEnable( ETH_BASE, ETH_INT_RX ); + } +} + diff --git a/Demo/CORTEX_LM3S6965_GCC/webserver/emac.h b/Demo/CORTEX_LM3S6965_GCC/webserver/emac.h new file mode 100644 index 000000000..a49b59828 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/webserver/emac.h @@ -0,0 +1,322 @@ +/*---------------------------------------------------------------------------- + * LPC2378 Ethernet Definitions + *---------------------------------------------------------------------------- + * Name: EMAC.H + * Purpose: Philips LPC2378 EMAC hardware definitions + *---------------------------------------------------------------------------- + * Copyright (c) 2006 KEIL - An ARM Company. All rights reserved. + *---------------------------------------------------------------------------*/ +#ifndef __EMAC_H +#define __EMAC_H + +/* MAC address definition. The MAC address must be unique on the network. */ +#define emacETHADDR0 0 +#define emacETHADDR1 0xbd +#define emacETHADDR2 0x33 +#define emacETHADDR3 0x02 +#define emacETHADDR4 0x64 +#define emacETHADDR5 0x24 + + +/* EMAC Memory Buffer configuration for 16K Ethernet RAM. */ +#define NUM_RX_FRAG 4 /* Num.of RX Fragments 4*1536= 6.0kB */ +#define NUM_TX_FRAG 2 /* Num.of TX Fragments 2*1536= 3.0kB */ +#define ETH_FRAG_SIZE 1536 /* Packet Fragment size 1536 Bytes */ + +#define ETH_MAX_FLEN 1536 /* Max. Ethernet Frame Size */ + +/* EMAC variables located in 16K Ethernet SRAM */ +#define RX_DESC_BASE 0x7FE00000 +#define RX_STAT_BASE (RX_DESC_BASE + NUM_RX_FRAG*8) +#define TX_DESC_BASE (RX_STAT_BASE + NUM_RX_FRAG*8) +#define TX_STAT_BASE (TX_DESC_BASE + NUM_TX_FRAG*8) +#define RX_BUF_BASE (TX_STAT_BASE + NUM_TX_FRAG*4) +#define TX_BUF_BASE (RX_BUF_BASE + NUM_RX_FRAG*ETH_FRAG_SIZE) + +/* RX and TX descriptor and status definitions. */ +#define RX_DESC_PACKET(i) (*(unsigned int *)(RX_DESC_BASE + 8*i)) +#define RX_DESC_CTRL(i) (*(unsigned int *)(RX_DESC_BASE+4 + 8*i)) +#define RX_STAT_INFO(i) (*(unsigned int *)(RX_STAT_BASE + 8*i)) +#define RX_STAT_HASHCRC(i) (*(unsigned int *)(RX_STAT_BASE+4 + 8*i)) +#define TX_DESC_PACKET(i) (*(unsigned int *)(TX_DESC_BASE + 8*i)) +#define TX_DESC_CTRL(i) (*(unsigned int *)(TX_DESC_BASE+4 + 8*i)) +#define TX_STAT_INFO(i) (*(unsigned int *)(TX_STAT_BASE + 4*i)) +#define RX_BUF(i) (RX_BUF_BASE + ETH_FRAG_SIZE*i) +#define TX_BUF(i) (TX_BUF_BASE + ETH_FRAG_SIZE*i) + +/* MAC Configuration Register 1 */ +#define MAC1_REC_EN 0x00000001 /* Receive Enable */ +#define MAC1_PASS_ALL 0x00000002 /* Pass All Receive Frames */ +#define MAC1_RX_FLOWC 0x00000004 /* RX Flow Control */ +#define MAC1_TX_FLOWC 0x00000008 /* TX Flow Control */ +#define MAC1_LOOPB 0x00000010 /* Loop Back Mode */ +#define MAC1_RES_TX 0x00000100 /* Reset TX Logic */ +#define MAC1_RES_MCS_TX 0x00000200 /* Reset MAC TX Control Sublayer */ +#define MAC1_RES_RX 0x00000400 /* Reset RX Logic */ +#define MAC1_RES_MCS_RX 0x00000800 /* Reset MAC RX Control Sublayer */ +#define MAC1_SIM_RES 0x00004000 /* Simulation Reset */ +#define MAC1_SOFT_RES 0x00008000 /* Soft Reset MAC */ + +/* MAC Configuration Register 2 */ +#define MAC2_FULL_DUP 0x00000001 /* Full Duplex Mode */ +#define MAC2_FRM_LEN_CHK 0x00000002 /* Frame Length Checking */ +#define MAC2_HUGE_FRM_EN 0x00000004 /* Huge Frame Enable */ +#define MAC2_DLY_CRC 0x00000008 /* Delayed CRC Mode */ +#define MAC2_CRC_EN 0x00000010 /* Append CRC to every Frame */ +#define MAC2_PAD_EN 0x00000020 /* Pad all Short Frames */ +#define MAC2_VLAN_PAD_EN 0x00000040 /* VLAN Pad Enable */ +#define MAC2_ADET_PAD_EN 0x00000080 /* Auto Detect Pad Enable */ +#define MAC2_PPREAM_ENF 0x00000100 /* Pure Preamble Enforcement */ +#define MAC2_LPREAM_ENF 0x00000200 /* Long Preamble Enforcement */ +#undef MAC2_NO_BACKOFF /* Remove compiler warning. */ +#define MAC2_NO_BACKOFF 0x00001000 /* No Backoff Algorithm */ +#define MAC2_BACK_PRESSURE 0x00002000 /* Backoff Presurre / No Backoff */ +#define MAC2_EXCESS_DEF 0x00004000 /* Excess Defer */ + +/* Back-to-Back Inter-Packet-Gap Register */ +#define IPGT_FULL_DUP 0x00000015 /* Recommended value for Full Duplex */ +#define IPGT_HALF_DUP 0x00000012 /* Recommended value for Half Duplex */ + +/* Non Back-to-Back Inter-Packet-Gap Register */ +#define IPGR_DEF 0x00000012 /* Recommended value */ + +/* Collision Window/Retry Register */ +#define CLRT_DEF 0x0000370F /* Default value */ + +/* PHY Support Register */ +#undef SUPP_SPEED /* Remove compiler warning. */ +#define SUPP_SPEED 0x00000100 /* Reduced MII Logic Current Speed */ +#define SUPP_RES_RMII 0x00000800 /* Reset Reduced MII Logic */ + +/* Test Register */ +#define TEST_SHCUT_PQUANTA 0x00000001 /* Shortcut Pause Quanta */ +#define TEST_TST_PAUSE 0x00000002 /* Test Pause */ +#define TEST_TST_BACKP 0x00000004 /* Test Back Pressure */ + +/* MII Management Configuration Register */ +#define MCFG_SCAN_INC 0x00000001 /* Scan Increment PHY Address */ +#define MCFG_SUPP_PREAM 0x00000002 /* Suppress Preamble */ +#define MCFG_CLK_SEL 0x0000001C /* Clock Select Mask */ +#define MCFG_RES_MII 0x00008000 /* Reset MII Management Hardware */ + +/* MII Management Command Register */ +#undef MCMD_READ /* Remove compiler warning. */ +#define MCMD_READ 0x00000001 /* MII Read */ +#undef MCMD_SCAN /* Remove compiler warning. */ +#define MCMD_SCAN 0x00000002 /* MII Scan continuously */ + +#define MII_WR_TOUT 0x00050000 /* MII Write timeout count */ +#define MII_RD_TOUT 0x00050000 /* MII Read timeout count */ + +/* MII Management Address Register */ +#define MADR_REG_ADR 0x0000001F /* MII Register Address Mask */ +#define MADR_PHY_ADR 0x00001F00 /* PHY Address Mask */ + +/* MII Management Indicators Register */ +#undef MIND_BUSY /* Remove compiler warning. */ +#define MIND_BUSY 0x00000001 /* MII is Busy */ +#define MIND_SCAN 0x00000002 /* MII Scanning in Progress */ +#define MIND_NOT_VAL 0x00000004 /* MII Read Data not valid */ +#define MIND_MII_LINK_FAIL 0x00000008 /* MII Link Failed */ + +/* Command Register */ +#define CR_RX_EN 0x00000001 /* Enable Receive */ +#define CR_TX_EN 0x00000002 /* Enable Transmit */ +#define CR_REG_RES 0x00000008 /* Reset Host Registers */ +#define CR_TX_RES 0x00000010 /* Reset Transmit Datapath */ +#define CR_RX_RES 0x00000020 /* Reset Receive Datapath */ +#define CR_PASS_RUNT_FRM 0x00000040 /* Pass Runt Frames */ +#define CR_PASS_RX_FILT 0x00000080 /* Pass RX Filter */ +#define CR_TX_FLOW_CTRL 0x00000100 /* TX Flow Control */ +#define CR_RMII 0x00000200 /* Reduced MII Interface */ +#define CR_FULL_DUP 0x00000400 /* Full Duplex */ + +/* Status Register */ +#define SR_RX_EN 0x00000001 /* Enable Receive */ +#define SR_TX_EN 0x00000002 /* Enable Transmit */ + +/* Transmit Status Vector 0 Register */ +#define TSV0_CRC_ERR 0x00000001 /* CRC error */ +#define TSV0_LEN_CHKERR 0x00000002 /* Length Check Error */ +#define TSV0_LEN_OUTRNG 0x00000004 /* Length Out of Range */ +#define TSV0_DONE 0x00000008 /* Tramsmission Completed */ +#define TSV0_MCAST 0x00000010 /* Multicast Destination */ +#define TSV0_BCAST 0x00000020 /* Broadcast Destination */ +#define TSV0_PKT_DEFER 0x00000040 /* Packet Deferred */ +#define TSV0_EXC_DEFER 0x00000080 /* Excessive Packet Deferral */ +#define TSV0_EXC_COLL 0x00000100 /* Excessive Collision */ +#define TSV0_LATE_COLL 0x00000200 /* Late Collision Occured */ +#define TSV0_GIANT 0x00000400 /* Giant Frame */ +#define TSV0_UNDERRUN 0x00000800 /* Buffer Underrun */ +#define TSV0_BYTES 0x0FFFF000 /* Total Bytes Transferred */ +#define TSV0_CTRL_FRAME 0x10000000 /* Control Frame */ +#define TSV0_PAUSE 0x20000000 /* Pause Frame */ +#define TSV0_BACK_PRESS 0x40000000 /* Backpressure Method Applied */ +#define TSV0_VLAN 0x80000000 /* VLAN Frame */ + +/* Transmit Status Vector 1 Register */ +#define TSV1_BYTE_CNT 0x0000FFFF /* Transmit Byte Count */ +#define TSV1_COLL_CNT 0x000F0000 /* Transmit Collision Count */ + +/* Receive Status Vector Register */ +#define RSV_BYTE_CNT 0x0000FFFF /* Receive Byte Count */ +#define RSV_PKT_IGNORED 0x00010000 /* Packet Previously Ignored */ +#define RSV_RXDV_SEEN 0x00020000 /* RXDV Event Previously Seen */ +#define RSV_CARR_SEEN 0x00040000 /* Carrier Event Previously Seen */ +#define RSV_REC_CODEV 0x00080000 /* Receive Code Violation */ +#define RSV_CRC_ERR 0x00100000 /* CRC Error */ +#define RSV_LEN_CHKERR 0x00200000 /* Length Check Error */ +#define RSV_LEN_OUTRNG 0x00400000 /* Length Out of Range */ +#define RSV_REC_OK 0x00800000 /* Frame Received OK */ +#define RSV_MCAST 0x01000000 /* Multicast Frame */ +#define RSV_BCAST 0x02000000 /* Broadcast Frame */ +#define RSV_DRIB_NIBB 0x04000000 /* Dribble Nibble */ +#define RSV_CTRL_FRAME 0x08000000 /* Control Frame */ +#define RSV_PAUSE 0x10000000 /* Pause Frame */ +#define RSV_UNSUPP_OPC 0x20000000 /* Unsupported Opcode */ +#define RSV_VLAN 0x40000000 /* VLAN Frame */ + +/* Flow Control Counter Register */ +#define FCC_MIRR_CNT 0x0000FFFF /* Mirror Counter */ +#define FCC_PAUSE_TIM 0xFFFF0000 /* Pause Timer */ + +/* Flow Control Status Register */ +#define FCS_MIRR_CNT 0x0000FFFF /* Mirror Counter Current */ + +/* Receive Filter Control Register */ +#define RFC_UCAST_EN 0x00000001 /* Accept Unicast Frames Enable */ +#define RFC_BCAST_EN 0x00000002 /* Accept Broadcast Frames Enable */ +#define RFC_MCAST_EN 0x00000004 /* Accept Multicast Frames Enable */ +#define RFC_UCAST_HASH_EN 0x00000008 /* Accept Unicast Hash Filter Frames */ +#define RFC_MCAST_HASH_EN 0x00000010 /* Accept Multicast Hash Filter Fram.*/ +#define RFC_PERFECT_EN 0x00000020 /* Accept Perfect Match Enable */ +#define RFC_MAGP_WOL_EN 0x00001000 /* Magic Packet Filter WoL Enable */ +#define RFC_PFILT_WOL_EN 0x00002000 /* Perfect Filter WoL Enable */ + +/* Receive Filter WoL Status/Clear Registers */ +#define WOL_UCAST 0x00000001 /* Unicast Frame caused WoL */ +#define WOL_BCAST 0x00000002 /* Broadcast Frame caused WoL */ +#define WOL_MCAST 0x00000004 /* Multicast Frame caused WoL */ +#define WOL_UCAST_HASH 0x00000008 /* Unicast Hash Filter Frame WoL */ +#define WOL_MCAST_HASH 0x00000010 /* Multicast Hash Filter Frame WoL */ +#define WOL_PERFECT 0x00000020 /* Perfect Filter WoL */ +#define WOL_RX_FILTER 0x00000080 /* RX Filter caused WoL */ +#define WOL_MAG_PACKET 0x00000100 /* Magic Packet Filter caused WoL */ + +/* Interrupt Status/Enable/Clear/Set Registers */ +#define INT_RX_OVERRUN 0x00000001 /* Overrun Error in RX Queue */ +#define INT_RX_ERR 0x00000002 /* Receive Error */ +#define INT_RX_FIN 0x00000004 /* RX Finished Process Descriptors */ +#define INT_RX_DONE 0x00000008 /* Receive Done */ +#define INT_TX_UNDERRUN 0x00000010 /* Transmit Underrun */ +#define INT_TX_ERR 0x00000020 /* Transmit Error */ +#define INT_TX_FIN 0x00000040 /* TX Finished Process Descriptors */ +#define INT_TX_DONE 0x00000080 /* Transmit Done */ +#define INT_SOFT_INT 0x00001000 /* Software Triggered Interrupt */ +#define INT_WAKEUP 0x00002000 /* Wakeup Event Interrupt */ + +/* Power Down Register */ +#define PD_POWER_DOWN 0x80000000 /* Power Down MAC */ + +/* RX Descriptor Control Word */ +#define RCTRL_SIZE 0x000007FF /* Buffer size mask */ +#define RCTRL_INT 0x80000000 /* Generate RxDone Interrupt */ + +/* RX Status Hash CRC Word */ +#define RHASH_SA 0x000001FF /* Hash CRC for Source Address */ +#define RHASH_DA 0x001FF000 /* Hash CRC for Destination Address */ + +/* RX Status Information Word */ +#define RINFO_SIZE 0x000007FF /* Data size in bytes */ +#define RINFO_CTRL_FRAME 0x00040000 /* Control Frame */ +#define RINFO_VLAN 0x00080000 /* VLAN Frame */ +#define RINFO_FAIL_FILT 0x00100000 /* RX Filter Failed */ +#define RINFO_MCAST 0x00200000 /* Multicast Frame */ +#define RINFO_BCAST 0x00400000 /* Broadcast Frame */ +#define RINFO_CRC_ERR 0x00800000 /* CRC Error in Frame */ +#define RINFO_SYM_ERR 0x01000000 /* Symbol Error from PHY */ +#define RINFO_LEN_ERR 0x02000000 /* Length Error */ +#define RINFO_RANGE_ERR 0x04000000 /* Range Error (exceeded max. size) */ +#define RINFO_ALIGN_ERR 0x08000000 /* Alignment Error */ +#define RINFO_OVERRUN 0x10000000 /* Receive overrun */ +#define RINFO_NO_DESCR 0x20000000 /* No new Descriptor available */ +#define RINFO_LAST_FLAG 0x40000000 /* Last Fragment in Frame */ +#define RINFO_ERR 0x80000000 /* Error Occured (OR of all errors) */ + +#define RINFO_ERR_MASK (RINFO_FAIL_FILT | RINFO_CRC_ERR | RINFO_SYM_ERR | \ + RINFO_LEN_ERR | RINFO_ALIGN_ERR | RINFO_OVERRUN) + +/* TX Descriptor Control Word */ +#define TCTRL_SIZE 0x000007FF /* Size of data buffer in bytes */ +#define TCTRL_OVERRIDE 0x04000000 /* Override Default MAC Registers */ +#define TCTRL_HUGE 0x08000000 /* Enable Huge Frame */ +#define TCTRL_PAD 0x10000000 /* Pad short Frames to 64 bytes */ +#define TCTRL_CRC 0x20000000 /* Append a hardware CRC to Frame */ +#define TCTRL_LAST 0x40000000 /* Last Descriptor for TX Frame */ +#define TCTRL_INT 0x80000000 /* Generate TxDone Interrupt */ + +/* TX Status Information Word */ +#define TINFO_COL_CNT 0x01E00000 /* Collision Count */ +#define TINFO_DEFER 0x02000000 /* Packet Deferred (not an error) */ +#define TINFO_EXCESS_DEF 0x04000000 /* Excessive Deferral */ +#define TINFO_EXCESS_COL 0x08000000 /* Excessive Collision */ +#define TINFO_LATE_COL 0x10000000 /* Late Collision Occured */ +#define TINFO_UNDERRUN 0x20000000 /* Transmit Underrun */ +#define TINFO_NO_DESCR 0x40000000 /* No new Descriptor available */ +#define TINFO_ERR 0x80000000 /* Error Occured (OR of all errors) */ + +/* DP83848C PHY Registers */ +#define PHY_REG_BMCR 0x00 /* Basic Mode Control Register */ +#define PHY_REG_BMSR 0x01 /* Basic Mode Status Register */ +#define PHY_REG_IDR1 0x02 /* PHY Identifier 1 */ +#define PHY_REG_IDR2 0x03 /* PHY Identifier 2 */ +#define PHY_REG_ANAR 0x04 /* Auto-Negotiation Advertisement */ +#define PHY_REG_ANLPAR 0x05 /* Auto-Neg. Link Partner Abitily */ +#define PHY_REG_ANER 0x06 /* Auto-Neg. Expansion Register */ +#define PHY_REG_ANNPTR 0x07 /* Auto-Neg. Next Page TX */ + +/* PHY Extended Registers */ +#define PHY_REG_STS 0x10 /* Status Register */ +#define PHY_REG_MICR 0x11 /* MII Interrupt Control Register */ +#define PHY_REG_MISR 0x12 /* MII Interrupt Status Register */ +#define PHY_REG_FCSCR 0x14 /* False Carrier Sense Counter */ +#define PHY_REG_RECR 0x15 /* Receive Error Counter */ +#define PHY_REG_PCSR 0x16 /* PCS Sublayer Config. and Status */ +#define PHY_REG_RBR 0x17 /* RMII and Bypass Register */ +#define PHY_REG_LEDCR 0x18 /* LED Direct Control Register */ +#define PHY_REG_PHYCR 0x19 /* PHY Control Register */ +#define PHY_REG_10BTSCR 0x1A /* 10Base-T Status/Control Register */ +#define PHY_REG_CDCTRL1 0x1B /* CD Test Control and BIST Extens. */ +#define PHY_REG_EDCR 0x1D /* Energy Detect Control Register */ + +#define PHY_FULLD_100M 0x2100 /* Full Duplex 100Mbit */ +#define PHY_HALFD_100M 0x2000 /* Half Duplex 100Mbit */ +#define PHY_FULLD_10M 0x0100 /* Full Duplex 10Mbit */ +#define PHY_HALFD_10M 0x0000 /* Half Duplex 10MBit */ +#define PHY_AUTO_NEG 0x3000 /* Select Auto Negotiation */ + +#define DP83848C_DEF_ADR 0x0100 /* Default PHY device address */ +#define DP83848C_ID 0x20005C90 /* PHY Identifier */ + +// prototypes +portBASE_TYPE vInitEMAC(void); +unsigned short ReadFrameBE_EMAC(void); +void vIncrementTxLength(unsigned long ulLength); +void CopyFromFrame_EMAC(void *Dest, unsigned short Size); +void DummyReadFrame_EMAC(unsigned short Size); +unsigned short StartReadFrame(void); +void EndReadFrame(void); +unsigned int CheckFrameReceived(void); +void vInitialiseSend(void); +unsigned int Rdy4Tx(void); +void vSendBufferToMAC(void); +void vEMACWaitForInput( void ); +unsigned int uiGetEMACRxData( unsigned char *ucBuffer ); + + +#endif + +/*---------------------------------------------------------------------------- + * end of file + *---------------------------------------------------------------------------*/ + diff --git a/Demo/CORTEX_LM3S6965_GCC/webserver/http-strings b/Demo/CORTEX_LM3S6965_GCC/webserver/http-strings new file mode 100644 index 000000000..0d3c30cdd --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/webserver/http-strings @@ -0,0 +1,35 @@ +http_http "http://" +http_200 "200 " +http_301 "301 " +http_302 "302 " +http_get "GET " +http_10 "HTTP/1.0" +http_11 "HTTP/1.1" +http_content_type "content-type: " +http_texthtml "text/html" +http_location "location: " +http_host "host: " +http_crnl "\r\n" +http_index_html "/index.html" +http_404_html "/404.html" +http_referer "Referer:" +http_header_200 "HTTP/1.0 200 OK\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n" +http_header_404 "HTTP/1.0 404 Not found\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n" +http_content_type_plain "Content-type: text/plain\r\n\r\n" +http_content_type_html "Content-type: text/html\r\n\r\n" +http_content_type_css "Content-type: text/css\r\n\r\n" +http_content_type_text "Content-type: text/text\r\n\r\n" +http_content_type_png "Content-type: image/png\r\n\r\n" +http_content_type_gif "Content-type: image/gif\r\n\r\n" +http_content_type_jpg "Content-type: image/jpeg\r\n\r\n" +http_content_type_binary "Content-type: application/octet-stream\r\n\r\n" +http_html ".html" +http_shtml ".shtml" +http_htm ".htm" +http_css ".css" +http_png ".png" +http_gif ".gif" +http_jpg ".jpg" +http_text ".txt" +http_txt ".txt" + diff --git a/Demo/CORTEX_LM3S6965_GCC/webserver/http-strings.c b/Demo/CORTEX_LM3S6965_GCC/webserver/http-strings.c new file mode 100644 index 000000000..ef7a41c7d --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/webserver/http-strings.c @@ -0,0 +1,102 @@ +const char http_http[8] = +/* "http://" */ +{0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, }; +const char http_200[5] = +/* "200 " */ +{0x32, 0x30, 0x30, 0x20, }; +const char http_301[5] = +/* "301 " */ +{0x33, 0x30, 0x31, 0x20, }; +const char http_302[5] = +/* "302 " */ +{0x33, 0x30, 0x32, 0x20, }; +const char http_get[5] = +/* "GET " */ +{0x47, 0x45, 0x54, 0x20, }; +const char http_10[9] = +/* "HTTP/1.0" */ +{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, }; +const char http_11[9] = +/* "HTTP/1.1" */ +{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x31, }; +const char http_content_type[15] = +/* "content-type: " */ +{0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, }; +const char http_texthtml[10] = +/* "text/html" */ +{0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_location[11] = +/* "location: " */ +{0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, }; +const char http_host[7] = +/* "host: " */ +{0x68, 0x6f, 0x73, 0x74, 0x3a, 0x20, }; +const char http_crnl[3] = +/* "\r\n" */ +{0xd, 0xa, }; +const char http_index_html[12] = +/* "/index.html" */ +{0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_404_html[10] = +/* "/404.html" */ +{0x2f, 0x34, 0x30, 0x34, 0x2e, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_referer[9] = +/* "Referer:" */ +{0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x72, 0x3a, }; +const char http_header_200[84] = +/* "HTTP/1.0 200 OK\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n" */ +{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x32, 0x30, 0x30, 0x20, 0x4f, 0x4b, 0xd, 0xa, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x3a, 0x20, 0x75, 0x49, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x2f, 0x7e, 0x61, 0x64, 0x61, 0x6d, 0x2f, 0x75, 0x69, 0x70, 0x2f, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0xd, 0xa, }; +const char http_header_404[91] = +/* "HTTP/1.0 404 Not found\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n" */ +{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x34, 0x30, 0x34, 0x20, 0x4e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0xd, 0xa, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x3a, 0x20, 0x75, 0x49, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x2f, 0x7e, 0x61, 0x64, 0x61, 0x6d, 0x2f, 0x75, 0x69, 0x70, 0x2f, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0xd, 0xa, }; +const char http_content_type_plain[29] = +/* "Content-type: text/plain\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_html[28] = +/* "Content-type: text/html\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_css [27] = +/* "Content-type: text/css\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_text[28] = +/* "Content-type: text/text\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x74, 0x65, 0x78, 0x74, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_png [28] = +/* "Content-type: image/png\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x70, 0x6e, 0x67, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_gif [28] = +/* "Content-type: image/gif\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x67, 0x69, 0x66, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_jpg [29] = +/* "Content-type: image/jpeg\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x6a, 0x70, 0x65, 0x67, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_binary[43] = +/* "Content-type: application/octet-stream\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0xd, 0xa, 0xd, 0xa, }; +const char http_html[6] = +/* ".html" */ +{0x2e, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_shtml[7] = +/* ".shtml" */ +{0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_htm[5] = +/* ".htm" */ +{0x2e, 0x68, 0x74, 0x6d, }; +const char http_css[5] = +/* ".css" */ +{0x2e, 0x63, 0x73, 0x73, }; +const char http_png[5] = +/* ".png" */ +{0x2e, 0x70, 0x6e, 0x67, }; +const char http_gif[5] = +/* ".gif" */ +{0x2e, 0x67, 0x69, 0x66, }; +const char http_jpg[5] = +/* ".jpg" */ +{0x2e, 0x6a, 0x70, 0x67, }; +const char http_text[5] = +/* ".txt" */ +{0x2e, 0x74, 0x78, 0x74, }; +const char http_txt[5] = +/* ".txt" */ +{0x2e, 0x74, 0x78, 0x74, }; diff --git a/Demo/CORTEX_LM3S6965_GCC/webserver/http-strings.h b/Demo/CORTEX_LM3S6965_GCC/webserver/http-strings.h new file mode 100644 index 000000000..acbe7e17f --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/webserver/http-strings.h @@ -0,0 +1,34 @@ +extern const char http_http[8]; +extern const char http_200[5]; +extern const char http_301[5]; +extern const char http_302[5]; +extern const char http_get[5]; +extern const char http_10[9]; +extern const char http_11[9]; +extern const char http_content_type[15]; +extern const char http_texthtml[10]; +extern const char http_location[11]; +extern const char http_host[7]; +extern const char http_crnl[3]; +extern const char http_index_html[12]; +extern const char http_404_html[10]; +extern const char http_referer[9]; +extern const char http_header_200[84]; +extern const char http_header_404[91]; +extern const char http_content_type_plain[29]; +extern const char http_content_type_html[28]; +extern const char http_content_type_css [27]; +extern const char http_content_type_text[28]; +extern const char http_content_type_png [28]; +extern const char http_content_type_gif [28]; +extern const char http_content_type_jpg [29]; +extern const char http_content_type_binary[43]; +extern const char http_html[6]; +extern const char http_shtml[7]; +extern const char http_htm[5]; +extern const char http_css[5]; +extern const char http_png[5]; +extern const char http_gif[5]; +extern const char http_jpg[5]; +extern const char http_text[5]; +extern const char http_txt[5]; diff --git a/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-cgi.c b/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-cgi.c new file mode 100644 index 000000000..803b771e6 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-cgi.c @@ -0,0 +1,269 @@ +/** + * \addtogroup httpd + * @{ + */ + +/** + * \file + * Web server script interface + * \author + * Adam Dunkels + * + */ + +/* + * Copyright (c) 2001-2006, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: httpd-cgi.c,v 1.2 2006/06/11 21:46:37 adam Exp $ + * + */ + +#include "uip.h" +#include "psock.h" +#include "httpd.h" +#include "httpd-cgi.h" +#include "httpd-fs.h" + +#include +#include + +HTTPD_CGI_CALL(file, "file-stats", file_stats); +HTTPD_CGI_CALL(tcp, "tcp-connections", tcp_stats); +HTTPD_CGI_CALL(net, "net-stats", net_stats); +HTTPD_CGI_CALL(rtos, "rtos-stats", rtos_stats ); +HTTPD_CGI_CALL(io, "led-io", led_io ); + + +static const struct httpd_cgi_call *calls[] = { &file, &tcp, &net, &rtos, &io, NULL }; + +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(nullfunction(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +httpd_cgifunction +httpd_cgi(char *name) +{ + const struct httpd_cgi_call **f; + + /* Find the matching name in the table, return the function. */ + for(f = calls; *f != NULL; ++f) { + if(strncmp((*f)->name, name, strlen((*f)->name)) == 0) { + return (*f)->function; + } + } + return nullfunction; +} +/*---------------------------------------------------------------------------*/ +static unsigned short +generate_file_stats(void *arg) +{ + char *f = (char *)arg; + return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE, "%5u", httpd_fs_count(f)); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(file_stats(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + + PSOCK_GENERATOR_SEND(&s->sout, generate_file_stats, strchr(ptr, ' ') + 1); + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static const char closed[] = /* "CLOSED",*/ +{0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0}; +static const char syn_rcvd[] = /* "SYN-RCVD",*/ +{0x53, 0x59, 0x4e, 0x2d, 0x52, 0x43, 0x56, + 0x44, 0}; +static const char syn_sent[] = /* "SYN-SENT",*/ +{0x53, 0x59, 0x4e, 0x2d, 0x53, 0x45, 0x4e, + 0x54, 0}; +static const char established[] = /* "ESTABLISHED",*/ +{0x45, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x49, 0x53, 0x48, + 0x45, 0x44, 0}; +static const char fin_wait_1[] = /* "FIN-WAIT-1",*/ +{0x46, 0x49, 0x4e, 0x2d, 0x57, 0x41, 0x49, + 0x54, 0x2d, 0x31, 0}; +static const char fin_wait_2[] = /* "FIN-WAIT-2",*/ +{0x46, 0x49, 0x4e, 0x2d, 0x57, 0x41, 0x49, + 0x54, 0x2d, 0x32, 0}; +static const char closing[] = /* "CLOSING",*/ +{0x43, 0x4c, 0x4f, 0x53, 0x49, + 0x4e, 0x47, 0}; +static const char time_wait[] = /* "TIME-WAIT,"*/ +{0x54, 0x49, 0x4d, 0x45, 0x2d, 0x57, 0x41, + 0x49, 0x54, 0}; +static const char last_ack[] = /* "LAST-ACK"*/ +{0x4c, 0x41, 0x53, 0x54, 0x2d, 0x41, 0x43, + 0x4b, 0}; + +static const char *states[] = { + closed, + syn_rcvd, + syn_sent, + established, + fin_wait_1, + fin_wait_2, + closing, + time_wait, + last_ack}; + + +static unsigned short +generate_tcp_stats(void *arg) +{ + struct uip_conn *conn; + struct httpd_state *s = (struct httpd_state *)arg; + + conn = &uip_conns[s->count]; + return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE, + "%d%u.%u.%u.%u:%u%s%u%u%c %c\r\n", + htons(conn->lport), + htons(conn->ripaddr[0]) >> 8, + htons(conn->ripaddr[0]) & 0xff, + htons(conn->ripaddr[1]) >> 8, + htons(conn->ripaddr[1]) & 0xff, + htons(conn->rport), + states[conn->tcpstateflags & UIP_TS_MASK], + conn->nrtx, + conn->timer, + (uip_outstanding(conn))? '*':' ', + (uip_stopped(conn))? '!':' '); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(tcp_stats(struct httpd_state *s, char *ptr)) +{ + + PSOCK_BEGIN(&s->sout); + + for(s->count = 0; s->count < UIP_CONNS; ++s->count) { + if((uip_conns[s->count].tcpstateflags & UIP_TS_MASK) != UIP_CLOSED) { + PSOCK_GENERATOR_SEND(&s->sout, generate_tcp_stats, s); + } + } + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static unsigned short +generate_net_stats(void *arg) +{ + struct httpd_state *s = (struct httpd_state *)arg; + return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE, + "%5u\n", ((uip_stats_t *)&uip_stat)[s->count]); +} + +static +PT_THREAD(net_stats(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + +#if UIP_STATISTICS + + for(s->count = 0; s->count < sizeof(uip_stat) / sizeof(uip_stats_t); + ++s->count) { + PSOCK_GENERATOR_SEND(&s->sout, generate_net_stats, s); + } + +#endif /* UIP_STATISTICS */ + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ + +extern void vTaskList( signed char *pcWriteBuffer ); +static char cCountBuf[ 32 ]; +long lRefreshCount = 0; +static unsigned short +generate_rtos_stats(void *arg) +{ + lRefreshCount++; + sprintf( cCountBuf, "


Refresh count = %d", lRefreshCount ); + vTaskList( uip_appdata ); + strcat( uip_appdata, cCountBuf ); + + return strlen( uip_appdata ); +} +/*---------------------------------------------------------------------------*/ + + +static +PT_THREAD(rtos_stats(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + PSOCK_GENERATOR_SEND(&s->sout, generate_rtos_stats, NULL); + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ + +char *pcStatus; +extern unsigned long uxParTestGetLED( unsigned long uxLED ); + +static unsigned short generate_io_state( void *arg ) +{ + if( uxParTestGetLED( 0 ) ) + { + pcStatus = "checked"; + } + else + { + pcStatus = ""; + } + + sprintf( uip_appdata, + "LED"\ + "

"\ + "", + pcStatus ); + + return strlen( uip_appdata ); +} +/*---------------------------------------------------------------------------*/ + +static PT_THREAD(led_io(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + PSOCK_GENERATOR_SEND(&s->sout, generate_io_state, NULL); + PSOCK_END(&s->sout); +} + +/** @} */ + + + + + + diff --git a/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-cgi.h b/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-cgi.h new file mode 100644 index 000000000..7ae928321 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-cgi.h @@ -0,0 +1,84 @@ +/** + * \addtogroup httpd + * @{ + */ + +/** + * \file + * Web server script interface header file + * \author + * Adam Dunkels + * + */ + + + +/* + * Copyright (c) 2001, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: httpd-cgi.h,v 1.2 2006/06/11 21:46:38 adam Exp $ + * + */ + +#ifndef __HTTPD_CGI_H__ +#define __HTTPD_CGI_H__ + +#include "psock.h" +#include "httpd.h" + +typedef PT_THREAD((* httpd_cgifunction)(struct httpd_state *, char *)); + +httpd_cgifunction httpd_cgi(char *name); + +struct httpd_cgi_call { + const char *name; + const httpd_cgifunction function; +}; + +/** + * \brief HTTPD CGI function declaration + * \param name The C variable name of the function + * \param str The string name of the function, used in the script file + * \param function A pointer to the function that implements it + * + * This macro is used for declaring a HTTPD CGI + * function. This function is then added to the list of + * HTTPD CGI functions with the httpd_cgi_add() function. + * + * \hideinitializer + */ +#define HTTPD_CGI_CALL(name, str, function) \ +static PT_THREAD(function(struct httpd_state *, char *)); \ +static const struct httpd_cgi_call name = {str, function} + +void httpd_cgi_init(void); +#endif /* __HTTPD_CGI_H__ */ + +/** @} */ diff --git a/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fs.c b/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fs.c new file mode 100644 index 000000000..dc4aef011 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fs.c @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2001, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: httpd-fs.c,v 1.1 2006/06/07 09:13:08 adam Exp $ + */ + +#include "httpd.h" +#include "httpd-fs.h" +#include "httpd-fsdata.h" + +#ifndef NULL +#define NULL 0 +#endif /* NULL */ + +#include "httpd-fsdata.c" + +#if HTTPD_FS_STATISTICS +static u16_t count[HTTPD_FS_NUMFILES]; +#endif /* HTTPD_FS_STATISTICS */ + +/*-----------------------------------------------------------------------------------*/ +static u8_t +httpd_fs_strcmp(const char *str1, const char *str2) +{ + u8_t i; + i = 0; + loop: + + if(str2[i] == 0 || + str1[i] == '\r' || + str1[i] == '\n') { + return 0; + } + + if(str1[i] != str2[i]) { + return 1; + } + + + ++i; + goto loop; +} +/*-----------------------------------------------------------------------------------*/ +int +httpd_fs_open(const char *name, struct httpd_fs_file *file) +{ +#if HTTPD_FS_STATISTICS + u16_t i = 0; +#endif /* HTTPD_FS_STATISTICS */ + struct httpd_fsdata_file_noconst *f; + + for(f = (struct httpd_fsdata_file_noconst *)HTTPD_FS_ROOT; + f != NULL; + f = (struct httpd_fsdata_file_noconst *)f->next) { + + if(httpd_fs_strcmp(name, f->name) == 0) { + file->data = f->data; + file->len = f->len; +#if HTTPD_FS_STATISTICS + ++count[i]; +#endif /* HTTPD_FS_STATISTICS */ + return 1; + } +#if HTTPD_FS_STATISTICS + ++i; +#endif /* HTTPD_FS_STATISTICS */ + + } + return 0; +} +/*-----------------------------------------------------------------------------------*/ +void +httpd_fs_init(void) +{ +#if HTTPD_FS_STATISTICS + u16_t i; + for(i = 0; i < HTTPD_FS_NUMFILES; i++) { + count[i] = 0; + } +#endif /* HTTPD_FS_STATISTICS */ +} +/*-----------------------------------------------------------------------------------*/ +#if HTTPD_FS_STATISTICS +u16_t httpd_fs_count +(char *name) +{ + struct httpd_fsdata_file_noconst *f; + u16_t i; + + i = 0; + for(f = (struct httpd_fsdata_file_noconst *)HTTPD_FS_ROOT; + f != NULL; + f = (struct httpd_fsdata_file_noconst *)f->next) { + + if(httpd_fs_strcmp(name, f->name) == 0) { + return count[i]; + } + ++i; + } + return 0; +} +#endif /* HTTPD_FS_STATISTICS */ +/*-----------------------------------------------------------------------------------*/ diff --git a/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fs.h b/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fs.h new file mode 100644 index 000000000..b594eea56 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fs.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2001, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: httpd-fs.h,v 1.1 2006/06/07 09:13:08 adam Exp $ + */ +#ifndef __HTTPD_FS_H__ +#define __HTTPD_FS_H__ + +#define HTTPD_FS_STATISTICS 1 + +struct httpd_fs_file { + char *data; + int len; +}; + +/* file must be allocated by caller and will be filled in + by the function. */ +int httpd_fs_open(const char *name, struct httpd_fs_file *file); + +#ifdef HTTPD_FS_STATISTICS +#if HTTPD_FS_STATISTICS == 1 +u16_t httpd_fs_count(char *name); +#endif /* HTTPD_FS_STATISTICS */ +#endif /* HTTPD_FS_STATISTICS */ + +void httpd_fs_init(void); + +#endif /* __HTTPD_FS_H__ */ diff --git a/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fs/404.html b/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fs/404.html new file mode 100644 index 000000000..43e7f4cad --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fs/404.html @@ -0,0 +1,8 @@ + + +

+

404 - file not found

+

Go here instead.

+
+ + \ No newline at end of file diff --git a/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fs/index.html b/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fs/index.html new file mode 100644 index 000000000..1d3bbeee1 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fs/index.html @@ -0,0 +1,13 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +Loading index.shtml. Click here if not automatically redirected. + + + + + diff --git a/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fs/index.shtml b/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fs/index.shtml new file mode 100644 index 000000000..1923ea762 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fs/index.shtml @@ -0,0 +1,20 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +RTOS Stats | TCP Stats | Connections | FreeRTOS.org Homepage | IO +

+


+

+

Task statistics

+Page will refresh every 2 seconds.

+

Task          State  Priority  Stack	#
************************************************
+%! rtos-stats +
+
+ + + diff --git a/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fs/io.shtml b/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fs/io.shtml new file mode 100644 index 000000000..07554bb71 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fs/io.shtml @@ -0,0 +1,28 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +RTOS Stats | TCP Stats | Connections | FreeRTOS.org Homepage | IO +

+


+LED and LCD IO
+ +

+ +Use the check box to turn on or off the LED, enter text to display on the OLED display, then click "Update IO". + + +

+

+%! led-io +

+ +

+

+ + + + diff --git a/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fs/stats.shtml b/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fs/stats.shtml new file mode 100644 index 000000000..d762f40d8 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fs/stats.shtml @@ -0,0 +1,41 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +RTOS Stats | TCP Stats | Connections | FreeRTOS.org Homepage | IO +

+


+

+

Network statistics

+ +
+IP           Packets dropped
+             Packets received
+             Packets sent
+IP errors    IP version/header length
+             IP length, high byte
+             IP length, low byte
+             IP fragments
+             Header checksum
+             Wrong protocol
+ICMP	     Packets dropped
+             Packets received
+             Packets sent
+             Type errors
+TCP          Packets dropped
+             Packets received
+             Packets sent
+             Checksum errors
+             Data packets without ACKs
+             Resets
+             Retransmissions
+	     No connection avaliable
+	     Connection attempts to closed ports
+
%! net-stats
+
+
+ + diff --git a/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fs/tcp.shtml b/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fs/tcp.shtml new file mode 100644 index 000000000..654d61f21 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fs/tcp.shtml @@ -0,0 +1,21 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +RTOS Stats | TCP Stats | Connections | FreeRTOS.org Homepage | IO +

+


+
+

Network connections

+

+ + +%! tcp-connections + + + + + diff --git a/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fsdata.c b/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fsdata.c new file mode 100644 index 000000000..a7fcfab5a --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fsdata.c @@ -0,0 +1,470 @@ +static const unsigned char data_404_html[] = { + /* /404.html */ + 0x2f, 0x34, 0x30, 0x34, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0, + 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xd, 0xa, 0x20, 0x20, + 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x62, 0x67, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3d, 0x22, 0x77, 0x68, 0x69, 0x74, 0x65, + 0x22, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x63, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3e, 0xd, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 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, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x68, 0x33, 0x3e, 0x47, 0x6f, 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, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, + 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3e, 0xd, 0xa, 0x20, + 0x20, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xd, 0xa, + 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0}; + +static const unsigned char data_index_html[] = { + /* /index.html */ + 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0, + 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, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, + 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, + 0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, + 0x57, 0x45, 0x42, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x20, 0x64, 0x65, 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x42, + 0x4f, 0x44, 0x59, 0x20, 0x6f, 0x6e, 0x4c, 0x6f, 0x61, 0x64, + 0x3d, 0x22, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x73, + 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, + 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x27, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x73, 0x68, 0x74, + 0x6d, 0x6c, 0x27, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x2c, + 0x31, 0x30, 0x30, 0x29, 0x22, 0x62, 0x67, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3d, 0x22, 0x23, 0x43, 0x43, 0x43, 0x43, 0x66, + 0x66, 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x66, 0x6f, 0x6e, 0x74, + 0x20, 0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 0x61, 0x72, 0x69, + 0x61, 0x6c, 0x22, 0x3e, 0xd, 0xa, 0x4c, 0x6f, 0x61, 0x64, + 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, + 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x2e, 0x20, 0x20, 0x43, 0x6c, + 0x69, 0x63, 0x6b, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, + 0x66, 0x3d, 0x22, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x73, + 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x68, 0x65, 0x72, 0x65, + 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, + 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x72, 0x65, 0x64, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x65, 0x64, 0x2e, 0xd, 0xa, 0x3c, + 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xd, 0xa, 0x3c, 0x2f, + 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x62, + 0x6f, 0x64, 0x79, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x68, 0x74, + 0x6d, 0x6c, 0x3e, 0xd, 0xa, 0xd, 0xa, 0}; + +static const unsigned char data_index_shtml[] = { + /* /index.shtml */ + 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0, + 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, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, + 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, + 0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, + 0x57, 0x45, 0x42, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x20, 0x64, 0x65, 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x42, + 0x4f, 0x44, 0x59, 0x20, 0x6f, 0x6e, 0x4c, 0x6f, 0x61, 0x64, + 0x3d, 0x22, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x73, + 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, + 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x27, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x73, 0x68, 0x74, + 0x6d, 0x6c, 0x27, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x2c, + 0x32, 0x30, 0x30, 0x30, 0x29, 0x22, 0x62, 0x67, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3d, 0x22, 0x23, 0x43, 0x43, 0x43, 0x43, + 0x66, 0x66, 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x66, 0x6f, 0x6e, + 0x74, 0x20, 0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 0x61, 0x72, + 0x69, 0x61, 0x6c, 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x61, 0x20, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x52, + 0x54, 0x4f, 0x53, 0x20, 0x53, 0x74, 0x61, 0x74, 0x73, 0x3c, + 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, + 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, + 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x54, 0x43, 0x50, 0x20, 0x53, + 0x74, 0x61, 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, + 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x74, 0x63, 0x70, + 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, + 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, + 0x62, 0x3e, 0x20, 0x3c, 0x61, 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, 0x2e, 0x6f, 0x72, 0x67, + 0x20, 0x48, 0x6f, 0x6d, 0x65, 0x70, 0x61, 0x67, 0x65, 0x3c, + 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, + 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x69, 0x6f, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, + 0x22, 0x3e, 0x49, 0x4f, 0x3c, 0x2f, 0x61, 0x3e, 0xd, 0xa, + 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0x3c, + 0x68, 0x72, 0x3e, 0xd, 0xa, 0x3c, 0x62, 0x72, 0x3e, 0x3c, + 0x70, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x32, 0x3e, 0x54, 0x61, + 0x73, 0x6b, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, + 0x69, 0x63, 0x73, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0xd, 0xa, + 0x50, 0x61, 0x67, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, + 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x20, 0x65, 0x76, + 0x65, 0x72, 0x79, 0x20, 0x32, 0x20, 0x73, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x73, 0x2e, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0x3c, + 0x66, 0x6f, 0x6e, 0x74, 0x20, 0x66, 0x61, 0x63, 0x65, 0x3d, + 0x22, 0x63, 0x6f, 0x75, 0x72, 0x69, 0x65, 0x72, 0x22, 0x3e, + 0x3c, 0x70, 0x72, 0x65, 0x3e, 0x54, 0x61, 0x73, 0x6b, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x20, 0x20, 0x50, 0x72, 0x69, 0x6f, + 0x72, 0x69, 0x74, 0x79, 0x20, 0x20, 0x53, 0x74, 0x61, 0x63, + 0x6b, 0x9, 0x23, 0x3c, 0x62, 0x72, 0x3e, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x3c, 0x62, 0x72, 0x3e, 0xd, + 0xa, 0x25, 0x21, 0x20, 0x72, 0x74, 0x6f, 0x73, 0x2d, 0x73, + 0x74, 0x61, 0x74, 0x73, 0xd, 0xa, 0x3c, 0x2f, 0x70, 0x72, + 0x65, 0x3e, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xd, + 0xa, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xd, 0xa, + 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xd, 0xa, 0x3c, + 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xd, 0xa, 0xd, 0xa, +0}; + +static const unsigned char data_io_shtml[] = { + /* /io.shtml */ + 0x2f, 0x69, 0x6f, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0, + 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, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, + 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, + 0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, + 0x57, 0x45, 0x42, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x20, 0x64, 0x65, 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x42, + 0x4f, 0x44, 0x59, 0x20, 0x62, 0x67, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3d, 0x22, 0x23, 0x43, 0x43, 0x43, 0x43, 0x66, 0x66, + 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x20, + 0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 0x61, 0x72, 0x69, 0x61, + 0x6c, 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x61, 0x20, 0x68, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, + 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x52, 0x54, 0x4f, + 0x53, 0x20, 0x53, 0x74, 0x61, 0x74, 0x73, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, + 0x6c, 0x22, 0x3e, 0x54, 0x43, 0x50, 0x20, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, + 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x74, 0x63, 0x70, 0x2e, 0x73, + 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 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, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x48, + 0x6f, 0x6d, 0x65, 0x70, 0x61, 0x67, 0x65, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x69, 0x6f, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, + 0x49, 0x4f, 0x3c, 0x2f, 0x61, 0x3e, 0xd, 0xa, 0x3c, 0x62, + 0x72, 0x3e, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x72, + 0x3e, 0xd, 0xa, 0x3c, 0x62, 0x3e, 0x4c, 0x45, 0x44, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x4c, 0x43, 0x44, 0x20, 0x49, 0x4f, + 0x3c, 0x2f, 0x62, 0x3e, 0x3c, 0x62, 0x72, 0x3e, 0xd, 0xa, + 0xd, 0xa, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0xd, 0xa, 0x55, + 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x20, 0x62, 0x6f, 0x78, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x6e, 0x20, 0x6f, 0x72, + 0x20, 0x6f, 0x66, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, + 0x45, 0x44, 0x2c, 0x20, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, + 0x74, 0x65, 0x78, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x20, 0x6f, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x4f, 0x4c, 0x45, 0x44, 0x20, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x20, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x20, 0x22, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x49, 0x4f, 0x22, 0x2e, + 0xd, 0xa, 0xd, 0xa, 0xd, 0xa, 0x3c, 0x70, 0x3e, 0xd, + 0xa, 0x3c, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x61, 0x46, 0x6f, 0x72, 0x6d, 0x22, 0x20, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x2f, 0x69, + 0x6f, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x20, 0x6d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3d, 0x22, 0x67, 0x65, 0x74, + 0x22, 0x3e, 0xd, 0xa, 0x25, 0x21, 0x20, 0x6c, 0x65, 0x64, + 0x2d, 0x69, 0x6f, 0xd, 0xa, 0x3c, 0x70, 0x3e, 0xd, 0xa, + 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, + 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, 0x49, 0x4f, 0x22, 0x3e, 0xd, + 0xa, 0x3c, 0x2f, 0x66, 0x6f, 0x72, 0x6d, 0x3e, 0xd, 0xa, + 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0x3c, + 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xd, 0xa, 0x3c, 0x2f, + 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x68, + 0x74, 0x6d, 0x6c, 0x3e, 0xd, 0xa, 0xd, 0xa, 0}; + +static const unsigned char data_stats_shtml[] = { + /* /stats.shtml */ + 0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0, + 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, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, + 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, + 0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, + 0x57, 0x45, 0x42, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x20, 0x64, 0x65, 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x42, + 0x4f, 0x44, 0x59, 0x20, 0x62, 0x67, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3d, 0x22, 0x23, 0x43, 0x43, 0x43, 0x43, 0x66, 0x66, + 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x20, + 0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 0x61, 0x72, 0x69, 0x61, + 0x6c, 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x61, 0x20, 0x68, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, + 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x52, 0x54, 0x4f, + 0x53, 0x20, 0x53, 0x74, 0x61, 0x74, 0x73, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, + 0x6c, 0x22, 0x3e, 0x54, 0x43, 0x50, 0x20, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, + 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x74, 0x63, 0x70, 0x2e, 0x73, + 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 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, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x48, + 0x6f, 0x6d, 0x65, 0x70, 0x61, 0x67, 0x65, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x69, 0x6f, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, + 0x49, 0x4f, 0x3c, 0x2f, 0x61, 0x3e, 0xd, 0xa, 0x3c, 0x62, + 0x72, 0x3e, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x72, + 0x3e, 0xd, 0xa, 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x70, 0x3e, + 0xd, 0xa, 0x3c, 0x68, 0x32, 0x3e, 0x4e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, + 0x74, 0x69, 0x63, 0x73, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0xd, + 0xa, 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3d, 0x22, 0x33, 0x30, 0x30, 0x22, 0x20, + 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3d, 0x22, 0x30, 0x22, + 0x3e, 0xd, 0xa, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x64, + 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x6c, 0x65, + 0x66, 0x74, 0x22, 0x3e, 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x20, + 0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 0x63, 0x6f, 0x75, 0x72, + 0x69, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x65, 0x3e, + 0xd, 0xa, 0x49, 0x50, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x73, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, + 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x73, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, + 0x64, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, + 0x65, 0x74, 0x73, 0x20, 0x73, 0x65, 0x6e, 0x74, 0xd, 0xa, + 0x49, 0x50, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x20, + 0x20, 0x20, 0x20, 0x49, 0x50, 0x20, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xd, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x49, 0x50, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x2c, 0x20, 0x68, 0x69, 0x67, 0x68, 0x20, 0x62, 0x79, + 0x74, 0x65, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x49, 0x50, 0x20, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x20, 0x6c, 0x6f, + 0x77, 0x20, 0x62, 0x79, 0x74, 0x65, 0xd, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x49, 0x50, 0x20, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x73, 0x75, 0x6d, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x57, 0x72, + 0x6f, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0xd, 0xa, 0x49, 0x43, 0x4d, 0x50, 0x9, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x73, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0xd, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x73, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, + 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x73, 0x20, 0x73, 0x65, 0x6e, 0x74, 0xd, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x54, 0x79, 0x70, 0x65, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x73, 0xd, 0xa, 0x54, 0x43, 0x50, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, + 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x64, 0x72, 0x6f, 0x70, + 0x70, 0x65, 0x64, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, + 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x72, 0x65, 0x63, 0x65, + 0x69, 0x76, 0x65, 0x64, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, + 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x73, 0x65, 0x6e, + 0x74, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x73, 0x75, 0x6d, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x73, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x44, 0x61, 0x74, 0x61, + 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x41, 0x43, 0x4b, + 0x73, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x52, 0x65, 0x73, 0x65, + 0x74, 0x73, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x52, 0x65, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0xd, 0xa, 0x9, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x4e, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x76, 0x61, 0x6c, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0xd, 0xa, 0x9, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, + 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, + 0x20, 0x70, 0x6f, 0x72, 0x74, 0x73, 0xd, 0xa, 0x3c, 0x2f, + 0x70, 0x72, 0x65, 0x3e, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, + 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, + 0x3c, 0x70, 0x72, 0x65, 0x3e, 0x25, 0x21, 0x20, 0x6e, 0x65, + 0x74, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x73, 0xd, 0xa, 0x3c, + 0x2f, 0x70, 0x72, 0x65, 0x3e, 0x3c, 0x2f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, + 0x74, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, + 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, + 0xd, 0xa, 0}; + +static const unsigned char data_tcp_shtml[] = { + /* /tcp.shtml */ + 0x2f, 0x74, 0x63, 0x70, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0, + 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, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, + 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, + 0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, + 0x57, 0x45, 0x42, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x20, 0x64, 0x65, 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x42, + 0x4f, 0x44, 0x59, 0x20, 0x62, 0x67, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3d, 0x22, 0x23, 0x43, 0x43, 0x43, 0x43, 0x66, 0x66, + 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x20, + 0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 0x61, 0x72, 0x69, 0x61, + 0x6c, 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x61, 0x20, 0x68, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, + 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x52, 0x54, 0x4f, + 0x53, 0x20, 0x53, 0x74, 0x61, 0x74, 0x73, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, + 0x6c, 0x22, 0x3e, 0x54, 0x43, 0x50, 0x20, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, + 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x74, 0x63, 0x70, 0x2e, 0x73, + 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 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, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x48, + 0x6f, 0x6d, 0x65, 0x70, 0x61, 0x67, 0x65, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x69, 0x6f, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, + 0x49, 0x4f, 0x3c, 0x2f, 0x61, 0x3e, 0xd, 0xa, 0x3c, 0x62, + 0x72, 0x3e, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x72, + 0x3e, 0xd, 0xa, 0x3c, 0x62, 0x72, 0x3e, 0xd, 0xa, 0x3c, + 0x68, 0x32, 0x3e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0xd, 0xa, 0x3c, + 0x70, 0x3e, 0xd, 0xa, 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x3e, 0xd, 0xa, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x68, + 0x3e, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x2f, 0x74, 0x68, + 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x52, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x3c, 0x2f, 0x74, 0x68, 0x3e, + 0x3c, 0x74, 0x68, 0x3e, 0x52, 0x65, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3c, + 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x54, 0x69, + 0x6d, 0x65, 0x72, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, + 0x68, 0x3e, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x3c, 0x2f, 0x74, + 0x68, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0xd, 0xa, 0x25, + 0x21, 0x20, 0x74, 0x63, 0x70, 0x2d, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0xd, 0xa, 0x3c, + 0x2f, 0x70, 0x72, 0x65, 0x3e, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, + 0x74, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, + 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, + 0xd, 0xa, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xd, + 0xa, 0xd, 0xa, 0}; + +const struct httpd_fsdata_file file_404_html[] = {{NULL, data_404_html, data_404_html + 10, sizeof(data_404_html) - 10}}; + +const struct httpd_fsdata_file file_index_html[] = {{file_404_html, data_index_html, data_index_html + 12, sizeof(data_index_html) - 12}}; + +const struct httpd_fsdata_file file_index_shtml[] = {{file_index_html, data_index_shtml, data_index_shtml + 13, sizeof(data_index_shtml) - 13}}; + +const struct httpd_fsdata_file file_io_shtml[] = {{file_index_shtml, data_io_shtml, data_io_shtml + 10, sizeof(data_io_shtml) - 10}}; + +const struct httpd_fsdata_file file_stats_shtml[] = {{file_io_shtml, data_stats_shtml, data_stats_shtml + 13, sizeof(data_stats_shtml) - 13}}; + +const struct httpd_fsdata_file file_tcp_shtml[] = {{file_stats_shtml, data_tcp_shtml, data_tcp_shtml + 11, sizeof(data_tcp_shtml) - 11}}; + +#define HTTPD_FS_ROOT file_tcp_shtml + +#define HTTPD_FS_NUMFILES 6 diff --git a/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fsdata.h b/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fsdata.h new file mode 100644 index 000000000..52d35c265 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/webserver/httpd-fsdata.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2001, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: httpd-fsdata.h,v 1.1 2006/06/07 09:13:08 adam Exp $ + */ +#ifndef __HTTPD_FSDATA_H__ +#define __HTTPD_FSDATA_H__ + +#include "uip.h" + +struct httpd_fsdata_file { + const struct httpd_fsdata_file *next; + const char *name; + const char *data; + const int len; +#ifdef HTTPD_FS_STATISTICS +#if HTTPD_FS_STATISTICS == 1 + u16_t count; +#endif /* HTTPD_FS_STATISTICS */ +#endif /* HTTPD_FS_STATISTICS */ +}; + +struct httpd_fsdata_file_noconst { + struct httpd_fsdata_file *next; + char *name; + char *data; + int len; +#ifdef HTTPD_FS_STATISTICS +#if HTTPD_FS_STATISTICS == 1 + u16_t count; +#endif /* HTTPD_FS_STATISTICS */ +#endif /* HTTPD_FS_STATISTICS */ +}; + +#endif /* __HTTPD_FSDATA_H__ */ diff --git a/Demo/CORTEX_LM3S6965_GCC/webserver/httpd.c b/Demo/CORTEX_LM3S6965_GCC/webserver/httpd.c new file mode 100644 index 000000000..644cf16b7 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/webserver/httpd.c @@ -0,0 +1,346 @@ +/** + * \addtogroup apps + * @{ + */ + +/** + * \defgroup httpd Web server + * @{ + * The uIP web server is a very simplistic implementation of an HTTP + * server. It can serve web pages and files from a read-only ROM + * filesystem, and provides a very small scripting language. + + */ + +/** + * \file + * Web server + * \author + * Adam Dunkels + */ + + +/* + * Copyright (c) 2004, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: httpd.c,v 1.2 2006/06/11 21:46:38 adam Exp $ + */ + +#include "uip.h" +#include "httpd.h" +#include "httpd-fs.h" +#include "httpd-cgi.h" +#include "http-strings.h" + +#include + +#define STATE_WAITING 0 +#define STATE_OUTPUT 1 + +#define ISO_nl 0x0a +#define ISO_space 0x20 +#define ISO_bang 0x21 +#define ISO_percent 0x25 +#define ISO_period 0x2e +#define ISO_slash 0x2f +#define ISO_colon 0x3a + + +/*---------------------------------------------------------------------------*/ +static unsigned short +generate_part_of_file(void *state) +{ + struct httpd_state *s = (struct httpd_state *)state; + + if(s->file.len > uip_mss()) { + s->len = uip_mss(); + } else { + s->len = s->file.len; + } + memcpy(uip_appdata, s->file.data, s->len); + + return s->len; +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(send_file(struct httpd_state *s)) +{ + PSOCK_BEGIN(&s->sout); + + do { + PSOCK_GENERATOR_SEND(&s->sout, generate_part_of_file, s); + s->file.len -= s->len; + s->file.data += s->len; + } while(s->file.len > 0); + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(send_part_of_file(struct httpd_state *s)) +{ + PSOCK_BEGIN(&s->sout); + + PSOCK_SEND(&s->sout, s->file.data, s->len); + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static void +next_scriptstate(struct httpd_state *s) +{ + char *p; + p = strchr(s->scriptptr, ISO_nl) + 1; + s->scriptlen -= (unsigned short)(p - s->scriptptr); + s->scriptptr = p; +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(handle_script(struct httpd_state *s)) +{ + char *ptr; + + PT_BEGIN(&s->scriptpt); + + + while(s->file.len > 0) { + + /* Check if we should start executing a script. */ + if(*s->file.data == ISO_percent && + *(s->file.data + 1) == ISO_bang) { + s->scriptptr = s->file.data + 3; + s->scriptlen = s->file.len - 3; + if(*(s->scriptptr - 1) == ISO_colon) { + httpd_fs_open(s->scriptptr + 1, &s->file); + PT_WAIT_THREAD(&s->scriptpt, send_file(s)); + } else { + PT_WAIT_THREAD(&s->scriptpt, + httpd_cgi(s->scriptptr)(s, s->scriptptr)); + } + next_scriptstate(s); + + /* The script is over, so we reset the pointers and continue + sending the rest of the file. */ + s->file.data = s->scriptptr; + s->file.len = s->scriptlen; + } else { + /* See if we find the start of script marker in the block of HTML + to be sent. */ + + if(s->file.len > uip_mss()) { + s->len = uip_mss(); + } else { + s->len = s->file.len; + } + + if(*s->file.data == ISO_percent) { + ptr = strchr(s->file.data + 1, ISO_percent); + } else { + ptr = strchr(s->file.data, ISO_percent); + } + if(ptr != NULL && + ptr != s->file.data) { + s->len = (int)(ptr - s->file.data); + if(s->len >= uip_mss()) { + s->len = uip_mss(); + } + } + PT_WAIT_THREAD(&s->scriptpt, send_part_of_file(s)); + s->file.data += s->len; + s->file.len -= s->len; + + } + } + + PT_END(&s->scriptpt); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(send_headers(struct httpd_state *s, const char *statushdr)) +{ + char *ptr; + + PSOCK_BEGIN(&s->sout); + + PSOCK_SEND_STR(&s->sout, statushdr); + + ptr = strrchr(s->filename, ISO_period); + if(ptr == NULL) { + PSOCK_SEND_STR(&s->sout, http_content_type_binary); + } else if(strncmp(http_html, ptr, 5) == 0 || + strncmp(http_shtml, ptr, 6) == 0) { + PSOCK_SEND_STR(&s->sout, http_content_type_html); + } else if(strncmp(http_css, ptr, 4) == 0) { + PSOCK_SEND_STR(&s->sout, http_content_type_css); + } else if(strncmp(http_png, ptr, 4) == 0) { + PSOCK_SEND_STR(&s->sout, http_content_type_png); + } else if(strncmp(http_gif, ptr, 4) == 0) { + PSOCK_SEND_STR(&s->sout, http_content_type_gif); + } else if(strncmp(http_jpg, ptr, 4) == 0) { + PSOCK_SEND_STR(&s->sout, http_content_type_jpg); + } else { + PSOCK_SEND_STR(&s->sout, http_content_type_plain); + } + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(handle_output(struct httpd_state *s)) +{ + char *ptr; + + PT_BEGIN(&s->outputpt); + + if(!httpd_fs_open(s->filename, &s->file)) { + httpd_fs_open(http_404_html, &s->file); + strcpy(s->filename, http_404_html); + PT_WAIT_THREAD(&s->outputpt, + send_headers(s, + http_header_404)); + PT_WAIT_THREAD(&s->outputpt, + send_file(s)); + } else { + PT_WAIT_THREAD(&s->outputpt, + send_headers(s, + http_header_200)); + ptr = strchr(s->filename, ISO_period); + if(ptr != NULL && strncmp(ptr, http_shtml, 6) == 0) { + PT_INIT(&s->scriptpt); + PT_WAIT_THREAD(&s->outputpt, handle_script(s)); + } else { + PT_WAIT_THREAD(&s->outputpt, + send_file(s)); + } + } + PSOCK_CLOSE(&s->sout); + PT_END(&s->outputpt); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(handle_input(struct httpd_state *s)) +{ + PSOCK_BEGIN(&s->sin); + + PSOCK_READTO(&s->sin, ISO_space); + + + if(strncmp(s->inputbuf, http_get, 4) != 0) { + PSOCK_CLOSE_EXIT(&s->sin); + } + PSOCK_READTO(&s->sin, ISO_space); + + if(s->inputbuf[0] != ISO_slash) { + PSOCK_CLOSE_EXIT(&s->sin); + } + + if(s->inputbuf[1] == ISO_space) { + strncpy(s->filename, http_index_html, sizeof(s->filename)); + } else { + + s->inputbuf[PSOCK_DATALEN(&s->sin) - 1] = 0; + + /* Process any form input being sent to the server. */ + { + extern void vApplicationProcessFormInput( char *pcInputString, long xInputLength ); + vApplicationProcessFormInput( s->inputbuf, PSOCK_DATALEN(&s->sin) ); + } + + strncpy(s->filename, &s->inputbuf[0], sizeof(s->filename)); + } + + /* httpd_log_file(uip_conn->ripaddr, s->filename);*/ + + s->state = STATE_OUTPUT; + + while(1) { + PSOCK_READTO(&s->sin, ISO_nl); + + if(strncmp(s->inputbuf, http_referer, 8) == 0) { + s->inputbuf[PSOCK_DATALEN(&s->sin) - 2] = 0; + /* httpd_log(&s->inputbuf[9]);*/ + } + } + + PSOCK_END(&s->sin); +} +/*---------------------------------------------------------------------------*/ +static void +handle_connection(struct httpd_state *s) +{ + handle_input(s); + if(s->state == STATE_OUTPUT) { + handle_output(s); + } +} +/*---------------------------------------------------------------------------*/ +void +httpd_appcall(void) +{ + struct httpd_state *s = (struct httpd_state *)&(uip_conn->appstate); + + if(uip_closed() || uip_aborted() || uip_timedout()) { + } else if(uip_connected()) { + PSOCK_INIT(&s->sin, s->inputbuf, sizeof(s->inputbuf) - 1); + PSOCK_INIT(&s->sout, s->inputbuf, sizeof(s->inputbuf) - 1); + PT_INIT(&s->outputpt); + s->state = STATE_WAITING; + /* timer_set(&s->timer, CLOCK_SECOND * 100);*/ + s->timer = 0; + handle_connection(s); + } else if(s != NULL) { + if(uip_poll()) { + ++s->timer; + if(s->timer >= 20) { + uip_abort(); + } + } else { + s->timer = 0; + } + handle_connection(s); + } else { + uip_abort(); + } +} +/*---------------------------------------------------------------------------*/ +/** + * \brief Initialize the web server + * + * This function initializes the web server and should be + * called at system boot-up. + */ +void +httpd_init(void) +{ + uip_listen(HTONS(80)); +} +/*---------------------------------------------------------------------------*/ +/** @} */ diff --git a/Demo/CORTEX_LM3S6965_GCC/webserver/httpd.h b/Demo/CORTEX_LM3S6965_GCC/webserver/httpd.h new file mode 100644 index 000000000..7f7a6666e --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/webserver/httpd.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2001-2005, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: httpd.h,v 1.2 2006/06/11 21:46:38 adam Exp $ + * + */ + +#ifndef __HTTPD_H__ +#define __HTTPD_H__ + +#include "psock.h" +#include "httpd-fs.h" + +struct httpd_state { + unsigned char timer; + struct psock sin, sout; + struct pt outputpt, scriptpt; + char inputbuf[50]; + char filename[20]; + char state; + struct httpd_fs_file file; + int len; + char *scriptptr; + int scriptlen; + + unsigned short count; +}; + +void httpd_init(void); +void httpd_appcall(void); + +void httpd_log(char *msg); +void httpd_log_file(u16_t *requester, char *file); + +#endif /* __HTTPD_H__ */ diff --git a/Demo/CORTEX_LM3S6965_GCC/webserver/makefsdata b/Demo/CORTEX_LM3S6965_GCC/webserver/makefsdata new file mode 100644 index 000000000..8d2715a8a --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/webserver/makefsdata @@ -0,0 +1,78 @@ +#!/usr/bin/perl + +open(OUTPUT, "> httpd-fsdata.c"); + +chdir("httpd-fs"); + +opendir(DIR, "."); +@files = grep { !/^\./ && !/(CVS|~)/ } readdir(DIR); +closedir(DIR); + +foreach $file (@files) { + + if(-d $file && $file !~ /^\./) { + print "Processing directory $file\n"; + opendir(DIR, $file); + @newfiles = grep { !/^\./ && !/(CVS|~)/ } readdir(DIR); + closedir(DIR); + printf "Adding files @newfiles\n"; + @files = (@files, map { $_ = "$file/$_" } @newfiles); + next; + } +} + +foreach $file (@files) { + if(-f $file) { + + print "Adding file $file\n"; + + open(FILE, $file) || die "Could not open file $file\n"; + + $file =~ s-^-/-; + $fvar = $file; + $fvar =~ s-/-_-g; + $fvar =~ s-\.-_-g; + # for AVR, add PROGMEM here + print(OUTPUT "static const unsigned char data".$fvar."[] = {\n"); + print(OUTPUT "\t/* $file */\n\t"); + for($j = 0; $j < length($file); $j++) { + printf(OUTPUT "%#02x, ", unpack("C", substr($file, $j, 1))); + } + printf(OUTPUT "0,\n"); + + + $i = 0; + while(read(FILE, $data, 1)) { + if($i == 0) { + print(OUTPUT "\t"); + } + printf(OUTPUT "%#02x, ", unpack("C", $data)); + $i++; + if($i == 10) { + print(OUTPUT "\n"); + $i = 0; + } + } + print(OUTPUT "0};\n\n"); + close(FILE); + push(@fvars, $fvar); + push(@pfiles, $file); + } +} + +for($i = 0; $i < @fvars; $i++) { + $file = $pfiles[$i]; + $fvar = $fvars[$i]; + + if($i == 0) { + $prevfile = "NULL"; + } else { + $prevfile = "file" . $fvars[$i - 1]; + } + print(OUTPUT "const struct httpd_fsdata_file file".$fvar."[] = {{$prevfile, data$fvar, "); + print(OUTPUT "data$fvar + ". (length($file) + 1) .", "); + print(OUTPUT "sizeof(data$fvar) - ". (length($file) + 1) ."}};\n\n"); +} + +print(OUTPUT "#define HTTPD_FS_ROOT file$fvars[$i - 1]\n\n"); +print(OUTPUT "#define HTTPD_FS_NUMFILES $i\n"); diff --git a/Demo/CORTEX_LM3S6965_GCC/webserver/makestrings b/Demo/CORTEX_LM3S6965_GCC/webserver/makestrings new file mode 100644 index 000000000..8a13c6d29 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/webserver/makestrings @@ -0,0 +1,40 @@ +#!/usr/bin/perl + + +sub stringify { + my $name = shift(@_); + open(OUTPUTC, "> $name.c"); + open(OUTPUTH, "> $name.h"); + + open(FILE, "$name"); + + while() { + if(/(.+) "(.+)"/) { + $var = $1; + $data = $2; + + $datan = $data; + $datan =~ s/\\r/\r/g; + $datan =~ s/\\n/\n/g; + $datan =~ s/\\01/\01/g; + $datan =~ s/\\0/\0/g; + + printf(OUTPUTC "const char $var\[%d] = \n", length($datan) + 1); + printf(OUTPUTC "/* \"$data\" */\n"); + printf(OUTPUTC "{"); + for($j = 0; $j < length($datan); $j++) { + printf(OUTPUTC "%#02x, ", unpack("C", substr($datan, $j, 1))); + } + printf(OUTPUTC "};\n"); + + printf(OUTPUTH "extern const char $var\[%d];\n", length($datan) + 1); + + } + } + close(OUTPUTC); + close(OUTPUTH); +} +stringify("http-strings"); + +exit 0; + diff --git a/Demo/CORTEX_LM3S6965_GCC/webserver/uIP_Task.c b/Demo/CORTEX_LM3S6965_GCC/webserver/uIP_Task.c new file mode 100644 index 000000000..0b9a0f855 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/webserver/uIP_Task.c @@ -0,0 +1,300 @@ +/* + FreeRTOS.org V4.3.0 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + *************************************************************************** +*/ +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "semphr.h" + +#include "lcd_message.h" + +/* uip includes. */ +#include "hw_types.h" + +#include "uip.h" +#include "uip_arp.h" +#include "httpd.h" +#include "timer.h" +#include "clock-arch.h" +#include "hw_ethernet.h" +#include "ethernet.h" +#include "hw_memmap.h" +#include "lmi_flash.h" + +/* Demo includes. */ +#include "emac.h" +#include "partest.h" + +/*-----------------------------------------------------------*/ + +/* IP address configuration. */ +#define uipIP_ADDR0 172 +#define uipIP_ADDR1 25 +#define uipIP_ADDR2 218 +#define uipIP_ADDR3 9 + +/* How long to wait before attempting to connect the MAC again. */ +#define uipINIT_WAIT 100 + +/* Shortcut to the header within the Rx buffer. */ +#define xHeader ((struct uip_eth_hdr *) &uip_buf[ 0 ]) + +/* Standard constant. */ +#define uipTOTAL_FRAME_HEADER_SIZE 54 + +/*-----------------------------------------------------------*/ + +/* + * Send the uIP buffer to the MAC. + */ +static void prvENET_Send(void); + +/* + * Setup the MAC address in the MAC itself, and in the uIP stack. + */ +static void prvSetMACAddress( void ); + +/* + * Port functions required by the uIP stack. + */ +void clock_init( void ); +clock_time_t clock_time( void ); + +/*-----------------------------------------------------------*/ + +/* The semaphore used by the ISR to wake the uIP task. */ +extern xSemaphoreHandle xEMACSemaphore; + +/*-----------------------------------------------------------*/ + +void clock_init(void) +{ + /* This is done when the scheduler starts. */ +} +/*-----------------------------------------------------------*/ + +clock_time_t clock_time( void ) +{ + return xTaskGetTickCount(); +} +/*-----------------------------------------------------------*/ + +void vuIP_Task( void *pvParameters ) +{ +portBASE_TYPE i; +uip_ipaddr_t xIPAddr; +struct timer periodic_timer, arp_timer; +extern void ( vEMAC_ISR )( void ); + + /* Create the semaphore used by the ISR to wake this task. */ + vSemaphoreCreateBinary( xEMACSemaphore ); + + /* Initialise the uIP stack. */ + timer_set( &periodic_timer, configTICK_RATE_HZ / 2 ); + timer_set( &arp_timer, configTICK_RATE_HZ * 10 ); + uip_init(); + uip_ipaddr( xIPAddr, uipIP_ADDR0, uipIP_ADDR1, uipIP_ADDR2, uipIP_ADDR3 ); + uip_sethostaddr( xIPAddr ); + httpd_init(); + + while( vInitEMAC() != pdPASS ) + { + vTaskDelay( uipINIT_WAIT ); + } + prvSetMACAddress(); + + + for( ;; ) + { + /* Is there received data ready to be processed? */ + uip_len = uiGetEMACRxData( uip_buf ); + + if( uip_len > 0 ) + { + /* Standard uIP loop taken from the uIP manual. */ + + if( xHeader->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(); + prvENET_Send(); + } + } + else if( xHeader->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 ) + { + prvENET_Send(); + } + } + } + else + { + if( timer_expired( &periodic_timer ) ) + { + timer_reset( &periodic_timer ); + for( i = 0; i < UIP_CONNS; i++ ) + { + uip_periodic( i ); + + /* 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(); + prvENET_Send(); + } + } + + /* Call the ARP timer function every 10 seconds. */ + if( timer_expired( &arp_timer ) ) + { + timer_reset( &arp_timer ); + uip_arp_timer(); + } + } + else + { + /* We did not receive a packet, and there was no periodic + processing to perform. Block for a fixed period. If a packet + is received during this period we will be woken by the ISR + giving us the Semaphore. */ + xSemaphoreTake( xEMACSemaphore, configTICK_RATE_HZ / 2 ); + } + } + } +} +/*-----------------------------------------------------------*/ + +static void prvENET_Send(void) +{ + vInitialiseSend(); + vIncrementTxLength( uip_len ); + vSendBufferToMAC(); +} +/*-----------------------------------------------------------*/ + +static void prvSetMACAddress( void ) +{ +unsigned portLONG ulUser0, ulUser1; +unsigned char pucMACArray[8]; +struct uip_eth_addr xAddr; + + /* Get the device MAC address from flash */ + FlashUserGet(&ulUser0, &ulUser1); + + /* Convert the MAC address from flash into sequence of bytes. */ + pucMACArray[0] = ((ulUser0 >> 0) & 0xff); + pucMACArray[1] = ((ulUser0 >> 8) & 0xff); + pucMACArray[2] = ((ulUser0 >> 16) & 0xff); + pucMACArray[3] = ((ulUser1 >> 0) & 0xff); + pucMACArray[4] = ((ulUser1 >> 8) & 0xff); + pucMACArray[5] = ((ulUser1 >> 16) & 0xff); + + /* Program the MAC address. */ + EthernetMACAddrSet(ETH_BASE, pucMACArray); + + xAddr.addr[ 0 ] = pucMACArray[0]; + xAddr.addr[ 1 ] = pucMACArray[1]; + xAddr.addr[ 2 ] = pucMACArray[2]; + xAddr.addr[ 3 ] = pucMACArray[3]; + xAddr.addr[ 4 ] = pucMACArray[4]; + xAddr.addr[ 5 ] = pucMACArray[5]; + uip_setethaddr( xAddr ); +} +/*-----------------------------------------------------------*/ + +void vApplicationProcessFormInput( portCHAR *pcInputString, portBASE_TYPE xInputLength ) +{ +char *c, *pcText; +static portCHAR cMessageForDisplay[ 32 ]; +extern xQueueHandle xOLEDQueue; +xOLEDMessage xOLEDMessage; + + /* Process the form input sent by the IO page of the served HTML. */ + + c = strstr( pcInputString, "?" ); + + if( c ) + { + /* Turn LED's on or off in accordance with the check box status. */ + if( strstr( c, "LED0=1" ) != NULL ) + { + vParTestSetLED( 0, 1 ); + } + else + { + vParTestSetLED( 0, 0 ); + } + + /* Find the start of the text to be displayed on the LCD. */ + pcText = strstr( c, "LCD=" ); + pcText += strlen( "LCD=" ); + + /* Terminate the file name for further processing within uIP. */ + *c = 0x00; + + /* Terminate the LCD string. */ + c = strstr( pcText, " " ); + if( c != NULL ) + { + *c = 0x00; + } + + /* Add required spaces. */ + while( ( c = strstr( pcText, "+" ) ) != NULL ) + { + *c = ' '; + } + + /* Write the message to the LCD. */ + strcpy( cMessageForDisplay, pcText ); + xOLEDMessage.pcMessage = cMessageForDisplay; + xQueueSend( xOLEDQueue, &xOLEDMessage, portMAX_DELAY ); + } +} + diff --git a/Demo/CORTEX_LM3S6965_GCC/webserver/uip-conf.h b/Demo/CORTEX_LM3S6965_GCC/webserver/uip-conf.h new file mode 100644 index 000000000..664077d89 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/webserver/uip-conf.h @@ -0,0 +1,159 @@ +/** + * \addtogroup uipopt + * @{ + */ + +/** + * \name Project-specific configuration options + * @{ + * + * uIP has a number of configuration options that can be overridden + * for each project. These are kept in a project-specific uip-conf.h + * file and all configuration names have the prefix UIP_CONF. + */ + +/* + * Copyright (c) 2006, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: uip-conf.h,v 1.6 2006/06/12 08:00:31 adam Exp $ + */ + +/** + * \file + * An example uIP configuration file + * \author + * Adam Dunkels + */ + +#ifndef __UIP_CONF_H__ +#define __UIP_CONF_H__ + +#include + +/** + * 8 bit datatype + * + * This typedef defines the 8-bit type used throughout uIP. + * + * \hideinitializer + */ +typedef uint8_t u8_t; + +/** + * 16 bit datatype + * + * This typedef defines the 16-bit type used throughout uIP. + * + * \hideinitializer + */ +typedef uint16_t u16_t; + +/** + * Statistics datatype + * + * This typedef defines the dataype used for keeping statistics in + * uIP. + * + * \hideinitializer + */ +typedef unsigned short uip_stats_t; + +/** + * Maximum number of TCP connections. + * + * \hideinitializer + */ +#define UIP_CONF_MAX_CONNECTIONS 40 + +/** + * Maximum number of listening TCP ports. + * + * \hideinitializer + */ +#define UIP_CONF_MAX_LISTENPORTS 40 + +/** + * uIP buffer size. + * + * \hideinitializer + */ +#define UIP_CONF_BUFFER_SIZE 1500 + +/** + * CPU byte order. + * + * \hideinitializer + */ +#define UIP_CONF_BYTE_ORDER LITTLE_ENDIAN + +/** + * Logging on or off + * + * \hideinitializer + */ +#define UIP_CONF_LOGGING 0 + +/** + * UDP support on or off + * + * \hideinitializer + */ +#define UIP_CONF_UDP 0 + +/** + * UDP checksums on or off + * + * \hideinitializer + */ +#define UIP_CONF_UDP_CHECKSUMS 1 + +/** + * uIP statistics on or off + * + * \hideinitializer + */ +#define UIP_CONF_STATISTICS 1 + +/* Here we include the header file for the application(s) we use in + our project. */ +/*#include "smtp.h"*/ +/*#include "hello-world.h"*/ +/*#include "telnetd.h"*/ +#include "webserver.h" +/*#include "dhcpc.h"*/ +/*#include "resolv.h"*/ +/*#include "webclient.h"*/ + +#define UIP_CONF_EXTERNAL_BUFFER + +#endif /* __UIP_CONF_H__ */ + +/** @} */ +/** @} */ diff --git a/Demo/CORTEX_LM3S6965_GCC/webserver/webserver.h b/Demo/CORTEX_LM3S6965_GCC/webserver/webserver.h new file mode 100644 index 000000000..1acb290b8 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_GCC/webserver/webserver.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: webserver.h,v 1.2 2006/06/11 21:46:38 adam Exp $ + * + */ +#ifndef __WEBSERVER_H__ +#define __WEBSERVER_H__ + +#include "httpd.h" + +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 + + +#endif /* __WEBSERVER_H__ */ diff --git a/Demo/CORTEX_LM3S6965_IAR/FreeRTOSConfig.h b/Demo/CORTEX_LM3S6965_IAR/FreeRTOSConfig.h new file mode 100644 index 000000000..d17c161ba --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/FreeRTOSConfig.h @@ -0,0 +1,80 @@ +/* + FreeRTOS.org V4.3.0 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + + Also see http://www.SafeRTOS.com for an IEC 61508 compliant version along + with commercial development and support options. + *************************************************************************** +*/ + +#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. + *----------------------------------------------------------*/ + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 0 +#define configUSE_TICK_HOOK 0 +#define configCPU_CLOCK_HZ ( ( unsigned portLONG ) 50000000 ) +#define configTICK_RATE_HZ ( ( portTickType ) 1000 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned portSHORT ) 70 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 12000 ) ) +#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 1 + +#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 ) +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +/* 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 0 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 + + +#define configKERNEL_INTERRUPT_PRIORITY 255 + + +#endif /* FREERTOS_CONFIG_H */ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/LM3Sxxx.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/LM3Sxxx.h new file mode 100644 index 000000000..11952d416 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/LM3Sxxx.h @@ -0,0 +1,64 @@ +//***************************************************************************** +// +// LM3Sxxx.h - Header file for Luminary Micro LM3Sxxx microcontrollers. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __LM3SXXX_H__ +#define __LM3SXXX_H__ + +#include "hw_adc.h" +#include "hw_comp.h" +#include "hw_flash.h" +#include "hw_gpio.h" +#include "hw_i2c.h" +#include "hw_ints.h" +#include "hw_memmap.h" +#include "hw_nvic.h" +#include "hw_pwm.h" +#include "hw_qei.h" +#include "hw_ssi.h" +#include "hw_sysctl.h" +#include "hw_timer.h" +#include "hw_types.h" +#include "hw_uart.h" +#include "hw_watchdog.h" +#include "adc.h" +#include "comp.h" +#include "cpu.h" +#include "debug.h" +#include "flash.h" +#include "gpio.h" +#include "i2c.h" +#include "interrupt.h" +#include "pwm.h" +#include "qei.h" +#include "ssi.h" +#include "sysctl.h" +#include "systick.h" +#include "timer.h" +#include "uart.h" +#include "watchdog.h" + +#endif // __LM3SXXX_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/LM3Sxxxx.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/LM3Sxxxx.h new file mode 100644 index 000000000..bafb07cda --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/LM3Sxxxx.h @@ -0,0 +1,70 @@ +//***************************************************************************** +// +// LM3Sxxxx.h - Header file for Luminary Micro LM3Sxxxx microcontrollers. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __LM3SXXXX_H__ +#define __LM3SXXXX_H__ + +#include "hw_adc.h" +#include "hw_can.h" +#include "hw_comp.h" +#include "hw_ethernet.h" +#include "hw_flash.h" +#include "hw_gpio.h" +#include "hw_hibernate.h" +#include "hw_i2c.h" +#include "hw_ints.h" +#include "hw_memmap.h" +#include "hw_nvic.h" +#include "hw_pwm.h" +#include "hw_qei.h" +#include "hw_ssi.h" +#include "hw_sysctl.h" +#include "hw_timer.h" +#include "hw_types.h" +#include "hw_uart.h" +#include "hw_watchdog.h" +#include "adc.h" +#include "can.h" +#include "comp.h" +#include "cpu.h" +#include "debug.h" +#include "ethernet.h" +#include "flash.h" +#include "gpio.h" +#include "hibernate.h" +#include "i2c.h" +#include "interrupt.h" +#include "pwm.h" +#include "qei.h" +#include "ssi.h" +#include "sysctl.h" +#include "systick.h" +#include "timer.h" +#include "uart.h" +#include "watchdog.h" + +#endif // __LM3SXXXX_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/_flash.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/_flash.h new file mode 100644 index 000000000..75d30c41c --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/_flash.h @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// flash.h - Prototypes for the flash driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __FLASH_H__ +#define __FLASH_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to FlashProtectSet(), and returned by +// FlashProtectGet(). +// +//***************************************************************************** +typedef enum +{ + FlashReadWrite, // Flash can be read and written + FlashReadOnly, // Flash can only be read + FlashExecuteOnly // Flash can only be executed +} +tFlashProtection; + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern unsigned long FlashUsecGet(void); +extern void FlashUsecSet(unsigned long ulClocks); +extern long FlashErase(unsigned long ulAddress); +extern long FlashProgram(unsigned long *pulData, unsigned long ulAddress, + unsigned long ulCount); +extern tFlashProtection FlashProtectGet(unsigned long ulAddress); +extern long FlashProtectSet(unsigned long ulAddress, + tFlashProtection eProtect); +extern long FlashProtectSave(void); +extern long FlashUserGet(unsigned long *pulUser0, unsigned long *pulUser1); +extern long FlashUserSet(unsigned long ulUser0, unsigned long ulUser1); +extern long FlashUserSave(void); +extern void FlashIntRegister(void (*pfnHandler)(void)); +extern void FlashIntUnregister(void); +extern void FlashIntEnable(unsigned long ulIntFlags); +extern void FlashIntDisable(unsigned long ulIntFlags); +extern unsigned long FlashIntGetStatus(tBoolean bMasked); +extern void FlashIntClear(unsigned long ulIntFlags); + +#ifdef __cplusplus +} +#endif + +#endif // __FLASH_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/_timer.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/_timer.h new file mode 100644 index 000000000..85b3160ab --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/_timer.h @@ -0,0 +1,137 @@ +//***************************************************************************** +// +// timer.h - Prototypes for the timer module +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __TIMER_H__ +#define __TIMER_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to TimerConfigure as the ulConfig parameter. +// +//***************************************************************************** +#define TIMER_CFG_32_BIT_OS 0x00000001 // 32-bit one-shot timer +#define TIMER_CFG_32_BIT_PER 0x00000002 // 32-bit periodic timer +#define TIMER_CFG_32_RTC 0x01000000 // 32-bit RTC timer +#define TIMER_CFG_16_BIT_PAIR 0x04000000 // Two 16-bit timers +#define TIMER_CFG_A_ONE_SHOT 0x00000001 // Timer A one-shot timer +#define TIMER_CFG_A_PERIODIC 0x00000002 // Timer A periodic timer +#define TIMER_CFG_A_CAP_COUNT 0x00000003 // Timer A event counter +#define TIMER_CFG_A_CAP_TIME 0x00000007 // Timer A event timer +#define TIMER_CFG_A_PWM 0x0000000A // Timer A PWM output +#define TIMER_CFG_B_ONE_SHOT 0x00000100 // Timer B one-shot timer +#define TIMER_CFG_B_PERIODIC 0x00000200 // Timer B periodic timer +#define TIMER_CFG_B_CAP_COUNT 0x00000300 // Timer B event counter +#define TIMER_CFG_B_CAP_TIME 0x00000700 // Timer B event timer +#define TIMER_CFG_B_PWM 0x00000A00 // Timer B PWM output + +//***************************************************************************** +// +// Values that can be passed to TimerIntEnable, TimerIntDisable, and +// TimerIntClear as the ulIntFlags parameter, and returned from TimerIntStatus. +// +//***************************************************************************** +#define TIMER_CAPB_EVENT 0x00000400 // CaptureB event interrupt +#define TIMER_CAPB_MATCH 0x00000200 // CaptureB match interrupt +#define TIMER_TIMB_TIMEOUT 0x00000100 // TimerB time out interrupt +#define TIMER_RTC_MATCH 0x00000008 // RTC interrupt mask +#define TIMER_CAPA_EVENT 0x00000004 // CaptureA event interrupt +#define TIMER_CAPA_MATCH 0x00000002 // CaptureA match interrupt +#define TIMER_TIMA_TIMEOUT 0x00000001 // TimerA time out interrupt + +//***************************************************************************** +// +// Values that can be passed to TimerControlEvent as the ulEvent parameter. +// +//***************************************************************************** +#define TIMER_EVENT_POS_EDGE 0x00000000 // Count positive edges +#define TIMER_EVENT_NEG_EDGE 0x00000404 // Count negative edges +#define TIMER_EVENT_BOTH_EDGES 0x00000C0C // Count both edges + +//***************************************************************************** +// +// Values that can be passed to most of the timer APIs as the ulTimer +// parameter. +// +//***************************************************************************** +#define TIMER_A 0x000000ff // Timer A +#define TIMER_B 0x0000ff00 // Timer B +#define TIMER_BOTH 0x0000ffff // Timer Both + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void TimerEnable(unsigned long ulBase, unsigned long ulTimer); +extern void TimerDisable(unsigned long ulBase, unsigned long ulTimer); +extern void TimerConfigure(unsigned long ulBase, unsigned long ulConfig); +extern void TimerControlLevel(unsigned long ulBase, unsigned long ulTimer, + tBoolean bInvert); +extern void TimerControlTrigger(unsigned long ulBase, unsigned long ulTimer, + tBoolean bEnable); +extern void TimerControlEvent(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulEvent); +extern void TimerControlStall(unsigned long ulBase, unsigned long ulTimer, + tBoolean bStall); +extern void TimerRTCEnable(unsigned long ulBase); +extern void TimerRTCDisable(unsigned long ulBase); +extern void TimerPrescaleSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerPrescaleGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerPrescaleMatchSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerPrescaleMatchGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerLoadSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerLoadGet(unsigned long ulBase, unsigned long ulTimer); +extern unsigned long TimerValueGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerMatchSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerMatchGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerIntRegister(unsigned long ulBase, unsigned long ulTimer, + void (*pfnHandler)(void)); +extern void TimerIntUnregister(unsigned long ulBase, unsigned long ulTimer); +extern void TimerIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void TimerIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long TimerIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void TimerIntClear(unsigned long ulBase, unsigned long ulIntFlags); +extern void TimerQuiesce(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __TIMER_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/adc.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/adc.h new file mode 100644 index 000000000..7533ccfd8 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/adc.h @@ -0,0 +1,130 @@ +//***************************************************************************** +// +// adc.h - ADC headers for using the ADC driver functions. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __ADC_H__ +#define __ADC_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to ADCSequenceConfigure as the ulTrigger +// parameter. +// +//***************************************************************************** +#define ADC_TRIGGER_PROCESSOR 0x00000000 // Processor event +#define ADC_TRIGGER_COMP0 0x00000001 // Analog comparator 0 event +#define ADC_TRIGGER_COMP1 0x00000002 // Analog comparator 1 event +#define ADC_TRIGGER_COMP2 0x00000003 // Analog comparator 2 event +#define ADC_TRIGGER_EXTERNAL 0x00000004 // External event +#define ADC_TRIGGER_TIMER 0x00000005 // Timer event +#define ADC_TRIGGER_PWM0 0x00000006 // PWM0 event +#define ADC_TRIGGER_PWM1 0x00000007 // PWM1 event +#define ADC_TRIGGER_PWM2 0x00000008 // PWM2 event +#define ADC_TRIGGER_ALWAYS 0x0000000F // Always event + +//***************************************************************************** +// +// Values that can be passed to ADCSequenceStepConfigure as the ulConfig +// parameter. +// +//***************************************************************************** +#define ADC_CTL_TS 0x00000080 // Temperature sensor select +#define ADC_CTL_IE 0x00000040 // Interrupt enable +#define ADC_CTL_END 0x00000020 // Sequence end select +#define ADC_CTL_D 0x00000010 // Differential select +#define ADC_CTL_CH0 0x00000000 // Input channel 0 +#define ADC_CTL_CH1 0x00000001 // Input channel 1 +#define ADC_CTL_CH2 0x00000002 // Input channel 2 +#define ADC_CTL_CH3 0x00000003 // Input channel 3 +#define ADC_CTL_CH4 0x00000004 // Input channel 4 +#define ADC_CTL_CH5 0x00000005 // Input channel 5 +#define ADC_CTL_CH6 0x00000006 // Input channel 6 +#define ADC_CTL_CH7 0x00000007 // Input channel 7 + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void ADCIntRegister(unsigned long ulBase, unsigned long ulSequenceNum, + void (*pfnHandler)(void)); +extern void ADCIntUnregister(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCIntDisable(unsigned long ulBase, unsigned long ulSequenceNum); +extern void ADCIntEnable(unsigned long ulBase, unsigned long ulSequenceNum); +extern unsigned long ADCIntStatus(unsigned long ulBase, + unsigned long ulSequenceNum, + tBoolean bMasked); +extern void ADCIntClear(unsigned long ulBase, unsigned long ulSequenceNum); +extern void ADCSequenceEnable(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCSequenceDisable(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCSequenceConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulTrigger, + unsigned long ulPriority); +extern void ADCSequenceStepConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulStep, + unsigned long ulConfig); +extern long ADCSequenceOverflow(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCSequenceOverflowClear(unsigned long ulBase, + unsigned long ulSequenceNum); +extern long ADCSequenceUnderflow(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCSequenceUnderflowClear(unsigned long ulBase, + unsigned long ulSequenceNum); +extern long ADCSequenceDataGet(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long *pulBuffer); +extern void ADCProcessorTrigger(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCSoftwareOversampleConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulFactor); +extern void ADCSoftwareOversampleStepConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulStep, + unsigned long ulConfig); +extern void ADCSoftwareOversampleDataGet(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long *pulBuffer, + unsigned long ulCount); +extern void ADCHardwareOversampleConfigure(unsigned long ulBase, + unsigned long ulFactor); + +#ifdef __cplusplus +} +#endif + +#endif // __ADC_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/can.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/can.h new file mode 100644 index 000000000..bdd623304 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/can.h @@ -0,0 +1,441 @@ +//***************************************************************************** +// +// can.h - Defines and Macros for the CAN controller. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __CAN_H__ +#define __CAN_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup can_api +//! @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// Miscellaneous defines for Message ID Types +// +//***************************************************************************** + +//***************************************************************************** +// +//! These are the flags used by the tCANMsgObject variable when calling the +//! the CANMessageSet() and CANMessageGet() APIs. +// +//***************************************************************************** +typedef enum +{ + // + //! This indicates that transmit interrupts should be enabled, or are + //! enabled. + // + MSG_OBJ_TX_INT_ENABLE = 0x00000001, + + // + //! This indicates that receive interrupts should be enabled or are + //! enabled. + // + MSG_OBJ_RX_INT_ENABLE = 0x00000002, + + // + //! This indicates that a message object will use or is using an extended + //! identifier. + // + MSG_OBJ_EXTENDED_ID = 0x00000004, + + // + //! This indicates that a message object will use or is using filtering + //! based on the object's message Identifier. + // + MSG_OBJ_USE_ID_FILTER = 0x00000008, + + // + //! This indicates that new data was available in the message object. + // + MSG_OBJ_NEW_DATA = 0x00000080, + + // + //! This indicates that data was lost since this message object was last + //! read. + // + MSG_OBJ_DATA_LOST = 0x00000100, + + // + //! This indicates that a message object will use or is using filtering + //! based on the direction of the transfer. If the direction filtering is + //! used then ID filtering must also be enabled. + // + MSG_OBJ_USE_DIR_FILTER = (0x00000010 | MSG_OBJ_USE_ID_FILTER), + + // + //! This indicates that a message object will use or is using message + //! identifier filtering based of the the extended identifier. + //! If the extended identifier filtering is used then ID filtering must + //! also be enabled. + // + MSG_OBJ_USE_EXT_FILTER = (0x00000020 | MSG_OBJ_USE_ID_FILTER), + + // + //! This indicates that a message object is a remote frame. + // + MSG_OBJ_REMOTE_FRAME = 0x00000040, + + // + //! This indicates that a message object has no flags set. + // + MSG_OBJ_NO_FLAGS = 0x00000000 +} +tCANObjFlags; + +//***************************************************************************** +// +//! This define is used with the #tCANObjFlags enumerated values to allow +//! checking only status flags and not configuration flags. +// +//***************************************************************************** +#define MSG_OBJ_STATUS_MASK (MSG_OBJ_NEW_DATA | MSG_OBJ_DATA_LOST) + +//***************************************************************************** +// +//! This structure used for encapsulating all the items associated with a CAN +//! message object in the CAN controller. +// +//***************************************************************************** +typedef struct +{ + // + //! The CAN message identifier used for 11 or 29 bit identifiers. + // + unsigned long ulMsgID; + + // + //! The message identifier mask used when identifier filtering is enabled. + // + unsigned long ulMsgIDMask; + + // + //! This value holds various status flags and settings specified by + //! tCANObjFlags. + // + unsigned long ulFlags; + + // + //! This value is the number of bytes of data in the message object. + // + unsigned long ulMsgLen; + + // + //! This is a pointer to the message object's data. + // + unsigned char *pucMsgData; +} +tCANMsgObject; + +//***************************************************************************** +// +//! This structure is used for encapsulating the values associated with setting +//! up the bit timing for a CAN controller. The structure is used when calling +//! the CANGetBitTiming and CANSetBitTiming functions. +// +//***************************************************************************** +typedef struct +{ + // + //! This value holds the sum of the Synchronization, Propagation, and Phase + //! Buffer 1 segments, measured in time quanta. The valid values for this + //! setting range from 2 to 16. + // + unsigned int uSyncPropPhase1Seg; + + // + //! This value holds the Phase Buffer 2 segment in time quanta. The valid + //! values for this setting range from 1 to 8. + // + unsigned int uPhase2Seg; + + // + //! This value holds the Resynchronization Jump Width in time quanta. The + //! valid values for this setting range from 1 to 4. + // + unsigned int uSJW; + + // + //! This value holds the CAN_CLK divider used to determine time quanta. + //! The valid values for this setting range from 1 to 1023. + // + unsigned int uQuantumPrescaler; + +} +tCANBitClkParms; + +//***************************************************************************** +// +//! This data type is used to identify the interrupt status register. This is +//! used when calling the a CANIntStatus() function. +// +//***************************************************************************** +typedef enum +{ + // + //! Read the CAN interrupt status information. + // + CAN_INT_STS_CAUSE, + + // + //! Read a message object's interrupt status. + // + CAN_INT_STS_OBJECT +} +tCANIntStsReg; + +//***************************************************************************** +// +//! This data type is used to identify which of the several status registers +//! to read when calling the CANStatusGet() function. +// +//***************************************************************************** +typedef enum +{ + // + //! Read the full CAN controller status. + // + CAN_STS_CONTROL, + + // + //! Read the full 32 bit mask of message objects with a transmit request + //! set. + // + CAN_STS_TXREQUEST, + + // + //! Read the full 32 bit mask of message objects with a new data available. + // + CAN_STS_NEWDAT, + + // + //! Read the full 32 bit mask of message objects that are enabled. + // + CAN_STS_MSGVAL +} +tCANStsReg; + +//***************************************************************************** +// +//! These definitions are used to specify interrupt sources to CANIntEnable() +//! and CANIntDisable(). +// +//***************************************************************************** +typedef enum +{ + // + //! This flag is used to allow a CAN controller to generate error + //! interrupts. + // + CAN_INT_ERROR = 0x00000008, + + // + //! This flag is used to allow a CAN controller to generate status + //! interrupts. + // + CAN_INT_STATUS = 0x00000004, + + // + //! This flag is used to allow a CAN controller to generate any CAN + //! interrupts. If this is not set then no interrupts will be generated by + //! the CAN controller. + // + CAN_INT_MASTER = 0x00000002 +} +tCANIntFlags; + +//***************************************************************************** +// +//! This definition is used to determine the type of message object that will +//! be set up via a call to the CANMessageSet() API. +// +//***************************************************************************** +typedef enum +{ + // + //! Transmit message object. + // + MSG_OBJ_TYPE_TX, + + // + //! Transmit remote request message object + // + MSG_OBJ_TYPE_TX_REMOTE, + + // + //! Receive message object. + // + MSG_OBJ_TYPE_RX, + + // + //! Receive remote request message object. + // + MSG_OBJ_TYPE_RX_REMOTE, + + // + //! Remote frame receive remote, with auto-transmit message object. + // + MSG_OBJ_TYPE_RXTX_REMOTE +} +tMsgObjType; + +//***************************************************************************** +// +//! The following enumeration contains all error or status indicators that +//! can be returned when calling the CANStatusGet() API. +// +//***************************************************************************** +typedef enum +{ + // + //! CAN controller has entered a Bus Off state. + // + CAN_STATUS_BUS_OFF = 0x00000080, + + // + //! CAN controller error level has reached warning level. + // + CAN_STATUS_EWARN = 0x00000040, + + // + //! CAN controller error level has reached error passive level. + // + CAN_STATUS_EPASS = 0x00000020, + + // + //! A message was received successfully since the last read of this status. + // + CAN_STATUS_RXOK = 0x00000010, + + // + //! A message was transmitted successfully since the last read of this + //! status. + // + CAN_STATUS_TXOK = 0x00000008, + + // + //! This is the mask for the last error code field. + // + CAN_STATUS_LEC_MSK = 0x00000007, + + // + //! There was no error. + // + CAN_STATUS_LEC_NONE = 0x00000000, + + // + //! A bit stuffing error has occurred. + // + CAN_STATUS_LEC_STUFF = 0x00000001, + + // + //! A formatting error has occurred. + // + CAN_STATUS_LEC_FORM = 0x00000002, + + // + //! An acknowledge error has occurred. + // + CAN_STATUS_LEC_ACK = 0x00000003, + + // + //! The bus remained a bit level of 1 for longer than is allowed. + // + CAN_STATUS_LEC_BIT1 = 0x00000004, + + // + //! The bus remained a bit level of 0 for longer than is allowed. + // + CAN_STATUS_LEC_BIT0 = 0x00000005, + + // + //! A CRC error has occurred. + // + CAN_STATUS_LEC_CRC = 0x00000006, + + // + //! This is the mask for the CAN Last Error Code (LEC). + // + CAN_STATUS_LEC_MASK = 0x00000007 +} +tCANStatusCtrl; + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void CANInit(unsigned long ulBase); +extern void CANEnable(unsigned long ulBase); +extern void CANDisable(unsigned long ulBase); +extern void CANSetBitTiming(unsigned long ulBase, tCANBitClkParms *pClkParms); +extern void CANGetBitTiming(unsigned long ulBase, tCANBitClkParms *pClkParms); +extern unsigned long CANReadReg(unsigned long ulRegAddress); +extern void CANWriteReg(unsigned long ulRegAddress, unsigned long ulRegValue); +extern void CANMessageSet(unsigned long ulBase, unsigned long ulObjID, + tCANMsgObject *pMsgObject, tMsgObjType eMsgType); +extern void CANMessageGet(unsigned long ulBase, unsigned long ulObjID, + tCANMsgObject *pMsgObject, tBoolean bClrPendingInt); +extern unsigned long CANStatusGet(unsigned long ulBase, tCANStsReg eStatusReg); +extern void CANMessageClear(unsigned long ulBase, unsigned long ulObjID); +extern void CANIntRegister(unsigned long ulBase, void (*pfnHandler)(void)); +extern void CANIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void CANIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern void CANIntClear(unsigned long ulBase, unsigned long ulIntClr); +extern unsigned long CANIntStatus(unsigned long ulBase, + tCANIntStsReg eIntStsReg); +extern tBoolean CANRetryGet(unsigned long ulBase); +extern void CANRetrySet(unsigned long ulBase, tBoolean bAutoRetry); +extern tBoolean CANErrCntrGet(unsigned long ulBase, unsigned long *pulRxCount, + unsigned long *pulTxCount); +extern long CANGetIntNumber(unsigned long ulBase); +extern void CANReadDataReg(unsigned char *pucData, unsigned long *pulRegister, + int iSize); +extern void CANWriteDataReg(unsigned char *pucData, unsigned long *pulRegister, + int iSize); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +#ifdef __cplusplus +} +#endif + +#endif // __CAN_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/comp.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/comp.h new file mode 100644 index 000000000..60fa1e04e --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/comp.h @@ -0,0 +1,122 @@ +//***************************************************************************** +// +// comp.h - Prototypes for the analog comparator driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __COMP_H__ +#define __COMP_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to ComparatorConfigure() as the ulConfig +// parameter. For each group (i.e. COMP_TRIG_xxx, COMP_INT_xxx, etc.), one of +// the values may be selected and ORed together will values from the other +// groups. +// +//***************************************************************************** +#define COMP_TRIG_NONE 0x00000000 // No ADC trigger +#define COMP_TRIG_HIGH 0x00000880 // Trigger when high +#define COMP_TRIG_LOW 0x00000800 // Trigger when low +#define COMP_TRIG_FALL 0x00000820 // Trigger on falling edge +#define COMP_TRIG_RISE 0x00000840 // Trigger on rising edge +#define COMP_TRIG_BOTH 0x00000860 // Trigger on both edges +#define COMP_INT_HIGH 0x00000010 // Interrupt when high +#define COMP_INT_LOW 0x00000000 // Interrupt when low +#define COMP_INT_FALL 0x00000004 // Interrupt on falling edge +#define COMP_INT_RISE 0x00000008 // Interrupt on rising edge +#define COMP_INT_BOTH 0x0000000C // Interrupt on both edges +#define COMP_ASRCP_PIN 0x00000000 // Dedicated Comp+ pin +#define COMP_ASRCP_PIN0 0x00000200 // Comp0+ pin +#define COMP_ASRCP_REF 0x00000400 // Internal voltage reference +#ifndef DEPRECATED +#define COMP_OUTPUT_NONE 0x00000000 // No comparator output +#endif +#define COMP_OUTPUT_NORMAL 0x00000000 // Comparator output normal +#define COMP_OUTPUT_INVERT 0x00000002 // Comparator output inverted + +//***************************************************************************** +// +// Values that can be passed to ComparatorSetRef() as the ulRef parameter. +// +//***************************************************************************** +#define COMP_REF_OFF 0x00000000 // Turn off the internal reference +#define COMP_REF_0V 0x00000300 // Internal reference of 0V +#define COMP_REF_0_1375V 0x00000301 // Internal reference of 0.1375V +#define COMP_REF_0_275V 0x00000302 // Internal reference of 0.275V +#define COMP_REF_0_4125V 0x00000303 // Internal reference of 0.4125V +#define COMP_REF_0_55V 0x00000304 // Internal reference of 0.55V +#define COMP_REF_0_6875V 0x00000305 // Internal reference of 0.6875V +#define COMP_REF_0_825V 0x00000306 // Internal reference of 0.825V +#define COMP_REF_0_928125V 0x00000201 // Internal reference of 0.928125V +#define COMP_REF_0_9625V 0x00000307 // Internal reference of 0.9625V +#define COMP_REF_1_03125V 0x00000202 // Internal reference of 1.03125V +#define COMP_REF_1_134375V 0x00000203 // Internal reference of 1.134375V +#define COMP_REF_1_1V 0x00000308 // Internal reference of 1.1V +#define COMP_REF_1_2375V 0x00000309 // Internal reference of 1.2375V +#define COMP_REF_1_340625V 0x00000205 // Internal reference of 1.340625V +#define COMP_REF_1_375V 0x0000030A // Internal reference of 1.375V +#define COMP_REF_1_44375V 0x00000206 // Internal reference of 1.44375V +#define COMP_REF_1_5125V 0x0000030B // Internal reference of 1.5125V +#define COMP_REF_1_546875V 0x00000207 // Internal reference of 1.546875V +#define COMP_REF_1_65V 0x0000030C // Internal reference of 1.65V +#define COMP_REF_1_753125V 0x00000209 // Internal reference of 1.753125V +#define COMP_REF_1_7875V 0x0000030D // Internal reference of 1.7875V +#define COMP_REF_1_85625V 0x0000020A // Internal reference of 1.85625V +#define COMP_REF_1_925V 0x0000030E // Internal reference of 1.925V +#define COMP_REF_1_959375V 0x0000020B // Internal reference of 1.959375V +#define COMP_REF_2_0625V 0x0000030F // Internal reference of 2.0625V +#define COMP_REF_2_165625V 0x0000020D // Internal reference of 2.165625V +#define COMP_REF_2_26875V 0x0000020E // Internal reference of 2.26875V +#define COMP_REF_2_371875V 0x0000020F // Internal reference of 2.371875V + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void ComparatorConfigure(unsigned long ulBase, unsigned long ulComp, + unsigned long ulConfig); +extern void ComparatorRefSet(unsigned long ulBase, unsigned long ulRef); +extern tBoolean ComparatorValueGet(unsigned long ulBase, unsigned long ulComp); +extern void ComparatorIntRegister(unsigned long ulBase, unsigned long ulComp, + void (*pfnHandler)(void)); +extern void ComparatorIntUnregister(unsigned long ulBase, + unsigned long ulComp); +extern void ComparatorIntEnable(unsigned long ulBase, unsigned long ulComp); +extern void ComparatorIntDisable(unsigned long ulBase, unsigned long ulComp); +extern tBoolean ComparatorIntStatus(unsigned long ulBase, unsigned long ulComp, + tBoolean bMasked); +extern void ComparatorIntClear(unsigned long ulBase, unsigned long ulComp); + +#ifdef __cplusplus +} +#endif + +#endif // __COMP_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/cpu.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/cpu.h new file mode 100644 index 000000000..f21f82221 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/cpu.h @@ -0,0 +1,40 @@ +//***************************************************************************** +// +// cpu.h - Prototypes for the CPU instruction wrapper functions. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __CPU_H__ +#define __CPU_H__ + +//***************************************************************************** +// +// Prototypes. +// +//***************************************************************************** +extern void CPUcpsid(void); +extern void CPUcpsie(void); +extern void CPUwfi(void); + +#endif // __CPU_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/debug.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/debug.h new file mode 100644 index 000000000..c64b8fc2d --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/debug.h @@ -0,0 +1,56 @@ +//***************************************************************************** +// +// debug.h - Macros for assisting debug of the driver library. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __DEBUG_H__ +#define __DEBUG_H__ + +//***************************************************************************** +// +// Prototype for the function that is called when an invalid argument is passed +// to an API. This is only used when doing a DEBUG build. +// +//***************************************************************************** +extern void __error__(char *pcFilename, unsigned long ulLine); + +//***************************************************************************** +// +// The ASSERT macro, which does the actual assertion checking. Typically, this +// will be for procedure arguments. +// +//***************************************************************************** +#ifdef DEBUG +#define ASSERT(expr) { \ + if(!(expr)) \ + { \ + __error__(__FILE__, __LINE__); \ + } \ + } +#else +#define ASSERT(expr) +#endif + +#endif // __DEBUG_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/driverlib.r79 b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/driverlib.r79 new file mode 100644 index 0000000000000000000000000000000000000000..3e297f9cf989e5fa1211a3a73c3d607fce6129a8 GIT binary patch literal 192492 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 Jesb>V{{!yVs89d^ literal 0 HcmV?d00001 diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/ethernet.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/ethernet.h new file mode 100644 index 000000000..127763f2c --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/ethernet.h @@ -0,0 +1,254 @@ +//***************************************************************************** +// +// ethernet.h - Defines and Macros for the ethernet module. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __ETHERNET_H__ +#define __ETHERNET_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to EthernetConfigSet as the ulConfig value, and +// returned from EthernetConfigGet. +// +//***************************************************************************** +#define ETH_CFG_RX_BADCRCDIS 0x000800 // Disable RX BAD CRC Packets +#define ETH_CFG_RX_PRMSEN 0x000400 // Enable RX Promiscuous +#define ETH_CFG_RX_AMULEN 0x000200 // Enable RX Multicast +#define ETH_CFG_TX_DPLXEN 0x000010 // Enable TX Duplex Mode +#define ETH_CFG_TX_CRCEN 0x000004 // Enable TX CRC Generation +#define ETH_CFG_TX_PADEN 0x000002 // Enable TX Padding + +//***************************************************************************** +// +// Values that can be passed to EthernetIntEnable, EthernetIntDisable, and +// EthernetIntClear as the ulIntFlags parameter, and returned from +// EthernetIntStatus. +// +//***************************************************************************** +#define ETH_INT_PHY 0x040 // PHY Event/Interrupt +#define ETH_INT_MDIO 0x020 // Management Transaction +#define ETH_INT_RXER 0x010 // RX Error +#define ETH_INT_RXOF 0x008 // RX FIFO Overrun +#define ETH_INT_TX 0x004 // TX Complete +#define ETH_INT_TXER 0x002 // TX Error +#define ETH_INT_RX 0x001 // RX Complete + +//***************************************************************************** +// +// The following define values that can be passed as register addresses to +// EthernetPHYRead and EthernetPHYWrite. +// +//***************************************************************************** +#define PHY_MR0 0 // Control +#define PHY_MR1 1 // Status +#define PHY_MR2 2 // PHY Identifier 1 +#define PHY_MR3 3 // PHY Identifier 2 +#define PHY_MR4 4 // Auto-Neg. Advertisement +#define PHY_MR5 5 // Auto-Neg. Link Partner Ability +#define PHY_MR6 6 // Auto-Neg. Expansion + // 7-15 Reserved/Not Implemented +#define PHY_MR16 16 // Vendor Specific +#define PHY_MR17 17 // Interrupt Control/Status +#define PHY_MR18 18 // Diagnostic Register +#define PHY_MR19 19 // Transceiver Control + // 20-22 Reserved +#define PHY_MR23 23 // LED Configuration Register +#define PHY_MR24 24 // MDI/MDIX Control Register + // 25-31 Reserved/Not Implemented + +//***************************************************************************** +// +// The following define bit fields in the ETH_MR0 register +// +//***************************************************************************** +#define PHY_MR0_RESET 0x8000 // Reset the PHY +#define PHY_MR0_LOOPBK 0x4000 // TXD to RXD Loopback +#define PHY_MR0_SPEEDSL 0x2000 // Speed Selection +#define PHY_MR0_SPEEDSL_10 0x0000 // Speed Selection 10BASE-T +#define PHY_MR0_SPEEDSL_100 0x2000 // Speed Selection 100BASE-T +#define PHY_MR0_ANEGEN 0x1000 // Auto-Negotiation Enable +#define PHY_MR0_PWRDN 0x0800 // Power Down +#define PHY_MR0_RANEG 0x0200 // Restart Auto-Negotiation +#define PHY_MR0_DUPLEX 0x0100 // Enable full duplex +#define PHY_MR0_DUPLEX_HALF 0x0000 // Enable half duplex mode +#define PHY_MR0_DUPLEX_FULL 0x0100 // Enable full duplex mode + +//***************************************************************************** +// +// The following define bit fields in the ETH_MR1 register +// +//***************************************************************************** +#define PHY_MR1_ANEGC 0x0020 // Auto-Negotiate Complete +#define PHY_MR1_RFAULT 0x0010 // Remove Fault Detected +#define PHY_MR1_LINK 0x0004 // Link Established +#define PHY_MR1_JAB 0x0002 // Jabber Condition Detected + +//***************************************************************************** +// +// The following define bit fields in the ETH_MR17 register +// +//***************************************************************************** +#define PHY_MR17_RXER_IE 0x4000 // Enable Receive Error Interrupt +#define PHY_MR17_LSCHG_IE 0x0400 // Enable Link Status Change Int. +#define PHY_MR17_ANEGCOMP_IE 0x0100 // Enable Auto-Negotiate Cmpl. Int. +#define PHY_MR17_RXER_INT 0x0040 // Receive Error Interrupt +#define PHY_MR17_LSCHG_INT 0x0004 // Link Status Change Interrupt +#define PHY_MR17_ANEGCOMP_INT 0x0001 // Auto-Negotiate Complete Int. + +//***************************************************************************** +// +// The following define bit fields in the ETH_MR18 register +// +//***************************************************************************** +#define PHY_MR18_ANEGF 0x1000 // Auto-Negotiate Failed +#define PHY_MR18_DPLX 0x0800 // Duplex Mode Negotiated +#define PHY_MR18_DPLX_HALF 0x0000 // Half Duplex Mode Negotiated +#define PHY_MR18_DPLX_FULL 0x0800 // Full Duplex Mode Negotiated +#define PHY_MR18_RATE 0x0400 // Rate Negotiated +#define PHY_MR18_RATE_10 0x0000 // Rate Negotiated is 10BASE-T +#define PHY_MR18_RATE_100 0x0400 // Rate Negotiated is 100BASE-TX + +//***************************************************************************** +// +// The following define bit fields in the ETH_MR23 register +// +//***************************************************************************** +#define PHY_MR23_LED1 0x00f0 // LED1 Configuration +#define PHY_MR23_LED1_LINK 0x0000 // LED1 is Link Status +#define PHY_MR23_LED1_RXTX 0x0010 // LED1 is RX or TX Activity +#define PHY_MR23_LED1_TX 0x0020 // LED1 is TX Activity +#define PHY_MR23_LED1_RX 0x0030 // LED1 is RX Activity +#define PHY_MR23_LED1_COL 0x0040 // LED1 is RX Activity +#define PHY_MR23_LED1_100 0x0050 // LED1 is RX Activity +#define PHY_MR23_LED1_10 0x0060 // LED1 is RX Activity +#define PHY_MR23_LED1_DUPLEX 0x0070 // LED1 is RX Activity +#define PHY_MR23_LED1_LINKACT 0x0080 // LED1 is Link Status + Activity +#define PHY_MR23_LED0 0x000f // LED0 Configuration +#define PHY_MR23_LED0_LINK 0x0000 // LED0 is Link Status +#define PHY_MR23_LED0_RXTX 0x0001 // LED0 is RX or TX Activity +#define PHY_MR23_LED0_TX 0x0002 // LED0 is TX Activity +#define PHY_MR23_LED0_RX 0x0003 // LED0 is RX Activity +#define PHY_MR23_LED0_COL 0x0004 // LED0 is RX Activity +#define PHY_MR23_LED0_100 0x0005 // LED0 is RX Activity +#define PHY_MR23_LED0_10 0x0006 // LED0 is RX Activity +#define PHY_MR23_LED0_DUPLEX 0x0007 // LED0 is RX Activity +#define PHY_MR23_LED0_LINKACT 0x0008 // LED0 is Link Status + Activity + +//***************************************************************************** +// +// The following define bit fields in the ETH_MR24 register +// +//***************************************************************************** +#define PHY_MR24_MDIX 0x0020 // Auto-Switching Configuration +#define PHY_MR24_MDIX_NORMAL 0x0000 // Auto-Switching in passthrough +#define PHY_MR23_MDIX_CROSSOVER 0x0020 // Auto-Switching in crossover + +//***************************************************************************** +// +// Helper Macros for Ethernet Processing +// +//***************************************************************************** +// +// htonl/ntohl - big endian/little endian byte swapping macros for +// 32-bit (long) values +// +//***************************************************************************** +#ifndef htonl + #define htonl(a) \ + ((((a) >> 24) & 0x000000ff) | \ + (((a) >> 8) & 0x0000ff00) | \ + (((a) << 8) & 0x00ff0000) | \ + (((a) << 24) & 0xff000000)) +#endif + +#ifndef ntohl + #define ntohl(a) htonl((a)) +#endif + +//***************************************************************************** +// +// htons/ntohs - big endian/little endian byte swapping macros for +// 16-bit (short) values +// +//***************************************************************************** +#ifndef htons + #define htons(a) \ + ((((a) >> 8) & 0x00ff) | \ + (((a) << 8) & 0xff00)) +#endif + +#ifndef ntohs + #define ntohs(a) htons((a)) +#endif + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void EthernetInit(unsigned long ulBase); +extern void EthernetConfigSet(unsigned long ulBase, unsigned long ulConfig); +extern unsigned long EthernetConfigGet(unsigned long ulBase); +extern void EthernetMACAddrSet(unsigned long ulBase, + unsigned char *pucMACAddr); +extern void EthernetMACAddrGet(unsigned long ulBase, + unsigned char *pucMACAddr); +extern void EthernetEnable(unsigned long ulBase); +extern void EthernetDisable(unsigned long ulBase); +extern tBoolean EthernetPacketAvail(unsigned long ulBase); +extern tBoolean EthernetSpaceAvail(unsigned long ulBase); +extern long EthernetPacketNonBlockingGet(unsigned long ulBase, + unsigned char *pucBuf, + long lBufLen); +extern long EthernetPacketGet(unsigned long ulBase, unsigned char *pucBuf, + long lBufLen); +extern long EthernetPacketNonBlockingPut(unsigned long ulBase, + unsigned char *pucBuf, + long lBufLen); +extern long EthernetPacketPut(unsigned long ulBase, unsigned char *pucBuf, + long lBufLen); +extern void EthernetIntRegister(unsigned long ulBase, + void (*pfnHandler)(void)); +extern void EthernetIntUnregister(unsigned long ulBase); +extern void EthernetIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void EthernetIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long EthernetIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void EthernetIntClear(unsigned long ulBase, unsigned long ulIntFlags); +extern void EthernetPHYWrite(unsigned long ulBase, unsigned char ucRegAddr, + unsigned long ulData); +extern unsigned long EthernetPHYRead(unsigned long ulBase, + unsigned char ucRegAddr); + +#ifdef __cplusplus +} +#endif + +#endif // __ETHERNET_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/gpio.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/gpio.h new file mode 100644 index 000000000..6e74f9d4f --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/gpio.h @@ -0,0 +1,138 @@ +//***************************************************************************** +// +// gpio.h - Defines and Macros for GPIO API. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __GPIO_H__ +#define __GPIO_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following values define the bit field for the ucPins argument to several +// of the APIs. +// +//***************************************************************************** +#define GPIO_PIN_0 0x00000001 // GPIO pin 0 +#define GPIO_PIN_1 0x00000002 // GPIO pin 1 +#define GPIO_PIN_2 0x00000004 // GPIO pin 2 +#define GPIO_PIN_3 0x00000008 // GPIO pin 3 +#define GPIO_PIN_4 0x00000010 // GPIO pin 4 +#define GPIO_PIN_5 0x00000020 // GPIO pin 5 +#define GPIO_PIN_6 0x00000040 // GPIO pin 6 +#define GPIO_PIN_7 0x00000080 // GPIO pin 7 + +//***************************************************************************** +// +// Values that can be passed to GPIODirModeSet as the ulPinIO parameter, and +// returned from GPIODirModeGet. +// +//***************************************************************************** +#define GPIO_DIR_MODE_IN 0x00000000 // Pin is a GPIO input +#define GPIO_DIR_MODE_OUT 0x00000001 // Pin is a GPIO output +#define GPIO_DIR_MODE_HW 0x00000002 // Pin is a peripheral function + +//***************************************************************************** +// +// Values that can be passed to GPIOIntTypeSet as the ulIntType parameter, and +// returned from GPIOIntTypeGet. +// +//***************************************************************************** +#define GPIO_FALLING_EDGE 0x00000000 // Interrupt on falling edge +#define GPIO_RISING_EDGE 0x00000004 // Interrupt on rising edge +#define GPIO_BOTH_EDGES 0x00000001 // Interrupt on both edges +#define GPIO_LOW_LEVEL 0x00000002 // Interrupt on low level +#define GPIO_HIGH_LEVEL 0x00000007 // Interrupt on high level + +//***************************************************************************** +// +// Values that can be passed to GPIOPadConfigSet as the ulStrength parameter, +// and returned by GPIOPadConfigGet in the *pulStrength parameter. +// +//***************************************************************************** +#define GPIO_STRENGTH_2MA 0x00000001 // 2mA drive strength +#define GPIO_STRENGTH_4MA 0x00000002 // 4mA drive strength +#define GPIO_STRENGTH_8MA 0x00000004 // 8mA drive strength +#define GPIO_STRENGTH_8MA_SC 0x0000000C // 8mA drive with slew rate control + +//***************************************************************************** +// +// Values that can be passed to GPIOPadConfigSet as the ulPadType parameter, +// and returned by GPIOPadConfigGet in the *pulPadType parameter. +// +//***************************************************************************** +#define GPIO_PIN_TYPE_STD 0x00000008 // Push-pull +#define GPIO_PIN_TYPE_STD_WPU 0x0000000A // Push-pull with weak pull-up +#define GPIO_PIN_TYPE_STD_WPD 0x0000000C // Push-pull with weak pull-down +#define GPIO_PIN_TYPE_OD 0x00000009 // Open-drain +#define GPIO_PIN_TYPE_OD_WPU 0x0000000B // Open-drain with weak pull-up +#define GPIO_PIN_TYPE_OD_WPD 0x0000000D // Open-drain with weak pull-down +#define GPIO_PIN_TYPE_ANALOG 0x00000000 // Analog comparator + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void GPIODirModeSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulPinIO); +extern unsigned long GPIODirModeGet(unsigned long ulPort, unsigned char ucPin); +extern void GPIOIntTypeSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulIntType); +extern unsigned long GPIOIntTypeGet(unsigned long ulPort, unsigned char ucPin); +extern void GPIOPadConfigSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulStrength, + unsigned long ulPadType); +extern void GPIOPadConfigGet(unsigned long ulPort, unsigned char ucPin, + unsigned long *pulStrength, + unsigned long *pulPadType); +extern void GPIOPinIntEnable(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinIntDisable(unsigned long ulPort, unsigned char ucPins); +extern long GPIOPinIntStatus(unsigned long ulPort, tBoolean bMasked); +extern void GPIOPinIntClear(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPortIntRegister(unsigned long ulPort, + void (*pfIntHandler)(void)); +extern void GPIOPortIntUnregister(unsigned long ulPort); +extern long GPIOPinRead(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinWrite(unsigned long ulPort, unsigned char ucPins, + unsigned char ucVal); +extern void GPIOPinTypeComparator(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeI2C(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypePWM(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeQEI(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeSSI(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeTimer(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeUART(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeCAN(unsigned long ulPort, unsigned char ucPins); + +#ifdef __cplusplus +} +#endif + +#endif // __GPIO_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hibernate.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hibernate.h new file mode 100644 index 000000000..69a8c144a --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hibernate.h @@ -0,0 +1,107 @@ +//***************************************************************************** +// +// hibernate.h - API definition for the Hibernation module. +// +// Copyright (c) 2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HIBERNATE_H__ +#define __HIBERNATE_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Macros needed for selecting the clock source for HibernateClockSelect() +// +//***************************************************************************** +#define HIBERNATE_CLOCK_SEL_RAW 0x04 +#define HIBERNATE_CLOCK_SEL_DIV128 0x00 + +//***************************************************************************** +// +// Macros need to configure wake events for HibernateWakeSet() +// +//***************************************************************************** +#define HIBERNATE_WAKE_PIN 0x10 +#define HIBERNATE_WAKE_RTC 0x08 + +//***************************************************************************** +// +// Macros needed to configure low battery detect for HibernateLowBatSet() +// +//***************************************************************************** +#define HIBERNATE_LOW_BAT_DETECT 0x20 +#define HIBERNATE_LOW_BAT_ABORT 0xA0 + +//***************************************************************************** +// +// Macros defining interrupt source bits for the interrupt functions. +// +//***************************************************************************** +#define HIBERNATE_INT_PIN_WAKE 0x08 +#define HIBERNATE_INT_LOW_BAT 0x04 +#define HIBERNATE_INT_RTC_MATCH_0 0x01 +#define HIBERNATE_INT_RTC_MATCH_1 0x02 + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void HibernateEnable(void); +extern void HibernateDisable(void); +extern void HibernateClockSelect(unsigned long ulClockInput); +extern void HibernateRTCEnable(void); +extern void HibernateRTCDisable(void); +extern void HibernateWakeSet(unsigned long ulWakeFlags); +extern unsigned long HibernateWakeGet(void); +extern void HibernateLowBatSet(unsigned long ulLowBatFlags); +extern unsigned long HibernateLowBatGet(void); +extern void HibernateRTCSet(unsigned long ulRTCValue); +extern unsigned long HibernateRTCGet(void); +extern void HibernateRTCMatch0Set(unsigned long ulMatch); +extern unsigned long HibernateRTCMatch0Get(void); +extern void HibernateRTCMatch1Set(unsigned long ulMatch); +extern unsigned long HibernateRTCMatch1Get(void); +extern void HibernateRTCTrimSet(unsigned long ulTrim); +extern unsigned long HibernateRTCTrimGet(void); +extern void HibernateDataSet(unsigned long *pulData, unsigned long ulCount); +extern void HibernateDataGet(unsigned long *pulData, unsigned long ulCount); +extern void HibernateRequest(void); +extern void HibernateIntEnable(unsigned long ulIntFlags); +extern void HibernateIntDisable(unsigned long ulIntFlags); +extern void HibernateIntRegister(void (*pfnHandler)(void)); +extern void HibernateIntUnregister(void); +extern unsigned long HibernateIntStatus(tBoolean bMasked); +extern void HibernateIntClear(unsigned long ulIntFlags); +extern unsigned int HibernateIsActive(void); + +#ifdef __cplusplus +} +#endif + +#endif // __HIBERNATE_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_adc.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_adc.h new file mode 100644 index 000000000..932d3f26e --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_adc.h @@ -0,0 +1,343 @@ +//***************************************************************************** +// +// hw_adc.h - Macros used when accessing the ADC hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_ADC_H__ +#define __HW_ADC_H__ + +//***************************************************************************** +// +// The following define the offsets of the ADC registers. +// +//***************************************************************************** +#define ADC_O_ACTSS 0x00000000 // Active sample register +#define ADC_O_RIS 0x00000004 // Raw interrupt status register +#define ADC_O_IM 0x00000008 // Interrupt mask register +#define ADC_O_ISC 0x0000000C // Interrupt status/clear register +#define ADC_O_OSTAT 0x00000010 // Overflow status register +#define ADC_O_EMUX 0x00000014 // Event multiplexer select reg. +#define ADC_O_USTAT 0x00000018 // Underflow status register +#define ADC_O_SSPRI 0x00000020 // Channel priority register +#define ADC_O_PSSI 0x00000028 // Processor sample initiate reg. +#define ADC_O_SAC 0x00000030 // Sample Averaging Control reg. +#define ADC_O_SSMUX0 0x00000040 // Multiplexer select 0 register +#define ADC_O_SSCTL0 0x00000044 // Sample sequence control 0 reg. +#define ADC_O_SSFIFO0 0x00000048 // Result FIFO 0 register +#define ADC_O_SSFSTAT0 0x0000004C // FIFO 0 status register +#define ADC_O_SSMUX1 0x00000060 // Multiplexer select 1 register +#define ADC_O_SSCTL1 0x00000064 // Sample sequence control 1 reg. +#define ADC_O_SSFIFO1 0x00000068 // Result FIFO 1 register +#define ADC_O_SSFSTAT1 0x0000006C // FIFO 1 status register +#define ADC_O_SSMUX2 0x00000080 // Multiplexer select 2 register +#define ADC_O_SSCTL2 0x00000084 // Sample sequence control 2 reg. +#define ADC_O_SSFIFO2 0x00000088 // Result FIFO 2 register +#define ADC_O_SSFSTAT2 0x0000008C // FIFO 2 status register +#define ADC_O_SSMUX3 0x000000A0 // Multiplexer select 3 register +#define ADC_O_SSCTL3 0x000000A4 // Sample sequence control 3 reg. +#define ADC_O_SSFIFO3 0x000000A8 // Result FIFO 3 register +#define ADC_O_SSFSTAT3 0x000000AC // FIFO 3 status register +#define ADC_O_TMLB 0x00000100 // Test mode loopback register + +//***************************************************************************** +// +// The following define the offsets of the ADC sequence registers. +// +//***************************************************************************** +#define ADC_O_SEQ 0x00000040 // Offset to the first sequence +#define ADC_O_SEQ_STEP 0x00000020 // Increment to the next sequence +#define ADC_O_X_SSMUX 0x00000000 // Multiplexer select register +#define ADC_O_X_SSCTL 0x00000004 // Sample sequence control register +#define ADC_O_X_SSFIFO 0x00000008 // Result FIFO register +#define ADC_O_X_SSFSTAT 0x0000000C // FIFO status register + +//***************************************************************************** +// +// The following define the bit fields in the ADC_ACTSS register. +// +//***************************************************************************** +#define ADC_ACTSS_ASEN3 0x00000008 // Sample sequence 3 enable +#define ADC_ACTSS_ASEN2 0x00000004 // Sample sequence 2 enable +#define ADC_ACTSS_ASEN1 0x00000002 // Sample sequence 1 enable +#define ADC_ACTSS_ASEN0 0x00000001 // Sample sequence 0 enable + +//***************************************************************************** +// +// The following define the bit fields in the ADC_RIS register. +// +//***************************************************************************** +#define ADC_RIS_INR3 0x00000008 // Sample sequence 3 interrupt +#define ADC_RIS_INR2 0x00000004 // Sample sequence 2 interrupt +#define ADC_RIS_INR1 0x00000002 // Sample sequence 1 interrupt +#define ADC_RIS_INR0 0x00000001 // Sample sequence 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the ADC_IM register. +// +//***************************************************************************** +#define ADC_IM_MASK3 0x00000008 // Sample sequence 3 mask +#define ADC_IM_MASK2 0x00000004 // Sample sequence 2 mask +#define ADC_IM_MASK1 0x00000002 // Sample sequence 1 mask +#define ADC_IM_MASK0 0x00000001 // Sample sequence 0 mask + +//***************************************************************************** +// +// The following define the bit fields in the ADC_ISC register. +// +//***************************************************************************** +#define ADC_ISC_IN3 0x00000008 // Sample sequence 3 interrupt +#define ADC_ISC_IN2 0x00000004 // Sample sequence 2 interrupt +#define ADC_ISC_IN1 0x00000002 // Sample sequence 1 interrupt +#define ADC_ISC_IN0 0x00000001 // Sample sequence 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the ADC_OSTAT register. +// +//***************************************************************************** +#define ADC_OSTAT_OV3 0x00000008 // Sample sequence 3 overflow +#define ADC_OSTAT_OV2 0x00000004 // Sample sequence 2 overflow +#define ADC_OSTAT_OV1 0x00000002 // Sample sequence 1 overflow +#define ADC_OSTAT_OV0 0x00000001 // Sample sequence 0 overflow + +//***************************************************************************** +// +// The following define the bit fields in the ADC_EMUX register. +// +//***************************************************************************** +#define ADC_EMUX_EM3_MASK 0x0000F000 // Event mux 3 mask +#define ADC_EMUX_EM3_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM3_COMP0 0x00001000 // Analog comparator 0 event +#define ADC_EMUX_EM3_COMP1 0x00002000 // Analog comparator 1 event +#define ADC_EMUX_EM3_COMP2 0x00003000 // Analog comparator 2 event +#define ADC_EMUX_EM3_EXTERNAL 0x00004000 // External event +#define ADC_EMUX_EM3_TIMER 0x00005000 // Timer event +#define ADC_EMUX_EM3_PWM0 0x00006000 // PWM0 event +#define ADC_EMUX_EM3_PWM1 0x00007000 // PWM1 event +#define ADC_EMUX_EM3_PWM2 0x00008000 // PWM2 event +#define ADC_EMUX_EM3_ALWAYS 0x0000F000 // Always event +#define ADC_EMUX_EM2_MASK 0x00000F00 // Event mux 2 mask +#define ADC_EMUX_EM2_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM2_COMP0 0x00000100 // Analog comparator 0 event +#define ADC_EMUX_EM2_COMP1 0x00000200 // Analog comparator 1 event +#define ADC_EMUX_EM2_COMP2 0x00000300 // Analog comparator 2 event +#define ADC_EMUX_EM2_EXTERNAL 0x00000400 // External event +#define ADC_EMUX_EM2_TIMER 0x00000500 // Timer event +#define ADC_EMUX_EM2_PWM0 0x00000600 // PWM0 event +#define ADC_EMUX_EM2_PWM1 0x00000700 // PWM1 event +#define ADC_EMUX_EM2_PWM2 0x00000800 // PWM2 event +#define ADC_EMUX_EM2_ALWAYS 0x00000F00 // Always event +#define ADC_EMUX_EM1_MASK 0x000000F0 // Event mux 1 mask +#define ADC_EMUX_EM1_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM1_COMP0 0x00000010 // Analog comparator 0 event +#define ADC_EMUX_EM1_COMP1 0x00000020 // Analog comparator 1 event +#define ADC_EMUX_EM1_COMP2 0x00000030 // Analog comparator 2 event +#define ADC_EMUX_EM1_EXTERNAL 0x00000040 // External event +#define ADC_EMUX_EM1_TIMER 0x00000050 // Timer event +#define ADC_EMUX_EM1_PWM0 0x00000060 // PWM0 event +#define ADC_EMUX_EM1_PWM1 0x00000070 // PWM1 event +#define ADC_EMUX_EM1_PWM2 0x00000080 // PWM2 event +#define ADC_EMUX_EM1_ALWAYS 0x000000F0 // Always event +#define ADC_EMUX_EM0_MASK 0x0000000F // Event mux 0 mask +#define ADC_EMUX_EM0_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM0_COMP0 0x00000001 // Analog comparator 0 event +#define ADC_EMUX_EM0_COMP1 0x00000002 // Analog comparator 1 event +#define ADC_EMUX_EM0_COMP2 0x00000003 // Analog comparator 2 event +#define ADC_EMUX_EM0_EXTERNAL 0x00000004 // External event +#define ADC_EMUX_EM0_TIMER 0x00000005 // Timer event +#define ADC_EMUX_EM0_PWM0 0x00000006 // PWM0 event +#define ADC_EMUX_EM0_PWM1 0x00000007 // PWM1 event +#define ADC_EMUX_EM0_PWM2 0x00000008 // PWM2 event +#define ADC_EMUX_EM0_ALWAYS 0x0000000F // Always event +#define ADC_EMUX_EM0_SHIFT 0 // The shift for the first event +#define ADC_EMUX_EM1_SHIFT 4 // The shift for the second event +#define ADC_EMUX_EM2_SHIFT 8 // The shift for the third event +#define ADC_EMUX_EM3_SHIFT 12 // The shift for the fourth event + +//***************************************************************************** +// +// The following define the bit fields in the ADC_USTAT register. +// +//***************************************************************************** +#define ADC_USTAT_UV3 0x00000008 // Sample sequence 3 underflow +#define ADC_USTAT_UV2 0x00000004 // Sample sequence 2 underflow +#define ADC_USTAT_UV1 0x00000002 // Sample sequence 1 underflow +#define ADC_USTAT_UV0 0x00000001 // Sample sequence 0 underflow + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSPRI register. +// +//***************************************************************************** +#define ADC_SSPRI_SS3_MASK 0x00003000 // Sequencer 3 priority mask +#define ADC_SSPRI_SS3_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS3_2ND 0x00001000 // Second priority +#define ADC_SSPRI_SS3_3RD 0x00002000 // Third priority +#define ADC_SSPRI_SS3_4TH 0x00003000 // Fourth priority +#define ADC_SSPRI_SS2_MASK 0x00000300 // Sequencer 2 priority mask +#define ADC_SSPRI_SS2_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS2_2ND 0x00000100 // Second priority +#define ADC_SSPRI_SS2_3RD 0x00000200 // Third priority +#define ADC_SSPRI_SS2_4TH 0x00000300 // Fourth priority +#define ADC_SSPRI_SS1_MASK 0x00000030 // Sequencer 1 priority mask +#define ADC_SSPRI_SS1_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS1_2ND 0x00000010 // Second priority +#define ADC_SSPRI_SS1_3RD 0x00000020 // Third priority +#define ADC_SSPRI_SS1_4TH 0x00000030 // Fourth priority +#define ADC_SSPRI_SS0_MASK 0x00000003 // Sequencer 0 priority mask +#define ADC_SSPRI_SS0_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS0_2ND 0x00000001 // Second priority +#define ADC_SSPRI_SS0_3RD 0x00000002 // Third priority +#define ADC_SSPRI_SS0_4TH 0x00000003 // Fourth priority + +//***************************************************************************** +// +// The following define the bit fields in the ADC_PSSI register. +// +//***************************************************************************** +#define ADC_PSSI_SS3 0x00000008 // Trigger sample sequencer 3 +#define ADC_PSSI_SS2 0x00000004 // Trigger sample sequencer 2 +#define ADC_PSSI_SS1 0x00000002 // Trigger sample sequencer 1 +#define ADC_PSSI_SS0 0x00000001 // Trigger sample sequencer 0 + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SAC register. +// +//***************************************************************************** +#define ADC_SAC_AVG_OFF 0x00000000 // No hardware oversampling +#define ADC_SAC_AVG_2X 0x00000001 // 2x hardware oversampling +#define ADC_SAC_AVG_4X 0x00000002 // 4x hardware oversampling +#define ADC_SAC_AVG_8X 0x00000003 // 8x hardware oversampling +#define ADC_SAC_AVG_16X 0x00000004 // 16x hardware oversampling +#define ADC_SAC_AVG_32X 0x00000005 // 32x hardware oversampling +#define ADC_SAC_AVG_64X 0x00000006 // 64x hardware oversampling + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSMUX0, ADC_SSMUX1, +// ADC_SSMUX2, and ADC_SSMUX3 registers. Not all fields are present in all +// registers. +// +//***************************************************************************** +#define ADC_SSMUX_MUX7_MASK 0x70000000 // 8th mux select mask +#define ADC_SSMUX_MUX6_MASK 0x07000000 // 7th mux select mask +#define ADC_SSMUX_MUX5_MASK 0x00700000 // 6th mux select mask +#define ADC_SSMUX_MUX4_MASK 0x00070000 // 5th mux select mask +#define ADC_SSMUX_MUX3_MASK 0x00007000 // 4th mux select mask +#define ADC_SSMUX_MUX2_MASK 0x00000700 // 3rd mux select mask +#define ADC_SSMUX_MUX1_MASK 0x00000070 // 2nd mux select mask +#define ADC_SSMUX_MUX0_MASK 0x00000007 // 1st mux select mask +#define ADC_SSMUX_MUX7_SHIFT 28 +#define ADC_SSMUX_MUX6_SHIFT 24 +#define ADC_SSMUX_MUX5_SHIFT 20 +#define ADC_SSMUX_MUX4_SHIFT 16 +#define ADC_SSMUX_MUX3_SHIFT 12 +#define ADC_SSMUX_MUX2_SHIFT 8 +#define ADC_SSMUX_MUX1_SHIFT 4 +#define ADC_SSMUX_MUX0_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSCTL0, ADC_SSCTL1, +// ADC_SSCTL2, and ADC_SSCTL3 registers. Not all fields are present in all +// registers. +// +//***************************************************************************** +#define ADC_SSCTL_TS7 0x80000000 // 8th temperature sensor select +#define ADC_SSCTL_IE7 0x40000000 // 8th interrupt enable +#define ADC_SSCTL_END7 0x20000000 // 8th sequence end select +#define ADC_SSCTL_D7 0x10000000 // 8th differential select +#define ADC_SSCTL_TS6 0x08000000 // 7th temperature sensor select +#define ADC_SSCTL_IE6 0x04000000 // 7th interrupt enable +#define ADC_SSCTL_END6 0x02000000 // 7th sequence end select +#define ADC_SSCTL_D6 0x01000000 // 7th differential select +#define ADC_SSCTL_TS5 0x00800000 // 6th temperature sensor select +#define ADC_SSCTL_IE5 0x00400000 // 6th interrupt enable +#define ADC_SSCTL_END5 0x00200000 // 6th sequence end select +#define ADC_SSCTL_D5 0x00100000 // 6th differential select +#define ADC_SSCTL_TS4 0x00080000 // 5th temperature sensor select +#define ADC_SSCTL_IE4 0x00040000 // 5th interrupt enable +#define ADC_SSCTL_END4 0x00020000 // 5th sequence end select +#define ADC_SSCTL_D4 0x00010000 // 5th differential select +#define ADC_SSCTL_TS3 0x00008000 // 4th temperature sensor select +#define ADC_SSCTL_IE3 0x00004000 // 4th interrupt enable +#define ADC_SSCTL_END3 0x00002000 // 4th sequence end select +#define ADC_SSCTL_D3 0x00001000 // 4th differential select +#define ADC_SSCTL_TS2 0x00000800 // 3rd temperature sensor select +#define ADC_SSCTL_IE2 0x00000400 // 3rd interrupt enable +#define ADC_SSCTL_END2 0x00000200 // 3rd sequence end select +#define ADC_SSCTL_D2 0x00000100 // 3rd differential select +#define ADC_SSCTL_TS1 0x00000080 // 2nd temperature sensor select +#define ADC_SSCTL_IE1 0x00000040 // 2nd interrupt enable +#define ADC_SSCTL_END1 0x00000020 // 2nd sequence end select +#define ADC_SSCTL_D1 0x00000010 // 2nd differential select +#define ADC_SSCTL_TS0 0x00000008 // 1st temperature sensor select +#define ADC_SSCTL_IE0 0x00000004 // 1st interrupt enable +#define ADC_SSCTL_END0 0x00000002 // 1st sequence end select +#define ADC_SSCTL_D0 0x00000001 // 1st differential select + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSFIFO0, ADC_SSFIFO1, +// ADC_SSFIFO2, and ADC_SSFIFO3 registers. +// +//***************************************************************************** +#define ADC_SSFIFO_DATA_MASK 0x000003FF // Sample data +#define ADC_SSFIFO_DATA_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSFSTAT0, ADC_SSFSTAT1, +// ADC_SSFSTAT2, and ADC_SSFSTAT3 registers. +// +//***************************************************************************** +#define ADC_SSFSTAT_FULL 0x00001000 // FIFO is full +#define ADC_SSFSTAT_EMPTY 0x00000100 // FIFO is empty +#define ADC_SSFSTAT_HPTR 0x000000F0 // FIFO head pointer +#define ADC_SSFSTAT_TPTR 0x0000000F // FIFO tail pointer + +//***************************************************************************** +// +// The following define the bit fields in the ADC_TMLB register. +// +//***************************************************************************** +#define ADC_TMLB_LB 0x00000001 // Loopback control signals + +//***************************************************************************** +// +// The following define the bit fields in the loopback ADC data. +// +//***************************************************************************** +#define ADC_LB_CNT_MASK 0x000003C0 // Sample counter mask +#define ADC_LB_CONT 0x00000020 // Continuation sample +#define ADC_LB_DIFF 0x00000010 // Differential sample +#define ADC_LB_TS 0x00000008 // Temperature sensor sample +#define ADC_LB_MUX_MASK 0x00000007 // Input channel number mask +#define ADC_LB_CNT_SHIFT 6 // Sample counter shift +#define ADC_LB_MUX_SHIFT 0 // Input channel number shift + +#endif // __HW_ADC_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_can.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_can.h new file mode 100644 index 000000000..02f7b7465 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_can.h @@ -0,0 +1,379 @@ +//***************************************************************************** +// +// hw_can.h - Defines and macros used when accessing the can. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_CAN_H__ +#define __HW_CAN_H__ + +//***************************************************************************** +// +// The following define the offsets of the can registers. +// +//***************************************************************************** +#define CAN_O_CTL 0x00000000 // Control register +#define CAN_O_STS 0x00000004 // Status register +#define CAN_O_ERR 0x00000008 // Error register +#define CAN_O_BIT 0x0000000C // Bit Timing register +#define CAN_O_INT 0x00000010 // Interrupt register +#define CAN_O_TST 0x00000014 // Test register +#define CAN_O_BRPE 0x00000018 // Baud Rate Prescaler register +#define CAN_O_IF1CRQ 0x00000020 // Interface 1 Command Request reg. +#define CAN_O_IF1CMSK 0x00000024 // Interface 1 Command Mask reg. +#define CAN_O_IF1MSK1 0x00000028 // Interface 1 Mask 1 register +#define CAN_O_IF1MSK2 0x0000002C // Interface 1 Mask 2 register +#define CAN_O_IF1ARB1 0x00000030 // Interface 1 Arbitration 1 reg. +#define CAN_O_IF1ARB2 0x00000034 // Interface 1 Arbitration 2 reg. +#define CAN_O_IF1MCTL 0x00000038 // Interface 1 Message Control reg. +#define CAN_O_IF1DA1 0x0000003C // Interface 1 DataA 1 register +#define CAN_O_IF1DA2 0x00000040 // Interface 1 DataA 2 register +#define CAN_O_IF1DB1 0x00000044 // Interface 1 DataB 1 register +#define CAN_O_IF1DB2 0x00000048 // Interface 1 DataB 2 register +#define CAN_O_IF2CRQ 0x00000080 // Interface 2 Command Request reg. +#define CAN_O_IF2CMSK 0x00000084 // Interface 2 Command Mask reg. +#define CAN_O_IF2MSK1 0x00000088 // Interface 2 Mask 1 register +#define CAN_O_IF2MSK2 0x0000008C // Interface 2 Mask 2 register +#define CAN_O_IF2ARB1 0x00000090 // Interface 2 Arbitration 1 reg. +#define CAN_O_IF2ARB2 0x00000094 // Interface 2 Arbitration 2 reg. +#define CAN_O_IF2MCTL 0x00000098 // Interface 2 Message Control reg. +#define CAN_O_IF2DA1 0x0000009C // Interface 2 DataA 1 register +#define CAN_O_IF2DA2 0x000000A0 // Interface 2 DataA 2 register +#define CAN_O_IF2DB1 0x000000A4 // Interface 2 DataB 1 register +#define CAN_O_IF2DB2 0x000000A8 // Interface 2 DataB 2 register +#define CAN_O_TXRQ1 0x00000100 // Transmission Request 1 register +#define CAN_O_TXRQ2 0x00000104 // Transmission Request 2 register +#define CAN_O_NWDA1 0x00000120 // New Data 1 register +#define CAN_O_NWDA2 0x00000124 // New Data 2 register +#define CAN_O_MSGINT1 0x00000140 // Intr. Pending in Msg Obj 1 reg. +#define CAN_O_MSGINT2 0x00000144 // Intr. Pending in Msg Obj 2 reg. +#define CAN_O_MSGVAL1 0x00000160 // Message Valid in Msg Obj 1 reg. +#define CAN_O_MSGVAL2 0x00000164 // Message Valid in Msg Obj 2 reg. + +//***************************************************************************** +// +// The following define the reset values of the can registers. +// +//***************************************************************************** +#define CAN_RV_CTL 0x00000001 +#define CAN_RV_STS 0x00000000 +#define CAN_RV_ERR 0x00000000 +#define CAN_RV_BIT 0x00002301 +#define CAN_RV_INT 0x00000000 +#define CAN_RV_TST 0x00000000 +#define CAN_RV_BRPE 0x00000000 +#define CAN_RV_IF1CRQ 0x00000001 +#define CAN_RV_IF1CMSK 0x00000000 +#define CAN_RV_IF1MSK1 0x0000FFFF +#define CAN_RV_IF1MSK2 0x0000FFFF +#define CAN_RV_IF1ARB1 0x00000000 +#define CAN_RV_IF1ARB2 0x00000000 +#define CAN_RV_IF1MCTL 0x00000000 +#define CAN_RV_IF1DA1 0x00000000 +#define CAN_RV_IF1DA2 0x00000000 +#define CAN_RV_IF1DB1 0x00000000 +#define CAN_RV_IF1DB2 0x00000000 +#define CAN_RV_IF2CRQ 0x00000001 +#define CAN_RV_IF2CMSK 0x00000000 +#define CAN_RV_IF2MSK1 0x0000FFFF +#define CAN_RV_IF2MSK2 0x0000FFFF +#define CAN_RV_IF2ARB1 0x00000000 +#define CAN_RV_IF2ARB2 0x00000000 +#define CAN_RV_IF2MCTL 0x00000000 +#define CAN_RV_IF2DA1 0x00000000 +#define CAN_RV_IF2DA2 0x00000000 +#define CAN_RV_IF2DB1 0x00000000 +#define CAN_RV_IF2DB2 0x00000000 +#define CAN_RV_TXRQ1 0x00000000 +#define CAN_RV_TXRQ2 0x00000000 +#define CAN_RV_NWDA1 0x00000000 +#define CAN_RV_NWDA2 0x00000000 +#define CAN_RV_MSGINT1 0x00000000 +#define CAN_RV_MSGINT2 0x00000000 +#define CAN_RV_MSGVAL1 0x00000000 +#define CAN_RV_MSGVAL2 0x00000000 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_CTL register. +// +//***************************************************************************** +#define CAN_CTL_TEST 0x00000080 // Test mode enable +#define CAN_CTL_CCE 0x00000040 // Configuration change enable +#define CAN_CTL_DAR 0x00000020 // Disable automatic retransmission +#define CAN_CTL_EIE 0x00000008 // Error interrupt enable +#define CAN_CTL_SIE 0x00000004 // Status change interrupt enable +#define CAN_CTL_IE 0x00000002 // Module interrupt enable +#define CAN_CTL_INIT 0x00000001 // Initialization + +//***************************************************************************** +// +// The following define the bit fields in the CAN_STS register. +// +//***************************************************************************** +#define CAN_STS_BOFF 0x00000080 // Bus Off status +#define CAN_STS_EWARN 0x00000040 // Error Warning status +#define CAN_STS_EPASS 0x00000020 // Error Passive status +#define CAN_STS_RXOK 0x00000010 // Received Message Successful +#define CAN_STS_TXOK 0x00000008 // Transmitted Message Successful +#define CAN_STS_LEC_MSK 0x00000007 // Last Error Code +#define CAN_STS_LEC_NONE 0x00000000 // No error +#define CAN_STS_LEC_STUFF 0x00000001 // Stuff error +#define CAN_STS_LEC_FORM 0x00000002 // Form(at) error +#define CAN_STS_LEC_ACK 0x00000003 // Ack error +#define CAN_STS_LEC_BIT1 0x00000004 // Bit 1 error +#define CAN_STS_LEC_BIT0 0x00000005 // Bit 0 error +#define CAN_STS_LEC_CRC 0x00000006 // CRC error + +//***************************************************************************** +// +// The following define the bit fields in the CAN_ERR register. +// +//***************************************************************************** +#define CAN_ERR_RP 0x00008000 // Receive error passive status +#define CAN_ERR_REC_MASK 0x00007F00 // Receive error counter status +#define CAN_ERR_REC_SHIFT 8 // Receive error counter bit pos +#define CAN_ERR_TEC_MASK 0x000000FF // Transmit error counter status +#define CAN_ERR_TEC_SHIFT 0 // Transmit error counter bit pos + +//***************************************************************************** +// +// The following define the bit fields in the CAN_BIT register. +// +//***************************************************************************** +#define CAN_BIT_TSEG2 0x00007000 // Time segment after sample point +#define CAN_BIT_TSEG1 0x00000F00 // Time segment before sample point +#define CAN_BIT_SJW 0x000000C0 // (Re)Synchronization jump width +#define CAN_BIT_BRP 0x0000003F // Baud rate prescaler + +//***************************************************************************** +// +// The following define the bit fields in the CAN_INT register. +// +//***************************************************************************** +#define CAN_INT_INTID_MSK 0x0000FFFF // Interrupt Identifier +#define CAN_INT_INTID_NONE 0x00000000 // No Interrupt Pending +#define CAN_INT_INTID_STATUS 0x00008000 // Status Interrupt + +//***************************************************************************** +// +// The following define the bit fields in the CAN_TST register. +// +//***************************************************************************** +#define CAN_TST_RX 0x00000080 // CAN_RX pin status +#define CAN_TST_TX_MSK 0x00000060 // Overide control of CAN_TX pin +#define CAN_TST_TX_CANCTL 0x00000000 // CAN core controls CAN_TX +#define CAN_TST_TX_SAMPLE 0x00000020 // Sample Point on CAN_TX +#define CAN_TST_TX_DOMINANT 0x00000040 // Dominant value on CAN_TX +#define CAN_TST_TX_RECESSIVE 0x00000060 // Recessive value on CAN_TX +#define CAN_TST_LBACK 0x00000010 // Loop back mode +#define CAN_TST_SILENT 0x00000008 // Silent mode +#define CAN_TST_BASIC 0x00000004 // Basic mode + +//***************************************************************************** +// +// The following define the bit fields in the CAN_BRPE register. +// +//***************************************************************************** +#define CAN_BRPE_BRPE 0x0000000F // Baud rate prescaler extension + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1CRQ and CAN_IF1CRQ +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFCRQ_BUSY 0x00008000 // Busy flag status +#define CAN_IFCRQ_MNUM_MSK 0x0000003F // Message Number + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1CMSK and CAN_IF2CMSK +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFCMSK_WRNRD 0x00000080 // Write, not Read +#define CAN_IFCMSK_MASK 0x00000040 // Access Mask Bits +#define CAN_IFCMSK_ARB 0x00000020 // Access Arbitration Bits +#define CAN_IFCMSK_CONTROL 0x00000010 // Access Control Bits +#define CAN_IFCMSK_CLRINTPND 0x00000008 // Clear interrupt pending Bit +#define CAN_IFCMSK_TXRQST 0x00000004 // Access Tx request bit (WRNRD=1) +#define CAN_IFCMSK_NEWDAT 0x00000004 // Access New Data bit (WRNRD=0) +#define CAN_IFCMSK_DATAA 0x00000002 // DataA access - bytes 0 to 3 +#define CAN_IFCMSK_DATAB 0x00000001 // DataB access - bytes 4 to 7 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1MSK1 and CAN_IF2MSK1 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFMSK1_MSK 0x0000FFFF // Identifier Mask + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1MSK2 and CAN_IF2MSK2 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFMSK2_MXTD 0x00008000 // Mask extended identifier +#define CAN_IFMSK2_MDIR 0x00004000 // Mask message direction +#define CAN_IFMSK2_MSK 0x00001FFF // Mask identifier + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1ARB1 and CAN_IF2ARB1 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFARB1_ID 0x0000FFFF // Identifier + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1ARB2 and CAN_IF2ARB2 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFARB2_MSGVAL 0x00008000 // Message valid +#define CAN_IFARB2_XTD 0x00004000 // Extended identifier +#define CAN_IFARB2_DIR 0x00002000 // Message direction +#define CAN_IFARB2_ID 0x00001FFF // Message identifier + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1MCTL and CAN_IF2MCTL +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFMCTL_NEWDAT 0x00008000 // New Data +#define CAN_IFMCTL_MSGLST 0x00004000 // Message lost +#define CAN_IFMCTL_INTPND 0x00002000 // Interrupt pending +#define CAN_IFMCTL_UMASK 0x00001000 // Use acceptance mask +#define CAN_IFMCTL_TXIE 0x00000800 // Transmit interrupt enable +#define CAN_IFMCTL_RXIE 0x00000400 // Receive interrupt enable +#define CAN_IFMCTL_RMTEN 0x00000200 // Remote enable +#define CAN_IFMCTL_TXRQST 0x00000100 // Transmit request +#define CAN_IFMCTL_EOB 0x00000080 // End of buffer +#define CAN_IFMCTL_DLC 0x0000000F // Data length code + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1DA1 and CAN_IF2DA1 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFDA1_DATA 0x0000FFFF // Data - bytes 1 and 0 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1DA2 and CAN_IF2DA2 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFDA2_DATA 0x0000FFFF // Data - bytes 3 and 2 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1DB1 and CAN_IF2DB1 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFDB1_DATA 0x0000FFFF // Data - bytes 5 and 4 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1DB2 and CAN_IF2DB2 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFDB2_DATA 0x0000FFFF // Data - bytes 7 and 6 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_TXRQ1 register. +// +//***************************************************************************** +#define CAN_TXRQ1_TXRQST 0x0000FFFF // Transmission Request Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_TXRQ2 register. +// +//***************************************************************************** +#define CAN_TXRQ2_TXRQST 0x0000FFFF // Transmission Request Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_NWDA1 register. +// +//***************************************************************************** +#define CAN_NWDA1_NEWDATA 0x0000FFFF // New Data Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_NWDA2 register. +// +//***************************************************************************** +#define CAN_NWDA2_NEWDATA 0x0000FFFF // New Data Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_MSGINT1 register. +// +//***************************************************************************** +#define CAN_MSGINT1_INTPND 0x0000FFFF // Interrupt Pending Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_MSGINT2 register. +// +//***************************************************************************** +#define CAN_MSGINT2_INTPND 0x0000FFFF // Interrupt Pending Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_MSGVAL1 register. +// +//***************************************************************************** +#define CAN_MSGVAL1_MSGVAL 0x0000FFFF // Message Valid Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_MSGVAL2 register. +// +//***************************************************************************** +#define CAN_MSGVAL2_MSGVAL 0x0000FFFF // Message Valid Bits + +#endif // __HW_CAN_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_comp.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_comp.h new file mode 100644 index 000000000..d8b355ea9 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_comp.h @@ -0,0 +1,118 @@ +//***************************************************************************** +// +// hw_comp.h - Macros used when accessing the comparator hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_COMP_H__ +#define __HW_COMP_H__ + +//***************************************************************************** +// +// The following define the offsets of the comparator registers. +// +//***************************************************************************** +#define COMP_O_MIS 0x00000000 // Interrupt status register +#define COMP_O_RIS 0x00000004 // Raw interrupt status register +#define COMP_O_INTEN 0x00000008 // Interrupt enable register +#define COMP_O_REFCTL 0x00000010 // Reference voltage control reg. +#define COMP_O_ACSTAT0 0x00000020 // Comp0 status register +#define COMP_O_ACCTL0 0x00000024 // Comp0 control register +#define COMP_O_ACSTAT1 0x00000040 // Comp1 status register +#define COMP_O_ACCTL1 0x00000044 // Comp1 control register +#define COMP_O_ACSTAT2 0x00000060 // Comp2 status register +#define COMP_O_ACCTL2 0x00000064 // Comp2 control register + +//***************************************************************************** +// +// The following define the bit fields in the COMP_MIS, COMP_RIS, and +// COMP_INTEN registers. +// +//***************************************************************************** +#define COMP_INT_2 0x00000004 // Comp2 interrupt +#define COMP_INT_1 0x00000002 // Comp1 interrupt +#define COMP_INT_0 0x00000001 // Comp0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the COMP_REFCTL register. +// +//***************************************************************************** +#define COMP_REFCTL_EN 0x00000200 // Reference voltage enable +#define COMP_REFCTL_RNG 0x00000100 // Reference voltage range +#define COMP_REFCTL_VREF_MASK 0x0000000F // Reference voltage select mask +#define COMP_REFCTL_VREF_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the COMP_ACSTAT0, COMP_ACSTAT1, and +// COMP_ACSTAT2 registers. +// +//***************************************************************************** +#define COMP_ACSTAT_OVAL 0x00000002 // Comparator output value + +//***************************************************************************** +// +// The following define the bit fields in the COMP_ACCTL0, COMP_ACCTL1, and +// COMP_ACCTL2 registers. +// +//***************************************************************************** +#define COMP_ACCTL_TMASK 0x00000800 // Trigger enable +#define COMP_ACCTL_ASRCP_MASK 0x00000600 // Vin+ source select mask +#define COMP_ACCTL_ASRCP_PIN 0x00000000 // Dedicated Comp+ pin +#define COMP_ACCTL_ASRCP_PIN0 0x00000200 // Comp0+ pin +#define COMP_ACCTL_ASRCP_REF 0x00000400 // Internal voltage reference +#define COMP_ACCTL_ASRCP_RES 0x00000600 // Reserved +#define COMP_ACCTL_OEN 0x00000100 // Comparator output enable +#define COMP_ACCTL_TSVAL 0x00000080 // Trigger polarity select +#define COMP_ACCTL_TSEN_MASK 0x00000060 // Trigger sense mask +#define COMP_ACCTL_TSEN_LEVEL 0x00000000 // Trigger is level sense +#define COMP_ACCTL_TSEN_FALL 0x00000020 // Trigger is falling edge +#define COMP_ACCTL_TSEN_RISE 0x00000040 // Trigger is rising edge +#define COMP_ACCTL_TSEN_BOTH 0x00000060 // Trigger is both edges +#define COMP_ACCTL_ISLVAL 0x00000010 // Interrupt polarity select +#define COMP_ACCTL_ISEN_MASK 0x0000000C // Interrupt sense mask +#define COMP_ACCTL_ISEN_LEVEL 0x00000000 // Interrupt is level sense +#define COMP_ACCTL_ISEN_FALL 0x00000004 // Interrupt is falling edge +#define COMP_ACCTL_ISEN_RISE 0x00000008 // Interrupt is rising edge +#define COMP_ACCTL_ISEN_BOTH 0x0000000C // Interrupt is both edges +#define COMP_ACCTL_CINV 0x00000002 // Comparator output invert + +//***************************************************************************** +// +// The following define the reset values for the comparator registers. +// +//***************************************************************************** +#define COMP_RV_MIS 0x00000000 // Interrupt status register +#define COMP_RV_RIS 0x00000000 // Raw interrupt status register +#define COMP_RV_INTEN 0x00000000 // Interrupt enable register +#define COMP_RV_REFCTL 0x00000000 // Reference voltage control reg. +#define COMP_RV_ACSTAT0 0x00000000 // Comp0 status register +#define COMP_RV_ACCTL0 0x00000000 // Comp0 control register +#define COMP_RV_ACSTAT1 0x00000000 // Comp1 status register +#define COMP_RV_ACCTL1 0x00000000 // Comp1 control register +#define COMP_RV_ACSTAT2 0x00000000 // Comp2 status register +#define COMP_RV_ACCTL2 0x00000000 // Comp2 control register + +#endif // __HW_COMP_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_ethernet.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_ethernet.h new file mode 100644 index 000000000..7a8d224cd --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_ethernet.h @@ -0,0 +1,205 @@ +//***************************************************************************** +// +// hw_ethernet.h - Macros used when accessing the ethernet hardware. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_ETHERNET_H__ +#define __HW_ETHERNET_H__ + +//***************************************************************************** +// +// The following define the offsets of the MAC registers in the Ethernet +// Controller. +// +//***************************************************************************** +#define MAC_O_IS 0x00000000 // Interrupt Status Register +#define MAC_O_IACK 0x00000000 // Interrupt Acknowledge Register +#define MAC_O_IM 0x00000004 // Interrupt Mask Register +#define MAC_O_RCTL 0x00000008 // Receive Control Register +#define MAC_O_TCTL 0x0000000C // Transmit Control Register +#define MAC_O_DATA 0x00000010 // Data Register +#define MAC_O_IA0 0x00000014 // Individual Address Register 0 +#define MAC_O_IA1 0x00000018 // Individual Address Register 1 +#define MAC_O_THR 0x0000001C // Threshold Register +#define MAC_O_MCTL 0x00000020 // Management Control Register +#define MAC_O_MDV 0x00000024 // Management Divider Register +#define MAC_O_MADD 0x00000028 // Management Address Register +#define MAC_O_MTXD 0x0000002C // Management Transmit Data Reg +#define MAC_O_MRXD 0x00000030 // Management Receive Data Reg +#define MAC_O_NP 0x00000034 // Number of Packets Register +#define MAC_O_TR 0x00000038 // Transmission Request Register + +//***************************************************************************** +// +// The following define the reset values of the MAC registers. +// +//***************************************************************************** +#define MAC_RV_IS 0x00000000 +#define MAC_RV_IACK 0x00000000 +#define MAC_RV_IM 0x0000007F +#define MAC_RV_RCTL 0x00000008 +#define MAC_RV_TCTL 0x00000000 +#define MAC_RV_DATA 0x00000000 +#define MAC_RV_IA0 0x00000000 +#define MAC_RV_IA1 0x00000000 +#define MAC_RV_THR 0x0000003F +#define MAC_RV_MCTL 0x00000000 +#define MAC_RV_MDV 0x00000080 +#define MAC_RV_MADD 0x00000000 +#define MAC_RV_MTXD 0x00000000 +#define MAC_RV_MRXD 0x00000000 +#define MAC_RV_NP 0x00000000 +#define MAC_RV_TR 0x00000000 + +//***************************************************************************** +// +// The following define the bit fields in the MAC_IS register. +// +//***************************************************************************** +#define MAC_IS_PHYINT 0x00000040 // PHY Interrupt +#define MAC_IS_MDINT 0x00000020 // MDI Transaction Complete +#define MAC_IS_RXER 0x00000010 // RX Error +#define MAC_IS_FOV 0x00000008 // RX FIFO Overrun +#define MAC_IS_TXEMP 0x00000004 // TX FIFO Empy +#define MAC_IS_TXER 0x00000002 // TX Error +#define MAC_IS_RXINT 0x00000001 // RX Packet Available + +//***************************************************************************** +// +// The following define the bit fields in the MAC_IACK register. +// +//***************************************************************************** +#define MAC_IACK_PHYINT 0x00000040 // Clear PHY Interrupt +#define MAC_IACK_MDINT 0x00000020 // Clear MDI Transaction Complete +#define MAC_IACK_RXER 0x00000010 // Clear RX Error +#define MAC_IACK_FOV 0x00000008 // Clear RX FIFO Overrun +#define MAC_IACK_TXEMP 0x00000004 // Clear TX FIFO Empy +#define MAC_IACK_TXER 0x00000002 // Clear TX Error +#define MAC_IACK_RXINT 0x00000001 // Clear RX Packet Available + +//***************************************************************************** +// +// The following define the bit fields in the MAC_IM register. +// +//***************************************************************************** +#define MAC_IM_PHYINTM 0x00000040 // Mask PHY Interrupt +#define MAC_IM_MDINTM 0x00000020 // Mask MDI Transaction Complete +#define MAC_IM_RXERM 0x00000010 // Mask RX Error +#define MAC_IM_FOVM 0x00000008 // Mask RX FIFO Overrun +#define MAC_IM_TXEMPM 0x00000004 // Mask TX FIFO Empy +#define MAC_IM_TXERM 0x00000002 // Mask TX Error +#define MAC_IM_RXINTM 0x00000001 // Mask RX Packet Available + +//***************************************************************************** +// +// The following define the bit fields in the MAC_RCTL register. +// +//***************************************************************************** +#define MAC_RCTL_RSTFIFO 0x00000010 // Clear the Receive FIFO +#define MAC_RCTL_BADCRC 0x00000008 // Reject Packets With Bad CRC +#define MAC_RCTL_PRMS 0x00000004 // Enable Promiscuous Mode +#define MAC_RCTL_AMUL 0x00000002 // Enable Multicast Packets +#define MAC_RCTL_RXEN 0x00000001 // Enable Ethernet Receiver + +//***************************************************************************** +// +// The following define the bit fields in the MAC_TCTL register. +// +//***************************************************************************** +#define MAC_TCTL_DUPLEX 0x00000010 // Enable Duplex mode +#define MAC_TCTL_CRC 0x00000004 // Enable CRC Generation +#define MAC_TCTL_PADEN 0x00000002 // Enable Automatic Padding +#define MAC_TCTL_TXEN 0x00000001 // Enable Ethernet Transmitter + +//***************************************************************************** +// +// The following define the bit fields in the MAC_IA0 register. +// +//***************************************************************************** +#define MAC_IA0_MACOCT4 0xFF000000 // 4th Octet of MAC address +#define MAC_IA0_MACOCT3 0x00FF0000 // 3rd Octet of MAC address +#define MAC_IA0_MACOCT2 0x0000FF00 // 2nd Octet of MAC address +#define MAC_IA0_MACOCT1 0x000000FF // 1st Octet of MAC address + +//***************************************************************************** +// +// The following define the bit fields in the MAC_IA1 register. +// +//***************************************************************************** +#define MAC_IA1_MACOCT6 0x0000FF00 // 6th Octet of MAC address +#define MAC_IA1_MACOCT5 0x000000FF // 5th Octet of MAC address + +//***************************************************************************** +// +// The following define the bit fields in the MAC_TXTH register. +// +//***************************************************************************** +#define MAC_THR_THRESH 0x0000003F // Transmit Threshold Value + +//***************************************************************************** +// +// The following define the bit fields in the MAC_MCTL register. +// +//***************************************************************************** +#define MAC_MCTL_REGADR 0x000000F8 // Address for Next MII Transaction +#define MAC_MCTL_WRITE 0x00000002 // Next MII Transaction is Write +#define MAC_MCTL_START 0x00000001 // Start MII Transaction + +//***************************************************************************** +// +// The following define the bit fields in the MAC_MDV register. +// +//***************************************************************************** +#define MAC_MDV_DIV 0x000000FF // Clock Divider for MDC for TX + +//***************************************************************************** +// +// The following define the bit fields in the MAC_MTXD register. +// +//***************************************************************************** +#define MAC_MTXD_MDTX 0x0000FFFF // Data for Next MII Transaction + +//***************************************************************************** +// +// The following define the bit fields in the MAC_MRXD register. +// +//***************************************************************************** +#define MAC_MRXD_MDRX 0x0000FFFF // Data Read from Last MII Trans. + +//***************************************************************************** +// +// The following define the bit fields in the MAC_NP register. +// +//***************************************************************************** +#define MAC_NP_NPR 0x0000003F // Number of RX Frames in FIFO + +//***************************************************************************** +// +// The following define the bit fields in the MAC_TXRQ register. +// +//***************************************************************************** +#define MAC_TR_NEWTX 0x00000001 // Start an Ethernet Transmission + +#endif // __HW_ETHERNET_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_flash.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_flash.h new file mode 100644 index 000000000..c5bea3b26 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_flash.h @@ -0,0 +1,147 @@ +//***************************************************************************** +// +// hw_flash.h - Macros used when accessing the flash controller. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_FLASH_H__ +#define __HW_FLASH_H__ + +//***************************************************************************** +// +// The following define the offsets of the FLASH registers. +// +//***************************************************************************** +#define FLASH_FMA 0x400FD000 // Memory address register +#define FLASH_FMD 0x400FD004 // Memory data register +#define FLASH_FMC 0x400FD008 // Memory control register +#define FLASH_FCRIS 0x400FD00c // Raw interrupt status register +#define FLASH_FCIM 0x400FD010 // Interrupt mask register +#define FLASH_FCMISC 0x400FD014 // Interrupt status register +#define FLASH_FMPRE 0x400FE130 // FLASH read protect register +#define FLASH_FMPPE 0x400FE134 // FLASH program protect register +#define FLASH_USECRL 0x400FE140 // uSec reload register +#define FLASH_FMPRE0 0x400FE200 // FLASH read protect register 0 +#define FLASH_FMPRE1 0x400FE204 // FLASH read protect register 1 +#define FLASH_FMPRE2 0x400FE208 // FLASH read protect register 2 +#define FLASH_FMPRE3 0x400FE20C // FLASH read protect register 3 +#define FLASH_FMPPE0 0x400FE400 // FLASH program protect register 0 +#define FLASH_FMPPE1 0x400FE404 // FLASH program protect register 1 +#define FLASH_FMPPE2 0x400FE408 // FLASH program protect register 2 +#define FLASH_FMPPE3 0x400FE40C // FLASH program protect register 3 + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FMC register. +// +//***************************************************************************** +#define FLASH_FMC_WRKEY_MASK 0xFFFF0000 // FLASH write key mask +#define FLASH_FMC_WRKEY 0xA4420000 // FLASH write key +#define FLASH_FMC_COMT 0x00000008 // Commit user register +#define FLASH_FMC_MERASE 0x00000004 // Mass erase FLASH +#define FLASH_FMC_ERASE 0x00000002 // Erase FLASH page +#define FLASH_FMC_WRITE 0x00000001 // Write FLASH word + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FCRIS register. +// +//***************************************************************************** +#define FLASH_FCRIS_PROGRAM 0x00000002 // Programming status +#define FLASH_FCRIS_ACCESS 0x00000001 // Invalid access status + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FCIM register. +// +//***************************************************************************** +#define FLASH_FCIM_PROGRAM 0x00000002 // Programming mask +#define FLASH_FCIM_ACCESS 0x00000001 // Invalid access mask + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FMIS register. +// +//***************************************************************************** +#define FLASH_FCMISC_PROGRAM 0x00000002 // Programming status +#define FLASH_FCMISC_ACCESS 0x00000001 // Invalid access status + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FMPRE and FLASH_FMPPE +// registers. +// +//***************************************************************************** +#define FLASH_FMP_BLOCK_31 0x80000000 // Enable for block 31 +#define FLASH_FMP_BLOCK_30 0x40000000 // Enable for block 30 +#define FLASH_FMP_BLOCK_29 0x20000000 // Enable for block 29 +#define FLASH_FMP_BLOCK_28 0x10000000 // Enable for block 28 +#define FLASH_FMP_BLOCK_27 0x08000000 // Enable for block 27 +#define FLASH_FMP_BLOCK_26 0x04000000 // Enable for block 26 +#define FLASH_FMP_BLOCK_25 0x02000000 // Enable for block 25 +#define FLASH_FMP_BLOCK_24 0x01000000 // Enable for block 24 +#define FLASH_FMP_BLOCK_23 0x00800000 // Enable for block 23 +#define FLASH_FMP_BLOCK_22 0x00400000 // Enable for block 22 +#define FLASH_FMP_BLOCK_21 0x00200000 // Enable for block 21 +#define FLASH_FMP_BLOCK_20 0x00100000 // Enable for block 20 +#define FLASH_FMP_BLOCK_19 0x00080000 // Enable for block 19 +#define FLASH_FMP_BLOCK_18 0x00040000 // Enable for block 18 +#define FLASH_FMP_BLOCK_17 0x00020000 // Enable for block 17 +#define FLASH_FMP_BLOCK_16 0x00010000 // Enable for block 16 +#define FLASH_FMP_BLOCK_15 0x00008000 // Enable for block 15 +#define FLASH_FMP_BLOCK_14 0x00004000 // Enable for block 14 +#define FLASH_FMP_BLOCK_13 0x00002000 // Enable for block 13 +#define FLASH_FMP_BLOCK_12 0x00001000 // Enable for block 12 +#define FLASH_FMP_BLOCK_11 0x00000800 // Enable for block 11 +#define FLASH_FMP_BLOCK_10 0x00000400 // Enable for block 10 +#define FLASH_FMP_BLOCK_9 0x00000200 // Enable for block 9 +#define FLASH_FMP_BLOCK_8 0x00000100 // Enable for block 8 +#define FLASH_FMP_BLOCK_7 0x00000080 // Enable for block 7 +#define FLASH_FMP_BLOCK_6 0x00000040 // Enable for block 6 +#define FLASH_FMP_BLOCK_5 0x00000020 // Enable for block 5 +#define FLASH_FMP_BLOCK_4 0x00000010 // Enable for block 4 +#define FLASH_FMP_BLOCK_3 0x00000008 // Enable for block 3 +#define FLASH_FMP_BLOCK_2 0x00000004 // Enable for block 2 +#define FLASH_FMP_BLOCK_1 0x00000002 // Enable for block 1 +#define FLASH_FMP_BLOCK_0 0x00000001 // Enable for block 0 + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_USECRL register. +// +//***************************************************************************** +#define FLASH_USECRL_MASK 0x000000FF // Clock per uSec +#define FLASH_USECRL_SHIFT 0 + +//***************************************************************************** +// +// The erase size is the size of the FLASH block that is erased by an erase +// operation, and the protect size is the size of the FLASH block that is +// protected by each protection register. +// +//***************************************************************************** +#define FLASH_ERASE_SIZE 0x00000400 +#define FLASH_PROTECT_SIZE 0x00000800 + +#endif // __HW_FLASH_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_gpio.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_gpio.h new file mode 100644 index 000000000..3596325a7 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_gpio.h @@ -0,0 +1,115 @@ +//***************************************************************************** +// +// hw_gpio.h - Defines and Macros for GPIO hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_GPIO_H__ +#define __HW_GPIO_H__ + +//***************************************************************************** +// +// GPIO Register Offsets. +// +//***************************************************************************** +#define GPIO_O_DATA 0x00000000 // Data register. +#define GPIO_O_DIR 0x00000400 // Data direction register. +#define GPIO_O_IS 0x00000404 // Interrupt sense register. +#define GPIO_O_IBE 0x00000408 // Interrupt both edges register. +#define GPIO_O_IEV 0x0000040C // Intterupt event register. +#define GPIO_O_IM 0x00000410 // Interrupt mask register. +#define GPIO_O_RIS 0x00000414 // Raw interrupt status register. +#define GPIO_O_MIS 0x00000418 // Masked interrupt status reg. +#define GPIO_O_ICR 0x0000041C // Interrupt clear register. +#define GPIO_O_AFSEL 0x00000420 // Mode control select register. +#define GPIO_O_DR2R 0x00000500 // 2ma drive select register. +#define GPIO_O_DR4R 0x00000504 // 4ma drive select register. +#define GPIO_O_DR8R 0x00000508 // 8ma drive select register. +#define GPIO_O_ODR 0x0000050C // Open drain select register. +#define GPIO_O_PUR 0x00000510 // Pull up select register. +#define GPIO_O_PDR 0x00000514 // Pull down select register. +#define GPIO_O_SLR 0x00000518 // Slew rate control enable reg. +#define GPIO_O_DEN 0x0000051C // Digital input enable register. +#define GPIO_O_LOCK 0x00000520 // Lock register. +#define GPIO_O_CR 0x00000524 // Commit register. +#define GPIO_O_PeriphID4 0x00000FD0 // +#define GPIO_O_PeriphID5 0x00000FD4 // +#define GPIO_O_PeriphID6 0x00000FD8 // +#define GPIO_O_PeriphID7 0x00000FDC // +#define GPIO_O_PeriphID0 0x00000FE0 // +#define GPIO_O_PeriphID1 0x00000FE4 // +#define GPIO_O_PeriphID2 0x00000FE8 // +#define GPIO_O_PeriphID3 0x00000FEC // +#define GPIO_O_PCellID0 0x00000FF0 // +#define GPIO_O_PCellID1 0x00000FF4 // +#define GPIO_O_PCellID2 0x00000FF8 // +#define GPIO_O_PCellID3 0x00000FFC // + +//***************************************************************************** +// +// The following define the bit fields in the GPIO_LOCK register. +// +//***************************************************************************** +#define GPIO_LOCK_LOCKED 0x00000001 // GPIO_CR register is locked +#define GPIO_LOCK_UNLOCKED 0x00000000 // GPIO_CR register is unlocked +#define GPIO_LOCK_KEY 0x1ACCE551 // Unlocks the GPIO_CR register + +//***************************************************************************** +// +// GPIO Register reset values. +// +//***************************************************************************** +#define GPIO_RV_DATA 0x00000000 // Data register reset value. +#define GPIO_RV_DIR 0x00000000 // Data direction reg RV. +#define GPIO_RV_IS 0x00000000 // Interrupt sense reg RV. +#define GPIO_RV_IBE 0x00000000 // Interrupt both edges reg RV. +#define GPIO_RV_IEV 0x00000000 // Intterupt event reg RV. +#define GPIO_RV_IM 0x00000000 // Interrupt mask reg RV. +#define GPIO_RV_RIS 0x00000000 // Raw interrupt status reg RV. +#define GPIO_RV_MIS 0x00000000 // Masked interrupt status reg RV. +#define GPIO_RV_IC 0x00000000 // Interrupt clear reg RV. +#define GPIO_RV_AFSEL 0x00000000 // Mode control select reg RV. +#define GPIO_RV_DR2R 0x000000FF // 2ma drive select reg RV. +#define GPIO_RV_DR4R 0x00000000 // 4ma drive select reg RV. +#define GPIO_RV_DR8R 0x00000000 // 8ma drive select reg RV. +#define GPIO_RV_ODR 0x00000000 // Open drain select reg RV. +#define GPIO_RV_PUR 0x000000FF // Pull up select reg RV. +#define GPIO_RV_PDR 0x00000000 // Pull down select reg RV. +#define GPIO_RV_SLR 0x00000000 // Slew rate control enable reg RV. +#define GPIO_RV_DEN 0x000000FF // Digital input enable reg RV. +#define GPIO_RV_LOCK 0x00000001 // Lock register RV. +#define GPIO_RV_PeriphID4 0x00000000 // +#define GPIO_RV_PeriphID5 0x00000000 // +#define GPIO_RV_PeriphID6 0x00000000 // +#define GPIO_RV_PeriphID7 0x00000000 // +#define GPIO_RV_PeriphID0 0x00000061 // +#define GPIO_RV_PeriphID1 0x00000010 // +#define GPIO_RV_PeriphID2 0x00000004 // +#define GPIO_RV_PeriphID3 0x00000000 // +#define GPIO_RV_PCellID0 0x0000000D // +#define GPIO_RV_PCellID1 0x000000F0 // +#define GPIO_RV_PCellID2 0x00000005 // +#define GPIO_RV_PCellID3 0x000000B1 // + +#endif // __HW_GPIO_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_hibernate.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_hibernate.h new file mode 100644 index 000000000..ee730d4c5 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_hibernate.h @@ -0,0 +1,145 @@ +//***************************************************************************** +// +// hw_hibernate.h - Defines and Macros for the Hibernation module. +// +// Copyright (c) 2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_HIBERNATE_H__ +#define __HW_HIBERNATE_H__ + +//***************************************************************************** +// +// The following define the addresses of the hibernation module registers. +// +//***************************************************************************** +#define HIB_RTCC 0x400fc000 // Hibernate RTC counter +#define HIB_RTCM0 0x400fc004 // Hibernate RTC match 0 +#define HIB_RTCM1 0x400fc008 // Hibernate RTC match 1 +#define HIB_RTCLD 0x400fc00C // Hibernate RTC load +#define HIB_CTL 0x400fc010 // Hibernate RTC control +#define HIB_IM 0x400fc014 // Hibernate interrupt mask +#define HIB_RIS 0x400fc018 // Hibernate raw interrupt status +#define HIB_MIS 0x400fc01C // Hibernate masked interrupt stat +#define HIB_IC 0x400fc020 // Hibernate interrupt clear +#define HIB_RTCT 0x400fc024 // Hibernate RTC trim +#define HIB_DATA 0x400fc030 // Hibernate data area +#define HIB_DATA_END 0x400fc130 // end of data area, exclusive + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate RTC counter register. +// +//***************************************************************************** +#define HIB_RTCC_MASK 0xffffffff // RTC counter mask + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate RTC match 0 register. +// +//***************************************************************************** +#define HIB_RTCM0_MASK 0xffffffff // RTC match 0 mask + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate RTC match 1 register. +// +//***************************************************************************** +#define HIB_RTCM1_MASK 0xffffffff // RTC match 1 mask + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate RTC load register. +// +//***************************************************************************** +#define HIB_RTCLD_MASK 0xffffffff // RTC load mask + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate control register +// +//***************************************************************************** +#define HIB_CTL_VABORT 0x00000080 // low bat abort +#define HIB_CTL_CLK32EN 0x00000040 // enable clock/oscillator +#define HIB_CTL_LOWBATEN 0x00000020 // enable low battery detect +#define HIB_CTL_PINWEN 0x00000010 // enable wake on WAKE pin +#define HIB_CTL_RTCWEN 0x00000008 // enable wake on RTC match +#define HIB_CTL_CLKSEL 0x00000004 // clock input selection +#define HIB_CTL_HIBREQ 0x00000002 // request hibernation +#define HIB_CTL_RTCEN 0x00000001 // RTC enable + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate interrupt mask reg. +// +//***************************************************************************** +#define HIB_IM_EXTW 0x00000008 // wake from external pin interrupt +#define HIB_IM_LOWBAT 0x00000004 // low battery interrupt +#define HIB_IM_RTCALT1 0x00000002 // RTC match 1 interrupt +#define HIB_IM_RTCALT0 0x00000001 // RTC match 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate raw interrupt status. +// +//***************************************************************************** +#define HIB_RIS_EXTW 0x00000008 // wake from external pin interrupt +#define HIB_RIS_LOWBAT 0x00000004 // low battery interrupt +#define HIB_RIS_RTCALT1 0x00000002 // RTC match 1 interrupt +#define HIB_RID_RTCALT0 0x00000001 // RTC match 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate masked int status. +// +//***************************************************************************** +#define HIB_MIS_EXTW 0x00000008 // wake from external pin interrupt +#define HIB_MIS_LOWBAT 0x00000004 // low battery interrupt +#define HIB_MIS_RTCALT1 0x00000002 // RTC match 1 interrupt +#define HIB_MID_RTCALT0 0x00000001 // RTC match 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate interrupt clear reg. +// +//***************************************************************************** +#define HIB_IC_EXTW 0x00000008 // wake from external pin interrupt +#define HIB_IC_LOWBAT 0x00000004 // low battery interrupt +#define HIB_IC_RTCALT1 0x00000002 // RTC match 1 interrupt +#define HIB_IC_RTCALT0 0x00000001 // RTC match 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate RTC trim register. +// +//***************************************************************************** +#define HIB_RTCT_MASK 0x0000ffff // RTC trim mask + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate data register. +// +//***************************************************************************** +#define HIB_DATA_MASK 0xffffffff // NV memory data mask + +#endif // __HW_HIBERNATE_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_i2c.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_i2c.h new file mode 100644 index 000000000..b90edb7df --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_i2c.h @@ -0,0 +1,197 @@ +//***************************************************************************** +// +// hw_i2c.h - Macros used when accessing the I2C master and slave hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_I2C_H__ +#define __HW_I2C_H__ + +//***************************************************************************** +// +// The following defines the offset between the I2C master and slave registers. +// +//***************************************************************************** +#define I2C_O_SLAVE 0x00000800 // Offset from master to slave + +//***************************************************************************** +// +// The following define the offsets of the I2C master registers. +// +//***************************************************************************** +#define I2C_MASTER_O_SA 0x00000000 // Slave address register +#define I2C_MASTER_O_CS 0x00000004 // Control and Status register +#define I2C_MASTER_O_DR 0x00000008 // Data register +#define I2C_MASTER_O_TPR 0x0000000C // Timer period register +#define I2C_MASTER_O_IMR 0x00000010 // Interrupt mask register +#define I2C_MASTER_O_RIS 0x00000014 // Raw interrupt status register +#define I2C_MASTER_O_MIS 0x00000018 // Masked interrupt status reg +#define I2C_MASTER_O_MICR 0x0000001c // Interrupt clear register +#define I2C_MASTER_O_CR 0x00000020 // Configuration register + +//***************************************************************************** +// +// The following define the offsets of the I2C slave registers. +// +//***************************************************************************** +#define I2C_SLAVE_O_OAR 0x00000000 // Own address register +#define I2C_SLAVE_O_CSR 0x00000004 // Control/Status register +#define I2C_SLAVE_O_DR 0x00000008 // Data register +#define I2C_SLAVE_O_IM 0x0000000C // Interrupt mask register +#define I2C_SLAVE_O_RIS 0x00000010 // Raw interrupt status register +#define I2C_SLAVE_O_MIS 0x00000014 // Masked interrupt status reg +#define I2C_SLAVE_O_SICR 0x00000018 // Interrupt clear register + +//***************************************************************************** +// +// The followng define the bit fields in the I2C master slave address register. +// +//***************************************************************************** +#define I2C_MASTER_SA_SA_MASK 0x000000FE // Slave address +#define I2C_MASTER_SA_RS 0x00000001 // Receive/send +#define I2C_MASTER_SA_SA_SHIFT 1 + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Control and Status +// register. +// +//***************************************************************************** +#define I2C_MASTER_CS_ACK 0x00000008 // Acknowlegde +#define I2C_MASTER_CS_STOP 0x00000004 // Stop +#define I2C_MASTER_CS_START 0x00000002 // Start +#define I2C_MASTER_CS_RUN 0x00000001 // Run +#define I2C_MASTER_CS_BUS_BUSY 0x00000040 // Bus busy +#define I2C_MASTER_CS_IDLE 0x00000020 // Idle +#define I2C_MASTER_CS_ARB_LOST 0x00000010 // Lost arbitration +#define I2C_MASTER_CS_DATA_ACK 0x00000008 // Data byte not acknowledged +#define I2C_MASTER_CS_ADDR_ACK 0x00000004 // Address byte not acknowledged +#define I2C_MASTER_CS_ERROR 0x00000002 // Error occurred +#define I2C_MASTER_CS_BUSY 0x00000001 // Controller is TX/RX data +#define I2C_MASTER_CS_ERR_MASK 0x0000001C + +//***************************************************************************** +// +// The following define values used in determining the contents of the I2C +// Master Timer Period register. +// +//***************************************************************************** +#define I2C_MASTER_TPR_SCL_HP 0x00000004 // SCL high period +#define I2C_MASTER_TPR_SCL_LP 0x00000006 // SCL low period +#define I2C_MASTER_TPR_SCL (I2C_MASTER_TPR_SCL_HP + I2C_MASTER_TPR_SCL_LP) +#define I2C_SCL_STANDARD 100000 // SCL standard frequency +#define I2C_SCL_FAST 400000 // SCL fast frequency + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Interrupt Mask +// register. +// +//***************************************************************************** +#define I2C_MASTER_IMR_IM 0x00000001 // Master interrupt mask + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Raw Interrupt Status +// register. +// +//***************************************************************************** +#define I2C_MASTER_RIS_RIS 0x00000001 // Master raw interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Masked Interrupt +// Status register. +// +//***************************************************************************** +#define I2C_MASTER_MIS_MIS 0x00000001 // Master masked interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Interrupt Clear +// register. +// +//***************************************************************************** +#define I2C_MASTER_MICR_IC 0x00000001 // Master interrupt clear + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Configuration +// register. +// +//***************************************************************************** +#define I2C_MASTER_CR_SFE 0x00000020 // Slave function enable +#define I2C_MASTER_CR_MFE 0x00000010 // Master function enable +#define I2C_MASTER_CR_LPBK 0x00000001 // Loopback enable + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Own Address register. +// +//***************************************************************************** +#define I2C_SLAVE_SOAR_OAR_MASK 0x0000007F // Slave address + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Control/Status +// register. +// +//***************************************************************************** +#define I2C_SLAVE_CSR_DA 0x00000001 // Enable the device +#define I2C_SLAVE_CSR_TREQ 0x00000002 // Transmit request received +#define I2C_SLAVE_CSR_RREQ 0x00000001 // Receive data from I2C master + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Interrupt Mask +// register. +// +//***************************************************************************** +#define I2C_SLAVE_IMR_IM 0x00000001 // Slave interrupt mask + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Raw Interrupt Status +// register. +// +//***************************************************************************** +#define I2C_SLAVE_RIS_RIS 0x00000001 // Slave raw interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Masked Interrupt +// Status register. +// +//***************************************************************************** +#define I2C_SLAVE_MIS_MIS 0x00000001 // Slave masked interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Interrupt Clear +// register. +// +//***************************************************************************** +#define I2C_SLAVE_SICR_IC 0x00000001 // Slave interrupt clear + +#endif // __HW_I2C_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_ints.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_ints.h new file mode 100644 index 000000000..d2df4ee5b --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_ints.h @@ -0,0 +1,113 @@ +//***************************************************************************** +// +// hw_ints.h - Macros that define the interrupt assignment on Stellaris. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_INTS_H__ +#define __HW_INTS_H__ + +//***************************************************************************** +// +// The following define the fault assignments. +// +//***************************************************************************** +#define FAULT_NMI 2 // NMI fault +#define FAULT_HARD 3 // Hard fault +#define FAULT_MPU 4 // MPU fault +#define FAULT_BUS 5 // Bus fault +#define FAULT_USAGE 6 // Usage fault +#define FAULT_SVCALL 11 // SVCall +#define FAULT_DEBUG 12 // Debug monitor +#define FAULT_PENDSV 14 // PendSV +#define FAULT_SYSTICK 15 // System Tick + +//***************************************************************************** +// +// The following define the interrupt assignments. +// +//***************************************************************************** +#define INT_GPIOA 16 // GPIO Port A +#define INT_GPIOB 17 // GPIO Port B +#define INT_GPIOC 18 // GPIO Port C +#define INT_GPIOD 19 // GPIO Port D +#define INT_GPIOE 20 // GPIO Port E +#define INT_UART0 21 // UART0 Rx and Tx +#define INT_UART1 22 // UART1 Rx and Tx +#define INT_SSI 23 // SSI Rx and Tx +#define INT_SSI0 23 // SSI0 Rx and Tx +#define INT_I2C 24 // I2C Master and Slave +#define INT_I2C0 24 // I2C0 Master and Slave +#define INT_PWM_FAULT 25 // PWM Fault +#define INT_PWM0 26 // PWM Generator 0 +#define INT_PWM1 27 // PWM Generator 1 +#define INT_PWM2 28 // PWM Generator 2 +#define INT_QEI 29 // Quadrature Encoder +#define INT_QEI0 29 // Quadrature Encoder 0 +#define INT_ADC0 30 // ADC Sequence 0 +#define INT_ADC1 31 // ADC Sequence 1 +#define INT_ADC2 32 // ADC Sequence 2 +#define INT_ADC3 33 // ADC Sequence 3 +#define INT_WATCHDOG 34 // Watchdog timer +#define INT_TIMER0A 35 // Timer 0 subtimer A +#define INT_TIMER0B 36 // Timer 0 subtimer B +#define INT_TIMER1A 37 // Timer 1 subtimer A +#define INT_TIMER1B 38 // Timer 1 subtimer B +#define INT_TIMER2A 39 // Timer 2 subtimer A +#define INT_TIMER2B 40 // Timer 2 subtimer B +#define INT_COMP0 41 // Analog Comparator 0 +#define INT_COMP1 42 // Analog Comparator 1 +#define INT_COMP2 43 // Analog Comparator 2 +#define INT_SYSCTL 44 // System Control (PLL, OSC, BO) +#define INT_FLASH 45 // FLASH Control +#define INT_GPIOF 46 // GPIO Port F +#define INT_GPIOG 47 // GPIO Port G +#define INT_GPIOH 48 // GPIO Port H +#define INT_UART2 49 // UART2 Rx and Tx +#define INT_SSI1 50 // SSI1 Rx and Tx +#define INT_TIMER3A 51 // Timer 3 subtimer A +#define INT_TIMER3B 52 // Timer 3 subtimer B +#define INT_I2C1 53 // I2C1 Master and Slave +#define INT_QEI1 54 // Quadrature Encoder 1 +#define INT_CAN0 55 // CAN0 +#define INT_CAN1 56 // CAN1 +#define INT_ETH 58 // Ethernet +#define INT_HIBERNATE 59 // Hibernation module + +//***************************************************************************** +// +// The total number of interrupts. +// +//***************************************************************************** +#define NUM_INTERRUPTS 60 + +//***************************************************************************** +// +// The total number of priority levels. +// +//***************************************************************************** +#define NUM_PRIORITY 8 +#define NUM_PRIORITY_BITS 3 + +#endif // __HW_INTS_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_memmap.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_memmap.h new file mode 100644 index 000000000..8ae2a06cd --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_memmap.h @@ -0,0 +1,80 @@ +//***************************************************************************** +// +// hw_memmap.h - Macros defining the memory map of Stellaris. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_MEMMAP_H__ +#define __HW_MEMMAP_H__ + +//***************************************************************************** +// +// The following define the base address of the memories and peripherals. +// +//***************************************************************************** +#define FLASH_BASE 0x00000000 // FLASH memory +#define SRAM_BASE 0x20000000 // SRAM memory +#define WATCHDOG_BASE 0x40000000 // Watchdog +#define GPIO_PORTA_BASE 0x40004000 // GPIO Port A +#define GPIO_PORTB_BASE 0x40005000 // GPIO Port B +#define GPIO_PORTC_BASE 0x40006000 // GPIO Port C +#define GPIO_PORTD_BASE 0x40007000 // GPIO Port D +#define SSI_BASE 0x40008000 // SSI +#define SSI0_BASE 0x40008000 // SSI0 +#define SSI1_BASE 0x40009000 // SSI1 +#define UART0_BASE 0x4000C000 // UART0 +#define UART1_BASE 0x4000D000 // UART1 +#define UART2_BASE 0x4000E000 // UART2 +#define I2C_MASTER_BASE 0x40020000 // I2C Master +#define I2C_SLAVE_BASE 0x40020800 // I2C Slave +#define I2C0_MASTER_BASE 0x40020000 // I2C0 Master +#define I2C0_SLAVE_BASE 0x40020800 // I2C0 Slave +#define I2C1_MASTER_BASE 0x40021000 // I2C1 Master +#define I2C1_SLAVE_BASE 0x40021800 // I2C1 Slave +#define GPIO_PORTE_BASE 0x40024000 // GPIO Port E +#define GPIO_PORTF_BASE 0x40025000 // GPIO Port F +#define GPIO_PORTG_BASE 0x40026000 // GPIO Port G +#define GPIO_PORTH_BASE 0x40027000 // GPIO Port H +#define PWM_BASE 0x40028000 // PWM +#define QEI_BASE 0x4002C000 // QEI +#define QEI0_BASE 0x4002C000 // QEI0 +#define QEI1_BASE 0x4002D000 // QEI1 +#define TIMER0_BASE 0x40030000 // Timer0 +#define TIMER1_BASE 0x40031000 // Timer1 +#define TIMER2_BASE 0x40032000 // Timer2 +#define TIMER3_BASE 0x40033000 // Timer3 +#define ADC_BASE 0x40038000 // ADC +#define COMP_BASE 0x4003C000 // Analog comparators +#define CAN0_BASE 0x40040000 // CAN0 +#define CAN1_BASE 0x40041000 // CAN1 +#define ETH_BASE 0x40048000 // Ethernet +#define FLASH_CTRL_BASE 0x400FD000 // FLASH Controller +#define SYSCTL_BASE 0x400FE000 // System Control +#define ITM_BASE 0xE0000000 // Instrumentation Trace Macrocell +#define DWT_BASE 0xE0001000 // Data Watchpoint and Trace +#define FPB_BASE 0xE0002000 // FLASH Patch and Breakpoint +#define NVIC_BASE 0xE000E000 // Nested Vectored Interrupt Ctrl +#define TPIU_BASE 0xE0040000 // Trace Port Interface Unit + +#endif // __HW_MEMMAP_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_nvic.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_nvic.h new file mode 100644 index 000000000..68c8d7c7f --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_nvic.h @@ -0,0 +1,1050 @@ +//***************************************************************************** +// +// hw_nvic.h - Macros used when accessing the NVIC hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_NVIC_H__ +#define __HW_NVIC_H__ + +//***************************************************************************** +// +// The following define the addresses of the NVIC registers. +// +//***************************************************************************** +#define NVIC_INT_TYPE 0xE000E004 // Interrupt Controller Type Reg. +#define NVIC_ST_CTRL 0xE000E010 // SysTick Control and Status Reg. +#define NVIC_ST_RELOAD 0xE000E014 // SysTick Reload Value Register +#define NVIC_ST_CURRENT 0xE000E018 // SysTick Current Value Register +#define NVIC_ST_CAL 0xE000E01C // SysTick Calibration Value Reg. +#define NVIC_EN0 0xE000E100 // IRQ 0 to 31 Set Enable Register +#define NVIC_EN1 0xE000E104 // IRQ 32 to 63 Set Enable Register +#define NVIC_DIS0 0xE000E180 // IRQ 0 to 31 Clear Enable Reg. +#define NVIC_DIS1 0xE000E184 // IRQ 32 to 63 Clear Enable Reg. +#define NVIC_PEND0 0xE000E200 // IRQ 0 to 31 Set Pending Register +#define NVIC_PEND1 0xE000E204 // IRQ 32 to 63 Set Pending Reg. +#define NVIC_UNPEND0 0xE000E280 // IRQ 0 to 31 Clear Pending Reg. +#define NVIC_UNPEND1 0xE000E284 // IRQ 32 to 63 Clear Pending Reg. +#define NVIC_ACTIVE0 0xE000E300 // IRQ 0 to 31 Active Register +#define NVIC_ACTIVE1 0xE000E304 // IRQ 32 to 63 Active Register +#define NVIC_PRI0 0xE000E400 // IRQ 0 to 3 Priority Register +#define NVIC_PRI1 0xE000E404 // IRQ 4 to 7 Priority Register +#define NVIC_PRI2 0xE000E408 // IRQ 8 to 11 Priority Register +#define NVIC_PRI3 0xE000E40C // IRQ 12 to 15 Priority Register +#define NVIC_PRI4 0xE000E410 // IRQ 16 to 19 Priority Register +#define NVIC_PRI5 0xE000E414 // IRQ 20 to 23 Priority Register +#define NVIC_PRI6 0xE000E418 // IRQ 24 to 27 Priority Register +#define NVIC_PRI7 0xE000E41C // IRQ 28 to 31 Priority Register +#define NVIC_PRI8 0xE000E420 // IRQ 32 to 35 Priority Register +#define NVIC_PRI9 0xE000E424 // IRQ 36 to 39 Priority Register +#define NVIC_PRI10 0xE000E428 // IRQ 40 to 43 Priority Register +#define NVIC_CPUID 0xE000ED00 // CPUID Base Register +#define NVIC_INT_CTRL 0xE000ED04 // Interrupt Control State Register +#define NVIC_VTABLE 0xE000ED08 // Vector Table Offset Register +#define NVIC_APINT 0xE000ED0C // App. Int & Reset Control Reg. +#define NVIC_SYS_CTRL 0xE000ED10 // System Control Register +#define NVIC_CFG_CTRL 0xE000ED14 // Configuration Control Register +#define NVIC_SYS_PRI1 0xE000ED18 // Sys. Handlers 4 to 7 Priority +#define NVIC_SYS_PRI2 0xE000ED1C // Sys. Handlers 8 to 11 Priority +#define NVIC_SYS_PRI3 0xE000ED20 // Sys. Handlers 12 to 15 Priority +#define NVIC_SYS_HND_CTRL 0xE000ED24 // System Handler Control and State +#define NVIC_FAULT_STAT 0xE000ED28 // Configurable Fault Status Reg. +#define NVIC_HFAULT_STAT 0xE000ED2C // Hard Fault Status Register +#define NVIC_DEBUG_STAT 0xE000ED30 // Debug Status Register +#define NVIC_MM_ADDR 0xE000ED34 // Mem Manage Address Register +#define NVIC_FAULT_ADDR 0xE000ED38 // Bus Fault Address Register +#define NVIC_MPU_TYPE 0xE000ED90 // MPU Type Register +#define NVIC_MPU_CTRL 0xE000ED94 // MPU Control Register +#define NVIC_MPU_NUMBER 0xE000ED98 // MPU Region Number Register +#define NVIC_MPU_BASE 0xE000ED9C // MPU Region Base Address Register +#define NVIC_MPU_ATTR 0xE000EDA0 // MPU Region Attribute & Size Reg. +#define NVIC_DBG_CTRL 0xE000EDF0 // Debug Control and Status Reg. +#define NVIC_DBG_XFER 0xE000EDF4 // Debug Core Reg. Transfer Select +#define NVIC_DBG_DATA 0xE000EDF8 // Debug Core Register Data +#define NVIC_DBG_INT 0xE000EDFC // Debug Reset Interrupt Control +#define NVIC_SW_TRIG 0xE000EF00 // Software Trigger Interrupt Reg. + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_INT_TYPE register. +// +//***************************************************************************** +#define NVIC_INT_TYPE_LINES_M 0x0000001F // Number of interrupt lines (x32) +#define NVIC_INT_TYPE_LINES_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CTRL register. +// +//***************************************************************************** +#define NVIC_ST_CTRL_COUNT 0x00010000 // Count flag +#define NVIC_ST_CTRL_CLK_SRC 0x00000004 // Clock Source +#define NVIC_ST_CTRL_INTEN 0x00000002 // Interrupt enable +#define NVIC_ST_CTRL_ENABLE 0x00000001 // Counter mode + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_RELOAD register. +// +//***************************************************************************** +#define NVIC_ST_RELOAD_M 0x00FFFFFF // Counter load value +#define NVIC_ST_RELOAD_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CURRENT register. +// +//***************************************************************************** +#define NVIC_ST_CURRENT_M 0x00FFFFFF // Counter current value +#define NVIC_ST_CURRENT_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CAL register. +// +//***************************************************************************** +#define NVIC_ST_CAL_NOREF 0x80000000 // No reference clock +#define NVIC_ST_CAL_SKEW 0x40000000 // Clock skew +#define NVIC_ST_CAL_ONEMS_M 0x00FFFFFF // 1ms reference value +#define NVIC_ST_CAL_ONEMS_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EN0 register. +// +//***************************************************************************** +#define NVIC_EN0_INT31 0x80000000 // Interrupt 31 enable +#define NVIC_EN0_INT30 0x40000000 // Interrupt 30 enable +#define NVIC_EN0_INT29 0x20000000 // Interrupt 29 enable +#define NVIC_EN0_INT28 0x10000000 // Interrupt 28 enable +#define NVIC_EN0_INT27 0x08000000 // Interrupt 27 enable +#define NVIC_EN0_INT26 0x04000000 // Interrupt 26 enable +#define NVIC_EN0_INT25 0x02000000 // Interrupt 25 enable +#define NVIC_EN0_INT24 0x01000000 // Interrupt 24 enable +#define NVIC_EN0_INT23 0x00800000 // Interrupt 23 enable +#define NVIC_EN0_INT22 0x00400000 // Interrupt 22 enable +#define NVIC_EN0_INT21 0x00200000 // Interrupt 21 enable +#define NVIC_EN0_INT20 0x00100000 // Interrupt 20 enable +#define NVIC_EN0_INT19 0x00080000 // Interrupt 19 enable +#define NVIC_EN0_INT18 0x00040000 // Interrupt 18 enable +#define NVIC_EN0_INT17 0x00020000 // Interrupt 17 enable +#define NVIC_EN0_INT16 0x00010000 // Interrupt 16 enable +#define NVIC_EN0_INT15 0x00008000 // Interrupt 15 enable +#define NVIC_EN0_INT14 0x00004000 // Interrupt 14 enable +#define NVIC_EN0_INT13 0x00002000 // Interrupt 13 enable +#define NVIC_EN0_INT12 0x00001000 // Interrupt 12 enable +#define NVIC_EN0_INT11 0x00000800 // Interrupt 11 enable +#define NVIC_EN0_INT10 0x00000400 // Interrupt 10 enable +#define NVIC_EN0_INT9 0x00000200 // Interrupt 9 enable +#define NVIC_EN0_INT8 0x00000100 // Interrupt 8 enable +#define NVIC_EN0_INT7 0x00000080 // Interrupt 7 enable +#define NVIC_EN0_INT6 0x00000040 // Interrupt 6 enable +#define NVIC_EN0_INT5 0x00000020 // Interrupt 5 enable +#define NVIC_EN0_INT4 0x00000010 // Interrupt 4 enable +#define NVIC_EN0_INT3 0x00000008 // Interrupt 3 enable +#define NVIC_EN0_INT2 0x00000004 // Interrupt 2 enable +#define NVIC_EN0_INT1 0x00000002 // Interrupt 1 enable +#define NVIC_EN0_INT0 0x00000001 // Interrupt 0 enable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EN1 register. +// +//***************************************************************************** +#define NVIC_EN1_INT59 0x08000000 // Interrupt 59 enable +#define NVIC_EN1_INT58 0x04000000 // Interrupt 58 enable +#define NVIC_EN1_INT57 0x02000000 // Interrupt 57 enable +#define NVIC_EN1_INT56 0x01000000 // Interrupt 56 enable +#define NVIC_EN1_INT55 0x00800000 // Interrupt 55 enable +#define NVIC_EN1_INT54 0x00400000 // Interrupt 54 enable +#define NVIC_EN1_INT53 0x00200000 // Interrupt 53 enable +#define NVIC_EN1_INT52 0x00100000 // Interrupt 52 enable +#define NVIC_EN1_INT51 0x00080000 // Interrupt 51 enable +#define NVIC_EN1_INT50 0x00040000 // Interrupt 50 enable +#define NVIC_EN1_INT49 0x00020000 // Interrupt 49 enable +#define NVIC_EN1_INT48 0x00010000 // Interrupt 48 enable +#define NVIC_EN1_INT47 0x00008000 // Interrupt 47 enable +#define NVIC_EN1_INT46 0x00004000 // Interrupt 46 enable +#define NVIC_EN1_INT45 0x00002000 // Interrupt 45 enable +#define NVIC_EN1_INT44 0x00001000 // Interrupt 44 enable +#define NVIC_EN1_INT43 0x00000800 // Interrupt 43 enable +#define NVIC_EN1_INT42 0x00000400 // Interrupt 42 enable +#define NVIC_EN1_INT41 0x00000200 // Interrupt 41 enable +#define NVIC_EN1_INT40 0x00000100 // Interrupt 40 enable +#define NVIC_EN1_INT39 0x00000080 // Interrupt 39 enable +#define NVIC_EN1_INT38 0x00000040 // Interrupt 38 enable +#define NVIC_EN1_INT37 0x00000020 // Interrupt 37 enable +#define NVIC_EN1_INT36 0x00000010 // Interrupt 36 enable +#define NVIC_EN1_INT35 0x00000008 // Interrupt 35 enable +#define NVIC_EN1_INT34 0x00000004 // Interrupt 34 enable +#define NVIC_EN1_INT33 0x00000002 // Interrupt 33 enable +#define NVIC_EN1_INT32 0x00000001 // Interrupt 32 enable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DIS0 register. +// +//***************************************************************************** +#define NVIC_DIS0_INT31 0x80000000 // Interrupt 31 disable +#define NVIC_DIS0_INT30 0x40000000 // Interrupt 30 disable +#define NVIC_DIS0_INT29 0x20000000 // Interrupt 29 disable +#define NVIC_DIS0_INT28 0x10000000 // Interrupt 28 disable +#define NVIC_DIS0_INT27 0x08000000 // Interrupt 27 disable +#define NVIC_DIS0_INT26 0x04000000 // Interrupt 26 disable +#define NVIC_DIS0_INT25 0x02000000 // Interrupt 25 disable +#define NVIC_DIS0_INT24 0x01000000 // Interrupt 24 disable +#define NVIC_DIS0_INT23 0x00800000 // Interrupt 23 disable +#define NVIC_DIS0_INT22 0x00400000 // Interrupt 22 disable +#define NVIC_DIS0_INT21 0x00200000 // Interrupt 21 disable +#define NVIC_DIS0_INT20 0x00100000 // Interrupt 20 disable +#define NVIC_DIS0_INT19 0x00080000 // Interrupt 19 disable +#define NVIC_DIS0_INT18 0x00040000 // Interrupt 18 disable +#define NVIC_DIS0_INT17 0x00020000 // Interrupt 17 disable +#define NVIC_DIS0_INT16 0x00010000 // Interrupt 16 disable +#define NVIC_DIS0_INT15 0x00008000 // Interrupt 15 disable +#define NVIC_DIS0_INT14 0x00004000 // Interrupt 14 disable +#define NVIC_DIS0_INT13 0x00002000 // Interrupt 13 disable +#define NVIC_DIS0_INT12 0x00001000 // Interrupt 12 disable +#define NVIC_DIS0_INT11 0x00000800 // Interrupt 11 disable +#define NVIC_DIS0_INT10 0x00000400 // Interrupt 10 disable +#define NVIC_DIS0_INT9 0x00000200 // Interrupt 9 disable +#define NVIC_DIS0_INT8 0x00000100 // Interrupt 8 disable +#define NVIC_DIS0_INT7 0x00000080 // Interrupt 7 disable +#define NVIC_DIS0_INT6 0x00000040 // Interrupt 6 disable +#define NVIC_DIS0_INT5 0x00000020 // Interrupt 5 disable +#define NVIC_DIS0_INT4 0x00000010 // Interrupt 4 disable +#define NVIC_DIS0_INT3 0x00000008 // Interrupt 3 disable +#define NVIC_DIS0_INT2 0x00000004 // Interrupt 2 disable +#define NVIC_DIS0_INT1 0x00000002 // Interrupt 1 disable +#define NVIC_DIS0_INT0 0x00000001 // Interrupt 0 disable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DIS1 register. +// +//***************************************************************************** +#define NVIC_DIS1_INT59 0x08000000 // Interrupt 59 disable +#define NVIC_DIS1_INT58 0x04000000 // Interrupt 58 disable +#define NVIC_DIS1_INT57 0x02000000 // Interrupt 57 disable +#define NVIC_DIS1_INT56 0x01000000 // Interrupt 56 disable +#define NVIC_DIS1_INT55 0x00800000 // Interrupt 55 disable +#define NVIC_DIS1_INT54 0x00400000 // Interrupt 54 disable +#define NVIC_DIS1_INT53 0x00200000 // Interrupt 53 disable +#define NVIC_DIS1_INT52 0x00100000 // Interrupt 52 disable +#define NVIC_DIS1_INT51 0x00080000 // Interrupt 51 disable +#define NVIC_DIS1_INT50 0x00040000 // Interrupt 50 disable +#define NVIC_DIS1_INT49 0x00020000 // Interrupt 49 disable +#define NVIC_DIS1_INT48 0x00010000 // Interrupt 48 disable +#define NVIC_DIS1_INT47 0x00008000 // Interrupt 47 disable +#define NVIC_DIS1_INT46 0x00004000 // Interrupt 46 disable +#define NVIC_DIS1_INT45 0x00002000 // Interrupt 45 disable +#define NVIC_DIS1_INT44 0x00001000 // Interrupt 44 disable +#define NVIC_DIS1_INT43 0x00000800 // Interrupt 43 disable +#define NVIC_DIS1_INT42 0x00000400 // Interrupt 42 disable +#define NVIC_DIS1_INT41 0x00000200 // Interrupt 41 disable +#define NVIC_DIS1_INT40 0x00000100 // Interrupt 40 disable +#define NVIC_DIS1_INT39 0x00000080 // Interrupt 39 disable +#define NVIC_DIS1_INT38 0x00000040 // Interrupt 38 disable +#define NVIC_DIS1_INT37 0x00000020 // Interrupt 37 disable +#define NVIC_DIS1_INT36 0x00000010 // Interrupt 36 disable +#define NVIC_DIS1_INT35 0x00000008 // Interrupt 35 disable +#define NVIC_DIS1_INT34 0x00000004 // Interrupt 34 disable +#define NVIC_DIS1_INT33 0x00000002 // Interrupt 33 disable +#define NVIC_DIS1_INT32 0x00000001 // Interrupt 32 disable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PEND0 register. +// +//***************************************************************************** +#define NVIC_PEND0_INT31 0x80000000 // Interrupt 31 pend +#define NVIC_PEND0_INT30 0x40000000 // Interrupt 30 pend +#define NVIC_PEND0_INT29 0x20000000 // Interrupt 29 pend +#define NVIC_PEND0_INT28 0x10000000 // Interrupt 28 pend +#define NVIC_PEND0_INT27 0x08000000 // Interrupt 27 pend +#define NVIC_PEND0_INT26 0x04000000 // Interrupt 26 pend +#define NVIC_PEND0_INT25 0x02000000 // Interrupt 25 pend +#define NVIC_PEND0_INT24 0x01000000 // Interrupt 24 pend +#define NVIC_PEND0_INT23 0x00800000 // Interrupt 23 pend +#define NVIC_PEND0_INT22 0x00400000 // Interrupt 22 pend +#define NVIC_PEND0_INT21 0x00200000 // Interrupt 21 pend +#define NVIC_PEND0_INT20 0x00100000 // Interrupt 20 pend +#define NVIC_PEND0_INT19 0x00080000 // Interrupt 19 pend +#define NVIC_PEND0_INT18 0x00040000 // Interrupt 18 pend +#define NVIC_PEND0_INT17 0x00020000 // Interrupt 17 pend +#define NVIC_PEND0_INT16 0x00010000 // Interrupt 16 pend +#define NVIC_PEND0_INT15 0x00008000 // Interrupt 15 pend +#define NVIC_PEND0_INT14 0x00004000 // Interrupt 14 pend +#define NVIC_PEND0_INT13 0x00002000 // Interrupt 13 pend +#define NVIC_PEND0_INT12 0x00001000 // Interrupt 12 pend +#define NVIC_PEND0_INT11 0x00000800 // Interrupt 11 pend +#define NVIC_PEND0_INT10 0x00000400 // Interrupt 10 pend +#define NVIC_PEND0_INT9 0x00000200 // Interrupt 9 pend +#define NVIC_PEND0_INT8 0x00000100 // Interrupt 8 pend +#define NVIC_PEND0_INT7 0x00000080 // Interrupt 7 pend +#define NVIC_PEND0_INT6 0x00000040 // Interrupt 6 pend +#define NVIC_PEND0_INT5 0x00000020 // Interrupt 5 pend +#define NVIC_PEND0_INT4 0x00000010 // Interrupt 4 pend +#define NVIC_PEND0_INT3 0x00000008 // Interrupt 3 pend +#define NVIC_PEND0_INT2 0x00000004 // Interrupt 2 pend +#define NVIC_PEND0_INT1 0x00000002 // Interrupt 1 pend +#define NVIC_PEND0_INT0 0x00000001 // Interrupt 0 pend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PEND1 register. +// +//***************************************************************************** +#define NVIC_PEND1_INT59 0x08000000 // Interrupt 59 pend +#define NVIC_PEND1_INT58 0x04000000 // Interrupt 58 pend +#define NVIC_PEND1_INT57 0x02000000 // Interrupt 57 pend +#define NVIC_PEND1_INT56 0x01000000 // Interrupt 56 pend +#define NVIC_PEND1_INT55 0x00800000 // Interrupt 55 pend +#define NVIC_PEND1_INT54 0x00400000 // Interrupt 54 pend +#define NVIC_PEND1_INT53 0x00200000 // Interrupt 53 pend +#define NVIC_PEND1_INT52 0x00100000 // Interrupt 52 pend +#define NVIC_PEND1_INT51 0x00080000 // Interrupt 51 pend +#define NVIC_PEND1_INT50 0x00040000 // Interrupt 50 pend +#define NVIC_PEND1_INT49 0x00020000 // Interrupt 49 pend +#define NVIC_PEND1_INT48 0x00010000 // Interrupt 48 pend +#define NVIC_PEND1_INT47 0x00008000 // Interrupt 47 pend +#define NVIC_PEND1_INT46 0x00004000 // Interrupt 46 pend +#define NVIC_PEND1_INT45 0x00002000 // Interrupt 45 pend +#define NVIC_PEND1_INT44 0x00001000 // Interrupt 44 pend +#define NVIC_PEND1_INT43 0x00000800 // Interrupt 43 pend +#define NVIC_PEND1_INT42 0x00000400 // Interrupt 42 pend +#define NVIC_PEND1_INT41 0x00000200 // Interrupt 41 pend +#define NVIC_PEND1_INT40 0x00000100 // Interrupt 40 pend +#define NVIC_PEND1_INT39 0x00000080 // Interrupt 39 pend +#define NVIC_PEND1_INT38 0x00000040 // Interrupt 38 pend +#define NVIC_PEND1_INT37 0x00000020 // Interrupt 37 pend +#define NVIC_PEND1_INT36 0x00000010 // Interrupt 36 pend +#define NVIC_PEND1_INT35 0x00000008 // Interrupt 35 pend +#define NVIC_PEND1_INT34 0x00000004 // Interrupt 34 pend +#define NVIC_PEND1_INT33 0x00000002 // Interrupt 33 pend +#define NVIC_PEND1_INT32 0x00000001 // Interrupt 32 pend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_UNPEND0 register. +// +//***************************************************************************** +#define NVIC_UNPEND0_INT31 0x80000000 // Interrupt 31 unpend +#define NVIC_UNPEND0_INT30 0x40000000 // Interrupt 30 unpend +#define NVIC_UNPEND0_INT29 0x20000000 // Interrupt 29 unpend +#define NVIC_UNPEND0_INT28 0x10000000 // Interrupt 28 unpend +#define NVIC_UNPEND0_INT27 0x08000000 // Interrupt 27 unpend +#define NVIC_UNPEND0_INT26 0x04000000 // Interrupt 26 unpend +#define NVIC_UNPEND0_INT25 0x02000000 // Interrupt 25 unpend +#define NVIC_UNPEND0_INT24 0x01000000 // Interrupt 24 unpend +#define NVIC_UNPEND0_INT23 0x00800000 // Interrupt 23 unpend +#define NVIC_UNPEND0_INT22 0x00400000 // Interrupt 22 unpend +#define NVIC_UNPEND0_INT21 0x00200000 // Interrupt 21 unpend +#define NVIC_UNPEND0_INT20 0x00100000 // Interrupt 20 unpend +#define NVIC_UNPEND0_INT19 0x00080000 // Interrupt 19 unpend +#define NVIC_UNPEND0_INT18 0x00040000 // Interrupt 18 unpend +#define NVIC_UNPEND0_INT17 0x00020000 // Interrupt 17 unpend +#define NVIC_UNPEND0_INT16 0x00010000 // Interrupt 16 unpend +#define NVIC_UNPEND0_INT15 0x00008000 // Interrupt 15 unpend +#define NVIC_UNPEND0_INT14 0x00004000 // Interrupt 14 unpend +#define NVIC_UNPEND0_INT13 0x00002000 // Interrupt 13 unpend +#define NVIC_UNPEND0_INT12 0x00001000 // Interrupt 12 unpend +#define NVIC_UNPEND0_INT11 0x00000800 // Interrupt 11 unpend +#define NVIC_UNPEND0_INT10 0x00000400 // Interrupt 10 unpend +#define NVIC_UNPEND0_INT9 0x00000200 // Interrupt 9 unpend +#define NVIC_UNPEND0_INT8 0x00000100 // Interrupt 8 unpend +#define NVIC_UNPEND0_INT7 0x00000080 // Interrupt 7 unpend +#define NVIC_UNPEND0_INT6 0x00000040 // Interrupt 6 unpend +#define NVIC_UNPEND0_INT5 0x00000020 // Interrupt 5 unpend +#define NVIC_UNPEND0_INT4 0x00000010 // Interrupt 4 unpend +#define NVIC_UNPEND0_INT3 0x00000008 // Interrupt 3 unpend +#define NVIC_UNPEND0_INT2 0x00000004 // Interrupt 2 unpend +#define NVIC_UNPEND0_INT1 0x00000002 // Interrupt 1 unpend +#define NVIC_UNPEND0_INT0 0x00000001 // Interrupt 0 unpend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_UNPEND1 register. +// +//***************************************************************************** +#define NVIC_UNPEND1_INT59 0x08000000 // Interrupt 59 unpend +#define NVIC_UNPEND1_INT58 0x04000000 // Interrupt 58 unpend +#define NVIC_UNPEND1_INT57 0x02000000 // Interrupt 57 unpend +#define NVIC_UNPEND1_INT56 0x01000000 // Interrupt 56 unpend +#define NVIC_UNPEND1_INT55 0x00800000 // Interrupt 55 unpend +#define NVIC_UNPEND1_INT54 0x00400000 // Interrupt 54 unpend +#define NVIC_UNPEND1_INT53 0x00200000 // Interrupt 53 unpend +#define NVIC_UNPEND1_INT52 0x00100000 // Interrupt 52 unpend +#define NVIC_UNPEND1_INT51 0x00080000 // Interrupt 51 unpend +#define NVIC_UNPEND1_INT50 0x00040000 // Interrupt 50 unpend +#define NVIC_UNPEND1_INT49 0x00020000 // Interrupt 49 unpend +#define NVIC_UNPEND1_INT48 0x00010000 // Interrupt 48 unpend +#define NVIC_UNPEND1_INT47 0x00008000 // Interrupt 47 unpend +#define NVIC_UNPEND1_INT46 0x00004000 // Interrupt 46 unpend +#define NVIC_UNPEND1_INT45 0x00002000 // Interrupt 45 unpend +#define NVIC_UNPEND1_INT44 0x00001000 // Interrupt 44 unpend +#define NVIC_UNPEND1_INT43 0x00000800 // Interrupt 43 unpend +#define NVIC_UNPEND1_INT42 0x00000400 // Interrupt 42 unpend +#define NVIC_UNPEND1_INT41 0x00000200 // Interrupt 41 unpend +#define NVIC_UNPEND1_INT40 0x00000100 // Interrupt 40 unpend +#define NVIC_UNPEND1_INT39 0x00000080 // Interrupt 39 unpend +#define NVIC_UNPEND1_INT38 0x00000040 // Interrupt 38 unpend +#define NVIC_UNPEND1_INT37 0x00000020 // Interrupt 37 unpend +#define NVIC_UNPEND1_INT36 0x00000010 // Interrupt 36 unpend +#define NVIC_UNPEND1_INT35 0x00000008 // Interrupt 35 unpend +#define NVIC_UNPEND1_INT34 0x00000004 // Interrupt 34 unpend +#define NVIC_UNPEND1_INT33 0x00000002 // Interrupt 33 unpend +#define NVIC_UNPEND1_INT32 0x00000001 // Interrupt 32 unpend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ACTIVE0 register. +// +//***************************************************************************** +#define NVIC_ACTIVE0_INT31 0x80000000 // Interrupt 31 active +#define NVIC_ACTIVE0_INT30 0x40000000 // Interrupt 30 active +#define NVIC_ACTIVE0_INT29 0x20000000 // Interrupt 29 active +#define NVIC_ACTIVE0_INT28 0x10000000 // Interrupt 28 active +#define NVIC_ACTIVE0_INT27 0x08000000 // Interrupt 27 active +#define NVIC_ACTIVE0_INT26 0x04000000 // Interrupt 26 active +#define NVIC_ACTIVE0_INT25 0x02000000 // Interrupt 25 active +#define NVIC_ACTIVE0_INT24 0x01000000 // Interrupt 24 active +#define NVIC_ACTIVE0_INT23 0x00800000 // Interrupt 23 active +#define NVIC_ACTIVE0_INT22 0x00400000 // Interrupt 22 active +#define NVIC_ACTIVE0_INT21 0x00200000 // Interrupt 21 active +#define NVIC_ACTIVE0_INT20 0x00100000 // Interrupt 20 active +#define NVIC_ACTIVE0_INT19 0x00080000 // Interrupt 19 active +#define NVIC_ACTIVE0_INT18 0x00040000 // Interrupt 18 active +#define NVIC_ACTIVE0_INT17 0x00020000 // Interrupt 17 active +#define NVIC_ACTIVE0_INT16 0x00010000 // Interrupt 16 active +#define NVIC_ACTIVE0_INT15 0x00008000 // Interrupt 15 active +#define NVIC_ACTIVE0_INT14 0x00004000 // Interrupt 14 active +#define NVIC_ACTIVE0_INT13 0x00002000 // Interrupt 13 active +#define NVIC_ACTIVE0_INT12 0x00001000 // Interrupt 12 active +#define NVIC_ACTIVE0_INT11 0x00000800 // Interrupt 11 active +#define NVIC_ACTIVE0_INT10 0x00000400 // Interrupt 10 active +#define NVIC_ACTIVE0_INT9 0x00000200 // Interrupt 9 active +#define NVIC_ACTIVE0_INT8 0x00000100 // Interrupt 8 active +#define NVIC_ACTIVE0_INT7 0x00000080 // Interrupt 7 active +#define NVIC_ACTIVE0_INT6 0x00000040 // Interrupt 6 active +#define NVIC_ACTIVE0_INT5 0x00000020 // Interrupt 5 active +#define NVIC_ACTIVE0_INT4 0x00000010 // Interrupt 4 active +#define NVIC_ACTIVE0_INT3 0x00000008 // Interrupt 3 active +#define NVIC_ACTIVE0_INT2 0x00000004 // Interrupt 2 active +#define NVIC_ACTIVE0_INT1 0x00000002 // Interrupt 1 active +#define NVIC_ACTIVE0_INT0 0x00000001 // Interrupt 0 active + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ACTIVE1 register. +// +//***************************************************************************** +#define NVIC_ACTIVE1_INT59 0x08000000 // Interrupt 59 active +#define NVIC_ACTIVE1_INT58 0x04000000 // Interrupt 58 active +#define NVIC_ACTIVE1_INT57 0x02000000 // Interrupt 57 active +#define NVIC_ACTIVE1_INT56 0x01000000 // Interrupt 56 active +#define NVIC_ACTIVE1_INT55 0x00800000 // Interrupt 55 active +#define NVIC_ACTIVE1_INT54 0x00400000 // Interrupt 54 active +#define NVIC_ACTIVE1_INT53 0x00200000 // Interrupt 53 active +#define NVIC_ACTIVE1_INT52 0x00100000 // Interrupt 52 active +#define NVIC_ACTIVE1_INT51 0x00080000 // Interrupt 51 active +#define NVIC_ACTIVE1_INT50 0x00040000 // Interrupt 50 active +#define NVIC_ACTIVE1_INT49 0x00020000 // Interrupt 49 active +#define NVIC_ACTIVE1_INT48 0x00010000 // Interrupt 48 active +#define NVIC_ACTIVE1_INT47 0x00008000 // Interrupt 47 active +#define NVIC_ACTIVE1_INT46 0x00004000 // Interrupt 46 active +#define NVIC_ACTIVE1_INT45 0x00002000 // Interrupt 45 active +#define NVIC_ACTIVE1_INT44 0x00001000 // Interrupt 44 active +#define NVIC_ACTIVE1_INT43 0x00000800 // Interrupt 43 active +#define NVIC_ACTIVE1_INT42 0x00000400 // Interrupt 42 active +#define NVIC_ACTIVE1_INT41 0x00000200 // Interrupt 41 active +#define NVIC_ACTIVE1_INT40 0x00000100 // Interrupt 40 active +#define NVIC_ACTIVE1_INT39 0x00000080 // Interrupt 39 active +#define NVIC_ACTIVE1_INT38 0x00000040 // Interrupt 38 active +#define NVIC_ACTIVE1_INT37 0x00000020 // Interrupt 37 active +#define NVIC_ACTIVE1_INT36 0x00000010 // Interrupt 36 active +#define NVIC_ACTIVE1_INT35 0x00000008 // Interrupt 35 active +#define NVIC_ACTIVE1_INT34 0x00000004 // Interrupt 34 active +#define NVIC_ACTIVE1_INT33 0x00000002 // Interrupt 33 active +#define NVIC_ACTIVE1_INT32 0x00000001 // Interrupt 32 active + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI0 register. +// +//***************************************************************************** +#define NVIC_PRI0_INT3_M 0xFF000000 // Interrupt 3 priority mask +#define NVIC_PRI0_INT2_M 0x00FF0000 // Interrupt 2 priority mask +#define NVIC_PRI0_INT1_M 0x0000FF00 // Interrupt 1 priority mask +#define NVIC_PRI0_INT0_M 0x000000FF // Interrupt 0 priority mask +#define NVIC_PRI0_INT3_S 24 +#define NVIC_PRI0_INT2_S 16 +#define NVIC_PRI0_INT1_S 8 +#define NVIC_PRI0_INT0_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI1 register. +// +//***************************************************************************** +#define NVIC_PRI1_INT7_M 0xFF000000 // Interrupt 7 priority mask +#define NVIC_PRI1_INT6_M 0x00FF0000 // Interrupt 6 priority mask +#define NVIC_PRI1_INT5_M 0x0000FF00 // Interrupt 5 priority mask +#define NVIC_PRI1_INT4_M 0x000000FF // Interrupt 4 priority mask +#define NVIC_PRI1_INT7_S 24 +#define NVIC_PRI1_INT6_S 16 +#define NVIC_PRI1_INT5_S 8 +#define NVIC_PRI1_INT4_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI2 register. +// +//***************************************************************************** +#define NVIC_PRI2_INT11_M 0xFF000000 // Interrupt 11 priority mask +#define NVIC_PRI2_INT10_M 0x00FF0000 // Interrupt 10 priority mask +#define NVIC_PRI2_INT9_M 0x0000FF00 // Interrupt 9 priority mask +#define NVIC_PRI2_INT8_M 0x000000FF // Interrupt 8 priority mask +#define NVIC_PRI2_INT11_S 24 +#define NVIC_PRI2_INT10_S 16 +#define NVIC_PRI2_INT9_S 8 +#define NVIC_PRI2_INT8_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI3 register. +// +//***************************************************************************** +#define NVIC_PRI3_INT15_M 0xFF000000 // Interrupt 15 priority mask +#define NVIC_PRI3_INT14_M 0x00FF0000 // Interrupt 14 priority mask +#define NVIC_PRI3_INT13_M 0x0000FF00 // Interrupt 13 priority mask +#define NVIC_PRI3_INT12_M 0x000000FF // Interrupt 12 priority mask +#define NVIC_PRI3_INT15_S 24 +#define NVIC_PRI3_INT14_S 16 +#define NVIC_PRI3_INT13_S 8 +#define NVIC_PRI3_INT12_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI4 register. +// +//***************************************************************************** +#define NVIC_PRI4_INT19_M 0xFF000000 // Interrupt 19 priority mask +#define NVIC_PRI4_INT18_M 0x00FF0000 // Interrupt 18 priority mask +#define NVIC_PRI4_INT17_M 0x0000FF00 // Interrupt 17 priority mask +#define NVIC_PRI4_INT16_M 0x000000FF // Interrupt 16 priority mask +#define NVIC_PRI4_INT19_S 24 +#define NVIC_PRI4_INT18_S 16 +#define NVIC_PRI4_INT17_S 8 +#define NVIC_PRI4_INT16_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI5 register. +// +//***************************************************************************** +#define NVIC_PRI5_INT23_M 0xFF000000 // Interrupt 23 priority mask +#define NVIC_PRI5_INT22_M 0x00FF0000 // Interrupt 22 priority mask +#define NVIC_PRI5_INT21_M 0x0000FF00 // Interrupt 21 priority mask +#define NVIC_PRI5_INT20_M 0x000000FF // Interrupt 20 priority mask +#define NVIC_PRI5_INT23_S 24 +#define NVIC_PRI5_INT22_S 16 +#define NVIC_PRI5_INT21_S 8 +#define NVIC_PRI5_INT20_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI6 register. +// +//***************************************************************************** +#define NVIC_PRI6_INT27_M 0xFF000000 // Interrupt 27 priority mask +#define NVIC_PRI6_INT26_M 0x00FF0000 // Interrupt 26 priority mask +#define NVIC_PRI6_INT25_M 0x0000FF00 // Interrupt 25 priority mask +#define NVIC_PRI6_INT24_M 0x000000FF // Interrupt 24 priority mask +#define NVIC_PRI6_INT27_S 24 +#define NVIC_PRI6_INT26_S 16 +#define NVIC_PRI6_INT25_S 8 +#define NVIC_PRI6_INT24_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI7 register. +// +//***************************************************************************** +#define NVIC_PRI7_INT31_M 0xFF000000 // Interrupt 31 priority mask +#define NVIC_PRI7_INT30_M 0x00FF0000 // Interrupt 30 priority mask +#define NVIC_PRI7_INT29_M 0x0000FF00 // Interrupt 29 priority mask +#define NVIC_PRI7_INT28_M 0x000000FF // Interrupt 28 priority mask +#define NVIC_PRI7_INT31_S 24 +#define NVIC_PRI7_INT30_S 16 +#define NVIC_PRI7_INT29_S 8 +#define NVIC_PRI7_INT28_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI8 register. +// +//***************************************************************************** +#define NVIC_PRI8_INT35_M 0xFF000000 // Interrupt 35 priority mask +#define NVIC_PRI8_INT34_M 0x00FF0000 // Interrupt 34 priority mask +#define NVIC_PRI8_INT33_M 0x0000FF00 // Interrupt 33 priority mask +#define NVIC_PRI8_INT32_M 0x000000FF // Interrupt 32 priority mask +#define NVIC_PRI8_INT35_S 24 +#define NVIC_PRI8_INT34_S 16 +#define NVIC_PRI8_INT33_S 8 +#define NVIC_PRI8_INT32_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI9 register. +// +//***************************************************************************** +#define NVIC_PRI9_INT39_M 0xFF000000 // Interrupt 39 priority mask +#define NVIC_PRI9_INT38_M 0x00FF0000 // Interrupt 38 priority mask +#define NVIC_PRI9_INT37_M 0x0000FF00 // Interrupt 37 priority mask +#define NVIC_PRI9_INT36_M 0x000000FF // Interrupt 36 priority mask +#define NVIC_PRI9_INT39_S 24 +#define NVIC_PRI9_INT38_S 16 +#define NVIC_PRI9_INT37_S 8 +#define NVIC_PRI9_INT36_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI10 register. +// +//***************************************************************************** +#define NVIC_PRI10_INT43_M 0xFF000000 // Interrupt 43 priority mask +#define NVIC_PRI10_INT42_M 0x00FF0000 // Interrupt 42 priority mask +#define NVIC_PRI10_INT41_M 0x0000FF00 // Interrupt 41 priority mask +#define NVIC_PRI10_INT40_M 0x000000FF // Interrupt 40 priority mask +#define NVIC_PRI10_INT43_S 24 +#define NVIC_PRI10_INT42_S 16 +#define NVIC_PRI10_INT41_S 8 +#define NVIC_PRI10_INT40_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_CPUID register. +// +//***************************************************************************** +#define NVIC_CPUID_IMP_M 0xFF000000 // Implementer +#define NVIC_CPUID_VAR_M 0x00F00000 // Variant +#define NVIC_CPUID_PARTNO_M 0x0000FFF0 // Processor part number +#define NVIC_CPUID_REV_M 0x0000000F // Revision + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_INT_CTRL register. +// +//***************************************************************************** +#define NVIC_INT_CTRL_NMI_SET 0x80000000 // Pend a NMI +#define NVIC_INT_CTRL_PEND_SV 0x10000000 // Pend a PendSV +#define NVIC_INT_CTRL_UNPEND_SV 0x08000000 // Unpend a PendSV +#define NVIC_INT_CTRL_ISR_PRE 0x00800000 // Debug interrupt handling +#define NVIC_INT_CTRL_ISR_PEND 0x00400000 // Debug interrupt pending +#define NVIC_INT_CTRL_VEC_PEN_M 0x003FF000 // Highest pending exception +#define NVIC_INT_CTRL_RET_BASE 0x00000800 // Return to base +#define NVIC_INT_CTRL_VEC_ACT_M 0x000003FF // Current active exception +#define NVIC_INT_CTRL_VEC_PEN_S 12 +#define NVIC_INT_CTRL_VEC_ACT_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_VTABLE register. +// +//***************************************************************************** +#define NVIC_VTABLE_BASE 0x20000000 // Vector table base +#define NVIC_VTABLE_OFFSET_M 0x1FFFFF00 // Vector table offset +#define NVIC_VTABLE_OFFSET_S 8 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_APINT register. +// +//***************************************************************************** +#define NVIC_APINT_VECTKEY_M 0xFFFF0000 // Vector key mask +#define NVIC_APINT_VECTKEY 0x05FA0000 // Vector key +#define NVIC_APINT_ENDIANESS 0x00008000 // Data endianess +#define NVIC_APINT_PRIGROUP_M 0x00000700 // Priority group +#define NVIC_APINT_PRIGROUP_7_1 0x00000000 // Priority group 7.1 split +#define NVIC_APINT_PRIGROUP_6_2 0x00000100 // Priority group 6.2 split +#define NVIC_APINT_PRIGROUP_5_3 0x00000200 // Priority group 5.3 split +#define NVIC_APINT_PRIGROUP_4_4 0x00000300 // Priority group 4.4 split +#define NVIC_APINT_PRIGROUP_3_5 0x00000400 // Priority group 3.5 split +#define NVIC_APINT_PRIGROUP_2_6 0x00000500 // Priority group 2.6 split +#define NVIC_APINT_PRIGROUP_1_7 0x00000600 // Priority group 1.7 split +#define NVIC_APINT_PRIGROUP_0_8 0x00000700 // Priority group 0.8 split +#define NVIC_APINT_SYSRESETREQ 0x00000004 // System reset request +#define NVIC_APINT_VECT_CLR_ACT 0x00000002 // Clear active NMI/fault info +#define NVIC_APINT_VECT_RESET 0x00000001 // System reset + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_CTRL register. +// +//***************************************************************************** +#define NVIC_SYS_CTRL_SEVONPEND 0x00000010 // Wakeup on pend +#define NVIC_SYS_CTRL_SLEEPDEEP 0x00000004 // Deep sleep enable +#define NVIC_SYS_CTRL_SLEEPEXIT 0x00000002 // Sleep on ISR exit + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_CFG_CTRL register. +// +//***************************************************************************** +#define NVIC_CFG_CTRL_BFHFNMIGN 0x00000100 // Ignore bus fault in NMI/fault +#define NVIC_CFG_CTRL_DIV0 0x00000010 // Trap on divide by 0 +#define NVIC_CFG_CTRL_UNALIGNED 0x00000008 // Trap on unaligned access +#define NVIC_CFG_CTRL_DEEP_PEND 0x00000004 // Allow deep interrupt trigger +#define NVIC_CFG_CTRL_MAIN_PEND 0x00000002 // Allow main interrupt trigger +#define NVIC_CFG_CTRL_BASE_THR 0x00000001 // Thread state control + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI1 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI1_RES_M 0xFF000000 // Priority of reserved handler +#define NVIC_SYS_PRI1_USAGE_M 0x00FF0000 // Priority of usage fault handler +#define NVIC_SYS_PRI1_BUS_M 0x0000FF00 // Priority of bus fault handler +#define NVIC_SYS_PRI1_MEM_M 0x000000FF // Priority of mem manage handler +#define NVIC_SYS_PRI1_USAGE_S 16 +#define NVIC_SYS_PRI1_BUS_S 8 +#define NVIC_SYS_PRI1_MEM_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI2 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI2_SVC_M 0xFF000000 // Priority of SVCall handler +#define NVIC_SYS_PRI2_RES_M 0x00FFFFFF // Priority of reserved handlers +#define NVIC_SYS_PRI2_SVC_S 24 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI3 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI3_TICK_M 0xFF000000 // Priority of Sys Tick handler +#define NVIC_SYS_PRI3_PENDSV_M 0x00FF0000 // Priority of PendSV handler +#define NVIC_SYS_PRI3_RES_M 0x0000FF00 // Priority of reserved handler +#define NVIC_SYS_PRI3_DEBUG_M 0x000000FF // Priority of debug handler +#define NVIC_SYS_PRI3_TICK_S 24 +#define NVIC_SYS_PRI3_PENDSV_S 16 +#define NVIC_SYS_PRI3_DEBUG_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_HND_CTRL register. +// +//***************************************************************************** +#define NVIC_SYS_HND_CTRL_USAGE 0x00040000 // Usage fault enable +#define NVIC_SYS_HND_CTRL_BUS 0x00020000 // Bus fault enable +#define NVIC_SYS_HND_CTRL_MEM 0x00010000 // Mem manage fault enable +#define NVIC_SYS_HND_CTRL_SVC 0x00008000 // SVCall is pended +#define NVIC_SYS_HND_CTRL_BUSP 0x00004000 // Bus fault is pended +#define NVIC_SYS_HND_CTRL_TICK 0x00000800 // Sys tick is active +#define NVIC_SYS_HND_CTRL_PNDSV 0x00000400 // PendSV is active +#define NVIC_SYS_HND_CTRL_MON 0x00000100 // Monitor is active +#define NVIC_SYS_HND_CTRL_SVCA 0x00000080 // SVCall is active +#define NVIC_SYS_HND_CTRL_USGA 0x00000008 // Usage fault is active +#define NVIC_SYS_HND_CTRL_BUSA 0x00000002 // Bus fault is active +#define NVIC_SYS_HND_CTRL_MEMA 0x00000001 // Mem manage is active + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_FAULT_STAT register. +// +//***************************************************************************** +#define NVIC_FAULT_STAT_DIV0 0x02000000 // Divide by zero fault +#define NVIC_FAULT_STAT_UNALIGN 0x01000000 // Unaligned access fault +#define NVIC_FAULT_STAT_NOCP 0x00080000 // No coprocessor fault +#define NVIC_FAULT_STAT_INVPC 0x00040000 // Invalid PC fault +#define NVIC_FAULT_STAT_INVSTAT 0x00020000 // Invalid state fault +#define NVIC_FAULT_STAT_UNDEF 0x00010000 // Undefined instruction fault +#define NVIC_FAULT_STAT_BFARV 0x00008000 // BFAR is valid +#define NVIC_FAULT_STAT_BSTKE 0x00001000 // Stack bus fault +#define NVIC_FAULT_STAT_BUSTKE 0x00000800 // Unstack bus fault +#define NVIC_FAULT_STAT_IMPRE 0x00000400 // Imprecise data bus error +#define NVIC_FAULT_STAT_PRECISE 0x00000200 // Precise data bus error +#define NVIC_FAULT_STAT_IBUS 0x00000100 // Instruction bus fault +#define NVIC_FAULT_STAT_MMARV 0x00000080 // MMAR is valid +#define NVIC_FAULT_STAT_MSTKE 0x00000010 // Stack access violation +#define NVIC_FAULT_STAT_MUSTKE 0x00000008 // Unstack access violation +#define NVIC_FAULT_STAT_DERR 0x00000002 // Data access violation +#define NVIC_FAULT_STAT_IERR 0x00000001 // Instruction access violation + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_HFAULT_STAT register. +// +//***************************************************************************** +#define NVIC_HFAULT_STAT_DBG 0x80000000 // Debug event +#define NVIC_HFAULT_STAT_FORCED 0x40000000 // Cannot execute fault handler +#define NVIC_HFAULT_STAT_VECT 0x00000002 // Vector table read fault + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DEBUG_STAT register. +// +//***************************************************************************** +#define NVIC_DEBUG_STAT_EXTRNL 0x00000010 // EDBGRQ asserted +#define NVIC_DEBUG_STAT_VCATCH 0x00000008 // Vector catch +#define NVIC_DEBUG_STAT_DWTTRAP 0x00000004 // DWT match +#define NVIC_DEBUG_STAT_BKPT 0x00000002 // Breakpoint instruction +#define NVIC_DEBUG_STAT_HALTED 0x00000001 // Halt request + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MM_ADDR register. +// +//***************************************************************************** +#define NVIC_MM_ADDR_M 0xFFFFFFFF // Data fault address +#define NVIC_MM_ADDR_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_FAULT_ADDR register. +// +//***************************************************************************** +#define NVIC_FAULT_ADDR_M 0xFFFFFFFF // Data bus fault address +#define NVIC_FAULT_ADDR_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EXC_STACK register. +// +//***************************************************************************** +#define NVIC_EXC_STACK_DEEP 0x00000001 // Exception stack + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EXC_NUM register. +// +//***************************************************************************** +#define NVIC_EXC_NUM_M 0x000003FF // Exception number +#define NVIC_EXC_NUM_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_COPRO register. +// +//***************************************************************************** +#define NVIC_COPRO_15_M 0xC0000000 // Coprocessor 15 access mask +#define NVIC_COPRO_15_DENIED 0x00000000 // Coprocessor 15 access denied +#define NVIC_COPRO_15_PRIV 0x40000000 // Coprocessor 15 privileged addess +#define NVIC_COPRO_15_FULL 0xC0000000 // Coprocessor 15 full access +#define NVIC_COPRO_14_M 0x30000000 // Coprocessor 14 access mask +#define NVIC_COPRO_14_DENIED 0x00000000 // Coprocessor 14 access denied +#define NVIC_COPRO_14_PRIV 0x10000000 // Coprocessor 14 privileged addess +#define NVIC_COPRO_14_FULL 0x30000000 // Coprocessor 14 full access +#define NVIC_COPRO_13_M 0x0C000000 // Coprocessor 13 access mask +#define NVIC_COPRO_13_DENIED 0x00000000 // Coprocessor 13 access denied +#define NVIC_COPRO_13_PRIV 0x04000000 // Coprocessor 13 privileged addess +#define NVIC_COPRO_13_FULL 0x0C000000 // Coprocessor 13 full access +#define NVIC_COPRO_12_M 0x03000000 // Coprocessor 12 access mask +#define NVIC_COPRO_12_DENIED 0x00000000 // Coprocessor 12 access denied +#define NVIC_COPRO_12_PRIV 0x01000000 // Coprocessor 12 privileged addess +#define NVIC_COPRO_12_FULL 0x03000000 // Coprocessor 12 full access +#define NVIC_COPRO_11_M 0x00C00000 // Coprocessor 11 access mask +#define NVIC_COPRO_11_DENIED 0x00000000 // Coprocessor 11 access denied +#define NVIC_COPRO_11_PRIV 0x00400000 // Coprocessor 11 privileged addess +#define NVIC_COPRO_11_FULL 0x00C00000 // Coprocessor 11 full access +#define NVIC_COPRO_10_M 0x00300000 // Coprocessor 10 access mask +#define NVIC_COPRO_10_DENIED 0x00000000 // Coprocessor 10 access denied +#define NVIC_COPRO_10_PRIV 0x00100000 // Coprocessor 10 privileged addess +#define NVIC_COPRO_10_FULL 0x00300000 // Coprocessor 10 full access +#define NVIC_COPRO_9_M 0x000C0000 // Coprocessor 9 access mask +#define NVIC_COPRO_9_DENIED 0x00000000 // Coprocessor 9 access denied +#define NVIC_COPRO_9_PRIV 0x00040000 // Coprocessor 9 privileged addess +#define NVIC_COPRO_9_FULL 0x000C0000 // Coprocessor 9 full access +#define NVIC_COPRO_8_M 0x00030000 // Coprocessor 8 access mask +#define NVIC_COPRO_8_DENIED 0x00000000 // Coprocessor 8 access denied +#define NVIC_COPRO_8_PRIV 0x00010000 // Coprocessor 8 privileged addess +#define NVIC_COPRO_8_FULL 0x00030000 // Coprocessor 8 full access +#define NVIC_COPRO_7_M 0x0000C000 // Coprocessor 7 access mask +#define NVIC_COPRO_7_DENIED 0x00000000 // Coprocessor 7 access denied +#define NVIC_COPRO_7_PRIV 0x00004000 // Coprocessor 7 privileged addess +#define NVIC_COPRO_7_FULL 0x0000C000 // Coprocessor 7 full access +#define NVIC_COPRO_6_M 0x00003000 // Coprocessor 6 access mask +#define NVIC_COPRO_6_DENIED 0x00000000 // Coprocessor 6 access denied +#define NVIC_COPRO_6_PRIV 0x00001000 // Coprocessor 6 privileged addess +#define NVIC_COPRO_6_FULL 0x00003000 // Coprocessor 6 full access +#define NVIC_COPRO_5_M 0x00000C00 // Coprocessor 5 access mask +#define NVIC_COPRO_5_DENIED 0x00000000 // Coprocessor 5 access denied +#define NVIC_COPRO_5_PRIV 0x00000400 // Coprocessor 5 privileged addess +#define NVIC_COPRO_5_FULL 0x00000C00 // Coprocessor 5 full access +#define NVIC_COPRO_4_M 0x00000300 // Coprocessor 4 access mask +#define NVIC_COPRO_4_DENIED 0x00000000 // Coprocessor 4 access denied +#define NVIC_COPRO_4_PRIV 0x00000100 // Coprocessor 4 privileged addess +#define NVIC_COPRO_4_FULL 0x00000300 // Coprocessor 4 full access +#define NVIC_COPRO_3_M 0x000000C0 // Coprocessor 3 access mask +#define NVIC_COPRO_3_DENIED 0x00000000 // Coprocessor 3 access denied +#define NVIC_COPRO_3_PRIV 0x00000040 // Coprocessor 3 privileged addess +#define NVIC_COPRO_3_FULL 0x000000C0 // Coprocessor 3 full access +#define NVIC_COPRO_2_M 0x00000030 // Coprocessor 2 access mask +#define NVIC_COPRO_2_DENIED 0x00000000 // Coprocessor 2 access denied +#define NVIC_COPRO_2_PRIV 0x00000010 // Coprocessor 2 privileged addess +#define NVIC_COPRO_2_FULL 0x00000030 // Coprocessor 2 full access +#define NVIC_COPRO_1_M 0x0000000C // Coprocessor 1 access mask +#define NVIC_COPRO_1_DENIED 0x00000000 // Coprocessor 1 access denied +#define NVIC_COPRO_1_PRIV 0x00000004 // Coprocessor 1 privileged addess +#define NVIC_COPRO_1_FULL 0x0000000C // Coprocessor 1 full access +#define NVIC_COPRO_0_M 0x00000003 // Coprocessor 0 access mask +#define NVIC_COPRO_0_DENIED 0x00000000 // Coprocessor 0 access denied +#define NVIC_COPRO_0_PRIV 0x00000001 // Coprocessor 0 privileged addess +#define NVIC_COPRO_0_FULL 0x00000003 // Coprocessor 0 full access + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_TYPE register. +// +//***************************************************************************** +#define NVIC_MPU_TYPE_IREGION_M 0x00FF0000 // Number of I regions +#define NVIC_MPU_TYPE_DREGION_M 0x0000FF00 // Number of D regions +#define NVIC_MPU_TYPE_SEPARATE 0x00000001 // Separate or unified MPU +#define NVIC_MPU_TYPE_IREGION_S 16 +#define NVIC_MPU_TYPE_DREGION_S 8 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_CTRL register. +// +//***************************************************************************** +#define NVIC_MPU_CTRL_HFNMIENA 0x00000002 // MPU enabled during faults +#define NVIC_MPU_CTRL_ENABLE 0x00000001 // MPU enable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_NUMBER register. +// +//***************************************************************************** +#define NVIC_MPU_NUMBER_M 0x000000FF // MPU region to access +#define NVIC_MPU_NUMBER_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_BASE register. +// +//***************************************************************************** +#define NVIC_MPU_BASE_ADDR_M 0xFFFFFF00 // Base address +#define NVIC_MPU_BASE_VALID 0x00000010 // Region number valid +#define NVIC_MPU_BASE_REGION_M 0x0000000F // Region number +#define NVIC_MPU_BASE_ADDR_S 8 +#define NVIC_MPU_BASE_REGION_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_ATTR register. +// +//***************************************************************************** +#define NVIC_MPU_ATTR_ATTRS 0xFFFF0000 // Attributes +#define NVIC_MPU_ATTR_SRD 0x0000FF00 // Sub-region disable +#define NVIC_MPU_ATTR_SZENABLE 0x000000FF // Region size + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_CTRL register. +// +//***************************************************************************** +#define NVIC_DBG_CTRL_DBGKEY_M 0xFFFF0000 // Debug key mask +#define NVIC_DBG_CTRL_DBGKEY 0xA05F0000 // Debug key +#define NVIC_DBG_CTRL_MON_PEND 0x00008000 // Pend the monitor +#define NVIC_DBG_CTRL_MON_REQ 0x00004000 // Monitor request +#define NVIC_DBG_CTRL_MON_EN 0x00002000 // Debug monitor enable +#define NVIC_DBG_CTRL_MONSTEP 0x00001000 // Monitor step the core +#define NVIC_DBG_CTRL_S_SLEEP 0x00000400 // Core is sleeping +#define NVIC_DBG_CTRL_S_HALT 0x00000200 // Core status on halt +#define NVIC_DBG_CTRL_S_REGRDY 0x00000100 // Register read/write available +#define NVIC_DBG_CTRL_S_LOCKUP 0x00000080 // Core is locked up +#define NVIC_DBG_CTRL_C_RESET 0x00000010 // Reset the core +#define NVIC_DBG_CTRL_C_MASKINT 0x00000008 // Mask interrupts when stepping +#define NVIC_DBG_CTRL_C_STEP 0x00000004 // Step the core +#define NVIC_DBG_CTRL_C_HALT 0x00000002 // Halt the core +#define NVIC_DBG_CTRL_C_DEBUGEN 0x00000001 // Enable debug + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_XFER register. +// +//***************************************************************************** +#define NVIC_DBG_XFER_REG_WNR 0x00010000 // Write or not read +#define NVIC_DBG_XFER_REG_SEL_M 0x0000001F // Register +#define NVIC_DBG_XFER_REG_R0 0x00000000 // Register R0 +#define NVIC_DBG_XFER_REG_R1 0x00000001 // Register R1 +#define NVIC_DBG_XFER_REG_R2 0x00000002 // Register R2 +#define NVIC_DBG_XFER_REG_R3 0x00000003 // Register R3 +#define NVIC_DBG_XFER_REG_R4 0x00000004 // Register R4 +#define NVIC_DBG_XFER_REG_R5 0x00000005 // Register R5 +#define NVIC_DBG_XFER_REG_R6 0x00000006 // Register R6 +#define NVIC_DBG_XFER_REG_R7 0x00000007 // Register R7 +#define NVIC_DBG_XFER_REG_R8 0x00000008 // Register R8 +#define NVIC_DBG_XFER_REG_R9 0x00000009 // Register R9 +#define NVIC_DBG_XFER_REG_R10 0x0000000A // Register R10 +#define NVIC_DBG_XFER_REG_R11 0x0000000B // Register R11 +#define NVIC_DBG_XFER_REG_R12 0x0000000C // Register R12 +#define NVIC_DBG_XFER_REG_R13 0x0000000D // Register R13 +#define NVIC_DBG_XFER_REG_R14 0x0000000E // Register R14 +#define NVIC_DBG_XFER_REG_R15 0x0000000F // Register R15 +#define NVIC_DBG_XFER_REG_FLAGS 0x00000010 // xPSR/Flags register +#define NVIC_DBG_XFER_REG_MSP 0x00000011 // Main SP +#define NVIC_DBG_XFER_REG_PSP 0x00000012 // Process SP +#define NVIC_DBG_XFER_REG_DSP 0x00000013 // Deep SP +#define NVIC_DBG_XFER_REG_CFBP 0x00000014 // Control/Fault/BasePri/PriMask + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_DATA register. +// +//***************************************************************************** +#define NVIC_DBG_DATA_M 0xFFFFFFFF // Data temporary cache +#define NVIC_DBG_DATA_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_INT register. +// +//***************************************************************************** +#define NVIC_DBG_INT_HARDERR 0x00000400 // Debug trap on hard fault +#define NVIC_DBG_INT_INTERR 0x00000200 // Debug trap on interrupt errors +#define NVIC_DBG_INT_BUSERR 0x00000100 // Debug trap on bus error +#define NVIC_DBG_INT_STATERR 0x00000080 // Debug trap on usage fault state +#define NVIC_DBG_INT_CHKERR 0x00000040 // Debug trap on usage fault check +#define NVIC_DBG_INT_NOCPERR 0x00000020 // Debug trap on coprocessor error +#define NVIC_DBG_INT_MMERR 0x00000010 // Debug trap on mem manage fault +#define NVIC_DBG_INT_RESET 0x00000008 // Core reset status +#define NVIC_DBG_INT_RSTPENDCLR 0x00000004 // Clear pending core reset +#define NVIC_DBG_INT_RSTPENDING 0x00000002 // Core reset is pending +#define NVIC_DBG_INT_RSTVCATCH 0x00000001 // Reset vector catch + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SW_TRIG register. +// +//***************************************************************************** +#define NVIC_SW_TRIG_INTID_M 0x000003FF // Interrupt to trigger +#define NVIC_SW_TRIG_INTID_S 0 + +#endif // __HW_NVIC_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_pwm.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_pwm.h new file mode 100644 index 000000000..53609c6f9 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_pwm.h @@ -0,0 +1,260 @@ +//***************************************************************************** +// +// hw_pwm.h - Defines and Macros for Pulse Width Modulation (PWM) ports +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_PWM_H__ +#define __HW_PWM_H__ + +//***************************************************************************** +// +// PWM Module Register Offsets. +// +//***************************************************************************** +#define PWM_O_CTL 0x00000000 // PWM Master Control register +#define PWM_O_SYNC 0x00000004 // PWM Time Base Sync register +#define PWM_O_ENABLE 0x00000008 // PWM Output Enable register +#define PWM_O_INVERT 0x0000000C // PWM Output Inversion register +#define PWM_O_FAULT 0x00000010 // PWM Output Fault register +#define PWM_O_INTEN 0x00000014 // PWM Interrupt Enable register +#define PWM_O_RIS 0x00000018 // PWM Interrupt Raw Status reg. +#define PWM_O_ISC 0x0000001C // PWM Interrupt Status register +#define PWM_O_STATUS 0x00000020 // PWM Status register + +//***************************************************************************** +// +// The following define the bit fields in the PWM Master Control register. +// +//***************************************************************************** +#define PWM_CTL_GLOBAL_SYNC2 0x00000004 // Global sync generator 2 +#define PWM_CTL_GLOBAL_SYNC1 0x00000002 // Global sync generator 1 +#define PWM_CTL_GLOBAL_SYNC0 0x00000001 // Global sync generator 0 + +//***************************************************************************** +// +// The following define the bit fields in the PWM Time Base Sync register. +// +//***************************************************************************** +#define PWM_SYNC_SYNC2 0x00000004 // Reset generator 2 counter +#define PWM_SYNC_SYNC1 0x00000002 // Reset generator 1 counter +#define PWM_SYNC_SYNC0 0x00000001 // Reset generator 0 counter + +//***************************************************************************** +// +// The following define the bit fields in the PWM Output Enable register. +// +//***************************************************************************** +#define PWM_ENABLE_PWM5EN 0x00000020 // PWM5 pin enable +#define PWM_ENABLE_PWM4EN 0x00000010 // PWM4 pin enable +#define PWM_ENABLE_PWM3EN 0x00000008 // PWM3 pin enable +#define PWM_ENABLE_PWM2EN 0x00000004 // PWM2 pin enable +#define PWM_ENABLE_PWM1EN 0x00000002 // PWM1 pin enable +#define PWM_ENABLE_PWM0EN 0x00000001 // PWM0 pin enable + +//***************************************************************************** +// +// The following define the bit fields in the PWM Inversion register. +// +//***************************************************************************** +#define PWM_INVERT_PWM5INV 0x00000020 // PWM5 pin invert +#define PWM_INVERT_PWM4INV 0x00000010 // PWM4 pin invert +#define PWM_INVERT_PWM3INV 0x00000008 // PWM3 pin invert +#define PWM_INVERT_PWM2INV 0x00000004 // PWM2 pin invert +#define PWM_INVERT_PWM1INV 0x00000002 // PWM1 pin invert +#define PWM_INVERT_PWM0INV 0x00000001 // PWM0 pin invert + +//***************************************************************************** +// +// The following define the bit fields in the PWM Fault register. +// +//***************************************************************************** +#define PWM_FAULT_FAULT5 0x00000020 // PWM5 pin fault +#define PWM_FAULT_FAULT4 0x00000010 // PWM5 pin fault +#define PWM_FAULT_FAULT3 0x00000008 // PWM5 pin fault +#define PWM_FAULT_FAULT2 0x00000004 // PWM5 pin fault +#define PWM_FAULT_FAULT1 0x00000002 // PWM5 pin fault +#define PWM_FAULT_FAULT0 0x00000001 // PWM5 pin fault + +//***************************************************************************** +// +// PWM Interrupt Register bit definitions. +// +//***************************************************************************** +#define PWM_INT_INTFAULT 0x00010000 // Fault interrupt pending + +//***************************************************************************** +// +// The following define the bit fields in the PWM Status register. +// +//***************************************************************************** +#define PWM_STATUS_FAULT 0x00000001 // Fault status + +//***************************************************************************** +// +// PWM Generator standard offsets. +// +//***************************************************************************** +#define PWM_GEN_0_OFFSET 0x00000040 // PWM0 base +#define PWM_GEN_1_OFFSET 0x00000080 // PWM1 base +#define PWM_GEN_2_OFFSET 0x000000C0 // PWM2 base + +#define PWM_O_X_CTL 0x00000000 // Gen Control Reg +#define PWM_O_X_INTEN 0x00000004 // Gen Int/Trig Enable Reg +#define PWM_O_X_RIS 0x00000008 // Gen Raw Int Status Reg +#define PWM_O_X_ISC 0x0000000C // Gen Int Status Reg +#define PWM_O_X_LOAD 0x00000010 // Gen Load Reg +#define PWM_O_X_COUNT 0x00000014 // Gen Counter Reg +#define PWM_O_X_CMPA 0x00000018 // Gen Compare A Reg +#define PWM_O_X_CMPB 0x0000001C // Gen Compare B Reg +#define PWM_O_X_GENA 0x00000020 // Gen Generator A Ctrl Reg +#define PWM_O_X_GENB 0x00000024 // Gen Generator B Ctrl Reg +#define PWM_O_X_DBCTL 0x00000028 // Gen Dead Band Ctrl Reg +#define PWM_O_X_DBRISE 0x0000002C // Gen DB Rising Edge Delay Reg +#define PWM_O_X_DBFALL 0x00000030 // Gen DB Falling Edge Delay Reg + +//***************************************************************************** +// +// PWM_X Control Register bit definitions. +// +//***************************************************************************** +#define PWM_X_CTL_ENABLE 0x00000001 // Master enable for gen block +#define PWM_X_CTL_MODE 0x00000002 // Counter mode, down or up/down +#define PWM_X_CTL_DEBUG 0x00000004 // Debug mode +#define PWM_X_CTL_LOADUPD 0x00000008 // Update mode for the load reg +#define PWM_X_CTL_CMPAUPD 0x00000010 // Update mode for comp A reg +#define PWM_X_CTL_CMPBUPD 0x00000020 // Update mode for comp B reg + +//***************************************************************************** +// +// PWM_X Interrupt/Trigger Enable Register bit definitions. +// +//***************************************************************************** +#define PWM_X_INTEN_INTCNTZERO 0x00000001 // Int if COUNT = 0 +#define PWM_X_INTEN_INTCNTLOAD 0x00000002 // Int if COUNT = LOAD +#define PWM_X_INTEN_INTCMPAU 0x00000004 // Int if COUNT = CMPA U +#define PWM_X_INTEN_INTCMPAD 0x00000008 // Int if COUNT = CMPA D +#define PWM_X_INTEN_INTCMPBU 0x00000010 // Int if COUNT = CMPA U +#define PWM_X_INTEN_INTCMPBD 0x00000020 // Int if COUNT = CMPA D +#define PWM_X_INTEN_TRCNTZERO 0x00000100 // Trig if COUNT = 0 +#define PWM_X_INTEN_TRCNTLOAD 0x00000200 // Trig if COUNT = LOAD +#define PWM_X_INTEN_TRCMPAU 0x00000400 // Trig if COUNT = CMPA U +#define PWM_X_INTEN_TRCMPAD 0x00000800 // Trig if COUNT = CMPA D +#define PWM_X_INTEN_TRCMPBU 0x00001000 // Trig if COUNT = CMPA U +#define PWM_X_INTEN_TRCMPBD 0x00002000 // Trig if COUNT = CMPA D + +//***************************************************************************** +// +// PWM_X Raw Interrupt Status Register bit definitions. +// +//***************************************************************************** +#define PWM_X_RIS_INTCNTZERO 0x00000001 // PWM_X_COUNT = 0 int +#define PWM_X_RIS_INTCNTLOAD 0x00000002 // PWM_X_COUNT = PWM_X_LOAD int +#define PWM_X_RIS_INTCMPAU 0x00000004 // PWM_X_COUNT = PWM_X_CMPA U int +#define PWM_X_RIS_INTCMPAD 0x00000008 // PWM_X_COUNT = PWM_X_CMPA D int +#define PWM_X_RIS_INTCMPBU 0x00000010 // PWM_X_COUNT = PWM_X_CMPB U int +#define PWM_X_RIS_INTCMPBD 0x00000020 // PWM_X_COUNT = PWM_X_CMPB D int + +//***************************************************************************** +// +// PWM_X Interrupt Status Register bit definitions. +// +//***************************************************************************** +#define PWM_X_INT_INTCNTZERO 0x00000001 // PWM_X_COUNT = 0 received +#define PWM_X_INT_INTCNTLOAD 0x00000002 // PWM_X_COUNT = PWM_X_LOAD rcvd +#define PWM_X_INT_INTCMPAU 0x00000004 // PWM_X_COUNT = PWM_X_CMPA U rcvd +#define PWM_X_INT_INTCMPAD 0x00000008 // PWM_X_COUNT = PWM_X_CMPA D rcvd +#define PWM_X_INT_INTCMPBU 0x00000010 // PWM_X_COUNT = PWM_X_CMPB U rcvd +#define PWM_X_INT_INTCMPBD 0x00000020 // PWM_X_COUNT = PWM_X_CMPB D rcvd + +//***************************************************************************** +// +// PWM_X Generator A/B Control Register bit definitions. +// +//***************************************************************************** +#define PWM_X_GEN_Y_ACTZERO 0x00000003 // Act PWM_X_COUNT = 0 +#define PWM_X_GEN_Y_ACTLOAD 0x0000000C // Act PWM_X_COUNT = PWM_X_LOAD +#define PWM_X_GEN_Y_ACTCMPAU 0x00000030 // Act PWM_X_COUNT = PWM_X_CMPA U +#define PWM_X_GEN_Y_ACTCMPAD 0x000000C0 // Act PWM_X_COUNT = PWM_X_CMPA D +#define PWM_X_GEN_Y_ACTCMPBU 0x00000300 // Act PWM_X_COUNT = PWM_X_CMPB U +#define PWM_X_GEN_Y_ACTCMPBD 0x00000C00 // Act PWM_X_COUNT = PWM_X_CMPB D + +//***************************************************************************** +// +// PWM_X Generator A/B Control Register action definitions. +// +//***************************************************************************** +#define PWM_GEN_ACT_NONE 0x0 // Do nothing +#define PWM_GEN_ACT_INV 0x1 // Invert the output signal +#define PWM_GEN_ACT_ZERO 0x2 // Set the output signal to zero +#define PWM_GEN_ACT_ONE 0x3 // Set the output signal to one +#define PWM_GEN_ACT_ZERO_SHIFT 0 // Shift amount for the zero action +#define PWM_GEN_ACT_LOAD_SHIFT 2 // Shift amount for the load action +#define PWM_GEN_ACT_A_UP_SHIFT 4 // Shift amount for the A up action +#define PWM_GEN_ACT_A_DN_SHIFT 6 // Shift amount for the A dn action +#define PWM_GEN_ACT_B_UP_SHIFT 8 // Shift amount for the B up action +#define PWM_GEN_ACT_B_DN_SHIFT 10 // Shift amount for the B dn action + +//***************************************************************************** +// +// PWM_X Dead Band Control Register bit definitions. +// +//***************************************************************************** +#define PWM_DBCTL_ENABLE 0x00000001 // Enable dead band insertion + +//***************************************************************************** +// +// PWM Register reset values. +// +//***************************************************************************** +#define PWM_RV_CTL 0x00000000 // Master control of the PWM module +#define PWM_RV_SYNC 0x00000000 // Counter synch for PWM generators +#define PWM_RV_ENABLE 0x00000000 // Master enable for the PWM + // output pins +#define PWM_RV_INVERT 0x00000000 // Inversion control for + // PWM output pins +#define PWM_RV_FAULT 0x00000000 // Fault handling for the PWM + // output pins +#define PWM_RV_INTEN 0x00000000 // Interrupt enable +#define PWM_RV_RIS 0x00000000 // Raw interrupt status +#define PWM_RV_ISC 0x00000000 // Interrupt status and clearing +#define PWM_RV_STATUS 0x00000000 // Status +#define PWM_RV_X_CTL 0x00000000 // Master control of the PWM + // generator block +#define PWM_RV_X_INTEN 0x00000000 // Interrupt and trigger enable +#define PWM_RV_X_RIS 0x00000000 // Raw interrupt status +#define PWM_RV_X_ISC 0x00000000 // Interrupt status and clearing +#define PWM_RV_X_LOAD 0x00000000 // The load value for the counter +#define PWM_RV_X_COUNT 0x00000000 // The current counter value +#define PWM_RV_X_CMPA 0x00000000 // The comparator A value +#define PWM_RV_X_CMPB 0x00000000 // The comparator B value +#define PWM_RV_X_GENA 0x00000000 // Controls PWM generator A +#define PWM_RV_X_GENB 0x00000000 // Controls PWM generator B +#define PWM_RV_X_DBCTL 0x00000000 // Control the dead band generator +#define PWM_RV_X_DBRISE 0x00000000 // The dead band rising edge delay + // count +#define PWM_RV_X_DBFALL 0x00000000 // The dead band falling edge delay + // count + +#endif // __HW_PWM_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_qei.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_qei.h new file mode 100644 index 000000000..6d988ba95 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_qei.h @@ -0,0 +1,176 @@ +//***************************************************************************** +// +// hw_qei.h - Macros used when accessing the QEI hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_QEI_H__ +#define __HW_QEI_H__ + +//***************************************************************************** +// +// The following define the offsets of the QEI registers. +// +//***************************************************************************** +#define QEI_O_CTL 0x00000000 // Configuration and control reg. +#define QEI_O_STAT 0x00000004 // Status register +#define QEI_O_POS 0x00000008 // Current position register +#define QEI_O_MAXPOS 0x0000000C // Maximum position register +#define QEI_O_LOAD 0x00000010 // Velocity timer load register +#define QEI_O_TIME 0x00000014 // Velocity timer register +#define QEI_O_COUNT 0x00000018 // Velocity pulse count register +#define QEI_O_SPEED 0x0000001C // Velocity speed register +#define QEI_O_INTEN 0x00000020 // Interrupt enable register +#define QEI_O_RIS 0x00000024 // Raw interrupt status register +#define QEI_O_ISC 0x00000028 // Interrupt status register + +//***************************************************************************** +// +// The following define the bit fields in the QEI_CTL register. +// +//***************************************************************************** +#define QEI_CTL_STALLEN 0x00001000 // Stall enable +#define QEI_CTL_INVI 0x00000800 // Invert Index input +#define QEI_CTL_INVB 0x00000400 // Invert PhB input +#define QEI_CTL_INVA 0x00000200 // Invert PhA input +#define QEI_CTL_VELDIV_M 0x000001C0 // Velocity predivider mask +#define QEI_CTL_VELDIV_1 0x00000000 // Predivide by 1 +#define QEI_CTL_VELDIV_2 0x00000040 // Predivide by 2 +#define QEI_CTL_VELDIV_4 0x00000080 // Predivide by 4 +#define QEI_CTL_VELDIV_8 0x000000C0 // Predivide by 8 +#define QEI_CTL_VELDIV_16 0x00000100 // Predivide by 16 +#define QEI_CTL_VELDIV_32 0x00000140 // Predivide by 32 +#define QEI_CTL_VELDIV_64 0x00000180 // Predivide by 64 +#define QEI_CTL_VELDIV_128 0x000001C0 // Predivide by 128 +#define QEI_CTL_VELEN 0x00000020 // Velocity enable +#define QEI_CTL_RESMODE 0x00000010 // Position counter reset mode +#define QEI_CTL_CAPMODE 0x00000008 // Edge capture mode +#define QEI_CTL_SIGMODE 0x00000004 // Encoder signaling mode +#define QEI_CTL_SWAP 0x00000002 // Swap input signals +#define QEI_CTL_ENABLE 0x00000001 // QEI enable + +//***************************************************************************** +// +// The following define the bit fields in the QEI_STAT register. +// +//***************************************************************************** +#define QEI_STAT_DIRECTION 0x00000002 // Direction of rotation +#define QEI_STAT_ERROR 0x00000001 // Signalling error detected + +//***************************************************************************** +// +// The following define the bit fields in the QEI_POS register. +// +//***************************************************************************** +#define QEI_POS_M 0xFFFFFFFF // Current encoder position +#define QEI_POS_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_MAXPOS register. +// +//***************************************************************************** +#define QEI_MAXPOS_M 0xFFFFFFFF // Maximum encoder position +#define QEI_MAXPOS_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_LOAD register. +// +//***************************************************************************** +#define QEI_LOAD_M 0xFFFFFFFF // Velocity timer load value +#define QEI_LOAD_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_TIME register. +// +//***************************************************************************** +#define QEI_TIME_M 0xFFFFFFFF // Velocity timer current value +#define QEI_TIME_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_COUNT register. +// +//***************************************************************************** +#define QEI_COUNT_M 0xFFFFFFFF // Encoder running pulse count +#define QEI_COUNT_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_SPEED register. +// +//***************************************************************************** +#define QEI_SPEED_M 0xFFFFFFFF // Encoder pulse count +#define QEI_SPEED_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_INTEN register. +// +//***************************************************************************** +#define QEI_INTEN_ERROR 0x00000008 // Phase error detected +#define QEI_INTEN_DIR 0x00000004 // Direction change +#define QEI_INTEN_TIMER 0x00000002 // Velocity timer expired +#define QEI_INTEN_INDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// The following define the bit fields in the QEI_RIS register. +// +//***************************************************************************** +#define QEI_RIS_ERROR 0x00000008 // Phase error detected +#define QEI_RIS_DIR 0x00000004 // Direction change +#define QEI_RIS_TIMER 0x00000002 // Velocity timer expired +#define QEI_RIS_INDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// The following define the bit fields in the QEI_ISC register. +// +//***************************************************************************** +#define QEI_INT_ERROR 0x00000008 // Phase error detected +#define QEI_INT_DIR 0x00000004 // Direction change +#define QEI_INT_TIMER 0x00000002 // Velocity timer expired +#define QEI_INT_INDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// The following define the reset values for the QEI registers. +// +//***************************************************************************** +#define QEI_RV_CTL 0x00000000 // Configuration and control reg. +#define QEI_RV_STAT 0x00000000 // Status register +#define QEI_RV_POS 0x00000000 // Current position register +#define QEI_RV_MAXPOS 0x00000000 // Maximum position register +#define QEI_RV_LOAD 0x00000000 // Velocity timer load register +#define QEI_RV_TIME 0x00000000 // Velocity timer register +#define QEI_RV_COUNT 0x00000000 // Velocity pulse count register +#define QEI_RV_SPEED 0x00000000 // Velocity speed register +#define QEI_RV_INTEN 0x00000000 // Interrupt enable register +#define QEI_RV_RIS 0x00000000 // Raw interrupt status register +#define QEI_RV_ISC 0x00000000 // Interrupt status register + +#endif // __HW_QEI_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_ssi.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_ssi.h new file mode 100644 index 000000000..2af758095 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_ssi.h @@ -0,0 +1,120 @@ +//***************************************************************************** +// +// hw_ssi.h - Macros used when accessing the SSI hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_SSI_H__ +#define __HW_SSI_H__ + +//***************************************************************************** +// +// The following define the offsets of the SSI registers. +// +//***************************************************************************** +#define SSI_O_CR0 0x00000000 // Control register 0 +#define SSI_O_CR1 0x00000004 // Control register 1 +#define SSI_O_DR 0x00000008 // Data register +#define SSI_O_SR 0x0000000C // Status register +#define SSI_O_CPSR 0x00000010 // Clock prescale register +#define SSI_O_IM 0x00000014 // Int mask set and clear register +#define SSI_O_RIS 0x00000018 // Raw interrupt register +#define SSI_O_MIS 0x0000001C // Masked interrupt register +#define SSI_O_ICR 0x00000020 // Interrupt clear register + +//***************************************************************************** +// +// The following define the bit fields in the SSI Control register 0. +// +//***************************************************************************** +#define SSI_CR0_SCR 0x0000FF00 // Serial clock rate +#define SSI_CR0_SPH 0x00000080 // SSPCLKOUT phase +#define SSI_CR0_SPO 0x00000040 // SSPCLKOUT polarity +#define SSI_CR0_FRF_MASK 0x00000030 // Frame format mask +#define SSI_CR0_FRF_MOTO 0x00000000 // Motorola SPI frame format +#define SSI_CR0_FRF_TI 0x00000010 // TI sync serial frame format +#define SSI_CR0_FRF_NMW 0x00000020 // National Microwire frame format +#define SSI_CR0_DSS 0x0000000F // Data size select +#define SSI_CR0_DSS_4 0x00000003 // 4 bit data +#define SSI_CR0_DSS_5 0x00000004 // 5 bit data +#define SSI_CR0_DSS_6 0x00000005 // 6 bit data +#define SSI_CR0_DSS_7 0x00000006 // 7 bit data +#define SSI_CR0_DSS_8 0x00000007 // 8 bit data +#define SSI_CR0_DSS_9 0x00000008 // 9 bit data +#define SSI_CR0_DSS_10 0x00000009 // 10 bit data +#define SSI_CR0_DSS_11 0x0000000A // 11 bit data +#define SSI_CR0_DSS_12 0x0000000B // 12 bit data +#define SSI_CR0_DSS_13 0x0000000C // 13 bit data +#define SSI_CR0_DSS_14 0x0000000D // 14 bit data +#define SSI_CR0_DSS_15 0x0000000E // 15 bit data +#define SSI_CR0_DSS_16 0x0000000F // 16 bit data + +//***************************************************************************** +// +// The following define the bit fields in the SSI Control register 1. +// +//***************************************************************************** +#define SSI_CR1_SOD 0x00000008 // Slave mode output disable +#define SSI_CR1_MS 0x00000004 // Master or slave mode select +#define SSI_CR1_SSE 0x00000002 // Sync serial port enable +#define SSI_CR1_LBM 0x00000001 // Loopback mode + +//***************************************************************************** +// +// The following define the bit fields in the SSI Status register. +// +//***************************************************************************** +#define SSI_SR_BSY 0x00000010 // SSI busy +#define SSI_SR_RFF 0x00000008 // RX FIFO full +#define SSI_SR_RNE 0x00000004 // RX FIFO not empty +#define SSI_SR_TNF 0x00000002 // TX FIFO not full +#define SSI_SR_TFE 0x00000001 // TX FIFO empty + +//***************************************************************************** +// +// The following define the bit fields in the SSI clock prescale register. +// +//***************************************************************************** +#define SSI_CPSR_CPSDVSR_MASK 0x000000FF // Clock prescale + +//***************************************************************************** +// +// The following define information concerning the SSI Data register. +// +//***************************************************************************** +#define TX_FIFO_SIZE (8) // Number of entries in the TX FIFO +#define RX_FIFO_SIZE (8) // Number of entries in the RX FIFO + +//***************************************************************************** +// +// The following define the bit fields in the interrupt mask set and clear, +// raw interrupt, masked interrupt, and interrupt clear registers. +// +//***************************************************************************** +#define SSI_INT_TXFF 0x00000008 // TX FIFO interrupt +#define SSI_INT_RXFF 0x00000004 // RX FIFO interrupt +#define SSI_INT_RXTO 0x00000002 // RX timeout interrupt +#define SSI_INT_RXOR 0x00000001 // RX overrun interrupt + +#endif // __HW_SSI_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_sysctl.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_sysctl.h new file mode 100644 index 000000000..6a2d6312b --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_sysctl.h @@ -0,0 +1,659 @@ +//***************************************************************************** +// +// hw_sysctl.h - Macros used when accessing the system control hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_SYSCTL_H__ +#define __HW_SYSCTL_H__ + +//***************************************************************************** +// +// The following define the addresses of the system control registers. +// +//***************************************************************************** +#define SYSCTL_DID0 0x400fe000 // Device identification register 0 +#define SYSCTL_DID1 0x400fe004 // Device identification register 1 +#define SYSCTL_DC0 0x400fe008 // Device capabilities register 0 +#define SYSCTL_DC1 0x400fe010 // Device capabilities register 1 +#define SYSCTL_DC2 0x400fe014 // Device capabilities register 2 +#define SYSCTL_DC3 0x400fe018 // Device capabilities register 3 +#define SYSCTL_DC4 0x400fe01C // Device capabilities register 4 +#define SYSCTL_PBORCTL 0x400fe030 // POR/BOR reset control register +#define SYSCTL_LDOPCTL 0x400fe034 // LDO power control register +#define SYSCTL_SRCR0 0x400fe040 // Software reset control reg 0 +#define SYSCTL_SRCR1 0x400fe044 // Software reset control reg 1 +#define SYSCTL_SRCR2 0x400fe048 // Software reset control reg 2 +#define SYSCTL_RIS 0x400fe050 // Raw interrupt status register +#define SYSCTL_IMC 0x400fe054 // Interrupt mask/control register +#define SYSCTL_MISC 0x400fe058 // Interrupt status register +#define SYSCTL_RESC 0x400fe05c // Reset cause register +#define SYSCTL_RCC 0x400fe060 // Run-mode clock config register +#define SYSCTL_PLLCFG 0x400fe064 // PLL configuration register +#define SYSCTL_RCC2 0x400fe070 // Run-mode clock config register 2 +#define SYSCTL_RCGC0 0x400fe100 // Run-mode clock gating register 0 +#define SYSCTL_RCGC1 0x400fe104 // Run-mode clock gating register 1 +#define SYSCTL_RCGC2 0x400fe108 // Run-mode clock gating register 2 +#define SYSCTL_SCGC0 0x400fe110 // Sleep-mode clock gating reg 0 +#define SYSCTL_SCGC1 0x400fe114 // Sleep-mode clock gating reg 1 +#define SYSCTL_SCGC2 0x400fe118 // Sleep-mode clock gating reg 2 +#define SYSCTL_DCGC0 0x400fe120 // Deep Sleep-mode clock gate reg 0 +#define SYSCTL_DCGC1 0x400fe124 // Deep Sleep-mode clock gate reg 1 +#define SYSCTL_DCGC2 0x400fe128 // Deep Sleep-mode clock gate reg 2 +#define SYSCTL_DSLPCLKCFG 0x400fe144 // Deep Sleep-mode clock config reg +#define SYSCTL_CLKVCLR 0x400fe150 // Clock verifcation clear register +#define SYSCTL_LDOARST 0x400fe160 // LDO reset control register +#define SYSCTL_USER0 0x400fe1e0 // NV User Register 0 +#define SYSCTL_USER1 0x400fe1e4 // NV User Register 1 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DID0 register. +// +//***************************************************************************** +#define SYSCTL_DID0_VER_MASK 0x70000000 // DID0 version mask +#define SYSCTL_DID0_VER_0 0x00000000 // DID0 version 0 +#define SYSCTL_DID0_VER_1 0x10000000 // DID0 version 1 +#define SYSCTL_DID0_CLASS_MASK 0x00FF0000 // Device Class +#define SYSCTL_DID0_CLASS_SANDSTORM 0x00000000 // LM3Snnn Sandstorm Device +#define SYSCTL_DID0_CLASS_FURY 0x00010000 // LM3Snnnn Fury Device +#define SYSCTL_DID0_MAJ_MASK 0x0000FF00 // Major revision mask +#define SYSCTL_DID0_MAJ_A 0x00000000 // Major revision A +#define SYSCTL_DID0_MAJ_B 0x00000100 // Major revision B +#define SYSCTL_DID0_MAJ_C 0x00000200 // Major revision C +#define SYSCTL_DID0_MIN_MASK 0x000000FF // Minor revision mask +#define SYSCTL_DID0_MIN_0 0x00000000 // Minor revision 0 +#define SYSCTL_DID0_MIN_1 0x00000001 // Minor revision 1 +#define SYSCTL_DID0_MIN_2 0x00000002 // Minor revision 2 +#define SYSCTL_DID0_MIN_3 0x00000003 // Minor revision 3 +#define SYSCTL_DID0_MIN_4 0x00000004 // Minor revision 4 +#define SYSCTL_DID0_MIN_5 0x00000005 // Minor revision 5 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DID1 register. +// +//***************************************************************************** +#define SYSCTL_DID1_VER_MASK 0xF0000000 // Register version mask +#define SYSCTL_DID1_FAM_MASK 0x0F000000 // Family mask +#define SYSCTL_DID1_FAM_S 0x00000000 // Stellaris family +#define SYSCTL_DID1_PRTNO_MASK 0x00FF0000 // Part number mask +#define SYSCTL_DID1_PRTNO_101 0x00010000 // LM3S101 +#define SYSCTL_DID1_PRTNO_102 0x00020000 // LM3S102 +#define SYSCTL_DID1_PRTNO_301 0x00110000 // LM3S301 +#define SYSCTL_DID1_PRTNO_310 0x00120000 // LM3S310 +#define SYSCTL_DID1_PRTNO_315 0x00130000 // LM3S315 +#define SYSCTL_DID1_PRTNO_316 0x00140000 // LM3S316 +#define SYSCTL_DID1_PRTNO_317 0x00170000 // LM3S317 +#define SYSCTL_DID1_PRTNO_328 0x00150000 // LM3S328 +#define SYSCTL_DID1_PRTNO_601 0x00210000 // LM3S601 +#define SYSCTL_DID1_PRTNO_610 0x00220000 // LM3S610 +#define SYSCTL_DID1_PRTNO_611 0x00230000 // LM3S611 +#define SYSCTL_DID1_PRTNO_612 0x00240000 // LM3S612 +#define SYSCTL_DID1_PRTNO_613 0x00250000 // LM3S613 +#define SYSCTL_DID1_PRTNO_615 0x00260000 // LM3S615 +#define SYSCTL_DID1_PRTNO_617 0x00280000 // LM3S617 +#define SYSCTL_DID1_PRTNO_618 0x00290000 // LM3S618 +#define SYSCTL_DID1_PRTNO_628 0x00270000 // LM3S628 +#define SYSCTL_DID1_PRTNO_801 0x00310000 // LM3S801 +#define SYSCTL_DID1_PRTNO_811 0x00320000 // LM3S811 +#define SYSCTL_DID1_PRTNO_812 0x00330000 // LM3S812 +#define SYSCTL_DID1_PRTNO_815 0x00340000 // LM3S815 +#define SYSCTL_DID1_PRTNO_817 0x00360000 // LM3S817 +#define SYSCTL_DID1_PRTNO_818 0x00370000 // LM3S818 +#define SYSCTL_DID1_PRTNO_828 0x00350000 // LM3S828 +#define SYSCTL_DID1_PRTNO_2110 0x00510000 // LM3S2110 +#define SYSCTL_DID1_PRTNO_2139 0x00840000 // LM3S2139 +#define SYSCTL_DID1_PRTNO_2410 0x00A20000 // LM3S2410 +#define SYSCTL_DID1_PRTNO_2412 0x00590000 // LM3S2412 +#define SYSCTL_DID1_PRTNO_2432 0x00560000 // LM3S2432 +#define SYSCTL_DID1_PRTNO_2533 0x005A0000 // LM3S2533 +#define SYSCTL_DID1_PRTNO_2620 0x00570000 // LM3S2620 +#define SYSCTL_DID1_PRTNO_2637 0x00850000 // LM3S2637 +#define SYSCTL_DID1_PRTNO_2651 0x00530000 // LM3S2651 +#define SYSCTL_DID1_PRTNO_2730 0x00A40000 // LM3S2730 +#define SYSCTL_DID1_PRTNO_2739 0x00520000 // LM3S2739 +#define SYSCTL_DID1_PRTNO_2939 0x00540000 // LM3S2939 +#define SYSCTL_DID1_PRTNO_2948 0x008F0000 // LM3S2948 +#define SYSCTL_DID1_PRTNO_2950 0x00580000 // LM3S2950 +#define SYSCTL_DID1_PRTNO_2965 0x00550000 // LM3S2965 +#define SYSCTL_DID1_PRTNO_6100 0x00A10000 // LM3S6100 +#define SYSCTL_DID1_PRTNO_6110 0x00740000 // LM3S6110 +#define SYSCTL_DID1_PRTNO_6420 0x00A50000 // LM3S6420 +#define SYSCTL_DID1_PRTNO_6422 0x00820000 // LM3S6422 +#define SYSCTL_DID1_PRTNO_6432 0x00750000 // LM3S6432 +#define SYSCTL_DID1_PRTNO_6610 0x00710000 // LM3S6610 +#define SYSCTL_DID1_PRTNO_6633 0x00830000 // LM3S6633 +#define SYSCTL_DID1_PRTNO_6637 0x008B0000 // LM3S6637 +#define SYSCTL_DID1_PRTNO_6730 0x00A30000 // LM3S6730 +#define SYSCTL_DID1_PRTNO_6938 0x00890000 // LM3S6938 +#define SYSCTL_DID1_PRTNO_6952 0x00780000 // LM3S6952 +#define SYSCTL_DID1_PRTNO_6965 0x00730000 // LM3S6965 +#define SYSCTL_DID1_PINCNT_MASK 0x0000E000 // Pin count +#define SYSCTL_DID1_PINCNT_100 0x00004000 // 100 pin package +#define SYSCTL_DID1_TEMP_MASK 0x000000E0 // Temperature range mask +#define SYSCTL_DID1_TEMP_C 0x00000000 // Commercial temp range (0..70C) +#define SYSCTL_DID1_TEMP_I 0x00000020 // Industrial temp range (-40..85C) +#define SYSCTL_DID1_PKG_MASK 0x00000018 // Package mask +#define SYSCTL_DID1_PKG_28SOIC 0x00000000 // 28-pin SOIC +#define SYSCTL_DID1_PKG_48QFP 0x00000008 // 48-pin QFP +#define SYSCTL_DID1_ROHS 0x00000004 // Part is RoHS compliant +#define SYSCTL_DID1_QUAL_MASK 0x00000003 // Qualification status mask +#define SYSCTL_DID1_QUAL_ES 0x00000000 // Engineering sample (unqualified) +#define SYSCTL_DID1_QUAL_PP 0x00000001 // Pilot production (unqualified) +#define SYSCTL_DID1_QUAL_FQ 0x00000002 // Fully qualified +#define SYSCTL_DID1_PRTNO_SHIFT 16 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC0 register. +// +//***************************************************************************** +#define SYSCTL_DC0_SRAMSZ_MASK 0xFFFF0000 // SRAM size mask +#define SYSCTL_DC0_SRAMSZ_2KB 0x00070000 // 2 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_4KB 0x000F0000 // 4 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_8KB 0x001F0000 // 8 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_16KB 0x003F0000 // 16 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_32KB 0x007F0000 // 32 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_64KB 0x00FF0000 // 64 KB of SRAM +#define SYSCTL_DC0_FLASHSZ_MASK 0x0000FFFF // Flash size mask +#define SYSCTL_DC0_FLASHSZ_8KB 0x00000003 // 8 KB of flash +#define SYSCTL_DC0_FLASHSZ_16KB 0x00000007 // 16 KB of flash +#define SYSCTL_DC0_FLASHSZ_32KB 0x0000000F // 32 KB of flash +#define SYSCTL_DC0_FLASHSZ_64KB 0x0000001F // 64 KB of flash +#define SYSCTL_DC0_FLASHSZ_96KB 0x0000002F // 96 KB of flash +#define SYSCTL_DC0_FLASHSZ_128K 0x0000003F // 128 KB of flash +#define SYSCTL_DC0_FLASHSZ_256K 0x0000007F // 256 KB of flash + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC1 register. +// +//***************************************************************************** +#define SYSCTL_DC1_CAN1 0x02000000 // CAN1 module present +#define SYSCTL_DC1_CAN0 0x01000000 // CAN0 module present +#define SYSCTL_DC1_PWM 0x00100000 // PWM module present +#define SYSCTL_DC1_ADC 0x00010000 // ADC module present +#define SYSCTL_DC1_SYSDIV_MASK 0x0000F000 // Minimum system divider mask +#define SYSCTL_DC1_ADCSPD_MASK 0x00000F00 // ADC speed mask +#define SYSCTL_DC1_ADCSPD_1M 0x00000300 // 1Msps ADC +#define SYSCTL_DC1_ADCSPD_500K 0x00000200 // 500Ksps ADC +#define SYSCTL_DC1_ADCSPD_250K 0x00000100 // 250Ksps ADC +#define SYSCTL_DC1_ADCSPD_125K 0x00000000 // 125Ksps ADC +#define SYSCTL_DC1_MPU 0x00000080 // Cortex M3 MPU present +#define SYSCTL_DC1_HIB 0x00000040 // Hibernation module present +#define SYSCTL_DC1_TEMP 0x00000020 // Temperature sensor present +#define SYSCTL_DC1_PLL 0x00000010 // PLL present +#define SYSCTL_DC1_WDOG 0x00000008 // Watchdog present +#define SYSCTL_DC1_SWO 0x00000004 // Serial wire output present +#define SYSCTL_DC1_SWD 0x00000002 // Serial wire debug present +#define SYSCTL_DC1_JTAG 0x00000001 // JTAG debug present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC2 register. +// +//***************************************************************************** +#define SYSCTL_DC2_COMP2 0x04000000 // Analog comparator 2 present +#define SYSCTL_DC2_COMP1 0x02000000 // Analog comparator 1 present +#define SYSCTL_DC2_COMP0 0x01000000 // Analog comparator 0 present +#define SYSCTL_DC2_TIMER3 0x00080000 // Timer 3 present +#define SYSCTL_DC2_TIMER2 0x00040000 // Timer 2 present +#define SYSCTL_DC2_TIMER1 0x00020000 // Timer 1 present +#define SYSCTL_DC2_TIMER0 0x00010000 // Timer 0 present +#define SYSCTL_DC2_I2C1 0x00002000 // I2C 1 present +#define SYSCTL_DC2_I2C0 0x00001000 // I2C 0 present +#ifndef DEPRECATED +#define SYSCTL_DC2_I2C 0x00001000 // I2C present +#endif +#define SYSCTL_DC2_QEI1 0x00000200 // QEI 1 present +#define SYSCTL_DC2_QEI0 0x00000100 // QEI 0 present +#ifndef DEPRECATED +#define SYSCTL_DC2_QEI 0x00000100 // QEI present +#endif +#define SYSCTL_DC2_SSI1 0x00000020 // SSI 1 present +#define SYSCTL_DC2_SSI0 0x00000010 // SSI 0 present +#ifndef DEPRECATED +#define SYSCTL_DC2_SSI 0x00000010 // SSI present +#endif +#define SYSCTL_DC2_UART2 0x00000004 // UART 2 present +#define SYSCTL_DC2_UART1 0x00000002 // UART 1 present +#define SYSCTL_DC2_UART0 0x00000001 // UART 0 present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC3 register. +// +//***************************************************************************** +#define SYSCTL_DC3_32KHZ 0x80000000 // 32kHz pin present +#define SYSCTL_DC3_CCP5 0x20000000 // CCP5 pin present +#define SYSCTL_DC3_CCP4 0x10000000 // CCP4 pin present +#define SYSCTL_DC3_CCP3 0x08000000 // CCP3 pin present +#define SYSCTL_DC3_CCP2 0x04000000 // CCP2 pin present +#define SYSCTL_DC3_CCP1 0x02000000 // CCP1 pin present +#define SYSCTL_DC3_CCP0 0x01000000 // CCP0 pin present +#define SYSCTL_DC3_ADC7 0x00800000 // ADC7 pin present +#define SYSCTL_DC3_ADC6 0x00400000 // ADC6 pin present +#define SYSCTL_DC3_ADC5 0x00200000 // ADC5 pin present +#define SYSCTL_DC3_ADC4 0x00100000 // ADC4 pin present +#define SYSCTL_DC3_ADC3 0x00080000 // ADC3 pin present +#define SYSCTL_DC3_ADC2 0x00040000 // ADC2 pin present +#define SYSCTL_DC3_ADC1 0x00020000 // ADC1 pin present +#define SYSCTL_DC3_ADC0 0x00010000 // ADC0 pin present +#define SYSCTL_DC3_MC_FAULT0 0x00008000 // MC0 fault pin present +#define SYSCTL_DC3_C2O 0x00004000 // C2o pin present +#define SYSCTL_DC3_C2PLUS 0x00002000 // C2+ pin present +#define SYSCTL_DC3_C2MINUS 0x00001000 // C2- pin present +#define SYSCTL_DC3_C1O 0x00000800 // C1o pin present +#define SYSCTL_DC3_C1PLUS 0x00000400 // C1+ pin present +#define SYSCTL_DC3_C1MINUS 0x00000200 // C1- pin present +#define SYSCTL_DC3_C0O 0x00000100 // C0o pin present +#define SYSCTL_DC3_C0PLUS 0x00000080 // C0+ pin present +#define SYSCTL_DC3_C0MINUS 0x00000040 // C0- pin present +#define SYSCTL_DC3_PWM5 0x00000020 // PWM5 pin present +#define SYSCTL_DC3_PWM4 0x00000010 // PWM4 pin present +#define SYSCTL_DC3_PWM3 0x00000008 // PWM3 pin present +#define SYSCTL_DC3_PWM2 0x00000004 // PWM2 pin present +#define SYSCTL_DC3_PWM1 0x00000002 // PWM1 pin present +#define SYSCTL_DC3_PWM0 0x00000001 // PWM0 pin present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC4 register. +// +//***************************************************************************** +#define SYSCTL_DC4_ETH 0x50000000 // Ethernet present +#define SYSCTL_DC4_GPIOH 0x00000080 // GPIO port H present +#define SYSCTL_DC4_GPIOG 0x00000040 // GPIO port G present +#define SYSCTL_DC4_GPIOF 0x00000020 // GPIO port F present +#define SYSCTL_DC4_GPIOE 0x00000010 // GPIO port E present +#define SYSCTL_DC4_GPIOD 0x00000008 // GPIO port D present +#define SYSCTL_DC4_GPIOC 0x00000004 // GPIO port C present +#define SYSCTL_DC4_GPIOB 0x00000002 // GPIO port B present +#define SYSCTL_DC4_GPIOA 0x00000001 // GPIO port A present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_PBORCTL register. +// +//***************************************************************************** +#define SYSCTL_PBORCTL_BOR_MASK 0x0000FFFC // BOR wait timer +#define SYSCTL_PBORCTL_BORIOR 0x00000002 // BOR interrupt or reset +#define SYSCTL_PBORCTL_BORWT 0x00000001 // BOR wait and check for noise +#define SYSCTL_PBORCTL_BOR_SH 2 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_LDOPCTL register. +// +//***************************************************************************** +#define SYSCTL_LDOPCTL_MASK 0x0000003F // Voltage adjust mask +#define SYSCTL_LDOPCTL_2_25V 0x00000005 // LDO output of 2.25V +#define SYSCTL_LDOPCTL_2_30V 0x00000004 // LDO output of 2.30V +#define SYSCTL_LDOPCTL_2_35V 0x00000003 // LDO output of 2.35V +#define SYSCTL_LDOPCTL_2_40V 0x00000002 // LDO output of 2.40V +#define SYSCTL_LDOPCTL_2_45V 0x00000001 // LDO output of 2.45V +#define SYSCTL_LDOPCTL_2_50V 0x00000000 // LDO output of 2.50V +#define SYSCTL_LDOPCTL_2_55V 0x0000001F // LDO output of 2.55V +#define SYSCTL_LDOPCTL_2_60V 0x0000001E // LDO output of 2.60V +#define SYSCTL_LDOPCTL_2_65V 0x0000001D // LDO output of 2.65V +#define SYSCTL_LDOPCTL_2_70V 0x0000001C // LDO output of 2.70V +#define SYSCTL_LDOPCTL_2_75V 0x0000001B // LDO output of 2.75V + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR0, SYSCTL_RCGC0, +// SYSCTL_SCGC0, and SYSCTL_DCGC0 registers. +// +//***************************************************************************** +#define SYSCTL_SET0_CAN1 0x02000000 // CAN 1 module +#define SYSCTL_SET0_CAN0 0x01000000 // CAN 0 module +#define SYSCTL_SET0_PWM 0x00100000 // PWM module +#define SYSCTL_SET0_ADC 0x00010000 // ADC module +#define SYSCTL_SET0_ADCSPD_MASK 0x00000F00 // ADC speed mask +#define SYSCTL_SET0_ADCSPD_1M 0x00000300 // 1Msps ADC +#define SYSCTL_SET0_ADCSPD_500K 0x00000200 // 500Ksps ADC +#define SYSCTL_SET0_ADCSPD_250K 0x00000100 // 250Ksps ADC +#define SYSCTL_SET0_ADCSPD_125K 0x00000000 // 125Ksps ADC +#define SYSCTL_SET0_HIB 0x00000040 // Hibernation module +#define SYSCTL_SET0_WDOG 0x00000008 // Watchdog module + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR1, SYSCTL_RCGC1, +// SYSCTL_SCGC1, and SYSCTL_DCGC1 registers. +// +//***************************************************************************** +#define SYSCTL_SET1_COMP2 0x04000000 // Analog comparator module 2 +#define SYSCTL_SET1_COMP1 0x02000000 // Analog comparator module 1 +#define SYSCTL_SET1_COMP0 0x01000000 // Analog comparator module 0 +#define SYSCTL_SET1_TIMER3 0x00080000 // Timer module 3 +#define SYSCTL_SET1_TIMER2 0x00040000 // Timer module 2 +#define SYSCTL_SET1_TIMER1 0x00020000 // Timer module 1 +#define SYSCTL_SET1_TIMER0 0x00010000 // Timer module 0 +#define SYSCTL_SET1_I2C1 0x00002000 // I2C module 1 +#define SYSCTL_SET1_I2C0 0x00001000 // I2C module 0 +#ifndef DEPRECATED +#define SYSCTL_SET1_I2C 0x00001000 // I2C module +#endif +#define SYSCTL_SET1_QEI1 0x00000200 // QEI module 1 +#define SYSCTL_SET1_QEI0 0x00000100 // QEI module 0 +#ifndef DEPRECATED +#define SYSCTL_SET1_QEI 0x00000100 // QEI module +#endif +#define SYSCTL_SET1_SSI1 0x00000020 // SSI module 1 +#define SYSCTL_SET1_SSI0 0x00000010 // SSI module 0 +#ifndef DEPRECATED +#define SYSCTL_SET1_SSI 0x00000010 // SSI module +#endif +#define SYSCTL_SET1_UART2 0x00000004 // UART module 2 +#define SYSCTL_SET1_UART1 0x00000002 // UART module 1 +#define SYSCTL_SET1_UART0 0x00000001 // UART module 0 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR2, SYSCTL_RCGC2, +// SYSCTL_SCGC2, and SYSCTL_DCGC2 registers. +// +//***************************************************************************** +#define SYSCTL_SET2_ETH 0x50000000 // ETH module +#define SYSCTL_SET2_GPIOH 0x00000080 // GPIO H module +#define SYSCTL_SET2_GPIOG 0x00000040 // GPIO G module +#define SYSCTL_SET2_GPIOF 0x00000020 // GPIO F module +#define SYSCTL_SET2_GPIOE 0x00000010 // GPIO E module +#define SYSCTL_SET2_GPIOD 0x00000008 // GPIO D module +#define SYSCTL_SET2_GPIOC 0x00000004 // GPIO C module +#define SYSCTL_SET2_GPIOB 0x00000002 // GPIO B module +#define SYSCTL_SET2_GPIOA 0x00000001 // GIPO A module + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RIS, SYSCTL_IMC, and +// SYSCTL_IMS registers. +// +//***************************************************************************** +#define SYSCTL_INT_PLL_LOCK 0x00000040 // PLL lock interrupt +#define SYSCTL_INT_CUR_LIMIT 0x00000020 // Current limit interrupt +#define SYSCTL_INT_IOSC_FAIL 0x00000010 // Internal oscillator failure int +#define SYSCTL_INT_MOSC_FAIL 0x00000008 // Main oscillator failure int +#define SYSCTL_INT_POR 0x00000004 // Power on reset interrupt +#define SYSCTL_INT_BOR 0x00000002 // Brown out interrupt +#define SYSCTL_INT_PLL_FAIL 0x00000001 // PLL failure interrupt + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RESC register. +// +//***************************************************************************** +#define SYSCTL_RESC_LDO 0x00000020 // LDO power OK lost reset +#define SYSCTL_RESC_SW 0x00000010 // Software reset +#define SYSCTL_RESC_WDOG 0x00000008 // Watchdog reset +#define SYSCTL_RESC_BOR 0x00000004 // Brown-out reset +#define SYSCTL_RESC_POR 0x00000002 // Power on reset +#define SYSCTL_RESC_EXT 0x00000001 // External reset + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RCC register. +// +//***************************************************************************** +#define SYSCTL_RCC_ACG 0x08000000 // Automatic clock gating +#define SYSCTL_RCC_SYSDIV_MASK 0x07800000 // System clock divider +#define SYSCTL_RCC_SYSDIV_2 0x00800000 // System clock /2 +#define SYSCTL_RCC_SYSDIV_3 0x01000000 // System clock /3 +#define SYSCTL_RCC_SYSDIV_4 0x01800000 // System clock /4 +#define SYSCTL_RCC_SYSDIV_5 0x02000000 // System clock /5 +#define SYSCTL_RCC_SYSDIV_6 0x02800000 // System clock /6 +#define SYSCTL_RCC_SYSDIV_7 0x03000000 // System clock /7 +#define SYSCTL_RCC_SYSDIV_8 0x03800000 // System clock /8 +#define SYSCTL_RCC_SYSDIV_9 0x04000000 // System clock /9 +#define SYSCTL_RCC_SYSDIV_10 0x04800000 // System clock /10 +#define SYSCTL_RCC_SYSDIV_11 0x05000000 // System clock /11 +#define SYSCTL_RCC_SYSDIV_12 0x05800000 // System clock /12 +#define SYSCTL_RCC_SYSDIV_13 0x06000000 // System clock /13 +#define SYSCTL_RCC_SYSDIV_14 0x06800000 // System clock /14 +#define SYSCTL_RCC_SYSDIV_15 0x07000000 // System clock /15 +#define SYSCTL_RCC_SYSDIV_16 0x07800000 // System clock /16 +#define SYSCTL_RCC_USE_SYSDIV 0x00400000 // Use sytem clock divider +#define SYSCTL_RCC_USE_PWMDIV 0x00100000 // Use PWM clock divider +#define SYSCTL_RCC_PWMDIV_MASK 0x000E0000 // PWM clock divider +#define SYSCTL_RCC_PWMDIV_2 0x00000000 // PWM clock /2 +#define SYSCTL_RCC_PWMDIV_4 0x00020000 // PWM clock /4 +#define SYSCTL_RCC_PWMDIV_8 0x00040000 // PWM clock /8 +#define SYSCTL_RCC_PWMDIV_16 0x00060000 // PWM clock /16 +#define SYSCTL_RCC_PWMDIV_32 0x00080000 // PWM clock /32 +#define SYSCTL_RCC_PWMDIV_64 0x000A0000 // PWM clock /64 +#define SYSCTL_RCC_PWRDN 0x00002000 // PLL power down +#define SYSCTL_RCC_OE 0x00001000 // PLL output enable +#define SYSCTL_RCC_BYPASS 0x00000800 // PLL bypass +#define SYSCTL_RCC_PLLVER 0x00000400 // PLL verification timer enable +#define SYSCTL_RCC_XTAL_MASK 0x000003C0 // Crystal attached to main osc +#define SYSCTL_RCC_XTAL_3_57MHZ 0x00000100 // Using a 3.579545MHz crystal +#define SYSCTL_RCC_XTAL_3_68MHz 0x00000140 // Using a 3.6864MHz crystal +#define SYSCTL_RCC_XTAL_4MHz 0x00000180 // Using a 4MHz crystal +#define SYSCTL_RCC_XTAL_4_09MHZ 0x000001C0 // Using a 4.096MHz crystal +#define SYSCTL_RCC_XTAL_4_91MHZ 0x00000200 // Using a 4.9152MHz crystal +#define SYSCTL_RCC_XTAL_5MHZ 0x00000240 // Using a 5MHz crystal +#define SYSCTL_RCC_XTAL_5_12MHZ 0x00000280 // Using a 5.12MHz crystal +#define SYSCTL_RCC_XTAL_6MHZ 0x000002C0 // Using a 6MHz crystal +#define SYSCTL_RCC_XTAL_6_14MHZ 0x00000300 // Using a 6.144MHz crystal +#define SYSCTL_RCC_XTAL_7_37MHZ 0x00000340 // Using a 7.3728MHz crystal +#define SYSCTL_RCC_XTAL_8MHZ 0x00000380 // Using a 8MHz crystal +#define SYSCTL_RCC_XTAL_8_19MHZ 0x000003C0 // Using a 8.192MHz crystal +#define SYSCTL_RCC_OSCSRC_MASK 0x00000030 // Oscillator input select +#define SYSCTL_RCC_OSCSRC_MAIN 0x00000000 // Use the main oscillator +#define SYSCTL_RCC_OSCSRC_INT 0x00000010 // Use the internal oscillator +#define SYSCTL_RCC_OSCSRC_INT4 0x00000020 // Use the internal oscillator / 4 +#define SYSCTL_RCC_IOSCVER 0x00000008 // Int. osc. verification timer en +#define SYSCTL_RCC_MOSCVER 0x00000004 // Main osc. verification timer en +#define SYSCTL_RCC_IOSCDIS 0x00000002 // Internal oscillator disable +#define SYSCTL_RCC_MOSCDIS 0x00000001 // Main oscillator disable +#define SYSCTL_RCC_SYSDIV_SHIFT 23 // Shift to the SYSDIV field +#define SYSCTL_RCC_PWMDIV_SHIFT 17 // Shift to the PWMDIV field +#define SYSCTL_RCC_XTAL_SHIFT 6 // Shift to the XTAL field +#define SYSCTL_RCC_OSCSRC_SHIFT 4 // Shift to the OSCSRC field + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_PLLCFG register. +// +//***************************************************************************** +#define SYSCTL_PLLCFG_OD_MASK 0x0000C000 // Output divider +#define SYSCTL_PLLCFG_OD_1 0x00000000 // Output divider is 1 +#define SYSCTL_PLLCFG_OD_2 0x00004000 // Output divider is 2 +#define SYSCTL_PLLCFG_OD_4 0x00008000 // Output divider is 4 +#define SYSCTL_PLLCFG_F_MASK 0x00003FE0 // PLL multiplier +#define SYSCTL_PLLCFG_R_MASK 0x0000001F // Input predivider +#define SYSCTL_PLLCFG_F_SHIFT 5 +#define SYSCTL_PLLCFG_R_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RCC2 register. +// +//***************************************************************************** +#define SYSCTL_RCC2_USERCC2 0x80000000 // Use RCC2 +#define SYSCTL_RCC2_SYSDIV2_MSK 0x1F800000 // System clock divider +#define SYSCTL_RCC2_SYSDIV2_2 0x00800000 // System clock /2 +#define SYSCTL_RCC2_SYSDIV2_3 0x01000000 // System clock /3 +#define SYSCTL_RCC2_SYSDIV2_4 0x01800000 // System clock /4 +#define SYSCTL_RCC2_SYSDIV2_5 0x02000000 // System clock /5 +#define SYSCTL_RCC2_SYSDIV2_6 0x02800000 // System clock /6 +#define SYSCTL_RCC2_SYSDIV2_7 0x03000000 // System clock /7 +#define SYSCTL_RCC2_SYSDIV2_8 0x03800000 // System clock /8 +#define SYSCTL_RCC2_SYSDIV2_9 0x04000000 // System clock /9 +#define SYSCTL_RCC2_SYSDIV2_10 0x04800000 // System clock /10 +#define SYSCTL_RCC2_SYSDIV2_11 0x05000000 // System clock /11 +#define SYSCTL_RCC2_SYSDIV2_12 0x05800000 // System clock /12 +#define SYSCTL_RCC2_SYSDIV2_13 0x06000000 // System clock /13 +#define SYSCTL_RCC2_SYSDIV2_14 0x06800000 // System clock /14 +#define SYSCTL_RCC2_SYSDIV2_15 0x07000000 // System clock /15 +#define SYSCTL_RCC2_SYSDIV2_16 0x07800000 // System clock /16 +#define SYSCTL_RCC2_SYSDIV2_17 0x08000000 // System clock /17 +#define SYSCTL_RCC2_SYSDIV2_18 0x08800000 // System clock /18 +#define SYSCTL_RCC2_SYSDIV2_19 0x09000000 // System clock /19 +#define SYSCTL_RCC2_SYSDIV2_20 0x09800000 // System clock /20 +#define SYSCTL_RCC2_SYSDIV2_21 0x0A000000 // System clock /21 +#define SYSCTL_RCC2_SYSDIV2_22 0x0A800000 // System clock /22 +#define SYSCTL_RCC2_SYSDIV2_23 0x0B000000 // System clock /23 +#define SYSCTL_RCC2_SYSDIV2_24 0x0B800000 // System clock /24 +#define SYSCTL_RCC2_SYSDIV2_25 0x0C000000 // System clock /25 +#define SYSCTL_RCC2_SYSDIV2_26 0x0C800000 // System clock /26 +#define SYSCTL_RCC2_SYSDIV2_27 0x0D000000 // System clock /27 +#define SYSCTL_RCC2_SYSDIV2_28 0x0D800000 // System clock /28 +#define SYSCTL_RCC2_SYSDIV2_29 0x0E000000 // System clock /29 +#define SYSCTL_RCC2_SYSDIV2_30 0x0E800000 // System clock /30 +#define SYSCTL_RCC2_SYSDIV2_31 0x0F000000 // System clock /31 +#define SYSCTL_RCC2_SYSDIV2_32 0x0F800000 // System clock /32 +#define SYSCTL_RCC2_SYSDIV2_33 0x10000000 // System clock /33 +#define SYSCTL_RCC2_SYSDIV2_34 0x10800000 // System clock /34 +#define SYSCTL_RCC2_SYSDIV2_35 0x11000000 // System clock /35 +#define SYSCTL_RCC2_SYSDIV2_36 0x11800000 // System clock /36 +#define SYSCTL_RCC2_SYSDIV2_37 0x12000000 // System clock /37 +#define SYSCTL_RCC2_SYSDIV2_38 0x12800000 // System clock /38 +#define SYSCTL_RCC2_SYSDIV2_39 0x13000000 // System clock /39 +#define SYSCTL_RCC2_SYSDIV2_40 0x13800000 // System clock /40 +#define SYSCTL_RCC2_SYSDIV2_41 0x14000000 // System clock /41 +#define SYSCTL_RCC2_SYSDIV2_42 0x14800000 // System clock /42 +#define SYSCTL_RCC2_SYSDIV2_43 0x15000000 // System clock /43 +#define SYSCTL_RCC2_SYSDIV2_44 0x15800000 // System clock /44 +#define SYSCTL_RCC2_SYSDIV2_45 0x16000000 // System clock /45 +#define SYSCTL_RCC2_SYSDIV2_46 0x16800000 // System clock /46 +#define SYSCTL_RCC2_SYSDIV2_47 0x17000000 // System clock /47 +#define SYSCTL_RCC2_SYSDIV2_48 0x17800000 // System clock /48 +#define SYSCTL_RCC2_SYSDIV2_49 0x18000000 // System clock /49 +#define SYSCTL_RCC2_SYSDIV2_50 0x18800000 // System clock /50 +#define SYSCTL_RCC2_SYSDIV2_51 0x19000000 // System clock /51 +#define SYSCTL_RCC2_SYSDIV2_52 0x19800000 // System clock /52 +#define SYSCTL_RCC2_SYSDIV2_53 0x1A000000 // System clock /53 +#define SYSCTL_RCC2_SYSDIV2_54 0x1A800000 // System clock /54 +#define SYSCTL_RCC2_SYSDIV2_55 0x1B000000 // System clock /55 +#define SYSCTL_RCC2_SYSDIV2_56 0x1B800000 // System clock /56 +#define SYSCTL_RCC2_SYSDIV2_57 0x1C000000 // System clock /57 +#define SYSCTL_RCC2_SYSDIV2_58 0x1C800000 // System clock /58 +#define SYSCTL_RCC2_SYSDIV2_59 0x1D000000 // System clock /59 +#define SYSCTL_RCC2_SYSDIV2_60 0x1D800000 // System clock /60 +#define SYSCTL_RCC2_SYSDIV2_61 0x1E000000 // System clock /61 +#define SYSCTL_RCC2_SYSDIV2_62 0x1E800000 // System clock /62 +#define SYSCTL_RCC2_SYSDIV2_63 0x1F000000 // System clock /63 +#define SYSCTL_RCC2_SYSDIV2_64 0x1F800000 // System clock /64 +#define SYSCTL_RCC2_PWRDN2 0x00002000 // PLL power down +#define SYSCTL_RCC2_BYPASS2 0x00000800 // PLL bypass +#define SYSCTL_RCC2_OSCSRC2_MSK 0x00000070 // Oscillator input select +#define SYSCTL_RCC2_OSCSRC2_MO 0x00000000 // Use the main oscillator +#define SYSCTL_RCC2_OSCSRC2_IO 0x00000010 // Use the internal oscillator +#define SYSCTL_RCC2_OSCSRC2_IO4 0x00000020 // Use the internal oscillator / 4 +#define SYSCTL_RCC2_OSCSRC2_30 0x00000030 // Use the 30 KHz internal osc. +#define SYSCTL_RCC2_OSCSRC2_32 0x00000070 // Use the 32 KHz external osc. + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DSLPCLKCFG register. +// +//***************************************************************************** +#define SYSCTL_DSLPCLKCFG_D_MSK 0x1f800000 // Deep sleep system clock override +#define SYSCTL_DSLPCLKCFG_D_2 0x00800000 // System clock /2 +#define SYSCTL_DSLPCLKCFG_D_3 0x01000000 // System clock /3 +#define SYSCTL_DSLPCLKCFG_D_4 0x01800000 // System clock /4 +#define SYSCTL_DSLPCLKCFG_D_5 0x02000000 // System clock /5 +#define SYSCTL_DSLPCLKCFG_D_6 0x02800000 // System clock /6 +#define SYSCTL_DSLPCLKCFG_D_7 0x03000000 // System clock /7 +#define SYSCTL_DSLPCLKCFG_D_8 0x03800000 // System clock /8 +#define SYSCTL_DSLPCLKCFG_D_9 0x04000000 // System clock /9 +#define SYSCTL_DSLPCLKCFG_D_10 0x04800000 // System clock /10 +#define SYSCTL_DSLPCLKCFG_D_11 0x05000000 // System clock /11 +#define SYSCTL_DSLPCLKCFG_D_12 0x05800000 // System clock /12 +#define SYSCTL_DSLPCLKCFG_D_13 0x06000000 // System clock /13 +#define SYSCTL_DSLPCLKCFG_D_14 0x06800000 // System clock /14 +#define SYSCTL_DSLPCLKCFG_D_15 0x07000000 // System clock /15 +#define SYSCTL_DSLPCLKCFG_D_16 0x07800000 // System clock /16 +#define SYSCTL_DSLPCLKCFG_D_17 0x08000000 // System clock /17 +#define SYSCTL_DSLPCLKCFG_D_18 0x08800000 // System clock /18 +#define SYSCTL_DSLPCLKCFG_D_19 0x09000000 // System clock /19 +#define SYSCTL_DSLPCLKCFG_D_20 0x09800000 // System clock /20 +#define SYSCTL_DSLPCLKCFG_D_21 0x0A000000 // System clock /21 +#define SYSCTL_DSLPCLKCFG_D_22 0x0A800000 // System clock /22 +#define SYSCTL_DSLPCLKCFG_D_23 0x0B000000 // System clock /23 +#define SYSCTL_DSLPCLKCFG_D_24 0x0B800000 // System clock /24 +#define SYSCTL_DSLPCLKCFG_D_25 0x0C000000 // System clock /25 +#define SYSCTL_DSLPCLKCFG_D_26 0x0C800000 // System clock /26 +#define SYSCTL_DSLPCLKCFG_D_27 0x0D000000 // System clock /27 +#define SYSCTL_DSLPCLKCFG_D_28 0x0D800000 // System clock /28 +#define SYSCTL_DSLPCLKCFG_D_29 0x0E000000 // System clock /29 +#define SYSCTL_DSLPCLKCFG_D_30 0x0E800000 // System clock /30 +#define SYSCTL_DSLPCLKCFG_D_31 0x0F000000 // System clock /31 +#define SYSCTL_DSLPCLKCFG_D_32 0x0F800000 // System clock /32 +#define SYSCTL_DSLPCLKCFG_D_33 0x10000000 // System clock /33 +#define SYSCTL_DSLPCLKCFG_D_34 0x10800000 // System clock /34 +#define SYSCTL_DSLPCLKCFG_D_35 0x11000000 // System clock /35 +#define SYSCTL_DSLPCLKCFG_D_36 0x11800000 // System clock /36 +#define SYSCTL_DSLPCLKCFG_D_37 0x12000000 // System clock /37 +#define SYSCTL_DSLPCLKCFG_D_38 0x12800000 // System clock /38 +#define SYSCTL_DSLPCLKCFG_D_39 0x13000000 // System clock /39 +#define SYSCTL_DSLPCLKCFG_D_40 0x13800000 // System clock /40 +#define SYSCTL_DSLPCLKCFG_D_41 0x14000000 // System clock /41 +#define SYSCTL_DSLPCLKCFG_D_42 0x14800000 // System clock /42 +#define SYSCTL_DSLPCLKCFG_D_43 0x15000000 // System clock /43 +#define SYSCTL_DSLPCLKCFG_D_44 0x15800000 // System clock /44 +#define SYSCTL_DSLPCLKCFG_D_45 0x16000000 // System clock /45 +#define SYSCTL_DSLPCLKCFG_D_46 0x16800000 // System clock /46 +#define SYSCTL_DSLPCLKCFG_D_47 0x17000000 // System clock /47 +#define SYSCTL_DSLPCLKCFG_D_48 0x17800000 // System clock /48 +#define SYSCTL_DSLPCLKCFG_D_49 0x18000000 // System clock /49 +#define SYSCTL_DSLPCLKCFG_D_50 0x18800000 // System clock /50 +#define SYSCTL_DSLPCLKCFG_D_51 0x19000000 // System clock /51 +#define SYSCTL_DSLPCLKCFG_D_52 0x19800000 // System clock /52 +#define SYSCTL_DSLPCLKCFG_D_53 0x1A000000 // System clock /53 +#define SYSCTL_DSLPCLKCFG_D_54 0x1A800000 // System clock /54 +#define SYSCTL_DSLPCLKCFG_D_55 0x1B000000 // System clock /55 +#define SYSCTL_DSLPCLKCFG_D_56 0x1B800000 // System clock /56 +#define SYSCTL_DSLPCLKCFG_D_57 0x1C000000 // System clock /57 +#define SYSCTL_DSLPCLKCFG_D_58 0x1C800000 // System clock /58 +#define SYSCTL_DSLPCLKCFG_D_59 0x1D000000 // System clock /59 +#define SYSCTL_DSLPCLKCFG_D_60 0x1D800000 // System clock /60 +#define SYSCTL_DSLPCLKCFG_D_61 0x1E000000 // System clock /61 +#define SYSCTL_DSLPCLKCFG_D_62 0x1E800000 // System clock /62 +#define SYSCTL_DSLPCLKCFG_D_63 0x1F000000 // System clock /63 +#define SYSCTL_DSLPCLKCFG_D_64 0x1F800000 // System clock /64 +#define SYSCTL_DSLPCLKCFG_O_MSK 0x00000070 // Deep sleep oscillator override +#define SYSCTL_DSLPCLKCFG_O_IGN 0x00000000 // Do not override +#define SYSCTL_DSLPCLKCFG_O_IO 0x00000010 // Use the internal oscillator +#define SYSCTL_DSLPCLKCFG_O_30 0x00000030 // Use the 30 KHz internal osc. +#define SYSCTL_DSLPCLKCFG_O_32 0x00000070 // Use the 32 KHz external osc. + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_CLKVCLR register. +// +//***************************************************************************** +#define SYSCTL_CLKVCLR_CLR 0x00000001 // Clear clock verification fault + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_LDOARST register. +// +//***************************************************************************** +#define SYSCTL_LDOARST_ARST 0x00000001 // Allow LDO to reset device + +#endif // __HW_SYSCTL_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_timer.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_timer.h new file mode 100644 index 000000000..eb58abf65 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_timer.h @@ -0,0 +1,235 @@ +//***************************************************************************** +// +// hw_timer.h - Defines and macros used when accessing the timer. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_TIMER_H__ +#define __HW_TIMER_H__ + +//***************************************************************************** +// +// The following define the offsets of the timer registers. +// +//***************************************************************************** +#define TIMER_O_CFG 0x00000000 // Configuration register +#define TIMER_O_TAMR 0x00000004 // TimerA mode register +#define TIMER_O_TBMR 0x00000008 // TimerB mode register +#define TIMER_O_CTL 0x0000000C // Control register +#define TIMER_O_IMR 0x00000018 // Interrupt mask register +#define TIMER_O_RIS 0x0000001C // Interrupt status register +#define TIMER_O_MIS 0x00000020 // Masked interrupt status reg. +#define TIMER_O_ICR 0x00000024 // Interrupt clear register +#define TIMER_O_TAILR 0x00000028 // TimerA interval load register +#define TIMER_O_TBILR 0x0000002C // TimerB interval load register +#define TIMER_O_TAMATCHR 0x00000030 // TimerA match register +#define TIMER_O_TBMATCHR 0x00000034 // TimerB match register +#define TIMER_O_TAPR 0x00000038 // TimerA prescale register +#define TIMER_O_TBPR 0x0000003C // TimerB prescale register +#define TIMER_O_TAPMR 0x00000040 // TimerA prescale match register +#define TIMER_O_TBPMR 0x00000044 // TimerB prescale match register +#define TIMER_O_TAR 0x00000048 // TimerA register +#define TIMER_O_TBR 0x0000004C // TimerB register + +//***************************************************************************** +// +// The following define the reset values of the timer registers. +// +//***************************************************************************** +#define TIMER_RV_CFG 0x00000000 // Configuration register RV +#define TIMER_RV_TAMR 0x00000000 // TimerA mode register RV +#define TIMER_RV_TBMR 0x00000000 // TimerB mode register RV +#define TIMER_RV_CTL 0x00000000 // Control register RV +#define TIMER_RV_IMR 0x00000000 // Interrupt mask register RV +#define TIMER_RV_RIS 0x00000000 // Interrupt status register RV +#define TIMER_RV_MIS 0x00000000 // Masked interrupt status reg RV +#define TIMER_RV_ICR 0x00000000 // Interrupt clear register RV +#define TIMER_RV_TAILR 0xFFFFFFFF // TimerA interval load reg RV +#define TIMER_RV_TBILR 0x0000FFFF // TimerB interval load reg RV +#define TIMER_RV_TAMATCHR 0xFFFFFFFF // TimerA match register RV +#define TIMER_RV_TBMATCHR 0x0000FFFF // TimerB match register RV +#define TIMER_RV_TAPR 0x00000000 // TimerA prescale register RV +#define TIMER_RV_TBPR 0x00000000 // TimerB prescale register RV +#define TIMER_RV_TAPMR 0x00000000 // TimerA prescale match reg RV +#define TIMER_RV_TBPMR 0x00000000 // TimerB prescale match regi RV +#define TIMER_RV_TAR 0xFFFFFFFF // TimerA register RV +#define TIMER_RV_TBR 0x0000FFFF // TimerB register RV + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_CFG register. +// +//***************************************************************************** +#define TIMER_CFG_CFG_MSK 0x00000007 // Configuration options mask +#define TIMER_CFG_16_BIT 0x00000004 // Two 16 bit timers +#define TIMER_CFG_32_BIT_RTC 0x00000001 // 32 bit RTC +#define TIMER_CFG_32_BIT_TIMER 0x00000000 // 32 bit timer + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TnMR register. +// +//***************************************************************************** +#define TIMER_TNMR_TNAMS 0x00000008 // Alternate mode select +#define TIMER_TNMR_TNCMR 0x00000004 // Capture mode - count or time +#define TIMER_TNMR_TNTMR_MSK 0x00000003 // Timer mode mask +#define TIMER_TNMR_TNTMR_CAP 0x00000003 // Mode - capture +#define TIMER_TNMR_TNTMR_PERIOD 0x00000002 // Mode - periodic +#define TIMER_TNMR_TNTMR_1_SHOT 0x00000001 // Mode - one shot + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_CTL register. +// +//***************************************************************************** +#define TIMER_CTL_TBPWML 0x00004000 // TimerB PWM output level invert +#define TIMER_CTL_TBOTE 0x00002000 // TimerB output trigger enable +#define TIMER_CTL_TBEVENT_MSK 0x00000C00 // TimerB event mode mask +#define TIMER_CTL_TBEVENT_BOTH 0x00000C00 // TimerB event mode - both edges +#define TIMER_CTL_TBEVENT_NEG 0x00000400 // TimerB event mode - neg edge +#define TIMER_CTL_TBEVENT_POS 0x00000000 // TimerB event mode - pos edge +#define TIMER_CTL_TBSTALL 0x00000200 // TimerB stall enable +#define TIMER_CTL_TBEN 0x00000100 // TimerB enable +#define TIMER_CTL_TAPWML 0x00000040 // TimerA PWM output level invert +#define TIMER_CTL_TAOTE 0x00000020 // TimerA output trigger enable +#define TIMER_CTL_RTCEN 0x00000010 // RTC counter enable +#define TIMER_CTL_TAEVENT_MSK 0x0000000C // TimerA event mode mask +#define TIMER_CTL_TAEVENT_BOTH 0x0000000C // TimerA event mode - both edges +#define TIMER_CTL_TAEVENT_NEG 0x00000004 // TimerA event mode - neg edge +#define TIMER_CTL_TAEVENT_POS 0x00000000 // TimerA event mode - pos edge +#define TIMER_CTL_TASTALL 0x00000002 // TimerA stall enable +#define TIMER_CTL_TAEN 0x00000001 // TimerA enable + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_IMR register. +// +//***************************************************************************** +#define TIMER_IMR_CBEIM 0x00000400 // CaptureB event interrupt mask +#define TIMER_IMR_CBMIM 0x00000200 // CaptureB match interrupt mask +#define TIMER_IMR_TBTOIM 0x00000100 // TimerB time out interrupt mask +#define TIMER_IMR_RTCIM 0x00000008 // RTC interrupt mask +#define TIMER_IMR_CAEIM 0x00000004 // CaptureA event interrupt mask +#define TIMER_IMR_CAMIM 0x00000002 // CaptureA match interrupt mask +#define TIMER_IMR_TATOIM 0x00000001 // TimerA time out interrupt mask + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_RIS register. +// +//***************************************************************************** +#define TIMER_RIS_CBERIS 0x00000400 // CaptureB event raw int status +#define TIMER_RIS_CBMRIS 0x00000200 // CaptureB match raw int status +#define TIMER_RIS_TBTORIS 0x00000100 // TimerB time out raw int status +#define TIMER_RIS_RTCRIS 0x00000008 // RTC raw int status +#define TIMER_RIS_CAERIS 0x00000004 // CaptureA event raw int status +#define TIMER_RIS_CAMRIS 0x00000002 // CaptureA match raw int status +#define TIMER_RIS_TATORIS 0x00000001 // TimerA time out raw int status + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_MIS register. +// +//***************************************************************************** +#define TIMER_RIS_CBEMIS 0x00000400 // CaptureB event masked int status +#define TIMER_RIS_CBMMIS 0x00000200 // CaptureB match masked int status +#define TIMER_RIS_TBTOMIS 0x00000100 // TimerB time out masked int stat +#define TIMER_RIS_RTCMIS 0x00000008 // RTC masked int status +#define TIMER_RIS_CAEMIS 0x00000004 // CaptureA event masked int status +#define TIMER_RIS_CAMMIS 0x00000002 // CaptureA match masked int status +#define TIMER_RIS_TATOMIS 0x00000001 // TimerA time out masked int stat + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_ICR register. +// +//***************************************************************************** +#define TIMER_ICR_CBECINT 0x00000400 // CaptureB event interrupt clear +#define TIMER_ICR_CBMCINT 0x00000200 // CaptureB match interrupt clear +#define TIMER_ICR_TBTOCINT 0x00000100 // TimerB time out interrupt clear +#define TIMER_ICR_RTCCINT 0x00000008 // RTC interrupt clear +#define TIMER_ICR_CAECINT 0x00000004 // CaptureA event interrupt clear +#define TIMER_ICR_CAMCINT 0x00000002 // CaptureA match interrupt clear +#define TIMER_ICR_TATOCINT 0x00000001 // TimerA time out interrupt clear + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TAILR register. +// +//***************************************************************************** +#define TIMER_TAILR_TAILRH 0xFFFF0000 // TimerB load val in 32 bit mode +#define TIMER_TAILR_TAILRL 0x0000FFFF // TimerA interval load value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TBILR register. +// +//***************************************************************************** +#define TIMER_TBILR_TBILRL 0x0000FFFF // TimerB interval load value + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TAMATCHR register. +// +//***************************************************************************** +#define TIMER_TAMATCHR_TAMRH 0xFFFF0000 // TimerB match val in 32 bit mode +#define TIMER_TAMATCHR_TAMRL 0x0000FFFF // TimerA match value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TBMATCHR register. +// +//***************************************************************************** +#define TIMER_TBMATCHR_TBMRL 0x0000FFFF // TimerB match load value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TnPR register. +// +//***************************************************************************** +#define TIMER_TNPR_TNPSR 0x000000FF // TimerN prescale value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TnPMR register. +// +//***************************************************************************** +#define TIMER_TNPMR_TNPSMR 0x000000FF // TimerN prescale match value + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TAR register. +// +//***************************************************************************** +#define TIMER_TAR_TARH 0xFFFF0000 // TimerB val in 32 bit mode +#define TIMER_TAR_TARL 0x0000FFFF // TimerA value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TBR register. +// +//***************************************************************************** +#define TIMER_TBR_TBRL 0x0000FFFF // TimerB value + +#endif // __HW_TIMER_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_types.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_types.h new file mode 100644 index 000000000..974a85594 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_types.h @@ -0,0 +1,129 @@ +//***************************************************************************** +// +// hw_types.h - Common types and macros. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_TYPES_H__ +#define __HW_TYPES_H__ + +//***************************************************************************** +// +// Define a boolean type, and values for true and false. +// +//***************************************************************************** +typedef unsigned char tBoolean; + +#ifndef true +#define true 1 +#endif + +#ifndef false +#define false 0 +#endif + +//***************************************************************************** +// +// Macros for hardware access, both direct and via the bit-band region. +// +//***************************************************************************** +#define HWREG(x) \ + (*((volatile unsigned long *)(x))) +#define HWREGH(x) \ + (*((volatile unsigned short *)(x))) +#define HWREGB(x) \ + (*((volatile unsigned char *)(x))) +#define HWREGBITW(x, b) \ + HWREG(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) +#define HWREGBITH(x, b) \ + HWREGH(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) +#define HWREGBITB(x, b) \ + HWREGB(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) + +//***************************************************************************** +// +// Helper Macros for determining silicon revisions, etc. +// +// These macros will be used by Driverlib at "run-time" to create necessary +// conditional code blocks that will allow a single version of the Driverlib +// "binary" code to support multiple(all) Stellaris silicon revisions. +// +// It is expected that these macros will be used inside of a standard 'C' +// conditional block of code, e.g. +// +// if(DEVICE_IS_SANDSTORM()) +// { +// do some Sandstorm specific code here. +// } +// +// By default, these macros will be defined as run-time checks of the +// appropriate register(s) to allow creation of run-time conditional code +// blocks for a common DriverLib across the entire Stellaris family. +// +// However, if code-space optimization is required, these macros can be "hard- +// coded" for a specific version of Stellaris silicon. Many compilers will +// then detect the "hard-coded" conditionals, and appropriately optimize the +// code blocks, eliminating any "unreachable" code. This would result in +// a smaller Driverlib, thus producing a smaller final application size, but +// at the cost of limiting the Driverlib binary to a specific Stellaris +// silicon revision. +// +//***************************************************************************** +#ifndef DEVICE_IS_SANDSTORM +#define DEVICE_IS_SANDSTORM \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_VER_MASK) == SYSCTL_DID0_VER_0) || \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_VER_MASK) == SYSCTL_DID0_VER_1) && \ + ((HWREG(SYSCTL_DID0) & SYSCTL_DID0_CLASS_MASK) == \ + SYSCTL_DID0_CLASS_SANDSTORM))) +#endif + +#ifndef DEVICE_IS_FURY +#define DEVICE_IS_FURY \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_VER_MASK) == SYSCTL_DID0_VER_1) && \ + ((HWREG(SYSCTL_DID0) & SYSCTL_DID0_CLASS_MASK) == \ + SYSCTL_DID0_CLASS_FURY)) +#endif + +#ifndef DEVICE_IS_REVA2 +#define DEVICE_IS_REVA2 \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MAJ_MASK) == SYSCTL_DID0_MAJ_A) && \ + ((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MIN_MASK) == SYSCTL_DID0_MIN_2)) +#endif + +#ifndef DEVICE_IS_REVC1 +#define DEVICE_IS_REVC1 \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MAJ_MASK) == SYSCTL_DID0_MAJ_C) && \ + ((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MIN_MASK) == SYSCTL_DID0_MIN_1)) +#endif + +#ifndef DEVICE_IS_REVC2 +#define DEVICE_IS_REVC2 \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MAJ_MASK) == SYSCTL_DID0_MAJ_C) && \ + ((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MIN_MASK) == SYSCTL_DID0_MIN_2)) +#endif + +#endif // __HW_TYPES_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_uart.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_uart.h new file mode 100644 index 000000000..e5bb1c47e --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_uart.h @@ -0,0 +1,241 @@ +//***************************************************************************** +// +// hw_uart.h - Macros and defines used when accessing the UART hardware +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_UART_H__ +#define __HW_UART_H__ + +//***************************************************************************** +// +// UART Register Offsets. +// +//***************************************************************************** +#define UART_O_DR 0x00000000 // Data Register +#define UART_O_RSR 0x00000004 // Receive Status Register (read) +#define UART_O_ECR 0x00000004 // Error Clear Register (write) +#define UART_O_FR 0x00000018 // Flag Register (read only) +#define UART_O_IBRD 0x00000024 // Integer Baud Rate Divisor Reg +#define UART_O_FBRD 0x00000028 // Fractional Baud Rate Divisor Reg +#define UART_O_LCR_H 0x0000002C // Line Control Register, HIGH byte +#define UART_O_CTL 0x00000030 // Control Register +#define UART_O_IFLS 0x00000034 // Interrupt FIFO Level Select Reg +#define UART_O_IM 0x00000038 // Interrupt Mask Set/Clear Reg +#define UART_O_RIS 0x0000003C // Raw Interrupt Status Register +#define UART_O_MIS 0x00000040 // Masked Interrupt Status Register +#define UART_O_ICR 0x00000044 // Interrupt Clear Register +#define UART_O_PeriphID4 0x00000FD0 // +#define UART_O_PeriphID5 0x00000FD4 // +#define UART_O_PeriphID6 0x00000FD8 // +#define UART_O_PeriphID7 0x00000FDC // +#define UART_O_PeriphID0 0x00000FE0 // +#define UART_O_PeriphID1 0x00000FE4 // +#define UART_O_PeriphID2 0x00000FE8 // +#define UART_O_PeriphID3 0x00000FEC // +#define UART_O_PCellID0 0x00000FF0 // +#define UART_O_PCellID1 0x00000FF4 // +#define UART_O_PCellID2 0x00000FF8 // +#define UART_O_PCellID3 0x00000FFC // + +//***************************************************************************** +// +// Data Register bits +// +//***************************************************************************** +#define UART_DR_OE 0x00000800 // Overrun Error +#define UART_DR_BE 0x00000400 // Break Error +#define UART_DR_PE 0x00000200 // Parity Error +#define UART_DR_FE 0x00000100 // Framing Error +#define UART_DR_DATA_MASK 0x000000FF // UART data + +//***************************************************************************** +// +// Receive Status Register bits +// +//***************************************************************************** +#define UART_RSR_OE 0x00000008 // Overrun Error +#define UART_RSR_BE 0x00000004 // Break Error +#define UART_RSR_PE 0x00000002 // Parity Error +#define UART_RSR_FE 0x00000001 // Framing Error + +//***************************************************************************** +// +// Flag Register bits +// +//***************************************************************************** +#define UART_FR_TXFE 0x00000080 // TX FIFO Empty +#define UART_FR_RXFF 0x00000040 // RX FIFO Full +#define UART_FR_TXFF 0x00000020 // TX FIFO Full +#define UART_FR_RXFE 0x00000010 // RX FIFO Empty +#define UART_FR_BUSY 0x00000008 // UART Busy + +//***************************************************************************** +// +// Integer baud-rate divisor +// +//***************************************************************************** +#define UART_IBRD_DIVINT_MASK 0x0000FFFF // Integer baud-rate divisor + +//***************************************************************************** +// +// Fractional baud-rate divisor +// +//***************************************************************************** +#define UART_FBRD_DIVFRAC_MASK 0x0000003F // Fractional baud-rate divisor + +//***************************************************************************** +// +// Line Control Register High bits +// +//***************************************************************************** +#define UART_LCR_H_SPS 0x00000080 // Stick Parity Select +#define UART_LCR_H_WLEN 0x00000060 // Word length +#define UART_LCR_H_WLEN_8 0x00000060 // 8 bit data +#define UART_LCR_H_WLEN_7 0x00000040 // 7 bit data +#define UART_LCR_H_WLEN_6 0x00000020 // 6 bit data +#define UART_LCR_H_WLEN_5 0x00000000 // 5 bit data +#define UART_LCR_H_FEN 0x00000010 // Enable FIFO +#define UART_LCR_H_STP2 0x00000008 // Two Stop Bits Select +#define UART_LCR_H_EPS 0x00000004 // Even Parity Select +#define UART_LCR_H_PEN 0x00000002 // Parity Enable +#define UART_LCR_H_BRK 0x00000001 // Send Break + +//***************************************************************************** +// +// Control Register bits +// +//***************************************************************************** +#define UART_CTL_RXE 0x00000200 // Receive Enable +#define UART_CTL_TXE 0x00000100 // Transmit Enable +#define UART_CTL_LBE 0x00000080 // Loopback Enable +#define UART_CTL_SIRLP 0x00000004 // SIR (IrDA) Low Power Enable +#define UART_CTL_SIREN 0x00000002 // SIR (IrDA) Enable +#define UART_CTL_UARTEN 0x00000001 // UART Enable + +//***************************************************************************** +// +// Interrupt FIFO Level Select Register bits +// +//***************************************************************************** +#define UART_IFLS_RX1_8 0x00000000 // 1/8 Full +#define UART_IFLS_RX2_8 0x00000010 // 1/4 Full +#define UART_IFLS_RX4_8 0x00000020 // 1/2 Full +#define UART_IFLS_RX6_8 0x00000030 // 3/4 Full +#define UART_IFLS_RX7_8 0x00000040 // 7/8 Full +#define UART_IFLS_TX1_8 0x00000000 // 1/8 Full +#define UART_IFLS_TX2_8 0x00000001 // 1/4 Full +#define UART_IFLS_TX4_8 0x00000002 // 1/2 Full +#define UART_IFLS_TX6_8 0x00000003 // 3/4 Full +#define UART_IFLS_TX7_8 0x00000004 // 7/8 Full + +//***************************************************************************** +// +// Interrupt Mask Set/Clear Register bits +// +//***************************************************************************** +#define UART_IM_OEIM 0x00000400 // Overrun Error Interrupt Mask +#define UART_IM_BEIM 0x00000200 // Break Error Interrupt Mask +#define UART_IM_PEIM 0x00000100 // Parity Error Interrupt Mask +#define UART_IM_FEIM 0x00000080 // Framing Error Interrupt Mask +#define UART_IM_RTIM 0x00000040 // Receive Timeout Interrupt Mask +#define UART_IM_TXIM 0x00000020 // Transmit Interrupt Mask +#define UART_IM_RXIM 0x00000010 // Receive Interrupt Mask + +//***************************************************************************** +// +// Raw Interrupt Status Register +// +//***************************************************************************** +#define UART_RIS_OERIS 0x00000400 // Overrun Error Interrupt Status +#define UART_RIS_BERIS 0x00000200 // Break Error Interrupt Status +#define UART_RIS_PERIS 0x00000100 // Parity Error Interrupt Status +#define UART_RIS_FERIS 0x00000080 // Framing Error Interrupt Status +#define UART_RIS_RTRIS 0x00000040 // Receive Timeout Interrupt Status +#define UART_RIS_TXRIS 0x00000020 // Transmit Interrupt Status +#define UART_RIS_RXRIS 0x00000010 // Receive Interrupt Status + +//***************************************************************************** +// +// Masked Interrupt Status Register +// +//***************************************************************************** +#define UART_MIS_OEMIS 0x00000400 // Overrun Error Interrupt Status +#define UART_MIS_BEMIS 0x00000200 // Break Error Interrupt Status +#define UART_MIS_PEMIS 0x00000100 // Parity Error Interrupt Status +#define UART_MIS_FEMIS 0x00000080 // Framing Error Interrupt Status +#define UART_MIS_RTMIS 0x00000040 // Receive Timeout Interrupt Status +#define UART_MIS_TXMIS 0x00000020 // Transmit Interrupt Status +#define UART_MIS_RXMIS 0x00000010 // Receive Interrupt Status + +//***************************************************************************** +// +// Interrupt Clear Register bits +// +//***************************************************************************** +#define UART_ICR_OEIC 0x00000400 // Overrun Error Interrupt Clear +#define UART_ICR_BEIC 0x00000200 // Break Error Interrupt Clear +#define UART_ICR_PEIC 0x00000100 // Parity Error Interrupt Clear +#define UART_ICR_FEIC 0x00000080 // Framing Error Interrupt Clear +#define UART_ICR_RTIC 0x00000040 // Receive Timeout Interrupt Clear +#define UART_ICR_TXIC 0x00000020 // Transmit Interrupt Clear +#define UART_ICR_RXIC 0x00000010 // Receive Interrupt Clear + +#define UART_RSR_ANY (UART_RSR_OE | \ + UART_RSR_BE | \ + UART_RSR_PE | \ + UART_RSR_FE) + +//***************************************************************************** +// +// Reset Values for UART Registers. +// +//***************************************************************************** +#define UART_RV_DR 0x00000000 +#define UART_RV_RSR 0x00000000 +#define UART_RV_ECR 0x00000000 +#define UART_RV_FR 0x00000090 +#define UART_RV_IBRD 0x00000000 +#define UART_RV_FBRD 0x00000000 +#define UART_RV_LCR_H 0x00000000 +#define UART_RV_CTL 0x00000300 +#define UART_RV_IFLS 0x00000012 +#define UART_RV_IM 0x00000000 +#define UART_RV_RIS 0x00000000 +#define UART_RV_MIS 0x00000000 +#define UART_RV_ICR 0x00000000 +#define UART_RV_PeriphID4 0x00000000 +#define UART_RV_PeriphID5 0x00000000 +#define UART_RV_PeriphID6 0x00000000 +#define UART_RV_PeriphID7 0x00000000 +#define UART_RV_PeriphID0 0x00000011 +#define UART_RV_PeriphID1 0x00000000 +#define UART_RV_PeriphID2 0x00000018 +#define UART_RV_PeriphID3 0x00000001 +#define UART_RV_PCellID0 0x0000000D +#define UART_RV_PCellID1 0x000000F0 +#define UART_RV_PCellID2 0x00000005 +#define UART_RV_PCellID3 0x000000B1 + +#endif // __HW_UART_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_watchdog.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_watchdog.h new file mode 100644 index 000000000..7a3b5a8d9 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/hw_watchdog.h @@ -0,0 +1,116 @@ +//***************************************************************************** +// +// hw_watchdog.h - Macros used when accessing the Watchdog Timer hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_WATCHDOG_H__ +#define __HW_WATCHDOG_H__ + +//***************************************************************************** +// +// The following define the offsets of the Watchdog Timer registers. +// +//***************************************************************************** +#define WDT_O_LOAD 0x00000000 // Load register +#define WDT_O_VALUE 0x00000004 // Current value register +#define WDT_O_CTL 0x00000008 // Control register +#define WDT_O_ICR 0x0000000C // Interrupt clear register +#define WDT_O_RIS 0x00000010 // Raw interrupt status register +#define WDT_O_MIS 0x00000014 // Masked interrupt status register +#define WDT_O_TEST 0x00000418 // Test register +#define WDT_O_LOCK 0x00000C00 // Lock register +#define WDT_O_PeriphID4 0x00000FD0 // +#define WDT_O_PeriphID5 0x00000FD4 // +#define WDT_O_PeriphID6 0x00000FD8 // +#define WDT_O_PeriphID7 0x00000FDC // +#define WDT_O_PeriphID0 0x00000FE0 // +#define WDT_O_PeriphID1 0x00000FE4 // +#define WDT_O_PeriphID2 0x00000FE8 // +#define WDT_O_PeriphID3 0x00000FEC // +#define WDT_O_PCellID0 0x00000FF0 // +#define WDT_O_PCellID1 0x00000FF4 // +#define WDT_O_PCellID2 0x00000FF8 // +#define WDT_O_PCellID3 0x00000FFC // + +//***************************************************************************** +// +// The following define the bit fields in the WDT_CTL register. +// +//***************************************************************************** +#define WDT_CTL_RESEN 0x00000002 // Enable reset output +#define WDT_CTL_INTEN 0x00000001 // Enable the WDT counter and int + +//***************************************************************************** +// +// The following define the bit fields in the WDT_ISR, WDT_RIS, and WDT_MIS +// registers. +// +//***************************************************************************** +#define WDT_INT_TIMEOUT 0x00000001 // Watchdog timer expired + +//***************************************************************************** +// +// The following define the bit fields in the WDT_TEST register. +// +//***************************************************************************** +#define WDT_TEST_STALL 0x00000100 // Watchdog stall enable +#ifndef DEPRECATED +#define WDT_TEST_STALL_EN 0x00000100 // Watchdog stall enable +#endif + +//***************************************************************************** +// +// The following define the bit fields in the WDT_LOCK register. +// +//***************************************************************************** +#define WDT_LOCK_LOCKED 0x00000001 // Watchdog timer is locked +#define WDT_LOCK_UNLOCKED 0x00000000 // Watchdog timer is unlocked +#define WDT_LOCK_UNLOCK 0x1ACCE551 // Unlocks the watchdog timer + +//***************************************************************************** +// +// The following define the reset values for the WDT registers. +// +//***************************************************************************** +#define WDT_RV_LOAD 0xFFFFFFFF // Load register +#define WDT_RV_VALUE 0xFFFFFFFF // Current value register +#define WDT_RV_CTL 0x00000000 // Control register +#define WDT_RV_RIS 0x00000000 // Raw interrupt status register +#define WDT_RV_MIS 0x00000000 // Masked interrupt status register +#define WDT_RV_LOCK 0x00000000 // Lock register +#define WDT_RV_PeriphID4 0x00000000 // +#define WDT_RV_PeriphID5 0x00000000 // +#define WDT_RV_PeriphID6 0x00000000 // +#define WDT_RV_PeriphID7 0x00000000 // +#define WDT_RV_PeriphID0 0x00000005 // +#define WDT_RV_PeriphID1 0x00000018 // +#define WDT_RV_PeriphID2 0x00000018 // +#define WDT_RV_PeriphID3 0x00000001 // +#define WDT_RV_PCellID0 0x0000000D // +#define WDT_RV_PCellID1 0x000000F0 // +#define WDT_RV_PCellID2 0x00000005 // +#define WDT_RV_PCellID3 0x000000B1 // + +#endif // __HW_WATCHDOG_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/i2c.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/i2c.h new file mode 100644 index 000000000..46a28eeb5 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/i2c.h @@ -0,0 +1,137 @@ +//***************************************************************************** +// +// i2c.h - Prototypes for the I2C Driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __I2C_H__ +#define __I2C_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Defines for the API. +// +//***************************************************************************** +//***************************************************************************** +// +// Interrupt defines. +// +//***************************************************************************** +#define I2C_INT_MASTER 0x00000001 +#define I2C_INT_SLAVE 0x00000002 + +//***************************************************************************** +// +// I2C Master commands. +// +//***************************************************************************** +#define I2C_MASTER_CMD_SINGLE_SEND \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_SINGLE_RECEIVE \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_START \ + (I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_CONT \ + (I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_FINISH \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_ERROR_STOP \ + (I2C_MASTER_CS_STOP) +#define I2C_MASTER_CMD_BURST_RECEIVE_START \ + (I2C_MASTER_CS_ACK | I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_RECEIVE_CONT \ + (I2C_MASTER_CS_ACK | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_RECEIVE_FINISH \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_RUN) + +//***************************************************************************** +// +// I2C Master error status. +// +//***************************************************************************** +#define I2C_MASTER_ERR_NONE 0 +#define I2C_MASTER_ERR_ADDR_ACK 0x00000004 +#define I2C_MASTER_ERR_DATA_ACK 0x00000008 +#define I2C_MASTER_ERR_ARB_LOST 0x00000010 + +//***************************************************************************** +// +// I2C Slave action requests +// +//***************************************************************************** +#define I2C_SLAVE_ACT_NONE 0 +#define I2C_SLAVE_ACT_RREQ 0x00000001 // Master has sent data +#define I2C_SLAVE_ACT_TREQ 0x00000002 // Master has requested data + +//***************************************************************************** +// Miscellaneous I2C driver definitions. +//***************************************************************************** +#define I2C_MASTER_MAX_RETRIES 1000 // Number of retries + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void I2CIntRegister(unsigned long ulBase, void(fnHandler)(void)); +extern void I2CIntUnregister(unsigned long ulBase); +extern tBoolean I2CMasterBusBusy(unsigned long ulBase); +extern tBoolean I2CMasterBusy(unsigned long ulBase); +extern void I2CMasterControl(unsigned long ulBase, unsigned long ulCmd); +extern unsigned long I2CMasterDataGet(unsigned long ulBase); +extern void I2CMasterDataPut(unsigned long ulBase, unsigned char ucData); +extern void I2CMasterDisable(unsigned long ulBase); +extern void I2CMasterEnable(unsigned long ulBase); +extern unsigned long I2CMasterErr(unsigned long ulBase); +extern void I2CMasterInit(unsigned long ulBase, tBoolean bFast); +extern void I2CMasterIntClear(unsigned long ulBase); +extern void I2CMasterIntDisable(unsigned long ulBase); +extern void I2CMasterIntEnable(unsigned long ulBase); +extern tBoolean I2CMasterIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void I2CMasterSlaveAddrSet(unsigned long ulBase, + unsigned char ucSlaveAddr, + tBoolean bReceive); +extern unsigned long I2CSlaveDataGet(unsigned long ulBase); +extern void I2CSlaveDataPut(unsigned long ulBase, unsigned char ucData); +extern void I2CSlaveDisable(unsigned long ulBase); +extern void I2CSlaveEnable(unsigned long ulBase); +extern void I2CSlaveInit(unsigned long ulBase, unsigned char ucSlaveAddr); +extern void I2CSlaveIntClear(unsigned long ulBase); +extern void I2CSlaveIntDisable(unsigned long ulBase); +extern void I2CSlaveIntEnable(unsigned long ulBase); +extern tBoolean I2CSlaveIntStatus(unsigned long ulBase, tBoolean bMasked); +extern unsigned long I2CSlaveStatus(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __I2C_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/interrupt.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/interrupt.h new file mode 100644 index 000000000..1ce70f16b --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/interrupt.h @@ -0,0 +1,57 @@ +//***************************************************************************** +// +// interrupt.h - Prototypes for the NVIC Interrupt Controller Driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __INTERRUPT_H__ +#define __INTERRUPT_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void IntMasterEnable(void); +extern void IntMasterDisable(void); +extern void IntRegister(unsigned long ulInterrupt, void (*pfnHandler)(void)); +extern void IntUnregister(unsigned long ulInterrupt); +extern void IntPriorityGroupingSet(unsigned long ulBits); +extern unsigned long IntPriorityGroupingGet(void); +extern void IntPrioritySet(unsigned long ulInterrupt, + unsigned char ucPriority); +extern long IntPriorityGet(unsigned long ulInterrupt); +extern void IntEnable(unsigned long ulInterrupt); +extern void IntDisable(unsigned long ulInterrupt); + +#ifdef __cplusplus +} +#endif + +#endif // __INTERRUPT_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/lmi_flash.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/lmi_flash.h new file mode 100644 index 000000000..75d30c41c --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/lmi_flash.h @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// flash.h - Prototypes for the flash driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __FLASH_H__ +#define __FLASH_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to FlashProtectSet(), and returned by +// FlashProtectGet(). +// +//***************************************************************************** +typedef enum +{ + FlashReadWrite, // Flash can be read and written + FlashReadOnly, // Flash can only be read + FlashExecuteOnly // Flash can only be executed +} +tFlashProtection; + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern unsigned long FlashUsecGet(void); +extern void FlashUsecSet(unsigned long ulClocks); +extern long FlashErase(unsigned long ulAddress); +extern long FlashProgram(unsigned long *pulData, unsigned long ulAddress, + unsigned long ulCount); +extern tFlashProtection FlashProtectGet(unsigned long ulAddress); +extern long FlashProtectSet(unsigned long ulAddress, + tFlashProtection eProtect); +extern long FlashProtectSave(void); +extern long FlashUserGet(unsigned long *pulUser0, unsigned long *pulUser1); +extern long FlashUserSet(unsigned long ulUser0, unsigned long ulUser1); +extern long FlashUserSave(void); +extern void FlashIntRegister(void (*pfnHandler)(void)); +extern void FlashIntUnregister(void); +extern void FlashIntEnable(unsigned long ulIntFlags); +extern void FlashIntDisable(unsigned long ulIntFlags); +extern unsigned long FlashIntGetStatus(tBoolean bMasked); +extern void FlashIntClear(unsigned long ulIntFlags); + +#ifdef __cplusplus +} +#endif + +#endif // __FLASH_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/lmi_timer.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/lmi_timer.h new file mode 100644 index 000000000..85b3160ab --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/lmi_timer.h @@ -0,0 +1,137 @@ +//***************************************************************************** +// +// timer.h - Prototypes for the timer module +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __TIMER_H__ +#define __TIMER_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to TimerConfigure as the ulConfig parameter. +// +//***************************************************************************** +#define TIMER_CFG_32_BIT_OS 0x00000001 // 32-bit one-shot timer +#define TIMER_CFG_32_BIT_PER 0x00000002 // 32-bit periodic timer +#define TIMER_CFG_32_RTC 0x01000000 // 32-bit RTC timer +#define TIMER_CFG_16_BIT_PAIR 0x04000000 // Two 16-bit timers +#define TIMER_CFG_A_ONE_SHOT 0x00000001 // Timer A one-shot timer +#define TIMER_CFG_A_PERIODIC 0x00000002 // Timer A periodic timer +#define TIMER_CFG_A_CAP_COUNT 0x00000003 // Timer A event counter +#define TIMER_CFG_A_CAP_TIME 0x00000007 // Timer A event timer +#define TIMER_CFG_A_PWM 0x0000000A // Timer A PWM output +#define TIMER_CFG_B_ONE_SHOT 0x00000100 // Timer B one-shot timer +#define TIMER_CFG_B_PERIODIC 0x00000200 // Timer B periodic timer +#define TIMER_CFG_B_CAP_COUNT 0x00000300 // Timer B event counter +#define TIMER_CFG_B_CAP_TIME 0x00000700 // Timer B event timer +#define TIMER_CFG_B_PWM 0x00000A00 // Timer B PWM output + +//***************************************************************************** +// +// Values that can be passed to TimerIntEnable, TimerIntDisable, and +// TimerIntClear as the ulIntFlags parameter, and returned from TimerIntStatus. +// +//***************************************************************************** +#define TIMER_CAPB_EVENT 0x00000400 // CaptureB event interrupt +#define TIMER_CAPB_MATCH 0x00000200 // CaptureB match interrupt +#define TIMER_TIMB_TIMEOUT 0x00000100 // TimerB time out interrupt +#define TIMER_RTC_MATCH 0x00000008 // RTC interrupt mask +#define TIMER_CAPA_EVENT 0x00000004 // CaptureA event interrupt +#define TIMER_CAPA_MATCH 0x00000002 // CaptureA match interrupt +#define TIMER_TIMA_TIMEOUT 0x00000001 // TimerA time out interrupt + +//***************************************************************************** +// +// Values that can be passed to TimerControlEvent as the ulEvent parameter. +// +//***************************************************************************** +#define TIMER_EVENT_POS_EDGE 0x00000000 // Count positive edges +#define TIMER_EVENT_NEG_EDGE 0x00000404 // Count negative edges +#define TIMER_EVENT_BOTH_EDGES 0x00000C0C // Count both edges + +//***************************************************************************** +// +// Values that can be passed to most of the timer APIs as the ulTimer +// parameter. +// +//***************************************************************************** +#define TIMER_A 0x000000ff // Timer A +#define TIMER_B 0x0000ff00 // Timer B +#define TIMER_BOTH 0x0000ffff // Timer Both + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void TimerEnable(unsigned long ulBase, unsigned long ulTimer); +extern void TimerDisable(unsigned long ulBase, unsigned long ulTimer); +extern void TimerConfigure(unsigned long ulBase, unsigned long ulConfig); +extern void TimerControlLevel(unsigned long ulBase, unsigned long ulTimer, + tBoolean bInvert); +extern void TimerControlTrigger(unsigned long ulBase, unsigned long ulTimer, + tBoolean bEnable); +extern void TimerControlEvent(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulEvent); +extern void TimerControlStall(unsigned long ulBase, unsigned long ulTimer, + tBoolean bStall); +extern void TimerRTCEnable(unsigned long ulBase); +extern void TimerRTCDisable(unsigned long ulBase); +extern void TimerPrescaleSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerPrescaleGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerPrescaleMatchSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerPrescaleMatchGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerLoadSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerLoadGet(unsigned long ulBase, unsigned long ulTimer); +extern unsigned long TimerValueGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerMatchSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerMatchGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerIntRegister(unsigned long ulBase, unsigned long ulTimer, + void (*pfnHandler)(void)); +extern void TimerIntUnregister(unsigned long ulBase, unsigned long ulTimer); +extern void TimerIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void TimerIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long TimerIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void TimerIntClear(unsigned long ulBase, unsigned long ulIntFlags); +extern void TimerQuiesce(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __TIMER_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/osram128x64x4.c b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/osram128x64x4.c new file mode 100644 index 000000000..3353a82e6 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/osram128x64x4.c @@ -0,0 +1,933 @@ +//***************************************************************************** +// +// osram128x64x4.c - Driver for the OSRAM 128x64x4 graphical OLED display. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup ek_lm3sx965_api +//! @{ +// +//***************************************************************************** + +#include "hw_ssi.h" +#include "hw_memmap.h" +#include "hw_sysctl.h" +#include "hw_types.h" +#include "debug.h" +#include "gpio.h" +#include "ssi.h" +#include "sysctl.h" +#include "osram128x64x4.h" + +//***************************************************************************** +// +// Flag to indicate if SSI port is enabled for OSRAM usage. +// +//***************************************************************************** +static volatile tBoolean g_bSSIEnabled = false; + +//***************************************************************************** +// +// Define the OSRAM 128x64x4 Remap Setting(s). This will be used in +// several places in the code to switch between vertical and horizontal +// address incrementing. +// +// The Remap Command (0xA0) takes one 8-bit parameter. The parameter is +// defined as follows. +// +// Bit 7: Reserved +// Bit 6: Disable(0)/Enable(1) COM Split Odd Even +// When enabled, the COM signals are split Odd on one side, even on +// the other. Otherwise, they are split 0-39 on one side, 40-79 on +// the other. +// Bit 5: Reserved +// Bit 4: Disable(0)/Enable(1) COM Remap +// When Enabled, ROW 0-79 map to COM 79-0 (i.e. reverse row order) +// Bit 3: Reserved +// Bit 2: Horizontal(0)/Vertical(1) Address Increment +// When set, data RAM address will increment along the column rather +// than along the row. +// Bit 1: Disable(0)/Enable(1) Nibble Remap +// When enabled, the upper and lower nibbles in the DATA bus for access +// to the data RAM are swapped. +// Bit 0: Disable(0)/Enable(1) Column Address Remap +// When enabled, DATA RAM columns 0-63 are remapped to Segment Columns +// 127-0. +// +//***************************************************************************** +#define OSRAM_INIT_REMAP 0x52 +#define OSRAM_INIT_OFFSET 0x4C +static const unsigned char g_pucOSRAM128x64x4VerticalInc[] = { 0xA0, 0x56 }; +static const unsigned char g_pucOSRAM128x64x4HorizontalInc[] = { 0xA0, 0x52 }; + +//***************************************************************************** +// +// A 5x7 font (in a 6x8 cell, where the sixth column is omitted from this +// table) for displaying text on the OLED display. The data is organized as +// bytes from the left column to the right column, with each byte containing +// the top row in the LSB and the bottom row in the MSB. +// +// Note: This is the same font data that is used in the EK-LM3S811 +// osram96x16x1 driver. The single bit-per-pixel is expaned in the StringDraw +// function to the appropriate four bit-per-pixel gray scale format. +// +//***************************************************************************** +static const unsigned char g_pucFont[96][5] = +{ + { 0x00, 0x00, 0x00, 0x00, 0x00 }, // " " + { 0x00, 0x00, 0x4f, 0x00, 0x00 }, // ! + { 0x00, 0x07, 0x00, 0x07, 0x00 }, // " + { 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // # + { 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $ + { 0x23, 0x13, 0x08, 0x64, 0x62 }, // % + { 0x36, 0x49, 0x55, 0x22, 0x50 }, // & + { 0x00, 0x05, 0x03, 0x00, 0x00 }, // ' + { 0x00, 0x1c, 0x22, 0x41, 0x00 }, // ( + { 0x00, 0x41, 0x22, 0x1c, 0x00 }, // ) + { 0x14, 0x08, 0x3e, 0x08, 0x14 }, // * + { 0x08, 0x08, 0x3e, 0x08, 0x08 }, // + + { 0x00, 0x50, 0x30, 0x00, 0x00 }, // , + { 0x08, 0x08, 0x08, 0x08, 0x08 }, // - + { 0x00, 0x60, 0x60, 0x00, 0x00 }, // . + { 0x20, 0x10, 0x08, 0x04, 0x02 }, // / + { 0x3e, 0x51, 0x49, 0x45, 0x3e }, // 0 + { 0x00, 0x42, 0x7f, 0x40, 0x00 }, // 1 + { 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2 + { 0x21, 0x41, 0x45, 0x4b, 0x31 }, // 3 + { 0x18, 0x14, 0x12, 0x7f, 0x10 }, // 4 + { 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5 + { 0x3c, 0x4a, 0x49, 0x49, 0x30 }, // 6 + { 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7 + { 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8 + { 0x06, 0x49, 0x49, 0x29, 0x1e }, // 9 + { 0x00, 0x36, 0x36, 0x00, 0x00 }, // : + { 0x00, 0x56, 0x36, 0x00, 0x00 }, // ; + { 0x08, 0x14, 0x22, 0x41, 0x00 }, // < + { 0x14, 0x14, 0x14, 0x14, 0x14 }, // = + { 0x00, 0x41, 0x22, 0x14, 0x08 }, // > + { 0x02, 0x01, 0x51, 0x09, 0x06 }, // ? + { 0x32, 0x49, 0x79, 0x41, 0x3e }, // @ + { 0x7e, 0x11, 0x11, 0x11, 0x7e }, // A + { 0x7f, 0x49, 0x49, 0x49, 0x36 }, // B + { 0x3e, 0x41, 0x41, 0x41, 0x22 }, // C + { 0x7f, 0x41, 0x41, 0x22, 0x1c }, // D + { 0x7f, 0x49, 0x49, 0x49, 0x41 }, // E + { 0x7f, 0x09, 0x09, 0x09, 0x01 }, // F + { 0x3e, 0x41, 0x49, 0x49, 0x7a }, // G + { 0x7f, 0x08, 0x08, 0x08, 0x7f }, // H + { 0x00, 0x41, 0x7f, 0x41, 0x00 }, // I + { 0x20, 0x40, 0x41, 0x3f, 0x01 }, // J + { 0x7f, 0x08, 0x14, 0x22, 0x41 }, // K + { 0x7f, 0x40, 0x40, 0x40, 0x40 }, // L + { 0x7f, 0x02, 0x0c, 0x02, 0x7f }, // M + { 0x7f, 0x04, 0x08, 0x10, 0x7f }, // N + { 0x3e, 0x41, 0x41, 0x41, 0x3e }, // O + { 0x7f, 0x09, 0x09, 0x09, 0x06 }, // P + { 0x3e, 0x41, 0x51, 0x21, 0x5e }, // Q + { 0x7f, 0x09, 0x19, 0x29, 0x46 }, // R + { 0x46, 0x49, 0x49, 0x49, 0x31 }, // S + { 0x01, 0x01, 0x7f, 0x01, 0x01 }, // T + { 0x3f, 0x40, 0x40, 0x40, 0x3f }, // U + { 0x1f, 0x20, 0x40, 0x20, 0x1f }, // V + { 0x3f, 0x40, 0x38, 0x40, 0x3f }, // W + { 0x63, 0x14, 0x08, 0x14, 0x63 }, // X + { 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y + { 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z + { 0x00, 0x7f, 0x41, 0x41, 0x00 }, // [ + { 0x02, 0x04, 0x08, 0x10, 0x20 }, // "\" + { 0x00, 0x41, 0x41, 0x7f, 0x00 }, // ] + { 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^ + { 0x40, 0x40, 0x40, 0x40, 0x40 }, // _ + { 0x00, 0x01, 0x02, 0x04, 0x00 }, // ` + { 0x20, 0x54, 0x54, 0x54, 0x78 }, // a + { 0x7f, 0x48, 0x44, 0x44, 0x38 }, // b + { 0x38, 0x44, 0x44, 0x44, 0x20 }, // c + { 0x38, 0x44, 0x44, 0x48, 0x7f }, // d + { 0x38, 0x54, 0x54, 0x54, 0x18 }, // e + { 0x08, 0x7e, 0x09, 0x01, 0x02 }, // f + { 0x0c, 0x52, 0x52, 0x52, 0x3e }, // g + { 0x7f, 0x08, 0x04, 0x04, 0x78 }, // h + { 0x00, 0x44, 0x7d, 0x40, 0x00 }, // i + { 0x20, 0x40, 0x44, 0x3d, 0x00 }, // j + { 0x7f, 0x10, 0x28, 0x44, 0x00 }, // k + { 0x00, 0x41, 0x7f, 0x40, 0x00 }, // l + { 0x7c, 0x04, 0x18, 0x04, 0x78 }, // m + { 0x7c, 0x08, 0x04, 0x04, 0x78 }, // n + { 0x38, 0x44, 0x44, 0x44, 0x38 }, // o + { 0x7c, 0x14, 0x14, 0x14, 0x08 }, // p + { 0x08, 0x14, 0x14, 0x18, 0x7c }, // q + { 0x7c, 0x08, 0x04, 0x04, 0x08 }, // r + { 0x48, 0x54, 0x54, 0x54, 0x20 }, // s + { 0x04, 0x3f, 0x44, 0x40, 0x20 }, // t + { 0x3c, 0x40, 0x40, 0x20, 0x7c }, // u + { 0x1c, 0x20, 0x40, 0x20, 0x1c }, // v + { 0x3c, 0x40, 0x30, 0x40, 0x3c }, // w + { 0x44, 0x28, 0x10, 0x28, 0x44 }, // x + { 0x0c, 0x50, 0x50, 0x50, 0x3c }, // y + { 0x44, 0x64, 0x54, 0x4c, 0x44 }, // z + { 0x00, 0x08, 0x36, 0x41, 0x00 }, // { + { 0x00, 0x00, 0x7f, 0x00, 0x00 }, // | + { 0x00, 0x41, 0x36, 0x08, 0x00 }, // } + { 0x02, 0x01, 0x02, 0x04, 0x02 }, // ~ + { 0x02, 0x01, 0x02, 0x04, 0x02 }, // ~ +}; + +//***************************************************************************** +// +// The sequence of commands used to initialize the SSD0303 controller. Each +// command is described as follows: there is a byte specifying the number of +// bytes in the command sequence, followed by that many bytes of command data. +// Note: This initialization sequence is derived from OSRAM App Note AN018. +// +//***************************************************************************** +static const unsigned char g_pucOSRAM128x64x4Init[] = +{ + // + // Column Address + // + 4, 0x15, 0, 63, 0xe3, + + // + // Row Address + // + 4, 0x75, 0, 63, 0xe3, + + // + // Contrast Control + // + 3, 0x81, 50, 0xe3, + + // + // Half Current Range + // + 2, 0x85, 0xe3, + + // + // Display Re-map + // + 3, 0xA0, OSRAM_INIT_REMAP, 0xe3, + + // + // Display Start Line + // + 3, 0xA1, 0, 0xe3, + + // + // Display Offset + // + 3, 0xA2, OSRAM_INIT_OFFSET, 0xe3, + + // + // Display Mode Normal + // + 2, 0xA4, 0xe3, + + // + // Multiplex Ratio + // + 3, 0xA8, 63, 0xe3, + + // + // Phase Length + // + 3, 0xB1, 0x22, 0xe3, + + // + // Row Period + // + 3, 0xB2, 70, 0xe3, + + // + // Display Clock Divide + // + 3, 0xB3, 0xF1, 0xe3, + + // + // VSL + // + 3, 0xBF, 0x0D, 0xe3, + + // + // VCOMH + // + 3, 0xBE, 0x02, 0xe3, + + // + // VP + // + 3, 0xBC, 0x10, 0xe3, + + // + // Gamma + // + 10, 0xB8, 0x01, 0x11, 0x22, 0x32, 0x43, 0x54, 0x65, 0x76, 0xe3, + + // + // Set DC-DC + 3, 0xAD, 0x03, 0xe3, + + // + // Display ON/OFF + // + 2, 0xAF, 0xe3, +}; + +//***************************************************************************** +// +//! \internal +//! +//! Write a sequence of command bytes to the SSD0323 controller. +//! +//! The data is written in a polled fashion; this function will not return +//! until the entire byte sequence has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +OSRAMWriteCommand(const unsigned char *pucBuffer, unsigned long ulCount) +{ + unsigned long ulTemp; + + // + // Return iff SSI port is not enabled for OSRAM. + // + if(!g_bSSIEnabled) + { + return; + } + + // + // Clear the command/control bit to enable command mode. + // + GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_7, 0); + + // + // Loop while there are more bytes left to be transferred. + // + while(ulCount != 0) + { + // + // Write the next byte to the controller. + // + SSIDataPut(SSI0_BASE, *pucBuffer++); + + // + // Dummy read to drain the fifo and time the GPIO signal. + // + SSIDataGet(SSI0_BASE, &ulTemp); + + // + // Decrement the BYTE counter. + // + ulCount--; + } +} + +//***************************************************************************** +// +//! \internal +//! +//! Write a sequence of data bytes to the SSD0323 controller. +//! +//! The data is written in a polled fashion; this function will not return +//! until the entire byte sequence has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +OSRAMWriteData(const unsigned char *pucBuffer, unsigned long ulCount) +{ + unsigned long ulTemp; + + // + // Return iff SSI port is not enabled for OSRAM. + // + if(!g_bSSIEnabled) + { + return; + } + + // + // Set the command/control bit to enable data mode. + // + GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_PIN_7); + + // + // Loop while there are more bytes left to be transferred. + // + while(ulCount != 0) + { + // + // Write the next byte to the controller. + // + SSIDataPut(SSI0_BASE, *pucBuffer++); + + // + // Dummy read to drain the fifo and time the GPIO signal. + // + SSIDataGet(SSI0_BASE, &ulTemp); + + // + // Decrement the BYTE counter. + // + ulCount--; + } +} + +//***************************************************************************** +// +//! Clears the OLED display. +//! +//! This function will clear the display RAM. All pixels in the display will +//! be turned off. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Clear(void) +{ + static const unsigned char pucCommand1[] = { 0x15, 0, 63 }; + static const unsigned char pucCommand2[] = { 0x75, 0, 79 }; + unsigned long ulRow, ulColumn; + static unsigned char pucZeroBuffer[8] = { 0, 0, 0, 0, 0, 0, 0, 0}; + + // + // Set the window to fill the entire display. + // + OSRAMWriteCommand(pucCommand1, sizeof(pucCommand1)); + OSRAMWriteCommand(pucCommand2, sizeof(pucCommand2)); + OSRAMWriteCommand(g_pucOSRAM128x64x4VerticalInc, + sizeof(g_pucOSRAM128x64x4VerticalInc)); + + // + // In vertical address increment mode, loop through each column, filling + // each row with 0. + // + for(ulColumn = 0; ulColumn < (128/2); ulColumn++) + { + // + // 8 rows (bytes) per row of text. + // + for(ulRow = 0; ulRow < 80; ulRow += 8) + { + OSRAMWriteData(pucZeroBuffer, sizeof(pucZeroBuffer)); + } + } +} + +//***************************************************************************** +// +//! Displays a string on the OLED display. +//! +//! \param pcStr is a pointer to the string to display. +//! \param ulX is the horizontal position to display the string, specified in +//! columns from the left edge of the display. +//! \param ulY is the vertical position to display the string, specified in +//! rows from the top edge of the display. +//! \param ucLevel is the 4-bit grey scale value to be used for displayed text. +//! +//! This function will draw a string on the display. Only the ASCII characters +//! between 32 (space) and 126 (tilde) are supported; other characters will +//! result in random data being draw on the display (based on whatever appears +//! before/after the font in memory). The font is mono-spaced, so characters +//! such as "i" and "l" have more white space around them than characters such +//! as "m" or "w". +//! +//! If the drawing of the string reaches the right edge of the display, no more +//! characters will be drawn. Therefore, special care is not required to avoid +//! supplying a string that is "too long" to display. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \note Because the OLED display packs 2 pixels of data in a single byte, the +//! parameter \e ulX must be an even column number (e.g. 0, 2, 4, etc). +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4StringDraw(const char *pcStr, unsigned long ulX, + unsigned long ulY, unsigned char ucLevel) +{ + static unsigned char pucBuffer[8]; + unsigned long ulIdx1, ulIdx2; + unsigned char ucTemp; + + // + // Check the arguments. + // + ASSERT(ulX < 128); + ASSERT((ulX & 1) == 0); + ASSERT(ulY < 64); + ASSERT(ucLevel < 16); + + // + // Setup a window starting at the specified column and row, ending + // at the right edge of the display and 8 rows down (single character row). + // + pucBuffer[0] = 0x15; + pucBuffer[1] = ulX / 2; + pucBuffer[2] = 63; + OSRAMWriteCommand(pucBuffer, 3); + pucBuffer[0] = 0x75; + pucBuffer[1] = ulY; + pucBuffer[2] = ulY + 7; + OSRAMWriteCommand(pucBuffer, 3); + OSRAMWriteCommand(g_pucOSRAM128x64x4VerticalInc, + sizeof(g_pucOSRAM128x64x4VerticalInc)); + + // + // Loop while there are more characters in the string. + // + while(*pcStr != 0) + { + // + // Get a working copy of the current character and convert to an + // index into the character bit-map array. + // + ucTemp = *pcStr; + ucTemp &= 0x7F; + if(ucTemp < ' ') + { + ucTemp = ' '; + } + else + { + ucTemp -= ' '; + } + + // + // Build and display the character buffer. + // + for(ulIdx1 = 0; ulIdx1 < 3; ulIdx1++) + { + // + // Convert two columns of 1-bit font data into a single data + // byte column of 4-bit font data. + // + for(ulIdx2 = 0; ulIdx2 < 8; ulIdx2++) + { + pucBuffer[ulIdx2] = 0; + if(g_pucFont[ucTemp][ulIdx1*2] & (1 << ulIdx2)) + { + pucBuffer[ulIdx2] = ((ucLevel << 4) & 0xf0); + } + if((ulIdx1 < 2) && + (g_pucFont[ucTemp][ulIdx1*2+1] & (1 << ulIdx2))) + { + pucBuffer[ulIdx2] |= ((ucLevel << 0) & 0x0f); + } + } + + // + // If there is room, dump the single data byte column to the + // display. Otherwise, bail out. + // + if(ulX < 126) + { + OSRAMWriteData(pucBuffer, 8); + ulX += 2; + } + else + { + return; + } + } + + // + // Advance to the next character. + // + pcStr++; + } +} + +//***************************************************************************** +// +//! Displays an image on the OLED display. +//! +//! \param pucImage is a pointer to the image data. +//! \param ulX is the horizontal position to display this image, specified in +//! columns from the left edge of the display. +//! \param ulY is the vertical position to display this image, specified in +//! rows from the top of the display. +//! \param ulWidth is the width of the image, specified in columns. +//! \param ulHeight is the height of the image, specified in rows. +//! +//! This function will display a bitmap graphic on the display. Because of the +//! format of the display RAM, the starting column (/e ulX) and the number of +//! columns (/e ulWidth) must be an integer multiple of two. +//! +//! The image data is organized with the first row of image data appearing left +//! to right, followed immediately by the second row of image data. Each byte +//! contains the data for two columns in the current row, with the leftmost +//! column being contained in bits 7:4 and the rightmost column being contained +//! in bits 3:0. +//! +//! For example, an image six columns wide and seven scan lines tall would +//! be arranged as follows (showing how the twenty one bytes of the image would +//! appear on the display): +//! +//! \verbatim +//! +-------------------+-------------------+-------------------+ +//! | Byte 0 | Byte 1 | Byte 2 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 3 | Byte 4 | Byte 5 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 6 | Byte 7 | Byte 8 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 9 | Byte 10 | Byte 11 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 12 | Byte 13 | Byte 14 | +//! +---------+---------+---------+--3------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 15 | Byte 16 | Byte 17 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 18 | Byte 19 | Byte 20 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! \endverbatim +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by` +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4ImageDraw(const unsigned char *pucImage, unsigned long ulX, + unsigned long ulY, unsigned long ulWidth, + unsigned long ulHeight) +{ + static unsigned char pucBuffer[8]; + + // + // Check the arguments. + // + ASSERT(ulX < 128); + ASSERT((ulX & 1) == 0); + ASSERT(ulY < 64); + ASSERT((ulX + ulWidth) <= 128); + ASSERT((ulY + ulHeight) <= 64); + ASSERT((ulWidth & 1) == 0); + + // + // Setup a window starting at the specified column and row, and ending + // at the column + width and row+height. + // + pucBuffer[0] = 0x15; + pucBuffer[1] = ulX / 2; + pucBuffer[2] = (ulX + ulWidth - 2) / 2; + OSRAMWriteCommand(pucBuffer, 3); + pucBuffer[0] = 0x75; + pucBuffer[1] = ulY; + pucBuffer[2] = ulY + ulHeight - 1; + OSRAMWriteCommand(pucBuffer, 3); + OSRAMWriteCommand(g_pucOSRAM128x64x4HorizontalInc, + sizeof(g_pucOSRAM128x64x4HorizontalInc)); + + // + // Loop while there are more rows to display. + // + while(ulHeight--) + { + // + // Write this row of image data. + // + OSRAMWriteData(pucImage, (ulWidth / 2)); + + // + // Advance to the next row of the image. + // + pucImage += (ulWidth / 2); + } +} + +//***************************************************************************** +// +//! Enable the SSI component of the OLED display driver. +//! +//! \param ulFrequency specifies the SSI Clock Frequency to be used. +//! +//! This function initializes the SSI interface to the OLED display. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Enable(unsigned long ulFrequency) +{ + unsigned long ulTemp; + + // + // Disable the SSI port. + // + SSIDisable(SSI0_BASE); + + // + // Configure the SSI0 port for master mode. + // + SSIConfig(SSI0_BASE, SSI_FRF_MOTO_MODE_2, SSI_MODE_MASTER, ulFrequency, 8); + + // + // (Re)Enable SSI control of the FSS pin. + // + GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_3); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + + // + // Enable the SSI port. + // + SSIEnable(SSI0_BASE); + + // + // Drain the receive fifo. + // + while(SSIDataNonBlockingGet(SSI0_BASE, &ulTemp) != 0) + { + } + + // + // Indicate that the OSRAM driver can use the SSI Port. + // + g_bSSIEnabled = true; +} + +//***************************************************************************** +// +//! Enable the SSI component of the OLED display driver. +//! +//! \param ulFrequency specifies the SSI Clock Frequency to be used. +//! +//! This function initializes the SSI interface to the OLED display. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Disable(void) +{ + unsigned long ulTemp; + + // + // Indicate that the OSRAM driver can no longer use the SSI Port. + // + g_bSSIEnabled = false; + + // + // Drain the receive fifo. + // + while(SSIDataNonBlockingGet(SSI0_BASE, &ulTemp) != 0) + { + } + + // + // Disable the SSI port. + // + SSIDisable(SSI0_BASE); + + // + // Disable SSI control of the FSS pin. + // + GPIODirModeSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_DIR_MODE_OUT); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_PIN_3); + +} + +//***************************************************************************** +// +//! Initialize the OLED display. +//! +//! \param ulFrequency specifies the SSI Clock Frequency to be used. +//! +//! This function initializes the SSI interface to the OLED display and +//! configures the SSD0323 controller on the panel. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Init(unsigned long ulFrequency) +{ + unsigned long ulIdx; + + // + // Enable the SSI0 and GPIO port blocks as they are needed by this driver. + // + SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); + + // + // Configure the SSI0CLK and SSIOTX pins for SSI operation. + // + GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_5); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_2, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_5, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + + // + // Configure the PC7 pin as a D/Cn signal for OLED device. + // + GPIODirModeSet(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_DIR_MODE_OUT); + GPIOPadConfigSet(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD); + GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_PIN_7); + + // + // Configure and enable the SSI0 port for master mode. + // + OSRAM128x64x4Enable(ulFrequency); + + // + // Clear the frame buffer. + // + OSRAM128x64x4Clear(); + + // + // Initialize the SSD0323 controller. Loop through the initialization + // sequence array, sending each command "string" to the controller. + // + for(ulIdx = 0; ulIdx < sizeof(g_pucOSRAM128x64x4Init); + ulIdx += g_pucOSRAM128x64x4Init[ulIdx] + 1) + { + // + // Send this command. + // + OSRAMWriteCommand(g_pucOSRAM128x64x4Init + ulIdx + 1, + g_pucOSRAM128x64x4Init[ulIdx] - 1); + } +} + +//***************************************************************************** +// +//! Turns on the OLED display. +//! +//! This function will turn on the OLED display, causing it to display the +//! contents of its internal frame buffer. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4DisplayOn(void) +{ + unsigned long ulIdx; + + // + // Initialize the SSD0323 controller. Loop through the initialization + // sequence array, sending each command "string" to the controller. + // + for(ulIdx = 0; ulIdx < sizeof(g_pucOSRAM128x64x4Init); + ulIdx += g_pucOSRAM128x64x4Init[ulIdx] + 1) + { + // + // Send this command. + // + OSRAMWriteCommand(g_pucOSRAM128x64x4Init + ulIdx + 1, + g_pucOSRAM128x64x4Init[ulIdx] - 1); + } +} + +//***************************************************************************** +// +//! Turns off the OLED display. +//! +//! This function will turn off the OLED display. This will stop the scanning +//! of the panel and turn off the on-chip DC-DC converter, preventing damage to +//! the panel due to burn-in (it has similar characters to a CRT in this +//! respect). +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4DisplayOff(void) +{ + static const unsigned char pucCommand1[] = + { + 0xAE, 0xAD, 0x02 + }; + + // + // Turn off the DC-DC converter and the display. + // + OSRAMWriteCommand(pucCommand1, sizeof(pucCommand1)); +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/osram128x64x4.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/osram128x64x4.h new file mode 100644 index 000000000..2ba7cb956 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/osram128x64x4.h @@ -0,0 +1,63 @@ +//***************************************************************************** +// +// osram128x64x4.h - Prototypes for the driver for the OSRAM 128x64x4 graphical +// OLED display. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __OSRAM128X64X4_H__ +#define __OSRAM128X64X4_H__ + +//***************************************************************************** +// +// Prototypes for the driver APIs. +// +//***************************************************************************** +extern void OSRAM128x64x4Clear(void); +extern void OSRAM128x64x4StringDraw(const char *pcStr, + unsigned long ulX, + unsigned long ulY, + unsigned char ucLevel); +extern void OSRAM128x64x4ImageDraw(const unsigned char *pucImage, + unsigned long ulX, + unsigned long ulY, + unsigned long ulWidth, + unsigned long ulHeight); +extern void OSRAM128x64x4Init(unsigned long ulFrequency); +extern void OSRAM128x64x4Enable(unsigned long ulFrequency); +extern void OSRAM128x64x4Disable(void); +extern void OSRAM128x64x4DisplayOn(void); +extern void OSRAM128x64x4DisplayOff(void); + +//***************************************************************************** +// +// The following macro(s) map old names for the OSRAM functions to the new +// names. In new code, the new names should be used in favor of the old names. +// +//***************************************************************************** +#ifndef DEPRECATED +#define OSRAM128x64x1InitSSI OSRAM128x64x4Enable +#endif + +#endif // __OSRAM128X64X4_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/pwm.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/pwm.h new file mode 100644 index 000000000..bb67fda19 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/pwm.h @@ -0,0 +1,161 @@ +//***************************************************************************** +// +// pwm.h - API function protoypes for Pulse Width Modulation (PWM) ports +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __PWM_H__ +#define __PWM_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following defines are passed to PWMGenConfigure() as the ulConfig +// parameter and specify the configuration of the PWM generator. +// +//***************************************************************************** +#define PWM_GEN_MODE_DOWN 0x00000000 // Down count mode +#define PWM_GEN_MODE_UP_DOWN 0x00000002 // Up/Down count mode +#define PWM_GEN_MODE_SYNC 0x00000038 // Synchronous updates +#define PWM_GEN_MODE_NO_SYNC 0x00000000 // Immediate updates +#define PWM_GEN_MODE_DBG_RUN 0x00000004 // Continue running in debug mode +#define PWM_GEN_MODE_DBG_STOP 0x00000000 // Stop running in debug mode + +//***************************************************************************** +// +// Defines for enabling, disabling, and clearing PWM generator interrupts and +// triggers. +// +//***************************************************************************** +#define PWM_INT_CNT_ZERO 0x00000001 // Int if COUNT = 0 +#define PWM_INT_CNT_LOAD 0x00000002 // Int if COUNT = LOAD +#define PWM_INT_CNT_AU 0x00000004 // Int if COUNT = CMPA U +#define PWM_INT_CNT_AD 0x00000008 // Int if COUNT = CMPA D +#define PWM_INT_CNT_BU 0x00000010 // Int if COUNT = CMPA U +#define PWM_INT_CNT_BD 0x00000020 // Int if COUNT = CMPA D +#define PWM_TR_CNT_ZERO 0x00000100 // Trig if COUNT = 0 +#define PWM_TR_CNT_LOAD 0x00000200 // Trig if COUNT = LOAD +#define PWM_TR_CNT_AU 0x00000400 // Trig if COUNT = CMPA U +#define PWM_TR_CNT_AD 0x00000800 // Trig if COUNT = CMPA D +#define PWM_TR_CNT_BU 0x00001000 // Trig if COUNT = CMPA U +#define PWM_TR_CNT_BD 0x00002000 // Trig if COUNT = CMPA D + +//***************************************************************************** +// +// Defines for enabling, disabling, and clearing PWM interrupts. +// +//***************************************************************************** +#define PWM_INT_GEN_0 0x00000001 // Generator 0 interrupt +#define PWM_INT_GEN_1 0x00000002 // Generator 1 interrupt +#define PWM_INT_GEN_2 0x00000004 // Generator 2 interrupt +#define PWM_INT_FAULT 0x00010000 // Fault interrupt + +//***************************************************************************** +// +// Defines to identify the generators within a module. +// +//***************************************************************************** +#define PWM_GEN_0 0x00000040 // Offset address of Gen0 +#define PWM_GEN_1 0x00000080 // Offset address of Gen1 +#define PWM_GEN_2 0x000000C0 // Offset address of Gen2 + +#define PWM_GEN_0_BIT 0x00000001 // Bit-wise ID for Gen0 +#define PWM_GEN_1_BIT 0x00000002 // Bit-wise ID for Gen1 +#define PWM_GEN_2_BIT 0x00000004 // Bit-wise ID for Gen2 + +//***************************************************************************** +// +// Defines to identify the outputs within a module. +// +//***************************************************************************** +#define PWM_OUT_0 0x00000040 // Encoded offset address of PWM0 +#define PWM_OUT_1 0x00000041 // Encoded offset address of PWM1 +#define PWM_OUT_2 0x00000082 // Encoded offset address of PWM2 +#define PWM_OUT_3 0x00000083 // Encoded offset address of PWM3 +#define PWM_OUT_4 0x000000C4 // Encoded offset address of PWM4 +#define PWM_OUT_5 0x000000C5 // Encoded offset address of PWM5 + +#define PWM_OUT_0_BIT 0x00000001 // Bit-wise ID for PWM0 +#define PWM_OUT_1_BIT 0x00000002 // Bit-wise ID for PWM1 +#define PWM_OUT_2_BIT 0x00000004 // Bit-wise ID for PWM2 +#define PWM_OUT_3_BIT 0x00000008 // Bit-wise ID for PWM3 +#define PWM_OUT_4_BIT 0x00000010 // Bit-wise ID for PWM4 +#define PWM_OUT_5_BIT 0x00000020 // Bit-wise ID for PWM5 + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void PWMGenConfigure(unsigned long ulBase, unsigned long ulGen, + unsigned long ulConfig); +extern void PWMGenPeriodSet(unsigned long ulBase, unsigned long ulGen, + unsigned long ulPeriod); +extern unsigned long PWMGenPeriodGet(unsigned long ulBase, + unsigned long ulGen); +extern void PWMGenEnable(unsigned long ulBase, unsigned long ulGen); +extern void PWMGenDisable(unsigned long ulBase, unsigned long ulGen); +extern void PWMPulseWidthSet(unsigned long ulBase, unsigned long ulPWMOut, + unsigned long ulWidth); +extern unsigned long PWMPulseWidthGet(unsigned long ulBase, + unsigned long ulPWMOut); +extern void PWMDeadBandEnable(unsigned long ulBase, unsigned long ulGen, + unsigned short usRise, unsigned short usFall); +extern void PWMDeadBandDisable(unsigned long ulBase, unsigned long ulGen); +extern void PWMSyncUpdate(unsigned long ulBase, unsigned long ulGenBits); +extern void PWMSyncTimeBase(unsigned long ulBase, unsigned long ulGenBits); +extern void PWMOutputState(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bEnable); +extern void PWMOutputInvert(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bInvert); +extern void PWMOutputFault(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bFaultKill); +extern void PWMGenIntRegister(unsigned long ulBase, unsigned long ulGen, + void (*pfnIntHandler)(void)); +extern void PWMGenIntUnregister(unsigned long ulBase, unsigned long ulGen); +extern void PWMFaultIntRegister(unsigned long ulBase, + void (*pfnIntHandler)(void)); +extern void PWMFaultIntUnregister(unsigned long ulBase); +extern void PWMGenIntTrigEnable(unsigned long ulBase, unsigned long ulGen, + unsigned long ulIntTrig); +extern void PWMGenIntTrigDisable(unsigned long ulBase, unsigned long ulGen, + unsigned long ulIntTrig); +extern unsigned long PWMGenIntStatus(unsigned long ulBase, unsigned long ulGen, + tBoolean bMasked); +extern void PWMGenIntClear(unsigned long ulBase, unsigned long ulGen, + unsigned long ulInts); +extern void PWMIntEnable(unsigned long ulBase, unsigned long ulGenFault); +extern void PWMIntDisable(unsigned long ulBase, unsigned long ulGenFault); +extern void PWMFaultIntClear(unsigned long ulBase); +extern unsigned long PWMIntStatus(unsigned long ulBase, tBoolean bMasked); + +#ifdef __cplusplus +} +#endif + +#endif // __PWM_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/qei.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/qei.h new file mode 100644 index 000000000..89d5b20bc --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/qei.h @@ -0,0 +1,104 @@ +//***************************************************************************** +// +// qei.h - Prototypes for the Quadrature Encoder Driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __QEI_H__ +#define __QEI_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to QEIConfigure as the ulConfig paramater. +// +//***************************************************************************** +#define QEI_CONFIG_CAPTURE_A 0x00000000 // Count on ChA edges only +#define QEI_CONFIG_CAPTURE_A_B 0x00000008 // Count on ChA and ChB edges +#define QEI_CONFIG_NO_RESET 0x00000000 // Do not reset on index pulse +#define QEI_CONFIG_RESET_IDX 0x00000010 // Reset position on index pulse +#define QEI_CONFIG_QUADRATURE 0x00000000 // ChA and ChB are quadrature +#define QEI_CONFIG_CLOCK_DIR 0x00000004 // ChA and ChB are clock and dir +#define QEI_CONFIG_NO_SWAP 0x00000000 // Do not swap ChA and ChB +#define QEI_CONFIG_SWAP 0x00000002 // Swap ChA and ChB + +//***************************************************************************** +// +// Values that can be passed to QEIVelocityConfigure as the ulPreDiv parameter. +// +//***************************************************************************** +#define QEI_VELDIV_1 0x00000000 // Predivide by 1 +#define QEI_VELDIV_2 0x00000040 // Predivide by 2 +#define QEI_VELDIV_4 0x00000080 // Predivide by 4 +#define QEI_VELDIV_8 0x000000C0 // Predivide by 8 +#define QEI_VELDIV_16 0x00000100 // Predivide by 16 +#define QEI_VELDIV_32 0x00000140 // Predivide by 32 +#define QEI_VELDIV_64 0x00000180 // Predivide by 64 +#define QEI_VELDIV_128 0x000001C0 // Predivide by 128 + +//***************************************************************************** +// +// Values that can be passed to QEIEnableInts, QEIDisableInts, and QEIClearInts +// as the ulIntFlags parameter, and returned by QEIGetIntStatus. +// +//***************************************************************************** +#define QEI_INTERROR 0x00000008 // Phase error detected +#define QEI_INTDIR 0x00000004 // Direction change +#define QEI_INTTIMER 0x00000002 // Velocity timer expired +#define QEI_INTINDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void QEIEnable(unsigned long ulBase); +extern void QEIDisable(unsigned long ulBase); +extern void QEIConfigure(unsigned long ulBase, unsigned long ulConfig, + unsigned long ulMaxPosition); +extern unsigned long QEIPositionGet(unsigned long ulBase); +extern void QEIPositionSet(unsigned long ulBase, unsigned long ulPosition); +extern long QEIDirectionGet(unsigned long ulBase); +extern tBoolean QEIErrorGet(unsigned long ulBase); +extern void QEIVelocityEnable(unsigned long ulBase); +extern void QEIVelocityDisable(unsigned long ulBase); +extern void QEIVelocityConfigure(unsigned long ulBase, unsigned long ulPreDiv, + unsigned long ulPeriod); +extern unsigned long QEIVelocityGet(unsigned long ulBase); +extern void QEIIntRegister(unsigned long ulBase, void (*pfnHandler)(void)); +extern void QEIIntUnregister(unsigned long ulBase); +extern void QEIIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void QEIIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long QEIIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void QEIIntClear(unsigned long ulBase, unsigned long ulIntFlags); + +#ifdef __cplusplus +} +#endif + +#endif // __QEI_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/ssi.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/ssi.h new file mode 100644 index 000000000..227b6bd9b --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/ssi.h @@ -0,0 +1,89 @@ +//***************************************************************************** +// +// ssi.h - Prototypes for the Synchronous Serial Interface Driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __SSI_H__ +#define __SSI_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to SSIIntEnable, SSIIntDisable, and SSIIntClear +// as the ulIntFlags parameter, and returned by SSIIntStatus. +// +//***************************************************************************** +#define SSI_TXFF 0x00000008 // TX FIFO half empty or less +#define SSI_RXFF 0x00000004 // RX FIFO half full or less +#define SSI_RXTO 0x00000002 // RX timeout +#define SSI_RXOR 0x00000001 // RX overrun + +//***************************************************************************** +// +// Values that can be passed to SSIConfig. +// +//***************************************************************************** +#define SSI_FRF_MOTO_MODE_0 0x00000000 // Moto fmt, polarity 0, phase 0 +#define SSI_FRF_MOTO_MODE_1 0x00000002 // Moto fmt, polarity 0, phase 1 +#define SSI_FRF_MOTO_MODE_2 0x00000001 // Moto fmt, polarity 1, phase 0 +#define SSI_FRF_MOTO_MODE_3 0x00000003 // Moto fmt, polarity 1, phase 1 +#define SSI_FRF_TI 0x00000010 // TI frame format +#define SSI_FRF_NMW 0x00000020 // National MicroWire frame format + +#define SSI_MODE_MASTER 0x00000000 // SSI master +#define SSI_MODE_SLAVE 0x00000001 // SSI slave +#define SSI_MODE_SLAVE_OD 0x00000002 // SSI slave with output disabled + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void SSIConfig(unsigned long ulBase, unsigned long ulProtocol, + unsigned long ulMode, unsigned long ulBitRate, + unsigned long ulDataWidth); +extern void SSIDataGet(unsigned long ulBase, unsigned long *pulData); +extern long SSIDataNonBlockingGet(unsigned long ulBase, + unsigned long *pulData); +extern void SSIDataPut(unsigned long ulBase, unsigned long ulData); +extern long SSIDataNonBlockingPut(unsigned long ulBase, unsigned long ulData); +extern void SSIDisable(unsigned long ulBase); +extern void SSIEnable(unsigned long ulBase); +extern void SSIIntClear(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntRegister(unsigned long ulBase, void(*pfnHandler)(void)); +extern unsigned long SSIIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void SSIIntUnregister(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __SSI_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/sysctl.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/sysctl.h new file mode 100644 index 000000000..d2efbca0d --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/sysctl.h @@ -0,0 +1,301 @@ +//***************************************************************************** +// +// sysctl.h - Prototypes for the system control driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __SYSCTL_H__ +#define __SYSCTL_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following are values that can be passed to the +// SysCtlPeripheralPresent(), SysCtlPeripheralEnable(), +// SysCtlPeripheralDisable(), and SysCtlPeripheralReset() APIs as the +// ulPeripheral parameter. The peripherals in the fourth group (upper nibble +// is 3) can only be used with the SysCtlPeripheralPresent() API. +// +//***************************************************************************** +#define SYSCTL_PERIPH_PWM 0x00100010 // PWM +#define SYSCTL_PERIPH_ADC 0x00100001 // ADC +#define SYSCTL_PERIPH_HIBERNATE 0x00000040 // Hibernation module +#define SYSCTL_PERIPH_WDOG 0x00000008 // Watchdog +#define SYSCTL_PERIPH_CAN0 0x00100100 // CAN 0 +#define SYSCTL_PERIPH_CAN1 0x00100200 // CAN 1 +#define SYSCTL_PERIPH_UART0 0x10000001 // UART 0 +#define SYSCTL_PERIPH_UART1 0x10000002 // UART 1 +#define SYSCTL_PERIPH_UART2 0x10000004 // UART 2 +#define SYSCTL_PERIPH_SSI 0x10000010 // SSI +#define SYSCTL_PERIPH_SSI0 0x10000010 // SSI 0 +#define SYSCTL_PERIPH_SSI1 0x10000020 // SSI 1 +#define SYSCTL_PERIPH_QEI 0x10000100 // QEI +#define SYSCTL_PERIPH_QEI0 0x10000100 // QEI 0 +#define SYSCTL_PERIPH_QEI1 0x10000200 // QEI 1 +#define SYSCTL_PERIPH_I2C 0x10001000 // I2C +#define SYSCTL_PERIPH_I2C0 0x10001000 // I2C 0 +#define SYSCTL_PERIPH_I2C1 0x10004000 // I2C 1 +#define SYSCTL_PERIPH_TIMER0 0x10100001 // Timer 0 +#define SYSCTL_PERIPH_TIMER1 0x10100002 // Timer 1 +#define SYSCTL_PERIPH_TIMER2 0x10100004 // Timer 2 +#define SYSCTL_PERIPH_TIMER3 0x10100008 // Timer 3 +#define SYSCTL_PERIPH_COMP0 0x10100100 // Analog comparator 0 +#define SYSCTL_PERIPH_COMP1 0x10100200 // Analog comparator 1 +#define SYSCTL_PERIPH_COMP2 0x10100400 // Analog comparator 2 +#define SYSCTL_PERIPH_GPIOA 0x20000001 // GPIO A +#define SYSCTL_PERIPH_GPIOB 0x20000002 // GPIO B +#define SYSCTL_PERIPH_GPIOC 0x20000004 // GPIO C +#define SYSCTL_PERIPH_GPIOD 0x20000008 // GPIO D +#define SYSCTL_PERIPH_GPIOE 0x20000010 // GPIO E +#define SYSCTL_PERIPH_GPIOF 0x20000020 // GPIO F +#define SYSCTL_PERIPH_GPIOG 0x20000040 // GPIO G +#define SYSCTL_PERIPH_GPIOH 0x20000080 // GPIO H +#define SYSCTL_PERIPH_ETH 0x20105000 // ETH +#define SYSCTL_PERIPH_MPU 0x30000080 // Cortex M3 MPU +#define SYSCTL_PERIPH_TEMP 0x30000020 // Temperature sensor +#define SYSCTL_PERIPH_PLL 0x30000010 // PLL + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlPinPresent() API +// as the ulPin parameter. +// +//***************************************************************************** +#define SYSCTL_PIN_PWM0 0x00000001 // PWM0 pin +#define SYSCTL_PIN_PWM1 0x00000002 // PWM1 pin +#define SYSCTL_PIN_PWM2 0x00000004 // PWM2 pin +#define SYSCTL_PIN_PWM3 0x00000008 // PWM3 pin +#define SYSCTL_PIN_PWM4 0x00000010 // PWM4 pin +#define SYSCTL_PIN_PWM5 0x00000020 // PWM5 pin +#define SYSCTL_PIN_C0MINUS 0x00000040 // C0- pin +#define SYSCTL_PIN_C0PLUS 0x00000080 // C0+ pin +#define SYSCTL_PIN_C0O 0x00000100 // C0o pin +#define SYSCTL_PIN_C1MINUS 0x00000200 // C1- pin +#define SYSCTL_PIN_C1PLUS 0x00000400 // C1+ pin +#define SYSCTL_PIN_C1O 0x00000800 // C1o pin +#define SYSCTL_PIN_C2MINUS 0x00001000 // C2- pin +#define SYSCTL_PIN_C2PLUS 0x00002000 // C2+ pin +#define SYSCTL_PIN_C2O 0x00004000 // C2o pin +#define SYSCTL_PIN_MC_FAULT0 0x00008000 // MC0 Fault pin +#define SYSCTL_PIN_ADC0 0x00010000 // ADC0 pin +#define SYSCTL_PIN_ADC1 0x00020000 // ADC1 pin +#define SYSCTL_PIN_ADC2 0x00040000 // ADC2 pin +#define SYSCTL_PIN_ADC3 0x00080000 // ADC3 pin +#define SYSCTL_PIN_ADC4 0x00100000 // ADC4 pin +#define SYSCTL_PIN_ADC5 0x00200000 // ADC5 pin +#define SYSCTL_PIN_ADC6 0x00400000 // ADC6 pin +#define SYSCTL_PIN_ADC7 0x00800000 // ADC7 pin +#define SYSCTL_PIN_CCP0 0x01000000 // CCP0 pin +#define SYSCTL_PIN_CCP1 0x02000000 // CCP1 pin +#define SYSCTL_PIN_CCP2 0x04000000 // CCP2 pin +#define SYSCTL_PIN_CCP3 0x08000000 // CCP3 pin +#define SYSCTL_PIN_CCP4 0x10000000 // CCP4 pin +#define SYSCTL_PIN_CCP5 0x20000000 // CCP5 pin +#define SYSCTL_PIN_32KHZ 0x80000000 // 32kHz pin + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlLDOSet() API as +// the ulVoltage value, or returned by the SysCtlLDOGet() API. +// +//***************************************************************************** +#define SYSCTL_LDO_2_25V 0x00000005 // LDO output of 2.25V +#define SYSCTL_LDO_2_30V 0x00000004 // LDO output of 2.30V +#define SYSCTL_LDO_2_35V 0x00000003 // LDO output of 2.35V +#define SYSCTL_LDO_2_40V 0x00000002 // LDO output of 2.40V +#define SYSCTL_LDO_2_45V 0x00000001 // LDO output of 2.45V +#define SYSCTL_LDO_2_50V 0x00000000 // LDO output of 2.50V +#define SYSCTL_LDO_2_55V 0x0000001f // LDO output of 2.55V +#define SYSCTL_LDO_2_60V 0x0000001e // LDO output of 2.60V +#define SYSCTL_LDO_2_65V 0x0000001d // LDO output of 2.65V +#define SYSCTL_LDO_2_70V 0x0000001c // LDO output of 2.70V +#define SYSCTL_LDO_2_75V 0x0000001b // LDO output of 2.75V + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlLDOConfigSet() API. +// +//***************************************************************************** +#define SYSCTL_LDOCFG_ARST 0x00000001 // Allow LDO failure to reset +#define SYSCTL_LDOCFG_NORST 0x00000000 // Do not reset on LDO failure + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlIntEnable(), +// SysCtlIntDisable(), and SysCtlIntClear() APIs, or returned in the bit mask +// by the SysCtlIntStatus() API. +// +//***************************************************************************** +#define SYSCTL_INT_PLL_LOCK 0x00000040 // PLL lock interrupt +#define SYSCTL_INT_CUR_LIMIT 0x00000020 // Current limit interrupt +#define SYSCTL_INT_IOSC_FAIL 0x00000010 // Internal oscillator failure int +#define SYSCTL_INT_MOSC_FAIL 0x00000008 // Main oscillator failure int +#define SYSCTL_INT_POR 0x00000004 // Power on reset interrupt +#define SYSCTL_INT_BOR 0x00000002 // Brown out interrupt +#define SYSCTL_INT_PLL_FAIL 0x00000001 // PLL failure interrupt + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlResetCauseClear() +// API or returned by the SysCtlResetCauseGet() API. +// +//***************************************************************************** +#define SYSCTL_CAUSE_LDO 0x00000020 // LDO power not OK reset +#define SYSCTL_CAUSE_SW 0x00000010 // Software reset +#define SYSCTL_CAUSE_WDOG 0x00000008 // Watchdog reset +#define SYSCTL_CAUSE_BOR 0x00000004 // Brown-out reset +#define SYSCTL_CAUSE_POR 0x00000002 // Power on reset +#define SYSCTL_CAUSE_EXT 0x00000001 // External reset + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlBrownOutConfigSet() +// API as the ulConfig parameter. +// +//***************************************************************************** +#define SYSCTL_BOR_RESET 0x00000002 // Reset instead of interrupting +#define SYSCTL_BOR_RESAMPLE 0x00000001 // Resample BOR before asserting + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlPWMClockSet() API +// as the ulConfig parameter, and can be returned by the SysCtlPWMClockGet() +// API. +// +//***************************************************************************** +#define SYSCTL_PWMDIV_1 0x00000000 // PWM clock is processor clock /1 +#define SYSCTL_PWMDIV_2 0x00100000 // PWM clock is processor clock /2 +#define SYSCTL_PWMDIV_4 0x00120000 // PWM clock is processor clock /4 +#define SYSCTL_PWMDIV_8 0x00140000 // PWM clock is processor clock /8 +#define SYSCTL_PWMDIV_16 0x00160000 // PWM clock is processor clock /16 +#define SYSCTL_PWMDIV_32 0x00180000 // PWM clock is processor clock /32 +#define SYSCTL_PWMDIV_64 0x001A0000 // PWM clock is processor clock /64 + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlADCSpeedSet() API +// as the ulSpeed parameter, and can be returned by the SyCtlADCSpeedGet() +// API. +// +//***************************************************************************** +#define SYSCTL_ADCSPEED_1MSPS 0x00000300 // 1,000,000 samples per second +#define SYSCTL_ADCSPEED_500KSPS 0x00000200 // 500,000 samples per second +#define SYSCTL_ADCSPEED_250KSPS 0x00000100 // 250,000 samples per second +#define SYSCTL_ADCSPEED_125KSPS 0x00000000 // 125,000 samples per second + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlClockSet() API as +// the ulConfig parameter. +// +//***************************************************************************** +#define SYSCTL_SYSDIV_1 0x07800000 // Processor clock is osc/pll /1 +#define SYSCTL_SYSDIV_2 0x00C00000 // Processor clock is osc/pll /2 +#define SYSCTL_SYSDIV_3 0x01400000 // Processor clock is osc/pll /3 +#define SYSCTL_SYSDIV_4 0x01C00000 // Processor clock is osc/pll /4 +#define SYSCTL_SYSDIV_5 0x02400000 // Processor clock is osc/pll /5 +#define SYSCTL_SYSDIV_6 0x02C00000 // Processor clock is osc/pll /6 +#define SYSCTL_SYSDIV_7 0x03400000 // Processor clock is osc/pll /7 +#define SYSCTL_SYSDIV_8 0x03C00000 // Processor clock is osc/pll /8 +#define SYSCTL_SYSDIV_9 0x04400000 // Processor clock is osc/pll /9 +#define SYSCTL_SYSDIV_10 0x04C00000 // Processor clock is osc/pll /10 +#define SYSCTL_SYSDIV_11 0x05400000 // Processor clock is osc/pll /11 +#define SYSCTL_SYSDIV_12 0x05C00000 // Processor clock is osc/pll /12 +#define SYSCTL_SYSDIV_13 0x06400000 // Processor clock is osc/pll /13 +#define SYSCTL_SYSDIV_14 0x06C00000 // Processor clock is osc/pll /14 +#define SYSCTL_SYSDIV_15 0x07400000 // Processor clock is osc/pll /15 +#define SYSCTL_SYSDIV_16 0x07C00000 // Processor clock is osc/pll /16 +#define SYSCTL_USE_PLL 0x00000000 // System clock is the PLL clock +#define SYSCTL_USE_OSC 0x00003800 // System clock is the osc clock +#define SYSCTL_XTAL_3_57MHZ 0x00000100 // External crystal is 3.579545MHz +#define SYSCTL_XTAL_3_68MHZ 0x00000140 // External crystal is 3.6864MHz +#define SYSCTL_XTAL_4MHZ 0x00000180 // External crystal is 4MHz +#define SYSCTL_XTAL_4_09MHZ 0x000001C0 // External crystal is 4.096MHz +#define SYSCTL_XTAL_4_91MHZ 0x00000200 // External crystal is 4.9152MHz +#define SYSCTL_XTAL_5MHZ 0x00000240 // External crystal is 5MHz +#define SYSCTL_XTAL_5_12MHZ 0x00000280 // External crystal is 5.12MHz +#define SYSCTL_XTAL_6MHZ 0x000002C0 // External crystal is 6MHz +#define SYSCTL_XTAL_6_14MHZ 0x00000300 // External crystal is 6.144MHz +#define SYSCTL_XTAL_7_37MHZ 0x00000340 // External crystal is 7.3728MHz +#define SYSCTL_XTAL_8MHZ 0x00000380 // External crystal is 8MHz +#define SYSCTL_XTAL_8_19MHZ 0x000003C0 // External crystal is 8.192MHz +#define SYSCTL_OSC_MAIN 0x00000000 // Oscillator source is main osc +#define SYSCTL_OSC_INT 0x00000010 // Oscillator source is int. osc +#define SYSCTL_OSC_INT4 0x00000020 // Oscillator source is int. osc /4 +#define SYSCTL_INT_OSC_DIS 0x00000002 // Disable internal oscillator +#define SYSCTL_MAIN_OSC_DIS 0x00000001 // Disable main oscillator + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern unsigned long SysCtlSRAMSizeGet(void); +extern unsigned long SysCtlFlashSizeGet(void); +extern tBoolean SysCtlPinPresent(unsigned long ulPin); +extern tBoolean SysCtlPeripheralPresent(unsigned long ulPeripheral); +extern void SysCtlPeripheralReset(unsigned long ulPeripheral); +extern void SysCtlPeripheralEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralSleepEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralSleepDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDeepSleepEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDeepSleepDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralClockGating(tBoolean bEnable); +extern void SysCtlIntRegister(void (*pfnHandler)(void)); +extern void SysCtlIntUnregister(void); +extern void SysCtlIntEnable(unsigned long ulInts); +extern void SysCtlIntDisable(unsigned long ulInts); +extern void SysCtlIntClear(unsigned long ulInts); +extern unsigned long SysCtlIntStatus(tBoolean bMasked); +extern void SysCtlLDOSet(unsigned long ulVoltage); +extern unsigned long SysCtlLDOGet(void); +extern void SysCtlLDOConfigSet(unsigned long ulConfig); +extern void SysCtlReset(void); +extern void SysCtlSleep(void); +extern void SysCtlDeepSleep(void); +extern unsigned long SysCtlResetCauseGet(void); +extern void SysCtlResetCauseClear(unsigned long ulCauses); +extern void SysCtlBrownOutConfigSet(unsigned long ulConfig, + unsigned long ulDelay); +extern void SysCtlClockSet(unsigned long ulConfig); +extern unsigned long SysCtlClockGet(void); +extern void SysCtlPWMClockSet(unsigned long ulConfig); +extern unsigned long SysCtlPWMClockGet(void); +extern void SysCtlADCSpeedSet(unsigned long ulSpeed); +extern unsigned long SysCtlADCSpeedGet(void); +extern void SysCtlIOSCVerificationSet(tBoolean bEnable); +extern void SysCtlMOSCVerificationSet(tBoolean bEnable); +extern void SysCtlPLLVerificationSet(tBoolean bEnable); +extern void SysCtlClkVerificationClear(void); + +#ifdef __cplusplus +} +#endif + +#endif // __SYSCTL_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/systick.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/systick.h new file mode 100644 index 000000000..f89bf65b8 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/systick.h @@ -0,0 +1,55 @@ +//***************************************************************************** +// +// systick.h - Prototypes for the SysTick driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __SYSTICK_H__ +#define __SYSTICK_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void SysTickEnable(void); +extern void SysTickDisable(void); +extern void SysTickIntRegister(void (*pfnHandler)(void)); +extern void SysTickIntUnregister(void); +extern void SysTickIntEnable(void); +extern void SysTickIntDisable(void); +extern void SysTickPeriodSet(unsigned long ulPeriod); +extern unsigned long SysTickPeriodGet(void); +extern unsigned long SysTickValueGet(void); + +#ifdef __cplusplus +} +#endif + +#endif // __SYSTICK_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/uart.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/uart.h new file mode 100644 index 000000000..a0e16db33 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/uart.h @@ -0,0 +1,104 @@ +//***************************************************************************** +// +// uart.h - Defines and Macros for the UART. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __UART_H__ +#define __UART_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to UARTIntEnable, UARTIntDisable, and UARTIntClear +// as the ulIntFlags parameter, and returned from UARTIntStatus. +// +//***************************************************************************** +#define UART_INT_OE 0x400 // Overrun Error Interrupt Mask +#define UART_INT_BE 0x200 // Break Error Interrupt Mask +#define UART_INT_PE 0x100 // Parity Error Interrupt Mask +#define UART_INT_FE 0x080 // Framing Error Interrupt Mask +#define UART_INT_RT 0x040 // Receive Timeout Interrupt Mask +#define UART_INT_TX 0x020 // Transmit Interrupt Mask +#define UART_INT_RX 0x010 // Receive Interrupt Mask + +//***************************************************************************** +// +// Values that can be passed to UARTConfigSet as the ulConfig parameter and +// returned by UARTConfigGet in the pulConfig parameter. Additionally, the +// UART_CONFIG_PAR_* subset can be passed to UARTParityModeSet as the ulParity +// parameter, and are returned by UARTParityModeGet. +// +//***************************************************************************** +#define UART_CONFIG_WLEN_8 0x00000060 // 8 bit data +#define UART_CONFIG_WLEN_7 0x00000040 // 7 bit data +#define UART_CONFIG_WLEN_6 0x00000020 // 6 bit data +#define UART_CONFIG_WLEN_5 0x00000000 // 5 bit data +#define UART_CONFIG_STOP_ONE 0x00000000 // One stop bit +#define UART_CONFIG_STOP_TWO 0x00000008 // Two stop bits +#define UART_CONFIG_PAR_NONE 0x00000000 // No parity +#define UART_CONFIG_PAR_EVEN 0x00000006 // Even parity +#define UART_CONFIG_PAR_ODD 0x00000002 // Odd parity +#define UART_CONFIG_PAR_ONE 0x00000086 // Parity bit is one +#define UART_CONFIG_PAR_ZERO 0x00000082 // Parity bit is zero + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void UARTParityModeSet(unsigned long ulBase, unsigned long ulParity); +extern unsigned long UARTParityModeGet(unsigned long ulBase); +extern void UARTConfigSet(unsigned long ulBase, unsigned long ulBaud, + unsigned long ulConfig); +extern void UARTConfigGet(unsigned long ulBase, unsigned long *pulBaud, + unsigned long *pulConfig); +extern void UARTEnable(unsigned long ulBase); +extern void UARTDisable(unsigned long ulBase); +extern void UARTEnableSIR(unsigned long ulBase, tBoolean bLowPower); +extern void UARTDisableSIR(unsigned long ulBase); +extern tBoolean UARTCharsAvail(unsigned long ulBase); +extern tBoolean UARTSpaceAvail(unsigned long ulBase); +extern long UARTCharNonBlockingGet(unsigned long ulBase); +extern long UARTCharGet(unsigned long ulBase); +extern tBoolean UARTCharNonBlockingPut(unsigned long ulBase, + unsigned char ucData); +extern void UARTCharPut(unsigned long ulBase, unsigned char ucData); +extern void UARTBreakCtl(unsigned long ulBase, tBoolean bBreakState); +extern void UARTIntRegister(unsigned long ulBase, void(*pfnHandler)(void)); +extern void UARTIntUnregister(unsigned long ulBase); +extern void UARTIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void UARTIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long UARTIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void UARTIntClear(unsigned long ulBase, unsigned long ulIntFlags); + +#ifdef __cplusplus +} +#endif + +#endif // __UART_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/watchdog.h b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/watchdog.h new file mode 100644 index 000000000..2d0ad37a0 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/LuminaryDrivers/watchdog.h @@ -0,0 +1,63 @@ +//***************************************************************************** +// +// watchdog.h - Prototypes for the Watchdog Timer API +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __WATCHDOG_H__ +#define __WATCHDOG_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern tBoolean WatchdogRunning(unsigned long ulBase); +extern void WatchdogEnable(unsigned long ulBase); +extern void WatchdogResetEnable(unsigned long ulBase); +extern void WatchdogResetDisable(unsigned long ulBase); +extern void WatchdogLock(unsigned long ulBase); +extern void WatchdogUnlock(unsigned long ulBase); +extern tBoolean WatchdogLockState(unsigned long ulBase); +extern void WatchdogReloadSet(unsigned long ulBase, unsigned long ulLoadVal); +extern unsigned long WatchdogReloadGet(unsigned long ulBase); +extern unsigned long WatchdogValueGet(unsigned long ulBase); +extern void WatchdogIntRegister(unsigned long ulBase, void(*pfnHandler)(void)); +extern void WatchdogIntUnregister(unsigned long ulBase); +extern void WatchdogIntEnable(unsigned long ulBase); +extern unsigned long WatchdogIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void WatchdogIntClear(unsigned long ulBase); +extern void WatchdogStallDisable(unsigned long ulBase); +extern void WatchdogStallDisable(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __WATCHDOG_H__ diff --git a/Demo/CORTEX_LM3S6965_IAR/ParTest/ParTest.c b/Demo/CORTEX_LM3S6965_IAR/ParTest/ParTest.c new file mode 100644 index 000000000..f16ae6291 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/ParTest/ParTest.c @@ -0,0 +1,83 @@ +/* + FreeRTOS.org V4.3.0 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + + Also see http://www.SafeRTOS.com for an IEC 61508 compliant version along + with commercial development and support options. + *************************************************************************** +*/ + +/*----------------------------------------------------------- + * Simple parallel port IO routines. + *-----------------------------------------------------------*/ + +/* +*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Demo includes. */ +#include "partest.h" + +/* Library includes. */ +#include "hw_types.h" +#include "gpio.h" +#include "hw_memmap.h" + + +/*-----------------------------------------------------------*/ + +void vParTestInitialise( void ) +{ + GPIODirModeSet( GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_DIR_MODE_OUT ); + GPIOPadConfigSet( GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD ); + GPIOPinWrite( GPIO_PORTF_BASE, GPIO_PIN_0, 0 ); +} +/*-----------------------------------------------------------*/ + +void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue ) +{ + /* There is only one LED. */ + ( void ) uxLED; + + GPIOPinWrite( GPIO_PORTF_BASE, GPIO_PIN_0, xValue ); +} +/*-----------------------------------------------------------*/ + +unsigned portBASE_TYPE uxParTestGetLED( unsigned portBASE_TYPE uxLED ) +{ + /* There is only one LED. */ + ( void ) uxLED; + + return GPIOPinRead( GPIO_PORTF_BASE, GPIO_PIN_0 ); +} + + diff --git a/Demo/CORTEX_LM3S6965_IAR/RTOSDemo.dep b/Demo/CORTEX_LM3S6965_IAR/RTOSDemo.dep new file mode 100644 index 000000000..478745d3b --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/RTOSDemo.dep @@ -0,0 +1,856 @@ + + + + 2 + + Debug + + $PROJ_DIR$\timertest.c + $PROJ_DIR$\..\..\Source\portable\IAR\ARM_CM3\portasm.s + $PROJ_DIR$\..\..\Source\queue.c + $PROJ_DIR$\Debug\Obj\heap_2.r79 + $PROJ_DIR$\..\..\Source\list.c + $PROJ_DIR$\..\..\Source\portable\MemMang\heap_2.c + $PROJ_DIR$\LuminaryDrivers\osram128x64x4.c + $PROJ_DIR$\..\Common\Minimal\BlockQ.c + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\uip.c + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\uip_arp.c + $PROJ_DIR$\Debug\Obj\integer.r79 + $PROJ_DIR$\webserver\uIP_Task.c + $PROJ_DIR$\LuminaryDrivers\osram128x64x4.h + $PROJ_DIR$\Debug\Obj\uIP_Task.r79 + $PROJ_DIR$\Debug\Obj\port.pbi + $PROJ_DIR$\..\..\..\..\..\Demo\CORTEX_LM3S6965_IAR\main.c + $PROJ_DIR$\..\..\Source\include\list.h + $PROJ_DIR$\Debug\Obj\PollQ.r79 + $PROJ_DIR$\Debug\Obj\httpd.pbi + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\lc.h + $PROJ_DIR$\..\..\Source\tasks.c + $PROJ_DIR$\startup_ewarm.c + $PROJ_DIR$\..\Common\Minimal\blocktim.c + $PROJ_DIR$\Debug\Obj\startup_ewarm.r79 + $PROJ_DIR$\Debug\Obj\flash.r79 + $PROJ_DIR$\LuminaryDrivers\sysctl.h + $PROJ_DIR$\Debug\Obj\tasks.r79 + $PROJ_DIR$\webserver\http-strings.h + $PROJ_DIR$\..\Common\include\integer.h + $PROJ_DIR$\Debug\Obj\queue.r79 + $PROJ_DIR$\Debug\Obj\port.r79 + $PROJ_DIR$\..\..\Source\portable\IAR\ARM_CM3\port.c + $PROJ_DIR$\Debug\Exe\RTOSDemo.d79 + $PROJ_DIR$\LuminaryDrivers\LMI_timer.h + $PROJ_DIR$\LuminaryDrivers\debug.h + $PROJ_DIR$\Debug\Obj\ParTest.r79 + $TOOLKIT_DIR$\inc\DLib_Product.h + $PROJ_DIR$\Debug\Exe\RTOSDemo.sim + $PROJ_DIR$\LuminaryDrivers\pdc.h + $PROJ_DIR$\webserver\emac.h + $PROJ_DIR$\webserver\httpd.c + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\psock.c + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\timer.c + $PROJ_DIR$\LuminaryDrivers\hw_ethernet.h + $PROJ_DIR$\Debug\Obj\httpd-fs.r79 + $PROJ_DIR$\Debug\Obj\ParTest.pbi + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\timer.h + $PROJ_DIR$\Debug\Obj\psock.r79 + $PROJ_DIR$\Debug\Obj\http-strings.r79 + $PROJ_DIR$\..\Common\include\partest.h + $PROJ_DIR$\..\Common\Minimal\integer.c + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\pt.h + $PROJ_DIR$\Debug\Obj\list.pbi + $PROJ_DIR$\..\..\Source\include\croutine.h + $PROJ_DIR$\LuminaryDrivers\ethernet.h + $TOOLKIT_DIR$\inc\stdio.h + $PROJ_DIR$\..\Common\Minimal\flash.c + $PROJ_DIR$\..\Common\include\flash.h + $PROJ_DIR$\Debug\Obj\psock.pbi + $PROJ_DIR$\Debug\Obj\emac.pbi + $PROJ_DIR$\LuminaryDrivers\driverlib.r79 + $PROJ_DIR$\..\Common\Minimal\PollQ.c + $PROJ_DIR$\webserver\httpd.h + $PROJ_DIR$\Debug\Obj\integer.pbi + $PROJ_DIR$\Debug\Obj\RTOSDemo.pbd + $PROJ_DIR$\..\Common\include\PollQ.h + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\uip.h + $PROJ_DIR$\webserver\uip-conf.h + $PROJ_DIR$\Debug\Obj\semtest.pbi + $PROJ_DIR$\RTOSDemo.xcl + $TOOLKIT_DIR$\inc\string.h + $PROJ_DIR$\..\Common\include\semtest.h + $TOOLKIT_DIR$\inc\DLib_Threads.h + $PROJ_DIR$\Debug\Obj\uip_arp.r79 + $PROJ_DIR$\webserver\clock-arch.h + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\lc-switch.h + $PROJ_DIR$\Debug\Obj\death.r79 + $PROJ_DIR$\Debug\Obj\httpd.r79 + $PROJ_DIR$\webserver\httpd-cgi.c + $PROJ_DIR$\webserver\httpd-fs.c + $PROJ_DIR$\LuminaryDrivers\hw_ssi.h + $PROJ_DIR$\FreeRTOSConfig.h + $PROJ_DIR$\Debug\Obj\heap_2.pbi + $PROJ_DIR$\Debug\Obj\queue.pbi + $PROJ_DIR$\Debug\Obj\httpd-fs.pbi + $PROJ_DIR$\Debug\Obj\osram128x64x4.r79 + $PROJ_DIR$\LuminaryDrivers\hw_sysctl.h + $PROJ_DIR$\webserver\httpd-cgi.h + $PROJ_DIR$\..\..\Source\include\task.h + $PROJ_DIR$\Debug\Obj\list.r79 + $PROJ_DIR$\webserver\emac.c + $PROJ_DIR$\webserver\http-strings.c + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\psock.h + $PROJ_DIR$\Debug\Obj\BlockQ.pbi + $PROJ_DIR$\LuminaryDrivers\ssi.h + $PROJ_DIR$\..\..\Source\include\FreeRTOS.h + $PROJ_DIR$\..\..\Source\include\semphr.h + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\clock.h + $PROJ_DIR$\Debug\Obj\startup_ewarm.pbi + $PROJ_DIR$\..\..\Source\portable\IAR\ARM_CM3\portmacro.h + $PROJ_DIR$\Debug\Obj\death.pbi + $PROJ_DIR$\LuminaryDrivers\gpio.h + $TOOLKIT_DIR$\inc\xencoding_limits.h + $PROJ_DIR$\LuminaryDrivers\hw_types.h + $TOOLKIT_DIR$\lib\dl7mptnnl8n.r79 + $TOOLKIT_DIR$\inc\stdint.h + $PROJ_DIR$\ParTest\ParTest.c + $PROJ_DIR$\..\Common\Minimal\semtest.c + $PROJ_DIR$\main.c + $PROJ_DIR$\..\Common\Minimal\death.c + $TOOLKIT_DIR$\inc\stddef.h + $PROJ_DIR$\Debug\Obj\timertest.r79 + $PROJ_DIR$\Debug\Obj\uip.r79 + $PROJ_DIR$\Debug\Obj\http-strings.pbi + $PROJ_DIR$\Debug\Obj\timertest.pbi + $PROJ_DIR$\LuminaryDrivers\pdc.c + $PROJ_DIR$\Debug\Obj\uip.pbi + $PROJ_DIR$\Debug\Obj\main.pbi + $PROJ_DIR$\Debug\Obj\pdc.r79 + $PROJ_DIR$\webserver\httpd-fsdata.h + $PROJ_DIR$\LuminaryDrivers\interrupt.h + $PROJ_DIR$\..\Common\include\BlockQ.h + $PROJ_DIR$\Debug\Obj\timer.pbi + $PROJ_DIR$\LuminaryDrivers\hw_memmap.h + $PROJ_DIR$\Debug\Obj\main.r79 + $TOOLKIT_DIR$\inc\ysizet.h + $PROJ_DIR$\webserver\httpd-fsdata.c + $PROJ_DIR$\bitmap.h + $PROJ_DIR$\Debug\Obj\BlockQ.r79 + $PROJ_DIR$\..\..\Source\include\portable.h + $PROJ_DIR$\Debug\Obj\portasm.r79 + $PROJ_DIR$\Debug\Obj\osram128x64x4.pbi + $TOOLKIT_DIR$\inc\yvals.h + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\uip_arp.h + $PROJ_DIR$\webserver\httpd-fs.h + $PROJ_DIR$\Debug\Obj\PollQ.pbi + $PROJ_DIR$\Debug\Obj\blocktim.pbi + $PROJ_DIR$\Debug\Obj\timer.r79 + $PROJ_DIR$\Debug\Obj\semtest.r79 + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\uip_arch.h + $PROJ_DIR$\lcd_message.h + $PROJ_DIR$\Debug\Obj\httpd-cgi.pbi + $PROJ_DIR$\webserver\webserver.h + $PROJ_DIR$\Debug\Obj\httpd-cgi.r79 + $PROJ_DIR$\Debug\Obj\emac.r79 + $PROJ_DIR$\Debug\Obj\uip_arp.pbi + $PROJ_DIR$\Debug\Obj\tasks.pbi + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\uipopt.h + $PROJ_DIR$\LuminaryDrivers\hw_ints.h + $TOOLKIT_DIR$\inc\DLib_Defaults.h + $TOOLKIT_DIR$\lib\dl7mptnnl8n.h + $PROJ_DIR$\..\Common\include\blocktim.h + $PROJ_DIR$\..\Common\include\death.h + $PROJ_DIR$\Debug\Obj\flash.pbi + $PROJ_DIR$\Debug\Obj\uIP_Task.pbi + $PROJ_DIR$\..\..\Source\include\projdefs.h + $TOOLKIT_DIR$\inc\stdlib.h + $PROJ_DIR$\Debug\Obj\blocktim.r79 + $PROJ_DIR$\..\..\Source\include\queue.h + $PROJ_DIR$\Debug\Obj\pdc.pbi + + + $PROJ_DIR$\timertest.c + + + ICCARM + 111 + + + BICOMP + 114 + + + + + ICCARM + 95 110 132 149 150 36 102 72 125 155 81 129 99 148 123 103 120 25 33 + + + BICOMP + 95 110 132 149 36 102 72 125 155 81 129 99 148 123 103 120 25 33 + + + + + $PROJ_DIR$\..\..\Source\portable\IAR\ARM_CM3\portasm.s + + + AARM + 130 + + + + + AARM + 81 + + + + + $PROJ_DIR$\..\..\Source\queue.c + + + ICCARM + 29 + + + BICOMP + 83 + + + + + ICCARM + 156 132 149 150 36 102 72 125 70 95 110 155 81 129 99 88 16 53 + + + BICOMP + 156 132 149 36 102 72 125 70 95 110 155 81 129 99 88 16 53 + + + + + $PROJ_DIR$\..\..\Source\list.c + + + ICCARM + 89 + + + BICOMP + 52 + + + + + ICCARM + 156 132 149 150 36 102 72 125 95 110 155 81 129 99 16 + + + BICOMP + 156 132 149 36 102 72 125 95 110 155 81 129 99 16 + + + + + $PROJ_DIR$\..\..\Source\portable\MemMang\heap_2.c + + + ICCARM + 3 + + + BICOMP + 82 + + + + + ICCARM + 156 132 149 150 36 102 72 125 95 110 155 81 129 99 88 16 + + + BICOMP + 156 132 149 36 102 72 125 95 110 155 81 129 99 88 16 + + + + + $PROJ_DIR$\LuminaryDrivers\osram128x64x4.c + + + ICCARM + 85 + + + BICOMP + 131 + + + + + ICCARM + 80 123 86 103 34 101 94 25 12 + + + BICOMP + 80 123 86 103 34 101 94 25 12 + + + + + $PROJ_DIR$\..\Common\Minimal\BlockQ.c + + + ICCARM + 128 + + + BICOMP + 93 + + + + + ICCARM + 156 132 149 150 36 102 72 125 95 110 155 81 129 99 88 16 158 121 + + + BICOMP + 156 132 149 36 102 72 125 95 110 155 81 129 99 88 16 158 121 + + + + + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\uip.c + + + ICCARM + 112 + + + BICOMP + 116 + + + + + ICCARM + 66 147 67 105 132 149 150 36 102 72 142 62 92 51 19 75 134 139 70 125 + + + BICOMP + 66 147 67 105 132 149 36 102 72 142 62 92 51 19 75 134 139 70 125 + + + + + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\uip_arp.c + + + ICCARM + 73 + + + BICOMP + 145 + + + + + ICCARM + 133 66 147 67 105 132 149 150 36 102 72 142 62 92 51 19 75 134 70 125 + + + BICOMP + 133 66 147 67 105 132 149 36 102 72 142 62 92 51 19 75 134 70 125 + + + + + $PROJ_DIR$\webserver\uIP_Task.c + + + ICCARM + 13 + + + BICOMP + 154 + + + + + ICCARM + 70 132 149 150 36 102 72 125 95 110 155 81 129 99 88 16 96 158 140 103 66 147 67 105 142 62 92 51 19 75 134 133 46 97 74 43 54 123 39 49 + + + BICOMP + 70 132 149 36 102 72 125 95 110 155 81 129 99 88 16 96 158 140 103 66 147 67 105 142 62 92 51 19 75 134 133 46 97 74 43 54 123 39 49 + + + + + $PROJ_DIR$\..\..\Source\tasks.c + + + ICCARM + 26 + + + BICOMP + 146 + + + + + ICCARM + 55 132 149 150 36 102 72 125 156 70 95 110 155 81 129 99 88 16 + + + BICOMP + 55 132 149 36 102 72 125 156 70 95 110 155 81 129 99 88 16 + + + + + $PROJ_DIR$\startup_ewarm.c + + + ICCARM + 23 + + + BICOMP + 98 + + + + + $PROJ_DIR$\..\Common\Minimal\blocktim.c + + + ICCARM + 157 + + + BICOMP + 136 + + + + + ICCARM + 95 110 132 149 150 36 102 72 125 155 81 129 99 88 16 158 + + + BICOMP + 95 110 132 149 36 102 72 125 155 81 129 99 88 16 158 + + + + + $PROJ_DIR$\..\..\Source\portable\IAR\ARM_CM3\port.c + + + ICCARM + 30 + + + BICOMP + 14 + + + + + ICCARM + 95 110 132 149 150 36 102 72 125 155 81 129 99 88 16 + + + BICOMP + 95 110 132 149 36 102 72 125 155 81 129 99 88 16 + + + + + $PROJ_DIR$\Debug\Exe\RTOSDemo.d79 + + + XLINK + 37 + + + + + XLINK + 69 128 35 17 157 76 144 24 3 48 143 44 77 10 89 124 85 30 130 47 29 138 23 26 137 111 13 112 73 60 104 + + + + + $PROJ_DIR$\webserver\httpd.c + + + ICCARM + 77 + + + BICOMP + 18 + + + + + ICCARM + 66 147 67 105 132 149 150 36 102 72 142 62 92 51 19 75 134 87 27 70 125 + + + BICOMP + 66 147 67 105 132 149 36 102 72 142 62 92 51 19 75 134 87 27 70 125 + + + + + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\psock.c + + + ICCARM + 47 + + + BICOMP + 58 + + + + + ICCARM + 55 132 149 150 36 102 72 125 70 147 67 105 142 62 92 51 19 75 134 66 + + + BICOMP + 55 132 149 36 102 72 125 70 147 67 105 142 62 92 51 19 75 134 66 + + + + + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\timer.c + + + ICCARM + 137 + + + BICOMP + 122 + + + + + ICCARM + 97 74 95 110 132 149 150 36 102 72 125 155 81 129 99 46 + + + BICOMP + 97 74 95 110 132 149 36 102 72 125 155 81 129 99 46 + + + + + $PROJ_DIR$\..\Common\Minimal\integer.c + + + ICCARM + 10 + + + BICOMP + 63 + + + + + ICCARM + 156 132 149 150 36 102 72 125 95 110 155 81 129 99 88 16 28 + + + BICOMP + 156 132 149 36 102 72 125 95 110 155 81 129 99 88 16 28 + + + + + $PROJ_DIR$\..\Common\Minimal\flash.c + + + ICCARM + 24 + + + BICOMP + 153 + + + + + ICCARM + 156 132 149 150 36 102 72 125 95 110 155 81 129 99 88 16 49 57 + + + BICOMP + 156 132 149 36 102 72 125 95 110 155 81 129 99 88 16 49 57 + + + + + $PROJ_DIR$\..\Common\Minimal\PollQ.c + + + ICCARM + 17 + + + BICOMP + 135 + + + + + ICCARM + 156 132 149 150 36 102 72 125 95 110 155 81 129 99 88 16 158 65 + + + BICOMP + 156 132 149 36 102 72 125 95 110 155 81 129 99 88 16 158 65 + + + + + $PROJ_DIR$\Debug\Obj\RTOSDemo.pbd + + + BILINK + 93 45 135 136 100 59 153 82 113 141 84 18 63 52 117 131 14 58 83 68 98 146 122 114 154 116 145 + + + + + $PROJ_DIR$\webserver\httpd-cgi.c + + + ICCARM + 143 + + + BICOMP + 141 + + + + + ICCARM + 66 147 67 105 132 149 150 36 102 72 142 62 92 51 19 75 134 87 55 125 70 + + + BICOMP + 66 147 67 105 132 149 36 102 72 142 62 92 51 19 75 134 87 55 125 70 + + + + + $PROJ_DIR$\webserver\httpd-fs.c + + + ICCARM + 44 + + + BICOMP + 84 + + + + + ICCARM + 62 92 147 67 105 132 149 150 36 102 72 142 51 19 75 134 119 66 126 + + + BICOMP + 62 92 147 67 105 132 149 36 102 72 142 51 19 75 134 119 66 126 + + + + + $PROJ_DIR$\webserver\emac.c + + + ICCARM + 144 + + + BICOMP + 59 + + + + + ICCARM + 95 110 132 149 150 36 102 72 125 155 81 129 99 96 158 88 16 39 66 147 67 105 142 62 92 51 19 75 134 103 123 148 43 54 120 + + + BICOMP + 95 110 132 149 36 102 72 125 155 81 129 99 96 158 88 16 39 66 147 67 105 142 62 92 51 19 75 134 103 123 148 43 54 120 + + + + + $PROJ_DIR$\webserver\http-strings.c + + + ICCARM + 48 + + + BICOMP + 113 + + + + + [ROOT_NODE] + + + XLINK + 37 32 + + + + + $PROJ_DIR$\ParTest\ParTest.c + + + ICCARM + 35 + + + BICOMP + 45 + + + + + ICCARM + 95 110 132 149 150 36 102 72 125 155 81 129 99 88 16 49 103 101 123 + + + BICOMP + 95 110 132 149 36 102 72 125 155 81 129 99 88 16 49 103 101 123 + + + + + $PROJ_DIR$\..\Common\Minimal\semtest.c + + + ICCARM + 138 + + + BICOMP + 68 + + + + + ICCARM + 156 132 149 150 36 102 72 125 95 110 155 81 129 99 88 16 96 158 71 + + + BICOMP + 156 132 149 36 102 72 125 95 110 155 81 129 99 88 16 96 158 71 + + + + + $PROJ_DIR$\main.c + + + ICCARM + 124 + + + BICOMP + 117 + + + + + ICCARM + 55 132 149 150 36 102 72 125 95 110 155 81 129 99 88 16 158 96 121 152 28 151 57 49 71 65 140 127 123 103 25 101 12 + + + BICOMP + 55 132 149 36 102 72 125 95 110 155 81 129 99 88 16 158 96 121 152 28 151 57 49 71 65 140 127 123 103 25 101 12 + + + + + $PROJ_DIR$\..\Common\Minimal\death.c + + + ICCARM + 76 + + + BICOMP + 100 + + + + + ICCARM + 156 132 149 150 36 102 72 125 95 110 155 81 129 99 88 16 152 + + + BICOMP + 156 132 149 36 102 72 125 95 110 155 81 129 99 88 16 152 + + + + + $PROJ_DIR$\LuminaryDrivers\pdc.c + + + ICCARM + 118 + + + BICOMP + 159 + + + + + ICCARM + 123 103 34 101 94 25 38 + + + BICOMP + 123 103 34 101 94 25 38 + + + + + [MULTI_TOOL] + XLINK + + + + Release + + + [MULTI_TOOL] + XLINK + + + + + diff --git a/Demo/CORTEX_LM3S6965_IAR/RTOSDemo.ewd b/Demo/CORTEX_LM3S6965_IAR/RTOSDemo.ewd new file mode 100644 index 000000000..3d24b7e57 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/RTOSDemo.ewd @@ -0,0 +1,1133 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 13 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 0 + 1 + 1 + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 6 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ewplugin + 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 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 13 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 0 + 1 + 0 + + + + + ANGEL_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + JLINK_ID + 2 + + 6 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ewplugin + 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 + + + + + + diff --git a/Demo/CORTEX_LM3S6965_IAR/RTOSDemo.ewp b/Demo/CORTEX_LM3S6965_IAR/RTOSDemo.ewp new file mode 100644 index 000000000..cc69b39de --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/RTOSDemo.ewp @@ -0,0 +1,1761 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + XLINK + 2 + + 18 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 2 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 2 + + 9 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 14 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + XLINK + 2 + + 18 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 2 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + Demo files + + $PROJ_DIR$\..\Common\Minimal\BlockQ.c + + + $PROJ_DIR$\..\Common\Minimal\blocktim.c + + + $PROJ_DIR$\..\Common\Minimal\death.c + + + $PROJ_DIR$\..\Common\Minimal\flash.c + + + $PROJ_DIR$\..\Common\Minimal\integer.c + + + $PROJ_DIR$\main.c + + + $PROJ_DIR$\ParTest\ParTest.c + + + $PROJ_DIR$\..\Common\Minimal\PollQ.c + + + $PROJ_DIR$\..\Common\Minimal\semtest.c + + + $PROJ_DIR$\timertest.c + + + + Library files + + $PROJ_DIR$\LuminaryDrivers\driverlib.r79 + + + $PROJ_DIR$\LuminaryDrivers\osram128x64x4.c + + + + Scheduler files + + $PROJ_DIR$\..\..\Source\portable\MemMang\heap_2.c + + + $PROJ_DIR$\..\..\Source\list.c + + + $PROJ_DIR$\..\..\Source\portable\IAR\ARM_CM3\port.c + + + $PROJ_DIR$\..\..\Source\portable\IAR\ARM_CM3\portasm.s + + + $PROJ_DIR$\..\..\Source\queue.c + + + $PROJ_DIR$\..\..\Source\tasks.c + + + + System files + + $PROJ_DIR$\startup_ewarm.c + + + + uIP files + + $PROJ_DIR$\webserver\emac.c + + + $PROJ_DIR$\webserver\http-strings.c + + + $PROJ_DIR$\webserver\httpd-cgi.c + + + $PROJ_DIR$\webserver\httpd-fs.c + + + $PROJ_DIR$\webserver\httpd.c + + + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\psock.c + + + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\timer.c + + + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\uip.c + + + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\uip_arp.c + + + $PROJ_DIR$\webserver\uIP_Task.c + + + + + diff --git a/Demo/CORTEX_LM3S6965_IAR/RTOSDemo.eww b/Demo/CORTEX_LM3S6965_IAR/RTOSDemo.eww new file mode 100644 index 000000000..239a9381e --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/RTOSDemo.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\RTOSDemo.ewp + + + + + diff --git a/Demo/CORTEX_LM3S6965_IAR/RTOSDemo.xcl b/Demo/CORTEX_LM3S6965_IAR/RTOSDemo.xcl new file mode 100644 index 000000000..a7044e640 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/RTOSDemo.xcl @@ -0,0 +1,56 @@ +//***************************************************************************** +// +// webserver-lwip.xcl - Linker script for EW-ARM. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED AS IS. NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +//***************************************************************************** + +// +// Set the CPU type to ARM. +// +-carm + +// +// Define the size of flash and SRAM. +// +-DROMSTART=00000000 +-DROMEND=00040000 +-DRAMSTART=20000000 +-DRAMEND=20010000 + + + +// +// Define the sections to place into flash, and the order to place them. +// +-Z(CODE)INTVEC=ROMSTART-ROMEND +-Z(CODE)ICODE,DIFUNCT=ROMSTART-ROMEND +-Z(CODE)CODE=ROMSTART-ROMEND +-Z(CONST)CODE_ID=ROMSTART-ROMEND +-Z(CONST)INITTAB,DATA_ID,DATA_C=ROMSTART-ROMEND +-Z(CONST)CHECKSUM=ROMSTART-ROMEND + +// +// Define the sections to place into SRAM, and the order to place them. +// +-Z(DATA)VTABLE=RAMSTART-RAMEND +-Z(DATA)DATA_I,DATA_Z,DATA_N=RAMSTART-RAMEND +-Z(DATA)CODE_I=RAMSTART-RAMEND diff --git a/Demo/CORTEX_LM3S6965_IAR/bitmap.h b/Demo/CORTEX_LM3S6965_IAR/bitmap.h new file mode 100644 index 000000000..02ce0b365 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/bitmap.h @@ -0,0 +1,171 @@ +#ifndef BITMAP_H +#define BITMAP_H + +const unsigned char pucImage[] = +{ +0x00, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0x00, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa0, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, +0x00, 0x8f, 0xff, 0xff, 0xf8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x88, 0x88, 0x88, +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x78, 0x8f, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x88, 0x77, 0x77, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xf0, 0x00, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, +0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x08, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, +0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0x00, 0x8f, 0x00, 0xff, +0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x78, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x07, +0x00, 0x70, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, +0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0x88, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x07, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf8, +0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x8f, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0x87, 0x77, +0x77, 0x77, 0x78, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x88, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf8, 0x87, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, +0x78, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xff, 0x80, 0x00, 0x8f, 0x8f, 0xff, 0x87, 0x77, 0x77, 0x77, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, +0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x8f, 0x07, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, +0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x07, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, +0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0f, 0x00, 0x8f, 0x00, 0xff, +0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, +0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, +0x78, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x70, 0x08, 0x00, 0x88, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x88, 0x88, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, +0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x70, 0x07, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x87, 0x88, +0x88, 0x8f, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x7f, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf7, 0x88, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf7, +0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x88, 0x88, 0x88, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0x87, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, +0x00, 0x00, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, +0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x07, 0xff, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xff, 0xff, 0x88, 0x88, 0x88, 0x88, +0xff, 0xff, 0xff, 0xff, 0x88, 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x87, 0x77, 0x77, 0x77, +0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0x00, 0x0f, 0x70, 0x08, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0x00, 0x07, 0x70, 0x07, +0x88, 0x88, 0x88, 0xff, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x70, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x08, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x08, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa0, 0x00, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, +0x00 }; + +#define bmpBITMAP_HEIGHT 50 +#define bmpBITMAP_WIDTH 128 + +#endif diff --git a/Demo/CORTEX_LM3S6965_IAR/lcd_message.h b/Demo/CORTEX_LM3S6965_IAR/lcd_message.h new file mode 100644 index 000000000..adfc18b8a --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/lcd_message.h @@ -0,0 +1,9 @@ +#ifndef LCD_MESSAGE_H +#define LCD_MESSAGE_H + +typedef struct +{ + signed char *pcMessage; +} xOLEDMessage; + +#endif /* LCD_MESSAGE_H */ diff --git a/Demo/CORTEX_LM3S6965_IAR/main.c b/Demo/CORTEX_LM3S6965_IAR/main.c new file mode 100644 index 000000000..2f16f4b33 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/main.c @@ -0,0 +1,325 @@ +/* + FreeRTOS.org V4.3.0 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + *************************************************************************** +*/ + + +/* + * Creates all the demo application tasks, then starts the scheduler. The WEB + * documentation provides more details of the standard demo application tasks. + * In addition to the standard demo tasks, the following tasks and tests are + * defined and/or created within this file: + * + * "Fast Interrupt Test" - A high frequency periodic interrupt is generated + * using a free running timer to demonstrate the use of the + * configKERNEL_INTERRUPT_PRIORITY configuration constant. The interrupt + * service routine measures the number of processor clocks that occur between + * each interrupt - and in so doing measures the jitter in the interrupt timing. + * The maximum measured jitter time is latched in the ulMaxJitter variable, and + * displayed on the OLED display by the 'Check' task as described below. The + * fast interrupt is configured and handled in the timertest.c source file. + * + * "OLED" task - the OLED task is a 'gatekeeper' task. It is the only task that + * is permitted to access the display directly. Other tasks wishing to write a + * message to the OLED send the message on a queue to the OLED task instead of + * accessing the OLED themselves. The OLED task just blocks on the queue waiting + * for messages - waking and displaying the messages as they arrive. + * + * "Check" task - This only executes every five seconds but has the highest + * priority so is guaranteed to get processor time. Its main function is to + * check that all the standard demo tasks are still operational. Should any + * unexpected behaviour within a demo task be discovered the 'check' task will + * write an error to the OLED (via the OLED task). If all the demo tasks are + * executing with their expected behaviour then the check task writes PASS + * along with the max jitter time to the OLED (again via the OLED task), as + * described above. + * + * "uIP" task - This is the task that handles the uIP stack. All TCP/IP + * processing is performed in this task. + */ + + + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "Task.h" +#include "queue.h" +#include "semphr.h" + +/* Demo app includes. */ +#include "BlockQ.h" +#include "death.h" +#include "integer.h" +#include "blocktim.h" +#include "flash.h" +#include "partest.h" +#include "semtest.h" +#include "pollq.h" +#include "lcd_message.h" +#include "bitmap.h" + +/* Hardware library includes. */ +#include "hw_memmap.h" +#include "hw_types.h" +#include "sysctl.h" +#include "gpio.h" +#include "osram128x64x4.h" + +/*-----------------------------------------------------------*/ + +/* The time between cycles of the 'check' task. */ +#define mainCHECK_DELAY ( ( portTickType ) 5000 / portTICK_RATE_MS ) + +/* Size of the stack allocated to the uIP task. */ +#define mainBASIC_WEB_STACK_SIZE ( configMINIMAL_STACK_SIZE * 2 ) + +/* The check task uses the sprintf function so requires a little more stack too. */ +#define mainCHECK_TASK_STACK_SIZE ( configMINIMAL_STACK_SIZE + 50 ) + +/* Task priorities. */ +#define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2 ) +#define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 ) +#define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 ) +#define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 ) +#define mainCREATOR_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 ) +#define mainINTEGER_TASK_PRIORITY ( tskIDLE_PRIORITY ) + +/* The maximum number of message that can be waiting for display at any one +time. */ +#define mainOLED_QUEUE_SIZE ( 3 ) + +/* Dimensions the buffer into which the jitter time is written. */ +#define mainMAX_MSG_LEN 25 + +/* The period of the system clock in nano seconds. This is used to calculate +the jitter time in nano seconds. */ +#define mainNS_PER_CLOCK ( ( unsigned portLONG ) ( ( 1.0 / ( double ) configCPU_CLOCK_HZ ) * 1000000000.0 ) ) + +/* Constants used when writing strings to the display. */ +#define mainCHARACTER_HEIGHT ( 9 ) +#define mainMAX_ROWS ( mainCHARACTER_HEIGHT * 7 ) +#define mainFULL_SCALE ( 15 ) +#define ulSSI_FREQUENCY 1000000 + +/*-----------------------------------------------------------*/ + +/* + * Checks the status of all the demo tasks then prints a message to the + * display. The message will be either PASS - an include in brackets the + * maximum measured jitter time (as described at the to of the file), or a + * message that describes which of the standard demo tasks an error has been + * discovered in. + * + * Messages are not written directly to the terminal, but passed to vOLEDTask + * via a queue. + */ +static void vCheckTask( void *pvParameters ); + +/* + * The task that handles the uIP stack. All TCP/IP processing is performed in + * this task. + */ +extern void vuIP_Task( void *pvParameters ); + +/* + * The display is written two by more than one task so is controlled by a + * 'gatekeeper' task. This is the only task that is actually permitted to + * access the display directly. Other tasks wanting to display a message send + * the message to the gatekeeper. + */ +static void vOLEDTask( void *pvParameters ); + +/* + * Configure the hardware for the demo. + */ +static void prvSetupHardware( void ); + +/* + * Configures the high frequency timers - those used to measure the timing + * jitter while the real time kernel is executing. + */ +extern void vSetupTimer( void ); + +/*-----------------------------------------------------------*/ + +/* The queue used to send messages to the OLED task. */ +xQueueHandle xOLEDQueue; + +/* The welcome text. */ +const portCHAR * const pcWelcomeMessage = " www.FreeRTOS.org"; + +/*-----------------------------------------------------------*/ + +int main( void ) +{ + prvSetupHardware(); + + /* Create the queue used by the OLED task. Messages for display on the OLED + are received via this queue. */ + xOLEDQueue = xQueueCreate( mainOLED_QUEUE_SIZE, sizeof( xOLEDMessage ) ); + + /* Create the uIP task. */ + xTaskCreate( vuIP_Task, ( signed portCHAR * ) "uIP", mainBASIC_WEB_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY - 1, NULL ); + + /* Start the standard demo tasks. */ + vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY ); + vCreateBlockTimeTasks(); + vStartSemaphoreTasks( mainSEM_TEST_PRIORITY ); + vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY ); + vStartIntegerMathTasks( mainINTEGER_TASK_PRIORITY ); + + /* Start the tasks defined within this file/specific to this demo. */ + xTaskCreate( vCheckTask, ( signed portCHAR * ) "Check", mainCHECK_TASK_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL ); + xTaskCreate( vOLEDTask, ( signed portCHAR * ) "OLED", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL ); + + /* The suicide tasks must be created last as they need to know how many + tasks were running prior to their creation in order to ascertain whether + or not the correct/expected number of tasks are running at any given time. */ + vCreateSuicidalTasks( mainCREATOR_TASK_PRIORITY ); + + /* Configure the high frequency interrupt used to measure the interrupt + jitter time. */ + vSetupTimer(); + + /* Start the scheduler. */ + vTaskStartScheduler(); + + /* Will only get here if there was insufficient memory to create the idle + task. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void prvSetupHardware( void ) +{ + /* Set the clocking to run from the PLL at 50 MHz */ + SysCtlClockSet( SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ ); + + /* Enable/Reset the Ethernet Controller */ + SysCtlPeripheralEnable( SYSCTL_PERIPH_ETH ); + SysCtlPeripheralReset( SYSCTL_PERIPH_ETH ); + + /* Enable Port F for Ethernet LEDs + LED0 Bit 3 Output + LED1 Bit 2 Output */ + SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOF ); + GPIODirModeSet( GPIO_PORTF_BASE, (GPIO_PIN_2 | GPIO_PIN_3), GPIO_DIR_MODE_HW ); + GPIOPadConfigSet( GPIO_PORTF_BASE, (GPIO_PIN_2 | GPIO_PIN_3 ), GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD ); + + vParTestInitialise(); +} +/*-----------------------------------------------------------*/ + +static void vCheckTask( void *pvParameters ) +{ +portTickType xLastExecutionTime; +xOLEDMessage xMessage; +static portCHAR cPassMessage[ mainMAX_MSG_LEN ]; +extern unsigned portLONG ulMaxJitter; + + xLastExecutionTime = xTaskGetTickCount(); + xMessage.pcMessage = cPassMessage; + + for( ;; ) + { + /* Perform this check every mainCHECK_DELAY milliseconds. */ + vTaskDelayUntil( &xLastExecutionTime, mainCHECK_DELAY ); + + /* Has an error been found in any task? */ + + if( xAreBlockingQueuesStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN BLOCK Q"; + } + else if( xAreBlockTimeTestTasksStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN BLOCK TIME"; + } + else if( xAreSemaphoreTasksStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN SEMAPHORE"; + } + else if( xArePollingQueuesStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN POLL Q"; + } + else if( xIsCreateTaskStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN CREATE"; + } + else if( xAreIntegerMathsTaskStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN MATH"; + } + else + { + sprintf( cPassMessage, "PASS [%uns]", ulMaxJitter * mainNS_PER_CLOCK ); + } + + /* Send the message to the OLED gatekeeper for display. */ + xQueueSend( xOLEDQueue, &xMessage, portMAX_DELAY ); + } +} +/*-----------------------------------------------------------*/ + + + +void vOLEDTask( void *pvParameters ) +{ +xOLEDMessage xMessage; +unsigned portLONG ulY = mainMAX_ROWS; + + /* Initialise the OLED and display a startup message. */ + OSRAM128x64x4Init( ulSSI_FREQUENCY ); + + OSRAM128x64x4StringDraw( " POWERED BY FreeRTOS", 0, 0, mainFULL_SCALE ); + OSRAM128x64x4ImageDraw( pucImage, 0, mainCHARACTER_HEIGHT + 1, bmpBITMAP_WIDTH, bmpBITMAP_HEIGHT ); + + for( ;; ) + { + /* Wait for a message to arrive that requires displaying. */ + xQueueReceive( xOLEDQueue, &xMessage, portMAX_DELAY ); + + /* Write the message on the next available row. */ + ulY += mainCHARACTER_HEIGHT; + if( ulY >= mainMAX_ROWS ) + { + ulY = mainCHARACTER_HEIGHT; + OSRAM128x64x4Clear(); + OSRAM128x64x4StringDraw( pcWelcomeMessage, 0, 0, mainFULL_SCALE ); + } + + /* Display the message. */ + OSRAM128x64x4StringDraw( xMessage.pcMessage, 0, ulY, mainFULL_SCALE ); + } +} diff --git a/Demo/CORTEX_LM3S6965_IAR/startup_ewarm.c b/Demo/CORTEX_LM3S6965_IAR/startup_ewarm.c new file mode 100644 index 000000000..af1c8ac18 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/startup_ewarm.c @@ -0,0 +1,265 @@ +//***************************************************************************** +// +// startup_ewarm.c - Boot code for Stellaris. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 100 of the Stellaris Ethernet +// Applications Library. +// +//***************************************************************************** + +//***************************************************************************** +// +// 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. +// +//***************************************************************************** + + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); +extern void xPortPendSVHandler(void); +extern void xPortSysTickHandler(void); +extern void vEMAC_ISR( void ); +extern Timer0IntHandler( void ); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +#ifndef STACK_SIZE +#define STACK_SIZE 64 +#endif +static unsigned long pulStack[STACK_SIZE]; + +//***************************************************************************** +// +// 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); + unsigned long ulPtr; +} +uVectorEntry; + +//***************************************************************************** +// +// The minimal vector table for a Cortex M3. Note that the proper constructs +// must be placed on this to ensure that it ends up at physical address +// 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry g_pfnVectors[] @ "INTVEC" = +{ + { .ulPtr = (unsigned long)pulStack + sizeof(pulStack) }, + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + IntDefaultHandler, // 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, // SSI Rx and Tx + IntDefaultHandler, // I2C Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder + 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 + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 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 + IntDefaultHandler, // CAN2 + vEMAC_ISR, // Ethernet + IntDefaultHandler // Power Island +}; + +//***************************************************************************** +// +// 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. +// +//***************************************************************************** +#pragma segment="DATA_ID" +#pragma segment="DATA_I" +#pragma segment="DATA_Z" + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + unsigned long *pulSrc, *pulDest, *pulEnd; + + // + // Copy the data segment initializers from flash to SRAM. + // + pulSrc = __segment_begin("DATA_ID"); + pulDest = __segment_begin("DATA_I"); + pulEnd = __segment_end("DATA_I"); + while(pulDest < pulEnd) + { + *pulDest++ = *pulSrc++; + } + + // + // Zero fill the bss segment. + // + pulDest = __segment_begin("DATA_Z"); + pulEnd = __segment_end("DATA_Z"); + while(pulDest < pulEnd) + { + *pulDest++ = 0; + } + + // + // 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/Demo/CORTEX_LM3S6965_IAR/timertest.c b/Demo/CORTEX_LM3S6965_IAR/timertest.c new file mode 100644 index 000000000..2eddbfcda --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/timertest.c @@ -0,0 +1,133 @@ +/* + FreeRTOS.org V4.3.0 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + + Also see http://www.SafeRTOS.com for an IEC 61508 compliant version along + with commercial development and support options. + *************************************************************************** +*/ + +/* High speed timer test as described in main.c. */ + +/* Scheduler includes. */ +#include "FreeRTOS.h" + +/* Library includes. */ +#include "hw_ints.h" +#include "hw_memmap.h" +#include "hw_types.h" +#include "interrupt.h" +#include "sysctl.h" +#include "LMI_timer.h" + +/* The set frequency of the interrupt. Deviations from this are measured as +the jitter. */ +#define timerINTERRUPT_FREQUENCY ( 20000UL ) + +/* The expected time between each of the timer interrupts - if the jitter was +zero. */ +#define timerEXPECTED_DIFFERENCE_VALUE ( configCPU_CLOCK_HZ / timerINTERRUPT_FREQUENCY ) + +/* The highest available interrupt priority. */ +#define timerHIGHEST_PRIORITY ( 0 ) + +/* Misc defines. */ +#define timerMAX_32BIT_VALUE ( 0xffffffffUL ) +#define timerTIMER_1_COUNT_VALUE ( * ( ( unsigned long * ) ( TIMER1_BASE + 0x48 ) ) ) + +/*-----------------------------------------------------------*/ + +/* Interrupt handler in which the jitter is measured. */ +void Timer0IntHandler( void ); + +/* Stores the value of the maximum recorded jitter between interrupts. */ +unsigned portLONG ulMaxJitter = 0; + +/*-----------------------------------------------------------*/ + +void vSetupTimer( void ) +{ +unsigned long ulFrequency; + + /* Timer zero is used to generate the interrupts, and timer 1 is used + to measure the jitter. */ + SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER0 ); + SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER1 ); + TimerConfigure( TIMER0_BASE, TIMER_CFG_32_BIT_PER ); + TimerConfigure( TIMER1_BASE, TIMER_CFG_32_BIT_PER ); + + /* Set the timer interrupt to be above the kernel - highest. */ + IntPrioritySet( INT_TIMER0A, timerHIGHEST_PRIORITY ); + + /* Just used to measure time. */ + TimerLoadSet(TIMER1_BASE, TIMER_A, timerMAX_32BIT_VALUE ); + + /* The rate at which the timer will interrupt. */ + ulFrequency = configCPU_CLOCK_HZ / timerINTERRUPT_FREQUENCY; + TimerLoadSet( TIMER0_BASE, TIMER_A, ulFrequency ); + IntEnable( INT_TIMER0A ); + TimerIntEnable( TIMER0_BASE, TIMER_TIMA_TIMEOUT ); + + /* Enable both timers. */ + TimerEnable( TIMER0_BASE, TIMER_A ); + TimerEnable( TIMER1_BASE, TIMER_A ); +} +/*-----------------------------------------------------------*/ + +void Timer0IntHandler( void ) +{ +unsigned portLONG ulDifference, ulCurrentCount; +static portLONG ulMaxDifference = 0, ulLastCount = 0; + + /* We use the timer 1 counter value to measure the clock cycles between + the timer 0 interrupts. */ + ulCurrentCount = timerTIMER_1_COUNT_VALUE; + + if( ulCurrentCount < ulLastCount ) + { + /* How many times has timer 1 counted since the last interrupt? */ + ulDifference = ulLastCount - ulCurrentCount; + + /* Is this the largest difference we have measured yet? */ + if( ulDifference > ulMaxDifference ) + { + ulMaxDifference = ulDifference; + ulMaxJitter = ulMaxDifference - timerEXPECTED_DIFFERENCE_VALUE; + } + } + + ulLastCount = ulCurrentCount; + + TimerIntClear( TIMER0_BASE, TIMER_TIMA_TIMEOUT ); +} + + + + + diff --git a/Demo/CORTEX_LM3S6965_IAR/webserver/Makefile.webserver b/Demo/CORTEX_LM3S6965_IAR/webserver/Makefile.webserver new file mode 100644 index 000000000..f38c47a72 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/webserver/Makefile.webserver @@ -0,0 +1 @@ +APP_SOURCES += httpd.c http-strings.c httpd-fs.c httpd-cgi.c diff --git a/Demo/CORTEX_LM3S6965_IAR/webserver/clock-arch.h b/Demo/CORTEX_LM3S6965_IAR/webserver/clock-arch.h new file mode 100644 index 000000000..cde657b62 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/webserver/clock-arch.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2006, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: clock-arch.h,v 1.2 2006/06/12 08:00:31 adam Exp $ + */ + +#ifndef __CLOCK_ARCH_H__ +#define __CLOCK_ARCH_H__ + +#include "FreeRTOS.h" + +typedef unsigned long clock_time_t; +#define CLOCK_CONF_SECOND configTICK_RATE_HZ + +#endif /* __CLOCK_ARCH_H__ */ diff --git a/Demo/CORTEX_LM3S6965_IAR/webserver/emac.c b/Demo/CORTEX_LM3S6965_IAR/webserver/emac.c new file mode 100644 index 000000000..77e21c399 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/webserver/emac.c @@ -0,0 +1,281 @@ +/* + FreeRTOS.org V4.3.0 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + *************************************************************************** +*/ + +/* Kernel includes. */ +#include "FreeRTOS.h" +#include "Semphr.h" +#include "task.h" + +/* Demo includes. */ +#include "EMAC.h" + +/* uIP includes. */ +#include "uip.h" + +/* Hardware library includes. */ +#include "hw_types.h" +#include "hw_memmap.h" +#include "hw_ints.h" +#include "hw_ethernet.h" +#include "ethernet.h" +#include "interrupt.h" + +#define emacNUM_RX_BUFFERS 5 +#define emacFRAM_SIZE_BYTES 2 +#define macNEGOTIATE_DELAY 2000 +#define macWAIT_SEND_TIME ( 10 ) + +/* The task that handles the MAC peripheral. This is created at a high +priority and is effectively a deferred interrupt handler. The peripheral +handling is deferred to a task to prevent the entire FIFO having to be read +from within an ISR. */ +void vMACHandleTask( void *pvParameters ); + +/*-----------------------------------------------------------*/ + +/* The semaphore used to wake the uIP task when data arrives. */ +xSemaphoreHandle xEMACSemaphore = NULL; + +/* The semaphore used to wake the interrupt handler task. The peripheral +is processed at the task level to prevent the need to read the entire FIFO from +within the ISR itself. */ +xSemaphoreHandle xMACInterruptSemaphore = NULL; + +/* The buffer used by the uIP stack. In this case the pointer is used to +point to one of the Rx buffers. */ +unsigned portCHAR *uip_buf; + +/* Buffers into which Rx data is placed. */ +static unsigned portCHAR ucRxBuffers[ emacNUM_RX_BUFFERS ][ UIP_BUFSIZE + ( 4 * emacFRAM_SIZE_BYTES ) ]; + +/* The length of the data within each of the Rx buffers. */ +static unsigned portLONG ulRxLength[ emacNUM_RX_BUFFERS ]; + +/* Used to keep a track of the number of bytes to transmit. */ +static unsigned portLONG ulNextTxSpace; + +/*-----------------------------------------------------------*/ + +portBASE_TYPE vInitEMAC( void ) +{ +unsigned long ulTemp; +portBASE_TYPE xReturn; + + /* Ensure all interrupts are disabled. */ + EthernetIntDisable( ETH_BASE, ( ETH_INT_PHY | ETH_INT_MDIO | ETH_INT_RXER | ETH_INT_RXOF | ETH_INT_TX | ETH_INT_TXER | ETH_INT_RX)); + + /* Clear any interrupts that were already pending. */ + ulTemp = EthernetIntStatus( ETH_BASE, pdFALSE ); + EthernetIntClear( ETH_BASE, ulTemp ); + + /* Initialise the MAC and connect. */ + EthernetInit( ETH_BASE ); + EthernetConfigSet( ETH_BASE, ( ETH_CFG_TX_DPLXEN | ETH_CFG_TX_CRCEN | ETH_CFG_TX_PADEN ) ); + EthernetEnable( ETH_BASE ); + + /* Mark each Rx buffer as empty. */ + for( ulTemp = 0; ulTemp < emacNUM_RX_BUFFERS; ulTemp++ ) + { + ulRxLength[ ulTemp ] = 0; + } + + /* Create the queue and task used to defer the MAC processing to the + task level. */ + vSemaphoreCreateBinary( xMACInterruptSemaphore ); + xSemaphoreTake( xMACInterruptSemaphore, 0 ); + xReturn = xTaskCreate( vMACHandleTask, ( signed portCHAR * ) "MAC", configMINIMAL_STACK_SIZE, NULL, configMAX_PRIORITIES - 1, NULL ); + vTaskDelay( macNEGOTIATE_DELAY ); + + /* We are only interested in Rx interrupts. */ + IntPrioritySet( INT_ETH, configKERNEL_INTERRUPT_PRIORITY ); + IntEnable( INT_ETH ); + EthernetIntEnable(ETH_BASE, ETH_INT_RX); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +unsigned int uiGetEMACRxData( unsigned char *ucBuffer ) +{ +static unsigned long ulNextRxBuffer = 0; +unsigned int iLen; + + iLen = ulRxLength[ ulNextRxBuffer ]; + + if( iLen != 0 ) + { + /* Leave room for the size at the start of the buffer. */ + uip_buf = &( ucRxBuffers[ ulNextRxBuffer ][ 2 ] ); + + ulRxLength[ ulNextRxBuffer ] = 0; + + ulNextRxBuffer++; + if( ulNextRxBuffer >= emacNUM_RX_BUFFERS ) + { + ulNextRxBuffer = 0; + } + } + + return iLen; +} +/*-----------------------------------------------------------*/ + +void vInitialiseSend( void ) +{ + /* Set the index to the first byte to send - skipping over the size + bytes. */ + ulNextTxSpace = 2; +} +/*-----------------------------------------------------------*/ + +void vIncrementTxLength( unsigned portLONG ulLength ) +{ + ulNextTxSpace += ulLength; +} +/*-----------------------------------------------------------*/ + +void vSendBufferToMAC( void ) +{ +unsigned long *pulSource; +unsigned portSHORT * pus; +unsigned portLONG ulNextWord; + + /* Locate the data to be send. */ + pus = ( unsigned portSHORT * ) uip_buf; + + /* Add in the size of the data. */ + pus--; + *pus = ulNextTxSpace; + + /* Wait for data to be sent if there is no space immediately. */ + while( !EthernetSpaceAvail( ETH_BASE ) ) + { + vTaskDelay( macWAIT_SEND_TIME ); + } + + pulSource = ( unsigned portLONG * ) pus; + + for( ulNextWord = 0; ulNextWord < ulNextTxSpace; ulNextWord += sizeof( unsigned portLONG ) ) + { + HWREG(ETH_BASE + MAC_O_DATA) = *pulSource; + pulSource++; + } + + /* Go. */ + HWREG( ETH_BASE + MAC_O_TR ) = MAC_TR_NEWTX; +} +/*-----------------------------------------------------------*/ + +void vEMAC_ISR( void ) +{ +portBASE_TYPE xSwitchRequired = pdFALSE; +unsigned portLONG ulTemp; + + /* Clear the interrupt. */ + ulTemp = EthernetIntStatus( ETH_BASE, pdFALSE ); + EthernetIntClear( ETH_BASE, ulTemp ); + + /* Was it an Rx interrupt? */ + if( ulTemp & ETH_INT_RX ) + { + xSwitchRequired = pdTRUE; + xSemaphoreGiveFromISR( xMACInterruptSemaphore, pdFALSE ); + EthernetIntDisable( ETH_BASE, ETH_INT_RX ); + } + + /* Switch to the uIP task. */ + portEND_SWITCHING_ISR( xSwitchRequired ); +} +/*-----------------------------------------------------------*/ + +void vMACHandleTask( void *pvParameters ) +{ +unsigned long ulLen = 0, i; +unsigned portLONG ulLength, ulInt; +unsigned long *pulBuffer; +static unsigned portLONG ulNextRxBuffer = 0; +portBASE_TYPE xSwitchRequired = pdFALSE; + + for( ;; ) + { + /* Wait for something to do. */ + xSemaphoreTake( xMACInterruptSemaphore, portMAX_DELAY ); + + while( ( ulInt = ( EthernetIntStatus( ETH_BASE, pdFALSE ) & ETH_INT_RX ) ) != 0 ) + { + ulLength = HWREG( ETH_BASE + MAC_O_DATA ); + + /* Leave room at the start of the buffer for the size. */ + pulBuffer = ( unsigned long * ) &( ucRxBuffers[ ulNextRxBuffer ][ 2 ] ); + *pulBuffer = ( ulLength >> 16 ); + + /* Get the size of the data. */ + pulBuffer = ( unsigned long * ) &( ucRxBuffers[ ulNextRxBuffer ][ 4 ] ); + ulLength &= 0xFFFF; + + if( ulLength > 4 ) + { + ulLength -= 4; + + if( ulLength >= UIP_BUFSIZE ) + { + /* The data won't fit in our buffer. Ensure we don't + try to write into the buffer. */ + ulLength = 0; + } + + /* Read out the data into our buffer. */ + for( i = 0; i < ulLength; i += sizeof( unsigned portLONG ) ) + { + *pulBuffer = HWREG( ETH_BASE + MAC_O_DATA ); + pulBuffer++; + } + + /* Store the length of the data into the separate array. */ + ulRxLength[ ulNextRxBuffer ] = ulLength; + + /* Use the next buffer the next time through. */ + ulNextRxBuffer++; + if( ulNextRxBuffer >= emacNUM_RX_BUFFERS ) + { + ulNextRxBuffer = 0; + } + + /* Ensure the uIP task is not blocked as data has arrived. */ + xSemaphoreGive( xEMACSemaphore ); + } + } + + EthernetIntEnable( ETH_BASE, ETH_INT_RX ); + } +} + diff --git a/Demo/CORTEX_LM3S6965_IAR/webserver/emac.h b/Demo/CORTEX_LM3S6965_IAR/webserver/emac.h new file mode 100644 index 000000000..a49b59828 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/webserver/emac.h @@ -0,0 +1,322 @@ +/*---------------------------------------------------------------------------- + * LPC2378 Ethernet Definitions + *---------------------------------------------------------------------------- + * Name: EMAC.H + * Purpose: Philips LPC2378 EMAC hardware definitions + *---------------------------------------------------------------------------- + * Copyright (c) 2006 KEIL - An ARM Company. All rights reserved. + *---------------------------------------------------------------------------*/ +#ifndef __EMAC_H +#define __EMAC_H + +/* MAC address definition. The MAC address must be unique on the network. */ +#define emacETHADDR0 0 +#define emacETHADDR1 0xbd +#define emacETHADDR2 0x33 +#define emacETHADDR3 0x02 +#define emacETHADDR4 0x64 +#define emacETHADDR5 0x24 + + +/* EMAC Memory Buffer configuration for 16K Ethernet RAM. */ +#define NUM_RX_FRAG 4 /* Num.of RX Fragments 4*1536= 6.0kB */ +#define NUM_TX_FRAG 2 /* Num.of TX Fragments 2*1536= 3.0kB */ +#define ETH_FRAG_SIZE 1536 /* Packet Fragment size 1536 Bytes */ + +#define ETH_MAX_FLEN 1536 /* Max. Ethernet Frame Size */ + +/* EMAC variables located in 16K Ethernet SRAM */ +#define RX_DESC_BASE 0x7FE00000 +#define RX_STAT_BASE (RX_DESC_BASE + NUM_RX_FRAG*8) +#define TX_DESC_BASE (RX_STAT_BASE + NUM_RX_FRAG*8) +#define TX_STAT_BASE (TX_DESC_BASE + NUM_TX_FRAG*8) +#define RX_BUF_BASE (TX_STAT_BASE + NUM_TX_FRAG*4) +#define TX_BUF_BASE (RX_BUF_BASE + NUM_RX_FRAG*ETH_FRAG_SIZE) + +/* RX and TX descriptor and status definitions. */ +#define RX_DESC_PACKET(i) (*(unsigned int *)(RX_DESC_BASE + 8*i)) +#define RX_DESC_CTRL(i) (*(unsigned int *)(RX_DESC_BASE+4 + 8*i)) +#define RX_STAT_INFO(i) (*(unsigned int *)(RX_STAT_BASE + 8*i)) +#define RX_STAT_HASHCRC(i) (*(unsigned int *)(RX_STAT_BASE+4 + 8*i)) +#define TX_DESC_PACKET(i) (*(unsigned int *)(TX_DESC_BASE + 8*i)) +#define TX_DESC_CTRL(i) (*(unsigned int *)(TX_DESC_BASE+4 + 8*i)) +#define TX_STAT_INFO(i) (*(unsigned int *)(TX_STAT_BASE + 4*i)) +#define RX_BUF(i) (RX_BUF_BASE + ETH_FRAG_SIZE*i) +#define TX_BUF(i) (TX_BUF_BASE + ETH_FRAG_SIZE*i) + +/* MAC Configuration Register 1 */ +#define MAC1_REC_EN 0x00000001 /* Receive Enable */ +#define MAC1_PASS_ALL 0x00000002 /* Pass All Receive Frames */ +#define MAC1_RX_FLOWC 0x00000004 /* RX Flow Control */ +#define MAC1_TX_FLOWC 0x00000008 /* TX Flow Control */ +#define MAC1_LOOPB 0x00000010 /* Loop Back Mode */ +#define MAC1_RES_TX 0x00000100 /* Reset TX Logic */ +#define MAC1_RES_MCS_TX 0x00000200 /* Reset MAC TX Control Sublayer */ +#define MAC1_RES_RX 0x00000400 /* Reset RX Logic */ +#define MAC1_RES_MCS_RX 0x00000800 /* Reset MAC RX Control Sublayer */ +#define MAC1_SIM_RES 0x00004000 /* Simulation Reset */ +#define MAC1_SOFT_RES 0x00008000 /* Soft Reset MAC */ + +/* MAC Configuration Register 2 */ +#define MAC2_FULL_DUP 0x00000001 /* Full Duplex Mode */ +#define MAC2_FRM_LEN_CHK 0x00000002 /* Frame Length Checking */ +#define MAC2_HUGE_FRM_EN 0x00000004 /* Huge Frame Enable */ +#define MAC2_DLY_CRC 0x00000008 /* Delayed CRC Mode */ +#define MAC2_CRC_EN 0x00000010 /* Append CRC to every Frame */ +#define MAC2_PAD_EN 0x00000020 /* Pad all Short Frames */ +#define MAC2_VLAN_PAD_EN 0x00000040 /* VLAN Pad Enable */ +#define MAC2_ADET_PAD_EN 0x00000080 /* Auto Detect Pad Enable */ +#define MAC2_PPREAM_ENF 0x00000100 /* Pure Preamble Enforcement */ +#define MAC2_LPREAM_ENF 0x00000200 /* Long Preamble Enforcement */ +#undef MAC2_NO_BACKOFF /* Remove compiler warning. */ +#define MAC2_NO_BACKOFF 0x00001000 /* No Backoff Algorithm */ +#define MAC2_BACK_PRESSURE 0x00002000 /* Backoff Presurre / No Backoff */ +#define MAC2_EXCESS_DEF 0x00004000 /* Excess Defer */ + +/* Back-to-Back Inter-Packet-Gap Register */ +#define IPGT_FULL_DUP 0x00000015 /* Recommended value for Full Duplex */ +#define IPGT_HALF_DUP 0x00000012 /* Recommended value for Half Duplex */ + +/* Non Back-to-Back Inter-Packet-Gap Register */ +#define IPGR_DEF 0x00000012 /* Recommended value */ + +/* Collision Window/Retry Register */ +#define CLRT_DEF 0x0000370F /* Default value */ + +/* PHY Support Register */ +#undef SUPP_SPEED /* Remove compiler warning. */ +#define SUPP_SPEED 0x00000100 /* Reduced MII Logic Current Speed */ +#define SUPP_RES_RMII 0x00000800 /* Reset Reduced MII Logic */ + +/* Test Register */ +#define TEST_SHCUT_PQUANTA 0x00000001 /* Shortcut Pause Quanta */ +#define TEST_TST_PAUSE 0x00000002 /* Test Pause */ +#define TEST_TST_BACKP 0x00000004 /* Test Back Pressure */ + +/* MII Management Configuration Register */ +#define MCFG_SCAN_INC 0x00000001 /* Scan Increment PHY Address */ +#define MCFG_SUPP_PREAM 0x00000002 /* Suppress Preamble */ +#define MCFG_CLK_SEL 0x0000001C /* Clock Select Mask */ +#define MCFG_RES_MII 0x00008000 /* Reset MII Management Hardware */ + +/* MII Management Command Register */ +#undef MCMD_READ /* Remove compiler warning. */ +#define MCMD_READ 0x00000001 /* MII Read */ +#undef MCMD_SCAN /* Remove compiler warning. */ +#define MCMD_SCAN 0x00000002 /* MII Scan continuously */ + +#define MII_WR_TOUT 0x00050000 /* MII Write timeout count */ +#define MII_RD_TOUT 0x00050000 /* MII Read timeout count */ + +/* MII Management Address Register */ +#define MADR_REG_ADR 0x0000001F /* MII Register Address Mask */ +#define MADR_PHY_ADR 0x00001F00 /* PHY Address Mask */ + +/* MII Management Indicators Register */ +#undef MIND_BUSY /* Remove compiler warning. */ +#define MIND_BUSY 0x00000001 /* MII is Busy */ +#define MIND_SCAN 0x00000002 /* MII Scanning in Progress */ +#define MIND_NOT_VAL 0x00000004 /* MII Read Data not valid */ +#define MIND_MII_LINK_FAIL 0x00000008 /* MII Link Failed */ + +/* Command Register */ +#define CR_RX_EN 0x00000001 /* Enable Receive */ +#define CR_TX_EN 0x00000002 /* Enable Transmit */ +#define CR_REG_RES 0x00000008 /* Reset Host Registers */ +#define CR_TX_RES 0x00000010 /* Reset Transmit Datapath */ +#define CR_RX_RES 0x00000020 /* Reset Receive Datapath */ +#define CR_PASS_RUNT_FRM 0x00000040 /* Pass Runt Frames */ +#define CR_PASS_RX_FILT 0x00000080 /* Pass RX Filter */ +#define CR_TX_FLOW_CTRL 0x00000100 /* TX Flow Control */ +#define CR_RMII 0x00000200 /* Reduced MII Interface */ +#define CR_FULL_DUP 0x00000400 /* Full Duplex */ + +/* Status Register */ +#define SR_RX_EN 0x00000001 /* Enable Receive */ +#define SR_TX_EN 0x00000002 /* Enable Transmit */ + +/* Transmit Status Vector 0 Register */ +#define TSV0_CRC_ERR 0x00000001 /* CRC error */ +#define TSV0_LEN_CHKERR 0x00000002 /* Length Check Error */ +#define TSV0_LEN_OUTRNG 0x00000004 /* Length Out of Range */ +#define TSV0_DONE 0x00000008 /* Tramsmission Completed */ +#define TSV0_MCAST 0x00000010 /* Multicast Destination */ +#define TSV0_BCAST 0x00000020 /* Broadcast Destination */ +#define TSV0_PKT_DEFER 0x00000040 /* Packet Deferred */ +#define TSV0_EXC_DEFER 0x00000080 /* Excessive Packet Deferral */ +#define TSV0_EXC_COLL 0x00000100 /* Excessive Collision */ +#define TSV0_LATE_COLL 0x00000200 /* Late Collision Occured */ +#define TSV0_GIANT 0x00000400 /* Giant Frame */ +#define TSV0_UNDERRUN 0x00000800 /* Buffer Underrun */ +#define TSV0_BYTES 0x0FFFF000 /* Total Bytes Transferred */ +#define TSV0_CTRL_FRAME 0x10000000 /* Control Frame */ +#define TSV0_PAUSE 0x20000000 /* Pause Frame */ +#define TSV0_BACK_PRESS 0x40000000 /* Backpressure Method Applied */ +#define TSV0_VLAN 0x80000000 /* VLAN Frame */ + +/* Transmit Status Vector 1 Register */ +#define TSV1_BYTE_CNT 0x0000FFFF /* Transmit Byte Count */ +#define TSV1_COLL_CNT 0x000F0000 /* Transmit Collision Count */ + +/* Receive Status Vector Register */ +#define RSV_BYTE_CNT 0x0000FFFF /* Receive Byte Count */ +#define RSV_PKT_IGNORED 0x00010000 /* Packet Previously Ignored */ +#define RSV_RXDV_SEEN 0x00020000 /* RXDV Event Previously Seen */ +#define RSV_CARR_SEEN 0x00040000 /* Carrier Event Previously Seen */ +#define RSV_REC_CODEV 0x00080000 /* Receive Code Violation */ +#define RSV_CRC_ERR 0x00100000 /* CRC Error */ +#define RSV_LEN_CHKERR 0x00200000 /* Length Check Error */ +#define RSV_LEN_OUTRNG 0x00400000 /* Length Out of Range */ +#define RSV_REC_OK 0x00800000 /* Frame Received OK */ +#define RSV_MCAST 0x01000000 /* Multicast Frame */ +#define RSV_BCAST 0x02000000 /* Broadcast Frame */ +#define RSV_DRIB_NIBB 0x04000000 /* Dribble Nibble */ +#define RSV_CTRL_FRAME 0x08000000 /* Control Frame */ +#define RSV_PAUSE 0x10000000 /* Pause Frame */ +#define RSV_UNSUPP_OPC 0x20000000 /* Unsupported Opcode */ +#define RSV_VLAN 0x40000000 /* VLAN Frame */ + +/* Flow Control Counter Register */ +#define FCC_MIRR_CNT 0x0000FFFF /* Mirror Counter */ +#define FCC_PAUSE_TIM 0xFFFF0000 /* Pause Timer */ + +/* Flow Control Status Register */ +#define FCS_MIRR_CNT 0x0000FFFF /* Mirror Counter Current */ + +/* Receive Filter Control Register */ +#define RFC_UCAST_EN 0x00000001 /* Accept Unicast Frames Enable */ +#define RFC_BCAST_EN 0x00000002 /* Accept Broadcast Frames Enable */ +#define RFC_MCAST_EN 0x00000004 /* Accept Multicast Frames Enable */ +#define RFC_UCAST_HASH_EN 0x00000008 /* Accept Unicast Hash Filter Frames */ +#define RFC_MCAST_HASH_EN 0x00000010 /* Accept Multicast Hash Filter Fram.*/ +#define RFC_PERFECT_EN 0x00000020 /* Accept Perfect Match Enable */ +#define RFC_MAGP_WOL_EN 0x00001000 /* Magic Packet Filter WoL Enable */ +#define RFC_PFILT_WOL_EN 0x00002000 /* Perfect Filter WoL Enable */ + +/* Receive Filter WoL Status/Clear Registers */ +#define WOL_UCAST 0x00000001 /* Unicast Frame caused WoL */ +#define WOL_BCAST 0x00000002 /* Broadcast Frame caused WoL */ +#define WOL_MCAST 0x00000004 /* Multicast Frame caused WoL */ +#define WOL_UCAST_HASH 0x00000008 /* Unicast Hash Filter Frame WoL */ +#define WOL_MCAST_HASH 0x00000010 /* Multicast Hash Filter Frame WoL */ +#define WOL_PERFECT 0x00000020 /* Perfect Filter WoL */ +#define WOL_RX_FILTER 0x00000080 /* RX Filter caused WoL */ +#define WOL_MAG_PACKET 0x00000100 /* Magic Packet Filter caused WoL */ + +/* Interrupt Status/Enable/Clear/Set Registers */ +#define INT_RX_OVERRUN 0x00000001 /* Overrun Error in RX Queue */ +#define INT_RX_ERR 0x00000002 /* Receive Error */ +#define INT_RX_FIN 0x00000004 /* RX Finished Process Descriptors */ +#define INT_RX_DONE 0x00000008 /* Receive Done */ +#define INT_TX_UNDERRUN 0x00000010 /* Transmit Underrun */ +#define INT_TX_ERR 0x00000020 /* Transmit Error */ +#define INT_TX_FIN 0x00000040 /* TX Finished Process Descriptors */ +#define INT_TX_DONE 0x00000080 /* Transmit Done */ +#define INT_SOFT_INT 0x00001000 /* Software Triggered Interrupt */ +#define INT_WAKEUP 0x00002000 /* Wakeup Event Interrupt */ + +/* Power Down Register */ +#define PD_POWER_DOWN 0x80000000 /* Power Down MAC */ + +/* RX Descriptor Control Word */ +#define RCTRL_SIZE 0x000007FF /* Buffer size mask */ +#define RCTRL_INT 0x80000000 /* Generate RxDone Interrupt */ + +/* RX Status Hash CRC Word */ +#define RHASH_SA 0x000001FF /* Hash CRC for Source Address */ +#define RHASH_DA 0x001FF000 /* Hash CRC for Destination Address */ + +/* RX Status Information Word */ +#define RINFO_SIZE 0x000007FF /* Data size in bytes */ +#define RINFO_CTRL_FRAME 0x00040000 /* Control Frame */ +#define RINFO_VLAN 0x00080000 /* VLAN Frame */ +#define RINFO_FAIL_FILT 0x00100000 /* RX Filter Failed */ +#define RINFO_MCAST 0x00200000 /* Multicast Frame */ +#define RINFO_BCAST 0x00400000 /* Broadcast Frame */ +#define RINFO_CRC_ERR 0x00800000 /* CRC Error in Frame */ +#define RINFO_SYM_ERR 0x01000000 /* Symbol Error from PHY */ +#define RINFO_LEN_ERR 0x02000000 /* Length Error */ +#define RINFO_RANGE_ERR 0x04000000 /* Range Error (exceeded max. size) */ +#define RINFO_ALIGN_ERR 0x08000000 /* Alignment Error */ +#define RINFO_OVERRUN 0x10000000 /* Receive overrun */ +#define RINFO_NO_DESCR 0x20000000 /* No new Descriptor available */ +#define RINFO_LAST_FLAG 0x40000000 /* Last Fragment in Frame */ +#define RINFO_ERR 0x80000000 /* Error Occured (OR of all errors) */ + +#define RINFO_ERR_MASK (RINFO_FAIL_FILT | RINFO_CRC_ERR | RINFO_SYM_ERR | \ + RINFO_LEN_ERR | RINFO_ALIGN_ERR | RINFO_OVERRUN) + +/* TX Descriptor Control Word */ +#define TCTRL_SIZE 0x000007FF /* Size of data buffer in bytes */ +#define TCTRL_OVERRIDE 0x04000000 /* Override Default MAC Registers */ +#define TCTRL_HUGE 0x08000000 /* Enable Huge Frame */ +#define TCTRL_PAD 0x10000000 /* Pad short Frames to 64 bytes */ +#define TCTRL_CRC 0x20000000 /* Append a hardware CRC to Frame */ +#define TCTRL_LAST 0x40000000 /* Last Descriptor for TX Frame */ +#define TCTRL_INT 0x80000000 /* Generate TxDone Interrupt */ + +/* TX Status Information Word */ +#define TINFO_COL_CNT 0x01E00000 /* Collision Count */ +#define TINFO_DEFER 0x02000000 /* Packet Deferred (not an error) */ +#define TINFO_EXCESS_DEF 0x04000000 /* Excessive Deferral */ +#define TINFO_EXCESS_COL 0x08000000 /* Excessive Collision */ +#define TINFO_LATE_COL 0x10000000 /* Late Collision Occured */ +#define TINFO_UNDERRUN 0x20000000 /* Transmit Underrun */ +#define TINFO_NO_DESCR 0x40000000 /* No new Descriptor available */ +#define TINFO_ERR 0x80000000 /* Error Occured (OR of all errors) */ + +/* DP83848C PHY Registers */ +#define PHY_REG_BMCR 0x00 /* Basic Mode Control Register */ +#define PHY_REG_BMSR 0x01 /* Basic Mode Status Register */ +#define PHY_REG_IDR1 0x02 /* PHY Identifier 1 */ +#define PHY_REG_IDR2 0x03 /* PHY Identifier 2 */ +#define PHY_REG_ANAR 0x04 /* Auto-Negotiation Advertisement */ +#define PHY_REG_ANLPAR 0x05 /* Auto-Neg. Link Partner Abitily */ +#define PHY_REG_ANER 0x06 /* Auto-Neg. Expansion Register */ +#define PHY_REG_ANNPTR 0x07 /* Auto-Neg. Next Page TX */ + +/* PHY Extended Registers */ +#define PHY_REG_STS 0x10 /* Status Register */ +#define PHY_REG_MICR 0x11 /* MII Interrupt Control Register */ +#define PHY_REG_MISR 0x12 /* MII Interrupt Status Register */ +#define PHY_REG_FCSCR 0x14 /* False Carrier Sense Counter */ +#define PHY_REG_RECR 0x15 /* Receive Error Counter */ +#define PHY_REG_PCSR 0x16 /* PCS Sublayer Config. and Status */ +#define PHY_REG_RBR 0x17 /* RMII and Bypass Register */ +#define PHY_REG_LEDCR 0x18 /* LED Direct Control Register */ +#define PHY_REG_PHYCR 0x19 /* PHY Control Register */ +#define PHY_REG_10BTSCR 0x1A /* 10Base-T Status/Control Register */ +#define PHY_REG_CDCTRL1 0x1B /* CD Test Control and BIST Extens. */ +#define PHY_REG_EDCR 0x1D /* Energy Detect Control Register */ + +#define PHY_FULLD_100M 0x2100 /* Full Duplex 100Mbit */ +#define PHY_HALFD_100M 0x2000 /* Half Duplex 100Mbit */ +#define PHY_FULLD_10M 0x0100 /* Full Duplex 10Mbit */ +#define PHY_HALFD_10M 0x0000 /* Half Duplex 10MBit */ +#define PHY_AUTO_NEG 0x3000 /* Select Auto Negotiation */ + +#define DP83848C_DEF_ADR 0x0100 /* Default PHY device address */ +#define DP83848C_ID 0x20005C90 /* PHY Identifier */ + +// prototypes +portBASE_TYPE vInitEMAC(void); +unsigned short ReadFrameBE_EMAC(void); +void vIncrementTxLength(unsigned long ulLength); +void CopyFromFrame_EMAC(void *Dest, unsigned short Size); +void DummyReadFrame_EMAC(unsigned short Size); +unsigned short StartReadFrame(void); +void EndReadFrame(void); +unsigned int CheckFrameReceived(void); +void vInitialiseSend(void); +unsigned int Rdy4Tx(void); +void vSendBufferToMAC(void); +void vEMACWaitForInput( void ); +unsigned int uiGetEMACRxData( unsigned char *ucBuffer ); + + +#endif + +/*---------------------------------------------------------------------------- + * end of file + *---------------------------------------------------------------------------*/ + diff --git a/Demo/CORTEX_LM3S6965_IAR/webserver/http-strings b/Demo/CORTEX_LM3S6965_IAR/webserver/http-strings new file mode 100644 index 000000000..0d3c30cdd --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/webserver/http-strings @@ -0,0 +1,35 @@ +http_http "http://" +http_200 "200 " +http_301 "301 " +http_302 "302 " +http_get "GET " +http_10 "HTTP/1.0" +http_11 "HTTP/1.1" +http_content_type "content-type: " +http_texthtml "text/html" +http_location "location: " +http_host "host: " +http_crnl "\r\n" +http_index_html "/index.html" +http_404_html "/404.html" +http_referer "Referer:" +http_header_200 "HTTP/1.0 200 OK\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n" +http_header_404 "HTTP/1.0 404 Not found\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n" +http_content_type_plain "Content-type: text/plain\r\n\r\n" +http_content_type_html "Content-type: text/html\r\n\r\n" +http_content_type_css "Content-type: text/css\r\n\r\n" +http_content_type_text "Content-type: text/text\r\n\r\n" +http_content_type_png "Content-type: image/png\r\n\r\n" +http_content_type_gif "Content-type: image/gif\r\n\r\n" +http_content_type_jpg "Content-type: image/jpeg\r\n\r\n" +http_content_type_binary "Content-type: application/octet-stream\r\n\r\n" +http_html ".html" +http_shtml ".shtml" +http_htm ".htm" +http_css ".css" +http_png ".png" +http_gif ".gif" +http_jpg ".jpg" +http_text ".txt" +http_txt ".txt" + diff --git a/Demo/CORTEX_LM3S6965_IAR/webserver/http-strings.c b/Demo/CORTEX_LM3S6965_IAR/webserver/http-strings.c new file mode 100644 index 000000000..ef7a41c7d --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/webserver/http-strings.c @@ -0,0 +1,102 @@ +const char http_http[8] = +/* "http://" */ +{0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, }; +const char http_200[5] = +/* "200 " */ +{0x32, 0x30, 0x30, 0x20, }; +const char http_301[5] = +/* "301 " */ +{0x33, 0x30, 0x31, 0x20, }; +const char http_302[5] = +/* "302 " */ +{0x33, 0x30, 0x32, 0x20, }; +const char http_get[5] = +/* "GET " */ +{0x47, 0x45, 0x54, 0x20, }; +const char http_10[9] = +/* "HTTP/1.0" */ +{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, }; +const char http_11[9] = +/* "HTTP/1.1" */ +{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x31, }; +const char http_content_type[15] = +/* "content-type: " */ +{0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, }; +const char http_texthtml[10] = +/* "text/html" */ +{0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_location[11] = +/* "location: " */ +{0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, }; +const char http_host[7] = +/* "host: " */ +{0x68, 0x6f, 0x73, 0x74, 0x3a, 0x20, }; +const char http_crnl[3] = +/* "\r\n" */ +{0xd, 0xa, }; +const char http_index_html[12] = +/* "/index.html" */ +{0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_404_html[10] = +/* "/404.html" */ +{0x2f, 0x34, 0x30, 0x34, 0x2e, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_referer[9] = +/* "Referer:" */ +{0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x72, 0x3a, }; +const char http_header_200[84] = +/* "HTTP/1.0 200 OK\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n" */ +{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x32, 0x30, 0x30, 0x20, 0x4f, 0x4b, 0xd, 0xa, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x3a, 0x20, 0x75, 0x49, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x2f, 0x7e, 0x61, 0x64, 0x61, 0x6d, 0x2f, 0x75, 0x69, 0x70, 0x2f, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0xd, 0xa, }; +const char http_header_404[91] = +/* "HTTP/1.0 404 Not found\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n" */ +{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x34, 0x30, 0x34, 0x20, 0x4e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0xd, 0xa, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x3a, 0x20, 0x75, 0x49, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x2f, 0x7e, 0x61, 0x64, 0x61, 0x6d, 0x2f, 0x75, 0x69, 0x70, 0x2f, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0xd, 0xa, }; +const char http_content_type_plain[29] = +/* "Content-type: text/plain\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_html[28] = +/* "Content-type: text/html\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_css [27] = +/* "Content-type: text/css\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_text[28] = +/* "Content-type: text/text\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x74, 0x65, 0x78, 0x74, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_png [28] = +/* "Content-type: image/png\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x70, 0x6e, 0x67, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_gif [28] = +/* "Content-type: image/gif\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x67, 0x69, 0x66, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_jpg [29] = +/* "Content-type: image/jpeg\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x6a, 0x70, 0x65, 0x67, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_binary[43] = +/* "Content-type: application/octet-stream\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0xd, 0xa, 0xd, 0xa, }; +const char http_html[6] = +/* ".html" */ +{0x2e, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_shtml[7] = +/* ".shtml" */ +{0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_htm[5] = +/* ".htm" */ +{0x2e, 0x68, 0x74, 0x6d, }; +const char http_css[5] = +/* ".css" */ +{0x2e, 0x63, 0x73, 0x73, }; +const char http_png[5] = +/* ".png" */ +{0x2e, 0x70, 0x6e, 0x67, }; +const char http_gif[5] = +/* ".gif" */ +{0x2e, 0x67, 0x69, 0x66, }; +const char http_jpg[5] = +/* ".jpg" */ +{0x2e, 0x6a, 0x70, 0x67, }; +const char http_text[5] = +/* ".txt" */ +{0x2e, 0x74, 0x78, 0x74, }; +const char http_txt[5] = +/* ".txt" */ +{0x2e, 0x74, 0x78, 0x74, }; diff --git a/Demo/CORTEX_LM3S6965_IAR/webserver/http-strings.h b/Demo/CORTEX_LM3S6965_IAR/webserver/http-strings.h new file mode 100644 index 000000000..acbe7e17f --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/webserver/http-strings.h @@ -0,0 +1,34 @@ +extern const char http_http[8]; +extern const char http_200[5]; +extern const char http_301[5]; +extern const char http_302[5]; +extern const char http_get[5]; +extern const char http_10[9]; +extern const char http_11[9]; +extern const char http_content_type[15]; +extern const char http_texthtml[10]; +extern const char http_location[11]; +extern const char http_host[7]; +extern const char http_crnl[3]; +extern const char http_index_html[12]; +extern const char http_404_html[10]; +extern const char http_referer[9]; +extern const char http_header_200[84]; +extern const char http_header_404[91]; +extern const char http_content_type_plain[29]; +extern const char http_content_type_html[28]; +extern const char http_content_type_css [27]; +extern const char http_content_type_text[28]; +extern const char http_content_type_png [28]; +extern const char http_content_type_gif [28]; +extern const char http_content_type_jpg [29]; +extern const char http_content_type_binary[43]; +extern const char http_html[6]; +extern const char http_shtml[7]; +extern const char http_htm[5]; +extern const char http_css[5]; +extern const char http_png[5]; +extern const char http_gif[5]; +extern const char http_jpg[5]; +extern const char http_text[5]; +extern const char http_txt[5]; diff --git a/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-cgi.c b/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-cgi.c new file mode 100644 index 000000000..803b771e6 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-cgi.c @@ -0,0 +1,269 @@ +/** + * \addtogroup httpd + * @{ + */ + +/** + * \file + * Web server script interface + * \author + * Adam Dunkels + * + */ + +/* + * Copyright (c) 2001-2006, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: httpd-cgi.c,v 1.2 2006/06/11 21:46:37 adam Exp $ + * + */ + +#include "uip.h" +#include "psock.h" +#include "httpd.h" +#include "httpd-cgi.h" +#include "httpd-fs.h" + +#include +#include + +HTTPD_CGI_CALL(file, "file-stats", file_stats); +HTTPD_CGI_CALL(tcp, "tcp-connections", tcp_stats); +HTTPD_CGI_CALL(net, "net-stats", net_stats); +HTTPD_CGI_CALL(rtos, "rtos-stats", rtos_stats ); +HTTPD_CGI_CALL(io, "led-io", led_io ); + + +static const struct httpd_cgi_call *calls[] = { &file, &tcp, &net, &rtos, &io, NULL }; + +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(nullfunction(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +httpd_cgifunction +httpd_cgi(char *name) +{ + const struct httpd_cgi_call **f; + + /* Find the matching name in the table, return the function. */ + for(f = calls; *f != NULL; ++f) { + if(strncmp((*f)->name, name, strlen((*f)->name)) == 0) { + return (*f)->function; + } + } + return nullfunction; +} +/*---------------------------------------------------------------------------*/ +static unsigned short +generate_file_stats(void *arg) +{ + char *f = (char *)arg; + return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE, "%5u", httpd_fs_count(f)); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(file_stats(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + + PSOCK_GENERATOR_SEND(&s->sout, generate_file_stats, strchr(ptr, ' ') + 1); + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static const char closed[] = /* "CLOSED",*/ +{0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0}; +static const char syn_rcvd[] = /* "SYN-RCVD",*/ +{0x53, 0x59, 0x4e, 0x2d, 0x52, 0x43, 0x56, + 0x44, 0}; +static const char syn_sent[] = /* "SYN-SENT",*/ +{0x53, 0x59, 0x4e, 0x2d, 0x53, 0x45, 0x4e, + 0x54, 0}; +static const char established[] = /* "ESTABLISHED",*/ +{0x45, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x49, 0x53, 0x48, + 0x45, 0x44, 0}; +static const char fin_wait_1[] = /* "FIN-WAIT-1",*/ +{0x46, 0x49, 0x4e, 0x2d, 0x57, 0x41, 0x49, + 0x54, 0x2d, 0x31, 0}; +static const char fin_wait_2[] = /* "FIN-WAIT-2",*/ +{0x46, 0x49, 0x4e, 0x2d, 0x57, 0x41, 0x49, + 0x54, 0x2d, 0x32, 0}; +static const char closing[] = /* "CLOSING",*/ +{0x43, 0x4c, 0x4f, 0x53, 0x49, + 0x4e, 0x47, 0}; +static const char time_wait[] = /* "TIME-WAIT,"*/ +{0x54, 0x49, 0x4d, 0x45, 0x2d, 0x57, 0x41, + 0x49, 0x54, 0}; +static const char last_ack[] = /* "LAST-ACK"*/ +{0x4c, 0x41, 0x53, 0x54, 0x2d, 0x41, 0x43, + 0x4b, 0}; + +static const char *states[] = { + closed, + syn_rcvd, + syn_sent, + established, + fin_wait_1, + fin_wait_2, + closing, + time_wait, + last_ack}; + + +static unsigned short +generate_tcp_stats(void *arg) +{ + struct uip_conn *conn; + struct httpd_state *s = (struct httpd_state *)arg; + + conn = &uip_conns[s->count]; + return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE, + "\r\n", + htons(conn->lport), + htons(conn->ripaddr[0]) >> 8, + htons(conn->ripaddr[0]) & 0xff, + htons(conn->ripaddr[1]) >> 8, + htons(conn->ripaddr[1]) & 0xff, + htons(conn->rport), + states[conn->tcpstateflags & UIP_TS_MASK], + conn->nrtx, + conn->timer, + (uip_outstanding(conn))? '*':' ', + (uip_stopped(conn))? '!':' '); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(tcp_stats(struct httpd_state *s, char *ptr)) +{ + + PSOCK_BEGIN(&s->sout); + + for(s->count = 0; s->count < UIP_CONNS; ++s->count) { + if((uip_conns[s->count].tcpstateflags & UIP_TS_MASK) != UIP_CLOSED) { + PSOCK_GENERATOR_SEND(&s->sout, generate_tcp_stats, s); + } + } + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static unsigned short +generate_net_stats(void *arg) +{ + struct httpd_state *s = (struct httpd_state *)arg; + return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE, + "%5u\n", ((uip_stats_t *)&uip_stat)[s->count]); +} + +static +PT_THREAD(net_stats(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + +#if UIP_STATISTICS + + for(s->count = 0; s->count < sizeof(uip_stat) / sizeof(uip_stats_t); + ++s->count) { + PSOCK_GENERATOR_SEND(&s->sout, generate_net_stats, s); + } + +#endif /* UIP_STATISTICS */ + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ + +extern void vTaskList( signed char *pcWriteBuffer ); +static char cCountBuf[ 32 ]; +long lRefreshCount = 0; +static unsigned short +generate_rtos_stats(void *arg) +{ + lRefreshCount++; + sprintf( cCountBuf, "


Refresh count = %d", lRefreshCount ); + vTaskList( uip_appdata ); + strcat( uip_appdata, cCountBuf ); + + return strlen( uip_appdata ); +} +/*---------------------------------------------------------------------------*/ + + +static +PT_THREAD(rtos_stats(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + PSOCK_GENERATOR_SEND(&s->sout, generate_rtos_stats, NULL); + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ + +char *pcStatus; +extern unsigned long uxParTestGetLED( unsigned long uxLED ); + +static unsigned short generate_io_state( void *arg ) +{ + if( uxParTestGetLED( 0 ) ) + { + pcStatus = "checked"; + } + else + { + pcStatus = ""; + } + + sprintf( uip_appdata, + "LED"\ + "

"\ + "", + pcStatus ); + + return strlen( uip_appdata ); +} +/*---------------------------------------------------------------------------*/ + +static PT_THREAD(led_io(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + PSOCK_GENERATOR_SEND(&s->sout, generate_io_state, NULL); + PSOCK_END(&s->sout); +} + +/** @} */ + + + + + + diff --git a/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-cgi.h b/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-cgi.h new file mode 100644 index 000000000..7ae928321 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-cgi.h @@ -0,0 +1,84 @@ +/** + * \addtogroup httpd + * @{ + */ + +/** + * \file + * Web server script interface header file + * \author + * Adam Dunkels + * + */ + + + +/* + * Copyright (c) 2001, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: httpd-cgi.h,v 1.2 2006/06/11 21:46:38 adam Exp $ + * + */ + +#ifndef __HTTPD_CGI_H__ +#define __HTTPD_CGI_H__ + +#include "psock.h" +#include "httpd.h" + +typedef PT_THREAD((* httpd_cgifunction)(struct httpd_state *, char *)); + +httpd_cgifunction httpd_cgi(char *name); + +struct httpd_cgi_call { + const char *name; + const httpd_cgifunction function; +}; + +/** + * \brief HTTPD CGI function declaration + * \param name The C variable name of the function + * \param str The string name of the function, used in the script file + * \param function A pointer to the function that implements it + * + * This macro is used for declaring a HTTPD CGI + * function. This function is then added to the list of + * HTTPD CGI functions with the httpd_cgi_add() function. + * + * \hideinitializer + */ +#define HTTPD_CGI_CALL(name, str, function) \ +static PT_THREAD(function(struct httpd_state *, char *)); \ +static const struct httpd_cgi_call name = {str, function} + +void httpd_cgi_init(void); +#endif /* __HTTPD_CGI_H__ */ + +/** @} */ diff --git a/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fs.c b/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fs.c new file mode 100644 index 000000000..dc4aef011 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fs.c @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2001, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: httpd-fs.c,v 1.1 2006/06/07 09:13:08 adam Exp $ + */ + +#include "httpd.h" +#include "httpd-fs.h" +#include "httpd-fsdata.h" + +#ifndef NULL +#define NULL 0 +#endif /* NULL */ + +#include "httpd-fsdata.c" + +#if HTTPD_FS_STATISTICS +static u16_t count[HTTPD_FS_NUMFILES]; +#endif /* HTTPD_FS_STATISTICS */ + +/*-----------------------------------------------------------------------------------*/ +static u8_t +httpd_fs_strcmp(const char *str1, const char *str2) +{ + u8_t i; + i = 0; + loop: + + if(str2[i] == 0 || + str1[i] == '\r' || + str1[i] == '\n') { + return 0; + } + + if(str1[i] != str2[i]) { + return 1; + } + + + ++i; + goto loop; +} +/*-----------------------------------------------------------------------------------*/ +int +httpd_fs_open(const char *name, struct httpd_fs_file *file) +{ +#if HTTPD_FS_STATISTICS + u16_t i = 0; +#endif /* HTTPD_FS_STATISTICS */ + struct httpd_fsdata_file_noconst *f; + + for(f = (struct httpd_fsdata_file_noconst *)HTTPD_FS_ROOT; + f != NULL; + f = (struct httpd_fsdata_file_noconst *)f->next) { + + if(httpd_fs_strcmp(name, f->name) == 0) { + file->data = f->data; + file->len = f->len; +#if HTTPD_FS_STATISTICS + ++count[i]; +#endif /* HTTPD_FS_STATISTICS */ + return 1; + } +#if HTTPD_FS_STATISTICS + ++i; +#endif /* HTTPD_FS_STATISTICS */ + + } + return 0; +} +/*-----------------------------------------------------------------------------------*/ +void +httpd_fs_init(void) +{ +#if HTTPD_FS_STATISTICS + u16_t i; + for(i = 0; i < HTTPD_FS_NUMFILES; i++) { + count[i] = 0; + } +#endif /* HTTPD_FS_STATISTICS */ +} +/*-----------------------------------------------------------------------------------*/ +#if HTTPD_FS_STATISTICS +u16_t httpd_fs_count +(char *name) +{ + struct httpd_fsdata_file_noconst *f; + u16_t i; + + i = 0; + for(f = (struct httpd_fsdata_file_noconst *)HTTPD_FS_ROOT; + f != NULL; + f = (struct httpd_fsdata_file_noconst *)f->next) { + + if(httpd_fs_strcmp(name, f->name) == 0) { + return count[i]; + } + ++i; + } + return 0; +} +#endif /* HTTPD_FS_STATISTICS */ +/*-----------------------------------------------------------------------------------*/ diff --git a/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fs.h b/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fs.h new file mode 100644 index 000000000..b594eea56 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fs.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2001, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: httpd-fs.h,v 1.1 2006/06/07 09:13:08 adam Exp $ + */ +#ifndef __HTTPD_FS_H__ +#define __HTTPD_FS_H__ + +#define HTTPD_FS_STATISTICS 1 + +struct httpd_fs_file { + char *data; + int len; +}; + +/* file must be allocated by caller and will be filled in + by the function. */ +int httpd_fs_open(const char *name, struct httpd_fs_file *file); + +#ifdef HTTPD_FS_STATISTICS +#if HTTPD_FS_STATISTICS == 1 +u16_t httpd_fs_count(char *name); +#endif /* HTTPD_FS_STATISTICS */ +#endif /* HTTPD_FS_STATISTICS */ + +void httpd_fs_init(void); + +#endif /* __HTTPD_FS_H__ */ diff --git a/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fs/404.html b/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fs/404.html new file mode 100644 index 000000000..43e7f4cad --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fs/404.html @@ -0,0 +1,8 @@ + + +

+

404 - file not found

+

Go here instead.

+
+ + \ No newline at end of file diff --git a/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fs/index.html b/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fs/index.html new file mode 100644 index 000000000..1d3bbeee1 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fs/index.html @@ -0,0 +1,13 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +Loading index.shtml. Click here if not automatically redirected. + + + + + diff --git a/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fs/index.shtml b/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fs/index.shtml new file mode 100644 index 000000000..1923ea762 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fs/index.shtml @@ -0,0 +1,20 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +RTOS Stats | TCP Stats | Connections | FreeRTOS.org Homepage | IO +

+


+

+

Task statistics

+Page will refresh every 2 seconds.

+

Task          State  Priority  Stack	#
************************************************
+%! rtos-stats +
+
+ + + diff --git a/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fs/io.shtml b/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fs/io.shtml new file mode 100644 index 000000000..07554bb71 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fs/io.shtml @@ -0,0 +1,28 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +RTOS Stats | TCP Stats | Connections | FreeRTOS.org Homepage | IO +

+


+LED and LCD IO
+ +

+ +Use the check box to turn on or off the LED, enter text to display on the OLED display, then click "Update IO". + + +

+
+%! led-io +

+ + +

+ + + + diff --git a/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fs/stats.shtml b/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fs/stats.shtml new file mode 100644 index 000000000..d762f40d8 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fs/stats.shtml @@ -0,0 +1,41 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +RTOS Stats | TCP Stats | Connections | FreeRTOS.org Homepage | IO +

+


+

+

Network statistics

+
LocalRemoteStateRetransmissionsTimerFlags
%d%u.%u.%u.%u:%u%s%u%u%c %c
+
+IP           Packets dropped
+             Packets received
+             Packets sent
+IP errors    IP version/header length
+             IP length, high byte
+             IP length, low byte
+             IP fragments
+             Header checksum
+             Wrong protocol
+ICMP	     Packets dropped
+             Packets received
+             Packets sent
+             Type errors
+TCP          Packets dropped
+             Packets received
+             Packets sent
+             Checksum errors
+             Data packets without ACKs
+             Resets
+             Retransmissions
+	     No connection avaliable
+	     Connection attempts to closed ports
+
%! net-stats
+
+ + + diff --git a/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fs/tcp.shtml b/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fs/tcp.shtml new file mode 100644 index 000000000..654d61f21 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fs/tcp.shtml @@ -0,0 +1,21 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +RTOS Stats | TCP Stats | Connections | FreeRTOS.org Homepage | IO +

+


+
+

Network connections

+

+ + +%! tcp-connections + + + + + diff --git a/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fsdata.c b/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fsdata.c new file mode 100644 index 000000000..a7fcfab5a --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fsdata.c @@ -0,0 +1,470 @@ +static const unsigned char data_404_html[] = { + /* /404.html */ + 0x2f, 0x34, 0x30, 0x34, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0, + 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xd, 0xa, 0x20, 0x20, + 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x62, 0x67, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3d, 0x22, 0x77, 0x68, 0x69, 0x74, 0x65, + 0x22, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x63, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3e, 0xd, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 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, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x68, 0x33, 0x3e, 0x47, 0x6f, 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, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, + 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3e, 0xd, 0xa, 0x20, + 0x20, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xd, 0xa, + 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0}; + +static const unsigned char data_index_html[] = { + /* /index.html */ + 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0, + 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, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, + 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, + 0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, + 0x57, 0x45, 0x42, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x20, 0x64, 0x65, 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x42, + 0x4f, 0x44, 0x59, 0x20, 0x6f, 0x6e, 0x4c, 0x6f, 0x61, 0x64, + 0x3d, 0x22, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x73, + 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, + 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x27, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x73, 0x68, 0x74, + 0x6d, 0x6c, 0x27, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x2c, + 0x31, 0x30, 0x30, 0x29, 0x22, 0x62, 0x67, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3d, 0x22, 0x23, 0x43, 0x43, 0x43, 0x43, 0x66, + 0x66, 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x66, 0x6f, 0x6e, 0x74, + 0x20, 0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 0x61, 0x72, 0x69, + 0x61, 0x6c, 0x22, 0x3e, 0xd, 0xa, 0x4c, 0x6f, 0x61, 0x64, + 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, + 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x2e, 0x20, 0x20, 0x43, 0x6c, + 0x69, 0x63, 0x6b, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, + 0x66, 0x3d, 0x22, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x73, + 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x68, 0x65, 0x72, 0x65, + 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, + 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x72, 0x65, 0x64, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x65, 0x64, 0x2e, 0xd, 0xa, 0x3c, + 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xd, 0xa, 0x3c, 0x2f, + 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x62, + 0x6f, 0x64, 0x79, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x68, 0x74, + 0x6d, 0x6c, 0x3e, 0xd, 0xa, 0xd, 0xa, 0}; + +static const unsigned char data_index_shtml[] = { + /* /index.shtml */ + 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0, + 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, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, + 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, + 0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, + 0x57, 0x45, 0x42, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x20, 0x64, 0x65, 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x42, + 0x4f, 0x44, 0x59, 0x20, 0x6f, 0x6e, 0x4c, 0x6f, 0x61, 0x64, + 0x3d, 0x22, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x73, + 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, + 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x27, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x73, 0x68, 0x74, + 0x6d, 0x6c, 0x27, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x2c, + 0x32, 0x30, 0x30, 0x30, 0x29, 0x22, 0x62, 0x67, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3d, 0x22, 0x23, 0x43, 0x43, 0x43, 0x43, + 0x66, 0x66, 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x66, 0x6f, 0x6e, + 0x74, 0x20, 0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 0x61, 0x72, + 0x69, 0x61, 0x6c, 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x61, 0x20, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x52, + 0x54, 0x4f, 0x53, 0x20, 0x53, 0x74, 0x61, 0x74, 0x73, 0x3c, + 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, + 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, + 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x54, 0x43, 0x50, 0x20, 0x53, + 0x74, 0x61, 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, + 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x74, 0x63, 0x70, + 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, + 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, + 0x62, 0x3e, 0x20, 0x3c, 0x61, 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, 0x2e, 0x6f, 0x72, 0x67, + 0x20, 0x48, 0x6f, 0x6d, 0x65, 0x70, 0x61, 0x67, 0x65, 0x3c, + 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, + 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x69, 0x6f, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, + 0x22, 0x3e, 0x49, 0x4f, 0x3c, 0x2f, 0x61, 0x3e, 0xd, 0xa, + 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0x3c, + 0x68, 0x72, 0x3e, 0xd, 0xa, 0x3c, 0x62, 0x72, 0x3e, 0x3c, + 0x70, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x32, 0x3e, 0x54, 0x61, + 0x73, 0x6b, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, + 0x69, 0x63, 0x73, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0xd, 0xa, + 0x50, 0x61, 0x67, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, + 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x20, 0x65, 0x76, + 0x65, 0x72, 0x79, 0x20, 0x32, 0x20, 0x73, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x73, 0x2e, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0x3c, + 0x66, 0x6f, 0x6e, 0x74, 0x20, 0x66, 0x61, 0x63, 0x65, 0x3d, + 0x22, 0x63, 0x6f, 0x75, 0x72, 0x69, 0x65, 0x72, 0x22, 0x3e, + 0x3c, 0x70, 0x72, 0x65, 0x3e, 0x54, 0x61, 0x73, 0x6b, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x20, 0x20, 0x50, 0x72, 0x69, 0x6f, + 0x72, 0x69, 0x74, 0x79, 0x20, 0x20, 0x53, 0x74, 0x61, 0x63, + 0x6b, 0x9, 0x23, 0x3c, 0x62, 0x72, 0x3e, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x3c, 0x62, 0x72, 0x3e, 0xd, + 0xa, 0x25, 0x21, 0x20, 0x72, 0x74, 0x6f, 0x73, 0x2d, 0x73, + 0x74, 0x61, 0x74, 0x73, 0xd, 0xa, 0x3c, 0x2f, 0x70, 0x72, + 0x65, 0x3e, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xd, + 0xa, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xd, 0xa, + 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xd, 0xa, 0x3c, + 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xd, 0xa, 0xd, 0xa, +0}; + +static const unsigned char data_io_shtml[] = { + /* /io.shtml */ + 0x2f, 0x69, 0x6f, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0, + 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, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, + 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, + 0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, + 0x57, 0x45, 0x42, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x20, 0x64, 0x65, 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x42, + 0x4f, 0x44, 0x59, 0x20, 0x62, 0x67, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3d, 0x22, 0x23, 0x43, 0x43, 0x43, 0x43, 0x66, 0x66, + 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x20, + 0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 0x61, 0x72, 0x69, 0x61, + 0x6c, 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x61, 0x20, 0x68, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, + 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x52, 0x54, 0x4f, + 0x53, 0x20, 0x53, 0x74, 0x61, 0x74, 0x73, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, + 0x6c, 0x22, 0x3e, 0x54, 0x43, 0x50, 0x20, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, + 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x74, 0x63, 0x70, 0x2e, 0x73, + 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 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, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x48, + 0x6f, 0x6d, 0x65, 0x70, 0x61, 0x67, 0x65, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x69, 0x6f, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, + 0x49, 0x4f, 0x3c, 0x2f, 0x61, 0x3e, 0xd, 0xa, 0x3c, 0x62, + 0x72, 0x3e, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x72, + 0x3e, 0xd, 0xa, 0x3c, 0x62, 0x3e, 0x4c, 0x45, 0x44, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x4c, 0x43, 0x44, 0x20, 0x49, 0x4f, + 0x3c, 0x2f, 0x62, 0x3e, 0x3c, 0x62, 0x72, 0x3e, 0xd, 0xa, + 0xd, 0xa, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0xd, 0xa, 0x55, + 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x20, 0x62, 0x6f, 0x78, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x6e, 0x20, 0x6f, 0x72, + 0x20, 0x6f, 0x66, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, + 0x45, 0x44, 0x2c, 0x20, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, + 0x74, 0x65, 0x78, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x20, 0x6f, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x4f, 0x4c, 0x45, 0x44, 0x20, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x20, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x20, 0x22, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x49, 0x4f, 0x22, 0x2e, + 0xd, 0xa, 0xd, 0xa, 0xd, 0xa, 0x3c, 0x70, 0x3e, 0xd, + 0xa, 0x3c, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x61, 0x46, 0x6f, 0x72, 0x6d, 0x22, 0x20, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x2f, 0x69, + 0x6f, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x20, 0x6d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3d, 0x22, 0x67, 0x65, 0x74, + 0x22, 0x3e, 0xd, 0xa, 0x25, 0x21, 0x20, 0x6c, 0x65, 0x64, + 0x2d, 0x69, 0x6f, 0xd, 0xa, 0x3c, 0x70, 0x3e, 0xd, 0xa, + 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, + 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, 0x49, 0x4f, 0x22, 0x3e, 0xd, + 0xa, 0x3c, 0x2f, 0x66, 0x6f, 0x72, 0x6d, 0x3e, 0xd, 0xa, + 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0x3c, + 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xd, 0xa, 0x3c, 0x2f, + 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x68, + 0x74, 0x6d, 0x6c, 0x3e, 0xd, 0xa, 0xd, 0xa, 0}; + +static const unsigned char data_stats_shtml[] = { + /* /stats.shtml */ + 0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0, + 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, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, + 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, + 0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, + 0x57, 0x45, 0x42, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x20, 0x64, 0x65, 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x42, + 0x4f, 0x44, 0x59, 0x20, 0x62, 0x67, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3d, 0x22, 0x23, 0x43, 0x43, 0x43, 0x43, 0x66, 0x66, + 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x20, + 0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 0x61, 0x72, 0x69, 0x61, + 0x6c, 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x61, 0x20, 0x68, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, + 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x52, 0x54, 0x4f, + 0x53, 0x20, 0x53, 0x74, 0x61, 0x74, 0x73, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, + 0x6c, 0x22, 0x3e, 0x54, 0x43, 0x50, 0x20, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, + 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x74, 0x63, 0x70, 0x2e, 0x73, + 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 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, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x48, + 0x6f, 0x6d, 0x65, 0x70, 0x61, 0x67, 0x65, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x69, 0x6f, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, + 0x49, 0x4f, 0x3c, 0x2f, 0x61, 0x3e, 0xd, 0xa, 0x3c, 0x62, + 0x72, 0x3e, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x72, + 0x3e, 0xd, 0xa, 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x70, 0x3e, + 0xd, 0xa, 0x3c, 0x68, 0x32, 0x3e, 0x4e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, + 0x74, 0x69, 0x63, 0x73, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0xd, + 0xa, 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3d, 0x22, 0x33, 0x30, 0x30, 0x22, 0x20, + 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3d, 0x22, 0x30, 0x22, + 0x3e, 0xd, 0xa, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x64, + 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x6c, 0x65, + 0x66, 0x74, 0x22, 0x3e, 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x20, + 0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 0x63, 0x6f, 0x75, 0x72, + 0x69, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x65, 0x3e, + 0xd, 0xa, 0x49, 0x50, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x73, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, + 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x73, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, + 0x64, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, + 0x65, 0x74, 0x73, 0x20, 0x73, 0x65, 0x6e, 0x74, 0xd, 0xa, + 0x49, 0x50, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x20, + 0x20, 0x20, 0x20, 0x49, 0x50, 0x20, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xd, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x49, 0x50, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x2c, 0x20, 0x68, 0x69, 0x67, 0x68, 0x20, 0x62, 0x79, + 0x74, 0x65, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x49, 0x50, 0x20, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x20, 0x6c, 0x6f, + 0x77, 0x20, 0x62, 0x79, 0x74, 0x65, 0xd, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x49, 0x50, 0x20, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x73, 0x75, 0x6d, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x57, 0x72, + 0x6f, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0xd, 0xa, 0x49, 0x43, 0x4d, 0x50, 0x9, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x73, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0xd, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x73, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, + 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x73, 0x20, 0x73, 0x65, 0x6e, 0x74, 0xd, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x54, 0x79, 0x70, 0x65, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x73, 0xd, 0xa, 0x54, 0x43, 0x50, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, + 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x64, 0x72, 0x6f, 0x70, + 0x70, 0x65, 0x64, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, + 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x72, 0x65, 0x63, 0x65, + 0x69, 0x76, 0x65, 0x64, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, + 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x73, 0x65, 0x6e, + 0x74, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x73, 0x75, 0x6d, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x73, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x44, 0x61, 0x74, 0x61, + 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x41, 0x43, 0x4b, + 0x73, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x52, 0x65, 0x73, 0x65, + 0x74, 0x73, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x52, 0x65, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0xd, 0xa, 0x9, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x4e, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x76, 0x61, 0x6c, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0xd, 0xa, 0x9, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, + 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, + 0x20, 0x70, 0x6f, 0x72, 0x74, 0x73, 0xd, 0xa, 0x3c, 0x2f, + 0x70, 0x72, 0x65, 0x3e, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, + 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, + 0x3c, 0x70, 0x72, 0x65, 0x3e, 0x25, 0x21, 0x20, 0x6e, 0x65, + 0x74, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x73, 0xd, 0xa, 0x3c, + 0x2f, 0x70, 0x72, 0x65, 0x3e, 0x3c, 0x2f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, + 0x74, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, + 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, + 0xd, 0xa, 0}; + +static const unsigned char data_tcp_shtml[] = { + /* /tcp.shtml */ + 0x2f, 0x74, 0x63, 0x70, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0, + 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, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, + 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, + 0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, + 0x57, 0x45, 0x42, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x20, 0x64, 0x65, 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x42, + 0x4f, 0x44, 0x59, 0x20, 0x62, 0x67, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3d, 0x22, 0x23, 0x43, 0x43, 0x43, 0x43, 0x66, 0x66, + 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x20, + 0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 0x61, 0x72, 0x69, 0x61, + 0x6c, 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x61, 0x20, 0x68, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, + 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x52, 0x54, 0x4f, + 0x53, 0x20, 0x53, 0x74, 0x61, 0x74, 0x73, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, + 0x6c, 0x22, 0x3e, 0x54, 0x43, 0x50, 0x20, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, + 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x74, 0x63, 0x70, 0x2e, 0x73, + 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 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, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x48, + 0x6f, 0x6d, 0x65, 0x70, 0x61, 0x67, 0x65, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x69, 0x6f, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, + 0x49, 0x4f, 0x3c, 0x2f, 0x61, 0x3e, 0xd, 0xa, 0x3c, 0x62, + 0x72, 0x3e, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x72, + 0x3e, 0xd, 0xa, 0x3c, 0x62, 0x72, 0x3e, 0xd, 0xa, 0x3c, + 0x68, 0x32, 0x3e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0xd, 0xa, 0x3c, + 0x70, 0x3e, 0xd, 0xa, 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x3e, 0xd, 0xa, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x68, + 0x3e, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x2f, 0x74, 0x68, + 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x52, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x3c, 0x2f, 0x74, 0x68, 0x3e, + 0x3c, 0x74, 0x68, 0x3e, 0x52, 0x65, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3c, + 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x54, 0x69, + 0x6d, 0x65, 0x72, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, + 0x68, 0x3e, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x3c, 0x2f, 0x74, + 0x68, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0xd, 0xa, 0x25, + 0x21, 0x20, 0x74, 0x63, 0x70, 0x2d, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0xd, 0xa, 0x3c, + 0x2f, 0x70, 0x72, 0x65, 0x3e, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, + 0x74, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, + 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, + 0xd, 0xa, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xd, + 0xa, 0xd, 0xa, 0}; + +const struct httpd_fsdata_file file_404_html[] = {{NULL, data_404_html, data_404_html + 10, sizeof(data_404_html) - 10}}; + +const struct httpd_fsdata_file file_index_html[] = {{file_404_html, data_index_html, data_index_html + 12, sizeof(data_index_html) - 12}}; + +const struct httpd_fsdata_file file_index_shtml[] = {{file_index_html, data_index_shtml, data_index_shtml + 13, sizeof(data_index_shtml) - 13}}; + +const struct httpd_fsdata_file file_io_shtml[] = {{file_index_shtml, data_io_shtml, data_io_shtml + 10, sizeof(data_io_shtml) - 10}}; + +const struct httpd_fsdata_file file_stats_shtml[] = {{file_io_shtml, data_stats_shtml, data_stats_shtml + 13, sizeof(data_stats_shtml) - 13}}; + +const struct httpd_fsdata_file file_tcp_shtml[] = {{file_stats_shtml, data_tcp_shtml, data_tcp_shtml + 11, sizeof(data_tcp_shtml) - 11}}; + +#define HTTPD_FS_ROOT file_tcp_shtml + +#define HTTPD_FS_NUMFILES 6 diff --git a/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fsdata.h b/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fsdata.h new file mode 100644 index 000000000..52d35c265 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/webserver/httpd-fsdata.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2001, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: httpd-fsdata.h,v 1.1 2006/06/07 09:13:08 adam Exp $ + */ +#ifndef __HTTPD_FSDATA_H__ +#define __HTTPD_FSDATA_H__ + +#include "uip.h" + +struct httpd_fsdata_file { + const struct httpd_fsdata_file *next; + const char *name; + const char *data; + const int len; +#ifdef HTTPD_FS_STATISTICS +#if HTTPD_FS_STATISTICS == 1 + u16_t count; +#endif /* HTTPD_FS_STATISTICS */ +#endif /* HTTPD_FS_STATISTICS */ +}; + +struct httpd_fsdata_file_noconst { + struct httpd_fsdata_file *next; + char *name; + char *data; + int len; +#ifdef HTTPD_FS_STATISTICS +#if HTTPD_FS_STATISTICS == 1 + u16_t count; +#endif /* HTTPD_FS_STATISTICS */ +#endif /* HTTPD_FS_STATISTICS */ +}; + +#endif /* __HTTPD_FSDATA_H__ */ diff --git a/Demo/CORTEX_LM3S6965_IAR/webserver/httpd.c b/Demo/CORTEX_LM3S6965_IAR/webserver/httpd.c new file mode 100644 index 000000000..644cf16b7 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/webserver/httpd.c @@ -0,0 +1,346 @@ +/** + * \addtogroup apps + * @{ + */ + +/** + * \defgroup httpd Web server + * @{ + * The uIP web server is a very simplistic implementation of an HTTP + * server. It can serve web pages and files from a read-only ROM + * filesystem, and provides a very small scripting language. + + */ + +/** + * \file + * Web server + * \author + * Adam Dunkels + */ + + +/* + * Copyright (c) 2004, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: httpd.c,v 1.2 2006/06/11 21:46:38 adam Exp $ + */ + +#include "uip.h" +#include "httpd.h" +#include "httpd-fs.h" +#include "httpd-cgi.h" +#include "http-strings.h" + +#include + +#define STATE_WAITING 0 +#define STATE_OUTPUT 1 + +#define ISO_nl 0x0a +#define ISO_space 0x20 +#define ISO_bang 0x21 +#define ISO_percent 0x25 +#define ISO_period 0x2e +#define ISO_slash 0x2f +#define ISO_colon 0x3a + + +/*---------------------------------------------------------------------------*/ +static unsigned short +generate_part_of_file(void *state) +{ + struct httpd_state *s = (struct httpd_state *)state; + + if(s->file.len > uip_mss()) { + s->len = uip_mss(); + } else { + s->len = s->file.len; + } + memcpy(uip_appdata, s->file.data, s->len); + + return s->len; +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(send_file(struct httpd_state *s)) +{ + PSOCK_BEGIN(&s->sout); + + do { + PSOCK_GENERATOR_SEND(&s->sout, generate_part_of_file, s); + s->file.len -= s->len; + s->file.data += s->len; + } while(s->file.len > 0); + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(send_part_of_file(struct httpd_state *s)) +{ + PSOCK_BEGIN(&s->sout); + + PSOCK_SEND(&s->sout, s->file.data, s->len); + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static void +next_scriptstate(struct httpd_state *s) +{ + char *p; + p = strchr(s->scriptptr, ISO_nl) + 1; + s->scriptlen -= (unsigned short)(p - s->scriptptr); + s->scriptptr = p; +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(handle_script(struct httpd_state *s)) +{ + char *ptr; + + PT_BEGIN(&s->scriptpt); + + + while(s->file.len > 0) { + + /* Check if we should start executing a script. */ + if(*s->file.data == ISO_percent && + *(s->file.data + 1) == ISO_bang) { + s->scriptptr = s->file.data + 3; + s->scriptlen = s->file.len - 3; + if(*(s->scriptptr - 1) == ISO_colon) { + httpd_fs_open(s->scriptptr + 1, &s->file); + PT_WAIT_THREAD(&s->scriptpt, send_file(s)); + } else { + PT_WAIT_THREAD(&s->scriptpt, + httpd_cgi(s->scriptptr)(s, s->scriptptr)); + } + next_scriptstate(s); + + /* The script is over, so we reset the pointers and continue + sending the rest of the file. */ + s->file.data = s->scriptptr; + s->file.len = s->scriptlen; + } else { + /* See if we find the start of script marker in the block of HTML + to be sent. */ + + if(s->file.len > uip_mss()) { + s->len = uip_mss(); + } else { + s->len = s->file.len; + } + + if(*s->file.data == ISO_percent) { + ptr = strchr(s->file.data + 1, ISO_percent); + } else { + ptr = strchr(s->file.data, ISO_percent); + } + if(ptr != NULL && + ptr != s->file.data) { + s->len = (int)(ptr - s->file.data); + if(s->len >= uip_mss()) { + s->len = uip_mss(); + } + } + PT_WAIT_THREAD(&s->scriptpt, send_part_of_file(s)); + s->file.data += s->len; + s->file.len -= s->len; + + } + } + + PT_END(&s->scriptpt); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(send_headers(struct httpd_state *s, const char *statushdr)) +{ + char *ptr; + + PSOCK_BEGIN(&s->sout); + + PSOCK_SEND_STR(&s->sout, statushdr); + + ptr = strrchr(s->filename, ISO_period); + if(ptr == NULL) { + PSOCK_SEND_STR(&s->sout, http_content_type_binary); + } else if(strncmp(http_html, ptr, 5) == 0 || + strncmp(http_shtml, ptr, 6) == 0) { + PSOCK_SEND_STR(&s->sout, http_content_type_html); + } else if(strncmp(http_css, ptr, 4) == 0) { + PSOCK_SEND_STR(&s->sout, http_content_type_css); + } else if(strncmp(http_png, ptr, 4) == 0) { + PSOCK_SEND_STR(&s->sout, http_content_type_png); + } else if(strncmp(http_gif, ptr, 4) == 0) { + PSOCK_SEND_STR(&s->sout, http_content_type_gif); + } else if(strncmp(http_jpg, ptr, 4) == 0) { + PSOCK_SEND_STR(&s->sout, http_content_type_jpg); + } else { + PSOCK_SEND_STR(&s->sout, http_content_type_plain); + } + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(handle_output(struct httpd_state *s)) +{ + char *ptr; + + PT_BEGIN(&s->outputpt); + + if(!httpd_fs_open(s->filename, &s->file)) { + httpd_fs_open(http_404_html, &s->file); + strcpy(s->filename, http_404_html); + PT_WAIT_THREAD(&s->outputpt, + send_headers(s, + http_header_404)); + PT_WAIT_THREAD(&s->outputpt, + send_file(s)); + } else { + PT_WAIT_THREAD(&s->outputpt, + send_headers(s, + http_header_200)); + ptr = strchr(s->filename, ISO_period); + if(ptr != NULL && strncmp(ptr, http_shtml, 6) == 0) { + PT_INIT(&s->scriptpt); + PT_WAIT_THREAD(&s->outputpt, handle_script(s)); + } else { + PT_WAIT_THREAD(&s->outputpt, + send_file(s)); + } + } + PSOCK_CLOSE(&s->sout); + PT_END(&s->outputpt); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(handle_input(struct httpd_state *s)) +{ + PSOCK_BEGIN(&s->sin); + + PSOCK_READTO(&s->sin, ISO_space); + + + if(strncmp(s->inputbuf, http_get, 4) != 0) { + PSOCK_CLOSE_EXIT(&s->sin); + } + PSOCK_READTO(&s->sin, ISO_space); + + if(s->inputbuf[0] != ISO_slash) { + PSOCK_CLOSE_EXIT(&s->sin); + } + + if(s->inputbuf[1] == ISO_space) { + strncpy(s->filename, http_index_html, sizeof(s->filename)); + } else { + + s->inputbuf[PSOCK_DATALEN(&s->sin) - 1] = 0; + + /* Process any form input being sent to the server. */ + { + extern void vApplicationProcessFormInput( char *pcInputString, long xInputLength ); + vApplicationProcessFormInput( s->inputbuf, PSOCK_DATALEN(&s->sin) ); + } + + strncpy(s->filename, &s->inputbuf[0], sizeof(s->filename)); + } + + /* httpd_log_file(uip_conn->ripaddr, s->filename);*/ + + s->state = STATE_OUTPUT; + + while(1) { + PSOCK_READTO(&s->sin, ISO_nl); + + if(strncmp(s->inputbuf, http_referer, 8) == 0) { + s->inputbuf[PSOCK_DATALEN(&s->sin) - 2] = 0; + /* httpd_log(&s->inputbuf[9]);*/ + } + } + + PSOCK_END(&s->sin); +} +/*---------------------------------------------------------------------------*/ +static void +handle_connection(struct httpd_state *s) +{ + handle_input(s); + if(s->state == STATE_OUTPUT) { + handle_output(s); + } +} +/*---------------------------------------------------------------------------*/ +void +httpd_appcall(void) +{ + struct httpd_state *s = (struct httpd_state *)&(uip_conn->appstate); + + if(uip_closed() || uip_aborted() || uip_timedout()) { + } else if(uip_connected()) { + PSOCK_INIT(&s->sin, s->inputbuf, sizeof(s->inputbuf) - 1); + PSOCK_INIT(&s->sout, s->inputbuf, sizeof(s->inputbuf) - 1); + PT_INIT(&s->outputpt); + s->state = STATE_WAITING; + /* timer_set(&s->timer, CLOCK_SECOND * 100);*/ + s->timer = 0; + handle_connection(s); + } else if(s != NULL) { + if(uip_poll()) { + ++s->timer; + if(s->timer >= 20) { + uip_abort(); + } + } else { + s->timer = 0; + } + handle_connection(s); + } else { + uip_abort(); + } +} +/*---------------------------------------------------------------------------*/ +/** + * \brief Initialize the web server + * + * This function initializes the web server and should be + * called at system boot-up. + */ +void +httpd_init(void) +{ + uip_listen(HTONS(80)); +} +/*---------------------------------------------------------------------------*/ +/** @} */ diff --git a/Demo/CORTEX_LM3S6965_IAR/webserver/httpd.h b/Demo/CORTEX_LM3S6965_IAR/webserver/httpd.h new file mode 100644 index 000000000..7f7a6666e --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/webserver/httpd.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2001-2005, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: httpd.h,v 1.2 2006/06/11 21:46:38 adam Exp $ + * + */ + +#ifndef __HTTPD_H__ +#define __HTTPD_H__ + +#include "psock.h" +#include "httpd-fs.h" + +struct httpd_state { + unsigned char timer; + struct psock sin, sout; + struct pt outputpt, scriptpt; + char inputbuf[50]; + char filename[20]; + char state; + struct httpd_fs_file file; + int len; + char *scriptptr; + int scriptlen; + + unsigned short count; +}; + +void httpd_init(void); +void httpd_appcall(void); + +void httpd_log(char *msg); +void httpd_log_file(u16_t *requester, char *file); + +#endif /* __HTTPD_H__ */ diff --git a/Demo/CORTEX_LM3S6965_IAR/webserver/makefsdata b/Demo/CORTEX_LM3S6965_IAR/webserver/makefsdata new file mode 100644 index 000000000..8d2715a8a --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/webserver/makefsdata @@ -0,0 +1,78 @@ +#!/usr/bin/perl + +open(OUTPUT, "> httpd-fsdata.c"); + +chdir("httpd-fs"); + +opendir(DIR, "."); +@files = grep { !/^\./ && !/(CVS|~)/ } readdir(DIR); +closedir(DIR); + +foreach $file (@files) { + + if(-d $file && $file !~ /^\./) { + print "Processing directory $file\n"; + opendir(DIR, $file); + @newfiles = grep { !/^\./ && !/(CVS|~)/ } readdir(DIR); + closedir(DIR); + printf "Adding files @newfiles\n"; + @files = (@files, map { $_ = "$file/$_" } @newfiles); + next; + } +} + +foreach $file (@files) { + if(-f $file) { + + print "Adding file $file\n"; + + open(FILE, $file) || die "Could not open file $file\n"; + + $file =~ s-^-/-; + $fvar = $file; + $fvar =~ s-/-_-g; + $fvar =~ s-\.-_-g; + # for AVR, add PROGMEM here + print(OUTPUT "static const unsigned char data".$fvar."[] = {\n"); + print(OUTPUT "\t/* $file */\n\t"); + for($j = 0; $j < length($file); $j++) { + printf(OUTPUT "%#02x, ", unpack("C", substr($file, $j, 1))); + } + printf(OUTPUT "0,\n"); + + + $i = 0; + while(read(FILE, $data, 1)) { + if($i == 0) { + print(OUTPUT "\t"); + } + printf(OUTPUT "%#02x, ", unpack("C", $data)); + $i++; + if($i == 10) { + print(OUTPUT "\n"); + $i = 0; + } + } + print(OUTPUT "0};\n\n"); + close(FILE); + push(@fvars, $fvar); + push(@pfiles, $file); + } +} + +for($i = 0; $i < @fvars; $i++) { + $file = $pfiles[$i]; + $fvar = $fvars[$i]; + + if($i == 0) { + $prevfile = "NULL"; + } else { + $prevfile = "file" . $fvars[$i - 1]; + } + print(OUTPUT "const struct httpd_fsdata_file file".$fvar."[] = {{$prevfile, data$fvar, "); + print(OUTPUT "data$fvar + ". (length($file) + 1) .", "); + print(OUTPUT "sizeof(data$fvar) - ". (length($file) + 1) ."}};\n\n"); +} + +print(OUTPUT "#define HTTPD_FS_ROOT file$fvars[$i - 1]\n\n"); +print(OUTPUT "#define HTTPD_FS_NUMFILES $i\n"); diff --git a/Demo/CORTEX_LM3S6965_IAR/webserver/makestrings b/Demo/CORTEX_LM3S6965_IAR/webserver/makestrings new file mode 100644 index 000000000..8a13c6d29 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/webserver/makestrings @@ -0,0 +1,40 @@ +#!/usr/bin/perl + + +sub stringify { + my $name = shift(@_); + open(OUTPUTC, "> $name.c"); + open(OUTPUTH, "> $name.h"); + + open(FILE, "$name"); + + while() { + if(/(.+) "(.+)"/) { + $var = $1; + $data = $2; + + $datan = $data; + $datan =~ s/\\r/\r/g; + $datan =~ s/\\n/\n/g; + $datan =~ s/\\01/\01/g; + $datan =~ s/\\0/\0/g; + + printf(OUTPUTC "const char $var\[%d] = \n", length($datan) + 1); + printf(OUTPUTC "/* \"$data\" */\n"); + printf(OUTPUTC "{"); + for($j = 0; $j < length($datan); $j++) { + printf(OUTPUTC "%#02x, ", unpack("C", substr($datan, $j, 1))); + } + printf(OUTPUTC "};\n"); + + printf(OUTPUTH "extern const char $var\[%d];\n", length($datan) + 1); + + } + } + close(OUTPUTC); + close(OUTPUTH); +} +stringify("http-strings"); + +exit 0; + diff --git a/Demo/CORTEX_LM3S6965_IAR/webserver/uIP_Task.c b/Demo/CORTEX_LM3S6965_IAR/webserver/uIP_Task.c new file mode 100644 index 000000000..92702105e --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/webserver/uIP_Task.c @@ -0,0 +1,300 @@ +/* + FreeRTOS.org V4.3.0 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + *************************************************************************** +*/ +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "semphr.h" + +#include "lcd_message.h" + +/* uip includes. */ +#include "hw_types.h" + +#include "uip.h" +#include "uip_arp.h" +#include "httpd.h" +#include "timer.h" +#include "clock-arch.h" +#include "hw_ethernet.h" +#include "ethernet.h" +#include "hw_memmap.h" +#include "lmi_flash.h" + +/* Demo includes. */ +#include "emac.h" +#include "partest.h" + +/*-----------------------------------------------------------*/ + +/* IP address configuration. */ +#define uipIP_ADDR0 172 +#define uipIP_ADDR1 25 +#define uipIP_ADDR2 218 +#define uipIP_ADDR3 9 + +/* How long to wait before attempting to connect the MAC again. */ +#define uipINIT_WAIT 100 + +/* Shortcut to the header within the Rx buffer. */ +#define xHeader ((struct uip_eth_hdr *) &uip_buf[ 0 ]) + +/* Standard constant. */ +#define uipTOTAL_FRAME_HEADER_SIZE 54 + +/*-----------------------------------------------------------*/ + +/* + * Send the uIP buffer to the MAC. + */ +static void prvENET_Send(void); + +/* + * Setup the MAC address in the MAC itself, and in the uIP stack. + */ +static void prvSetMACAddress( void ); + +/* + * Port functions required by the uIP stack. + */ +void clock_init( void ); +clock_time_t clock_time( void ); + +/*-----------------------------------------------------------*/ + +/* The semaphore used by the ISR to wake the uIP task. */ +extern xSemaphoreHandle xEMACSemaphore; + +/*-----------------------------------------------------------*/ + +void clock_init(void) +{ + /* This is done when the scheduler starts. */ +} +/*-----------------------------------------------------------*/ + +clock_time_t clock_time( void ) +{ + return xTaskGetTickCount(); +} +/*-----------------------------------------------------------*/ + +void vuIP_Task( void *pvParameters ) +{ +portBASE_TYPE i; +uip_ipaddr_t xIPAddr; +struct timer periodic_timer, arp_timer; +extern void ( vEMAC_ISR )( void ); + + /* Create the semaphore used by the ISR to wake this task. */ + vSemaphoreCreateBinary( xEMACSemaphore ); + + /* Initialise the uIP stack. */ + timer_set( &periodic_timer, configTICK_RATE_HZ / 2 ); + timer_set( &arp_timer, configTICK_RATE_HZ * 10 ); + uip_init(); + uip_ipaddr( xIPAddr, uipIP_ADDR0, uipIP_ADDR1, uipIP_ADDR2, uipIP_ADDR3 ); + uip_sethostaddr( xIPAddr ); + httpd_init(); + + while( vInitEMAC() != pdPASS ) + { + vTaskDelay( uipINIT_WAIT ); + } + prvSetMACAddress(); + + + for( ;; ) + { + /* Is there received data ready to be processed? */ + uip_len = uiGetEMACRxData( uip_buf ); + + if( uip_len > 0 ) + { + /* Standard uIP loop taken from the uIP manual. */ + + if( xHeader->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(); + prvENET_Send(); + } + } + else if( xHeader->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 ) + { + prvENET_Send(); + } + } + } + else + { + if( timer_expired( &periodic_timer ) ) + { + timer_reset( &periodic_timer ); + for( i = 0; i < UIP_CONNS; i++ ) + { + uip_periodic( i ); + + /* 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(); + prvENET_Send(); + } + } + + /* Call the ARP timer function every 10 seconds. */ + if( timer_expired( &arp_timer ) ) + { + timer_reset( &arp_timer ); + uip_arp_timer(); + } + } + else + { + /* We did not receive a packet, and there was no periodic + processing to perform. Block for a fixed period. If a packet + is received during this period we will be woken by the ISR + giving us the Semaphore. */ + xSemaphoreTake( xEMACSemaphore, configTICK_RATE_HZ / 2 ); + } + } + } +} +/*-----------------------------------------------------------*/ + +static void prvENET_Send(void) +{ + vInitialiseSend(); + vIncrementTxLength( uip_len ); + vSendBufferToMAC(); +} +/*-----------------------------------------------------------*/ + +static void prvSetMACAddress( void ) +{ +unsigned portLONG ulUser0, ulUser1; +unsigned char pucMACArray[8]; +struct uip_eth_addr xAddr; + + /* Get the device MAC address from flash */ + FlashUserGet(&ulUser0, &ulUser1); + + /* Convert the MAC address from flash into sequence of bytes. */ + pucMACArray[0] = ((ulUser0 >> 0) & 0xff); + pucMACArray[1] = ((ulUser0 >> 8) & 0xff); + pucMACArray[2] = ((ulUser0 >> 16) & 0xff); + pucMACArray[3] = ((ulUser1 >> 0) & 0xff); + pucMACArray[4] = ((ulUser1 >> 8) & 0xff); + pucMACArray[5] = ((ulUser1 >> 16) & 0xff); + + /* Program the MAC address. */ + EthernetMACAddrSet(ETH_BASE, pucMACArray); + + xAddr.addr[ 0 ] = pucMACArray[0]; + xAddr.addr[ 1 ] = pucMACArray[1]; + xAddr.addr[ 2 ] = pucMACArray[2]; + xAddr.addr[ 3 ] = pucMACArray[3]; + xAddr.addr[ 4 ] = pucMACArray[4]; + xAddr.addr[ 5 ] = pucMACArray[5]; + uip_setethaddr( xAddr ); +} +/*-----------------------------------------------------------*/ + +void vApplicationProcessFormInput( portCHAR *pcInputString, portBASE_TYPE xInputLength ) +{ +char *c, *pcText; +static portCHAR cMessageForDisplay[ 32 ]; +extern xQueueHandle xOLEDQueue; +xOLEDMessage xOLEDMessage; + + /* Process the form input sent by the IO page of the served HTML. */ + + c = strstr( pcInputString, "?" ); + + if( c ) + { + /* Turn LED's on or off in accordance with the check box status. */ + if( strstr( c, "LED0=1" ) != NULL ) + { + vParTestSetLED( 0, 1 ); + } + else + { + vParTestSetLED( 0, 0 ); + } + + /* Find the start of the text to be displayed on the LCD. */ + pcText = strstr( c, "LCD=" ); + pcText += strlen( "LCD=" ); + + /* Terminate the file name for further processing within uIP. */ + *c = 0x00; + + /* Terminate the LCD string. */ + c = strstr( pcText, " " ); + if( c != NULL ) + { + *c = 0x00; + } + + /* Add required spaces. */ + while( ( c = strstr( pcText, "+" ) ) != NULL ) + { + *c = ' '; + } + + /* Write the message to the LCD. */ + strcpy( cMessageForDisplay, pcText ); + xOLEDMessage.pcMessage = cMessageForDisplay; + xQueueSend( xOLEDQueue, &xOLEDMessage, portMAX_DELAY ); + } +} + diff --git a/Demo/CORTEX_LM3S6965_IAR/webserver/uip-conf.h b/Demo/CORTEX_LM3S6965_IAR/webserver/uip-conf.h new file mode 100644 index 000000000..455540da1 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/webserver/uip-conf.h @@ -0,0 +1,159 @@ +/** + * \addtogroup uipopt + * @{ + */ + +/** + * \name Project-specific configuration options + * @{ + * + * uIP has a number of configuration options that can be overridden + * for each project. These are kept in a project-specific uip-conf.h + * file and all configuration names have the prefix UIP_CONF. + */ + +/* + * Copyright (c) 2006, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: uip-conf.h,v 1.6 2006/06/12 08:00:31 adam Exp $ + */ + +/** + * \file + * An example uIP configuration file + * \author + * Adam Dunkels + */ + +#ifndef __UIP_CONF_H__ +#define __UIP_CONF_H__ + +#include + +/** + * 8 bit datatype + * + * This typedef defines the 8-bit type used throughout uIP. + * + * \hideinitializer + */ +typedef uint8_t u8_t; + +/** + * 16 bit datatype + * + * This typedef defines the 16-bit type used throughout uIP. + * + * \hideinitializer + */ +typedef uint16_t u16_t; + +/** + * Statistics datatype + * + * This typedef defines the dataype used for keeping statistics in + * uIP. + * + * \hideinitializer + */ +typedef unsigned short uip_stats_t; + +/** + * Maximum number of TCP connections. + * + * \hideinitializer + */ +#define UIP_CONF_MAX_CONNECTIONS 40 + +/** + * Maximum number of listening TCP ports. + * + * \hideinitializer + */ +#define UIP_CONF_MAX_LISTENPORTS 40 + +/** + * uIP buffer size. + * + * \hideinitializer + */ +#define UIP_CONF_BUFFER_SIZE 1480 + +/** + * CPU byte order. + * + * \hideinitializer + */ +#define UIP_CONF_BYTE_ORDER LITTLE_ENDIAN + +/** + * Logging on or off + * + * \hideinitializer + */ +#define UIP_CONF_LOGGING 0 + +/** + * UDP support on or off + * + * \hideinitializer + */ +#define UIP_CONF_UDP 0 + +/** + * UDP checksums on or off + * + * \hideinitializer + */ +#define UIP_CONF_UDP_CHECKSUMS 1 + +/** + * uIP statistics on or off + * + * \hideinitializer + */ +#define UIP_CONF_STATISTICS 1 + +/* Here we include the header file for the application(s) we use in + our project. */ +/*#include "smtp.h"*/ +/*#include "hello-world.h"*/ +/*#include "telnetd.h"*/ +#include "webserver.h" +/*#include "dhcpc.h"*/ +/*#include "resolv.h"*/ +/*#include "webclient.h"*/ + +#define UIP_CONF_EXTERNAL_BUFFER + +#endif /* __UIP_CONF_H__ */ + +/** @} */ +/** @} */ diff --git a/Demo/CORTEX_LM3S6965_IAR/webserver/webserver.h b/Demo/CORTEX_LM3S6965_IAR/webserver/webserver.h new file mode 100644 index 000000000..1acb290b8 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_IAR/webserver/webserver.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: webserver.h,v 1.2 2006/06/11 21:46:38 adam Exp $ + * + */ +#ifndef __WEBSERVER_H__ +#define __WEBSERVER_H__ + +#include "httpd.h" + +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 + + +#endif /* __WEBSERVER_H__ */ diff --git a/Demo/CORTEX_LM3S6965_KEIL/FreeRTOSConfig.h b/Demo/CORTEX_LM3S6965_KEIL/FreeRTOSConfig.h new file mode 100644 index 000000000..e41bcd6a6 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/FreeRTOSConfig.h @@ -0,0 +1,80 @@ +/* + FreeRTOS.org V4.3.0 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + + Also see http://www.SafeRTOS.com for an IEC 61508 compliant version along + with commercial development and support options. + *************************************************************************** +*/ + +#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. + *----------------------------------------------------------*/ + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 0 +#define configUSE_TICK_HOOK 0 +#define configCPU_CLOCK_HZ ( ( unsigned portLONG ) 50000000 ) +#define configTICK_RATE_HZ ( ( portTickType ) 1000 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned portSHORT ) 70 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 12000 ) ) +#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 configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 ) +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +/* 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 0 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 + + +#define configKERNEL_INTERRUPT_PRIORITY 255 + + +#endif /* FREERTOS_CONFIG_H */ diff --git a/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/DriverLib.lib b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/DriverLib.lib new file mode 100644 index 0000000000000000000000000000000000000000..1d1d80ec76a140e2e07dc7023bc7d4ae319e458a GIT binary patch literal 1019382 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 }qTeH#9~v#5l# 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\r\n", + htons(conn->lport), + htons(conn->ripaddr[0]) >> 8, + htons(conn->ripaddr[0]) & 0xff, + htons(conn->ripaddr[1]) >> 8, + htons(conn->ripaddr[1]) & 0xff, + htons(conn->rport), + states[conn->tcpstateflags & UIP_TS_MASK], + conn->nrtx, + conn->timer, + (uip_outstanding(conn))? '*':' ', + (uip_stopped(conn))? '!':' '); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(tcp_stats(struct httpd_state *s, char *ptr)) +{ + + PSOCK_BEGIN(&s->sout); + + for(s->count = 0; s->count < UIP_CONNS; ++s->count) { + if((uip_conns[s->count].tcpstateflags & UIP_TS_MASK) != UIP_CLOSED) { + PSOCK_GENERATOR_SEND(&s->sout, generate_tcp_stats, s); + } + } + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static unsigned short +generate_net_stats(void *arg) +{ + struct httpd_state *s = (struct httpd_state *)arg; + return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE, + "%5u\n", ((uip_stats_t *)&uip_stat)[s->count]); +} + +static +PT_THREAD(net_stats(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + +#if UIP_STATISTICS + + for(s->count = 0; s->count < sizeof(uip_stat) / sizeof(uip_stats_t); + ++s->count) { + PSOCK_GENERATOR_SEND(&s->sout, generate_net_stats, s); + } + +#endif /* UIP_STATISTICS */ + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ + +extern void vTaskList( signed char *pcWriteBuffer ); +static char cCountBuf[ 32 ]; +long lRefreshCount = 0; +static unsigned short +generate_rtos_stats(void *arg) +{ + lRefreshCount++; + sprintf( cCountBuf, "


Refresh count = %d", lRefreshCount ); + vTaskList( uip_appdata ); + strcat( uip_appdata, cCountBuf ); + + return strlen( uip_appdata ); +} +/*---------------------------------------------------------------------------*/ + + +static +PT_THREAD(rtos_stats(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + PSOCK_GENERATOR_SEND(&s->sout, generate_rtos_stats, NULL); + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ + +char *pcStatus; +extern unsigned long uxParTestGetLED( unsigned long uxLED ); + +static unsigned short generate_io_state( void *arg ) +{ + if( uxParTestGetLED( 0 ) ) + { + pcStatus = "checked"; + } + else + { + pcStatus = ""; + } + + sprintf( uip_appdata, + "LED"\ + "

"\ + "", + pcStatus ); + + return strlen( uip_appdata ); +} +/*---------------------------------------------------------------------------*/ + +static PT_THREAD(led_io(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + PSOCK_GENERATOR_SEND(&s->sout, generate_io_state, NULL); + PSOCK_END(&s->sout); +} + +/** @} */ + + + + + + diff --git a/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-cgi.h b/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-cgi.h new file mode 100644 index 000000000..7ae928321 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-cgi.h @@ -0,0 +1,84 @@ +/** + * \addtogroup httpd + * @{ + */ + +/** + * \file + * Web server script interface header file + * \author + * Adam Dunkels + * + */ + + + +/* + * Copyright (c) 2001, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: httpd-cgi.h,v 1.2 2006/06/11 21:46:38 adam Exp $ + * + */ + +#ifndef __HTTPD_CGI_H__ +#define __HTTPD_CGI_H__ + +#include "psock.h" +#include "httpd.h" + +typedef PT_THREAD((* httpd_cgifunction)(struct httpd_state *, char *)); + +httpd_cgifunction httpd_cgi(char *name); + +struct httpd_cgi_call { + const char *name; + const httpd_cgifunction function; +}; + +/** + * \brief HTTPD CGI function declaration + * \param name The C variable name of the function + * \param str The string name of the function, used in the script file + * \param function A pointer to the function that implements it + * + * This macro is used for declaring a HTTPD CGI + * function. This function is then added to the list of + * HTTPD CGI functions with the httpd_cgi_add() function. + * + * \hideinitializer + */ +#define HTTPD_CGI_CALL(name, str, function) \ +static PT_THREAD(function(struct httpd_state *, char *)); \ +static const struct httpd_cgi_call name = {str, function} + +void httpd_cgi_init(void); +#endif /* __HTTPD_CGI_H__ */ + +/** @} */ diff --git a/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fs.c b/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fs.c new file mode 100644 index 000000000..dc4aef011 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fs.c @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2001, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: httpd-fs.c,v 1.1 2006/06/07 09:13:08 adam Exp $ + */ + +#include "httpd.h" +#include "httpd-fs.h" +#include "httpd-fsdata.h" + +#ifndef NULL +#define NULL 0 +#endif /* NULL */ + +#include "httpd-fsdata.c" + +#if HTTPD_FS_STATISTICS +static u16_t count[HTTPD_FS_NUMFILES]; +#endif /* HTTPD_FS_STATISTICS */ + +/*-----------------------------------------------------------------------------------*/ +static u8_t +httpd_fs_strcmp(const char *str1, const char *str2) +{ + u8_t i; + i = 0; + loop: + + if(str2[i] == 0 || + str1[i] == '\r' || + str1[i] == '\n') { + return 0; + } + + if(str1[i] != str2[i]) { + return 1; + } + + + ++i; + goto loop; +} +/*-----------------------------------------------------------------------------------*/ +int +httpd_fs_open(const char *name, struct httpd_fs_file *file) +{ +#if HTTPD_FS_STATISTICS + u16_t i = 0; +#endif /* HTTPD_FS_STATISTICS */ + struct httpd_fsdata_file_noconst *f; + + for(f = (struct httpd_fsdata_file_noconst *)HTTPD_FS_ROOT; + f != NULL; + f = (struct httpd_fsdata_file_noconst *)f->next) { + + if(httpd_fs_strcmp(name, f->name) == 0) { + file->data = f->data; + file->len = f->len; +#if HTTPD_FS_STATISTICS + ++count[i]; +#endif /* HTTPD_FS_STATISTICS */ + return 1; + } +#if HTTPD_FS_STATISTICS + ++i; +#endif /* HTTPD_FS_STATISTICS */ + + } + return 0; +} +/*-----------------------------------------------------------------------------------*/ +void +httpd_fs_init(void) +{ +#if HTTPD_FS_STATISTICS + u16_t i; + for(i = 0; i < HTTPD_FS_NUMFILES; i++) { + count[i] = 0; + } +#endif /* HTTPD_FS_STATISTICS */ +} +/*-----------------------------------------------------------------------------------*/ +#if HTTPD_FS_STATISTICS +u16_t httpd_fs_count +(char *name) +{ + struct httpd_fsdata_file_noconst *f; + u16_t i; + + i = 0; + for(f = (struct httpd_fsdata_file_noconst *)HTTPD_FS_ROOT; + f != NULL; + f = (struct httpd_fsdata_file_noconst *)f->next) { + + if(httpd_fs_strcmp(name, f->name) == 0) { + return count[i]; + } + ++i; + } + return 0; +} +#endif /* HTTPD_FS_STATISTICS */ +/*-----------------------------------------------------------------------------------*/ diff --git a/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fs.h b/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fs.h new file mode 100644 index 000000000..b594eea56 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fs.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2001, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: httpd-fs.h,v 1.1 2006/06/07 09:13:08 adam Exp $ + */ +#ifndef __HTTPD_FS_H__ +#define __HTTPD_FS_H__ + +#define HTTPD_FS_STATISTICS 1 + +struct httpd_fs_file { + char *data; + int len; +}; + +/* file must be allocated by caller and will be filled in + by the function. */ +int httpd_fs_open(const char *name, struct httpd_fs_file *file); + +#ifdef HTTPD_FS_STATISTICS +#if HTTPD_FS_STATISTICS == 1 +u16_t httpd_fs_count(char *name); +#endif /* HTTPD_FS_STATISTICS */ +#endif /* HTTPD_FS_STATISTICS */ + +void httpd_fs_init(void); + +#endif /* __HTTPD_FS_H__ */ diff --git a/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fs/404.html b/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fs/404.html new file mode 100644 index 000000000..43e7f4cad --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fs/404.html @@ -0,0 +1,8 @@ + + +

+

404 - file not found

+

Go here instead.

+
+ + \ No newline at end of file diff --git a/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fs/index.html b/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fs/index.html new file mode 100644 index 000000000..1d3bbeee1 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fs/index.html @@ -0,0 +1,13 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +Loading index.shtml. Click here if not automatically redirected. + + + + + diff --git a/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fs/index.shtml b/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fs/index.shtml new file mode 100644 index 000000000..1923ea762 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fs/index.shtml @@ -0,0 +1,20 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +RTOS Stats | TCP Stats | Connections | FreeRTOS.org Homepage | IO +

+


+

+

Task statistics

+Page will refresh every 2 seconds.

+

Task          State  Priority  Stack	#
************************************************
+%! rtos-stats +
+
+ + + diff --git a/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fs/io.shtml b/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fs/io.shtml new file mode 100644 index 000000000..07554bb71 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fs/io.shtml @@ -0,0 +1,28 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +RTOS Stats | TCP Stats | Connections | FreeRTOS.org Homepage | IO +

+


+LED and LCD IO
+ +

+ +Use the check box to turn on or off the LED, enter text to display on the OLED display, then click "Update IO". + + +

+
+%! led-io +

+ + +

+ + + + diff --git a/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fs/stats.shtml b/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fs/stats.shtml new file mode 100644 index 000000000..d762f40d8 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fs/stats.shtml @@ -0,0 +1,41 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +RTOS Stats | TCP Stats | Connections | FreeRTOS.org Homepage | IO +

+


+

+

Network statistics

+
LocalRemoteStateRetransmissionsTimerFlags
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

ror8@kk? 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 So5Wibyj|!dT&> 24) & 0x000000ff) | \ + (((a) >> 8) & 0x0000ff00) | \ + (((a) << 8) & 0x00ff0000) | \ + (((a) << 24) & 0xff000000)) +#endif + +#ifndef ntohl + #define ntohl(a) htonl((a)) +#endif + +//***************************************************************************** +// +// htons/ntohs - big endian/little endian byte swapping macros for +// 16-bit (short) values +// +//***************************************************************************** +#ifndef htons + #define htons(a) \ + ((((a) >> 8) & 0x00ff) | \ + (((a) << 8) & 0xff00)) +#endif + +#ifndef ntohs + #define ntohs(a) htons((a)) +#endif + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void EthernetInit(unsigned long ulBase); +extern void EthernetConfigSet(unsigned long ulBase, unsigned long ulConfig); +extern unsigned long EthernetConfigGet(unsigned long ulBase); +extern void EthernetMACAddrSet(unsigned long ulBase, + unsigned char *pucMACAddr); +extern void EthernetMACAddrGet(unsigned long ulBase, + unsigned char *pucMACAddr); +extern void EthernetEnable(unsigned long ulBase); +extern void EthernetDisable(unsigned long ulBase); +extern tBoolean EthernetPacketAvail(unsigned long ulBase); +extern tBoolean EthernetSpaceAvail(unsigned long ulBase); +extern long EthernetPacketNonBlockingGet(unsigned long ulBase, + unsigned char *pucBuf, + long lBufLen); +extern long EthernetPacketGet(unsigned long ulBase, unsigned char *pucBuf, + long lBufLen); +extern long EthernetPacketNonBlockingPut(unsigned long ulBase, + unsigned char *pucBuf, + long lBufLen); +extern long EthernetPacketPut(unsigned long ulBase, unsigned char *pucBuf, + long lBufLen); +extern void EthernetIntRegister(unsigned long ulBase, + void (*pfnHandler)(void)); +extern void EthernetIntUnregister(unsigned long ulBase); +extern void EthernetIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void EthernetIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long EthernetIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void EthernetIntClear(unsigned long ulBase, unsigned long ulIntFlags); +extern void EthernetPHYWrite(unsigned long ulBase, unsigned char ucRegAddr, + unsigned long ulData); +extern unsigned long EthernetPHYRead(unsigned long ulBase, + unsigned char ucRegAddr); + +#ifdef __cplusplus +} +#endif + +#endif // __ETHERNET_H__ diff --git a/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/gpio.h b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/gpio.h new file mode 100644 index 000000000..6e74f9d4f --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/gpio.h @@ -0,0 +1,138 @@ +//***************************************************************************** +// +// gpio.h - Defines and Macros for GPIO API. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __GPIO_H__ +#define __GPIO_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following values define the bit field for the ucPins argument to several +// of the APIs. +// +//***************************************************************************** +#define GPIO_PIN_0 0x00000001 // GPIO pin 0 +#define GPIO_PIN_1 0x00000002 // GPIO pin 1 +#define GPIO_PIN_2 0x00000004 // GPIO pin 2 +#define GPIO_PIN_3 0x00000008 // GPIO pin 3 +#define GPIO_PIN_4 0x00000010 // GPIO pin 4 +#define GPIO_PIN_5 0x00000020 // GPIO pin 5 +#define GPIO_PIN_6 0x00000040 // GPIO pin 6 +#define GPIO_PIN_7 0x00000080 // GPIO pin 7 + +//***************************************************************************** +// +// Values that can be passed to GPIODirModeSet as the ulPinIO parameter, and +// returned from GPIODirModeGet. +// +//***************************************************************************** +#define GPIO_DIR_MODE_IN 0x00000000 // Pin is a GPIO input +#define GPIO_DIR_MODE_OUT 0x00000001 // Pin is a GPIO output +#define GPIO_DIR_MODE_HW 0x00000002 // Pin is a peripheral function + +//***************************************************************************** +// +// Values that can be passed to GPIOIntTypeSet as the ulIntType parameter, and +// returned from GPIOIntTypeGet. +// +//***************************************************************************** +#define GPIO_FALLING_EDGE 0x00000000 // Interrupt on falling edge +#define GPIO_RISING_EDGE 0x00000004 // Interrupt on rising edge +#define GPIO_BOTH_EDGES 0x00000001 // Interrupt on both edges +#define GPIO_LOW_LEVEL 0x00000002 // Interrupt on low level +#define GPIO_HIGH_LEVEL 0x00000007 // Interrupt on high level + +//***************************************************************************** +// +// Values that can be passed to GPIOPadConfigSet as the ulStrength parameter, +// and returned by GPIOPadConfigGet in the *pulStrength parameter. +// +//***************************************************************************** +#define GPIO_STRENGTH_2MA 0x00000001 // 2mA drive strength +#define GPIO_STRENGTH_4MA 0x00000002 // 4mA drive strength +#define GPIO_STRENGTH_8MA 0x00000004 // 8mA drive strength +#define GPIO_STRENGTH_8MA_SC 0x0000000C // 8mA drive with slew rate control + +//***************************************************************************** +// +// Values that can be passed to GPIOPadConfigSet as the ulPadType parameter, +// and returned by GPIOPadConfigGet in the *pulPadType parameter. +// +//***************************************************************************** +#define GPIO_PIN_TYPE_STD 0x00000008 // Push-pull +#define GPIO_PIN_TYPE_STD_WPU 0x0000000A // Push-pull with weak pull-up +#define GPIO_PIN_TYPE_STD_WPD 0x0000000C // Push-pull with weak pull-down +#define GPIO_PIN_TYPE_OD 0x00000009 // Open-drain +#define GPIO_PIN_TYPE_OD_WPU 0x0000000B // Open-drain with weak pull-up +#define GPIO_PIN_TYPE_OD_WPD 0x0000000D // Open-drain with weak pull-down +#define GPIO_PIN_TYPE_ANALOG 0x00000000 // Analog comparator + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void GPIODirModeSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulPinIO); +extern unsigned long GPIODirModeGet(unsigned long ulPort, unsigned char ucPin); +extern void GPIOIntTypeSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulIntType); +extern unsigned long GPIOIntTypeGet(unsigned long ulPort, unsigned char ucPin); +extern void GPIOPadConfigSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulStrength, + unsigned long ulPadType); +extern void GPIOPadConfigGet(unsigned long ulPort, unsigned char ucPin, + unsigned long *pulStrength, + unsigned long *pulPadType); +extern void GPIOPinIntEnable(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinIntDisable(unsigned long ulPort, unsigned char ucPins); +extern long GPIOPinIntStatus(unsigned long ulPort, tBoolean bMasked); +extern void GPIOPinIntClear(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPortIntRegister(unsigned long ulPort, + void (*pfIntHandler)(void)); +extern void GPIOPortIntUnregister(unsigned long ulPort); +extern long GPIOPinRead(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinWrite(unsigned long ulPort, unsigned char ucPins, + unsigned char ucVal); +extern void GPIOPinTypeComparator(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeI2C(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypePWM(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeQEI(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeSSI(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeTimer(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeUART(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeCAN(unsigned long ulPort, unsigned char ucPins); + +#ifdef __cplusplus +} +#endif + +#endif // __GPIO_H__ diff --git a/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hibernate.h b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hibernate.h new file mode 100644 index 000000000..69a8c144a --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hibernate.h @@ -0,0 +1,107 @@ +//***************************************************************************** +// +// hibernate.h - API definition for the Hibernation module. +// +// Copyright (c) 2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HIBERNATE_H__ +#define __HIBERNATE_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Macros needed for selecting the clock source for HibernateClockSelect() +// +//***************************************************************************** +#define HIBERNATE_CLOCK_SEL_RAW 0x04 +#define HIBERNATE_CLOCK_SEL_DIV128 0x00 + +//***************************************************************************** +// +// Macros need to configure wake events for HibernateWakeSet() +// +//***************************************************************************** +#define HIBERNATE_WAKE_PIN 0x10 +#define HIBERNATE_WAKE_RTC 0x08 + +//***************************************************************************** +// +// Macros needed to configure low battery detect for HibernateLowBatSet() +// +//***************************************************************************** +#define HIBERNATE_LOW_BAT_DETECT 0x20 +#define HIBERNATE_LOW_BAT_ABORT 0xA0 + +//***************************************************************************** +// +// Macros defining interrupt source bits for the interrupt functions. +// +//***************************************************************************** +#define HIBERNATE_INT_PIN_WAKE 0x08 +#define HIBERNATE_INT_LOW_BAT 0x04 +#define HIBERNATE_INT_RTC_MATCH_0 0x01 +#define HIBERNATE_INT_RTC_MATCH_1 0x02 + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void HibernateEnable(void); +extern void HibernateDisable(void); +extern void HibernateClockSelect(unsigned long ulClockInput); +extern void HibernateRTCEnable(void); +extern void HibernateRTCDisable(void); +extern void HibernateWakeSet(unsigned long ulWakeFlags); +extern unsigned long HibernateWakeGet(void); +extern void HibernateLowBatSet(unsigned long ulLowBatFlags); +extern unsigned long HibernateLowBatGet(void); +extern void HibernateRTCSet(unsigned long ulRTCValue); +extern unsigned long HibernateRTCGet(void); +extern void HibernateRTCMatch0Set(unsigned long ulMatch); +extern unsigned long HibernateRTCMatch0Get(void); +extern void HibernateRTCMatch1Set(unsigned long ulMatch); +extern unsigned long HibernateRTCMatch1Get(void); +extern void HibernateRTCTrimSet(unsigned long ulTrim); +extern unsigned long HibernateRTCTrimGet(void); +extern void HibernateDataSet(unsigned long *pulData, unsigned long ulCount); +extern void HibernateDataGet(unsigned long *pulData, unsigned long ulCount); +extern void HibernateRequest(void); +extern void HibernateIntEnable(unsigned long ulIntFlags); +extern void HibernateIntDisable(unsigned long ulIntFlags); +extern void HibernateIntRegister(void (*pfnHandler)(void)); +extern void HibernateIntUnregister(void); +extern unsigned long HibernateIntStatus(tBoolean bMasked); +extern void HibernateIntClear(unsigned long ulIntFlags); +extern unsigned int HibernateIsActive(void); + +#ifdef __cplusplus +} +#endif + +#endif // __HIBERNATE_H__ diff --git a/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_adc.h b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_adc.h new file mode 100644 index 000000000..932d3f26e --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_adc.h @@ -0,0 +1,343 @@ +//***************************************************************************** +// +// hw_adc.h - Macros used when accessing the ADC hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_ADC_H__ +#define __HW_ADC_H__ + +//***************************************************************************** +// +// The following define the offsets of the ADC registers. +// +//***************************************************************************** +#define ADC_O_ACTSS 0x00000000 // Active sample register +#define ADC_O_RIS 0x00000004 // Raw interrupt status register +#define ADC_O_IM 0x00000008 // Interrupt mask register +#define ADC_O_ISC 0x0000000C // Interrupt status/clear register +#define ADC_O_OSTAT 0x00000010 // Overflow status register +#define ADC_O_EMUX 0x00000014 // Event multiplexer select reg. +#define ADC_O_USTAT 0x00000018 // Underflow status register +#define ADC_O_SSPRI 0x00000020 // Channel priority register +#define ADC_O_PSSI 0x00000028 // Processor sample initiate reg. +#define ADC_O_SAC 0x00000030 // Sample Averaging Control reg. +#define ADC_O_SSMUX0 0x00000040 // Multiplexer select 0 register +#define ADC_O_SSCTL0 0x00000044 // Sample sequence control 0 reg. +#define ADC_O_SSFIFO0 0x00000048 // Result FIFO 0 register +#define ADC_O_SSFSTAT0 0x0000004C // FIFO 0 status register +#define ADC_O_SSMUX1 0x00000060 // Multiplexer select 1 register +#define ADC_O_SSCTL1 0x00000064 // Sample sequence control 1 reg. +#define ADC_O_SSFIFO1 0x00000068 // Result FIFO 1 register +#define ADC_O_SSFSTAT1 0x0000006C // FIFO 1 status register +#define ADC_O_SSMUX2 0x00000080 // Multiplexer select 2 register +#define ADC_O_SSCTL2 0x00000084 // Sample sequence control 2 reg. +#define ADC_O_SSFIFO2 0x00000088 // Result FIFO 2 register +#define ADC_O_SSFSTAT2 0x0000008C // FIFO 2 status register +#define ADC_O_SSMUX3 0x000000A0 // Multiplexer select 3 register +#define ADC_O_SSCTL3 0x000000A4 // Sample sequence control 3 reg. +#define ADC_O_SSFIFO3 0x000000A8 // Result FIFO 3 register +#define ADC_O_SSFSTAT3 0x000000AC // FIFO 3 status register +#define ADC_O_TMLB 0x00000100 // Test mode loopback register + +//***************************************************************************** +// +// The following define the offsets of the ADC sequence registers. +// +//***************************************************************************** +#define ADC_O_SEQ 0x00000040 // Offset to the first sequence +#define ADC_O_SEQ_STEP 0x00000020 // Increment to the next sequence +#define ADC_O_X_SSMUX 0x00000000 // Multiplexer select register +#define ADC_O_X_SSCTL 0x00000004 // Sample sequence control register +#define ADC_O_X_SSFIFO 0x00000008 // Result FIFO register +#define ADC_O_X_SSFSTAT 0x0000000C // FIFO status register + +//***************************************************************************** +// +// The following define the bit fields in the ADC_ACTSS register. +// +//***************************************************************************** +#define ADC_ACTSS_ASEN3 0x00000008 // Sample sequence 3 enable +#define ADC_ACTSS_ASEN2 0x00000004 // Sample sequence 2 enable +#define ADC_ACTSS_ASEN1 0x00000002 // Sample sequence 1 enable +#define ADC_ACTSS_ASEN0 0x00000001 // Sample sequence 0 enable + +//***************************************************************************** +// +// The following define the bit fields in the ADC_RIS register. +// +//***************************************************************************** +#define ADC_RIS_INR3 0x00000008 // Sample sequence 3 interrupt +#define ADC_RIS_INR2 0x00000004 // Sample sequence 2 interrupt +#define ADC_RIS_INR1 0x00000002 // Sample sequence 1 interrupt +#define ADC_RIS_INR0 0x00000001 // Sample sequence 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the ADC_IM register. +// +//***************************************************************************** +#define ADC_IM_MASK3 0x00000008 // Sample sequence 3 mask +#define ADC_IM_MASK2 0x00000004 // Sample sequence 2 mask +#define ADC_IM_MASK1 0x00000002 // Sample sequence 1 mask +#define ADC_IM_MASK0 0x00000001 // Sample sequence 0 mask + +//***************************************************************************** +// +// The following define the bit fields in the ADC_ISC register. +// +//***************************************************************************** +#define ADC_ISC_IN3 0x00000008 // Sample sequence 3 interrupt +#define ADC_ISC_IN2 0x00000004 // Sample sequence 2 interrupt +#define ADC_ISC_IN1 0x00000002 // Sample sequence 1 interrupt +#define ADC_ISC_IN0 0x00000001 // Sample sequence 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the ADC_OSTAT register. +// +//***************************************************************************** +#define ADC_OSTAT_OV3 0x00000008 // Sample sequence 3 overflow +#define ADC_OSTAT_OV2 0x00000004 // Sample sequence 2 overflow +#define ADC_OSTAT_OV1 0x00000002 // Sample sequence 1 overflow +#define ADC_OSTAT_OV0 0x00000001 // Sample sequence 0 overflow + +//***************************************************************************** +// +// The following define the bit fields in the ADC_EMUX register. +// +//***************************************************************************** +#define ADC_EMUX_EM3_MASK 0x0000F000 // Event mux 3 mask +#define ADC_EMUX_EM3_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM3_COMP0 0x00001000 // Analog comparator 0 event +#define ADC_EMUX_EM3_COMP1 0x00002000 // Analog comparator 1 event +#define ADC_EMUX_EM3_COMP2 0x00003000 // Analog comparator 2 event +#define ADC_EMUX_EM3_EXTERNAL 0x00004000 // External event +#define ADC_EMUX_EM3_TIMER 0x00005000 // Timer event +#define ADC_EMUX_EM3_PWM0 0x00006000 // PWM0 event +#define ADC_EMUX_EM3_PWM1 0x00007000 // PWM1 event +#define ADC_EMUX_EM3_PWM2 0x00008000 // PWM2 event +#define ADC_EMUX_EM3_ALWAYS 0x0000F000 // Always event +#define ADC_EMUX_EM2_MASK 0x00000F00 // Event mux 2 mask +#define ADC_EMUX_EM2_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM2_COMP0 0x00000100 // Analog comparator 0 event +#define ADC_EMUX_EM2_COMP1 0x00000200 // Analog comparator 1 event +#define ADC_EMUX_EM2_COMP2 0x00000300 // Analog comparator 2 event +#define ADC_EMUX_EM2_EXTERNAL 0x00000400 // External event +#define ADC_EMUX_EM2_TIMER 0x00000500 // Timer event +#define ADC_EMUX_EM2_PWM0 0x00000600 // PWM0 event +#define ADC_EMUX_EM2_PWM1 0x00000700 // PWM1 event +#define ADC_EMUX_EM2_PWM2 0x00000800 // PWM2 event +#define ADC_EMUX_EM2_ALWAYS 0x00000F00 // Always event +#define ADC_EMUX_EM1_MASK 0x000000F0 // Event mux 1 mask +#define ADC_EMUX_EM1_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM1_COMP0 0x00000010 // Analog comparator 0 event +#define ADC_EMUX_EM1_COMP1 0x00000020 // Analog comparator 1 event +#define ADC_EMUX_EM1_COMP2 0x00000030 // Analog comparator 2 event +#define ADC_EMUX_EM1_EXTERNAL 0x00000040 // External event +#define ADC_EMUX_EM1_TIMER 0x00000050 // Timer event +#define ADC_EMUX_EM1_PWM0 0x00000060 // PWM0 event +#define ADC_EMUX_EM1_PWM1 0x00000070 // PWM1 event +#define ADC_EMUX_EM1_PWM2 0x00000080 // PWM2 event +#define ADC_EMUX_EM1_ALWAYS 0x000000F0 // Always event +#define ADC_EMUX_EM0_MASK 0x0000000F // Event mux 0 mask +#define ADC_EMUX_EM0_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM0_COMP0 0x00000001 // Analog comparator 0 event +#define ADC_EMUX_EM0_COMP1 0x00000002 // Analog comparator 1 event +#define ADC_EMUX_EM0_COMP2 0x00000003 // Analog comparator 2 event +#define ADC_EMUX_EM0_EXTERNAL 0x00000004 // External event +#define ADC_EMUX_EM0_TIMER 0x00000005 // Timer event +#define ADC_EMUX_EM0_PWM0 0x00000006 // PWM0 event +#define ADC_EMUX_EM0_PWM1 0x00000007 // PWM1 event +#define ADC_EMUX_EM0_PWM2 0x00000008 // PWM2 event +#define ADC_EMUX_EM0_ALWAYS 0x0000000F // Always event +#define ADC_EMUX_EM0_SHIFT 0 // The shift for the first event +#define ADC_EMUX_EM1_SHIFT 4 // The shift for the second event +#define ADC_EMUX_EM2_SHIFT 8 // The shift for the third event +#define ADC_EMUX_EM3_SHIFT 12 // The shift for the fourth event + +//***************************************************************************** +// +// The following define the bit fields in the ADC_USTAT register. +// +//***************************************************************************** +#define ADC_USTAT_UV3 0x00000008 // Sample sequence 3 underflow +#define ADC_USTAT_UV2 0x00000004 // Sample sequence 2 underflow +#define ADC_USTAT_UV1 0x00000002 // Sample sequence 1 underflow +#define ADC_USTAT_UV0 0x00000001 // Sample sequence 0 underflow + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSPRI register. +// +//***************************************************************************** +#define ADC_SSPRI_SS3_MASK 0x00003000 // Sequencer 3 priority mask +#define ADC_SSPRI_SS3_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS3_2ND 0x00001000 // Second priority +#define ADC_SSPRI_SS3_3RD 0x00002000 // Third priority +#define ADC_SSPRI_SS3_4TH 0x00003000 // Fourth priority +#define ADC_SSPRI_SS2_MASK 0x00000300 // Sequencer 2 priority mask +#define ADC_SSPRI_SS2_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS2_2ND 0x00000100 // Second priority +#define ADC_SSPRI_SS2_3RD 0x00000200 // Third priority +#define ADC_SSPRI_SS2_4TH 0x00000300 // Fourth priority +#define ADC_SSPRI_SS1_MASK 0x00000030 // Sequencer 1 priority mask +#define ADC_SSPRI_SS1_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS1_2ND 0x00000010 // Second priority +#define ADC_SSPRI_SS1_3RD 0x00000020 // Third priority +#define ADC_SSPRI_SS1_4TH 0x00000030 // Fourth priority +#define ADC_SSPRI_SS0_MASK 0x00000003 // Sequencer 0 priority mask +#define ADC_SSPRI_SS0_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS0_2ND 0x00000001 // Second priority +#define ADC_SSPRI_SS0_3RD 0x00000002 // Third priority +#define ADC_SSPRI_SS0_4TH 0x00000003 // Fourth priority + +//***************************************************************************** +// +// The following define the bit fields in the ADC_PSSI register. +// +//***************************************************************************** +#define ADC_PSSI_SS3 0x00000008 // Trigger sample sequencer 3 +#define ADC_PSSI_SS2 0x00000004 // Trigger sample sequencer 2 +#define ADC_PSSI_SS1 0x00000002 // Trigger sample sequencer 1 +#define ADC_PSSI_SS0 0x00000001 // Trigger sample sequencer 0 + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SAC register. +// +//***************************************************************************** +#define ADC_SAC_AVG_OFF 0x00000000 // No hardware oversampling +#define ADC_SAC_AVG_2X 0x00000001 // 2x hardware oversampling +#define ADC_SAC_AVG_4X 0x00000002 // 4x hardware oversampling +#define ADC_SAC_AVG_8X 0x00000003 // 8x hardware oversampling +#define ADC_SAC_AVG_16X 0x00000004 // 16x hardware oversampling +#define ADC_SAC_AVG_32X 0x00000005 // 32x hardware oversampling +#define ADC_SAC_AVG_64X 0x00000006 // 64x hardware oversampling + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSMUX0, ADC_SSMUX1, +// ADC_SSMUX2, and ADC_SSMUX3 registers. Not all fields are present in all +// registers. +// +//***************************************************************************** +#define ADC_SSMUX_MUX7_MASK 0x70000000 // 8th mux select mask +#define ADC_SSMUX_MUX6_MASK 0x07000000 // 7th mux select mask +#define ADC_SSMUX_MUX5_MASK 0x00700000 // 6th mux select mask +#define ADC_SSMUX_MUX4_MASK 0x00070000 // 5th mux select mask +#define ADC_SSMUX_MUX3_MASK 0x00007000 // 4th mux select mask +#define ADC_SSMUX_MUX2_MASK 0x00000700 // 3rd mux select mask +#define ADC_SSMUX_MUX1_MASK 0x00000070 // 2nd mux select mask +#define ADC_SSMUX_MUX0_MASK 0x00000007 // 1st mux select mask +#define ADC_SSMUX_MUX7_SHIFT 28 +#define ADC_SSMUX_MUX6_SHIFT 24 +#define ADC_SSMUX_MUX5_SHIFT 20 +#define ADC_SSMUX_MUX4_SHIFT 16 +#define ADC_SSMUX_MUX3_SHIFT 12 +#define ADC_SSMUX_MUX2_SHIFT 8 +#define ADC_SSMUX_MUX1_SHIFT 4 +#define ADC_SSMUX_MUX0_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSCTL0, ADC_SSCTL1, +// ADC_SSCTL2, and ADC_SSCTL3 registers. Not all fields are present in all +// registers. +// +//***************************************************************************** +#define ADC_SSCTL_TS7 0x80000000 // 8th temperature sensor select +#define ADC_SSCTL_IE7 0x40000000 // 8th interrupt enable +#define ADC_SSCTL_END7 0x20000000 // 8th sequence end select +#define ADC_SSCTL_D7 0x10000000 // 8th differential select +#define ADC_SSCTL_TS6 0x08000000 // 7th temperature sensor select +#define ADC_SSCTL_IE6 0x04000000 // 7th interrupt enable +#define ADC_SSCTL_END6 0x02000000 // 7th sequence end select +#define ADC_SSCTL_D6 0x01000000 // 7th differential select +#define ADC_SSCTL_TS5 0x00800000 // 6th temperature sensor select +#define ADC_SSCTL_IE5 0x00400000 // 6th interrupt enable +#define ADC_SSCTL_END5 0x00200000 // 6th sequence end select +#define ADC_SSCTL_D5 0x00100000 // 6th differential select +#define ADC_SSCTL_TS4 0x00080000 // 5th temperature sensor select +#define ADC_SSCTL_IE4 0x00040000 // 5th interrupt enable +#define ADC_SSCTL_END4 0x00020000 // 5th sequence end select +#define ADC_SSCTL_D4 0x00010000 // 5th differential select +#define ADC_SSCTL_TS3 0x00008000 // 4th temperature sensor select +#define ADC_SSCTL_IE3 0x00004000 // 4th interrupt enable +#define ADC_SSCTL_END3 0x00002000 // 4th sequence end select +#define ADC_SSCTL_D3 0x00001000 // 4th differential select +#define ADC_SSCTL_TS2 0x00000800 // 3rd temperature sensor select +#define ADC_SSCTL_IE2 0x00000400 // 3rd interrupt enable +#define ADC_SSCTL_END2 0x00000200 // 3rd sequence end select +#define ADC_SSCTL_D2 0x00000100 // 3rd differential select +#define ADC_SSCTL_TS1 0x00000080 // 2nd temperature sensor select +#define ADC_SSCTL_IE1 0x00000040 // 2nd interrupt enable +#define ADC_SSCTL_END1 0x00000020 // 2nd sequence end select +#define ADC_SSCTL_D1 0x00000010 // 2nd differential select +#define ADC_SSCTL_TS0 0x00000008 // 1st temperature sensor select +#define ADC_SSCTL_IE0 0x00000004 // 1st interrupt enable +#define ADC_SSCTL_END0 0x00000002 // 1st sequence end select +#define ADC_SSCTL_D0 0x00000001 // 1st differential select + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSFIFO0, ADC_SSFIFO1, +// ADC_SSFIFO2, and ADC_SSFIFO3 registers. +// +//***************************************************************************** +#define ADC_SSFIFO_DATA_MASK 0x000003FF // Sample data +#define ADC_SSFIFO_DATA_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSFSTAT0, ADC_SSFSTAT1, +// ADC_SSFSTAT2, and ADC_SSFSTAT3 registers. +// +//***************************************************************************** +#define ADC_SSFSTAT_FULL 0x00001000 // FIFO is full +#define ADC_SSFSTAT_EMPTY 0x00000100 // FIFO is empty +#define ADC_SSFSTAT_HPTR 0x000000F0 // FIFO head pointer +#define ADC_SSFSTAT_TPTR 0x0000000F // FIFO tail pointer + +//***************************************************************************** +// +// The following define the bit fields in the ADC_TMLB register. +// +//***************************************************************************** +#define ADC_TMLB_LB 0x00000001 // Loopback control signals + +//***************************************************************************** +// +// The following define the bit fields in the loopback ADC data. +// +//***************************************************************************** +#define ADC_LB_CNT_MASK 0x000003C0 // Sample counter mask +#define ADC_LB_CONT 0x00000020 // Continuation sample +#define ADC_LB_DIFF 0x00000010 // Differential sample +#define ADC_LB_TS 0x00000008 // Temperature sensor sample +#define ADC_LB_MUX_MASK 0x00000007 // Input channel number mask +#define ADC_LB_CNT_SHIFT 6 // Sample counter shift +#define ADC_LB_MUX_SHIFT 0 // Input channel number shift + +#endif // __HW_ADC_H__ diff --git a/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_can.h b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_can.h new file mode 100644 index 000000000..02f7b7465 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_can.h @@ -0,0 +1,379 @@ +//***************************************************************************** +// +// hw_can.h - Defines and macros used when accessing the can. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_CAN_H__ +#define __HW_CAN_H__ + +//***************************************************************************** +// +// The following define the offsets of the can registers. +// +//***************************************************************************** +#define CAN_O_CTL 0x00000000 // Control register +#define CAN_O_STS 0x00000004 // Status register +#define CAN_O_ERR 0x00000008 // Error register +#define CAN_O_BIT 0x0000000C // Bit Timing register +#define CAN_O_INT 0x00000010 // Interrupt register +#define CAN_O_TST 0x00000014 // Test register +#define CAN_O_BRPE 0x00000018 // Baud Rate Prescaler register +#define CAN_O_IF1CRQ 0x00000020 // Interface 1 Command Request reg. +#define CAN_O_IF1CMSK 0x00000024 // Interface 1 Command Mask reg. +#define CAN_O_IF1MSK1 0x00000028 // Interface 1 Mask 1 register +#define CAN_O_IF1MSK2 0x0000002C // Interface 1 Mask 2 register +#define CAN_O_IF1ARB1 0x00000030 // Interface 1 Arbitration 1 reg. +#define CAN_O_IF1ARB2 0x00000034 // Interface 1 Arbitration 2 reg. +#define CAN_O_IF1MCTL 0x00000038 // Interface 1 Message Control reg. +#define CAN_O_IF1DA1 0x0000003C // Interface 1 DataA 1 register +#define CAN_O_IF1DA2 0x00000040 // Interface 1 DataA 2 register +#define CAN_O_IF1DB1 0x00000044 // Interface 1 DataB 1 register +#define CAN_O_IF1DB2 0x00000048 // Interface 1 DataB 2 register +#define CAN_O_IF2CRQ 0x00000080 // Interface 2 Command Request reg. +#define CAN_O_IF2CMSK 0x00000084 // Interface 2 Command Mask reg. +#define CAN_O_IF2MSK1 0x00000088 // Interface 2 Mask 1 register +#define CAN_O_IF2MSK2 0x0000008C // Interface 2 Mask 2 register +#define CAN_O_IF2ARB1 0x00000090 // Interface 2 Arbitration 1 reg. +#define CAN_O_IF2ARB2 0x00000094 // Interface 2 Arbitration 2 reg. +#define CAN_O_IF2MCTL 0x00000098 // Interface 2 Message Control reg. +#define CAN_O_IF2DA1 0x0000009C // Interface 2 DataA 1 register +#define CAN_O_IF2DA2 0x000000A0 // Interface 2 DataA 2 register +#define CAN_O_IF2DB1 0x000000A4 // Interface 2 DataB 1 register +#define CAN_O_IF2DB2 0x000000A8 // Interface 2 DataB 2 register +#define CAN_O_TXRQ1 0x00000100 // Transmission Request 1 register +#define CAN_O_TXRQ2 0x00000104 // Transmission Request 2 register +#define CAN_O_NWDA1 0x00000120 // New Data 1 register +#define CAN_O_NWDA2 0x00000124 // New Data 2 register +#define CAN_O_MSGINT1 0x00000140 // Intr. Pending in Msg Obj 1 reg. +#define CAN_O_MSGINT2 0x00000144 // Intr. Pending in Msg Obj 2 reg. +#define CAN_O_MSGVAL1 0x00000160 // Message Valid in Msg Obj 1 reg. +#define CAN_O_MSGVAL2 0x00000164 // Message Valid in Msg Obj 2 reg. + +//***************************************************************************** +// +// The following define the reset values of the can registers. +// +//***************************************************************************** +#define CAN_RV_CTL 0x00000001 +#define CAN_RV_STS 0x00000000 +#define CAN_RV_ERR 0x00000000 +#define CAN_RV_BIT 0x00002301 +#define CAN_RV_INT 0x00000000 +#define CAN_RV_TST 0x00000000 +#define CAN_RV_BRPE 0x00000000 +#define CAN_RV_IF1CRQ 0x00000001 +#define CAN_RV_IF1CMSK 0x00000000 +#define CAN_RV_IF1MSK1 0x0000FFFF +#define CAN_RV_IF1MSK2 0x0000FFFF +#define CAN_RV_IF1ARB1 0x00000000 +#define CAN_RV_IF1ARB2 0x00000000 +#define CAN_RV_IF1MCTL 0x00000000 +#define CAN_RV_IF1DA1 0x00000000 +#define CAN_RV_IF1DA2 0x00000000 +#define CAN_RV_IF1DB1 0x00000000 +#define CAN_RV_IF1DB2 0x00000000 +#define CAN_RV_IF2CRQ 0x00000001 +#define CAN_RV_IF2CMSK 0x00000000 +#define CAN_RV_IF2MSK1 0x0000FFFF +#define CAN_RV_IF2MSK2 0x0000FFFF +#define CAN_RV_IF2ARB1 0x00000000 +#define CAN_RV_IF2ARB2 0x00000000 +#define CAN_RV_IF2MCTL 0x00000000 +#define CAN_RV_IF2DA1 0x00000000 +#define CAN_RV_IF2DA2 0x00000000 +#define CAN_RV_IF2DB1 0x00000000 +#define CAN_RV_IF2DB2 0x00000000 +#define CAN_RV_TXRQ1 0x00000000 +#define CAN_RV_TXRQ2 0x00000000 +#define CAN_RV_NWDA1 0x00000000 +#define CAN_RV_NWDA2 0x00000000 +#define CAN_RV_MSGINT1 0x00000000 +#define CAN_RV_MSGINT2 0x00000000 +#define CAN_RV_MSGVAL1 0x00000000 +#define CAN_RV_MSGVAL2 0x00000000 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_CTL register. +// +//***************************************************************************** +#define CAN_CTL_TEST 0x00000080 // Test mode enable +#define CAN_CTL_CCE 0x00000040 // Configuration change enable +#define CAN_CTL_DAR 0x00000020 // Disable automatic retransmission +#define CAN_CTL_EIE 0x00000008 // Error interrupt enable +#define CAN_CTL_SIE 0x00000004 // Status change interrupt enable +#define CAN_CTL_IE 0x00000002 // Module interrupt enable +#define CAN_CTL_INIT 0x00000001 // Initialization + +//***************************************************************************** +// +// The following define the bit fields in the CAN_STS register. +// +//***************************************************************************** +#define CAN_STS_BOFF 0x00000080 // Bus Off status +#define CAN_STS_EWARN 0x00000040 // Error Warning status +#define CAN_STS_EPASS 0x00000020 // Error Passive status +#define CAN_STS_RXOK 0x00000010 // Received Message Successful +#define CAN_STS_TXOK 0x00000008 // Transmitted Message Successful +#define CAN_STS_LEC_MSK 0x00000007 // Last Error Code +#define CAN_STS_LEC_NONE 0x00000000 // No error +#define CAN_STS_LEC_STUFF 0x00000001 // Stuff error +#define CAN_STS_LEC_FORM 0x00000002 // Form(at) error +#define CAN_STS_LEC_ACK 0x00000003 // Ack error +#define CAN_STS_LEC_BIT1 0x00000004 // Bit 1 error +#define CAN_STS_LEC_BIT0 0x00000005 // Bit 0 error +#define CAN_STS_LEC_CRC 0x00000006 // CRC error + +//***************************************************************************** +// +// The following define the bit fields in the CAN_ERR register. +// +//***************************************************************************** +#define CAN_ERR_RP 0x00008000 // Receive error passive status +#define CAN_ERR_REC_MASK 0x00007F00 // Receive error counter status +#define CAN_ERR_REC_SHIFT 8 // Receive error counter bit pos +#define CAN_ERR_TEC_MASK 0x000000FF // Transmit error counter status +#define CAN_ERR_TEC_SHIFT 0 // Transmit error counter bit pos + +//***************************************************************************** +// +// The following define the bit fields in the CAN_BIT register. +// +//***************************************************************************** +#define CAN_BIT_TSEG2 0x00007000 // Time segment after sample point +#define CAN_BIT_TSEG1 0x00000F00 // Time segment before sample point +#define CAN_BIT_SJW 0x000000C0 // (Re)Synchronization jump width +#define CAN_BIT_BRP 0x0000003F // Baud rate prescaler + +//***************************************************************************** +// +// The following define the bit fields in the CAN_INT register. +// +//***************************************************************************** +#define CAN_INT_INTID_MSK 0x0000FFFF // Interrupt Identifier +#define CAN_INT_INTID_NONE 0x00000000 // No Interrupt Pending +#define CAN_INT_INTID_STATUS 0x00008000 // Status Interrupt + +//***************************************************************************** +// +// The following define the bit fields in the CAN_TST register. +// +//***************************************************************************** +#define CAN_TST_RX 0x00000080 // CAN_RX pin status +#define CAN_TST_TX_MSK 0x00000060 // Overide control of CAN_TX pin +#define CAN_TST_TX_CANCTL 0x00000000 // CAN core controls CAN_TX +#define CAN_TST_TX_SAMPLE 0x00000020 // Sample Point on CAN_TX +#define CAN_TST_TX_DOMINANT 0x00000040 // Dominant value on CAN_TX +#define CAN_TST_TX_RECESSIVE 0x00000060 // Recessive value on CAN_TX +#define CAN_TST_LBACK 0x00000010 // Loop back mode +#define CAN_TST_SILENT 0x00000008 // Silent mode +#define CAN_TST_BASIC 0x00000004 // Basic mode + +//***************************************************************************** +// +// The following define the bit fields in the CAN_BRPE register. +// +//***************************************************************************** +#define CAN_BRPE_BRPE 0x0000000F // Baud rate prescaler extension + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1CRQ and CAN_IF1CRQ +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFCRQ_BUSY 0x00008000 // Busy flag status +#define CAN_IFCRQ_MNUM_MSK 0x0000003F // Message Number + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1CMSK and CAN_IF2CMSK +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFCMSK_WRNRD 0x00000080 // Write, not Read +#define CAN_IFCMSK_MASK 0x00000040 // Access Mask Bits +#define CAN_IFCMSK_ARB 0x00000020 // Access Arbitration Bits +#define CAN_IFCMSK_CONTROL 0x00000010 // Access Control Bits +#define CAN_IFCMSK_CLRINTPND 0x00000008 // Clear interrupt pending Bit +#define CAN_IFCMSK_TXRQST 0x00000004 // Access Tx request bit (WRNRD=1) +#define CAN_IFCMSK_NEWDAT 0x00000004 // Access New Data bit (WRNRD=0) +#define CAN_IFCMSK_DATAA 0x00000002 // DataA access - bytes 0 to 3 +#define CAN_IFCMSK_DATAB 0x00000001 // DataB access - bytes 4 to 7 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1MSK1 and CAN_IF2MSK1 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFMSK1_MSK 0x0000FFFF // Identifier Mask + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1MSK2 and CAN_IF2MSK2 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFMSK2_MXTD 0x00008000 // Mask extended identifier +#define CAN_IFMSK2_MDIR 0x00004000 // Mask message direction +#define CAN_IFMSK2_MSK 0x00001FFF // Mask identifier + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1ARB1 and CAN_IF2ARB1 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFARB1_ID 0x0000FFFF // Identifier + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1ARB2 and CAN_IF2ARB2 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFARB2_MSGVAL 0x00008000 // Message valid +#define CAN_IFARB2_XTD 0x00004000 // Extended identifier +#define CAN_IFARB2_DIR 0x00002000 // Message direction +#define CAN_IFARB2_ID 0x00001FFF // Message identifier + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1MCTL and CAN_IF2MCTL +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFMCTL_NEWDAT 0x00008000 // New Data +#define CAN_IFMCTL_MSGLST 0x00004000 // Message lost +#define CAN_IFMCTL_INTPND 0x00002000 // Interrupt pending +#define CAN_IFMCTL_UMASK 0x00001000 // Use acceptance mask +#define CAN_IFMCTL_TXIE 0x00000800 // Transmit interrupt enable +#define CAN_IFMCTL_RXIE 0x00000400 // Receive interrupt enable +#define CAN_IFMCTL_RMTEN 0x00000200 // Remote enable +#define CAN_IFMCTL_TXRQST 0x00000100 // Transmit request +#define CAN_IFMCTL_EOB 0x00000080 // End of buffer +#define CAN_IFMCTL_DLC 0x0000000F // Data length code + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1DA1 and CAN_IF2DA1 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFDA1_DATA 0x0000FFFF // Data - bytes 1 and 0 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1DA2 and CAN_IF2DA2 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFDA2_DATA 0x0000FFFF // Data - bytes 3 and 2 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1DB1 and CAN_IF2DB1 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFDB1_DATA 0x0000FFFF // Data - bytes 5 and 4 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_IF1DB2 and CAN_IF2DB2 +// registers. +// Note: All bits may not be available in all registers +// +//***************************************************************************** +#define CAN_IFDB2_DATA 0x0000FFFF // Data - bytes 7 and 6 + +//***************************************************************************** +// +// The following define the bit fields in the CAN_TXRQ1 register. +// +//***************************************************************************** +#define CAN_TXRQ1_TXRQST 0x0000FFFF // Transmission Request Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_TXRQ2 register. +// +//***************************************************************************** +#define CAN_TXRQ2_TXRQST 0x0000FFFF // Transmission Request Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_NWDA1 register. +// +//***************************************************************************** +#define CAN_NWDA1_NEWDATA 0x0000FFFF // New Data Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_NWDA2 register. +// +//***************************************************************************** +#define CAN_NWDA2_NEWDATA 0x0000FFFF // New Data Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_MSGINT1 register. +// +//***************************************************************************** +#define CAN_MSGINT1_INTPND 0x0000FFFF // Interrupt Pending Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_MSGINT2 register. +// +//***************************************************************************** +#define CAN_MSGINT2_INTPND 0x0000FFFF // Interrupt Pending Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_MSGVAL1 register. +// +//***************************************************************************** +#define CAN_MSGVAL1_MSGVAL 0x0000FFFF // Message Valid Bits + +//***************************************************************************** +// +// The following define the bit fields in the CAN_MSGVAL2 register. +// +//***************************************************************************** +#define CAN_MSGVAL2_MSGVAL 0x0000FFFF // Message Valid Bits + +#endif // __HW_CAN_H__ diff --git a/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_comp.h b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_comp.h new file mode 100644 index 000000000..d8b355ea9 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_comp.h @@ -0,0 +1,118 @@ +//***************************************************************************** +// +// hw_comp.h - Macros used when accessing the comparator hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_COMP_H__ +#define __HW_COMP_H__ + +//***************************************************************************** +// +// The following define the offsets of the comparator registers. +// +//***************************************************************************** +#define COMP_O_MIS 0x00000000 // Interrupt status register +#define COMP_O_RIS 0x00000004 // Raw interrupt status register +#define COMP_O_INTEN 0x00000008 // Interrupt enable register +#define COMP_O_REFCTL 0x00000010 // Reference voltage control reg. +#define COMP_O_ACSTAT0 0x00000020 // Comp0 status register +#define COMP_O_ACCTL0 0x00000024 // Comp0 control register +#define COMP_O_ACSTAT1 0x00000040 // Comp1 status register +#define COMP_O_ACCTL1 0x00000044 // Comp1 control register +#define COMP_O_ACSTAT2 0x00000060 // Comp2 status register +#define COMP_O_ACCTL2 0x00000064 // Comp2 control register + +//***************************************************************************** +// +// The following define the bit fields in the COMP_MIS, COMP_RIS, and +// COMP_INTEN registers. +// +//***************************************************************************** +#define COMP_INT_2 0x00000004 // Comp2 interrupt +#define COMP_INT_1 0x00000002 // Comp1 interrupt +#define COMP_INT_0 0x00000001 // Comp0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the COMP_REFCTL register. +// +//***************************************************************************** +#define COMP_REFCTL_EN 0x00000200 // Reference voltage enable +#define COMP_REFCTL_RNG 0x00000100 // Reference voltage range +#define COMP_REFCTL_VREF_MASK 0x0000000F // Reference voltage select mask +#define COMP_REFCTL_VREF_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the COMP_ACSTAT0, COMP_ACSTAT1, and +// COMP_ACSTAT2 registers. +// +//***************************************************************************** +#define COMP_ACSTAT_OVAL 0x00000002 // Comparator output value + +//***************************************************************************** +// +// The following define the bit fields in the COMP_ACCTL0, COMP_ACCTL1, and +// COMP_ACCTL2 registers. +// +//***************************************************************************** +#define COMP_ACCTL_TMASK 0x00000800 // Trigger enable +#define COMP_ACCTL_ASRCP_MASK 0x00000600 // Vin+ source select mask +#define COMP_ACCTL_ASRCP_PIN 0x00000000 // Dedicated Comp+ pin +#define COMP_ACCTL_ASRCP_PIN0 0x00000200 // Comp0+ pin +#define COMP_ACCTL_ASRCP_REF 0x00000400 // Internal voltage reference +#define COMP_ACCTL_ASRCP_RES 0x00000600 // Reserved +#define COMP_ACCTL_OEN 0x00000100 // Comparator output enable +#define COMP_ACCTL_TSVAL 0x00000080 // Trigger polarity select +#define COMP_ACCTL_TSEN_MASK 0x00000060 // Trigger sense mask +#define COMP_ACCTL_TSEN_LEVEL 0x00000000 // Trigger is level sense +#define COMP_ACCTL_TSEN_FALL 0x00000020 // Trigger is falling edge +#define COMP_ACCTL_TSEN_RISE 0x00000040 // Trigger is rising edge +#define COMP_ACCTL_TSEN_BOTH 0x00000060 // Trigger is both edges +#define COMP_ACCTL_ISLVAL 0x00000010 // Interrupt polarity select +#define COMP_ACCTL_ISEN_MASK 0x0000000C // Interrupt sense mask +#define COMP_ACCTL_ISEN_LEVEL 0x00000000 // Interrupt is level sense +#define COMP_ACCTL_ISEN_FALL 0x00000004 // Interrupt is falling edge +#define COMP_ACCTL_ISEN_RISE 0x00000008 // Interrupt is rising edge +#define COMP_ACCTL_ISEN_BOTH 0x0000000C // Interrupt is both edges +#define COMP_ACCTL_CINV 0x00000002 // Comparator output invert + +//***************************************************************************** +// +// The following define the reset values for the comparator registers. +// +//***************************************************************************** +#define COMP_RV_MIS 0x00000000 // Interrupt status register +#define COMP_RV_RIS 0x00000000 // Raw interrupt status register +#define COMP_RV_INTEN 0x00000000 // Interrupt enable register +#define COMP_RV_REFCTL 0x00000000 // Reference voltage control reg. +#define COMP_RV_ACSTAT0 0x00000000 // Comp0 status register +#define COMP_RV_ACCTL0 0x00000000 // Comp0 control register +#define COMP_RV_ACSTAT1 0x00000000 // Comp1 status register +#define COMP_RV_ACCTL1 0x00000000 // Comp1 control register +#define COMP_RV_ACSTAT2 0x00000000 // Comp2 status register +#define COMP_RV_ACCTL2 0x00000000 // Comp2 control register + +#endif // __HW_COMP_H__ diff --git a/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_ethernet.h b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_ethernet.h new file mode 100644 index 000000000..7a8d224cd --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_ethernet.h @@ -0,0 +1,205 @@ +//***************************************************************************** +// +// hw_ethernet.h - Macros used when accessing the ethernet hardware. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_ETHERNET_H__ +#define __HW_ETHERNET_H__ + +//***************************************************************************** +// +// The following define the offsets of the MAC registers in the Ethernet +// Controller. +// +//***************************************************************************** +#define MAC_O_IS 0x00000000 // Interrupt Status Register +#define MAC_O_IACK 0x00000000 // Interrupt Acknowledge Register +#define MAC_O_IM 0x00000004 // Interrupt Mask Register +#define MAC_O_RCTL 0x00000008 // Receive Control Register +#define MAC_O_TCTL 0x0000000C // Transmit Control Register +#define MAC_O_DATA 0x00000010 // Data Register +#define MAC_O_IA0 0x00000014 // Individual Address Register 0 +#define MAC_O_IA1 0x00000018 // Individual Address Register 1 +#define MAC_O_THR 0x0000001C // Threshold Register +#define MAC_O_MCTL 0x00000020 // Management Control Register +#define MAC_O_MDV 0x00000024 // Management Divider Register +#define MAC_O_MADD 0x00000028 // Management Address Register +#define MAC_O_MTXD 0x0000002C // Management Transmit Data Reg +#define MAC_O_MRXD 0x00000030 // Management Receive Data Reg +#define MAC_O_NP 0x00000034 // Number of Packets Register +#define MAC_O_TR 0x00000038 // Transmission Request Register + +//***************************************************************************** +// +// The following define the reset values of the MAC registers. +// +//***************************************************************************** +#define MAC_RV_IS 0x00000000 +#define MAC_RV_IACK 0x00000000 +#define MAC_RV_IM 0x0000007F +#define MAC_RV_RCTL 0x00000008 +#define MAC_RV_TCTL 0x00000000 +#define MAC_RV_DATA 0x00000000 +#define MAC_RV_IA0 0x00000000 +#define MAC_RV_IA1 0x00000000 +#define MAC_RV_THR 0x0000003F +#define MAC_RV_MCTL 0x00000000 +#define MAC_RV_MDV 0x00000080 +#define MAC_RV_MADD 0x00000000 +#define MAC_RV_MTXD 0x00000000 +#define MAC_RV_MRXD 0x00000000 +#define MAC_RV_NP 0x00000000 +#define MAC_RV_TR 0x00000000 + +//***************************************************************************** +// +// The following define the bit fields in the MAC_IS register. +// +//***************************************************************************** +#define MAC_IS_PHYINT 0x00000040 // PHY Interrupt +#define MAC_IS_MDINT 0x00000020 // MDI Transaction Complete +#define MAC_IS_RXER 0x00000010 // RX Error +#define MAC_IS_FOV 0x00000008 // RX FIFO Overrun +#define MAC_IS_TXEMP 0x00000004 // TX FIFO Empy +#define MAC_IS_TXER 0x00000002 // TX Error +#define MAC_IS_RXINT 0x00000001 // RX Packet Available + +//***************************************************************************** +// +// The following define the bit fields in the MAC_IACK register. +// +//***************************************************************************** +#define MAC_IACK_PHYINT 0x00000040 // Clear PHY Interrupt +#define MAC_IACK_MDINT 0x00000020 // Clear MDI Transaction Complete +#define MAC_IACK_RXER 0x00000010 // Clear RX Error +#define MAC_IACK_FOV 0x00000008 // Clear RX FIFO Overrun +#define MAC_IACK_TXEMP 0x00000004 // Clear TX FIFO Empy +#define MAC_IACK_TXER 0x00000002 // Clear TX Error +#define MAC_IACK_RXINT 0x00000001 // Clear RX Packet Available + +//***************************************************************************** +// +// The following define the bit fields in the MAC_IM register. +// +//***************************************************************************** +#define MAC_IM_PHYINTM 0x00000040 // Mask PHY Interrupt +#define MAC_IM_MDINTM 0x00000020 // Mask MDI Transaction Complete +#define MAC_IM_RXERM 0x00000010 // Mask RX Error +#define MAC_IM_FOVM 0x00000008 // Mask RX FIFO Overrun +#define MAC_IM_TXEMPM 0x00000004 // Mask TX FIFO Empy +#define MAC_IM_TXERM 0x00000002 // Mask TX Error +#define MAC_IM_RXINTM 0x00000001 // Mask RX Packet Available + +//***************************************************************************** +// +// The following define the bit fields in the MAC_RCTL register. +// +//***************************************************************************** +#define MAC_RCTL_RSTFIFO 0x00000010 // Clear the Receive FIFO +#define MAC_RCTL_BADCRC 0x00000008 // Reject Packets With Bad CRC +#define MAC_RCTL_PRMS 0x00000004 // Enable Promiscuous Mode +#define MAC_RCTL_AMUL 0x00000002 // Enable Multicast Packets +#define MAC_RCTL_RXEN 0x00000001 // Enable Ethernet Receiver + +//***************************************************************************** +// +// The following define the bit fields in the MAC_TCTL register. +// +//***************************************************************************** +#define MAC_TCTL_DUPLEX 0x00000010 // Enable Duplex mode +#define MAC_TCTL_CRC 0x00000004 // Enable CRC Generation +#define MAC_TCTL_PADEN 0x00000002 // Enable Automatic Padding +#define MAC_TCTL_TXEN 0x00000001 // Enable Ethernet Transmitter + +//***************************************************************************** +// +// The following define the bit fields in the MAC_IA0 register. +// +//***************************************************************************** +#define MAC_IA0_MACOCT4 0xFF000000 // 4th Octet of MAC address +#define MAC_IA0_MACOCT3 0x00FF0000 // 3rd Octet of MAC address +#define MAC_IA0_MACOCT2 0x0000FF00 // 2nd Octet of MAC address +#define MAC_IA0_MACOCT1 0x000000FF // 1st Octet of MAC address + +//***************************************************************************** +// +// The following define the bit fields in the MAC_IA1 register. +// +//***************************************************************************** +#define MAC_IA1_MACOCT6 0x0000FF00 // 6th Octet of MAC address +#define MAC_IA1_MACOCT5 0x000000FF // 5th Octet of MAC address + +//***************************************************************************** +// +// The following define the bit fields in the MAC_TXTH register. +// +//***************************************************************************** +#define MAC_THR_THRESH 0x0000003F // Transmit Threshold Value + +//***************************************************************************** +// +// The following define the bit fields in the MAC_MCTL register. +// +//***************************************************************************** +#define MAC_MCTL_REGADR 0x000000F8 // Address for Next MII Transaction +#define MAC_MCTL_WRITE 0x00000002 // Next MII Transaction is Write +#define MAC_MCTL_START 0x00000001 // Start MII Transaction + +//***************************************************************************** +// +// The following define the bit fields in the MAC_MDV register. +// +//***************************************************************************** +#define MAC_MDV_DIV 0x000000FF // Clock Divider for MDC for TX + +//***************************************************************************** +// +// The following define the bit fields in the MAC_MTXD register. +// +//***************************************************************************** +#define MAC_MTXD_MDTX 0x0000FFFF // Data for Next MII Transaction + +//***************************************************************************** +// +// The following define the bit fields in the MAC_MRXD register. +// +//***************************************************************************** +#define MAC_MRXD_MDRX 0x0000FFFF // Data Read from Last MII Trans. + +//***************************************************************************** +// +// The following define the bit fields in the MAC_NP register. +// +//***************************************************************************** +#define MAC_NP_NPR 0x0000003F // Number of RX Frames in FIFO + +//***************************************************************************** +// +// The following define the bit fields in the MAC_TXRQ register. +// +//***************************************************************************** +#define MAC_TR_NEWTX 0x00000001 // Start an Ethernet Transmission + +#endif // __HW_ETHERNET_H__ diff --git a/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_flash.h b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_flash.h new file mode 100644 index 000000000..c5bea3b26 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_flash.h @@ -0,0 +1,147 @@ +//***************************************************************************** +// +// hw_flash.h - Macros used when accessing the flash controller. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_FLASH_H__ +#define __HW_FLASH_H__ + +//***************************************************************************** +// +// The following define the offsets of the FLASH registers. +// +//***************************************************************************** +#define FLASH_FMA 0x400FD000 // Memory address register +#define FLASH_FMD 0x400FD004 // Memory data register +#define FLASH_FMC 0x400FD008 // Memory control register +#define FLASH_FCRIS 0x400FD00c // Raw interrupt status register +#define FLASH_FCIM 0x400FD010 // Interrupt mask register +#define FLASH_FCMISC 0x400FD014 // Interrupt status register +#define FLASH_FMPRE 0x400FE130 // FLASH read protect register +#define FLASH_FMPPE 0x400FE134 // FLASH program protect register +#define FLASH_USECRL 0x400FE140 // uSec reload register +#define FLASH_FMPRE0 0x400FE200 // FLASH read protect register 0 +#define FLASH_FMPRE1 0x400FE204 // FLASH read protect register 1 +#define FLASH_FMPRE2 0x400FE208 // FLASH read protect register 2 +#define FLASH_FMPRE3 0x400FE20C // FLASH read protect register 3 +#define FLASH_FMPPE0 0x400FE400 // FLASH program protect register 0 +#define FLASH_FMPPE1 0x400FE404 // FLASH program protect register 1 +#define FLASH_FMPPE2 0x400FE408 // FLASH program protect register 2 +#define FLASH_FMPPE3 0x400FE40C // FLASH program protect register 3 + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FMC register. +// +//***************************************************************************** +#define FLASH_FMC_WRKEY_MASK 0xFFFF0000 // FLASH write key mask +#define FLASH_FMC_WRKEY 0xA4420000 // FLASH write key +#define FLASH_FMC_COMT 0x00000008 // Commit user register +#define FLASH_FMC_MERASE 0x00000004 // Mass erase FLASH +#define FLASH_FMC_ERASE 0x00000002 // Erase FLASH page +#define FLASH_FMC_WRITE 0x00000001 // Write FLASH word + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FCRIS register. +// +//***************************************************************************** +#define FLASH_FCRIS_PROGRAM 0x00000002 // Programming status +#define FLASH_FCRIS_ACCESS 0x00000001 // Invalid access status + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FCIM register. +// +//***************************************************************************** +#define FLASH_FCIM_PROGRAM 0x00000002 // Programming mask +#define FLASH_FCIM_ACCESS 0x00000001 // Invalid access mask + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FMIS register. +// +//***************************************************************************** +#define FLASH_FCMISC_PROGRAM 0x00000002 // Programming status +#define FLASH_FCMISC_ACCESS 0x00000001 // Invalid access status + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FMPRE and FLASH_FMPPE +// registers. +// +//***************************************************************************** +#define FLASH_FMP_BLOCK_31 0x80000000 // Enable for block 31 +#define FLASH_FMP_BLOCK_30 0x40000000 // Enable for block 30 +#define FLASH_FMP_BLOCK_29 0x20000000 // Enable for block 29 +#define FLASH_FMP_BLOCK_28 0x10000000 // Enable for block 28 +#define FLASH_FMP_BLOCK_27 0x08000000 // Enable for block 27 +#define FLASH_FMP_BLOCK_26 0x04000000 // Enable for block 26 +#define FLASH_FMP_BLOCK_25 0x02000000 // Enable for block 25 +#define FLASH_FMP_BLOCK_24 0x01000000 // Enable for block 24 +#define FLASH_FMP_BLOCK_23 0x00800000 // Enable for block 23 +#define FLASH_FMP_BLOCK_22 0x00400000 // Enable for block 22 +#define FLASH_FMP_BLOCK_21 0x00200000 // Enable for block 21 +#define FLASH_FMP_BLOCK_20 0x00100000 // Enable for block 20 +#define FLASH_FMP_BLOCK_19 0x00080000 // Enable for block 19 +#define FLASH_FMP_BLOCK_18 0x00040000 // Enable for block 18 +#define FLASH_FMP_BLOCK_17 0x00020000 // Enable for block 17 +#define FLASH_FMP_BLOCK_16 0x00010000 // Enable for block 16 +#define FLASH_FMP_BLOCK_15 0x00008000 // Enable for block 15 +#define FLASH_FMP_BLOCK_14 0x00004000 // Enable for block 14 +#define FLASH_FMP_BLOCK_13 0x00002000 // Enable for block 13 +#define FLASH_FMP_BLOCK_12 0x00001000 // Enable for block 12 +#define FLASH_FMP_BLOCK_11 0x00000800 // Enable for block 11 +#define FLASH_FMP_BLOCK_10 0x00000400 // Enable for block 10 +#define FLASH_FMP_BLOCK_9 0x00000200 // Enable for block 9 +#define FLASH_FMP_BLOCK_8 0x00000100 // Enable for block 8 +#define FLASH_FMP_BLOCK_7 0x00000080 // Enable for block 7 +#define FLASH_FMP_BLOCK_6 0x00000040 // Enable for block 6 +#define FLASH_FMP_BLOCK_5 0x00000020 // Enable for block 5 +#define FLASH_FMP_BLOCK_4 0x00000010 // Enable for block 4 +#define FLASH_FMP_BLOCK_3 0x00000008 // Enable for block 3 +#define FLASH_FMP_BLOCK_2 0x00000004 // Enable for block 2 +#define FLASH_FMP_BLOCK_1 0x00000002 // Enable for block 1 +#define FLASH_FMP_BLOCK_0 0x00000001 // Enable for block 0 + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_USECRL register. +// +//***************************************************************************** +#define FLASH_USECRL_MASK 0x000000FF // Clock per uSec +#define FLASH_USECRL_SHIFT 0 + +//***************************************************************************** +// +// The erase size is the size of the FLASH block that is erased by an erase +// operation, and the protect size is the size of the FLASH block that is +// protected by each protection register. +// +//***************************************************************************** +#define FLASH_ERASE_SIZE 0x00000400 +#define FLASH_PROTECT_SIZE 0x00000800 + +#endif // __HW_FLASH_H__ diff --git a/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_gpio.h b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_gpio.h new file mode 100644 index 000000000..3596325a7 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_gpio.h @@ -0,0 +1,115 @@ +//***************************************************************************** +// +// hw_gpio.h - Defines and Macros for GPIO hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_GPIO_H__ +#define __HW_GPIO_H__ + +//***************************************************************************** +// +// GPIO Register Offsets. +// +//***************************************************************************** +#define GPIO_O_DATA 0x00000000 // Data register. +#define GPIO_O_DIR 0x00000400 // Data direction register. +#define GPIO_O_IS 0x00000404 // Interrupt sense register. +#define GPIO_O_IBE 0x00000408 // Interrupt both edges register. +#define GPIO_O_IEV 0x0000040C // Intterupt event register. +#define GPIO_O_IM 0x00000410 // Interrupt mask register. +#define GPIO_O_RIS 0x00000414 // Raw interrupt status register. +#define GPIO_O_MIS 0x00000418 // Masked interrupt status reg. +#define GPIO_O_ICR 0x0000041C // Interrupt clear register. +#define GPIO_O_AFSEL 0x00000420 // Mode control select register. +#define GPIO_O_DR2R 0x00000500 // 2ma drive select register. +#define GPIO_O_DR4R 0x00000504 // 4ma drive select register. +#define GPIO_O_DR8R 0x00000508 // 8ma drive select register. +#define GPIO_O_ODR 0x0000050C // Open drain select register. +#define GPIO_O_PUR 0x00000510 // Pull up select register. +#define GPIO_O_PDR 0x00000514 // Pull down select register. +#define GPIO_O_SLR 0x00000518 // Slew rate control enable reg. +#define GPIO_O_DEN 0x0000051C // Digital input enable register. +#define GPIO_O_LOCK 0x00000520 // Lock register. +#define GPIO_O_CR 0x00000524 // Commit register. +#define GPIO_O_PeriphID4 0x00000FD0 // +#define GPIO_O_PeriphID5 0x00000FD4 // +#define GPIO_O_PeriphID6 0x00000FD8 // +#define GPIO_O_PeriphID7 0x00000FDC // +#define GPIO_O_PeriphID0 0x00000FE0 // +#define GPIO_O_PeriphID1 0x00000FE4 // +#define GPIO_O_PeriphID2 0x00000FE8 // +#define GPIO_O_PeriphID3 0x00000FEC // +#define GPIO_O_PCellID0 0x00000FF0 // +#define GPIO_O_PCellID1 0x00000FF4 // +#define GPIO_O_PCellID2 0x00000FF8 // +#define GPIO_O_PCellID3 0x00000FFC // + +//***************************************************************************** +// +// The following define the bit fields in the GPIO_LOCK register. +// +//***************************************************************************** +#define GPIO_LOCK_LOCKED 0x00000001 // GPIO_CR register is locked +#define GPIO_LOCK_UNLOCKED 0x00000000 // GPIO_CR register is unlocked +#define GPIO_LOCK_KEY 0x1ACCE551 // Unlocks the GPIO_CR register + +//***************************************************************************** +// +// GPIO Register reset values. +// +//***************************************************************************** +#define GPIO_RV_DATA 0x00000000 // Data register reset value. +#define GPIO_RV_DIR 0x00000000 // Data direction reg RV. +#define GPIO_RV_IS 0x00000000 // Interrupt sense reg RV. +#define GPIO_RV_IBE 0x00000000 // Interrupt both edges reg RV. +#define GPIO_RV_IEV 0x00000000 // Intterupt event reg RV. +#define GPIO_RV_IM 0x00000000 // Interrupt mask reg RV. +#define GPIO_RV_RIS 0x00000000 // Raw interrupt status reg RV. +#define GPIO_RV_MIS 0x00000000 // Masked interrupt status reg RV. +#define GPIO_RV_IC 0x00000000 // Interrupt clear reg RV. +#define GPIO_RV_AFSEL 0x00000000 // Mode control select reg RV. +#define GPIO_RV_DR2R 0x000000FF // 2ma drive select reg RV. +#define GPIO_RV_DR4R 0x00000000 // 4ma drive select reg RV. +#define GPIO_RV_DR8R 0x00000000 // 8ma drive select reg RV. +#define GPIO_RV_ODR 0x00000000 // Open drain select reg RV. +#define GPIO_RV_PUR 0x000000FF // Pull up select reg RV. +#define GPIO_RV_PDR 0x00000000 // Pull down select reg RV. +#define GPIO_RV_SLR 0x00000000 // Slew rate control enable reg RV. +#define GPIO_RV_DEN 0x000000FF // Digital input enable reg RV. +#define GPIO_RV_LOCK 0x00000001 // Lock register RV. +#define GPIO_RV_PeriphID4 0x00000000 // +#define GPIO_RV_PeriphID5 0x00000000 // +#define GPIO_RV_PeriphID6 0x00000000 // +#define GPIO_RV_PeriphID7 0x00000000 // +#define GPIO_RV_PeriphID0 0x00000061 // +#define GPIO_RV_PeriphID1 0x00000010 // +#define GPIO_RV_PeriphID2 0x00000004 // +#define GPIO_RV_PeriphID3 0x00000000 // +#define GPIO_RV_PCellID0 0x0000000D // +#define GPIO_RV_PCellID1 0x000000F0 // +#define GPIO_RV_PCellID2 0x00000005 // +#define GPIO_RV_PCellID3 0x000000B1 // + +#endif // __HW_GPIO_H__ diff --git a/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_hibernate.h b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_hibernate.h new file mode 100644 index 000000000..ee730d4c5 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_hibernate.h @@ -0,0 +1,145 @@ +//***************************************************************************** +// +// hw_hibernate.h - Defines and Macros for the Hibernation module. +// +// Copyright (c) 2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_HIBERNATE_H__ +#define __HW_HIBERNATE_H__ + +//***************************************************************************** +// +// The following define the addresses of the hibernation module registers. +// +//***************************************************************************** +#define HIB_RTCC 0x400fc000 // Hibernate RTC counter +#define HIB_RTCM0 0x400fc004 // Hibernate RTC match 0 +#define HIB_RTCM1 0x400fc008 // Hibernate RTC match 1 +#define HIB_RTCLD 0x400fc00C // Hibernate RTC load +#define HIB_CTL 0x400fc010 // Hibernate RTC control +#define HIB_IM 0x400fc014 // Hibernate interrupt mask +#define HIB_RIS 0x400fc018 // Hibernate raw interrupt status +#define HIB_MIS 0x400fc01C // Hibernate masked interrupt stat +#define HIB_IC 0x400fc020 // Hibernate interrupt clear +#define HIB_RTCT 0x400fc024 // Hibernate RTC trim +#define HIB_DATA 0x400fc030 // Hibernate data area +#define HIB_DATA_END 0x400fc130 // end of data area, exclusive + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate RTC counter register. +// +//***************************************************************************** +#define HIB_RTCC_MASK 0xffffffff // RTC counter mask + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate RTC match 0 register. +// +//***************************************************************************** +#define HIB_RTCM0_MASK 0xffffffff // RTC match 0 mask + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate RTC match 1 register. +// +//***************************************************************************** +#define HIB_RTCM1_MASK 0xffffffff // RTC match 1 mask + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate RTC load register. +// +//***************************************************************************** +#define HIB_RTCLD_MASK 0xffffffff // RTC load mask + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate control register +// +//***************************************************************************** +#define HIB_CTL_VABORT 0x00000080 // low bat abort +#define HIB_CTL_CLK32EN 0x00000040 // enable clock/oscillator +#define HIB_CTL_LOWBATEN 0x00000020 // enable low battery detect +#define HIB_CTL_PINWEN 0x00000010 // enable wake on WAKE pin +#define HIB_CTL_RTCWEN 0x00000008 // enable wake on RTC match +#define HIB_CTL_CLKSEL 0x00000004 // clock input selection +#define HIB_CTL_HIBREQ 0x00000002 // request hibernation +#define HIB_CTL_RTCEN 0x00000001 // RTC enable + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate interrupt mask reg. +// +//***************************************************************************** +#define HIB_IM_EXTW 0x00000008 // wake from external pin interrupt +#define HIB_IM_LOWBAT 0x00000004 // low battery interrupt +#define HIB_IM_RTCALT1 0x00000002 // RTC match 1 interrupt +#define HIB_IM_RTCALT0 0x00000001 // RTC match 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate raw interrupt status. +// +//***************************************************************************** +#define HIB_RIS_EXTW 0x00000008 // wake from external pin interrupt +#define HIB_RIS_LOWBAT 0x00000004 // low battery interrupt +#define HIB_RIS_RTCALT1 0x00000002 // RTC match 1 interrupt +#define HIB_RID_RTCALT0 0x00000001 // RTC match 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate masked int status. +// +//***************************************************************************** +#define HIB_MIS_EXTW 0x00000008 // wake from external pin interrupt +#define HIB_MIS_LOWBAT 0x00000004 // low battery interrupt +#define HIB_MIS_RTCALT1 0x00000002 // RTC match 1 interrupt +#define HIB_MID_RTCALT0 0x00000001 // RTC match 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate interrupt clear reg. +// +//***************************************************************************** +#define HIB_IC_EXTW 0x00000008 // wake from external pin interrupt +#define HIB_IC_LOWBAT 0x00000004 // low battery interrupt +#define HIB_IC_RTCALT1 0x00000002 // RTC match 1 interrupt +#define HIB_IC_RTCALT0 0x00000001 // RTC match 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate RTC trim register. +// +//***************************************************************************** +#define HIB_RTCT_MASK 0x0000ffff // RTC trim mask + +//***************************************************************************** +// +// The following define the bit fields in the Hibernate data register. +// +//***************************************************************************** +#define HIB_DATA_MASK 0xffffffff // NV memory data mask + +#endif // __HW_HIBERNATE_H__ diff --git a/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_i2c.h b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_i2c.h new file mode 100644 index 000000000..b90edb7df --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_i2c.h @@ -0,0 +1,197 @@ +//***************************************************************************** +// +// hw_i2c.h - Macros used when accessing the I2C master and slave hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_I2C_H__ +#define __HW_I2C_H__ + +//***************************************************************************** +// +// The following defines the offset between the I2C master and slave registers. +// +//***************************************************************************** +#define I2C_O_SLAVE 0x00000800 // Offset from master to slave + +//***************************************************************************** +// +// The following define the offsets of the I2C master registers. +// +//***************************************************************************** +#define I2C_MASTER_O_SA 0x00000000 // Slave address register +#define I2C_MASTER_O_CS 0x00000004 // Control and Status register +#define I2C_MASTER_O_DR 0x00000008 // Data register +#define I2C_MASTER_O_TPR 0x0000000C // Timer period register +#define I2C_MASTER_O_IMR 0x00000010 // Interrupt mask register +#define I2C_MASTER_O_RIS 0x00000014 // Raw interrupt status register +#define I2C_MASTER_O_MIS 0x00000018 // Masked interrupt status reg +#define I2C_MASTER_O_MICR 0x0000001c // Interrupt clear register +#define I2C_MASTER_O_CR 0x00000020 // Configuration register + +//***************************************************************************** +// +// The following define the offsets of the I2C slave registers. +// +//***************************************************************************** +#define I2C_SLAVE_O_OAR 0x00000000 // Own address register +#define I2C_SLAVE_O_CSR 0x00000004 // Control/Status register +#define I2C_SLAVE_O_DR 0x00000008 // Data register +#define I2C_SLAVE_O_IM 0x0000000C // Interrupt mask register +#define I2C_SLAVE_O_RIS 0x00000010 // Raw interrupt status register +#define I2C_SLAVE_O_MIS 0x00000014 // Masked interrupt status reg +#define I2C_SLAVE_O_SICR 0x00000018 // Interrupt clear register + +//***************************************************************************** +// +// The followng define the bit fields in the I2C master slave address register. +// +//***************************************************************************** +#define I2C_MASTER_SA_SA_MASK 0x000000FE // Slave address +#define I2C_MASTER_SA_RS 0x00000001 // Receive/send +#define I2C_MASTER_SA_SA_SHIFT 1 + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Control and Status +// register. +// +//***************************************************************************** +#define I2C_MASTER_CS_ACK 0x00000008 // Acknowlegde +#define I2C_MASTER_CS_STOP 0x00000004 // Stop +#define I2C_MASTER_CS_START 0x00000002 // Start +#define I2C_MASTER_CS_RUN 0x00000001 // Run +#define I2C_MASTER_CS_BUS_BUSY 0x00000040 // Bus busy +#define I2C_MASTER_CS_IDLE 0x00000020 // Idle +#define I2C_MASTER_CS_ARB_LOST 0x00000010 // Lost arbitration +#define I2C_MASTER_CS_DATA_ACK 0x00000008 // Data byte not acknowledged +#define I2C_MASTER_CS_ADDR_ACK 0x00000004 // Address byte not acknowledged +#define I2C_MASTER_CS_ERROR 0x00000002 // Error occurred +#define I2C_MASTER_CS_BUSY 0x00000001 // Controller is TX/RX data +#define I2C_MASTER_CS_ERR_MASK 0x0000001C + +//***************************************************************************** +// +// The following define values used in determining the contents of the I2C +// Master Timer Period register. +// +//***************************************************************************** +#define I2C_MASTER_TPR_SCL_HP 0x00000004 // SCL high period +#define I2C_MASTER_TPR_SCL_LP 0x00000006 // SCL low period +#define I2C_MASTER_TPR_SCL (I2C_MASTER_TPR_SCL_HP + I2C_MASTER_TPR_SCL_LP) +#define I2C_SCL_STANDARD 100000 // SCL standard frequency +#define I2C_SCL_FAST 400000 // SCL fast frequency + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Interrupt Mask +// register. +// +//***************************************************************************** +#define I2C_MASTER_IMR_IM 0x00000001 // Master interrupt mask + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Raw Interrupt Status +// register. +// +//***************************************************************************** +#define I2C_MASTER_RIS_RIS 0x00000001 // Master raw interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Masked Interrupt +// Status register. +// +//***************************************************************************** +#define I2C_MASTER_MIS_MIS 0x00000001 // Master masked interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Interrupt Clear +// register. +// +//***************************************************************************** +#define I2C_MASTER_MICR_IC 0x00000001 // Master interrupt clear + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Configuration +// register. +// +//***************************************************************************** +#define I2C_MASTER_CR_SFE 0x00000020 // Slave function enable +#define I2C_MASTER_CR_MFE 0x00000010 // Master function enable +#define I2C_MASTER_CR_LPBK 0x00000001 // Loopback enable + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Own Address register. +// +//***************************************************************************** +#define I2C_SLAVE_SOAR_OAR_MASK 0x0000007F // Slave address + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Control/Status +// register. +// +//***************************************************************************** +#define I2C_SLAVE_CSR_DA 0x00000001 // Enable the device +#define I2C_SLAVE_CSR_TREQ 0x00000002 // Transmit request received +#define I2C_SLAVE_CSR_RREQ 0x00000001 // Receive data from I2C master + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Interrupt Mask +// register. +// +//***************************************************************************** +#define I2C_SLAVE_IMR_IM 0x00000001 // Slave interrupt mask + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Raw Interrupt Status +// register. +// +//***************************************************************************** +#define I2C_SLAVE_RIS_RIS 0x00000001 // Slave raw interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Masked Interrupt +// Status register. +// +//***************************************************************************** +#define I2C_SLAVE_MIS_MIS 0x00000001 // Slave masked interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Interrupt Clear +// register. +// +//***************************************************************************** +#define I2C_SLAVE_SICR_IC 0x00000001 // Slave interrupt clear + +#endif // __HW_I2C_H__ diff --git a/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_ints.h b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_ints.h new file mode 100644 index 000000000..d2df4ee5b --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_ints.h @@ -0,0 +1,113 @@ +//***************************************************************************** +// +// hw_ints.h - Macros that define the interrupt assignment on Stellaris. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_INTS_H__ +#define __HW_INTS_H__ + +//***************************************************************************** +// +// The following define the fault assignments. +// +//***************************************************************************** +#define FAULT_NMI 2 // NMI fault +#define FAULT_HARD 3 // Hard fault +#define FAULT_MPU 4 // MPU fault +#define FAULT_BUS 5 // Bus fault +#define FAULT_USAGE 6 // Usage fault +#define FAULT_SVCALL 11 // SVCall +#define FAULT_DEBUG 12 // Debug monitor +#define FAULT_PENDSV 14 // PendSV +#define FAULT_SYSTICK 15 // System Tick + +//***************************************************************************** +// +// The following define the interrupt assignments. +// +//***************************************************************************** +#define INT_GPIOA 16 // GPIO Port A +#define INT_GPIOB 17 // GPIO Port B +#define INT_GPIOC 18 // GPIO Port C +#define INT_GPIOD 19 // GPIO Port D +#define INT_GPIOE 20 // GPIO Port E +#define INT_UART0 21 // UART0 Rx and Tx +#define INT_UART1 22 // UART1 Rx and Tx +#define INT_SSI 23 // SSI Rx and Tx +#define INT_SSI0 23 // SSI0 Rx and Tx +#define INT_I2C 24 // I2C Master and Slave +#define INT_I2C0 24 // I2C0 Master and Slave +#define INT_PWM_FAULT 25 // PWM Fault +#define INT_PWM0 26 // PWM Generator 0 +#define INT_PWM1 27 // PWM Generator 1 +#define INT_PWM2 28 // PWM Generator 2 +#define INT_QEI 29 // Quadrature Encoder +#define INT_QEI0 29 // Quadrature Encoder 0 +#define INT_ADC0 30 // ADC Sequence 0 +#define INT_ADC1 31 // ADC Sequence 1 +#define INT_ADC2 32 // ADC Sequence 2 +#define INT_ADC3 33 // ADC Sequence 3 +#define INT_WATCHDOG 34 // Watchdog timer +#define INT_TIMER0A 35 // Timer 0 subtimer A +#define INT_TIMER0B 36 // Timer 0 subtimer B +#define INT_TIMER1A 37 // Timer 1 subtimer A +#define INT_TIMER1B 38 // Timer 1 subtimer B +#define INT_TIMER2A 39 // Timer 2 subtimer A +#define INT_TIMER2B 40 // Timer 2 subtimer B +#define INT_COMP0 41 // Analog Comparator 0 +#define INT_COMP1 42 // Analog Comparator 1 +#define INT_COMP2 43 // Analog Comparator 2 +#define INT_SYSCTL 44 // System Control (PLL, OSC, BO) +#define INT_FLASH 45 // FLASH Control +#define INT_GPIOF 46 // GPIO Port F +#define INT_GPIOG 47 // GPIO Port G +#define INT_GPIOH 48 // GPIO Port H +#define INT_UART2 49 // UART2 Rx and Tx +#define INT_SSI1 50 // SSI1 Rx and Tx +#define INT_TIMER3A 51 // Timer 3 subtimer A +#define INT_TIMER3B 52 // Timer 3 subtimer B +#define INT_I2C1 53 // I2C1 Master and Slave +#define INT_QEI1 54 // Quadrature Encoder 1 +#define INT_CAN0 55 // CAN0 +#define INT_CAN1 56 // CAN1 +#define INT_ETH 58 // Ethernet +#define INT_HIBERNATE 59 // Hibernation module + +//***************************************************************************** +// +// The total number of interrupts. +// +//***************************************************************************** +#define NUM_INTERRUPTS 60 + +//***************************************************************************** +// +// The total number of priority levels. +// +//***************************************************************************** +#define NUM_PRIORITY 8 +#define NUM_PRIORITY_BITS 3 + +#endif // __HW_INTS_H__ diff --git a/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_memmap.h b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_memmap.h new file mode 100644 index 000000000..8ae2a06cd --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_memmap.h @@ -0,0 +1,80 @@ +//***************************************************************************** +// +// hw_memmap.h - Macros defining the memory map of Stellaris. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_MEMMAP_H__ +#define __HW_MEMMAP_H__ + +//***************************************************************************** +// +// The following define the base address of the memories and peripherals. +// +//***************************************************************************** +#define FLASH_BASE 0x00000000 // FLASH memory +#define SRAM_BASE 0x20000000 // SRAM memory +#define WATCHDOG_BASE 0x40000000 // Watchdog +#define GPIO_PORTA_BASE 0x40004000 // GPIO Port A +#define GPIO_PORTB_BASE 0x40005000 // GPIO Port B +#define GPIO_PORTC_BASE 0x40006000 // GPIO Port C +#define GPIO_PORTD_BASE 0x40007000 // GPIO Port D +#define SSI_BASE 0x40008000 // SSI +#define SSI0_BASE 0x40008000 // SSI0 +#define SSI1_BASE 0x40009000 // SSI1 +#define UART0_BASE 0x4000C000 // UART0 +#define UART1_BASE 0x4000D000 // UART1 +#define UART2_BASE 0x4000E000 // UART2 +#define I2C_MASTER_BASE 0x40020000 // I2C Master +#define I2C_SLAVE_BASE 0x40020800 // I2C Slave +#define I2C0_MASTER_BASE 0x40020000 // I2C0 Master +#define I2C0_SLAVE_BASE 0x40020800 // I2C0 Slave +#define I2C1_MASTER_BASE 0x40021000 // I2C1 Master +#define I2C1_SLAVE_BASE 0x40021800 // I2C1 Slave +#define GPIO_PORTE_BASE 0x40024000 // GPIO Port E +#define GPIO_PORTF_BASE 0x40025000 // GPIO Port F +#define GPIO_PORTG_BASE 0x40026000 // GPIO Port G +#define GPIO_PORTH_BASE 0x40027000 // GPIO Port H +#define PWM_BASE 0x40028000 // PWM +#define QEI_BASE 0x4002C000 // QEI +#define QEI0_BASE 0x4002C000 // QEI0 +#define QEI1_BASE 0x4002D000 // QEI1 +#define TIMER0_BASE 0x40030000 // Timer0 +#define TIMER1_BASE 0x40031000 // Timer1 +#define TIMER2_BASE 0x40032000 // Timer2 +#define TIMER3_BASE 0x40033000 // Timer3 +#define ADC_BASE 0x40038000 // ADC +#define COMP_BASE 0x4003C000 // Analog comparators +#define CAN0_BASE 0x40040000 // CAN0 +#define CAN1_BASE 0x40041000 // CAN1 +#define ETH_BASE 0x40048000 // Ethernet +#define FLASH_CTRL_BASE 0x400FD000 // FLASH Controller +#define SYSCTL_BASE 0x400FE000 // System Control +#define ITM_BASE 0xE0000000 // Instrumentation Trace Macrocell +#define DWT_BASE 0xE0001000 // Data Watchpoint and Trace +#define FPB_BASE 0xE0002000 // FLASH Patch and Breakpoint +#define NVIC_BASE 0xE000E000 // Nested Vectored Interrupt Ctrl +#define TPIU_BASE 0xE0040000 // Trace Port Interface Unit + +#endif // __HW_MEMMAP_H__ diff --git a/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_nvic.h b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_nvic.h new file mode 100644 index 000000000..68c8d7c7f --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_nvic.h @@ -0,0 +1,1050 @@ +//***************************************************************************** +// +// hw_nvic.h - Macros used when accessing the NVIC hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_NVIC_H__ +#define __HW_NVIC_H__ + +//***************************************************************************** +// +// The following define the addresses of the NVIC registers. +// +//***************************************************************************** +#define NVIC_INT_TYPE 0xE000E004 // Interrupt Controller Type Reg. +#define NVIC_ST_CTRL 0xE000E010 // SysTick Control and Status Reg. +#define NVIC_ST_RELOAD 0xE000E014 // SysTick Reload Value Register +#define NVIC_ST_CURRENT 0xE000E018 // SysTick Current Value Register +#define NVIC_ST_CAL 0xE000E01C // SysTick Calibration Value Reg. +#define NVIC_EN0 0xE000E100 // IRQ 0 to 31 Set Enable Register +#define NVIC_EN1 0xE000E104 // IRQ 32 to 63 Set Enable Register +#define NVIC_DIS0 0xE000E180 // IRQ 0 to 31 Clear Enable Reg. +#define NVIC_DIS1 0xE000E184 // IRQ 32 to 63 Clear Enable Reg. +#define NVIC_PEND0 0xE000E200 // IRQ 0 to 31 Set Pending Register +#define NVIC_PEND1 0xE000E204 // IRQ 32 to 63 Set Pending Reg. +#define NVIC_UNPEND0 0xE000E280 // IRQ 0 to 31 Clear Pending Reg. +#define NVIC_UNPEND1 0xE000E284 // IRQ 32 to 63 Clear Pending Reg. +#define NVIC_ACTIVE0 0xE000E300 // IRQ 0 to 31 Active Register +#define NVIC_ACTIVE1 0xE000E304 // IRQ 32 to 63 Active Register +#define NVIC_PRI0 0xE000E400 // IRQ 0 to 3 Priority Register +#define NVIC_PRI1 0xE000E404 // IRQ 4 to 7 Priority Register +#define NVIC_PRI2 0xE000E408 // IRQ 8 to 11 Priority Register +#define NVIC_PRI3 0xE000E40C // IRQ 12 to 15 Priority Register +#define NVIC_PRI4 0xE000E410 // IRQ 16 to 19 Priority Register +#define NVIC_PRI5 0xE000E414 // IRQ 20 to 23 Priority Register +#define NVIC_PRI6 0xE000E418 // IRQ 24 to 27 Priority Register +#define NVIC_PRI7 0xE000E41C // IRQ 28 to 31 Priority Register +#define NVIC_PRI8 0xE000E420 // IRQ 32 to 35 Priority Register +#define NVIC_PRI9 0xE000E424 // IRQ 36 to 39 Priority Register +#define NVIC_PRI10 0xE000E428 // IRQ 40 to 43 Priority Register +#define NVIC_CPUID 0xE000ED00 // CPUID Base Register +#define NVIC_INT_CTRL 0xE000ED04 // Interrupt Control State Register +#define NVIC_VTABLE 0xE000ED08 // Vector Table Offset Register +#define NVIC_APINT 0xE000ED0C // App. Int & Reset Control Reg. +#define NVIC_SYS_CTRL 0xE000ED10 // System Control Register +#define NVIC_CFG_CTRL 0xE000ED14 // Configuration Control Register +#define NVIC_SYS_PRI1 0xE000ED18 // Sys. Handlers 4 to 7 Priority +#define NVIC_SYS_PRI2 0xE000ED1C // Sys. Handlers 8 to 11 Priority +#define NVIC_SYS_PRI3 0xE000ED20 // Sys. Handlers 12 to 15 Priority +#define NVIC_SYS_HND_CTRL 0xE000ED24 // System Handler Control and State +#define NVIC_FAULT_STAT 0xE000ED28 // Configurable Fault Status Reg. +#define NVIC_HFAULT_STAT 0xE000ED2C // Hard Fault Status Register +#define NVIC_DEBUG_STAT 0xE000ED30 // Debug Status Register +#define NVIC_MM_ADDR 0xE000ED34 // Mem Manage Address Register +#define NVIC_FAULT_ADDR 0xE000ED38 // Bus Fault Address Register +#define NVIC_MPU_TYPE 0xE000ED90 // MPU Type Register +#define NVIC_MPU_CTRL 0xE000ED94 // MPU Control Register +#define NVIC_MPU_NUMBER 0xE000ED98 // MPU Region Number Register +#define NVIC_MPU_BASE 0xE000ED9C // MPU Region Base Address Register +#define NVIC_MPU_ATTR 0xE000EDA0 // MPU Region Attribute & Size Reg. +#define NVIC_DBG_CTRL 0xE000EDF0 // Debug Control and Status Reg. +#define NVIC_DBG_XFER 0xE000EDF4 // Debug Core Reg. Transfer Select +#define NVIC_DBG_DATA 0xE000EDF8 // Debug Core Register Data +#define NVIC_DBG_INT 0xE000EDFC // Debug Reset Interrupt Control +#define NVIC_SW_TRIG 0xE000EF00 // Software Trigger Interrupt Reg. + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_INT_TYPE register. +// +//***************************************************************************** +#define NVIC_INT_TYPE_LINES_M 0x0000001F // Number of interrupt lines (x32) +#define NVIC_INT_TYPE_LINES_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CTRL register. +// +//***************************************************************************** +#define NVIC_ST_CTRL_COUNT 0x00010000 // Count flag +#define NVIC_ST_CTRL_CLK_SRC 0x00000004 // Clock Source +#define NVIC_ST_CTRL_INTEN 0x00000002 // Interrupt enable +#define NVIC_ST_CTRL_ENABLE 0x00000001 // Counter mode + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_RELOAD register. +// +//***************************************************************************** +#define NVIC_ST_RELOAD_M 0x00FFFFFF // Counter load value +#define NVIC_ST_RELOAD_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CURRENT register. +// +//***************************************************************************** +#define NVIC_ST_CURRENT_M 0x00FFFFFF // Counter current value +#define NVIC_ST_CURRENT_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CAL register. +// +//***************************************************************************** +#define NVIC_ST_CAL_NOREF 0x80000000 // No reference clock +#define NVIC_ST_CAL_SKEW 0x40000000 // Clock skew +#define NVIC_ST_CAL_ONEMS_M 0x00FFFFFF // 1ms reference value +#define NVIC_ST_CAL_ONEMS_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EN0 register. +// +//***************************************************************************** +#define NVIC_EN0_INT31 0x80000000 // Interrupt 31 enable +#define NVIC_EN0_INT30 0x40000000 // Interrupt 30 enable +#define NVIC_EN0_INT29 0x20000000 // Interrupt 29 enable +#define NVIC_EN0_INT28 0x10000000 // Interrupt 28 enable +#define NVIC_EN0_INT27 0x08000000 // Interrupt 27 enable +#define NVIC_EN0_INT26 0x04000000 // Interrupt 26 enable +#define NVIC_EN0_INT25 0x02000000 // Interrupt 25 enable +#define NVIC_EN0_INT24 0x01000000 // Interrupt 24 enable +#define NVIC_EN0_INT23 0x00800000 // Interrupt 23 enable +#define NVIC_EN0_INT22 0x00400000 // Interrupt 22 enable +#define NVIC_EN0_INT21 0x00200000 // Interrupt 21 enable +#define NVIC_EN0_INT20 0x00100000 // Interrupt 20 enable +#define NVIC_EN0_INT19 0x00080000 // Interrupt 19 enable +#define NVIC_EN0_INT18 0x00040000 // Interrupt 18 enable +#define NVIC_EN0_INT17 0x00020000 // Interrupt 17 enable +#define NVIC_EN0_INT16 0x00010000 // Interrupt 16 enable +#define NVIC_EN0_INT15 0x00008000 // Interrupt 15 enable +#define NVIC_EN0_INT14 0x00004000 // Interrupt 14 enable +#define NVIC_EN0_INT13 0x00002000 // Interrupt 13 enable +#define NVIC_EN0_INT12 0x00001000 // Interrupt 12 enable +#define NVIC_EN0_INT11 0x00000800 // Interrupt 11 enable +#define NVIC_EN0_INT10 0x00000400 // Interrupt 10 enable +#define NVIC_EN0_INT9 0x00000200 // Interrupt 9 enable +#define NVIC_EN0_INT8 0x00000100 // Interrupt 8 enable +#define NVIC_EN0_INT7 0x00000080 // Interrupt 7 enable +#define NVIC_EN0_INT6 0x00000040 // Interrupt 6 enable +#define NVIC_EN0_INT5 0x00000020 // Interrupt 5 enable +#define NVIC_EN0_INT4 0x00000010 // Interrupt 4 enable +#define NVIC_EN0_INT3 0x00000008 // Interrupt 3 enable +#define NVIC_EN0_INT2 0x00000004 // Interrupt 2 enable +#define NVIC_EN0_INT1 0x00000002 // Interrupt 1 enable +#define NVIC_EN0_INT0 0x00000001 // Interrupt 0 enable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EN1 register. +// +//***************************************************************************** +#define NVIC_EN1_INT59 0x08000000 // Interrupt 59 enable +#define NVIC_EN1_INT58 0x04000000 // Interrupt 58 enable +#define NVIC_EN1_INT57 0x02000000 // Interrupt 57 enable +#define NVIC_EN1_INT56 0x01000000 // Interrupt 56 enable +#define NVIC_EN1_INT55 0x00800000 // Interrupt 55 enable +#define NVIC_EN1_INT54 0x00400000 // Interrupt 54 enable +#define NVIC_EN1_INT53 0x00200000 // Interrupt 53 enable +#define NVIC_EN1_INT52 0x00100000 // Interrupt 52 enable +#define NVIC_EN1_INT51 0x00080000 // Interrupt 51 enable +#define NVIC_EN1_INT50 0x00040000 // Interrupt 50 enable +#define NVIC_EN1_INT49 0x00020000 // Interrupt 49 enable +#define NVIC_EN1_INT48 0x00010000 // Interrupt 48 enable +#define NVIC_EN1_INT47 0x00008000 // Interrupt 47 enable +#define NVIC_EN1_INT46 0x00004000 // Interrupt 46 enable +#define NVIC_EN1_INT45 0x00002000 // Interrupt 45 enable +#define NVIC_EN1_INT44 0x00001000 // Interrupt 44 enable +#define NVIC_EN1_INT43 0x00000800 // Interrupt 43 enable +#define NVIC_EN1_INT42 0x00000400 // Interrupt 42 enable +#define NVIC_EN1_INT41 0x00000200 // Interrupt 41 enable +#define NVIC_EN1_INT40 0x00000100 // Interrupt 40 enable +#define NVIC_EN1_INT39 0x00000080 // Interrupt 39 enable +#define NVIC_EN1_INT38 0x00000040 // Interrupt 38 enable +#define NVIC_EN1_INT37 0x00000020 // Interrupt 37 enable +#define NVIC_EN1_INT36 0x00000010 // Interrupt 36 enable +#define NVIC_EN1_INT35 0x00000008 // Interrupt 35 enable +#define NVIC_EN1_INT34 0x00000004 // Interrupt 34 enable +#define NVIC_EN1_INT33 0x00000002 // Interrupt 33 enable +#define NVIC_EN1_INT32 0x00000001 // Interrupt 32 enable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DIS0 register. +// +//***************************************************************************** +#define NVIC_DIS0_INT31 0x80000000 // Interrupt 31 disable +#define NVIC_DIS0_INT30 0x40000000 // Interrupt 30 disable +#define NVIC_DIS0_INT29 0x20000000 // Interrupt 29 disable +#define NVIC_DIS0_INT28 0x10000000 // Interrupt 28 disable +#define NVIC_DIS0_INT27 0x08000000 // Interrupt 27 disable +#define NVIC_DIS0_INT26 0x04000000 // Interrupt 26 disable +#define NVIC_DIS0_INT25 0x02000000 // Interrupt 25 disable +#define NVIC_DIS0_INT24 0x01000000 // Interrupt 24 disable +#define NVIC_DIS0_INT23 0x00800000 // Interrupt 23 disable +#define NVIC_DIS0_INT22 0x00400000 // Interrupt 22 disable +#define NVIC_DIS0_INT21 0x00200000 // Interrupt 21 disable +#define NVIC_DIS0_INT20 0x00100000 // Interrupt 20 disable +#define NVIC_DIS0_INT19 0x00080000 // Interrupt 19 disable +#define NVIC_DIS0_INT18 0x00040000 // Interrupt 18 disable +#define NVIC_DIS0_INT17 0x00020000 // Interrupt 17 disable +#define NVIC_DIS0_INT16 0x00010000 // Interrupt 16 disable +#define NVIC_DIS0_INT15 0x00008000 // Interrupt 15 disable +#define NVIC_DIS0_INT14 0x00004000 // Interrupt 14 disable +#define NVIC_DIS0_INT13 0x00002000 // Interrupt 13 disable +#define NVIC_DIS0_INT12 0x00001000 // Interrupt 12 disable +#define NVIC_DIS0_INT11 0x00000800 // Interrupt 11 disable +#define NVIC_DIS0_INT10 0x00000400 // Interrupt 10 disable +#define NVIC_DIS0_INT9 0x00000200 // Interrupt 9 disable +#define NVIC_DIS0_INT8 0x00000100 // Interrupt 8 disable +#define NVIC_DIS0_INT7 0x00000080 // Interrupt 7 disable +#define NVIC_DIS0_INT6 0x00000040 // Interrupt 6 disable +#define NVIC_DIS0_INT5 0x00000020 // Interrupt 5 disable +#define NVIC_DIS0_INT4 0x00000010 // Interrupt 4 disable +#define NVIC_DIS0_INT3 0x00000008 // Interrupt 3 disable +#define NVIC_DIS0_INT2 0x00000004 // Interrupt 2 disable +#define NVIC_DIS0_INT1 0x00000002 // Interrupt 1 disable +#define NVIC_DIS0_INT0 0x00000001 // Interrupt 0 disable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DIS1 register. +// +//***************************************************************************** +#define NVIC_DIS1_INT59 0x08000000 // Interrupt 59 disable +#define NVIC_DIS1_INT58 0x04000000 // Interrupt 58 disable +#define NVIC_DIS1_INT57 0x02000000 // Interrupt 57 disable +#define NVIC_DIS1_INT56 0x01000000 // Interrupt 56 disable +#define NVIC_DIS1_INT55 0x00800000 // Interrupt 55 disable +#define NVIC_DIS1_INT54 0x00400000 // Interrupt 54 disable +#define NVIC_DIS1_INT53 0x00200000 // Interrupt 53 disable +#define NVIC_DIS1_INT52 0x00100000 // Interrupt 52 disable +#define NVIC_DIS1_INT51 0x00080000 // Interrupt 51 disable +#define NVIC_DIS1_INT50 0x00040000 // Interrupt 50 disable +#define NVIC_DIS1_INT49 0x00020000 // Interrupt 49 disable +#define NVIC_DIS1_INT48 0x00010000 // Interrupt 48 disable +#define NVIC_DIS1_INT47 0x00008000 // Interrupt 47 disable +#define NVIC_DIS1_INT46 0x00004000 // Interrupt 46 disable +#define NVIC_DIS1_INT45 0x00002000 // Interrupt 45 disable +#define NVIC_DIS1_INT44 0x00001000 // Interrupt 44 disable +#define NVIC_DIS1_INT43 0x00000800 // Interrupt 43 disable +#define NVIC_DIS1_INT42 0x00000400 // Interrupt 42 disable +#define NVIC_DIS1_INT41 0x00000200 // Interrupt 41 disable +#define NVIC_DIS1_INT40 0x00000100 // Interrupt 40 disable +#define NVIC_DIS1_INT39 0x00000080 // Interrupt 39 disable +#define NVIC_DIS1_INT38 0x00000040 // Interrupt 38 disable +#define NVIC_DIS1_INT37 0x00000020 // Interrupt 37 disable +#define NVIC_DIS1_INT36 0x00000010 // Interrupt 36 disable +#define NVIC_DIS1_INT35 0x00000008 // Interrupt 35 disable +#define NVIC_DIS1_INT34 0x00000004 // Interrupt 34 disable +#define NVIC_DIS1_INT33 0x00000002 // Interrupt 33 disable +#define NVIC_DIS1_INT32 0x00000001 // Interrupt 32 disable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PEND0 register. +// +//***************************************************************************** +#define NVIC_PEND0_INT31 0x80000000 // Interrupt 31 pend +#define NVIC_PEND0_INT30 0x40000000 // Interrupt 30 pend +#define NVIC_PEND0_INT29 0x20000000 // Interrupt 29 pend +#define NVIC_PEND0_INT28 0x10000000 // Interrupt 28 pend +#define NVIC_PEND0_INT27 0x08000000 // Interrupt 27 pend +#define NVIC_PEND0_INT26 0x04000000 // Interrupt 26 pend +#define NVIC_PEND0_INT25 0x02000000 // Interrupt 25 pend +#define NVIC_PEND0_INT24 0x01000000 // Interrupt 24 pend +#define NVIC_PEND0_INT23 0x00800000 // Interrupt 23 pend +#define NVIC_PEND0_INT22 0x00400000 // Interrupt 22 pend +#define NVIC_PEND0_INT21 0x00200000 // Interrupt 21 pend +#define NVIC_PEND0_INT20 0x00100000 // Interrupt 20 pend +#define NVIC_PEND0_INT19 0x00080000 // Interrupt 19 pend +#define NVIC_PEND0_INT18 0x00040000 // Interrupt 18 pend +#define NVIC_PEND0_INT17 0x00020000 // Interrupt 17 pend +#define NVIC_PEND0_INT16 0x00010000 // Interrupt 16 pend +#define NVIC_PEND0_INT15 0x00008000 // Interrupt 15 pend +#define NVIC_PEND0_INT14 0x00004000 // Interrupt 14 pend +#define NVIC_PEND0_INT13 0x00002000 // Interrupt 13 pend +#define NVIC_PEND0_INT12 0x00001000 // Interrupt 12 pend +#define NVIC_PEND0_INT11 0x00000800 // Interrupt 11 pend +#define NVIC_PEND0_INT10 0x00000400 // Interrupt 10 pend +#define NVIC_PEND0_INT9 0x00000200 // Interrupt 9 pend +#define NVIC_PEND0_INT8 0x00000100 // Interrupt 8 pend +#define NVIC_PEND0_INT7 0x00000080 // Interrupt 7 pend +#define NVIC_PEND0_INT6 0x00000040 // Interrupt 6 pend +#define NVIC_PEND0_INT5 0x00000020 // Interrupt 5 pend +#define NVIC_PEND0_INT4 0x00000010 // Interrupt 4 pend +#define NVIC_PEND0_INT3 0x00000008 // Interrupt 3 pend +#define NVIC_PEND0_INT2 0x00000004 // Interrupt 2 pend +#define NVIC_PEND0_INT1 0x00000002 // Interrupt 1 pend +#define NVIC_PEND0_INT0 0x00000001 // Interrupt 0 pend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PEND1 register. +// +//***************************************************************************** +#define NVIC_PEND1_INT59 0x08000000 // Interrupt 59 pend +#define NVIC_PEND1_INT58 0x04000000 // Interrupt 58 pend +#define NVIC_PEND1_INT57 0x02000000 // Interrupt 57 pend +#define NVIC_PEND1_INT56 0x01000000 // Interrupt 56 pend +#define NVIC_PEND1_INT55 0x00800000 // Interrupt 55 pend +#define NVIC_PEND1_INT54 0x00400000 // Interrupt 54 pend +#define NVIC_PEND1_INT53 0x00200000 // Interrupt 53 pend +#define NVIC_PEND1_INT52 0x00100000 // Interrupt 52 pend +#define NVIC_PEND1_INT51 0x00080000 // Interrupt 51 pend +#define NVIC_PEND1_INT50 0x00040000 // Interrupt 50 pend +#define NVIC_PEND1_INT49 0x00020000 // Interrupt 49 pend +#define NVIC_PEND1_INT48 0x00010000 // Interrupt 48 pend +#define NVIC_PEND1_INT47 0x00008000 // Interrupt 47 pend +#define NVIC_PEND1_INT46 0x00004000 // Interrupt 46 pend +#define NVIC_PEND1_INT45 0x00002000 // Interrupt 45 pend +#define NVIC_PEND1_INT44 0x00001000 // Interrupt 44 pend +#define NVIC_PEND1_INT43 0x00000800 // Interrupt 43 pend +#define NVIC_PEND1_INT42 0x00000400 // Interrupt 42 pend +#define NVIC_PEND1_INT41 0x00000200 // Interrupt 41 pend +#define NVIC_PEND1_INT40 0x00000100 // Interrupt 40 pend +#define NVIC_PEND1_INT39 0x00000080 // Interrupt 39 pend +#define NVIC_PEND1_INT38 0x00000040 // Interrupt 38 pend +#define NVIC_PEND1_INT37 0x00000020 // Interrupt 37 pend +#define NVIC_PEND1_INT36 0x00000010 // Interrupt 36 pend +#define NVIC_PEND1_INT35 0x00000008 // Interrupt 35 pend +#define NVIC_PEND1_INT34 0x00000004 // Interrupt 34 pend +#define NVIC_PEND1_INT33 0x00000002 // Interrupt 33 pend +#define NVIC_PEND1_INT32 0x00000001 // Interrupt 32 pend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_UNPEND0 register. +// +//***************************************************************************** +#define NVIC_UNPEND0_INT31 0x80000000 // Interrupt 31 unpend +#define NVIC_UNPEND0_INT30 0x40000000 // Interrupt 30 unpend +#define NVIC_UNPEND0_INT29 0x20000000 // Interrupt 29 unpend +#define NVIC_UNPEND0_INT28 0x10000000 // Interrupt 28 unpend +#define NVIC_UNPEND0_INT27 0x08000000 // Interrupt 27 unpend +#define NVIC_UNPEND0_INT26 0x04000000 // Interrupt 26 unpend +#define NVIC_UNPEND0_INT25 0x02000000 // Interrupt 25 unpend +#define NVIC_UNPEND0_INT24 0x01000000 // Interrupt 24 unpend +#define NVIC_UNPEND0_INT23 0x00800000 // Interrupt 23 unpend +#define NVIC_UNPEND0_INT22 0x00400000 // Interrupt 22 unpend +#define NVIC_UNPEND0_INT21 0x00200000 // Interrupt 21 unpend +#define NVIC_UNPEND0_INT20 0x00100000 // Interrupt 20 unpend +#define NVIC_UNPEND0_INT19 0x00080000 // Interrupt 19 unpend +#define NVIC_UNPEND0_INT18 0x00040000 // Interrupt 18 unpend +#define NVIC_UNPEND0_INT17 0x00020000 // Interrupt 17 unpend +#define NVIC_UNPEND0_INT16 0x00010000 // Interrupt 16 unpend +#define NVIC_UNPEND0_INT15 0x00008000 // Interrupt 15 unpend +#define NVIC_UNPEND0_INT14 0x00004000 // Interrupt 14 unpend +#define NVIC_UNPEND0_INT13 0x00002000 // Interrupt 13 unpend +#define NVIC_UNPEND0_INT12 0x00001000 // Interrupt 12 unpend +#define NVIC_UNPEND0_INT11 0x00000800 // Interrupt 11 unpend +#define NVIC_UNPEND0_INT10 0x00000400 // Interrupt 10 unpend +#define NVIC_UNPEND0_INT9 0x00000200 // Interrupt 9 unpend +#define NVIC_UNPEND0_INT8 0x00000100 // Interrupt 8 unpend +#define NVIC_UNPEND0_INT7 0x00000080 // Interrupt 7 unpend +#define NVIC_UNPEND0_INT6 0x00000040 // Interrupt 6 unpend +#define NVIC_UNPEND0_INT5 0x00000020 // Interrupt 5 unpend +#define NVIC_UNPEND0_INT4 0x00000010 // Interrupt 4 unpend +#define NVIC_UNPEND0_INT3 0x00000008 // Interrupt 3 unpend +#define NVIC_UNPEND0_INT2 0x00000004 // Interrupt 2 unpend +#define NVIC_UNPEND0_INT1 0x00000002 // Interrupt 1 unpend +#define NVIC_UNPEND0_INT0 0x00000001 // Interrupt 0 unpend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_UNPEND1 register. +// +//***************************************************************************** +#define NVIC_UNPEND1_INT59 0x08000000 // Interrupt 59 unpend +#define NVIC_UNPEND1_INT58 0x04000000 // Interrupt 58 unpend +#define NVIC_UNPEND1_INT57 0x02000000 // Interrupt 57 unpend +#define NVIC_UNPEND1_INT56 0x01000000 // Interrupt 56 unpend +#define NVIC_UNPEND1_INT55 0x00800000 // Interrupt 55 unpend +#define NVIC_UNPEND1_INT54 0x00400000 // Interrupt 54 unpend +#define NVIC_UNPEND1_INT53 0x00200000 // Interrupt 53 unpend +#define NVIC_UNPEND1_INT52 0x00100000 // Interrupt 52 unpend +#define NVIC_UNPEND1_INT51 0x00080000 // Interrupt 51 unpend +#define NVIC_UNPEND1_INT50 0x00040000 // Interrupt 50 unpend +#define NVIC_UNPEND1_INT49 0x00020000 // Interrupt 49 unpend +#define NVIC_UNPEND1_INT48 0x00010000 // Interrupt 48 unpend +#define NVIC_UNPEND1_INT47 0x00008000 // Interrupt 47 unpend +#define NVIC_UNPEND1_INT46 0x00004000 // Interrupt 46 unpend +#define NVIC_UNPEND1_INT45 0x00002000 // Interrupt 45 unpend +#define NVIC_UNPEND1_INT44 0x00001000 // Interrupt 44 unpend +#define NVIC_UNPEND1_INT43 0x00000800 // Interrupt 43 unpend +#define NVIC_UNPEND1_INT42 0x00000400 // Interrupt 42 unpend +#define NVIC_UNPEND1_INT41 0x00000200 // Interrupt 41 unpend +#define NVIC_UNPEND1_INT40 0x00000100 // Interrupt 40 unpend +#define NVIC_UNPEND1_INT39 0x00000080 // Interrupt 39 unpend +#define NVIC_UNPEND1_INT38 0x00000040 // Interrupt 38 unpend +#define NVIC_UNPEND1_INT37 0x00000020 // Interrupt 37 unpend +#define NVIC_UNPEND1_INT36 0x00000010 // Interrupt 36 unpend +#define NVIC_UNPEND1_INT35 0x00000008 // Interrupt 35 unpend +#define NVIC_UNPEND1_INT34 0x00000004 // Interrupt 34 unpend +#define NVIC_UNPEND1_INT33 0x00000002 // Interrupt 33 unpend +#define NVIC_UNPEND1_INT32 0x00000001 // Interrupt 32 unpend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ACTIVE0 register. +// +//***************************************************************************** +#define NVIC_ACTIVE0_INT31 0x80000000 // Interrupt 31 active +#define NVIC_ACTIVE0_INT30 0x40000000 // Interrupt 30 active +#define NVIC_ACTIVE0_INT29 0x20000000 // Interrupt 29 active +#define NVIC_ACTIVE0_INT28 0x10000000 // Interrupt 28 active +#define NVIC_ACTIVE0_INT27 0x08000000 // Interrupt 27 active +#define NVIC_ACTIVE0_INT26 0x04000000 // Interrupt 26 active +#define NVIC_ACTIVE0_INT25 0x02000000 // Interrupt 25 active +#define NVIC_ACTIVE0_INT24 0x01000000 // Interrupt 24 active +#define NVIC_ACTIVE0_INT23 0x00800000 // Interrupt 23 active +#define NVIC_ACTIVE0_INT22 0x00400000 // Interrupt 22 active +#define NVIC_ACTIVE0_INT21 0x00200000 // Interrupt 21 active +#define NVIC_ACTIVE0_INT20 0x00100000 // Interrupt 20 active +#define NVIC_ACTIVE0_INT19 0x00080000 // Interrupt 19 active +#define NVIC_ACTIVE0_INT18 0x00040000 // Interrupt 18 active +#define NVIC_ACTIVE0_INT17 0x00020000 // Interrupt 17 active +#define NVIC_ACTIVE0_INT16 0x00010000 // Interrupt 16 active +#define NVIC_ACTIVE0_INT15 0x00008000 // Interrupt 15 active +#define NVIC_ACTIVE0_INT14 0x00004000 // Interrupt 14 active +#define NVIC_ACTIVE0_INT13 0x00002000 // Interrupt 13 active +#define NVIC_ACTIVE0_INT12 0x00001000 // Interrupt 12 active +#define NVIC_ACTIVE0_INT11 0x00000800 // Interrupt 11 active +#define NVIC_ACTIVE0_INT10 0x00000400 // Interrupt 10 active +#define NVIC_ACTIVE0_INT9 0x00000200 // Interrupt 9 active +#define NVIC_ACTIVE0_INT8 0x00000100 // Interrupt 8 active +#define NVIC_ACTIVE0_INT7 0x00000080 // Interrupt 7 active +#define NVIC_ACTIVE0_INT6 0x00000040 // Interrupt 6 active +#define NVIC_ACTIVE0_INT5 0x00000020 // Interrupt 5 active +#define NVIC_ACTIVE0_INT4 0x00000010 // Interrupt 4 active +#define NVIC_ACTIVE0_INT3 0x00000008 // Interrupt 3 active +#define NVIC_ACTIVE0_INT2 0x00000004 // Interrupt 2 active +#define NVIC_ACTIVE0_INT1 0x00000002 // Interrupt 1 active +#define NVIC_ACTIVE0_INT0 0x00000001 // Interrupt 0 active + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ACTIVE1 register. +// +//***************************************************************************** +#define NVIC_ACTIVE1_INT59 0x08000000 // Interrupt 59 active +#define NVIC_ACTIVE1_INT58 0x04000000 // Interrupt 58 active +#define NVIC_ACTIVE1_INT57 0x02000000 // Interrupt 57 active +#define NVIC_ACTIVE1_INT56 0x01000000 // Interrupt 56 active +#define NVIC_ACTIVE1_INT55 0x00800000 // Interrupt 55 active +#define NVIC_ACTIVE1_INT54 0x00400000 // Interrupt 54 active +#define NVIC_ACTIVE1_INT53 0x00200000 // Interrupt 53 active +#define NVIC_ACTIVE1_INT52 0x00100000 // Interrupt 52 active +#define NVIC_ACTIVE1_INT51 0x00080000 // Interrupt 51 active +#define NVIC_ACTIVE1_INT50 0x00040000 // Interrupt 50 active +#define NVIC_ACTIVE1_INT49 0x00020000 // Interrupt 49 active +#define NVIC_ACTIVE1_INT48 0x00010000 // Interrupt 48 active +#define NVIC_ACTIVE1_INT47 0x00008000 // Interrupt 47 active +#define NVIC_ACTIVE1_INT46 0x00004000 // Interrupt 46 active +#define NVIC_ACTIVE1_INT45 0x00002000 // Interrupt 45 active +#define NVIC_ACTIVE1_INT44 0x00001000 // Interrupt 44 active +#define NVIC_ACTIVE1_INT43 0x00000800 // Interrupt 43 active +#define NVIC_ACTIVE1_INT42 0x00000400 // Interrupt 42 active +#define NVIC_ACTIVE1_INT41 0x00000200 // Interrupt 41 active +#define NVIC_ACTIVE1_INT40 0x00000100 // Interrupt 40 active +#define NVIC_ACTIVE1_INT39 0x00000080 // Interrupt 39 active +#define NVIC_ACTIVE1_INT38 0x00000040 // Interrupt 38 active +#define NVIC_ACTIVE1_INT37 0x00000020 // Interrupt 37 active +#define NVIC_ACTIVE1_INT36 0x00000010 // Interrupt 36 active +#define NVIC_ACTIVE1_INT35 0x00000008 // Interrupt 35 active +#define NVIC_ACTIVE1_INT34 0x00000004 // Interrupt 34 active +#define NVIC_ACTIVE1_INT33 0x00000002 // Interrupt 33 active +#define NVIC_ACTIVE1_INT32 0x00000001 // Interrupt 32 active + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI0 register. +// +//***************************************************************************** +#define NVIC_PRI0_INT3_M 0xFF000000 // Interrupt 3 priority mask +#define NVIC_PRI0_INT2_M 0x00FF0000 // Interrupt 2 priority mask +#define NVIC_PRI0_INT1_M 0x0000FF00 // Interrupt 1 priority mask +#define NVIC_PRI0_INT0_M 0x000000FF // Interrupt 0 priority mask +#define NVIC_PRI0_INT3_S 24 +#define NVIC_PRI0_INT2_S 16 +#define NVIC_PRI0_INT1_S 8 +#define NVIC_PRI0_INT0_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI1 register. +// +//***************************************************************************** +#define NVIC_PRI1_INT7_M 0xFF000000 // Interrupt 7 priority mask +#define NVIC_PRI1_INT6_M 0x00FF0000 // Interrupt 6 priority mask +#define NVIC_PRI1_INT5_M 0x0000FF00 // Interrupt 5 priority mask +#define NVIC_PRI1_INT4_M 0x000000FF // Interrupt 4 priority mask +#define NVIC_PRI1_INT7_S 24 +#define NVIC_PRI1_INT6_S 16 +#define NVIC_PRI1_INT5_S 8 +#define NVIC_PRI1_INT4_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI2 register. +// +//***************************************************************************** +#define NVIC_PRI2_INT11_M 0xFF000000 // Interrupt 11 priority mask +#define NVIC_PRI2_INT10_M 0x00FF0000 // Interrupt 10 priority mask +#define NVIC_PRI2_INT9_M 0x0000FF00 // Interrupt 9 priority mask +#define NVIC_PRI2_INT8_M 0x000000FF // Interrupt 8 priority mask +#define NVIC_PRI2_INT11_S 24 +#define NVIC_PRI2_INT10_S 16 +#define NVIC_PRI2_INT9_S 8 +#define NVIC_PRI2_INT8_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI3 register. +// +//***************************************************************************** +#define NVIC_PRI3_INT15_M 0xFF000000 // Interrupt 15 priority mask +#define NVIC_PRI3_INT14_M 0x00FF0000 // Interrupt 14 priority mask +#define NVIC_PRI3_INT13_M 0x0000FF00 // Interrupt 13 priority mask +#define NVIC_PRI3_INT12_M 0x000000FF // Interrupt 12 priority mask +#define NVIC_PRI3_INT15_S 24 +#define NVIC_PRI3_INT14_S 16 +#define NVIC_PRI3_INT13_S 8 +#define NVIC_PRI3_INT12_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI4 register. +// +//***************************************************************************** +#define NVIC_PRI4_INT19_M 0xFF000000 // Interrupt 19 priority mask +#define NVIC_PRI4_INT18_M 0x00FF0000 // Interrupt 18 priority mask +#define NVIC_PRI4_INT17_M 0x0000FF00 // Interrupt 17 priority mask +#define NVIC_PRI4_INT16_M 0x000000FF // Interrupt 16 priority mask +#define NVIC_PRI4_INT19_S 24 +#define NVIC_PRI4_INT18_S 16 +#define NVIC_PRI4_INT17_S 8 +#define NVIC_PRI4_INT16_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI5 register. +// +//***************************************************************************** +#define NVIC_PRI5_INT23_M 0xFF000000 // Interrupt 23 priority mask +#define NVIC_PRI5_INT22_M 0x00FF0000 // Interrupt 22 priority mask +#define NVIC_PRI5_INT21_M 0x0000FF00 // Interrupt 21 priority mask +#define NVIC_PRI5_INT20_M 0x000000FF // Interrupt 20 priority mask +#define NVIC_PRI5_INT23_S 24 +#define NVIC_PRI5_INT22_S 16 +#define NVIC_PRI5_INT21_S 8 +#define NVIC_PRI5_INT20_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI6 register. +// +//***************************************************************************** +#define NVIC_PRI6_INT27_M 0xFF000000 // Interrupt 27 priority mask +#define NVIC_PRI6_INT26_M 0x00FF0000 // Interrupt 26 priority mask +#define NVIC_PRI6_INT25_M 0x0000FF00 // Interrupt 25 priority mask +#define NVIC_PRI6_INT24_M 0x000000FF // Interrupt 24 priority mask +#define NVIC_PRI6_INT27_S 24 +#define NVIC_PRI6_INT26_S 16 +#define NVIC_PRI6_INT25_S 8 +#define NVIC_PRI6_INT24_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI7 register. +// +//***************************************************************************** +#define NVIC_PRI7_INT31_M 0xFF000000 // Interrupt 31 priority mask +#define NVIC_PRI7_INT30_M 0x00FF0000 // Interrupt 30 priority mask +#define NVIC_PRI7_INT29_M 0x0000FF00 // Interrupt 29 priority mask +#define NVIC_PRI7_INT28_M 0x000000FF // Interrupt 28 priority mask +#define NVIC_PRI7_INT31_S 24 +#define NVIC_PRI7_INT30_S 16 +#define NVIC_PRI7_INT29_S 8 +#define NVIC_PRI7_INT28_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI8 register. +// +//***************************************************************************** +#define NVIC_PRI8_INT35_M 0xFF000000 // Interrupt 35 priority mask +#define NVIC_PRI8_INT34_M 0x00FF0000 // Interrupt 34 priority mask +#define NVIC_PRI8_INT33_M 0x0000FF00 // Interrupt 33 priority mask +#define NVIC_PRI8_INT32_M 0x000000FF // Interrupt 32 priority mask +#define NVIC_PRI8_INT35_S 24 +#define NVIC_PRI8_INT34_S 16 +#define NVIC_PRI8_INT33_S 8 +#define NVIC_PRI8_INT32_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI9 register. +// +//***************************************************************************** +#define NVIC_PRI9_INT39_M 0xFF000000 // Interrupt 39 priority mask +#define NVIC_PRI9_INT38_M 0x00FF0000 // Interrupt 38 priority mask +#define NVIC_PRI9_INT37_M 0x0000FF00 // Interrupt 37 priority mask +#define NVIC_PRI9_INT36_M 0x000000FF // Interrupt 36 priority mask +#define NVIC_PRI9_INT39_S 24 +#define NVIC_PRI9_INT38_S 16 +#define NVIC_PRI9_INT37_S 8 +#define NVIC_PRI9_INT36_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI10 register. +// +//***************************************************************************** +#define NVIC_PRI10_INT43_M 0xFF000000 // Interrupt 43 priority mask +#define NVIC_PRI10_INT42_M 0x00FF0000 // Interrupt 42 priority mask +#define NVIC_PRI10_INT41_M 0x0000FF00 // Interrupt 41 priority mask +#define NVIC_PRI10_INT40_M 0x000000FF // Interrupt 40 priority mask +#define NVIC_PRI10_INT43_S 24 +#define NVIC_PRI10_INT42_S 16 +#define NVIC_PRI10_INT41_S 8 +#define NVIC_PRI10_INT40_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_CPUID register. +// +//***************************************************************************** +#define NVIC_CPUID_IMP_M 0xFF000000 // Implementer +#define NVIC_CPUID_VAR_M 0x00F00000 // Variant +#define NVIC_CPUID_PARTNO_M 0x0000FFF0 // Processor part number +#define NVIC_CPUID_REV_M 0x0000000F // Revision + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_INT_CTRL register. +// +//***************************************************************************** +#define NVIC_INT_CTRL_NMI_SET 0x80000000 // Pend a NMI +#define NVIC_INT_CTRL_PEND_SV 0x10000000 // Pend a PendSV +#define NVIC_INT_CTRL_UNPEND_SV 0x08000000 // Unpend a PendSV +#define NVIC_INT_CTRL_ISR_PRE 0x00800000 // Debug interrupt handling +#define NVIC_INT_CTRL_ISR_PEND 0x00400000 // Debug interrupt pending +#define NVIC_INT_CTRL_VEC_PEN_M 0x003FF000 // Highest pending exception +#define NVIC_INT_CTRL_RET_BASE 0x00000800 // Return to base +#define NVIC_INT_CTRL_VEC_ACT_M 0x000003FF // Current active exception +#define NVIC_INT_CTRL_VEC_PEN_S 12 +#define NVIC_INT_CTRL_VEC_ACT_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_VTABLE register. +// +//***************************************************************************** +#define NVIC_VTABLE_BASE 0x20000000 // Vector table base +#define NVIC_VTABLE_OFFSET_M 0x1FFFFF00 // Vector table offset +#define NVIC_VTABLE_OFFSET_S 8 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_APINT register. +// +//***************************************************************************** +#define NVIC_APINT_VECTKEY_M 0xFFFF0000 // Vector key mask +#define NVIC_APINT_VECTKEY 0x05FA0000 // Vector key +#define NVIC_APINT_ENDIANESS 0x00008000 // Data endianess +#define NVIC_APINT_PRIGROUP_M 0x00000700 // Priority group +#define NVIC_APINT_PRIGROUP_7_1 0x00000000 // Priority group 7.1 split +#define NVIC_APINT_PRIGROUP_6_2 0x00000100 // Priority group 6.2 split +#define NVIC_APINT_PRIGROUP_5_3 0x00000200 // Priority group 5.3 split +#define NVIC_APINT_PRIGROUP_4_4 0x00000300 // Priority group 4.4 split +#define NVIC_APINT_PRIGROUP_3_5 0x00000400 // Priority group 3.5 split +#define NVIC_APINT_PRIGROUP_2_6 0x00000500 // Priority group 2.6 split +#define NVIC_APINT_PRIGROUP_1_7 0x00000600 // Priority group 1.7 split +#define NVIC_APINT_PRIGROUP_0_8 0x00000700 // Priority group 0.8 split +#define NVIC_APINT_SYSRESETREQ 0x00000004 // System reset request +#define NVIC_APINT_VECT_CLR_ACT 0x00000002 // Clear active NMI/fault info +#define NVIC_APINT_VECT_RESET 0x00000001 // System reset + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_CTRL register. +// +//***************************************************************************** +#define NVIC_SYS_CTRL_SEVONPEND 0x00000010 // Wakeup on pend +#define NVIC_SYS_CTRL_SLEEPDEEP 0x00000004 // Deep sleep enable +#define NVIC_SYS_CTRL_SLEEPEXIT 0x00000002 // Sleep on ISR exit + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_CFG_CTRL register. +// +//***************************************************************************** +#define NVIC_CFG_CTRL_BFHFNMIGN 0x00000100 // Ignore bus fault in NMI/fault +#define NVIC_CFG_CTRL_DIV0 0x00000010 // Trap on divide by 0 +#define NVIC_CFG_CTRL_UNALIGNED 0x00000008 // Trap on unaligned access +#define NVIC_CFG_CTRL_DEEP_PEND 0x00000004 // Allow deep interrupt trigger +#define NVIC_CFG_CTRL_MAIN_PEND 0x00000002 // Allow main interrupt trigger +#define NVIC_CFG_CTRL_BASE_THR 0x00000001 // Thread state control + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI1 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI1_RES_M 0xFF000000 // Priority of reserved handler +#define NVIC_SYS_PRI1_USAGE_M 0x00FF0000 // Priority of usage fault handler +#define NVIC_SYS_PRI1_BUS_M 0x0000FF00 // Priority of bus fault handler +#define NVIC_SYS_PRI1_MEM_M 0x000000FF // Priority of mem manage handler +#define NVIC_SYS_PRI1_USAGE_S 16 +#define NVIC_SYS_PRI1_BUS_S 8 +#define NVIC_SYS_PRI1_MEM_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI2 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI2_SVC_M 0xFF000000 // Priority of SVCall handler +#define NVIC_SYS_PRI2_RES_M 0x00FFFFFF // Priority of reserved handlers +#define NVIC_SYS_PRI2_SVC_S 24 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI3 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI3_TICK_M 0xFF000000 // Priority of Sys Tick handler +#define NVIC_SYS_PRI3_PENDSV_M 0x00FF0000 // Priority of PendSV handler +#define NVIC_SYS_PRI3_RES_M 0x0000FF00 // Priority of reserved handler +#define NVIC_SYS_PRI3_DEBUG_M 0x000000FF // Priority of debug handler +#define NVIC_SYS_PRI3_TICK_S 24 +#define NVIC_SYS_PRI3_PENDSV_S 16 +#define NVIC_SYS_PRI3_DEBUG_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_HND_CTRL register. +// +//***************************************************************************** +#define NVIC_SYS_HND_CTRL_USAGE 0x00040000 // Usage fault enable +#define NVIC_SYS_HND_CTRL_BUS 0x00020000 // Bus fault enable +#define NVIC_SYS_HND_CTRL_MEM 0x00010000 // Mem manage fault enable +#define NVIC_SYS_HND_CTRL_SVC 0x00008000 // SVCall is pended +#define NVIC_SYS_HND_CTRL_BUSP 0x00004000 // Bus fault is pended +#define NVIC_SYS_HND_CTRL_TICK 0x00000800 // Sys tick is active +#define NVIC_SYS_HND_CTRL_PNDSV 0x00000400 // PendSV is active +#define NVIC_SYS_HND_CTRL_MON 0x00000100 // Monitor is active +#define NVIC_SYS_HND_CTRL_SVCA 0x00000080 // SVCall is active +#define NVIC_SYS_HND_CTRL_USGA 0x00000008 // Usage fault is active +#define NVIC_SYS_HND_CTRL_BUSA 0x00000002 // Bus fault is active +#define NVIC_SYS_HND_CTRL_MEMA 0x00000001 // Mem manage is active + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_FAULT_STAT register. +// +//***************************************************************************** +#define NVIC_FAULT_STAT_DIV0 0x02000000 // Divide by zero fault +#define NVIC_FAULT_STAT_UNALIGN 0x01000000 // Unaligned access fault +#define NVIC_FAULT_STAT_NOCP 0x00080000 // No coprocessor fault +#define NVIC_FAULT_STAT_INVPC 0x00040000 // Invalid PC fault +#define NVIC_FAULT_STAT_INVSTAT 0x00020000 // Invalid state fault +#define NVIC_FAULT_STAT_UNDEF 0x00010000 // Undefined instruction fault +#define NVIC_FAULT_STAT_BFARV 0x00008000 // BFAR is valid +#define NVIC_FAULT_STAT_BSTKE 0x00001000 // Stack bus fault +#define NVIC_FAULT_STAT_BUSTKE 0x00000800 // Unstack bus fault +#define NVIC_FAULT_STAT_IMPRE 0x00000400 // Imprecise data bus error +#define NVIC_FAULT_STAT_PRECISE 0x00000200 // Precise data bus error +#define NVIC_FAULT_STAT_IBUS 0x00000100 // Instruction bus fault +#define NVIC_FAULT_STAT_MMARV 0x00000080 // MMAR is valid +#define NVIC_FAULT_STAT_MSTKE 0x00000010 // Stack access violation +#define NVIC_FAULT_STAT_MUSTKE 0x00000008 // Unstack access violation +#define NVIC_FAULT_STAT_DERR 0x00000002 // Data access violation +#define NVIC_FAULT_STAT_IERR 0x00000001 // Instruction access violation + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_HFAULT_STAT register. +// +//***************************************************************************** +#define NVIC_HFAULT_STAT_DBG 0x80000000 // Debug event +#define NVIC_HFAULT_STAT_FORCED 0x40000000 // Cannot execute fault handler +#define NVIC_HFAULT_STAT_VECT 0x00000002 // Vector table read fault + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DEBUG_STAT register. +// +//***************************************************************************** +#define NVIC_DEBUG_STAT_EXTRNL 0x00000010 // EDBGRQ asserted +#define NVIC_DEBUG_STAT_VCATCH 0x00000008 // Vector catch +#define NVIC_DEBUG_STAT_DWTTRAP 0x00000004 // DWT match +#define NVIC_DEBUG_STAT_BKPT 0x00000002 // Breakpoint instruction +#define NVIC_DEBUG_STAT_HALTED 0x00000001 // Halt request + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MM_ADDR register. +// +//***************************************************************************** +#define NVIC_MM_ADDR_M 0xFFFFFFFF // Data fault address +#define NVIC_MM_ADDR_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_FAULT_ADDR register. +// +//***************************************************************************** +#define NVIC_FAULT_ADDR_M 0xFFFFFFFF // Data bus fault address +#define NVIC_FAULT_ADDR_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EXC_STACK register. +// +//***************************************************************************** +#define NVIC_EXC_STACK_DEEP 0x00000001 // Exception stack + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EXC_NUM register. +// +//***************************************************************************** +#define NVIC_EXC_NUM_M 0x000003FF // Exception number +#define NVIC_EXC_NUM_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_COPRO register. +// +//***************************************************************************** +#define NVIC_COPRO_15_M 0xC0000000 // Coprocessor 15 access mask +#define NVIC_COPRO_15_DENIED 0x00000000 // Coprocessor 15 access denied +#define NVIC_COPRO_15_PRIV 0x40000000 // Coprocessor 15 privileged addess +#define NVIC_COPRO_15_FULL 0xC0000000 // Coprocessor 15 full access +#define NVIC_COPRO_14_M 0x30000000 // Coprocessor 14 access mask +#define NVIC_COPRO_14_DENIED 0x00000000 // Coprocessor 14 access denied +#define NVIC_COPRO_14_PRIV 0x10000000 // Coprocessor 14 privileged addess +#define NVIC_COPRO_14_FULL 0x30000000 // Coprocessor 14 full access +#define NVIC_COPRO_13_M 0x0C000000 // Coprocessor 13 access mask +#define NVIC_COPRO_13_DENIED 0x00000000 // Coprocessor 13 access denied +#define NVIC_COPRO_13_PRIV 0x04000000 // Coprocessor 13 privileged addess +#define NVIC_COPRO_13_FULL 0x0C000000 // Coprocessor 13 full access +#define NVIC_COPRO_12_M 0x03000000 // Coprocessor 12 access mask +#define NVIC_COPRO_12_DENIED 0x00000000 // Coprocessor 12 access denied +#define NVIC_COPRO_12_PRIV 0x01000000 // Coprocessor 12 privileged addess +#define NVIC_COPRO_12_FULL 0x03000000 // Coprocessor 12 full access +#define NVIC_COPRO_11_M 0x00C00000 // Coprocessor 11 access mask +#define NVIC_COPRO_11_DENIED 0x00000000 // Coprocessor 11 access denied +#define NVIC_COPRO_11_PRIV 0x00400000 // Coprocessor 11 privileged addess +#define NVIC_COPRO_11_FULL 0x00C00000 // Coprocessor 11 full access +#define NVIC_COPRO_10_M 0x00300000 // Coprocessor 10 access mask +#define NVIC_COPRO_10_DENIED 0x00000000 // Coprocessor 10 access denied +#define NVIC_COPRO_10_PRIV 0x00100000 // Coprocessor 10 privileged addess +#define NVIC_COPRO_10_FULL 0x00300000 // Coprocessor 10 full access +#define NVIC_COPRO_9_M 0x000C0000 // Coprocessor 9 access mask +#define NVIC_COPRO_9_DENIED 0x00000000 // Coprocessor 9 access denied +#define NVIC_COPRO_9_PRIV 0x00040000 // Coprocessor 9 privileged addess +#define NVIC_COPRO_9_FULL 0x000C0000 // Coprocessor 9 full access +#define NVIC_COPRO_8_M 0x00030000 // Coprocessor 8 access mask +#define NVIC_COPRO_8_DENIED 0x00000000 // Coprocessor 8 access denied +#define NVIC_COPRO_8_PRIV 0x00010000 // Coprocessor 8 privileged addess +#define NVIC_COPRO_8_FULL 0x00030000 // Coprocessor 8 full access +#define NVIC_COPRO_7_M 0x0000C000 // Coprocessor 7 access mask +#define NVIC_COPRO_7_DENIED 0x00000000 // Coprocessor 7 access denied +#define NVIC_COPRO_7_PRIV 0x00004000 // Coprocessor 7 privileged addess +#define NVIC_COPRO_7_FULL 0x0000C000 // Coprocessor 7 full access +#define NVIC_COPRO_6_M 0x00003000 // Coprocessor 6 access mask +#define NVIC_COPRO_6_DENIED 0x00000000 // Coprocessor 6 access denied +#define NVIC_COPRO_6_PRIV 0x00001000 // Coprocessor 6 privileged addess +#define NVIC_COPRO_6_FULL 0x00003000 // Coprocessor 6 full access +#define NVIC_COPRO_5_M 0x00000C00 // Coprocessor 5 access mask +#define NVIC_COPRO_5_DENIED 0x00000000 // Coprocessor 5 access denied +#define NVIC_COPRO_5_PRIV 0x00000400 // Coprocessor 5 privileged addess +#define NVIC_COPRO_5_FULL 0x00000C00 // Coprocessor 5 full access +#define NVIC_COPRO_4_M 0x00000300 // Coprocessor 4 access mask +#define NVIC_COPRO_4_DENIED 0x00000000 // Coprocessor 4 access denied +#define NVIC_COPRO_4_PRIV 0x00000100 // Coprocessor 4 privileged addess +#define NVIC_COPRO_4_FULL 0x00000300 // Coprocessor 4 full access +#define NVIC_COPRO_3_M 0x000000C0 // Coprocessor 3 access mask +#define NVIC_COPRO_3_DENIED 0x00000000 // Coprocessor 3 access denied +#define NVIC_COPRO_3_PRIV 0x00000040 // Coprocessor 3 privileged addess +#define NVIC_COPRO_3_FULL 0x000000C0 // Coprocessor 3 full access +#define NVIC_COPRO_2_M 0x00000030 // Coprocessor 2 access mask +#define NVIC_COPRO_2_DENIED 0x00000000 // Coprocessor 2 access denied +#define NVIC_COPRO_2_PRIV 0x00000010 // Coprocessor 2 privileged addess +#define NVIC_COPRO_2_FULL 0x00000030 // Coprocessor 2 full access +#define NVIC_COPRO_1_M 0x0000000C // Coprocessor 1 access mask +#define NVIC_COPRO_1_DENIED 0x00000000 // Coprocessor 1 access denied +#define NVIC_COPRO_1_PRIV 0x00000004 // Coprocessor 1 privileged addess +#define NVIC_COPRO_1_FULL 0x0000000C // Coprocessor 1 full access +#define NVIC_COPRO_0_M 0x00000003 // Coprocessor 0 access mask +#define NVIC_COPRO_0_DENIED 0x00000000 // Coprocessor 0 access denied +#define NVIC_COPRO_0_PRIV 0x00000001 // Coprocessor 0 privileged addess +#define NVIC_COPRO_0_FULL 0x00000003 // Coprocessor 0 full access + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_TYPE register. +// +//***************************************************************************** +#define NVIC_MPU_TYPE_IREGION_M 0x00FF0000 // Number of I regions +#define NVIC_MPU_TYPE_DREGION_M 0x0000FF00 // Number of D regions +#define NVIC_MPU_TYPE_SEPARATE 0x00000001 // Separate or unified MPU +#define NVIC_MPU_TYPE_IREGION_S 16 +#define NVIC_MPU_TYPE_DREGION_S 8 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_CTRL register. +// +//***************************************************************************** +#define NVIC_MPU_CTRL_HFNMIENA 0x00000002 // MPU enabled during faults +#define NVIC_MPU_CTRL_ENABLE 0x00000001 // MPU enable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_NUMBER register. +// +//***************************************************************************** +#define NVIC_MPU_NUMBER_M 0x000000FF // MPU region to access +#define NVIC_MPU_NUMBER_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_BASE register. +// +//***************************************************************************** +#define NVIC_MPU_BASE_ADDR_M 0xFFFFFF00 // Base address +#define NVIC_MPU_BASE_VALID 0x00000010 // Region number valid +#define NVIC_MPU_BASE_REGION_M 0x0000000F // Region number +#define NVIC_MPU_BASE_ADDR_S 8 +#define NVIC_MPU_BASE_REGION_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_ATTR register. +// +//***************************************************************************** +#define NVIC_MPU_ATTR_ATTRS 0xFFFF0000 // Attributes +#define NVIC_MPU_ATTR_SRD 0x0000FF00 // Sub-region disable +#define NVIC_MPU_ATTR_SZENABLE 0x000000FF // Region size + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_CTRL register. +// +//***************************************************************************** +#define NVIC_DBG_CTRL_DBGKEY_M 0xFFFF0000 // Debug key mask +#define NVIC_DBG_CTRL_DBGKEY 0xA05F0000 // Debug key +#define NVIC_DBG_CTRL_MON_PEND 0x00008000 // Pend the monitor +#define NVIC_DBG_CTRL_MON_REQ 0x00004000 // Monitor request +#define NVIC_DBG_CTRL_MON_EN 0x00002000 // Debug monitor enable +#define NVIC_DBG_CTRL_MONSTEP 0x00001000 // Monitor step the core +#define NVIC_DBG_CTRL_S_SLEEP 0x00000400 // Core is sleeping +#define NVIC_DBG_CTRL_S_HALT 0x00000200 // Core status on halt +#define NVIC_DBG_CTRL_S_REGRDY 0x00000100 // Register read/write available +#define NVIC_DBG_CTRL_S_LOCKUP 0x00000080 // Core is locked up +#define NVIC_DBG_CTRL_C_RESET 0x00000010 // Reset the core +#define NVIC_DBG_CTRL_C_MASKINT 0x00000008 // Mask interrupts when stepping +#define NVIC_DBG_CTRL_C_STEP 0x00000004 // Step the core +#define NVIC_DBG_CTRL_C_HALT 0x00000002 // Halt the core +#define NVIC_DBG_CTRL_C_DEBUGEN 0x00000001 // Enable debug + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_XFER register. +// +//***************************************************************************** +#define NVIC_DBG_XFER_REG_WNR 0x00010000 // Write or not read +#define NVIC_DBG_XFER_REG_SEL_M 0x0000001F // Register +#define NVIC_DBG_XFER_REG_R0 0x00000000 // Register R0 +#define NVIC_DBG_XFER_REG_R1 0x00000001 // Register R1 +#define NVIC_DBG_XFER_REG_R2 0x00000002 // Register R2 +#define NVIC_DBG_XFER_REG_R3 0x00000003 // Register R3 +#define NVIC_DBG_XFER_REG_R4 0x00000004 // Register R4 +#define NVIC_DBG_XFER_REG_R5 0x00000005 // Register R5 +#define NVIC_DBG_XFER_REG_R6 0x00000006 // Register R6 +#define NVIC_DBG_XFER_REG_R7 0x00000007 // Register R7 +#define NVIC_DBG_XFER_REG_R8 0x00000008 // Register R8 +#define NVIC_DBG_XFER_REG_R9 0x00000009 // Register R9 +#define NVIC_DBG_XFER_REG_R10 0x0000000A // Register R10 +#define NVIC_DBG_XFER_REG_R11 0x0000000B // Register R11 +#define NVIC_DBG_XFER_REG_R12 0x0000000C // Register R12 +#define NVIC_DBG_XFER_REG_R13 0x0000000D // Register R13 +#define NVIC_DBG_XFER_REG_R14 0x0000000E // Register R14 +#define NVIC_DBG_XFER_REG_R15 0x0000000F // Register R15 +#define NVIC_DBG_XFER_REG_FLAGS 0x00000010 // xPSR/Flags register +#define NVIC_DBG_XFER_REG_MSP 0x00000011 // Main SP +#define NVIC_DBG_XFER_REG_PSP 0x00000012 // Process SP +#define NVIC_DBG_XFER_REG_DSP 0x00000013 // Deep SP +#define NVIC_DBG_XFER_REG_CFBP 0x00000014 // Control/Fault/BasePri/PriMask + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_DATA register. +// +//***************************************************************************** +#define NVIC_DBG_DATA_M 0xFFFFFFFF // Data temporary cache +#define NVIC_DBG_DATA_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_INT register. +// +//***************************************************************************** +#define NVIC_DBG_INT_HARDERR 0x00000400 // Debug trap on hard fault +#define NVIC_DBG_INT_INTERR 0x00000200 // Debug trap on interrupt errors +#define NVIC_DBG_INT_BUSERR 0x00000100 // Debug trap on bus error +#define NVIC_DBG_INT_STATERR 0x00000080 // Debug trap on usage fault state +#define NVIC_DBG_INT_CHKERR 0x00000040 // Debug trap on usage fault check +#define NVIC_DBG_INT_NOCPERR 0x00000020 // Debug trap on coprocessor error +#define NVIC_DBG_INT_MMERR 0x00000010 // Debug trap on mem manage fault +#define NVIC_DBG_INT_RESET 0x00000008 // Core reset status +#define NVIC_DBG_INT_RSTPENDCLR 0x00000004 // Clear pending core reset +#define NVIC_DBG_INT_RSTPENDING 0x00000002 // Core reset is pending +#define NVIC_DBG_INT_RSTVCATCH 0x00000001 // Reset vector catch + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SW_TRIG register. +// +//***************************************************************************** +#define NVIC_SW_TRIG_INTID_M 0x000003FF // Interrupt to trigger +#define NVIC_SW_TRIG_INTID_S 0 + +#endif // __HW_NVIC_H__ diff --git a/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_pwm.h b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_pwm.h new file mode 100644 index 000000000..53609c6f9 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_pwm.h @@ -0,0 +1,260 @@ +//***************************************************************************** +// +// hw_pwm.h - Defines and Macros for Pulse Width Modulation (PWM) ports +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_PWM_H__ +#define __HW_PWM_H__ + +//***************************************************************************** +// +// PWM Module Register Offsets. +// +//***************************************************************************** +#define PWM_O_CTL 0x00000000 // PWM Master Control register +#define PWM_O_SYNC 0x00000004 // PWM Time Base Sync register +#define PWM_O_ENABLE 0x00000008 // PWM Output Enable register +#define PWM_O_INVERT 0x0000000C // PWM Output Inversion register +#define PWM_O_FAULT 0x00000010 // PWM Output Fault register +#define PWM_O_INTEN 0x00000014 // PWM Interrupt Enable register +#define PWM_O_RIS 0x00000018 // PWM Interrupt Raw Status reg. +#define PWM_O_ISC 0x0000001C // PWM Interrupt Status register +#define PWM_O_STATUS 0x00000020 // PWM Status register + +//***************************************************************************** +// +// The following define the bit fields in the PWM Master Control register. +// +//***************************************************************************** +#define PWM_CTL_GLOBAL_SYNC2 0x00000004 // Global sync generator 2 +#define PWM_CTL_GLOBAL_SYNC1 0x00000002 // Global sync generator 1 +#define PWM_CTL_GLOBAL_SYNC0 0x00000001 // Global sync generator 0 + +//***************************************************************************** +// +// The following define the bit fields in the PWM Time Base Sync register. +// +//***************************************************************************** +#define PWM_SYNC_SYNC2 0x00000004 // Reset generator 2 counter +#define PWM_SYNC_SYNC1 0x00000002 // Reset generator 1 counter +#define PWM_SYNC_SYNC0 0x00000001 // Reset generator 0 counter + +//***************************************************************************** +// +// The following define the bit fields in the PWM Output Enable register. +// +//***************************************************************************** +#define PWM_ENABLE_PWM5EN 0x00000020 // PWM5 pin enable +#define PWM_ENABLE_PWM4EN 0x00000010 // PWM4 pin enable +#define PWM_ENABLE_PWM3EN 0x00000008 // PWM3 pin enable +#define PWM_ENABLE_PWM2EN 0x00000004 // PWM2 pin enable +#define PWM_ENABLE_PWM1EN 0x00000002 // PWM1 pin enable +#define PWM_ENABLE_PWM0EN 0x00000001 // PWM0 pin enable + +//***************************************************************************** +// +// The following define the bit fields in the PWM Inversion register. +// +//***************************************************************************** +#define PWM_INVERT_PWM5INV 0x00000020 // PWM5 pin invert +#define PWM_INVERT_PWM4INV 0x00000010 // PWM4 pin invert +#define PWM_INVERT_PWM3INV 0x00000008 // PWM3 pin invert +#define PWM_INVERT_PWM2INV 0x00000004 // PWM2 pin invert +#define PWM_INVERT_PWM1INV 0x00000002 // PWM1 pin invert +#define PWM_INVERT_PWM0INV 0x00000001 // PWM0 pin invert + +//***************************************************************************** +// +// The following define the bit fields in the PWM Fault register. +// +//***************************************************************************** +#define PWM_FAULT_FAULT5 0x00000020 // PWM5 pin fault +#define PWM_FAULT_FAULT4 0x00000010 // PWM5 pin fault +#define PWM_FAULT_FAULT3 0x00000008 // PWM5 pin fault +#define PWM_FAULT_FAULT2 0x00000004 // PWM5 pin fault +#define PWM_FAULT_FAULT1 0x00000002 // PWM5 pin fault +#define PWM_FAULT_FAULT0 0x00000001 // PWM5 pin fault + +//***************************************************************************** +// +// PWM Interrupt Register bit definitions. +// +//***************************************************************************** +#define PWM_INT_INTFAULT 0x00010000 // Fault interrupt pending + +//***************************************************************************** +// +// The following define the bit fields in the PWM Status register. +// +//***************************************************************************** +#define PWM_STATUS_FAULT 0x00000001 // Fault status + +//***************************************************************************** +// +// PWM Generator standard offsets. +// +//***************************************************************************** +#define PWM_GEN_0_OFFSET 0x00000040 // PWM0 base +#define PWM_GEN_1_OFFSET 0x00000080 // PWM1 base +#define PWM_GEN_2_OFFSET 0x000000C0 // PWM2 base + +#define PWM_O_X_CTL 0x00000000 // Gen Control Reg +#define PWM_O_X_INTEN 0x00000004 // Gen Int/Trig Enable Reg +#define PWM_O_X_RIS 0x00000008 // Gen Raw Int Status Reg +#define PWM_O_X_ISC 0x0000000C // Gen Int Status Reg +#define PWM_O_X_LOAD 0x00000010 // Gen Load Reg +#define PWM_O_X_COUNT 0x00000014 // Gen Counter Reg +#define PWM_O_X_CMPA 0x00000018 // Gen Compare A Reg +#define PWM_O_X_CMPB 0x0000001C // Gen Compare B Reg +#define PWM_O_X_GENA 0x00000020 // Gen Generator A Ctrl Reg +#define PWM_O_X_GENB 0x00000024 // Gen Generator B Ctrl Reg +#define PWM_O_X_DBCTL 0x00000028 // Gen Dead Band Ctrl Reg +#define PWM_O_X_DBRISE 0x0000002C // Gen DB Rising Edge Delay Reg +#define PWM_O_X_DBFALL 0x00000030 // Gen DB Falling Edge Delay Reg + +//***************************************************************************** +// +// PWM_X Control Register bit definitions. +// +//***************************************************************************** +#define PWM_X_CTL_ENABLE 0x00000001 // Master enable for gen block +#define PWM_X_CTL_MODE 0x00000002 // Counter mode, down or up/down +#define PWM_X_CTL_DEBUG 0x00000004 // Debug mode +#define PWM_X_CTL_LOADUPD 0x00000008 // Update mode for the load reg +#define PWM_X_CTL_CMPAUPD 0x00000010 // Update mode for comp A reg +#define PWM_X_CTL_CMPBUPD 0x00000020 // Update mode for comp B reg + +//***************************************************************************** +// +// PWM_X Interrupt/Trigger Enable Register bit definitions. +// +//***************************************************************************** +#define PWM_X_INTEN_INTCNTZERO 0x00000001 // Int if COUNT = 0 +#define PWM_X_INTEN_INTCNTLOAD 0x00000002 // Int if COUNT = LOAD +#define PWM_X_INTEN_INTCMPAU 0x00000004 // Int if COUNT = CMPA U +#define PWM_X_INTEN_INTCMPAD 0x00000008 // Int if COUNT = CMPA D +#define PWM_X_INTEN_INTCMPBU 0x00000010 // Int if COUNT = CMPA U +#define PWM_X_INTEN_INTCMPBD 0x00000020 // Int if COUNT = CMPA D +#define PWM_X_INTEN_TRCNTZERO 0x00000100 // Trig if COUNT = 0 +#define PWM_X_INTEN_TRCNTLOAD 0x00000200 // Trig if COUNT = LOAD +#define PWM_X_INTEN_TRCMPAU 0x00000400 // Trig if COUNT = CMPA U +#define PWM_X_INTEN_TRCMPAD 0x00000800 // Trig if COUNT = CMPA D +#define PWM_X_INTEN_TRCMPBU 0x00001000 // Trig if COUNT = CMPA U +#define PWM_X_INTEN_TRCMPBD 0x00002000 // Trig if COUNT = CMPA D + +//***************************************************************************** +// +// PWM_X Raw Interrupt Status Register bit definitions. +// +//***************************************************************************** +#define PWM_X_RIS_INTCNTZERO 0x00000001 // PWM_X_COUNT = 0 int +#define PWM_X_RIS_INTCNTLOAD 0x00000002 // PWM_X_COUNT = PWM_X_LOAD int +#define PWM_X_RIS_INTCMPAU 0x00000004 // PWM_X_COUNT = PWM_X_CMPA U int +#define PWM_X_RIS_INTCMPAD 0x00000008 // PWM_X_COUNT = PWM_X_CMPA D int +#define PWM_X_RIS_INTCMPBU 0x00000010 // PWM_X_COUNT = PWM_X_CMPB U int +#define PWM_X_RIS_INTCMPBD 0x00000020 // PWM_X_COUNT = PWM_X_CMPB D int + +//***************************************************************************** +// +// PWM_X Interrupt Status Register bit definitions. +// +//***************************************************************************** +#define PWM_X_INT_INTCNTZERO 0x00000001 // PWM_X_COUNT = 0 received +#define PWM_X_INT_INTCNTLOAD 0x00000002 // PWM_X_COUNT = PWM_X_LOAD rcvd +#define PWM_X_INT_INTCMPAU 0x00000004 // PWM_X_COUNT = PWM_X_CMPA U rcvd +#define PWM_X_INT_INTCMPAD 0x00000008 // PWM_X_COUNT = PWM_X_CMPA D rcvd +#define PWM_X_INT_INTCMPBU 0x00000010 // PWM_X_COUNT = PWM_X_CMPB U rcvd +#define PWM_X_INT_INTCMPBD 0x00000020 // PWM_X_COUNT = PWM_X_CMPB D rcvd + +//***************************************************************************** +// +// PWM_X Generator A/B Control Register bit definitions. +// +//***************************************************************************** +#define PWM_X_GEN_Y_ACTZERO 0x00000003 // Act PWM_X_COUNT = 0 +#define PWM_X_GEN_Y_ACTLOAD 0x0000000C // Act PWM_X_COUNT = PWM_X_LOAD +#define PWM_X_GEN_Y_ACTCMPAU 0x00000030 // Act PWM_X_COUNT = PWM_X_CMPA U +#define PWM_X_GEN_Y_ACTCMPAD 0x000000C0 // Act PWM_X_COUNT = PWM_X_CMPA D +#define PWM_X_GEN_Y_ACTCMPBU 0x00000300 // Act PWM_X_COUNT = PWM_X_CMPB U +#define PWM_X_GEN_Y_ACTCMPBD 0x00000C00 // Act PWM_X_COUNT = PWM_X_CMPB D + +//***************************************************************************** +// +// PWM_X Generator A/B Control Register action definitions. +// +//***************************************************************************** +#define PWM_GEN_ACT_NONE 0x0 // Do nothing +#define PWM_GEN_ACT_INV 0x1 // Invert the output signal +#define PWM_GEN_ACT_ZERO 0x2 // Set the output signal to zero +#define PWM_GEN_ACT_ONE 0x3 // Set the output signal to one +#define PWM_GEN_ACT_ZERO_SHIFT 0 // Shift amount for the zero action +#define PWM_GEN_ACT_LOAD_SHIFT 2 // Shift amount for the load action +#define PWM_GEN_ACT_A_UP_SHIFT 4 // Shift amount for the A up action +#define PWM_GEN_ACT_A_DN_SHIFT 6 // Shift amount for the A dn action +#define PWM_GEN_ACT_B_UP_SHIFT 8 // Shift amount for the B up action +#define PWM_GEN_ACT_B_DN_SHIFT 10 // Shift amount for the B dn action + +//***************************************************************************** +// +// PWM_X Dead Band Control Register bit definitions. +// +//***************************************************************************** +#define PWM_DBCTL_ENABLE 0x00000001 // Enable dead band insertion + +//***************************************************************************** +// +// PWM Register reset values. +// +//***************************************************************************** +#define PWM_RV_CTL 0x00000000 // Master control of the PWM module +#define PWM_RV_SYNC 0x00000000 // Counter synch for PWM generators +#define PWM_RV_ENABLE 0x00000000 // Master enable for the PWM + // output pins +#define PWM_RV_INVERT 0x00000000 // Inversion control for + // PWM output pins +#define PWM_RV_FAULT 0x00000000 // Fault handling for the PWM + // output pins +#define PWM_RV_INTEN 0x00000000 // Interrupt enable +#define PWM_RV_RIS 0x00000000 // Raw interrupt status +#define PWM_RV_ISC 0x00000000 // Interrupt status and clearing +#define PWM_RV_STATUS 0x00000000 // Status +#define PWM_RV_X_CTL 0x00000000 // Master control of the PWM + // generator block +#define PWM_RV_X_INTEN 0x00000000 // Interrupt and trigger enable +#define PWM_RV_X_RIS 0x00000000 // Raw interrupt status +#define PWM_RV_X_ISC 0x00000000 // Interrupt status and clearing +#define PWM_RV_X_LOAD 0x00000000 // The load value for the counter +#define PWM_RV_X_COUNT 0x00000000 // The current counter value +#define PWM_RV_X_CMPA 0x00000000 // The comparator A value +#define PWM_RV_X_CMPB 0x00000000 // The comparator B value +#define PWM_RV_X_GENA 0x00000000 // Controls PWM generator A +#define PWM_RV_X_GENB 0x00000000 // Controls PWM generator B +#define PWM_RV_X_DBCTL 0x00000000 // Control the dead band generator +#define PWM_RV_X_DBRISE 0x00000000 // The dead band rising edge delay + // count +#define PWM_RV_X_DBFALL 0x00000000 // The dead band falling edge delay + // count + +#endif // __HW_PWM_H__ diff --git a/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_qei.h b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_qei.h new file mode 100644 index 000000000..6d988ba95 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_qei.h @@ -0,0 +1,176 @@ +//***************************************************************************** +// +// hw_qei.h - Macros used when accessing the QEI hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_QEI_H__ +#define __HW_QEI_H__ + +//***************************************************************************** +// +// The following define the offsets of the QEI registers. +// +//***************************************************************************** +#define QEI_O_CTL 0x00000000 // Configuration and control reg. +#define QEI_O_STAT 0x00000004 // Status register +#define QEI_O_POS 0x00000008 // Current position register +#define QEI_O_MAXPOS 0x0000000C // Maximum position register +#define QEI_O_LOAD 0x00000010 // Velocity timer load register +#define QEI_O_TIME 0x00000014 // Velocity timer register +#define QEI_O_COUNT 0x00000018 // Velocity pulse count register +#define QEI_O_SPEED 0x0000001C // Velocity speed register +#define QEI_O_INTEN 0x00000020 // Interrupt enable register +#define QEI_O_RIS 0x00000024 // Raw interrupt status register +#define QEI_O_ISC 0x00000028 // Interrupt status register + +//***************************************************************************** +// +// The following define the bit fields in the QEI_CTL register. +// +//***************************************************************************** +#define QEI_CTL_STALLEN 0x00001000 // Stall enable +#define QEI_CTL_INVI 0x00000800 // Invert Index input +#define QEI_CTL_INVB 0x00000400 // Invert PhB input +#define QEI_CTL_INVA 0x00000200 // Invert PhA input +#define QEI_CTL_VELDIV_M 0x000001C0 // Velocity predivider mask +#define QEI_CTL_VELDIV_1 0x00000000 // Predivide by 1 +#define QEI_CTL_VELDIV_2 0x00000040 // Predivide by 2 +#define QEI_CTL_VELDIV_4 0x00000080 // Predivide by 4 +#define QEI_CTL_VELDIV_8 0x000000C0 // Predivide by 8 +#define QEI_CTL_VELDIV_16 0x00000100 // Predivide by 16 +#define QEI_CTL_VELDIV_32 0x00000140 // Predivide by 32 +#define QEI_CTL_VELDIV_64 0x00000180 // Predivide by 64 +#define QEI_CTL_VELDIV_128 0x000001C0 // Predivide by 128 +#define QEI_CTL_VELEN 0x00000020 // Velocity enable +#define QEI_CTL_RESMODE 0x00000010 // Position counter reset mode +#define QEI_CTL_CAPMODE 0x00000008 // Edge capture mode +#define QEI_CTL_SIGMODE 0x00000004 // Encoder signaling mode +#define QEI_CTL_SWAP 0x00000002 // Swap input signals +#define QEI_CTL_ENABLE 0x00000001 // QEI enable + +//***************************************************************************** +// +// The following define the bit fields in the QEI_STAT register. +// +//***************************************************************************** +#define QEI_STAT_DIRECTION 0x00000002 // Direction of rotation +#define QEI_STAT_ERROR 0x00000001 // Signalling error detected + +//***************************************************************************** +// +// The following define the bit fields in the QEI_POS register. +// +//***************************************************************************** +#define QEI_POS_M 0xFFFFFFFF // Current encoder position +#define QEI_POS_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_MAXPOS register. +// +//***************************************************************************** +#define QEI_MAXPOS_M 0xFFFFFFFF // Maximum encoder position +#define QEI_MAXPOS_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_LOAD register. +// +//***************************************************************************** +#define QEI_LOAD_M 0xFFFFFFFF // Velocity timer load value +#define QEI_LOAD_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_TIME register. +// +//***************************************************************************** +#define QEI_TIME_M 0xFFFFFFFF // Velocity timer current value +#define QEI_TIME_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_COUNT register. +// +//***************************************************************************** +#define QEI_COUNT_M 0xFFFFFFFF // Encoder running pulse count +#define QEI_COUNT_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_SPEED register. +// +//***************************************************************************** +#define QEI_SPEED_M 0xFFFFFFFF // Encoder pulse count +#define QEI_SPEED_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_INTEN register. +// +//***************************************************************************** +#define QEI_INTEN_ERROR 0x00000008 // Phase error detected +#define QEI_INTEN_DIR 0x00000004 // Direction change +#define QEI_INTEN_TIMER 0x00000002 // Velocity timer expired +#define QEI_INTEN_INDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// The following define the bit fields in the QEI_RIS register. +// +//***************************************************************************** +#define QEI_RIS_ERROR 0x00000008 // Phase error detected +#define QEI_RIS_DIR 0x00000004 // Direction change +#define QEI_RIS_TIMER 0x00000002 // Velocity timer expired +#define QEI_RIS_INDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// The following define the bit fields in the QEI_ISC register. +// +//***************************************************************************** +#define QEI_INT_ERROR 0x00000008 // Phase error detected +#define QEI_INT_DIR 0x00000004 // Direction change +#define QEI_INT_TIMER 0x00000002 // Velocity timer expired +#define QEI_INT_INDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// The following define the reset values for the QEI registers. +// +//***************************************************************************** +#define QEI_RV_CTL 0x00000000 // Configuration and control reg. +#define QEI_RV_STAT 0x00000000 // Status register +#define QEI_RV_POS 0x00000000 // Current position register +#define QEI_RV_MAXPOS 0x00000000 // Maximum position register +#define QEI_RV_LOAD 0x00000000 // Velocity timer load register +#define QEI_RV_TIME 0x00000000 // Velocity timer register +#define QEI_RV_COUNT 0x00000000 // Velocity pulse count register +#define QEI_RV_SPEED 0x00000000 // Velocity speed register +#define QEI_RV_INTEN 0x00000000 // Interrupt enable register +#define QEI_RV_RIS 0x00000000 // Raw interrupt status register +#define QEI_RV_ISC 0x00000000 // Interrupt status register + +#endif // __HW_QEI_H__ diff --git a/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_ssi.h b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_ssi.h new file mode 100644 index 000000000..2af758095 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_ssi.h @@ -0,0 +1,120 @@ +//***************************************************************************** +// +// hw_ssi.h - Macros used when accessing the SSI hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_SSI_H__ +#define __HW_SSI_H__ + +//***************************************************************************** +// +// The following define the offsets of the SSI registers. +// +//***************************************************************************** +#define SSI_O_CR0 0x00000000 // Control register 0 +#define SSI_O_CR1 0x00000004 // Control register 1 +#define SSI_O_DR 0x00000008 // Data register +#define SSI_O_SR 0x0000000C // Status register +#define SSI_O_CPSR 0x00000010 // Clock prescale register +#define SSI_O_IM 0x00000014 // Int mask set and clear register +#define SSI_O_RIS 0x00000018 // Raw interrupt register +#define SSI_O_MIS 0x0000001C // Masked interrupt register +#define SSI_O_ICR 0x00000020 // Interrupt clear register + +//***************************************************************************** +// +// The following define the bit fields in the SSI Control register 0. +// +//***************************************************************************** +#define SSI_CR0_SCR 0x0000FF00 // Serial clock rate +#define SSI_CR0_SPH 0x00000080 // SSPCLKOUT phase +#define SSI_CR0_SPO 0x00000040 // SSPCLKOUT polarity +#define SSI_CR0_FRF_MASK 0x00000030 // Frame format mask +#define SSI_CR0_FRF_MOTO 0x00000000 // Motorola SPI frame format +#define SSI_CR0_FRF_TI 0x00000010 // TI sync serial frame format +#define SSI_CR0_FRF_NMW 0x00000020 // National Microwire frame format +#define SSI_CR0_DSS 0x0000000F // Data size select +#define SSI_CR0_DSS_4 0x00000003 // 4 bit data +#define SSI_CR0_DSS_5 0x00000004 // 5 bit data +#define SSI_CR0_DSS_6 0x00000005 // 6 bit data +#define SSI_CR0_DSS_7 0x00000006 // 7 bit data +#define SSI_CR0_DSS_8 0x00000007 // 8 bit data +#define SSI_CR0_DSS_9 0x00000008 // 9 bit data +#define SSI_CR0_DSS_10 0x00000009 // 10 bit data +#define SSI_CR0_DSS_11 0x0000000A // 11 bit data +#define SSI_CR0_DSS_12 0x0000000B // 12 bit data +#define SSI_CR0_DSS_13 0x0000000C // 13 bit data +#define SSI_CR0_DSS_14 0x0000000D // 14 bit data +#define SSI_CR0_DSS_15 0x0000000E // 15 bit data +#define SSI_CR0_DSS_16 0x0000000F // 16 bit data + +//***************************************************************************** +// +// The following define the bit fields in the SSI Control register 1. +// +//***************************************************************************** +#define SSI_CR1_SOD 0x00000008 // Slave mode output disable +#define SSI_CR1_MS 0x00000004 // Master or slave mode select +#define SSI_CR1_SSE 0x00000002 // Sync serial port enable +#define SSI_CR1_LBM 0x00000001 // Loopback mode + +//***************************************************************************** +// +// The following define the bit fields in the SSI Status register. +// +//***************************************************************************** +#define SSI_SR_BSY 0x00000010 // SSI busy +#define SSI_SR_RFF 0x00000008 // RX FIFO full +#define SSI_SR_RNE 0x00000004 // RX FIFO not empty +#define SSI_SR_TNF 0x00000002 // TX FIFO not full +#define SSI_SR_TFE 0x00000001 // TX FIFO empty + +//***************************************************************************** +// +// The following define the bit fields in the SSI clock prescale register. +// +//***************************************************************************** +#define SSI_CPSR_CPSDVSR_MASK 0x000000FF // Clock prescale + +//***************************************************************************** +// +// The following define information concerning the SSI Data register. +// +//***************************************************************************** +#define TX_FIFO_SIZE (8) // Number of entries in the TX FIFO +#define RX_FIFO_SIZE (8) // Number of entries in the RX FIFO + +//***************************************************************************** +// +// The following define the bit fields in the interrupt mask set and clear, +// raw interrupt, masked interrupt, and interrupt clear registers. +// +//***************************************************************************** +#define SSI_INT_TXFF 0x00000008 // TX FIFO interrupt +#define SSI_INT_RXFF 0x00000004 // RX FIFO interrupt +#define SSI_INT_RXTO 0x00000002 // RX timeout interrupt +#define SSI_INT_RXOR 0x00000001 // RX overrun interrupt + +#endif // __HW_SSI_H__ diff --git a/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_sysctl.h b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_sysctl.h new file mode 100644 index 000000000..6a2d6312b --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_sysctl.h @@ -0,0 +1,659 @@ +//***************************************************************************** +// +// hw_sysctl.h - Macros used when accessing the system control hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_SYSCTL_H__ +#define __HW_SYSCTL_H__ + +//***************************************************************************** +// +// The following define the addresses of the system control registers. +// +//***************************************************************************** +#define SYSCTL_DID0 0x400fe000 // Device identification register 0 +#define SYSCTL_DID1 0x400fe004 // Device identification register 1 +#define SYSCTL_DC0 0x400fe008 // Device capabilities register 0 +#define SYSCTL_DC1 0x400fe010 // Device capabilities register 1 +#define SYSCTL_DC2 0x400fe014 // Device capabilities register 2 +#define SYSCTL_DC3 0x400fe018 // Device capabilities register 3 +#define SYSCTL_DC4 0x400fe01C // Device capabilities register 4 +#define SYSCTL_PBORCTL 0x400fe030 // POR/BOR reset control register +#define SYSCTL_LDOPCTL 0x400fe034 // LDO power control register +#define SYSCTL_SRCR0 0x400fe040 // Software reset control reg 0 +#define SYSCTL_SRCR1 0x400fe044 // Software reset control reg 1 +#define SYSCTL_SRCR2 0x400fe048 // Software reset control reg 2 +#define SYSCTL_RIS 0x400fe050 // Raw interrupt status register +#define SYSCTL_IMC 0x400fe054 // Interrupt mask/control register +#define SYSCTL_MISC 0x400fe058 // Interrupt status register +#define SYSCTL_RESC 0x400fe05c // Reset cause register +#define SYSCTL_RCC 0x400fe060 // Run-mode clock config register +#define SYSCTL_PLLCFG 0x400fe064 // PLL configuration register +#define SYSCTL_RCC2 0x400fe070 // Run-mode clock config register 2 +#define SYSCTL_RCGC0 0x400fe100 // Run-mode clock gating register 0 +#define SYSCTL_RCGC1 0x400fe104 // Run-mode clock gating register 1 +#define SYSCTL_RCGC2 0x400fe108 // Run-mode clock gating register 2 +#define SYSCTL_SCGC0 0x400fe110 // Sleep-mode clock gating reg 0 +#define SYSCTL_SCGC1 0x400fe114 // Sleep-mode clock gating reg 1 +#define SYSCTL_SCGC2 0x400fe118 // Sleep-mode clock gating reg 2 +#define SYSCTL_DCGC0 0x400fe120 // Deep Sleep-mode clock gate reg 0 +#define SYSCTL_DCGC1 0x400fe124 // Deep Sleep-mode clock gate reg 1 +#define SYSCTL_DCGC2 0x400fe128 // Deep Sleep-mode clock gate reg 2 +#define SYSCTL_DSLPCLKCFG 0x400fe144 // Deep Sleep-mode clock config reg +#define SYSCTL_CLKVCLR 0x400fe150 // Clock verifcation clear register +#define SYSCTL_LDOARST 0x400fe160 // LDO reset control register +#define SYSCTL_USER0 0x400fe1e0 // NV User Register 0 +#define SYSCTL_USER1 0x400fe1e4 // NV User Register 1 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DID0 register. +// +//***************************************************************************** +#define SYSCTL_DID0_VER_MASK 0x70000000 // DID0 version mask +#define SYSCTL_DID0_VER_0 0x00000000 // DID0 version 0 +#define SYSCTL_DID0_VER_1 0x10000000 // DID0 version 1 +#define SYSCTL_DID0_CLASS_MASK 0x00FF0000 // Device Class +#define SYSCTL_DID0_CLASS_SANDSTORM 0x00000000 // LM3Snnn Sandstorm Device +#define SYSCTL_DID0_CLASS_FURY 0x00010000 // LM3Snnnn Fury Device +#define SYSCTL_DID0_MAJ_MASK 0x0000FF00 // Major revision mask +#define SYSCTL_DID0_MAJ_A 0x00000000 // Major revision A +#define SYSCTL_DID0_MAJ_B 0x00000100 // Major revision B +#define SYSCTL_DID0_MAJ_C 0x00000200 // Major revision C +#define SYSCTL_DID0_MIN_MASK 0x000000FF // Minor revision mask +#define SYSCTL_DID0_MIN_0 0x00000000 // Minor revision 0 +#define SYSCTL_DID0_MIN_1 0x00000001 // Minor revision 1 +#define SYSCTL_DID0_MIN_2 0x00000002 // Minor revision 2 +#define SYSCTL_DID0_MIN_3 0x00000003 // Minor revision 3 +#define SYSCTL_DID0_MIN_4 0x00000004 // Minor revision 4 +#define SYSCTL_DID0_MIN_5 0x00000005 // Minor revision 5 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DID1 register. +// +//***************************************************************************** +#define SYSCTL_DID1_VER_MASK 0xF0000000 // Register version mask +#define SYSCTL_DID1_FAM_MASK 0x0F000000 // Family mask +#define SYSCTL_DID1_FAM_S 0x00000000 // Stellaris family +#define SYSCTL_DID1_PRTNO_MASK 0x00FF0000 // Part number mask +#define SYSCTL_DID1_PRTNO_101 0x00010000 // LM3S101 +#define SYSCTL_DID1_PRTNO_102 0x00020000 // LM3S102 +#define SYSCTL_DID1_PRTNO_301 0x00110000 // LM3S301 +#define SYSCTL_DID1_PRTNO_310 0x00120000 // LM3S310 +#define SYSCTL_DID1_PRTNO_315 0x00130000 // LM3S315 +#define SYSCTL_DID1_PRTNO_316 0x00140000 // LM3S316 +#define SYSCTL_DID1_PRTNO_317 0x00170000 // LM3S317 +#define SYSCTL_DID1_PRTNO_328 0x00150000 // LM3S328 +#define SYSCTL_DID1_PRTNO_601 0x00210000 // LM3S601 +#define SYSCTL_DID1_PRTNO_610 0x00220000 // LM3S610 +#define SYSCTL_DID1_PRTNO_611 0x00230000 // LM3S611 +#define SYSCTL_DID1_PRTNO_612 0x00240000 // LM3S612 +#define SYSCTL_DID1_PRTNO_613 0x00250000 // LM3S613 +#define SYSCTL_DID1_PRTNO_615 0x00260000 // LM3S615 +#define SYSCTL_DID1_PRTNO_617 0x00280000 // LM3S617 +#define SYSCTL_DID1_PRTNO_618 0x00290000 // LM3S618 +#define SYSCTL_DID1_PRTNO_628 0x00270000 // LM3S628 +#define SYSCTL_DID1_PRTNO_801 0x00310000 // LM3S801 +#define SYSCTL_DID1_PRTNO_811 0x00320000 // LM3S811 +#define SYSCTL_DID1_PRTNO_812 0x00330000 // LM3S812 +#define SYSCTL_DID1_PRTNO_815 0x00340000 // LM3S815 +#define SYSCTL_DID1_PRTNO_817 0x00360000 // LM3S817 +#define SYSCTL_DID1_PRTNO_818 0x00370000 // LM3S818 +#define SYSCTL_DID1_PRTNO_828 0x00350000 // LM3S828 +#define SYSCTL_DID1_PRTNO_2110 0x00510000 // LM3S2110 +#define SYSCTL_DID1_PRTNO_2139 0x00840000 // LM3S2139 +#define SYSCTL_DID1_PRTNO_2410 0x00A20000 // LM3S2410 +#define SYSCTL_DID1_PRTNO_2412 0x00590000 // LM3S2412 +#define SYSCTL_DID1_PRTNO_2432 0x00560000 // LM3S2432 +#define SYSCTL_DID1_PRTNO_2533 0x005A0000 // LM3S2533 +#define SYSCTL_DID1_PRTNO_2620 0x00570000 // LM3S2620 +#define SYSCTL_DID1_PRTNO_2637 0x00850000 // LM3S2637 +#define SYSCTL_DID1_PRTNO_2651 0x00530000 // LM3S2651 +#define SYSCTL_DID1_PRTNO_2730 0x00A40000 // LM3S2730 +#define SYSCTL_DID1_PRTNO_2739 0x00520000 // LM3S2739 +#define SYSCTL_DID1_PRTNO_2939 0x00540000 // LM3S2939 +#define SYSCTL_DID1_PRTNO_2948 0x008F0000 // LM3S2948 +#define SYSCTL_DID1_PRTNO_2950 0x00580000 // LM3S2950 +#define SYSCTL_DID1_PRTNO_2965 0x00550000 // LM3S2965 +#define SYSCTL_DID1_PRTNO_6100 0x00A10000 // LM3S6100 +#define SYSCTL_DID1_PRTNO_6110 0x00740000 // LM3S6110 +#define SYSCTL_DID1_PRTNO_6420 0x00A50000 // LM3S6420 +#define SYSCTL_DID1_PRTNO_6422 0x00820000 // LM3S6422 +#define SYSCTL_DID1_PRTNO_6432 0x00750000 // LM3S6432 +#define SYSCTL_DID1_PRTNO_6610 0x00710000 // LM3S6610 +#define SYSCTL_DID1_PRTNO_6633 0x00830000 // LM3S6633 +#define SYSCTL_DID1_PRTNO_6637 0x008B0000 // LM3S6637 +#define SYSCTL_DID1_PRTNO_6730 0x00A30000 // LM3S6730 +#define SYSCTL_DID1_PRTNO_6938 0x00890000 // LM3S6938 +#define SYSCTL_DID1_PRTNO_6952 0x00780000 // LM3S6952 +#define SYSCTL_DID1_PRTNO_6965 0x00730000 // LM3S6965 +#define SYSCTL_DID1_PINCNT_MASK 0x0000E000 // Pin count +#define SYSCTL_DID1_PINCNT_100 0x00004000 // 100 pin package +#define SYSCTL_DID1_TEMP_MASK 0x000000E0 // Temperature range mask +#define SYSCTL_DID1_TEMP_C 0x00000000 // Commercial temp range (0..70C) +#define SYSCTL_DID1_TEMP_I 0x00000020 // Industrial temp range (-40..85C) +#define SYSCTL_DID1_PKG_MASK 0x00000018 // Package mask +#define SYSCTL_DID1_PKG_28SOIC 0x00000000 // 28-pin SOIC +#define SYSCTL_DID1_PKG_48QFP 0x00000008 // 48-pin QFP +#define SYSCTL_DID1_ROHS 0x00000004 // Part is RoHS compliant +#define SYSCTL_DID1_QUAL_MASK 0x00000003 // Qualification status mask +#define SYSCTL_DID1_QUAL_ES 0x00000000 // Engineering sample (unqualified) +#define SYSCTL_DID1_QUAL_PP 0x00000001 // Pilot production (unqualified) +#define SYSCTL_DID1_QUAL_FQ 0x00000002 // Fully qualified +#define SYSCTL_DID1_PRTNO_SHIFT 16 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC0 register. +// +//***************************************************************************** +#define SYSCTL_DC0_SRAMSZ_MASK 0xFFFF0000 // SRAM size mask +#define SYSCTL_DC0_SRAMSZ_2KB 0x00070000 // 2 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_4KB 0x000F0000 // 4 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_8KB 0x001F0000 // 8 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_16KB 0x003F0000 // 16 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_32KB 0x007F0000 // 32 KB of SRAM +#define SYSCTL_DC0_SRAMSZ_64KB 0x00FF0000 // 64 KB of SRAM +#define SYSCTL_DC0_FLASHSZ_MASK 0x0000FFFF // Flash size mask +#define SYSCTL_DC0_FLASHSZ_8KB 0x00000003 // 8 KB of flash +#define SYSCTL_DC0_FLASHSZ_16KB 0x00000007 // 16 KB of flash +#define SYSCTL_DC0_FLASHSZ_32KB 0x0000000F // 32 KB of flash +#define SYSCTL_DC0_FLASHSZ_64KB 0x0000001F // 64 KB of flash +#define SYSCTL_DC0_FLASHSZ_96KB 0x0000002F // 96 KB of flash +#define SYSCTL_DC0_FLASHSZ_128K 0x0000003F // 128 KB of flash +#define SYSCTL_DC0_FLASHSZ_256K 0x0000007F // 256 KB of flash + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC1 register. +// +//***************************************************************************** +#define SYSCTL_DC1_CAN1 0x02000000 // CAN1 module present +#define SYSCTL_DC1_CAN0 0x01000000 // CAN0 module present +#define SYSCTL_DC1_PWM 0x00100000 // PWM module present +#define SYSCTL_DC1_ADC 0x00010000 // ADC module present +#define SYSCTL_DC1_SYSDIV_MASK 0x0000F000 // Minimum system divider mask +#define SYSCTL_DC1_ADCSPD_MASK 0x00000F00 // ADC speed mask +#define SYSCTL_DC1_ADCSPD_1M 0x00000300 // 1Msps ADC +#define SYSCTL_DC1_ADCSPD_500K 0x00000200 // 500Ksps ADC +#define SYSCTL_DC1_ADCSPD_250K 0x00000100 // 250Ksps ADC +#define SYSCTL_DC1_ADCSPD_125K 0x00000000 // 125Ksps ADC +#define SYSCTL_DC1_MPU 0x00000080 // Cortex M3 MPU present +#define SYSCTL_DC1_HIB 0x00000040 // Hibernation module present +#define SYSCTL_DC1_TEMP 0x00000020 // Temperature sensor present +#define SYSCTL_DC1_PLL 0x00000010 // PLL present +#define SYSCTL_DC1_WDOG 0x00000008 // Watchdog present +#define SYSCTL_DC1_SWO 0x00000004 // Serial wire output present +#define SYSCTL_DC1_SWD 0x00000002 // Serial wire debug present +#define SYSCTL_DC1_JTAG 0x00000001 // JTAG debug present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC2 register. +// +//***************************************************************************** +#define SYSCTL_DC2_COMP2 0x04000000 // Analog comparator 2 present +#define SYSCTL_DC2_COMP1 0x02000000 // Analog comparator 1 present +#define SYSCTL_DC2_COMP0 0x01000000 // Analog comparator 0 present +#define SYSCTL_DC2_TIMER3 0x00080000 // Timer 3 present +#define SYSCTL_DC2_TIMER2 0x00040000 // Timer 2 present +#define SYSCTL_DC2_TIMER1 0x00020000 // Timer 1 present +#define SYSCTL_DC2_TIMER0 0x00010000 // Timer 0 present +#define SYSCTL_DC2_I2C1 0x00002000 // I2C 1 present +#define SYSCTL_DC2_I2C0 0x00001000 // I2C 0 present +#ifndef DEPRECATED +#define SYSCTL_DC2_I2C 0x00001000 // I2C present +#endif +#define SYSCTL_DC2_QEI1 0x00000200 // QEI 1 present +#define SYSCTL_DC2_QEI0 0x00000100 // QEI 0 present +#ifndef DEPRECATED +#define SYSCTL_DC2_QEI 0x00000100 // QEI present +#endif +#define SYSCTL_DC2_SSI1 0x00000020 // SSI 1 present +#define SYSCTL_DC2_SSI0 0x00000010 // SSI 0 present +#ifndef DEPRECATED +#define SYSCTL_DC2_SSI 0x00000010 // SSI present +#endif +#define SYSCTL_DC2_UART2 0x00000004 // UART 2 present +#define SYSCTL_DC2_UART1 0x00000002 // UART 1 present +#define SYSCTL_DC2_UART0 0x00000001 // UART 0 present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC3 register. +// +//***************************************************************************** +#define SYSCTL_DC3_32KHZ 0x80000000 // 32kHz pin present +#define SYSCTL_DC3_CCP5 0x20000000 // CCP5 pin present +#define SYSCTL_DC3_CCP4 0x10000000 // CCP4 pin present +#define SYSCTL_DC3_CCP3 0x08000000 // CCP3 pin present +#define SYSCTL_DC3_CCP2 0x04000000 // CCP2 pin present +#define SYSCTL_DC3_CCP1 0x02000000 // CCP1 pin present +#define SYSCTL_DC3_CCP0 0x01000000 // CCP0 pin present +#define SYSCTL_DC3_ADC7 0x00800000 // ADC7 pin present +#define SYSCTL_DC3_ADC6 0x00400000 // ADC6 pin present +#define SYSCTL_DC3_ADC5 0x00200000 // ADC5 pin present +#define SYSCTL_DC3_ADC4 0x00100000 // ADC4 pin present +#define SYSCTL_DC3_ADC3 0x00080000 // ADC3 pin present +#define SYSCTL_DC3_ADC2 0x00040000 // ADC2 pin present +#define SYSCTL_DC3_ADC1 0x00020000 // ADC1 pin present +#define SYSCTL_DC3_ADC0 0x00010000 // ADC0 pin present +#define SYSCTL_DC3_MC_FAULT0 0x00008000 // MC0 fault pin present +#define SYSCTL_DC3_C2O 0x00004000 // C2o pin present +#define SYSCTL_DC3_C2PLUS 0x00002000 // C2+ pin present +#define SYSCTL_DC3_C2MINUS 0x00001000 // C2- pin present +#define SYSCTL_DC3_C1O 0x00000800 // C1o pin present +#define SYSCTL_DC3_C1PLUS 0x00000400 // C1+ pin present +#define SYSCTL_DC3_C1MINUS 0x00000200 // C1- pin present +#define SYSCTL_DC3_C0O 0x00000100 // C0o pin present +#define SYSCTL_DC3_C0PLUS 0x00000080 // C0+ pin present +#define SYSCTL_DC3_C0MINUS 0x00000040 // C0- pin present +#define SYSCTL_DC3_PWM5 0x00000020 // PWM5 pin present +#define SYSCTL_DC3_PWM4 0x00000010 // PWM4 pin present +#define SYSCTL_DC3_PWM3 0x00000008 // PWM3 pin present +#define SYSCTL_DC3_PWM2 0x00000004 // PWM2 pin present +#define SYSCTL_DC3_PWM1 0x00000002 // PWM1 pin present +#define SYSCTL_DC3_PWM0 0x00000001 // PWM0 pin present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC4 register. +// +//***************************************************************************** +#define SYSCTL_DC4_ETH 0x50000000 // Ethernet present +#define SYSCTL_DC4_GPIOH 0x00000080 // GPIO port H present +#define SYSCTL_DC4_GPIOG 0x00000040 // GPIO port G present +#define SYSCTL_DC4_GPIOF 0x00000020 // GPIO port F present +#define SYSCTL_DC4_GPIOE 0x00000010 // GPIO port E present +#define SYSCTL_DC4_GPIOD 0x00000008 // GPIO port D present +#define SYSCTL_DC4_GPIOC 0x00000004 // GPIO port C present +#define SYSCTL_DC4_GPIOB 0x00000002 // GPIO port B present +#define SYSCTL_DC4_GPIOA 0x00000001 // GPIO port A present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_PBORCTL register. +// +//***************************************************************************** +#define SYSCTL_PBORCTL_BOR_MASK 0x0000FFFC // BOR wait timer +#define SYSCTL_PBORCTL_BORIOR 0x00000002 // BOR interrupt or reset +#define SYSCTL_PBORCTL_BORWT 0x00000001 // BOR wait and check for noise +#define SYSCTL_PBORCTL_BOR_SH 2 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_LDOPCTL register. +// +//***************************************************************************** +#define SYSCTL_LDOPCTL_MASK 0x0000003F // Voltage adjust mask +#define SYSCTL_LDOPCTL_2_25V 0x00000005 // LDO output of 2.25V +#define SYSCTL_LDOPCTL_2_30V 0x00000004 // LDO output of 2.30V +#define SYSCTL_LDOPCTL_2_35V 0x00000003 // LDO output of 2.35V +#define SYSCTL_LDOPCTL_2_40V 0x00000002 // LDO output of 2.40V +#define SYSCTL_LDOPCTL_2_45V 0x00000001 // LDO output of 2.45V +#define SYSCTL_LDOPCTL_2_50V 0x00000000 // LDO output of 2.50V +#define SYSCTL_LDOPCTL_2_55V 0x0000001F // LDO output of 2.55V +#define SYSCTL_LDOPCTL_2_60V 0x0000001E // LDO output of 2.60V +#define SYSCTL_LDOPCTL_2_65V 0x0000001D // LDO output of 2.65V +#define SYSCTL_LDOPCTL_2_70V 0x0000001C // LDO output of 2.70V +#define SYSCTL_LDOPCTL_2_75V 0x0000001B // LDO output of 2.75V + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR0, SYSCTL_RCGC0, +// SYSCTL_SCGC0, and SYSCTL_DCGC0 registers. +// +//***************************************************************************** +#define SYSCTL_SET0_CAN1 0x02000000 // CAN 1 module +#define SYSCTL_SET0_CAN0 0x01000000 // CAN 0 module +#define SYSCTL_SET0_PWM 0x00100000 // PWM module +#define SYSCTL_SET0_ADC 0x00010000 // ADC module +#define SYSCTL_SET0_ADCSPD_MASK 0x00000F00 // ADC speed mask +#define SYSCTL_SET0_ADCSPD_1M 0x00000300 // 1Msps ADC +#define SYSCTL_SET0_ADCSPD_500K 0x00000200 // 500Ksps ADC +#define SYSCTL_SET0_ADCSPD_250K 0x00000100 // 250Ksps ADC +#define SYSCTL_SET0_ADCSPD_125K 0x00000000 // 125Ksps ADC +#define SYSCTL_SET0_HIB 0x00000040 // Hibernation module +#define SYSCTL_SET0_WDOG 0x00000008 // Watchdog module + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR1, SYSCTL_RCGC1, +// SYSCTL_SCGC1, and SYSCTL_DCGC1 registers. +// +//***************************************************************************** +#define SYSCTL_SET1_COMP2 0x04000000 // Analog comparator module 2 +#define SYSCTL_SET1_COMP1 0x02000000 // Analog comparator module 1 +#define SYSCTL_SET1_COMP0 0x01000000 // Analog comparator module 0 +#define SYSCTL_SET1_TIMER3 0x00080000 // Timer module 3 +#define SYSCTL_SET1_TIMER2 0x00040000 // Timer module 2 +#define SYSCTL_SET1_TIMER1 0x00020000 // Timer module 1 +#define SYSCTL_SET1_TIMER0 0x00010000 // Timer module 0 +#define SYSCTL_SET1_I2C1 0x00002000 // I2C module 1 +#define SYSCTL_SET1_I2C0 0x00001000 // I2C module 0 +#ifndef DEPRECATED +#define SYSCTL_SET1_I2C 0x00001000 // I2C module +#endif +#define SYSCTL_SET1_QEI1 0x00000200 // QEI module 1 +#define SYSCTL_SET1_QEI0 0x00000100 // QEI module 0 +#ifndef DEPRECATED +#define SYSCTL_SET1_QEI 0x00000100 // QEI module +#endif +#define SYSCTL_SET1_SSI1 0x00000020 // SSI module 1 +#define SYSCTL_SET1_SSI0 0x00000010 // SSI module 0 +#ifndef DEPRECATED +#define SYSCTL_SET1_SSI 0x00000010 // SSI module +#endif +#define SYSCTL_SET1_UART2 0x00000004 // UART module 2 +#define SYSCTL_SET1_UART1 0x00000002 // UART module 1 +#define SYSCTL_SET1_UART0 0x00000001 // UART module 0 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR2, SYSCTL_RCGC2, +// SYSCTL_SCGC2, and SYSCTL_DCGC2 registers. +// +//***************************************************************************** +#define SYSCTL_SET2_ETH 0x50000000 // ETH module +#define SYSCTL_SET2_GPIOH 0x00000080 // GPIO H module +#define SYSCTL_SET2_GPIOG 0x00000040 // GPIO G module +#define SYSCTL_SET2_GPIOF 0x00000020 // GPIO F module +#define SYSCTL_SET2_GPIOE 0x00000010 // GPIO E module +#define SYSCTL_SET2_GPIOD 0x00000008 // GPIO D module +#define SYSCTL_SET2_GPIOC 0x00000004 // GPIO C module +#define SYSCTL_SET2_GPIOB 0x00000002 // GPIO B module +#define SYSCTL_SET2_GPIOA 0x00000001 // GIPO A module + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RIS, SYSCTL_IMC, and +// SYSCTL_IMS registers. +// +//***************************************************************************** +#define SYSCTL_INT_PLL_LOCK 0x00000040 // PLL lock interrupt +#define SYSCTL_INT_CUR_LIMIT 0x00000020 // Current limit interrupt +#define SYSCTL_INT_IOSC_FAIL 0x00000010 // Internal oscillator failure int +#define SYSCTL_INT_MOSC_FAIL 0x00000008 // Main oscillator failure int +#define SYSCTL_INT_POR 0x00000004 // Power on reset interrupt +#define SYSCTL_INT_BOR 0x00000002 // Brown out interrupt +#define SYSCTL_INT_PLL_FAIL 0x00000001 // PLL failure interrupt + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RESC register. +// +//***************************************************************************** +#define SYSCTL_RESC_LDO 0x00000020 // LDO power OK lost reset +#define SYSCTL_RESC_SW 0x00000010 // Software reset +#define SYSCTL_RESC_WDOG 0x00000008 // Watchdog reset +#define SYSCTL_RESC_BOR 0x00000004 // Brown-out reset +#define SYSCTL_RESC_POR 0x00000002 // Power on reset +#define SYSCTL_RESC_EXT 0x00000001 // External reset + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RCC register. +// +//***************************************************************************** +#define SYSCTL_RCC_ACG 0x08000000 // Automatic clock gating +#define SYSCTL_RCC_SYSDIV_MASK 0x07800000 // System clock divider +#define SYSCTL_RCC_SYSDIV_2 0x00800000 // System clock /2 +#define SYSCTL_RCC_SYSDIV_3 0x01000000 // System clock /3 +#define SYSCTL_RCC_SYSDIV_4 0x01800000 // System clock /4 +#define SYSCTL_RCC_SYSDIV_5 0x02000000 // System clock /5 +#define SYSCTL_RCC_SYSDIV_6 0x02800000 // System clock /6 +#define SYSCTL_RCC_SYSDIV_7 0x03000000 // System clock /7 +#define SYSCTL_RCC_SYSDIV_8 0x03800000 // System clock /8 +#define SYSCTL_RCC_SYSDIV_9 0x04000000 // System clock /9 +#define SYSCTL_RCC_SYSDIV_10 0x04800000 // System clock /10 +#define SYSCTL_RCC_SYSDIV_11 0x05000000 // System clock /11 +#define SYSCTL_RCC_SYSDIV_12 0x05800000 // System clock /12 +#define SYSCTL_RCC_SYSDIV_13 0x06000000 // System clock /13 +#define SYSCTL_RCC_SYSDIV_14 0x06800000 // System clock /14 +#define SYSCTL_RCC_SYSDIV_15 0x07000000 // System clock /15 +#define SYSCTL_RCC_SYSDIV_16 0x07800000 // System clock /16 +#define SYSCTL_RCC_USE_SYSDIV 0x00400000 // Use sytem clock divider +#define SYSCTL_RCC_USE_PWMDIV 0x00100000 // Use PWM clock divider +#define SYSCTL_RCC_PWMDIV_MASK 0x000E0000 // PWM clock divider +#define SYSCTL_RCC_PWMDIV_2 0x00000000 // PWM clock /2 +#define SYSCTL_RCC_PWMDIV_4 0x00020000 // PWM clock /4 +#define SYSCTL_RCC_PWMDIV_8 0x00040000 // PWM clock /8 +#define SYSCTL_RCC_PWMDIV_16 0x00060000 // PWM clock /16 +#define SYSCTL_RCC_PWMDIV_32 0x00080000 // PWM clock /32 +#define SYSCTL_RCC_PWMDIV_64 0x000A0000 // PWM clock /64 +#define SYSCTL_RCC_PWRDN 0x00002000 // PLL power down +#define SYSCTL_RCC_OE 0x00001000 // PLL output enable +#define SYSCTL_RCC_BYPASS 0x00000800 // PLL bypass +#define SYSCTL_RCC_PLLVER 0x00000400 // PLL verification timer enable +#define SYSCTL_RCC_XTAL_MASK 0x000003C0 // Crystal attached to main osc +#define SYSCTL_RCC_XTAL_3_57MHZ 0x00000100 // Using a 3.579545MHz crystal +#define SYSCTL_RCC_XTAL_3_68MHz 0x00000140 // Using a 3.6864MHz crystal +#define SYSCTL_RCC_XTAL_4MHz 0x00000180 // Using a 4MHz crystal +#define SYSCTL_RCC_XTAL_4_09MHZ 0x000001C0 // Using a 4.096MHz crystal +#define SYSCTL_RCC_XTAL_4_91MHZ 0x00000200 // Using a 4.9152MHz crystal +#define SYSCTL_RCC_XTAL_5MHZ 0x00000240 // Using a 5MHz crystal +#define SYSCTL_RCC_XTAL_5_12MHZ 0x00000280 // Using a 5.12MHz crystal +#define SYSCTL_RCC_XTAL_6MHZ 0x000002C0 // Using a 6MHz crystal +#define SYSCTL_RCC_XTAL_6_14MHZ 0x00000300 // Using a 6.144MHz crystal +#define SYSCTL_RCC_XTAL_7_37MHZ 0x00000340 // Using a 7.3728MHz crystal +#define SYSCTL_RCC_XTAL_8MHZ 0x00000380 // Using a 8MHz crystal +#define SYSCTL_RCC_XTAL_8_19MHZ 0x000003C0 // Using a 8.192MHz crystal +#define SYSCTL_RCC_OSCSRC_MASK 0x00000030 // Oscillator input select +#define SYSCTL_RCC_OSCSRC_MAIN 0x00000000 // Use the main oscillator +#define SYSCTL_RCC_OSCSRC_INT 0x00000010 // Use the internal oscillator +#define SYSCTL_RCC_OSCSRC_INT4 0x00000020 // Use the internal oscillator / 4 +#define SYSCTL_RCC_IOSCVER 0x00000008 // Int. osc. verification timer en +#define SYSCTL_RCC_MOSCVER 0x00000004 // Main osc. verification timer en +#define SYSCTL_RCC_IOSCDIS 0x00000002 // Internal oscillator disable +#define SYSCTL_RCC_MOSCDIS 0x00000001 // Main oscillator disable +#define SYSCTL_RCC_SYSDIV_SHIFT 23 // Shift to the SYSDIV field +#define SYSCTL_RCC_PWMDIV_SHIFT 17 // Shift to the PWMDIV field +#define SYSCTL_RCC_XTAL_SHIFT 6 // Shift to the XTAL field +#define SYSCTL_RCC_OSCSRC_SHIFT 4 // Shift to the OSCSRC field + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_PLLCFG register. +// +//***************************************************************************** +#define SYSCTL_PLLCFG_OD_MASK 0x0000C000 // Output divider +#define SYSCTL_PLLCFG_OD_1 0x00000000 // Output divider is 1 +#define SYSCTL_PLLCFG_OD_2 0x00004000 // Output divider is 2 +#define SYSCTL_PLLCFG_OD_4 0x00008000 // Output divider is 4 +#define SYSCTL_PLLCFG_F_MASK 0x00003FE0 // PLL multiplier +#define SYSCTL_PLLCFG_R_MASK 0x0000001F // Input predivider +#define SYSCTL_PLLCFG_F_SHIFT 5 +#define SYSCTL_PLLCFG_R_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RCC2 register. +// +//***************************************************************************** +#define SYSCTL_RCC2_USERCC2 0x80000000 // Use RCC2 +#define SYSCTL_RCC2_SYSDIV2_MSK 0x1F800000 // System clock divider +#define SYSCTL_RCC2_SYSDIV2_2 0x00800000 // System clock /2 +#define SYSCTL_RCC2_SYSDIV2_3 0x01000000 // System clock /3 +#define SYSCTL_RCC2_SYSDIV2_4 0x01800000 // System clock /4 +#define SYSCTL_RCC2_SYSDIV2_5 0x02000000 // System clock /5 +#define SYSCTL_RCC2_SYSDIV2_6 0x02800000 // System clock /6 +#define SYSCTL_RCC2_SYSDIV2_7 0x03000000 // System clock /7 +#define SYSCTL_RCC2_SYSDIV2_8 0x03800000 // System clock /8 +#define SYSCTL_RCC2_SYSDIV2_9 0x04000000 // System clock /9 +#define SYSCTL_RCC2_SYSDIV2_10 0x04800000 // System clock /10 +#define SYSCTL_RCC2_SYSDIV2_11 0x05000000 // System clock /11 +#define SYSCTL_RCC2_SYSDIV2_12 0x05800000 // System clock /12 +#define SYSCTL_RCC2_SYSDIV2_13 0x06000000 // System clock /13 +#define SYSCTL_RCC2_SYSDIV2_14 0x06800000 // System clock /14 +#define SYSCTL_RCC2_SYSDIV2_15 0x07000000 // System clock /15 +#define SYSCTL_RCC2_SYSDIV2_16 0x07800000 // System clock /16 +#define SYSCTL_RCC2_SYSDIV2_17 0x08000000 // System clock /17 +#define SYSCTL_RCC2_SYSDIV2_18 0x08800000 // System clock /18 +#define SYSCTL_RCC2_SYSDIV2_19 0x09000000 // System clock /19 +#define SYSCTL_RCC2_SYSDIV2_20 0x09800000 // System clock /20 +#define SYSCTL_RCC2_SYSDIV2_21 0x0A000000 // System clock /21 +#define SYSCTL_RCC2_SYSDIV2_22 0x0A800000 // System clock /22 +#define SYSCTL_RCC2_SYSDIV2_23 0x0B000000 // System clock /23 +#define SYSCTL_RCC2_SYSDIV2_24 0x0B800000 // System clock /24 +#define SYSCTL_RCC2_SYSDIV2_25 0x0C000000 // System clock /25 +#define SYSCTL_RCC2_SYSDIV2_26 0x0C800000 // System clock /26 +#define SYSCTL_RCC2_SYSDIV2_27 0x0D000000 // System clock /27 +#define SYSCTL_RCC2_SYSDIV2_28 0x0D800000 // System clock /28 +#define SYSCTL_RCC2_SYSDIV2_29 0x0E000000 // System clock /29 +#define SYSCTL_RCC2_SYSDIV2_30 0x0E800000 // System clock /30 +#define SYSCTL_RCC2_SYSDIV2_31 0x0F000000 // System clock /31 +#define SYSCTL_RCC2_SYSDIV2_32 0x0F800000 // System clock /32 +#define SYSCTL_RCC2_SYSDIV2_33 0x10000000 // System clock /33 +#define SYSCTL_RCC2_SYSDIV2_34 0x10800000 // System clock /34 +#define SYSCTL_RCC2_SYSDIV2_35 0x11000000 // System clock /35 +#define SYSCTL_RCC2_SYSDIV2_36 0x11800000 // System clock /36 +#define SYSCTL_RCC2_SYSDIV2_37 0x12000000 // System clock /37 +#define SYSCTL_RCC2_SYSDIV2_38 0x12800000 // System clock /38 +#define SYSCTL_RCC2_SYSDIV2_39 0x13000000 // System clock /39 +#define SYSCTL_RCC2_SYSDIV2_40 0x13800000 // System clock /40 +#define SYSCTL_RCC2_SYSDIV2_41 0x14000000 // System clock /41 +#define SYSCTL_RCC2_SYSDIV2_42 0x14800000 // System clock /42 +#define SYSCTL_RCC2_SYSDIV2_43 0x15000000 // System clock /43 +#define SYSCTL_RCC2_SYSDIV2_44 0x15800000 // System clock /44 +#define SYSCTL_RCC2_SYSDIV2_45 0x16000000 // System clock /45 +#define SYSCTL_RCC2_SYSDIV2_46 0x16800000 // System clock /46 +#define SYSCTL_RCC2_SYSDIV2_47 0x17000000 // System clock /47 +#define SYSCTL_RCC2_SYSDIV2_48 0x17800000 // System clock /48 +#define SYSCTL_RCC2_SYSDIV2_49 0x18000000 // System clock /49 +#define SYSCTL_RCC2_SYSDIV2_50 0x18800000 // System clock /50 +#define SYSCTL_RCC2_SYSDIV2_51 0x19000000 // System clock /51 +#define SYSCTL_RCC2_SYSDIV2_52 0x19800000 // System clock /52 +#define SYSCTL_RCC2_SYSDIV2_53 0x1A000000 // System clock /53 +#define SYSCTL_RCC2_SYSDIV2_54 0x1A800000 // System clock /54 +#define SYSCTL_RCC2_SYSDIV2_55 0x1B000000 // System clock /55 +#define SYSCTL_RCC2_SYSDIV2_56 0x1B800000 // System clock /56 +#define SYSCTL_RCC2_SYSDIV2_57 0x1C000000 // System clock /57 +#define SYSCTL_RCC2_SYSDIV2_58 0x1C800000 // System clock /58 +#define SYSCTL_RCC2_SYSDIV2_59 0x1D000000 // System clock /59 +#define SYSCTL_RCC2_SYSDIV2_60 0x1D800000 // System clock /60 +#define SYSCTL_RCC2_SYSDIV2_61 0x1E000000 // System clock /61 +#define SYSCTL_RCC2_SYSDIV2_62 0x1E800000 // System clock /62 +#define SYSCTL_RCC2_SYSDIV2_63 0x1F000000 // System clock /63 +#define SYSCTL_RCC2_SYSDIV2_64 0x1F800000 // System clock /64 +#define SYSCTL_RCC2_PWRDN2 0x00002000 // PLL power down +#define SYSCTL_RCC2_BYPASS2 0x00000800 // PLL bypass +#define SYSCTL_RCC2_OSCSRC2_MSK 0x00000070 // Oscillator input select +#define SYSCTL_RCC2_OSCSRC2_MO 0x00000000 // Use the main oscillator +#define SYSCTL_RCC2_OSCSRC2_IO 0x00000010 // Use the internal oscillator +#define SYSCTL_RCC2_OSCSRC2_IO4 0x00000020 // Use the internal oscillator / 4 +#define SYSCTL_RCC2_OSCSRC2_30 0x00000030 // Use the 30 KHz internal osc. +#define SYSCTL_RCC2_OSCSRC2_32 0x00000070 // Use the 32 KHz external osc. + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DSLPCLKCFG register. +// +//***************************************************************************** +#define SYSCTL_DSLPCLKCFG_D_MSK 0x1f800000 // Deep sleep system clock override +#define SYSCTL_DSLPCLKCFG_D_2 0x00800000 // System clock /2 +#define SYSCTL_DSLPCLKCFG_D_3 0x01000000 // System clock /3 +#define SYSCTL_DSLPCLKCFG_D_4 0x01800000 // System clock /4 +#define SYSCTL_DSLPCLKCFG_D_5 0x02000000 // System clock /5 +#define SYSCTL_DSLPCLKCFG_D_6 0x02800000 // System clock /6 +#define SYSCTL_DSLPCLKCFG_D_7 0x03000000 // System clock /7 +#define SYSCTL_DSLPCLKCFG_D_8 0x03800000 // System clock /8 +#define SYSCTL_DSLPCLKCFG_D_9 0x04000000 // System clock /9 +#define SYSCTL_DSLPCLKCFG_D_10 0x04800000 // System clock /10 +#define SYSCTL_DSLPCLKCFG_D_11 0x05000000 // System clock /11 +#define SYSCTL_DSLPCLKCFG_D_12 0x05800000 // System clock /12 +#define SYSCTL_DSLPCLKCFG_D_13 0x06000000 // System clock /13 +#define SYSCTL_DSLPCLKCFG_D_14 0x06800000 // System clock /14 +#define SYSCTL_DSLPCLKCFG_D_15 0x07000000 // System clock /15 +#define SYSCTL_DSLPCLKCFG_D_16 0x07800000 // System clock /16 +#define SYSCTL_DSLPCLKCFG_D_17 0x08000000 // System clock /17 +#define SYSCTL_DSLPCLKCFG_D_18 0x08800000 // System clock /18 +#define SYSCTL_DSLPCLKCFG_D_19 0x09000000 // System clock /19 +#define SYSCTL_DSLPCLKCFG_D_20 0x09800000 // System clock /20 +#define SYSCTL_DSLPCLKCFG_D_21 0x0A000000 // System clock /21 +#define SYSCTL_DSLPCLKCFG_D_22 0x0A800000 // System clock /22 +#define SYSCTL_DSLPCLKCFG_D_23 0x0B000000 // System clock /23 +#define SYSCTL_DSLPCLKCFG_D_24 0x0B800000 // System clock /24 +#define SYSCTL_DSLPCLKCFG_D_25 0x0C000000 // System clock /25 +#define SYSCTL_DSLPCLKCFG_D_26 0x0C800000 // System clock /26 +#define SYSCTL_DSLPCLKCFG_D_27 0x0D000000 // System clock /27 +#define SYSCTL_DSLPCLKCFG_D_28 0x0D800000 // System clock /28 +#define SYSCTL_DSLPCLKCFG_D_29 0x0E000000 // System clock /29 +#define SYSCTL_DSLPCLKCFG_D_30 0x0E800000 // System clock /30 +#define SYSCTL_DSLPCLKCFG_D_31 0x0F000000 // System clock /31 +#define SYSCTL_DSLPCLKCFG_D_32 0x0F800000 // System clock /32 +#define SYSCTL_DSLPCLKCFG_D_33 0x10000000 // System clock /33 +#define SYSCTL_DSLPCLKCFG_D_34 0x10800000 // System clock /34 +#define SYSCTL_DSLPCLKCFG_D_35 0x11000000 // System clock /35 +#define SYSCTL_DSLPCLKCFG_D_36 0x11800000 // System clock /36 +#define SYSCTL_DSLPCLKCFG_D_37 0x12000000 // System clock /37 +#define SYSCTL_DSLPCLKCFG_D_38 0x12800000 // System clock /38 +#define SYSCTL_DSLPCLKCFG_D_39 0x13000000 // System clock /39 +#define SYSCTL_DSLPCLKCFG_D_40 0x13800000 // System clock /40 +#define SYSCTL_DSLPCLKCFG_D_41 0x14000000 // System clock /41 +#define SYSCTL_DSLPCLKCFG_D_42 0x14800000 // System clock /42 +#define SYSCTL_DSLPCLKCFG_D_43 0x15000000 // System clock /43 +#define SYSCTL_DSLPCLKCFG_D_44 0x15800000 // System clock /44 +#define SYSCTL_DSLPCLKCFG_D_45 0x16000000 // System clock /45 +#define SYSCTL_DSLPCLKCFG_D_46 0x16800000 // System clock /46 +#define SYSCTL_DSLPCLKCFG_D_47 0x17000000 // System clock /47 +#define SYSCTL_DSLPCLKCFG_D_48 0x17800000 // System clock /48 +#define SYSCTL_DSLPCLKCFG_D_49 0x18000000 // System clock /49 +#define SYSCTL_DSLPCLKCFG_D_50 0x18800000 // System clock /50 +#define SYSCTL_DSLPCLKCFG_D_51 0x19000000 // System clock /51 +#define SYSCTL_DSLPCLKCFG_D_52 0x19800000 // System clock /52 +#define SYSCTL_DSLPCLKCFG_D_53 0x1A000000 // System clock /53 +#define SYSCTL_DSLPCLKCFG_D_54 0x1A800000 // System clock /54 +#define SYSCTL_DSLPCLKCFG_D_55 0x1B000000 // System clock /55 +#define SYSCTL_DSLPCLKCFG_D_56 0x1B800000 // System clock /56 +#define SYSCTL_DSLPCLKCFG_D_57 0x1C000000 // System clock /57 +#define SYSCTL_DSLPCLKCFG_D_58 0x1C800000 // System clock /58 +#define SYSCTL_DSLPCLKCFG_D_59 0x1D000000 // System clock /59 +#define SYSCTL_DSLPCLKCFG_D_60 0x1D800000 // System clock /60 +#define SYSCTL_DSLPCLKCFG_D_61 0x1E000000 // System clock /61 +#define SYSCTL_DSLPCLKCFG_D_62 0x1E800000 // System clock /62 +#define SYSCTL_DSLPCLKCFG_D_63 0x1F000000 // System clock /63 +#define SYSCTL_DSLPCLKCFG_D_64 0x1F800000 // System clock /64 +#define SYSCTL_DSLPCLKCFG_O_MSK 0x00000070 // Deep sleep oscillator override +#define SYSCTL_DSLPCLKCFG_O_IGN 0x00000000 // Do not override +#define SYSCTL_DSLPCLKCFG_O_IO 0x00000010 // Use the internal oscillator +#define SYSCTL_DSLPCLKCFG_O_30 0x00000030 // Use the 30 KHz internal osc. +#define SYSCTL_DSLPCLKCFG_O_32 0x00000070 // Use the 32 KHz external osc. + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_CLKVCLR register. +// +//***************************************************************************** +#define SYSCTL_CLKVCLR_CLR 0x00000001 // Clear clock verification fault + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_LDOARST register. +// +//***************************************************************************** +#define SYSCTL_LDOARST_ARST 0x00000001 // Allow LDO to reset device + +#endif // __HW_SYSCTL_H__ diff --git a/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_timer.h b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_timer.h new file mode 100644 index 000000000..eb58abf65 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_timer.h @@ -0,0 +1,235 @@ +//***************************************************************************** +// +// hw_timer.h - Defines and macros used when accessing the timer. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_TIMER_H__ +#define __HW_TIMER_H__ + +//***************************************************************************** +// +// The following define the offsets of the timer registers. +// +//***************************************************************************** +#define TIMER_O_CFG 0x00000000 // Configuration register +#define TIMER_O_TAMR 0x00000004 // TimerA mode register +#define TIMER_O_TBMR 0x00000008 // TimerB mode register +#define TIMER_O_CTL 0x0000000C // Control register +#define TIMER_O_IMR 0x00000018 // Interrupt mask register +#define TIMER_O_RIS 0x0000001C // Interrupt status register +#define TIMER_O_MIS 0x00000020 // Masked interrupt status reg. +#define TIMER_O_ICR 0x00000024 // Interrupt clear register +#define TIMER_O_TAILR 0x00000028 // TimerA interval load register +#define TIMER_O_TBILR 0x0000002C // TimerB interval load register +#define TIMER_O_TAMATCHR 0x00000030 // TimerA match register +#define TIMER_O_TBMATCHR 0x00000034 // TimerB match register +#define TIMER_O_TAPR 0x00000038 // TimerA prescale register +#define TIMER_O_TBPR 0x0000003C // TimerB prescale register +#define TIMER_O_TAPMR 0x00000040 // TimerA prescale match register +#define TIMER_O_TBPMR 0x00000044 // TimerB prescale match register +#define TIMER_O_TAR 0x00000048 // TimerA register +#define TIMER_O_TBR 0x0000004C // TimerB register + +//***************************************************************************** +// +// The following define the reset values of the timer registers. +// +//***************************************************************************** +#define TIMER_RV_CFG 0x00000000 // Configuration register RV +#define TIMER_RV_TAMR 0x00000000 // TimerA mode register RV +#define TIMER_RV_TBMR 0x00000000 // TimerB mode register RV +#define TIMER_RV_CTL 0x00000000 // Control register RV +#define TIMER_RV_IMR 0x00000000 // Interrupt mask register RV +#define TIMER_RV_RIS 0x00000000 // Interrupt status register RV +#define TIMER_RV_MIS 0x00000000 // Masked interrupt status reg RV +#define TIMER_RV_ICR 0x00000000 // Interrupt clear register RV +#define TIMER_RV_TAILR 0xFFFFFFFF // TimerA interval load reg RV +#define TIMER_RV_TBILR 0x0000FFFF // TimerB interval load reg RV +#define TIMER_RV_TAMATCHR 0xFFFFFFFF // TimerA match register RV +#define TIMER_RV_TBMATCHR 0x0000FFFF // TimerB match register RV +#define TIMER_RV_TAPR 0x00000000 // TimerA prescale register RV +#define TIMER_RV_TBPR 0x00000000 // TimerB prescale register RV +#define TIMER_RV_TAPMR 0x00000000 // TimerA prescale match reg RV +#define TIMER_RV_TBPMR 0x00000000 // TimerB prescale match regi RV +#define TIMER_RV_TAR 0xFFFFFFFF // TimerA register RV +#define TIMER_RV_TBR 0x0000FFFF // TimerB register RV + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_CFG register. +// +//***************************************************************************** +#define TIMER_CFG_CFG_MSK 0x00000007 // Configuration options mask +#define TIMER_CFG_16_BIT 0x00000004 // Two 16 bit timers +#define TIMER_CFG_32_BIT_RTC 0x00000001 // 32 bit RTC +#define TIMER_CFG_32_BIT_TIMER 0x00000000 // 32 bit timer + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TnMR register. +// +//***************************************************************************** +#define TIMER_TNMR_TNAMS 0x00000008 // Alternate mode select +#define TIMER_TNMR_TNCMR 0x00000004 // Capture mode - count or time +#define TIMER_TNMR_TNTMR_MSK 0x00000003 // Timer mode mask +#define TIMER_TNMR_TNTMR_CAP 0x00000003 // Mode - capture +#define TIMER_TNMR_TNTMR_PERIOD 0x00000002 // Mode - periodic +#define TIMER_TNMR_TNTMR_1_SHOT 0x00000001 // Mode - one shot + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_CTL register. +// +//***************************************************************************** +#define TIMER_CTL_TBPWML 0x00004000 // TimerB PWM output level invert +#define TIMER_CTL_TBOTE 0x00002000 // TimerB output trigger enable +#define TIMER_CTL_TBEVENT_MSK 0x00000C00 // TimerB event mode mask +#define TIMER_CTL_TBEVENT_BOTH 0x00000C00 // TimerB event mode - both edges +#define TIMER_CTL_TBEVENT_NEG 0x00000400 // TimerB event mode - neg edge +#define TIMER_CTL_TBEVENT_POS 0x00000000 // TimerB event mode - pos edge +#define TIMER_CTL_TBSTALL 0x00000200 // TimerB stall enable +#define TIMER_CTL_TBEN 0x00000100 // TimerB enable +#define TIMER_CTL_TAPWML 0x00000040 // TimerA PWM output level invert +#define TIMER_CTL_TAOTE 0x00000020 // TimerA output trigger enable +#define TIMER_CTL_RTCEN 0x00000010 // RTC counter enable +#define TIMER_CTL_TAEVENT_MSK 0x0000000C // TimerA event mode mask +#define TIMER_CTL_TAEVENT_BOTH 0x0000000C // TimerA event mode - both edges +#define TIMER_CTL_TAEVENT_NEG 0x00000004 // TimerA event mode - neg edge +#define TIMER_CTL_TAEVENT_POS 0x00000000 // TimerA event mode - pos edge +#define TIMER_CTL_TASTALL 0x00000002 // TimerA stall enable +#define TIMER_CTL_TAEN 0x00000001 // TimerA enable + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_IMR register. +// +//***************************************************************************** +#define TIMER_IMR_CBEIM 0x00000400 // CaptureB event interrupt mask +#define TIMER_IMR_CBMIM 0x00000200 // CaptureB match interrupt mask +#define TIMER_IMR_TBTOIM 0x00000100 // TimerB time out interrupt mask +#define TIMER_IMR_RTCIM 0x00000008 // RTC interrupt mask +#define TIMER_IMR_CAEIM 0x00000004 // CaptureA event interrupt mask +#define TIMER_IMR_CAMIM 0x00000002 // CaptureA match interrupt mask +#define TIMER_IMR_TATOIM 0x00000001 // TimerA time out interrupt mask + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_RIS register. +// +//***************************************************************************** +#define TIMER_RIS_CBERIS 0x00000400 // CaptureB event raw int status +#define TIMER_RIS_CBMRIS 0x00000200 // CaptureB match raw int status +#define TIMER_RIS_TBTORIS 0x00000100 // TimerB time out raw int status +#define TIMER_RIS_RTCRIS 0x00000008 // RTC raw int status +#define TIMER_RIS_CAERIS 0x00000004 // CaptureA event raw int status +#define TIMER_RIS_CAMRIS 0x00000002 // CaptureA match raw int status +#define TIMER_RIS_TATORIS 0x00000001 // TimerA time out raw int status + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_MIS register. +// +//***************************************************************************** +#define TIMER_RIS_CBEMIS 0x00000400 // CaptureB event masked int status +#define TIMER_RIS_CBMMIS 0x00000200 // CaptureB match masked int status +#define TIMER_RIS_TBTOMIS 0x00000100 // TimerB time out masked int stat +#define TIMER_RIS_RTCMIS 0x00000008 // RTC masked int status +#define TIMER_RIS_CAEMIS 0x00000004 // CaptureA event masked int status +#define TIMER_RIS_CAMMIS 0x00000002 // CaptureA match masked int status +#define TIMER_RIS_TATOMIS 0x00000001 // TimerA time out masked int stat + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_ICR register. +// +//***************************************************************************** +#define TIMER_ICR_CBECINT 0x00000400 // CaptureB event interrupt clear +#define TIMER_ICR_CBMCINT 0x00000200 // CaptureB match interrupt clear +#define TIMER_ICR_TBTOCINT 0x00000100 // TimerB time out interrupt clear +#define TIMER_ICR_RTCCINT 0x00000008 // RTC interrupt clear +#define TIMER_ICR_CAECINT 0x00000004 // CaptureA event interrupt clear +#define TIMER_ICR_CAMCINT 0x00000002 // CaptureA match interrupt clear +#define TIMER_ICR_TATOCINT 0x00000001 // TimerA time out interrupt clear + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TAILR register. +// +//***************************************************************************** +#define TIMER_TAILR_TAILRH 0xFFFF0000 // TimerB load val in 32 bit mode +#define TIMER_TAILR_TAILRL 0x0000FFFF // TimerA interval load value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TBILR register. +// +//***************************************************************************** +#define TIMER_TBILR_TBILRL 0x0000FFFF // TimerB interval load value + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TAMATCHR register. +// +//***************************************************************************** +#define TIMER_TAMATCHR_TAMRH 0xFFFF0000 // TimerB match val in 32 bit mode +#define TIMER_TAMATCHR_TAMRL 0x0000FFFF // TimerA match value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TBMATCHR register. +// +//***************************************************************************** +#define TIMER_TBMATCHR_TBMRL 0x0000FFFF // TimerB match load value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TnPR register. +// +//***************************************************************************** +#define TIMER_TNPR_TNPSR 0x000000FF // TimerN prescale value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TnPMR register. +// +//***************************************************************************** +#define TIMER_TNPMR_TNPSMR 0x000000FF // TimerN prescale match value + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TAR register. +// +//***************************************************************************** +#define TIMER_TAR_TARH 0xFFFF0000 // TimerB val in 32 bit mode +#define TIMER_TAR_TARL 0x0000FFFF // TimerA value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TBR register. +// +//***************************************************************************** +#define TIMER_TBR_TBRL 0x0000FFFF // TimerB value + +#endif // __HW_TIMER_H__ diff --git a/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_types.h b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_types.h new file mode 100644 index 000000000..974a85594 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_types.h @@ -0,0 +1,129 @@ +//***************************************************************************** +// +// hw_types.h - Common types and macros. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_TYPES_H__ +#define __HW_TYPES_H__ + +//***************************************************************************** +// +// Define a boolean type, and values for true and false. +// +//***************************************************************************** +typedef unsigned char tBoolean; + +#ifndef true +#define true 1 +#endif + +#ifndef false +#define false 0 +#endif + +//***************************************************************************** +// +// Macros for hardware access, both direct and via the bit-band region. +// +//***************************************************************************** +#define HWREG(x) \ + (*((volatile unsigned long *)(x))) +#define HWREGH(x) \ + (*((volatile unsigned short *)(x))) +#define HWREGB(x) \ + (*((volatile unsigned char *)(x))) +#define HWREGBITW(x, b) \ + HWREG(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) +#define HWREGBITH(x, b) \ + HWREGH(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) +#define HWREGBITB(x, b) \ + HWREGB(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) + +//***************************************************************************** +// +// Helper Macros for determining silicon revisions, etc. +// +// These macros will be used by Driverlib at "run-time" to create necessary +// conditional code blocks that will allow a single version of the Driverlib +// "binary" code to support multiple(all) Stellaris silicon revisions. +// +// It is expected that these macros will be used inside of a standard 'C' +// conditional block of code, e.g. +// +// if(DEVICE_IS_SANDSTORM()) +// { +// do some Sandstorm specific code here. +// } +// +// By default, these macros will be defined as run-time checks of the +// appropriate register(s) to allow creation of run-time conditional code +// blocks for a common DriverLib across the entire Stellaris family. +// +// However, if code-space optimization is required, these macros can be "hard- +// coded" for a specific version of Stellaris silicon. Many compilers will +// then detect the "hard-coded" conditionals, and appropriately optimize the +// code blocks, eliminating any "unreachable" code. This would result in +// a smaller Driverlib, thus producing a smaller final application size, but +// at the cost of limiting the Driverlib binary to a specific Stellaris +// silicon revision. +// +//***************************************************************************** +#ifndef DEVICE_IS_SANDSTORM +#define DEVICE_IS_SANDSTORM \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_VER_MASK) == SYSCTL_DID0_VER_0) || \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_VER_MASK) == SYSCTL_DID0_VER_1) && \ + ((HWREG(SYSCTL_DID0) & SYSCTL_DID0_CLASS_MASK) == \ + SYSCTL_DID0_CLASS_SANDSTORM))) +#endif + +#ifndef DEVICE_IS_FURY +#define DEVICE_IS_FURY \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_VER_MASK) == SYSCTL_DID0_VER_1) && \ + ((HWREG(SYSCTL_DID0) & SYSCTL_DID0_CLASS_MASK) == \ + SYSCTL_DID0_CLASS_FURY)) +#endif + +#ifndef DEVICE_IS_REVA2 +#define DEVICE_IS_REVA2 \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MAJ_MASK) == SYSCTL_DID0_MAJ_A) && \ + ((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MIN_MASK) == SYSCTL_DID0_MIN_2)) +#endif + +#ifndef DEVICE_IS_REVC1 +#define DEVICE_IS_REVC1 \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MAJ_MASK) == SYSCTL_DID0_MAJ_C) && \ + ((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MIN_MASK) == SYSCTL_DID0_MIN_1)) +#endif + +#ifndef DEVICE_IS_REVC2 +#define DEVICE_IS_REVC2 \ + (((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MAJ_MASK) == SYSCTL_DID0_MAJ_C) && \ + ((HWREG(SYSCTL_DID0) & SYSCTL_DID0_MIN_MASK) == SYSCTL_DID0_MIN_2)) +#endif + +#endif // __HW_TYPES_H__ diff --git a/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_uart.h b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_uart.h new file mode 100644 index 000000000..e5bb1c47e --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_uart.h @@ -0,0 +1,241 @@ +//***************************************************************************** +// +// hw_uart.h - Macros and defines used when accessing the UART hardware +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_UART_H__ +#define __HW_UART_H__ + +//***************************************************************************** +// +// UART Register Offsets. +// +//***************************************************************************** +#define UART_O_DR 0x00000000 // Data Register +#define UART_O_RSR 0x00000004 // Receive Status Register (read) +#define UART_O_ECR 0x00000004 // Error Clear Register (write) +#define UART_O_FR 0x00000018 // Flag Register (read only) +#define UART_O_IBRD 0x00000024 // Integer Baud Rate Divisor Reg +#define UART_O_FBRD 0x00000028 // Fractional Baud Rate Divisor Reg +#define UART_O_LCR_H 0x0000002C // Line Control Register, HIGH byte +#define UART_O_CTL 0x00000030 // Control Register +#define UART_O_IFLS 0x00000034 // Interrupt FIFO Level Select Reg +#define UART_O_IM 0x00000038 // Interrupt Mask Set/Clear Reg +#define UART_O_RIS 0x0000003C // Raw Interrupt Status Register +#define UART_O_MIS 0x00000040 // Masked Interrupt Status Register +#define UART_O_ICR 0x00000044 // Interrupt Clear Register +#define UART_O_PeriphID4 0x00000FD0 // +#define UART_O_PeriphID5 0x00000FD4 // +#define UART_O_PeriphID6 0x00000FD8 // +#define UART_O_PeriphID7 0x00000FDC // +#define UART_O_PeriphID0 0x00000FE0 // +#define UART_O_PeriphID1 0x00000FE4 // +#define UART_O_PeriphID2 0x00000FE8 // +#define UART_O_PeriphID3 0x00000FEC // +#define UART_O_PCellID0 0x00000FF0 // +#define UART_O_PCellID1 0x00000FF4 // +#define UART_O_PCellID2 0x00000FF8 // +#define UART_O_PCellID3 0x00000FFC // + +//***************************************************************************** +// +// Data Register bits +// +//***************************************************************************** +#define UART_DR_OE 0x00000800 // Overrun Error +#define UART_DR_BE 0x00000400 // Break Error +#define UART_DR_PE 0x00000200 // Parity Error +#define UART_DR_FE 0x00000100 // Framing Error +#define UART_DR_DATA_MASK 0x000000FF // UART data + +//***************************************************************************** +// +// Receive Status Register bits +// +//***************************************************************************** +#define UART_RSR_OE 0x00000008 // Overrun Error +#define UART_RSR_BE 0x00000004 // Break Error +#define UART_RSR_PE 0x00000002 // Parity Error +#define UART_RSR_FE 0x00000001 // Framing Error + +//***************************************************************************** +// +// Flag Register bits +// +//***************************************************************************** +#define UART_FR_TXFE 0x00000080 // TX FIFO Empty +#define UART_FR_RXFF 0x00000040 // RX FIFO Full +#define UART_FR_TXFF 0x00000020 // TX FIFO Full +#define UART_FR_RXFE 0x00000010 // RX FIFO Empty +#define UART_FR_BUSY 0x00000008 // UART Busy + +//***************************************************************************** +// +// Integer baud-rate divisor +// +//***************************************************************************** +#define UART_IBRD_DIVINT_MASK 0x0000FFFF // Integer baud-rate divisor + +//***************************************************************************** +// +// Fractional baud-rate divisor +// +//***************************************************************************** +#define UART_FBRD_DIVFRAC_MASK 0x0000003F // Fractional baud-rate divisor + +//***************************************************************************** +// +// Line Control Register High bits +// +//***************************************************************************** +#define UART_LCR_H_SPS 0x00000080 // Stick Parity Select +#define UART_LCR_H_WLEN 0x00000060 // Word length +#define UART_LCR_H_WLEN_8 0x00000060 // 8 bit data +#define UART_LCR_H_WLEN_7 0x00000040 // 7 bit data +#define UART_LCR_H_WLEN_6 0x00000020 // 6 bit data +#define UART_LCR_H_WLEN_5 0x00000000 // 5 bit data +#define UART_LCR_H_FEN 0x00000010 // Enable FIFO +#define UART_LCR_H_STP2 0x00000008 // Two Stop Bits Select +#define UART_LCR_H_EPS 0x00000004 // Even Parity Select +#define UART_LCR_H_PEN 0x00000002 // Parity Enable +#define UART_LCR_H_BRK 0x00000001 // Send Break + +//***************************************************************************** +// +// Control Register bits +// +//***************************************************************************** +#define UART_CTL_RXE 0x00000200 // Receive Enable +#define UART_CTL_TXE 0x00000100 // Transmit Enable +#define UART_CTL_LBE 0x00000080 // Loopback Enable +#define UART_CTL_SIRLP 0x00000004 // SIR (IrDA) Low Power Enable +#define UART_CTL_SIREN 0x00000002 // SIR (IrDA) Enable +#define UART_CTL_UARTEN 0x00000001 // UART Enable + +//***************************************************************************** +// +// Interrupt FIFO Level Select Register bits +// +//***************************************************************************** +#define UART_IFLS_RX1_8 0x00000000 // 1/8 Full +#define UART_IFLS_RX2_8 0x00000010 // 1/4 Full +#define UART_IFLS_RX4_8 0x00000020 // 1/2 Full +#define UART_IFLS_RX6_8 0x00000030 // 3/4 Full +#define UART_IFLS_RX7_8 0x00000040 // 7/8 Full +#define UART_IFLS_TX1_8 0x00000000 // 1/8 Full +#define UART_IFLS_TX2_8 0x00000001 // 1/4 Full +#define UART_IFLS_TX4_8 0x00000002 // 1/2 Full +#define UART_IFLS_TX6_8 0x00000003 // 3/4 Full +#define UART_IFLS_TX7_8 0x00000004 // 7/8 Full + +//***************************************************************************** +// +// Interrupt Mask Set/Clear Register bits +// +//***************************************************************************** +#define UART_IM_OEIM 0x00000400 // Overrun Error Interrupt Mask +#define UART_IM_BEIM 0x00000200 // Break Error Interrupt Mask +#define UART_IM_PEIM 0x00000100 // Parity Error Interrupt Mask +#define UART_IM_FEIM 0x00000080 // Framing Error Interrupt Mask +#define UART_IM_RTIM 0x00000040 // Receive Timeout Interrupt Mask +#define UART_IM_TXIM 0x00000020 // Transmit Interrupt Mask +#define UART_IM_RXIM 0x00000010 // Receive Interrupt Mask + +//***************************************************************************** +// +// Raw Interrupt Status Register +// +//***************************************************************************** +#define UART_RIS_OERIS 0x00000400 // Overrun Error Interrupt Status +#define UART_RIS_BERIS 0x00000200 // Break Error Interrupt Status +#define UART_RIS_PERIS 0x00000100 // Parity Error Interrupt Status +#define UART_RIS_FERIS 0x00000080 // Framing Error Interrupt Status +#define UART_RIS_RTRIS 0x00000040 // Receive Timeout Interrupt Status +#define UART_RIS_TXRIS 0x00000020 // Transmit Interrupt Status +#define UART_RIS_RXRIS 0x00000010 // Receive Interrupt Status + +//***************************************************************************** +// +// Masked Interrupt Status Register +// +//***************************************************************************** +#define UART_MIS_OEMIS 0x00000400 // Overrun Error Interrupt Status +#define UART_MIS_BEMIS 0x00000200 // Break Error Interrupt Status +#define UART_MIS_PEMIS 0x00000100 // Parity Error Interrupt Status +#define UART_MIS_FEMIS 0x00000080 // Framing Error Interrupt Status +#define UART_MIS_RTMIS 0x00000040 // Receive Timeout Interrupt Status +#define UART_MIS_TXMIS 0x00000020 // Transmit Interrupt Status +#define UART_MIS_RXMIS 0x00000010 // Receive Interrupt Status + +//***************************************************************************** +// +// Interrupt Clear Register bits +// +//***************************************************************************** +#define UART_ICR_OEIC 0x00000400 // Overrun Error Interrupt Clear +#define UART_ICR_BEIC 0x00000200 // Break Error Interrupt Clear +#define UART_ICR_PEIC 0x00000100 // Parity Error Interrupt Clear +#define UART_ICR_FEIC 0x00000080 // Framing Error Interrupt Clear +#define UART_ICR_RTIC 0x00000040 // Receive Timeout Interrupt Clear +#define UART_ICR_TXIC 0x00000020 // Transmit Interrupt Clear +#define UART_ICR_RXIC 0x00000010 // Receive Interrupt Clear + +#define UART_RSR_ANY (UART_RSR_OE | \ + UART_RSR_BE | \ + UART_RSR_PE | \ + UART_RSR_FE) + +//***************************************************************************** +// +// Reset Values for UART Registers. +// +//***************************************************************************** +#define UART_RV_DR 0x00000000 +#define UART_RV_RSR 0x00000000 +#define UART_RV_ECR 0x00000000 +#define UART_RV_FR 0x00000090 +#define UART_RV_IBRD 0x00000000 +#define UART_RV_FBRD 0x00000000 +#define UART_RV_LCR_H 0x00000000 +#define UART_RV_CTL 0x00000300 +#define UART_RV_IFLS 0x00000012 +#define UART_RV_IM 0x00000000 +#define UART_RV_RIS 0x00000000 +#define UART_RV_MIS 0x00000000 +#define UART_RV_ICR 0x00000000 +#define UART_RV_PeriphID4 0x00000000 +#define UART_RV_PeriphID5 0x00000000 +#define UART_RV_PeriphID6 0x00000000 +#define UART_RV_PeriphID7 0x00000000 +#define UART_RV_PeriphID0 0x00000011 +#define UART_RV_PeriphID1 0x00000000 +#define UART_RV_PeriphID2 0x00000018 +#define UART_RV_PeriphID3 0x00000001 +#define UART_RV_PCellID0 0x0000000D +#define UART_RV_PCellID1 0x000000F0 +#define UART_RV_PCellID2 0x00000005 +#define UART_RV_PCellID3 0x000000B1 + +#endif // __HW_UART_H__ diff --git a/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_watchdog.h b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_watchdog.h new file mode 100644 index 000000000..7a3b5a8d9 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/hw_watchdog.h @@ -0,0 +1,116 @@ +//***************************************************************************** +// +// hw_watchdog.h - Macros used when accessing the Watchdog Timer hardware. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __HW_WATCHDOG_H__ +#define __HW_WATCHDOG_H__ + +//***************************************************************************** +// +// The following define the offsets of the Watchdog Timer registers. +// +//***************************************************************************** +#define WDT_O_LOAD 0x00000000 // Load register +#define WDT_O_VALUE 0x00000004 // Current value register +#define WDT_O_CTL 0x00000008 // Control register +#define WDT_O_ICR 0x0000000C // Interrupt clear register +#define WDT_O_RIS 0x00000010 // Raw interrupt status register +#define WDT_O_MIS 0x00000014 // Masked interrupt status register +#define WDT_O_TEST 0x00000418 // Test register +#define WDT_O_LOCK 0x00000C00 // Lock register +#define WDT_O_PeriphID4 0x00000FD0 // +#define WDT_O_PeriphID5 0x00000FD4 // +#define WDT_O_PeriphID6 0x00000FD8 // +#define WDT_O_PeriphID7 0x00000FDC // +#define WDT_O_PeriphID0 0x00000FE0 // +#define WDT_O_PeriphID1 0x00000FE4 // +#define WDT_O_PeriphID2 0x00000FE8 // +#define WDT_O_PeriphID3 0x00000FEC // +#define WDT_O_PCellID0 0x00000FF0 // +#define WDT_O_PCellID1 0x00000FF4 // +#define WDT_O_PCellID2 0x00000FF8 // +#define WDT_O_PCellID3 0x00000FFC // + +//***************************************************************************** +// +// The following define the bit fields in the WDT_CTL register. +// +//***************************************************************************** +#define WDT_CTL_RESEN 0x00000002 // Enable reset output +#define WDT_CTL_INTEN 0x00000001 // Enable the WDT counter and int + +//***************************************************************************** +// +// The following define the bit fields in the WDT_ISR, WDT_RIS, and WDT_MIS +// registers. +// +//***************************************************************************** +#define WDT_INT_TIMEOUT 0x00000001 // Watchdog timer expired + +//***************************************************************************** +// +// The following define the bit fields in the WDT_TEST register. +// +//***************************************************************************** +#define WDT_TEST_STALL 0x00000100 // Watchdog stall enable +#ifndef DEPRECATED +#define WDT_TEST_STALL_EN 0x00000100 // Watchdog stall enable +#endif + +//***************************************************************************** +// +// The following define the bit fields in the WDT_LOCK register. +// +//***************************************************************************** +#define WDT_LOCK_LOCKED 0x00000001 // Watchdog timer is locked +#define WDT_LOCK_UNLOCKED 0x00000000 // Watchdog timer is unlocked +#define WDT_LOCK_UNLOCK 0x1ACCE551 // Unlocks the watchdog timer + +//***************************************************************************** +// +// The following define the reset values for the WDT registers. +// +//***************************************************************************** +#define WDT_RV_LOAD 0xFFFFFFFF // Load register +#define WDT_RV_VALUE 0xFFFFFFFF // Current value register +#define WDT_RV_CTL 0x00000000 // Control register +#define WDT_RV_RIS 0x00000000 // Raw interrupt status register +#define WDT_RV_MIS 0x00000000 // Masked interrupt status register +#define WDT_RV_LOCK 0x00000000 // Lock register +#define WDT_RV_PeriphID4 0x00000000 // +#define WDT_RV_PeriphID5 0x00000000 // +#define WDT_RV_PeriphID6 0x00000000 // +#define WDT_RV_PeriphID7 0x00000000 // +#define WDT_RV_PeriphID0 0x00000005 // +#define WDT_RV_PeriphID1 0x00000018 // +#define WDT_RV_PeriphID2 0x00000018 // +#define WDT_RV_PeriphID3 0x00000001 // +#define WDT_RV_PCellID0 0x0000000D // +#define WDT_RV_PCellID1 0x000000F0 // +#define WDT_RV_PCellID2 0x00000005 // +#define WDT_RV_PCellID3 0x000000B1 // + +#endif // __HW_WATCHDOG_H__ diff --git a/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/i2c.h b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/i2c.h new file mode 100644 index 000000000..46a28eeb5 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/i2c.h @@ -0,0 +1,137 @@ +//***************************************************************************** +// +// i2c.h - Prototypes for the I2C Driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __I2C_H__ +#define __I2C_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Defines for the API. +// +//***************************************************************************** +//***************************************************************************** +// +// Interrupt defines. +// +//***************************************************************************** +#define I2C_INT_MASTER 0x00000001 +#define I2C_INT_SLAVE 0x00000002 + +//***************************************************************************** +// +// I2C Master commands. +// +//***************************************************************************** +#define I2C_MASTER_CMD_SINGLE_SEND \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_SINGLE_RECEIVE \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_START \ + (I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_CONT \ + (I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_FINISH \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_ERROR_STOP \ + (I2C_MASTER_CS_STOP) +#define I2C_MASTER_CMD_BURST_RECEIVE_START \ + (I2C_MASTER_CS_ACK | I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_RECEIVE_CONT \ + (I2C_MASTER_CS_ACK | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_RECEIVE_FINISH \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_RUN) + +//***************************************************************************** +// +// I2C Master error status. +// +//***************************************************************************** +#define I2C_MASTER_ERR_NONE 0 +#define I2C_MASTER_ERR_ADDR_ACK 0x00000004 +#define I2C_MASTER_ERR_DATA_ACK 0x00000008 +#define I2C_MASTER_ERR_ARB_LOST 0x00000010 + +//***************************************************************************** +// +// I2C Slave action requests +// +//***************************************************************************** +#define I2C_SLAVE_ACT_NONE 0 +#define I2C_SLAVE_ACT_RREQ 0x00000001 // Master has sent data +#define I2C_SLAVE_ACT_TREQ 0x00000002 // Master has requested data + +//***************************************************************************** +// Miscellaneous I2C driver definitions. +//***************************************************************************** +#define I2C_MASTER_MAX_RETRIES 1000 // Number of retries + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void I2CIntRegister(unsigned long ulBase, void(fnHandler)(void)); +extern void I2CIntUnregister(unsigned long ulBase); +extern tBoolean I2CMasterBusBusy(unsigned long ulBase); +extern tBoolean I2CMasterBusy(unsigned long ulBase); +extern void I2CMasterControl(unsigned long ulBase, unsigned long ulCmd); +extern unsigned long I2CMasterDataGet(unsigned long ulBase); +extern void I2CMasterDataPut(unsigned long ulBase, unsigned char ucData); +extern void I2CMasterDisable(unsigned long ulBase); +extern void I2CMasterEnable(unsigned long ulBase); +extern unsigned long I2CMasterErr(unsigned long ulBase); +extern void I2CMasterInit(unsigned long ulBase, tBoolean bFast); +extern void I2CMasterIntClear(unsigned long ulBase); +extern void I2CMasterIntDisable(unsigned long ulBase); +extern void I2CMasterIntEnable(unsigned long ulBase); +extern tBoolean I2CMasterIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void I2CMasterSlaveAddrSet(unsigned long ulBase, + unsigned char ucSlaveAddr, + tBoolean bReceive); +extern unsigned long I2CSlaveDataGet(unsigned long ulBase); +extern void I2CSlaveDataPut(unsigned long ulBase, unsigned char ucData); +extern void I2CSlaveDisable(unsigned long ulBase); +extern void I2CSlaveEnable(unsigned long ulBase); +extern void I2CSlaveInit(unsigned long ulBase, unsigned char ucSlaveAddr); +extern void I2CSlaveIntClear(unsigned long ulBase); +extern void I2CSlaveIntDisable(unsigned long ulBase); +extern void I2CSlaveIntEnable(unsigned long ulBase); +extern tBoolean I2CSlaveIntStatus(unsigned long ulBase, tBoolean bMasked); +extern unsigned long I2CSlaveStatus(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __I2C_H__ diff --git a/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/interrupt.h b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/interrupt.h new file mode 100644 index 000000000..1ce70f16b --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/interrupt.h @@ -0,0 +1,57 @@ +//***************************************************************************** +// +// interrupt.h - Prototypes for the NVIC Interrupt Controller Driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __INTERRUPT_H__ +#define __INTERRUPT_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void IntMasterEnable(void); +extern void IntMasterDisable(void); +extern void IntRegister(unsigned long ulInterrupt, void (*pfnHandler)(void)); +extern void IntUnregister(unsigned long ulInterrupt); +extern void IntPriorityGroupingSet(unsigned long ulBits); +extern unsigned long IntPriorityGroupingGet(void); +extern void IntPrioritySet(unsigned long ulInterrupt, + unsigned char ucPriority); +extern long IntPriorityGet(unsigned long ulInterrupt); +extern void IntEnable(unsigned long ulInterrupt); +extern void IntDisable(unsigned long ulInterrupt); + +#ifdef __cplusplus +} +#endif + +#endif // __INTERRUPT_H__ diff --git a/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/lmi_flash.h b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/lmi_flash.h new file mode 100644 index 000000000..75d30c41c --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/lmi_flash.h @@ -0,0 +1,78 @@ +//***************************************************************************** +// +// flash.h - Prototypes for the flash driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __FLASH_H__ +#define __FLASH_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to FlashProtectSet(), and returned by +// FlashProtectGet(). +// +//***************************************************************************** +typedef enum +{ + FlashReadWrite, // Flash can be read and written + FlashReadOnly, // Flash can only be read + FlashExecuteOnly // Flash can only be executed +} +tFlashProtection; + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern unsigned long FlashUsecGet(void); +extern void FlashUsecSet(unsigned long ulClocks); +extern long FlashErase(unsigned long ulAddress); +extern long FlashProgram(unsigned long *pulData, unsigned long ulAddress, + unsigned long ulCount); +extern tFlashProtection FlashProtectGet(unsigned long ulAddress); +extern long FlashProtectSet(unsigned long ulAddress, + tFlashProtection eProtect); +extern long FlashProtectSave(void); +extern long FlashUserGet(unsigned long *pulUser0, unsigned long *pulUser1); +extern long FlashUserSet(unsigned long ulUser0, unsigned long ulUser1); +extern long FlashUserSave(void); +extern void FlashIntRegister(void (*pfnHandler)(void)); +extern void FlashIntUnregister(void); +extern void FlashIntEnable(unsigned long ulIntFlags); +extern void FlashIntDisable(unsigned long ulIntFlags); +extern unsigned long FlashIntGetStatus(tBoolean bMasked); +extern void FlashIntClear(unsigned long ulIntFlags); + +#ifdef __cplusplus +} +#endif + +#endif // __FLASH_H__ diff --git a/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/lmi_timer.h b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/lmi_timer.h new file mode 100644 index 000000000..85b3160ab --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/lmi_timer.h @@ -0,0 +1,137 @@ +//***************************************************************************** +// +// timer.h - Prototypes for the timer module +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __TIMER_H__ +#define __TIMER_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to TimerConfigure as the ulConfig parameter. +// +//***************************************************************************** +#define TIMER_CFG_32_BIT_OS 0x00000001 // 32-bit one-shot timer +#define TIMER_CFG_32_BIT_PER 0x00000002 // 32-bit periodic timer +#define TIMER_CFG_32_RTC 0x01000000 // 32-bit RTC timer +#define TIMER_CFG_16_BIT_PAIR 0x04000000 // Two 16-bit timers +#define TIMER_CFG_A_ONE_SHOT 0x00000001 // Timer A one-shot timer +#define TIMER_CFG_A_PERIODIC 0x00000002 // Timer A periodic timer +#define TIMER_CFG_A_CAP_COUNT 0x00000003 // Timer A event counter +#define TIMER_CFG_A_CAP_TIME 0x00000007 // Timer A event timer +#define TIMER_CFG_A_PWM 0x0000000A // Timer A PWM output +#define TIMER_CFG_B_ONE_SHOT 0x00000100 // Timer B one-shot timer +#define TIMER_CFG_B_PERIODIC 0x00000200 // Timer B periodic timer +#define TIMER_CFG_B_CAP_COUNT 0x00000300 // Timer B event counter +#define TIMER_CFG_B_CAP_TIME 0x00000700 // Timer B event timer +#define TIMER_CFG_B_PWM 0x00000A00 // Timer B PWM output + +//***************************************************************************** +// +// Values that can be passed to TimerIntEnable, TimerIntDisable, and +// TimerIntClear as the ulIntFlags parameter, and returned from TimerIntStatus. +// +//***************************************************************************** +#define TIMER_CAPB_EVENT 0x00000400 // CaptureB event interrupt +#define TIMER_CAPB_MATCH 0x00000200 // CaptureB match interrupt +#define TIMER_TIMB_TIMEOUT 0x00000100 // TimerB time out interrupt +#define TIMER_RTC_MATCH 0x00000008 // RTC interrupt mask +#define TIMER_CAPA_EVENT 0x00000004 // CaptureA event interrupt +#define TIMER_CAPA_MATCH 0x00000002 // CaptureA match interrupt +#define TIMER_TIMA_TIMEOUT 0x00000001 // TimerA time out interrupt + +//***************************************************************************** +// +// Values that can be passed to TimerControlEvent as the ulEvent parameter. +// +//***************************************************************************** +#define TIMER_EVENT_POS_EDGE 0x00000000 // Count positive edges +#define TIMER_EVENT_NEG_EDGE 0x00000404 // Count negative edges +#define TIMER_EVENT_BOTH_EDGES 0x00000C0C // Count both edges + +//***************************************************************************** +// +// Values that can be passed to most of the timer APIs as the ulTimer +// parameter. +// +//***************************************************************************** +#define TIMER_A 0x000000ff // Timer A +#define TIMER_B 0x0000ff00 // Timer B +#define TIMER_BOTH 0x0000ffff // Timer Both + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void TimerEnable(unsigned long ulBase, unsigned long ulTimer); +extern void TimerDisable(unsigned long ulBase, unsigned long ulTimer); +extern void TimerConfigure(unsigned long ulBase, unsigned long ulConfig); +extern void TimerControlLevel(unsigned long ulBase, unsigned long ulTimer, + tBoolean bInvert); +extern void TimerControlTrigger(unsigned long ulBase, unsigned long ulTimer, + tBoolean bEnable); +extern void TimerControlEvent(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulEvent); +extern void TimerControlStall(unsigned long ulBase, unsigned long ulTimer, + tBoolean bStall); +extern void TimerRTCEnable(unsigned long ulBase); +extern void TimerRTCDisable(unsigned long ulBase); +extern void TimerPrescaleSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerPrescaleGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerPrescaleMatchSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerPrescaleMatchGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerLoadSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerLoadGet(unsigned long ulBase, unsigned long ulTimer); +extern unsigned long TimerValueGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerMatchSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerMatchGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerIntRegister(unsigned long ulBase, unsigned long ulTimer, + void (*pfnHandler)(void)); +extern void TimerIntUnregister(unsigned long ulBase, unsigned long ulTimer); +extern void TimerIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void TimerIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long TimerIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void TimerIntClear(unsigned long ulBase, unsigned long ulIntFlags); +extern void TimerQuiesce(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __TIMER_H__ diff --git a/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/osram128x64x4.c b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/osram128x64x4.c new file mode 100644 index 000000000..3353a82e6 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/osram128x64x4.c @@ -0,0 +1,933 @@ +//***************************************************************************** +// +// osram128x64x4.c - Driver for the OSRAM 128x64x4 graphical OLED display. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup ek_lm3sx965_api +//! @{ +// +//***************************************************************************** + +#include "hw_ssi.h" +#include "hw_memmap.h" +#include "hw_sysctl.h" +#include "hw_types.h" +#include "debug.h" +#include "gpio.h" +#include "ssi.h" +#include "sysctl.h" +#include "osram128x64x4.h" + +//***************************************************************************** +// +// Flag to indicate if SSI port is enabled for OSRAM usage. +// +//***************************************************************************** +static volatile tBoolean g_bSSIEnabled = false; + +//***************************************************************************** +// +// Define the OSRAM 128x64x4 Remap Setting(s). This will be used in +// several places in the code to switch between vertical and horizontal +// address incrementing. +// +// The Remap Command (0xA0) takes one 8-bit parameter. The parameter is +// defined as follows. +// +// Bit 7: Reserved +// Bit 6: Disable(0)/Enable(1) COM Split Odd Even +// When enabled, the COM signals are split Odd on one side, even on +// the other. Otherwise, they are split 0-39 on one side, 40-79 on +// the other. +// Bit 5: Reserved +// Bit 4: Disable(0)/Enable(1) COM Remap +// When Enabled, ROW 0-79 map to COM 79-0 (i.e. reverse row order) +// Bit 3: Reserved +// Bit 2: Horizontal(0)/Vertical(1) Address Increment +// When set, data RAM address will increment along the column rather +// than along the row. +// Bit 1: Disable(0)/Enable(1) Nibble Remap +// When enabled, the upper and lower nibbles in the DATA bus for access +// to the data RAM are swapped. +// Bit 0: Disable(0)/Enable(1) Column Address Remap +// When enabled, DATA RAM columns 0-63 are remapped to Segment Columns +// 127-0. +// +//***************************************************************************** +#define OSRAM_INIT_REMAP 0x52 +#define OSRAM_INIT_OFFSET 0x4C +static const unsigned char g_pucOSRAM128x64x4VerticalInc[] = { 0xA0, 0x56 }; +static const unsigned char g_pucOSRAM128x64x4HorizontalInc[] = { 0xA0, 0x52 }; + +//***************************************************************************** +// +// A 5x7 font (in a 6x8 cell, where the sixth column is omitted from this +// table) for displaying text on the OLED display. The data is organized as +// bytes from the left column to the right column, with each byte containing +// the top row in the LSB and the bottom row in the MSB. +// +// Note: This is the same font data that is used in the EK-LM3S811 +// osram96x16x1 driver. The single bit-per-pixel is expaned in the StringDraw +// function to the appropriate four bit-per-pixel gray scale format. +// +//***************************************************************************** +static const unsigned char g_pucFont[96][5] = +{ + { 0x00, 0x00, 0x00, 0x00, 0x00 }, // " " + { 0x00, 0x00, 0x4f, 0x00, 0x00 }, // ! + { 0x00, 0x07, 0x00, 0x07, 0x00 }, // " + { 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // # + { 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $ + { 0x23, 0x13, 0x08, 0x64, 0x62 }, // % + { 0x36, 0x49, 0x55, 0x22, 0x50 }, // & + { 0x00, 0x05, 0x03, 0x00, 0x00 }, // ' + { 0x00, 0x1c, 0x22, 0x41, 0x00 }, // ( + { 0x00, 0x41, 0x22, 0x1c, 0x00 }, // ) + { 0x14, 0x08, 0x3e, 0x08, 0x14 }, // * + { 0x08, 0x08, 0x3e, 0x08, 0x08 }, // + + { 0x00, 0x50, 0x30, 0x00, 0x00 }, // , + { 0x08, 0x08, 0x08, 0x08, 0x08 }, // - + { 0x00, 0x60, 0x60, 0x00, 0x00 }, // . + { 0x20, 0x10, 0x08, 0x04, 0x02 }, // / + { 0x3e, 0x51, 0x49, 0x45, 0x3e }, // 0 + { 0x00, 0x42, 0x7f, 0x40, 0x00 }, // 1 + { 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2 + { 0x21, 0x41, 0x45, 0x4b, 0x31 }, // 3 + { 0x18, 0x14, 0x12, 0x7f, 0x10 }, // 4 + { 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5 + { 0x3c, 0x4a, 0x49, 0x49, 0x30 }, // 6 + { 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7 + { 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8 + { 0x06, 0x49, 0x49, 0x29, 0x1e }, // 9 + { 0x00, 0x36, 0x36, 0x00, 0x00 }, // : + { 0x00, 0x56, 0x36, 0x00, 0x00 }, // ; + { 0x08, 0x14, 0x22, 0x41, 0x00 }, // < + { 0x14, 0x14, 0x14, 0x14, 0x14 }, // = + { 0x00, 0x41, 0x22, 0x14, 0x08 }, // > + { 0x02, 0x01, 0x51, 0x09, 0x06 }, // ? + { 0x32, 0x49, 0x79, 0x41, 0x3e }, // @ + { 0x7e, 0x11, 0x11, 0x11, 0x7e }, // A + { 0x7f, 0x49, 0x49, 0x49, 0x36 }, // B + { 0x3e, 0x41, 0x41, 0x41, 0x22 }, // C + { 0x7f, 0x41, 0x41, 0x22, 0x1c }, // D + { 0x7f, 0x49, 0x49, 0x49, 0x41 }, // E + { 0x7f, 0x09, 0x09, 0x09, 0x01 }, // F + { 0x3e, 0x41, 0x49, 0x49, 0x7a }, // G + { 0x7f, 0x08, 0x08, 0x08, 0x7f }, // H + { 0x00, 0x41, 0x7f, 0x41, 0x00 }, // I + { 0x20, 0x40, 0x41, 0x3f, 0x01 }, // J + { 0x7f, 0x08, 0x14, 0x22, 0x41 }, // K + { 0x7f, 0x40, 0x40, 0x40, 0x40 }, // L + { 0x7f, 0x02, 0x0c, 0x02, 0x7f }, // M + { 0x7f, 0x04, 0x08, 0x10, 0x7f }, // N + { 0x3e, 0x41, 0x41, 0x41, 0x3e }, // O + { 0x7f, 0x09, 0x09, 0x09, 0x06 }, // P + { 0x3e, 0x41, 0x51, 0x21, 0x5e }, // Q + { 0x7f, 0x09, 0x19, 0x29, 0x46 }, // R + { 0x46, 0x49, 0x49, 0x49, 0x31 }, // S + { 0x01, 0x01, 0x7f, 0x01, 0x01 }, // T + { 0x3f, 0x40, 0x40, 0x40, 0x3f }, // U + { 0x1f, 0x20, 0x40, 0x20, 0x1f }, // V + { 0x3f, 0x40, 0x38, 0x40, 0x3f }, // W + { 0x63, 0x14, 0x08, 0x14, 0x63 }, // X + { 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y + { 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z + { 0x00, 0x7f, 0x41, 0x41, 0x00 }, // [ + { 0x02, 0x04, 0x08, 0x10, 0x20 }, // "\" + { 0x00, 0x41, 0x41, 0x7f, 0x00 }, // ] + { 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^ + { 0x40, 0x40, 0x40, 0x40, 0x40 }, // _ + { 0x00, 0x01, 0x02, 0x04, 0x00 }, // ` + { 0x20, 0x54, 0x54, 0x54, 0x78 }, // a + { 0x7f, 0x48, 0x44, 0x44, 0x38 }, // b + { 0x38, 0x44, 0x44, 0x44, 0x20 }, // c + { 0x38, 0x44, 0x44, 0x48, 0x7f }, // d + { 0x38, 0x54, 0x54, 0x54, 0x18 }, // e + { 0x08, 0x7e, 0x09, 0x01, 0x02 }, // f + { 0x0c, 0x52, 0x52, 0x52, 0x3e }, // g + { 0x7f, 0x08, 0x04, 0x04, 0x78 }, // h + { 0x00, 0x44, 0x7d, 0x40, 0x00 }, // i + { 0x20, 0x40, 0x44, 0x3d, 0x00 }, // j + { 0x7f, 0x10, 0x28, 0x44, 0x00 }, // k + { 0x00, 0x41, 0x7f, 0x40, 0x00 }, // l + { 0x7c, 0x04, 0x18, 0x04, 0x78 }, // m + { 0x7c, 0x08, 0x04, 0x04, 0x78 }, // n + { 0x38, 0x44, 0x44, 0x44, 0x38 }, // o + { 0x7c, 0x14, 0x14, 0x14, 0x08 }, // p + { 0x08, 0x14, 0x14, 0x18, 0x7c }, // q + { 0x7c, 0x08, 0x04, 0x04, 0x08 }, // r + { 0x48, 0x54, 0x54, 0x54, 0x20 }, // s + { 0x04, 0x3f, 0x44, 0x40, 0x20 }, // t + { 0x3c, 0x40, 0x40, 0x20, 0x7c }, // u + { 0x1c, 0x20, 0x40, 0x20, 0x1c }, // v + { 0x3c, 0x40, 0x30, 0x40, 0x3c }, // w + { 0x44, 0x28, 0x10, 0x28, 0x44 }, // x + { 0x0c, 0x50, 0x50, 0x50, 0x3c }, // y + { 0x44, 0x64, 0x54, 0x4c, 0x44 }, // z + { 0x00, 0x08, 0x36, 0x41, 0x00 }, // { + { 0x00, 0x00, 0x7f, 0x00, 0x00 }, // | + { 0x00, 0x41, 0x36, 0x08, 0x00 }, // } + { 0x02, 0x01, 0x02, 0x04, 0x02 }, // ~ + { 0x02, 0x01, 0x02, 0x04, 0x02 }, // ~ +}; + +//***************************************************************************** +// +// The sequence of commands used to initialize the SSD0303 controller. Each +// command is described as follows: there is a byte specifying the number of +// bytes in the command sequence, followed by that many bytes of command data. +// Note: This initialization sequence is derived from OSRAM App Note AN018. +// +//***************************************************************************** +static const unsigned char g_pucOSRAM128x64x4Init[] = +{ + // + // Column Address + // + 4, 0x15, 0, 63, 0xe3, + + // + // Row Address + // + 4, 0x75, 0, 63, 0xe3, + + // + // Contrast Control + // + 3, 0x81, 50, 0xe3, + + // + // Half Current Range + // + 2, 0x85, 0xe3, + + // + // Display Re-map + // + 3, 0xA0, OSRAM_INIT_REMAP, 0xe3, + + // + // Display Start Line + // + 3, 0xA1, 0, 0xe3, + + // + // Display Offset + // + 3, 0xA2, OSRAM_INIT_OFFSET, 0xe3, + + // + // Display Mode Normal + // + 2, 0xA4, 0xe3, + + // + // Multiplex Ratio + // + 3, 0xA8, 63, 0xe3, + + // + // Phase Length + // + 3, 0xB1, 0x22, 0xe3, + + // + // Row Period + // + 3, 0xB2, 70, 0xe3, + + // + // Display Clock Divide + // + 3, 0xB3, 0xF1, 0xe3, + + // + // VSL + // + 3, 0xBF, 0x0D, 0xe3, + + // + // VCOMH + // + 3, 0xBE, 0x02, 0xe3, + + // + // VP + // + 3, 0xBC, 0x10, 0xe3, + + // + // Gamma + // + 10, 0xB8, 0x01, 0x11, 0x22, 0x32, 0x43, 0x54, 0x65, 0x76, 0xe3, + + // + // Set DC-DC + 3, 0xAD, 0x03, 0xe3, + + // + // Display ON/OFF + // + 2, 0xAF, 0xe3, +}; + +//***************************************************************************** +// +//! \internal +//! +//! Write a sequence of command bytes to the SSD0323 controller. +//! +//! The data is written in a polled fashion; this function will not return +//! until the entire byte sequence has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +OSRAMWriteCommand(const unsigned char *pucBuffer, unsigned long ulCount) +{ + unsigned long ulTemp; + + // + // Return iff SSI port is not enabled for OSRAM. + // + if(!g_bSSIEnabled) + { + return; + } + + // + // Clear the command/control bit to enable command mode. + // + GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_7, 0); + + // + // Loop while there are more bytes left to be transferred. + // + while(ulCount != 0) + { + // + // Write the next byte to the controller. + // + SSIDataPut(SSI0_BASE, *pucBuffer++); + + // + // Dummy read to drain the fifo and time the GPIO signal. + // + SSIDataGet(SSI0_BASE, &ulTemp); + + // + // Decrement the BYTE counter. + // + ulCount--; + } +} + +//***************************************************************************** +// +//! \internal +//! +//! Write a sequence of data bytes to the SSD0323 controller. +//! +//! The data is written in a polled fashion; this function will not return +//! until the entire byte sequence has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +OSRAMWriteData(const unsigned char *pucBuffer, unsigned long ulCount) +{ + unsigned long ulTemp; + + // + // Return iff SSI port is not enabled for OSRAM. + // + if(!g_bSSIEnabled) + { + return; + } + + // + // Set the command/control bit to enable data mode. + // + GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_PIN_7); + + // + // Loop while there are more bytes left to be transferred. + // + while(ulCount != 0) + { + // + // Write the next byte to the controller. + // + SSIDataPut(SSI0_BASE, *pucBuffer++); + + // + // Dummy read to drain the fifo and time the GPIO signal. + // + SSIDataGet(SSI0_BASE, &ulTemp); + + // + // Decrement the BYTE counter. + // + ulCount--; + } +} + +//***************************************************************************** +// +//! Clears the OLED display. +//! +//! This function will clear the display RAM. All pixels in the display will +//! be turned off. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Clear(void) +{ + static const unsigned char pucCommand1[] = { 0x15, 0, 63 }; + static const unsigned char pucCommand2[] = { 0x75, 0, 79 }; + unsigned long ulRow, ulColumn; + static unsigned char pucZeroBuffer[8] = { 0, 0, 0, 0, 0, 0, 0, 0}; + + // + // Set the window to fill the entire display. + // + OSRAMWriteCommand(pucCommand1, sizeof(pucCommand1)); + OSRAMWriteCommand(pucCommand2, sizeof(pucCommand2)); + OSRAMWriteCommand(g_pucOSRAM128x64x4VerticalInc, + sizeof(g_pucOSRAM128x64x4VerticalInc)); + + // + // In vertical address increment mode, loop through each column, filling + // each row with 0. + // + for(ulColumn = 0; ulColumn < (128/2); ulColumn++) + { + // + // 8 rows (bytes) per row of text. + // + for(ulRow = 0; ulRow < 80; ulRow += 8) + { + OSRAMWriteData(pucZeroBuffer, sizeof(pucZeroBuffer)); + } + } +} + +//***************************************************************************** +// +//! Displays a string on the OLED display. +//! +//! \param pcStr is a pointer to the string to display. +//! \param ulX is the horizontal position to display the string, specified in +//! columns from the left edge of the display. +//! \param ulY is the vertical position to display the string, specified in +//! rows from the top edge of the display. +//! \param ucLevel is the 4-bit grey scale value to be used for displayed text. +//! +//! This function will draw a string on the display. Only the ASCII characters +//! between 32 (space) and 126 (tilde) are supported; other characters will +//! result in random data being draw on the display (based on whatever appears +//! before/after the font in memory). The font is mono-spaced, so characters +//! such as "i" and "l" have more white space around them than characters such +//! as "m" or "w". +//! +//! If the drawing of the string reaches the right edge of the display, no more +//! characters will be drawn. Therefore, special care is not required to avoid +//! supplying a string that is "too long" to display. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \note Because the OLED display packs 2 pixels of data in a single byte, the +//! parameter \e ulX must be an even column number (e.g. 0, 2, 4, etc). +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4StringDraw(const char *pcStr, unsigned long ulX, + unsigned long ulY, unsigned char ucLevel) +{ + static unsigned char pucBuffer[8]; + unsigned long ulIdx1, ulIdx2; + unsigned char ucTemp; + + // + // Check the arguments. + // + ASSERT(ulX < 128); + ASSERT((ulX & 1) == 0); + ASSERT(ulY < 64); + ASSERT(ucLevel < 16); + + // + // Setup a window starting at the specified column and row, ending + // at the right edge of the display and 8 rows down (single character row). + // + pucBuffer[0] = 0x15; + pucBuffer[1] = ulX / 2; + pucBuffer[2] = 63; + OSRAMWriteCommand(pucBuffer, 3); + pucBuffer[0] = 0x75; + pucBuffer[1] = ulY; + pucBuffer[2] = ulY + 7; + OSRAMWriteCommand(pucBuffer, 3); + OSRAMWriteCommand(g_pucOSRAM128x64x4VerticalInc, + sizeof(g_pucOSRAM128x64x4VerticalInc)); + + // + // Loop while there are more characters in the string. + // + while(*pcStr != 0) + { + // + // Get a working copy of the current character and convert to an + // index into the character bit-map array. + // + ucTemp = *pcStr; + ucTemp &= 0x7F; + if(ucTemp < ' ') + { + ucTemp = ' '; + } + else + { + ucTemp -= ' '; + } + + // + // Build and display the character buffer. + // + for(ulIdx1 = 0; ulIdx1 < 3; ulIdx1++) + { + // + // Convert two columns of 1-bit font data into a single data + // byte column of 4-bit font data. + // + for(ulIdx2 = 0; ulIdx2 < 8; ulIdx2++) + { + pucBuffer[ulIdx2] = 0; + if(g_pucFont[ucTemp][ulIdx1*2] & (1 << ulIdx2)) + { + pucBuffer[ulIdx2] = ((ucLevel << 4) & 0xf0); + } + if((ulIdx1 < 2) && + (g_pucFont[ucTemp][ulIdx1*2+1] & (1 << ulIdx2))) + { + pucBuffer[ulIdx2] |= ((ucLevel << 0) & 0x0f); + } + } + + // + // If there is room, dump the single data byte column to the + // display. Otherwise, bail out. + // + if(ulX < 126) + { + OSRAMWriteData(pucBuffer, 8); + ulX += 2; + } + else + { + return; + } + } + + // + // Advance to the next character. + // + pcStr++; + } +} + +//***************************************************************************** +// +//! Displays an image on the OLED display. +//! +//! \param pucImage is a pointer to the image data. +//! \param ulX is the horizontal position to display this image, specified in +//! columns from the left edge of the display. +//! \param ulY is the vertical position to display this image, specified in +//! rows from the top of the display. +//! \param ulWidth is the width of the image, specified in columns. +//! \param ulHeight is the height of the image, specified in rows. +//! +//! This function will display a bitmap graphic on the display. Because of the +//! format of the display RAM, the starting column (/e ulX) and the number of +//! columns (/e ulWidth) must be an integer multiple of two. +//! +//! The image data is organized with the first row of image data appearing left +//! to right, followed immediately by the second row of image data. Each byte +//! contains the data for two columns in the current row, with the leftmost +//! column being contained in bits 7:4 and the rightmost column being contained +//! in bits 3:0. +//! +//! For example, an image six columns wide and seven scan lines tall would +//! be arranged as follows (showing how the twenty one bytes of the image would +//! appear on the display): +//! +//! \verbatim +//! +-------------------+-------------------+-------------------+ +//! | Byte 0 | Byte 1 | Byte 2 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 3 | Byte 4 | Byte 5 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 6 | Byte 7 | Byte 8 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 9 | Byte 10 | Byte 11 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 12 | Byte 13 | Byte 14 | +//! +---------+---------+---------+--3------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 15 | Byte 16 | Byte 17 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 18 | Byte 19 | Byte 20 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! \endverbatim +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by` +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4ImageDraw(const unsigned char *pucImage, unsigned long ulX, + unsigned long ulY, unsigned long ulWidth, + unsigned long ulHeight) +{ + static unsigned char pucBuffer[8]; + + // + // Check the arguments. + // + ASSERT(ulX < 128); + ASSERT((ulX & 1) == 0); + ASSERT(ulY < 64); + ASSERT((ulX + ulWidth) <= 128); + ASSERT((ulY + ulHeight) <= 64); + ASSERT((ulWidth & 1) == 0); + + // + // Setup a window starting at the specified column and row, and ending + // at the column + width and row+height. + // + pucBuffer[0] = 0x15; + pucBuffer[1] = ulX / 2; + pucBuffer[2] = (ulX + ulWidth - 2) / 2; + OSRAMWriteCommand(pucBuffer, 3); + pucBuffer[0] = 0x75; + pucBuffer[1] = ulY; + pucBuffer[2] = ulY + ulHeight - 1; + OSRAMWriteCommand(pucBuffer, 3); + OSRAMWriteCommand(g_pucOSRAM128x64x4HorizontalInc, + sizeof(g_pucOSRAM128x64x4HorizontalInc)); + + // + // Loop while there are more rows to display. + // + while(ulHeight--) + { + // + // Write this row of image data. + // + OSRAMWriteData(pucImage, (ulWidth / 2)); + + // + // Advance to the next row of the image. + // + pucImage += (ulWidth / 2); + } +} + +//***************************************************************************** +// +//! Enable the SSI component of the OLED display driver. +//! +//! \param ulFrequency specifies the SSI Clock Frequency to be used. +//! +//! This function initializes the SSI interface to the OLED display. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Enable(unsigned long ulFrequency) +{ + unsigned long ulTemp; + + // + // Disable the SSI port. + // + SSIDisable(SSI0_BASE); + + // + // Configure the SSI0 port for master mode. + // + SSIConfig(SSI0_BASE, SSI_FRF_MOTO_MODE_2, SSI_MODE_MASTER, ulFrequency, 8); + + // + // (Re)Enable SSI control of the FSS pin. + // + GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_3); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + + // + // Enable the SSI port. + // + SSIEnable(SSI0_BASE); + + // + // Drain the receive fifo. + // + while(SSIDataNonBlockingGet(SSI0_BASE, &ulTemp) != 0) + { + } + + // + // Indicate that the OSRAM driver can use the SSI Port. + // + g_bSSIEnabled = true; +} + +//***************************************************************************** +// +//! Enable the SSI component of the OLED display driver. +//! +//! \param ulFrequency specifies the SSI Clock Frequency to be used. +//! +//! This function initializes the SSI interface to the OLED display. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Disable(void) +{ + unsigned long ulTemp; + + // + // Indicate that the OSRAM driver can no longer use the SSI Port. + // + g_bSSIEnabled = false; + + // + // Drain the receive fifo. + // + while(SSIDataNonBlockingGet(SSI0_BASE, &ulTemp) != 0) + { + } + + // + // Disable the SSI port. + // + SSIDisable(SSI0_BASE); + + // + // Disable SSI control of the FSS pin. + // + GPIODirModeSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_DIR_MODE_OUT); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_PIN_3); + +} + +//***************************************************************************** +// +//! Initialize the OLED display. +//! +//! \param ulFrequency specifies the SSI Clock Frequency to be used. +//! +//! This function initializes the SSI interface to the OLED display and +//! configures the SSD0323 controller on the panel. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Init(unsigned long ulFrequency) +{ + unsigned long ulIdx; + + // + // Enable the SSI0 and GPIO port blocks as they are needed by this driver. + // + SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); + + // + // Configure the SSI0CLK and SSIOTX pins for SSI operation. + // + GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_5); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_2, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_5, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + + // + // Configure the PC7 pin as a D/Cn signal for OLED device. + // + GPIODirModeSet(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_DIR_MODE_OUT); + GPIOPadConfigSet(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD); + GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_PIN_7); + + // + // Configure and enable the SSI0 port for master mode. + // + OSRAM128x64x4Enable(ulFrequency); + + // + // Clear the frame buffer. + // + OSRAM128x64x4Clear(); + + // + // Initialize the SSD0323 controller. Loop through the initialization + // sequence array, sending each command "string" to the controller. + // + for(ulIdx = 0; ulIdx < sizeof(g_pucOSRAM128x64x4Init); + ulIdx += g_pucOSRAM128x64x4Init[ulIdx] + 1) + { + // + // Send this command. + // + OSRAMWriteCommand(g_pucOSRAM128x64x4Init + ulIdx + 1, + g_pucOSRAM128x64x4Init[ulIdx] - 1); + } +} + +//***************************************************************************** +// +//! Turns on the OLED display. +//! +//! This function will turn on the OLED display, causing it to display the +//! contents of its internal frame buffer. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4DisplayOn(void) +{ + unsigned long ulIdx; + + // + // Initialize the SSD0323 controller. Loop through the initialization + // sequence array, sending each command "string" to the controller. + // + for(ulIdx = 0; ulIdx < sizeof(g_pucOSRAM128x64x4Init); + ulIdx += g_pucOSRAM128x64x4Init[ulIdx] + 1) + { + // + // Send this command. + // + OSRAMWriteCommand(g_pucOSRAM128x64x4Init + ulIdx + 1, + g_pucOSRAM128x64x4Init[ulIdx] - 1); + } +} + +//***************************************************************************** +// +//! Turns off the OLED display. +//! +//! This function will turn off the OLED display. This will stop the scanning +//! of the panel and turn off the on-chip DC-DC converter, preventing damage to +//! the panel due to burn-in (it has similar characters to a CRT in this +//! respect). +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4DisplayOff(void) +{ + static const unsigned char pucCommand1[] = + { + 0xAE, 0xAD, 0x02 + }; + + // + // Turn off the DC-DC converter and the display. + // + OSRAMWriteCommand(pucCommand1, sizeof(pucCommand1)); +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/osram128x64x4.h b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/osram128x64x4.h new file mode 100644 index 000000000..2ba7cb956 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/osram128x64x4.h @@ -0,0 +1,63 @@ +//***************************************************************************** +// +// osram128x64x4.h - Prototypes for the driver for the OSRAM 128x64x4 graphical +// OLED display. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __OSRAM128X64X4_H__ +#define __OSRAM128X64X4_H__ + +//***************************************************************************** +// +// Prototypes for the driver APIs. +// +//***************************************************************************** +extern void OSRAM128x64x4Clear(void); +extern void OSRAM128x64x4StringDraw(const char *pcStr, + unsigned long ulX, + unsigned long ulY, + unsigned char ucLevel); +extern void OSRAM128x64x4ImageDraw(const unsigned char *pucImage, + unsigned long ulX, + unsigned long ulY, + unsigned long ulWidth, + unsigned long ulHeight); +extern void OSRAM128x64x4Init(unsigned long ulFrequency); +extern void OSRAM128x64x4Enable(unsigned long ulFrequency); +extern void OSRAM128x64x4Disable(void); +extern void OSRAM128x64x4DisplayOn(void); +extern void OSRAM128x64x4DisplayOff(void); + +//***************************************************************************** +// +// The following macro(s) map old names for the OSRAM functions to the new +// names. In new code, the new names should be used in favor of the old names. +// +//***************************************************************************** +#ifndef DEPRECATED +#define OSRAM128x64x1InitSSI OSRAM128x64x4Enable +#endif + +#endif // __OSRAM128X64X4_H__ diff --git a/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/pwm.h b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/pwm.h new file mode 100644 index 000000000..bb67fda19 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/pwm.h @@ -0,0 +1,161 @@ +//***************************************************************************** +// +// pwm.h - API function protoypes for Pulse Width Modulation (PWM) ports +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __PWM_H__ +#define __PWM_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following defines are passed to PWMGenConfigure() as the ulConfig +// parameter and specify the configuration of the PWM generator. +// +//***************************************************************************** +#define PWM_GEN_MODE_DOWN 0x00000000 // Down count mode +#define PWM_GEN_MODE_UP_DOWN 0x00000002 // Up/Down count mode +#define PWM_GEN_MODE_SYNC 0x00000038 // Synchronous updates +#define PWM_GEN_MODE_NO_SYNC 0x00000000 // Immediate updates +#define PWM_GEN_MODE_DBG_RUN 0x00000004 // Continue running in debug mode +#define PWM_GEN_MODE_DBG_STOP 0x00000000 // Stop running in debug mode + +//***************************************************************************** +// +// Defines for enabling, disabling, and clearing PWM generator interrupts and +// triggers. +// +//***************************************************************************** +#define PWM_INT_CNT_ZERO 0x00000001 // Int if COUNT = 0 +#define PWM_INT_CNT_LOAD 0x00000002 // Int if COUNT = LOAD +#define PWM_INT_CNT_AU 0x00000004 // Int if COUNT = CMPA U +#define PWM_INT_CNT_AD 0x00000008 // Int if COUNT = CMPA D +#define PWM_INT_CNT_BU 0x00000010 // Int if COUNT = CMPA U +#define PWM_INT_CNT_BD 0x00000020 // Int if COUNT = CMPA D +#define PWM_TR_CNT_ZERO 0x00000100 // Trig if COUNT = 0 +#define PWM_TR_CNT_LOAD 0x00000200 // Trig if COUNT = LOAD +#define PWM_TR_CNT_AU 0x00000400 // Trig if COUNT = CMPA U +#define PWM_TR_CNT_AD 0x00000800 // Trig if COUNT = CMPA D +#define PWM_TR_CNT_BU 0x00001000 // Trig if COUNT = CMPA U +#define PWM_TR_CNT_BD 0x00002000 // Trig if COUNT = CMPA D + +//***************************************************************************** +// +// Defines for enabling, disabling, and clearing PWM interrupts. +// +//***************************************************************************** +#define PWM_INT_GEN_0 0x00000001 // Generator 0 interrupt +#define PWM_INT_GEN_1 0x00000002 // Generator 1 interrupt +#define PWM_INT_GEN_2 0x00000004 // Generator 2 interrupt +#define PWM_INT_FAULT 0x00010000 // Fault interrupt + +//***************************************************************************** +// +// Defines to identify the generators within a module. +// +//***************************************************************************** +#define PWM_GEN_0 0x00000040 // Offset address of Gen0 +#define PWM_GEN_1 0x00000080 // Offset address of Gen1 +#define PWM_GEN_2 0x000000C0 // Offset address of Gen2 + +#define PWM_GEN_0_BIT 0x00000001 // Bit-wise ID for Gen0 +#define PWM_GEN_1_BIT 0x00000002 // Bit-wise ID for Gen1 +#define PWM_GEN_2_BIT 0x00000004 // Bit-wise ID for Gen2 + +//***************************************************************************** +// +// Defines to identify the outputs within a module. +// +//***************************************************************************** +#define PWM_OUT_0 0x00000040 // Encoded offset address of PWM0 +#define PWM_OUT_1 0x00000041 // Encoded offset address of PWM1 +#define PWM_OUT_2 0x00000082 // Encoded offset address of PWM2 +#define PWM_OUT_3 0x00000083 // Encoded offset address of PWM3 +#define PWM_OUT_4 0x000000C4 // Encoded offset address of PWM4 +#define PWM_OUT_5 0x000000C5 // Encoded offset address of PWM5 + +#define PWM_OUT_0_BIT 0x00000001 // Bit-wise ID for PWM0 +#define PWM_OUT_1_BIT 0x00000002 // Bit-wise ID for PWM1 +#define PWM_OUT_2_BIT 0x00000004 // Bit-wise ID for PWM2 +#define PWM_OUT_3_BIT 0x00000008 // Bit-wise ID for PWM3 +#define PWM_OUT_4_BIT 0x00000010 // Bit-wise ID for PWM4 +#define PWM_OUT_5_BIT 0x00000020 // Bit-wise ID for PWM5 + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void PWMGenConfigure(unsigned long ulBase, unsigned long ulGen, + unsigned long ulConfig); +extern void PWMGenPeriodSet(unsigned long ulBase, unsigned long ulGen, + unsigned long ulPeriod); +extern unsigned long PWMGenPeriodGet(unsigned long ulBase, + unsigned long ulGen); +extern void PWMGenEnable(unsigned long ulBase, unsigned long ulGen); +extern void PWMGenDisable(unsigned long ulBase, unsigned long ulGen); +extern void PWMPulseWidthSet(unsigned long ulBase, unsigned long ulPWMOut, + unsigned long ulWidth); +extern unsigned long PWMPulseWidthGet(unsigned long ulBase, + unsigned long ulPWMOut); +extern void PWMDeadBandEnable(unsigned long ulBase, unsigned long ulGen, + unsigned short usRise, unsigned short usFall); +extern void PWMDeadBandDisable(unsigned long ulBase, unsigned long ulGen); +extern void PWMSyncUpdate(unsigned long ulBase, unsigned long ulGenBits); +extern void PWMSyncTimeBase(unsigned long ulBase, unsigned long ulGenBits); +extern void PWMOutputState(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bEnable); +extern void PWMOutputInvert(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bInvert); +extern void PWMOutputFault(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bFaultKill); +extern void PWMGenIntRegister(unsigned long ulBase, unsigned long ulGen, + void (*pfnIntHandler)(void)); +extern void PWMGenIntUnregister(unsigned long ulBase, unsigned long ulGen); +extern void PWMFaultIntRegister(unsigned long ulBase, + void (*pfnIntHandler)(void)); +extern void PWMFaultIntUnregister(unsigned long ulBase); +extern void PWMGenIntTrigEnable(unsigned long ulBase, unsigned long ulGen, + unsigned long ulIntTrig); +extern void PWMGenIntTrigDisable(unsigned long ulBase, unsigned long ulGen, + unsigned long ulIntTrig); +extern unsigned long PWMGenIntStatus(unsigned long ulBase, unsigned long ulGen, + tBoolean bMasked); +extern void PWMGenIntClear(unsigned long ulBase, unsigned long ulGen, + unsigned long ulInts); +extern void PWMIntEnable(unsigned long ulBase, unsigned long ulGenFault); +extern void PWMIntDisable(unsigned long ulBase, unsigned long ulGenFault); +extern void PWMFaultIntClear(unsigned long ulBase); +extern unsigned long PWMIntStatus(unsigned long ulBase, tBoolean bMasked); + +#ifdef __cplusplus +} +#endif + +#endif // __PWM_H__ diff --git a/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/qei.h b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/qei.h new file mode 100644 index 000000000..89d5b20bc --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/qei.h @@ -0,0 +1,104 @@ +//***************************************************************************** +// +// qei.h - Prototypes for the Quadrature Encoder Driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __QEI_H__ +#define __QEI_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to QEIConfigure as the ulConfig paramater. +// +//***************************************************************************** +#define QEI_CONFIG_CAPTURE_A 0x00000000 // Count on ChA edges only +#define QEI_CONFIG_CAPTURE_A_B 0x00000008 // Count on ChA and ChB edges +#define QEI_CONFIG_NO_RESET 0x00000000 // Do not reset on index pulse +#define QEI_CONFIG_RESET_IDX 0x00000010 // Reset position on index pulse +#define QEI_CONFIG_QUADRATURE 0x00000000 // ChA and ChB are quadrature +#define QEI_CONFIG_CLOCK_DIR 0x00000004 // ChA and ChB are clock and dir +#define QEI_CONFIG_NO_SWAP 0x00000000 // Do not swap ChA and ChB +#define QEI_CONFIG_SWAP 0x00000002 // Swap ChA and ChB + +//***************************************************************************** +// +// Values that can be passed to QEIVelocityConfigure as the ulPreDiv parameter. +// +//***************************************************************************** +#define QEI_VELDIV_1 0x00000000 // Predivide by 1 +#define QEI_VELDIV_2 0x00000040 // Predivide by 2 +#define QEI_VELDIV_4 0x00000080 // Predivide by 4 +#define QEI_VELDIV_8 0x000000C0 // Predivide by 8 +#define QEI_VELDIV_16 0x00000100 // Predivide by 16 +#define QEI_VELDIV_32 0x00000140 // Predivide by 32 +#define QEI_VELDIV_64 0x00000180 // Predivide by 64 +#define QEI_VELDIV_128 0x000001C0 // Predivide by 128 + +//***************************************************************************** +// +// Values that can be passed to QEIEnableInts, QEIDisableInts, and QEIClearInts +// as the ulIntFlags parameter, and returned by QEIGetIntStatus. +// +//***************************************************************************** +#define QEI_INTERROR 0x00000008 // Phase error detected +#define QEI_INTDIR 0x00000004 // Direction change +#define QEI_INTTIMER 0x00000002 // Velocity timer expired +#define QEI_INTINDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void QEIEnable(unsigned long ulBase); +extern void QEIDisable(unsigned long ulBase); +extern void QEIConfigure(unsigned long ulBase, unsigned long ulConfig, + unsigned long ulMaxPosition); +extern unsigned long QEIPositionGet(unsigned long ulBase); +extern void QEIPositionSet(unsigned long ulBase, unsigned long ulPosition); +extern long QEIDirectionGet(unsigned long ulBase); +extern tBoolean QEIErrorGet(unsigned long ulBase); +extern void QEIVelocityEnable(unsigned long ulBase); +extern void QEIVelocityDisable(unsigned long ulBase); +extern void QEIVelocityConfigure(unsigned long ulBase, unsigned long ulPreDiv, + unsigned long ulPeriod); +extern unsigned long QEIVelocityGet(unsigned long ulBase); +extern void QEIIntRegister(unsigned long ulBase, void (*pfnHandler)(void)); +extern void QEIIntUnregister(unsigned long ulBase); +extern void QEIIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void QEIIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long QEIIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void QEIIntClear(unsigned long ulBase, unsigned long ulIntFlags); + +#ifdef __cplusplus +} +#endif + +#endif // __QEI_H__ diff --git a/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/ssi.h b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/ssi.h new file mode 100644 index 000000000..227b6bd9b --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/ssi.h @@ -0,0 +1,89 @@ +//***************************************************************************** +// +// ssi.h - Prototypes for the Synchronous Serial Interface Driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __SSI_H__ +#define __SSI_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to SSIIntEnable, SSIIntDisable, and SSIIntClear +// as the ulIntFlags parameter, and returned by SSIIntStatus. +// +//***************************************************************************** +#define SSI_TXFF 0x00000008 // TX FIFO half empty or less +#define SSI_RXFF 0x00000004 // RX FIFO half full or less +#define SSI_RXTO 0x00000002 // RX timeout +#define SSI_RXOR 0x00000001 // RX overrun + +//***************************************************************************** +// +// Values that can be passed to SSIConfig. +// +//***************************************************************************** +#define SSI_FRF_MOTO_MODE_0 0x00000000 // Moto fmt, polarity 0, phase 0 +#define SSI_FRF_MOTO_MODE_1 0x00000002 // Moto fmt, polarity 0, phase 1 +#define SSI_FRF_MOTO_MODE_2 0x00000001 // Moto fmt, polarity 1, phase 0 +#define SSI_FRF_MOTO_MODE_3 0x00000003 // Moto fmt, polarity 1, phase 1 +#define SSI_FRF_TI 0x00000010 // TI frame format +#define SSI_FRF_NMW 0x00000020 // National MicroWire frame format + +#define SSI_MODE_MASTER 0x00000000 // SSI master +#define SSI_MODE_SLAVE 0x00000001 // SSI slave +#define SSI_MODE_SLAVE_OD 0x00000002 // SSI slave with output disabled + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void SSIConfig(unsigned long ulBase, unsigned long ulProtocol, + unsigned long ulMode, unsigned long ulBitRate, + unsigned long ulDataWidth); +extern void SSIDataGet(unsigned long ulBase, unsigned long *pulData); +extern long SSIDataNonBlockingGet(unsigned long ulBase, + unsigned long *pulData); +extern void SSIDataPut(unsigned long ulBase, unsigned long ulData); +extern long SSIDataNonBlockingPut(unsigned long ulBase, unsigned long ulData); +extern void SSIDisable(unsigned long ulBase); +extern void SSIEnable(unsigned long ulBase); +extern void SSIIntClear(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntRegister(unsigned long ulBase, void(*pfnHandler)(void)); +extern unsigned long SSIIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void SSIIntUnregister(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __SSI_H__ diff --git a/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/sysctl.h b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/sysctl.h new file mode 100644 index 000000000..d2efbca0d --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/sysctl.h @@ -0,0 +1,301 @@ +//***************************************************************************** +// +// sysctl.h - Prototypes for the system control driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __SYSCTL_H__ +#define __SYSCTL_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following are values that can be passed to the +// SysCtlPeripheralPresent(), SysCtlPeripheralEnable(), +// SysCtlPeripheralDisable(), and SysCtlPeripheralReset() APIs as the +// ulPeripheral parameter. The peripherals in the fourth group (upper nibble +// is 3) can only be used with the SysCtlPeripheralPresent() API. +// +//***************************************************************************** +#define SYSCTL_PERIPH_PWM 0x00100010 // PWM +#define SYSCTL_PERIPH_ADC 0x00100001 // ADC +#define SYSCTL_PERIPH_HIBERNATE 0x00000040 // Hibernation module +#define SYSCTL_PERIPH_WDOG 0x00000008 // Watchdog +#define SYSCTL_PERIPH_CAN0 0x00100100 // CAN 0 +#define SYSCTL_PERIPH_CAN1 0x00100200 // CAN 1 +#define SYSCTL_PERIPH_UART0 0x10000001 // UART 0 +#define SYSCTL_PERIPH_UART1 0x10000002 // UART 1 +#define SYSCTL_PERIPH_UART2 0x10000004 // UART 2 +#define SYSCTL_PERIPH_SSI 0x10000010 // SSI +#define SYSCTL_PERIPH_SSI0 0x10000010 // SSI 0 +#define SYSCTL_PERIPH_SSI1 0x10000020 // SSI 1 +#define SYSCTL_PERIPH_QEI 0x10000100 // QEI +#define SYSCTL_PERIPH_QEI0 0x10000100 // QEI 0 +#define SYSCTL_PERIPH_QEI1 0x10000200 // QEI 1 +#define SYSCTL_PERIPH_I2C 0x10001000 // I2C +#define SYSCTL_PERIPH_I2C0 0x10001000 // I2C 0 +#define SYSCTL_PERIPH_I2C1 0x10004000 // I2C 1 +#define SYSCTL_PERIPH_TIMER0 0x10100001 // Timer 0 +#define SYSCTL_PERIPH_TIMER1 0x10100002 // Timer 1 +#define SYSCTL_PERIPH_TIMER2 0x10100004 // Timer 2 +#define SYSCTL_PERIPH_TIMER3 0x10100008 // Timer 3 +#define SYSCTL_PERIPH_COMP0 0x10100100 // Analog comparator 0 +#define SYSCTL_PERIPH_COMP1 0x10100200 // Analog comparator 1 +#define SYSCTL_PERIPH_COMP2 0x10100400 // Analog comparator 2 +#define SYSCTL_PERIPH_GPIOA 0x20000001 // GPIO A +#define SYSCTL_PERIPH_GPIOB 0x20000002 // GPIO B +#define SYSCTL_PERIPH_GPIOC 0x20000004 // GPIO C +#define SYSCTL_PERIPH_GPIOD 0x20000008 // GPIO D +#define SYSCTL_PERIPH_GPIOE 0x20000010 // GPIO E +#define SYSCTL_PERIPH_GPIOF 0x20000020 // GPIO F +#define SYSCTL_PERIPH_GPIOG 0x20000040 // GPIO G +#define SYSCTL_PERIPH_GPIOH 0x20000080 // GPIO H +#define SYSCTL_PERIPH_ETH 0x20105000 // ETH +#define SYSCTL_PERIPH_MPU 0x30000080 // Cortex M3 MPU +#define SYSCTL_PERIPH_TEMP 0x30000020 // Temperature sensor +#define SYSCTL_PERIPH_PLL 0x30000010 // PLL + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlPinPresent() API +// as the ulPin parameter. +// +//***************************************************************************** +#define SYSCTL_PIN_PWM0 0x00000001 // PWM0 pin +#define SYSCTL_PIN_PWM1 0x00000002 // PWM1 pin +#define SYSCTL_PIN_PWM2 0x00000004 // PWM2 pin +#define SYSCTL_PIN_PWM3 0x00000008 // PWM3 pin +#define SYSCTL_PIN_PWM4 0x00000010 // PWM4 pin +#define SYSCTL_PIN_PWM5 0x00000020 // PWM5 pin +#define SYSCTL_PIN_C0MINUS 0x00000040 // C0- pin +#define SYSCTL_PIN_C0PLUS 0x00000080 // C0+ pin +#define SYSCTL_PIN_C0O 0x00000100 // C0o pin +#define SYSCTL_PIN_C1MINUS 0x00000200 // C1- pin +#define SYSCTL_PIN_C1PLUS 0x00000400 // C1+ pin +#define SYSCTL_PIN_C1O 0x00000800 // C1o pin +#define SYSCTL_PIN_C2MINUS 0x00001000 // C2- pin +#define SYSCTL_PIN_C2PLUS 0x00002000 // C2+ pin +#define SYSCTL_PIN_C2O 0x00004000 // C2o pin +#define SYSCTL_PIN_MC_FAULT0 0x00008000 // MC0 Fault pin +#define SYSCTL_PIN_ADC0 0x00010000 // ADC0 pin +#define SYSCTL_PIN_ADC1 0x00020000 // ADC1 pin +#define SYSCTL_PIN_ADC2 0x00040000 // ADC2 pin +#define SYSCTL_PIN_ADC3 0x00080000 // ADC3 pin +#define SYSCTL_PIN_ADC4 0x00100000 // ADC4 pin +#define SYSCTL_PIN_ADC5 0x00200000 // ADC5 pin +#define SYSCTL_PIN_ADC6 0x00400000 // ADC6 pin +#define SYSCTL_PIN_ADC7 0x00800000 // ADC7 pin +#define SYSCTL_PIN_CCP0 0x01000000 // CCP0 pin +#define SYSCTL_PIN_CCP1 0x02000000 // CCP1 pin +#define SYSCTL_PIN_CCP2 0x04000000 // CCP2 pin +#define SYSCTL_PIN_CCP3 0x08000000 // CCP3 pin +#define SYSCTL_PIN_CCP4 0x10000000 // CCP4 pin +#define SYSCTL_PIN_CCP5 0x20000000 // CCP5 pin +#define SYSCTL_PIN_32KHZ 0x80000000 // 32kHz pin + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlLDOSet() API as +// the ulVoltage value, or returned by the SysCtlLDOGet() API. +// +//***************************************************************************** +#define SYSCTL_LDO_2_25V 0x00000005 // LDO output of 2.25V +#define SYSCTL_LDO_2_30V 0x00000004 // LDO output of 2.30V +#define SYSCTL_LDO_2_35V 0x00000003 // LDO output of 2.35V +#define SYSCTL_LDO_2_40V 0x00000002 // LDO output of 2.40V +#define SYSCTL_LDO_2_45V 0x00000001 // LDO output of 2.45V +#define SYSCTL_LDO_2_50V 0x00000000 // LDO output of 2.50V +#define SYSCTL_LDO_2_55V 0x0000001f // LDO output of 2.55V +#define SYSCTL_LDO_2_60V 0x0000001e // LDO output of 2.60V +#define SYSCTL_LDO_2_65V 0x0000001d // LDO output of 2.65V +#define SYSCTL_LDO_2_70V 0x0000001c // LDO output of 2.70V +#define SYSCTL_LDO_2_75V 0x0000001b // LDO output of 2.75V + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlLDOConfigSet() API. +// +//***************************************************************************** +#define SYSCTL_LDOCFG_ARST 0x00000001 // Allow LDO failure to reset +#define SYSCTL_LDOCFG_NORST 0x00000000 // Do not reset on LDO failure + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlIntEnable(), +// SysCtlIntDisable(), and SysCtlIntClear() APIs, or returned in the bit mask +// by the SysCtlIntStatus() API. +// +//***************************************************************************** +#define SYSCTL_INT_PLL_LOCK 0x00000040 // PLL lock interrupt +#define SYSCTL_INT_CUR_LIMIT 0x00000020 // Current limit interrupt +#define SYSCTL_INT_IOSC_FAIL 0x00000010 // Internal oscillator failure int +#define SYSCTL_INT_MOSC_FAIL 0x00000008 // Main oscillator failure int +#define SYSCTL_INT_POR 0x00000004 // Power on reset interrupt +#define SYSCTL_INT_BOR 0x00000002 // Brown out interrupt +#define SYSCTL_INT_PLL_FAIL 0x00000001 // PLL failure interrupt + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlResetCauseClear() +// API or returned by the SysCtlResetCauseGet() API. +// +//***************************************************************************** +#define SYSCTL_CAUSE_LDO 0x00000020 // LDO power not OK reset +#define SYSCTL_CAUSE_SW 0x00000010 // Software reset +#define SYSCTL_CAUSE_WDOG 0x00000008 // Watchdog reset +#define SYSCTL_CAUSE_BOR 0x00000004 // Brown-out reset +#define SYSCTL_CAUSE_POR 0x00000002 // Power on reset +#define SYSCTL_CAUSE_EXT 0x00000001 // External reset + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlBrownOutConfigSet() +// API as the ulConfig parameter. +// +//***************************************************************************** +#define SYSCTL_BOR_RESET 0x00000002 // Reset instead of interrupting +#define SYSCTL_BOR_RESAMPLE 0x00000001 // Resample BOR before asserting + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlPWMClockSet() API +// as the ulConfig parameter, and can be returned by the SysCtlPWMClockGet() +// API. +// +//***************************************************************************** +#define SYSCTL_PWMDIV_1 0x00000000 // PWM clock is processor clock /1 +#define SYSCTL_PWMDIV_2 0x00100000 // PWM clock is processor clock /2 +#define SYSCTL_PWMDIV_4 0x00120000 // PWM clock is processor clock /4 +#define SYSCTL_PWMDIV_8 0x00140000 // PWM clock is processor clock /8 +#define SYSCTL_PWMDIV_16 0x00160000 // PWM clock is processor clock /16 +#define SYSCTL_PWMDIV_32 0x00180000 // PWM clock is processor clock /32 +#define SYSCTL_PWMDIV_64 0x001A0000 // PWM clock is processor clock /64 + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlADCSpeedSet() API +// as the ulSpeed parameter, and can be returned by the SyCtlADCSpeedGet() +// API. +// +//***************************************************************************** +#define SYSCTL_ADCSPEED_1MSPS 0x00000300 // 1,000,000 samples per second +#define SYSCTL_ADCSPEED_500KSPS 0x00000200 // 500,000 samples per second +#define SYSCTL_ADCSPEED_250KSPS 0x00000100 // 250,000 samples per second +#define SYSCTL_ADCSPEED_125KSPS 0x00000000 // 125,000 samples per second + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlClockSet() API as +// the ulConfig parameter. +// +//***************************************************************************** +#define SYSCTL_SYSDIV_1 0x07800000 // Processor clock is osc/pll /1 +#define SYSCTL_SYSDIV_2 0x00C00000 // Processor clock is osc/pll /2 +#define SYSCTL_SYSDIV_3 0x01400000 // Processor clock is osc/pll /3 +#define SYSCTL_SYSDIV_4 0x01C00000 // Processor clock is osc/pll /4 +#define SYSCTL_SYSDIV_5 0x02400000 // Processor clock is osc/pll /5 +#define SYSCTL_SYSDIV_6 0x02C00000 // Processor clock is osc/pll /6 +#define SYSCTL_SYSDIV_7 0x03400000 // Processor clock is osc/pll /7 +#define SYSCTL_SYSDIV_8 0x03C00000 // Processor clock is osc/pll /8 +#define SYSCTL_SYSDIV_9 0x04400000 // Processor clock is osc/pll /9 +#define SYSCTL_SYSDIV_10 0x04C00000 // Processor clock is osc/pll /10 +#define SYSCTL_SYSDIV_11 0x05400000 // Processor clock is osc/pll /11 +#define SYSCTL_SYSDIV_12 0x05C00000 // Processor clock is osc/pll /12 +#define SYSCTL_SYSDIV_13 0x06400000 // Processor clock is osc/pll /13 +#define SYSCTL_SYSDIV_14 0x06C00000 // Processor clock is osc/pll /14 +#define SYSCTL_SYSDIV_15 0x07400000 // Processor clock is osc/pll /15 +#define SYSCTL_SYSDIV_16 0x07C00000 // Processor clock is osc/pll /16 +#define SYSCTL_USE_PLL 0x00000000 // System clock is the PLL clock +#define SYSCTL_USE_OSC 0x00003800 // System clock is the osc clock +#define SYSCTL_XTAL_3_57MHZ 0x00000100 // External crystal is 3.579545MHz +#define SYSCTL_XTAL_3_68MHZ 0x00000140 // External crystal is 3.6864MHz +#define SYSCTL_XTAL_4MHZ 0x00000180 // External crystal is 4MHz +#define SYSCTL_XTAL_4_09MHZ 0x000001C0 // External crystal is 4.096MHz +#define SYSCTL_XTAL_4_91MHZ 0x00000200 // External crystal is 4.9152MHz +#define SYSCTL_XTAL_5MHZ 0x00000240 // External crystal is 5MHz +#define SYSCTL_XTAL_5_12MHZ 0x00000280 // External crystal is 5.12MHz +#define SYSCTL_XTAL_6MHZ 0x000002C0 // External crystal is 6MHz +#define SYSCTL_XTAL_6_14MHZ 0x00000300 // External crystal is 6.144MHz +#define SYSCTL_XTAL_7_37MHZ 0x00000340 // External crystal is 7.3728MHz +#define SYSCTL_XTAL_8MHZ 0x00000380 // External crystal is 8MHz +#define SYSCTL_XTAL_8_19MHZ 0x000003C0 // External crystal is 8.192MHz +#define SYSCTL_OSC_MAIN 0x00000000 // Oscillator source is main osc +#define SYSCTL_OSC_INT 0x00000010 // Oscillator source is int. osc +#define SYSCTL_OSC_INT4 0x00000020 // Oscillator source is int. osc /4 +#define SYSCTL_INT_OSC_DIS 0x00000002 // Disable internal oscillator +#define SYSCTL_MAIN_OSC_DIS 0x00000001 // Disable main oscillator + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern unsigned long SysCtlSRAMSizeGet(void); +extern unsigned long SysCtlFlashSizeGet(void); +extern tBoolean SysCtlPinPresent(unsigned long ulPin); +extern tBoolean SysCtlPeripheralPresent(unsigned long ulPeripheral); +extern void SysCtlPeripheralReset(unsigned long ulPeripheral); +extern void SysCtlPeripheralEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralSleepEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralSleepDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDeepSleepEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDeepSleepDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralClockGating(tBoolean bEnable); +extern void SysCtlIntRegister(void (*pfnHandler)(void)); +extern void SysCtlIntUnregister(void); +extern void SysCtlIntEnable(unsigned long ulInts); +extern void SysCtlIntDisable(unsigned long ulInts); +extern void SysCtlIntClear(unsigned long ulInts); +extern unsigned long SysCtlIntStatus(tBoolean bMasked); +extern void SysCtlLDOSet(unsigned long ulVoltage); +extern unsigned long SysCtlLDOGet(void); +extern void SysCtlLDOConfigSet(unsigned long ulConfig); +extern void SysCtlReset(void); +extern void SysCtlSleep(void); +extern void SysCtlDeepSleep(void); +extern unsigned long SysCtlResetCauseGet(void); +extern void SysCtlResetCauseClear(unsigned long ulCauses); +extern void SysCtlBrownOutConfigSet(unsigned long ulConfig, + unsigned long ulDelay); +extern void SysCtlClockSet(unsigned long ulConfig); +extern unsigned long SysCtlClockGet(void); +extern void SysCtlPWMClockSet(unsigned long ulConfig); +extern unsigned long SysCtlPWMClockGet(void); +extern void SysCtlADCSpeedSet(unsigned long ulSpeed); +extern unsigned long SysCtlADCSpeedGet(void); +extern void SysCtlIOSCVerificationSet(tBoolean bEnable); +extern void SysCtlMOSCVerificationSet(tBoolean bEnable); +extern void SysCtlPLLVerificationSet(tBoolean bEnable); +extern void SysCtlClkVerificationClear(void); + +#ifdef __cplusplus +} +#endif + +#endif // __SYSCTL_H__ diff --git a/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/systick.h b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/systick.h new file mode 100644 index 000000000..f89bf65b8 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/systick.h @@ -0,0 +1,55 @@ +//***************************************************************************** +// +// systick.h - Prototypes for the SysTick driver. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __SYSTICK_H__ +#define __SYSTICK_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void SysTickEnable(void); +extern void SysTickDisable(void); +extern void SysTickIntRegister(void (*pfnHandler)(void)); +extern void SysTickIntUnregister(void); +extern void SysTickIntEnable(void); +extern void SysTickIntDisable(void); +extern void SysTickPeriodSet(unsigned long ulPeriod); +extern unsigned long SysTickPeriodGet(void); +extern unsigned long SysTickValueGet(void); + +#ifdef __cplusplus +} +#endif + +#endif // __SYSTICK_H__ diff --git a/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/uart.h b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/uart.h new file mode 100644 index 000000000..a0e16db33 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/uart.h @@ -0,0 +1,104 @@ +//***************************************************************************** +// +// uart.h - Defines and Macros for the UART. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __UART_H__ +#define __UART_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to UARTIntEnable, UARTIntDisable, and UARTIntClear +// as the ulIntFlags parameter, and returned from UARTIntStatus. +// +//***************************************************************************** +#define UART_INT_OE 0x400 // Overrun Error Interrupt Mask +#define UART_INT_BE 0x200 // Break Error Interrupt Mask +#define UART_INT_PE 0x100 // Parity Error Interrupt Mask +#define UART_INT_FE 0x080 // Framing Error Interrupt Mask +#define UART_INT_RT 0x040 // Receive Timeout Interrupt Mask +#define UART_INT_TX 0x020 // Transmit Interrupt Mask +#define UART_INT_RX 0x010 // Receive Interrupt Mask + +//***************************************************************************** +// +// Values that can be passed to UARTConfigSet as the ulConfig parameter and +// returned by UARTConfigGet in the pulConfig parameter. Additionally, the +// UART_CONFIG_PAR_* subset can be passed to UARTParityModeSet as the ulParity +// parameter, and are returned by UARTParityModeGet. +// +//***************************************************************************** +#define UART_CONFIG_WLEN_8 0x00000060 // 8 bit data +#define UART_CONFIG_WLEN_7 0x00000040 // 7 bit data +#define UART_CONFIG_WLEN_6 0x00000020 // 6 bit data +#define UART_CONFIG_WLEN_5 0x00000000 // 5 bit data +#define UART_CONFIG_STOP_ONE 0x00000000 // One stop bit +#define UART_CONFIG_STOP_TWO 0x00000008 // Two stop bits +#define UART_CONFIG_PAR_NONE 0x00000000 // No parity +#define UART_CONFIG_PAR_EVEN 0x00000006 // Even parity +#define UART_CONFIG_PAR_ODD 0x00000002 // Odd parity +#define UART_CONFIG_PAR_ONE 0x00000086 // Parity bit is one +#define UART_CONFIG_PAR_ZERO 0x00000082 // Parity bit is zero + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void UARTParityModeSet(unsigned long ulBase, unsigned long ulParity); +extern unsigned long UARTParityModeGet(unsigned long ulBase); +extern void UARTConfigSet(unsigned long ulBase, unsigned long ulBaud, + unsigned long ulConfig); +extern void UARTConfigGet(unsigned long ulBase, unsigned long *pulBaud, + unsigned long *pulConfig); +extern void UARTEnable(unsigned long ulBase); +extern void UARTDisable(unsigned long ulBase); +extern void UARTEnableSIR(unsigned long ulBase, tBoolean bLowPower); +extern void UARTDisableSIR(unsigned long ulBase); +extern tBoolean UARTCharsAvail(unsigned long ulBase); +extern tBoolean UARTSpaceAvail(unsigned long ulBase); +extern long UARTCharNonBlockingGet(unsigned long ulBase); +extern long UARTCharGet(unsigned long ulBase); +extern tBoolean UARTCharNonBlockingPut(unsigned long ulBase, + unsigned char ucData); +extern void UARTCharPut(unsigned long ulBase, unsigned char ucData); +extern void UARTBreakCtl(unsigned long ulBase, tBoolean bBreakState); +extern void UARTIntRegister(unsigned long ulBase, void(*pfnHandler)(void)); +extern void UARTIntUnregister(unsigned long ulBase); +extern void UARTIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void UARTIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long UARTIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void UARTIntClear(unsigned long ulBase, unsigned long ulIntFlags); + +#ifdef __cplusplus +} +#endif + +#endif // __UART_H__ diff --git a/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/watchdog.h b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/watchdog.h new file mode 100644 index 000000000..2d0ad37a0 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/LuminaryDrivers/watchdog.h @@ -0,0 +1,63 @@ +//***************************************************************************** +// +// watchdog.h - Prototypes for the Watchdog Timer API +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __WATCHDOG_H__ +#define __WATCHDOG_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern tBoolean WatchdogRunning(unsigned long ulBase); +extern void WatchdogEnable(unsigned long ulBase); +extern void WatchdogResetEnable(unsigned long ulBase); +extern void WatchdogResetDisable(unsigned long ulBase); +extern void WatchdogLock(unsigned long ulBase); +extern void WatchdogUnlock(unsigned long ulBase); +extern tBoolean WatchdogLockState(unsigned long ulBase); +extern void WatchdogReloadSet(unsigned long ulBase, unsigned long ulLoadVal); +extern unsigned long WatchdogReloadGet(unsigned long ulBase); +extern unsigned long WatchdogValueGet(unsigned long ulBase); +extern void WatchdogIntRegister(unsigned long ulBase, void(*pfnHandler)(void)); +extern void WatchdogIntUnregister(unsigned long ulBase); +extern void WatchdogIntEnable(unsigned long ulBase); +extern unsigned long WatchdogIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void WatchdogIntClear(unsigned long ulBase); +extern void WatchdogStallDisable(unsigned long ulBase); +extern void WatchdogStallDisable(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __WATCHDOG_H__ diff --git a/Demo/CORTEX_LM3S6965_KEIL/ParTest/ParTest.c b/Demo/CORTEX_LM3S6965_KEIL/ParTest/ParTest.c new file mode 100644 index 000000000..f16ae6291 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/ParTest/ParTest.c @@ -0,0 +1,83 @@ +/* + FreeRTOS.org V4.3.0 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + + Also see http://www.SafeRTOS.com for an IEC 61508 compliant version along + with commercial development and support options. + *************************************************************************** +*/ + +/*----------------------------------------------------------- + * Simple parallel port IO routines. + *-----------------------------------------------------------*/ + +/* +*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Demo includes. */ +#include "partest.h" + +/* Library includes. */ +#include "hw_types.h" +#include "gpio.h" +#include "hw_memmap.h" + + +/*-----------------------------------------------------------*/ + +void vParTestInitialise( void ) +{ + GPIODirModeSet( GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_DIR_MODE_OUT ); + GPIOPadConfigSet( GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD ); + GPIOPinWrite( GPIO_PORTF_BASE, GPIO_PIN_0, 0 ); +} +/*-----------------------------------------------------------*/ + +void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue ) +{ + /* There is only one LED. */ + ( void ) uxLED; + + GPIOPinWrite( GPIO_PORTF_BASE, GPIO_PIN_0, xValue ); +} +/*-----------------------------------------------------------*/ + +unsigned portBASE_TYPE uxParTestGetLED( unsigned portBASE_TYPE uxLED ) +{ + /* There is only one LED. */ + ( void ) uxLED; + + return GPIOPinRead( GPIO_PORTF_BASE, GPIO_PIN_0 ); +} + + diff --git a/Demo/CORTEX_LM3S6965_KEIL/RTOSDemo.Opt b/Demo/CORTEX_LM3S6965_KEIL/RTOSDemo.Opt new file mode 100644 index 000000000..36531627e --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/RTOSDemo.Opt @@ -0,0 +1,70 @@ +### uVision2 Project, (C) Keil Software +### Do not modify ! + + cExt (*.c) + aExt (*.s*; *.src; *.a*) + oExt (*.obj) + lExt (*.lib) + tExt (*.txt; *.h; *.inc) + pExt (*.plm) + CppX (*.cpp) + DaveTm { 0,0,0,0,0,0,0,0 } + +Target (FreeRTOS_Demo), 0x0004 // Tools: 'ARM-ADS' +GRPOPT 1,(Demo_Source),0,0,0 +GRPOPT 2,(Libraries),0,0,0 +GRPOPT 3,(RTOS_Source),0,0,0 +GRPOPT 4,(uIP_Source),1,0,0 + +OPTFFF 1,1,1,0,0,0,0,0,<..\Common\Minimal\BlockQ.c> +OPTFFF 1,2,1,0,0,0,0,0,<..\Common\Minimal\blocktim.c> +OPTFFF 1,3,1,0,0,0,0,0,<..\Common\Minimal\death.c> +OPTFFF 1,4,1,0,0,0,0,0,<..\Common\Minimal\integer.c> +OPTFFF 1,5,1,0,0,0,0,0,<.\main.c> +OPTFFF 1,6,1,0,0,0,0,0,<.\ParTest\ParTest.c> +OPTFFF 1,7,1,0,0,0,0,0,<..\Common\Minimal\PollQ.c> +OPTFFF 1,8,1,0,0,0,0,0,<..\Common\Minimal\semtest.c> +OPTFFF 1,9,2,0,0,0,0,0,<.\startup_rvmdk.S> +OPTFFF 1,10,1,0,0,0,0,0,<.\timertest.c> +OPTFFF 1,11,5,0,0,0,0,0,<.\FreeRTOSConfig.h> +OPTFFF 2,12,4,0,0,0,0,0,<.\LuminaryDrivers\driverlib.lib> +OPTFFF 2,13,1,0,0,0,0,0,<.\LuminaryDrivers\osram128x64x4.c> +OPTFFF 3,14,1,0,0,0,0,0,<..\..\Source\tasks.c> +OPTFFF 3,15,1,0,0,0,0,0,<..\..\Source\list.c> +OPTFFF 3,16,1,0,0,0,0,0,<..\..\Source\queue.c> +OPTFFF 3,17,1,0,0,0,0,0,<..\..\Source\portable\RVDS\ARM_CM3\port.c> +OPTFFF 3,18,1,0,0,0,0,0,<..\..\Source\portable\MemMang\heap_2.c> +OPTFFF 4,19,1,352321536,0,0,0,0,<.\webserver\uIP_Task.c> +OPTFFF 4,20,1,0,0,0,0,0,<.\webserver\emac.c> +OPTFFF 4,21,1,0,0,0,0,0,<.\webserver\httpd.c> +OPTFFF 4,22,1,0,0,0,0,0,<.\webserver\httpd-cgi.c> +OPTFFF 4,23,1,0,0,0,0,0,<.\webserver\httpd-fs.c> +OPTFFF 4,24,1,0,0,0,0,0,<.\webserver\http-strings.c> +OPTFFF 4,25,1,0,0,0,0,0,<..\Common\ethernet\uIP\uip-1.0\uip\uip_arp.c> +OPTFFF 4,26,1,0,0,0,0,0,<..\Common\ethernet\uIP\uip-1.0\uip\psock.c> +OPTFFF 4,27,1,0,0,0,0,0,<..\Common\ethernet\uIP\uip-1.0\uip\timer.c> +OPTFFF 4,28,1,0,0,0,0,0,<..\Common\ethernet\uIP\uip-1.0\uip\uip.c> + + +TARGOPT 1, (FreeRTOS_Demo) + ADSCLK=8000000 + OPTTT 1,1,1,0 + OPTHX 1,65535,0,0,0 + OPTLX 79,66,8,<.\rvmdk\> + OPTOX 16 + OPTLT 1,1,1,0,1,1,0,1,0,0,0,0 + OPTXL 1,1,1,1,1,1,1,0,0 + OPTFL 1,0,1 + OPTAX 255 + OPTBL 0,(Data Sheet) + OPTDL (SARMCM3.DLL)()(DLM.DLL)(-pLM3S6965)(SARMCM3.DLL)()(TLM.DLL)(-pLM3S6965) + OPTDBG 48126,3,()()()()()()()()()() (BIN\lmidk-agdi.dll)()()() + OPTKEY 0,(DLGTARM)((1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(107=-1,-1,-1,-1,0)(100=-1,-1,-1,-1,0)(101=-1,-1,-1,-1,0)(102=-1,-1,-1,-1,0)(161=-1,-1,-1,-1,0)(162=-1,-1,-1,-1,0)(150=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)(1014=-1,-1,-1,-1,0)(1016=-1,-1,-1,-1,0)) + OPTKEY 0,(ARMDBGFLAGS)() + OPTKEY 0,(lmidk-agdi)(-B0 -O1792) + OPTMM 1,2,(0) + OPTDF 0x84 + OPTLE <> + OPTLC <> +EndOpt + diff --git a/Demo/CORTEX_LM3S6965_KEIL/RTOSDemo.Uv2 b/Demo/CORTEX_LM3S6965_KEIL/RTOSDemo.Uv2 new file mode 100644 index 000000000..0a625124a --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/RTOSDemo.Uv2 @@ -0,0 +1,129 @@ +### uVision2 Project, (C) Keil Software +### Do not modify ! + +Target (FreeRTOS_Demo), 0x0004 // Tools: 'ARM-ADS' + +Group (Demo_Source) +Group (Libraries) +Group (RTOS_Source) +Group (uIP_Source) + +File 1,1,<..\Common\Minimal\BlockQ.c> 0x46520544 +File 1,1,<..\Common\Minimal\blocktim.c> 0x46520544 +File 1,1,<..\Common\Minimal\death.c> 0x46520544 +File 1,1,<..\Common\Minimal\integer.c> 0x46520544 +File 1,1,<.\main.c> 0x4664AC5E +File 1,1,<.\ParTest\ParTest.c> 0x46520580 +File 1,1,<..\Common\Minimal\PollQ.c> 0x46520544 +File 1,1,<..\Common\Minimal\semtest.c> 0x46520544 +File 1,2,<.\startup_rvmdk.S> 0x4664B752 +File 1,1,<.\timertest.c> 0x46520544 +File 1,5,<.\FreeRTOSConfig.h> 0x466376CC +File 2,4,<.\LuminaryDrivers\driverlib.lib> 0x46647F6C +File 2,1,<.\LuminaryDrivers\osram128x64x4.c> 0x46649D66 +File 3,1,<..\..\Source\tasks.c> 0x46520544 +File 3,1,<..\..\Source\list.c> 0x46520544 +File 3,1,<..\..\Source\queue.c> 0x46520544 +File 3,1,<..\..\Source\portable\RVDS\ARM_CM3\port.c> 0x44FB69B0 +File 3,1,<..\..\Source\portable\MemMang\heap_2.c> 0x46520580 +File 4,1,<.\webserver\uIP_Task.c> 0x4664CFB2 +File 4,1,<.\webserver\emac.c> 0x4664A47C +File 4,1,<.\webserver\httpd.c> 0x46118A3C +File 4,1,<.\webserver\httpd-cgi.c> 0x4651A7C0 +File 4,1,<.\webserver\httpd-fs.c> 0x45613A4C +File 4,1,<.\webserver\http-strings.c> 0x45613A4C +File 4,1,<..\Common\ethernet\uIP\uip-1.0\uip\uip_arp.c> 0x4651BF30 +File 4,1,<..\Common\ethernet\uIP\uip-1.0\uip\psock.c> 0x45613A10 +File 4,1,<..\Common\ethernet\uIP\uip-1.0\uip\timer.c> 0x45613A10 +File 4,1,<..\Common\ethernet\uIP\uip-1.0\uip\uip.c> 0x4651C50C + + +Options 1,0,0 // Target 'FreeRTOS_Demo' + Device (LM3S6965) + Vendor (Luminary Micro) + Cpu (IRAM(0x20000000-0x2000FFFF) IROM(0-0x3FFFF) CLOCK(6000000) CPUTYPE("Cortex-M3")) + FlashUt () + StupF ("STARTUP\Luminary\Startup.s" ("Luminary Startup Code")) + FlashDR (UL2CM3(-UU0101L5E -O14 -S0 -C0 -N00("ARM Cortex-M3") -D00(1BA00477) -L00(4) -FO7 -FD20000000 -FC800 -FN1 -FF0LM3S_256 -FS00 -FL040000)) + DevID (4337) + Rgf (LM3Sxxxx.H) + Mem () + C () + A () + RL () + OH () + DBC_IFX () + DBC_CMS () + DBC_AMS () + DBC_LMS () + UseEnv=0 + EnvBin () + EnvInc () + EnvLib () + EnvReg (ÿLuminary\) + OrgReg (ÿLuminary\) + TgStat=16 + OutDir (.\rvmdk\) + OutName (RTOSDemo) + GenApp=1 + GenLib=0 + GenHex=0 + Debug=1 + Browse=1 + LstDir (.\rvmdk\) + HexSel=1 + MG32K=0 + TGMORE=0 + RunUsr 0 1 + RunUsr 1 0 <> + BrunUsr 0 0 <> + BrunUsr 1 0 <> + CrunUsr 0 0 <> + CrunUsr 1 0 <> + SVCSID <> + GLFLAGS=1790 + ADSFLGA { 16,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + ACPUTYP ("Cortex-M3") + ADSTFLGA { 0,12,0,2,99,0,0,66,0,0,0,0,0,0,0,0,0,0,0,0 } + OCMADSOCM { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + OCMADSIRAM { 0,0,0,0,32,0,0,1,0 } + OCMADSIROM { 1,0,0,0,0,0,0,4,0 } + OCMADSXRAM { 0,0,0,0,0,0,0,0,0 } + OCR_RVCT { 1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,4,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,1,0,0,0,0,0,0,0,0,0,0 } + RV_STAVEC () + ADSCCFLG { 9,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + ADSCMISC () + ADSCDEFN (RVDS_ARMCM3_LM3S102, "PACK_STRUCT_END=","ALIGN_STRUCT_END=") + ADSCUDEF () + ADSCINCD (.;.\LuminaryDrivers;..\..\Source\portable\RVDS\ARM_CM3;..\..\Source\include;..\Common\include;..\Common\ethernet\uIP\uip-1.0\uip;.\webserver) + ADSASFLG { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + ADSAMISC () + ADSADEFN () + ADSAUDEF () + ADSAINCD () + PropFld { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + IncBld=1 + AlwaysBuild=0 + GenAsm=0 + AsmAsm=0 + PublicsOnly=0 + StopCode=3 + CustArgs () + LibMods () + ADSLDFG { 17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + ADSLDTA (0x00000000) + ADSLDDA (0x20000000) + ADSLDSC () + ADSLDIB () + ADSLDIC () + ADSLDMC (--entry Reset_Handler) + ADSLDIF () + ADSLDDW () + OPTDL (SARMCM3.DLL)()(DLM.DLL)(-pLM3S6965)(SARMCM3.DLL)()(TLM.DLL)(-pLM3S6965) + OPTDBG 48126,3,()()()()()()()()()() (BIN\lmidk-agdi.dll)()()() + FLASH1 { 1,0,0,0,1,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0 } + FLASH2 (BIN\lmidk-agdi.dll) + FLASH3 ("" ()) + FLASH4 () +EndOpt + diff --git a/Demo/CORTEX_LM3S6965_KEIL/bitmap.h b/Demo/CORTEX_LM3S6965_KEIL/bitmap.h new file mode 100644 index 000000000..02ce0b365 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/bitmap.h @@ -0,0 +1,171 @@ +#ifndef BITMAP_H +#define BITMAP_H + +const unsigned char pucImage[] = +{ +0x00, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0x00, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa0, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, +0x00, 0x8f, 0xff, 0xff, 0xf8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x88, 0x88, 0x88, +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x78, 0x8f, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x88, 0x77, 0x77, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xf0, 0x00, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, +0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x08, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, +0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0x00, 0x8f, 0x00, 0xff, +0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x78, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x07, +0x00, 0x70, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, +0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0x88, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x07, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf8, +0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x8f, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0x87, 0x77, +0x77, 0x77, 0x78, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x88, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf8, 0x87, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, +0x78, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xff, 0x80, 0x00, 0x8f, 0x8f, 0xff, 0x87, 0x77, 0x77, 0x77, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, +0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x8f, 0x07, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, +0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x07, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, +0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0f, 0x00, 0x8f, 0x00, 0xff, +0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, +0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, +0x78, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x70, 0x08, 0x00, 0x88, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x88, 0x88, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, +0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x70, 0x07, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x87, 0x88, +0x88, 0x8f, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x7f, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf7, 0x88, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf7, +0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x88, 0x88, 0x88, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0x87, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, +0x00, 0x00, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, +0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x07, 0xff, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xff, 0xff, 0x88, 0x88, 0x88, 0x88, +0xff, 0xff, 0xff, 0xff, 0x88, 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x87, 0x77, 0x77, 0x77, +0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0x00, 0x0f, 0x70, 0x08, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0x00, 0x07, 0x70, 0x07, +0x88, 0x88, 0x88, 0xff, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x70, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x08, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x08, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa0, 0x00, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, +0x00 }; + +#define bmpBITMAP_HEIGHT 50 +#define bmpBITMAP_WIDTH 128 + +#endif diff --git a/Demo/CORTEX_LM3S6965_KEIL/lcd_message.h b/Demo/CORTEX_LM3S6965_KEIL/lcd_message.h new file mode 100644 index 000000000..ced7a1dbc --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/lcd_message.h @@ -0,0 +1,9 @@ +#ifndef LCD_MESSAGE_H +#define LCD_MESSAGE_H + +typedef struct +{ + char *pcMessage; +} xOLEDMessage; + +#endif /* LCD_MESSAGE_H */ diff --git a/Demo/CORTEX_LM3S6965_KEIL/main.c b/Demo/CORTEX_LM3S6965_KEIL/main.c new file mode 100644 index 000000000..9e3babb5d --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/main.c @@ -0,0 +1,331 @@ +/* + FreeRTOS.org V4.3.0 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + *************************************************************************** +*/ + + +/* + * Creates all the demo application tasks, then starts the scheduler. The WEB + * documentation provides more details of the standard demo application tasks. + * In addition to the standard demo tasks, the following tasks and tests are + * defined and/or created within this file: + * + * "Fast Interrupt Test" - A high frequency periodic interrupt is generated + * using a free running timer to demonstrate the use of the + * configKERNEL_INTERRUPT_PRIORITY configuration constant. The interrupt + * service routine measures the number of processor clocks that occur between + * each interrupt - and in so doing measures the jitter in the interrupt timing. + * The maximum measured jitter time is latched in the ulMaxJitter variable, and + * displayed on the OLED display by the 'Check' task as described below. The + * fast interrupt is configured and handled in the timertest.c source file. + * + * "OLED" task - the OLED task is a 'gatekeeper' task. It is the only task that + * is permitted to access the display directly. Other tasks wishing to write a + * message to the OLED send the message on a queue to the OLED task instead of + * accessing the OLED themselves. The OLED task just blocks on the queue waiting + * for messages - waking and displaying the messages as they arrive. + * + * "Check" task - This only executes every five seconds but has the highest + * priority so is guaranteed to get processor time. Its main function is to + * check that all the standard demo tasks are still operational. Should any + * unexpected behaviour within a demo task be discovered the 'check' task will + * write an error to the OLED (via the OLED task). If all the demo tasks are + * executing with their expected behaviour then the check task writes PASS + * along with the max jitter time to the OLED (again via the OLED task), as + * described above. + * + * "uIP" task - This is the task that handles the uIP stack. All TCP/IP + * processing is performed in this task. + */ + + + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "Task.h" +#include "queue.h" +#include "semphr.h" + +/* Demo app includes. */ +#include "BlockQ.h" +#include "death.h" +#include "integer.h" +#include "blocktim.h" +#include "flash.h" +#include "partest.h" +#include "semtest.h" +#include "pollq.h" +#include "lcd_message.h" +#include "bitmap.h" + +/* Hardware library includes. */ +#include "hw_memmap.h" +#include "hw_types.h" +#include "sysctl.h" +#include "gpio.h" +#include "osram128x64x4.h" + +/*-----------------------------------------------------------*/ + +/* The time between cycles of the 'check' task. */ +#define mainCHECK_DELAY ( ( portTickType ) 5000 / portTICK_RATE_MS ) + +/* Size of the stack allocated to the uIP task. */ +#define mainBASIC_WEB_STACK_SIZE ( 200 ) + +/* The check task uses the sprintf function so requires a little more stack too. */ +#define mainCHECK_TASK_STACK_SIZE ( configMINIMAL_STACK_SIZE + 50 ) + +/* Task priorities. */ +#define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2 ) +#define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 ) +#define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 ) +#define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 ) +#define mainCREATOR_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 ) +#define mainINTEGER_TASK_PRIORITY ( tskIDLE_PRIORITY ) + +/* The maximum number of message that can be waiting for display at any one +time. */ +#define mainOLED_QUEUE_SIZE ( 3 ) + +/* Dimensions the buffer into which the jitter time is written. */ +#define mainMAX_MSG_LEN 25 + +/* The period of the system clock in nano seconds. This is used to calculate +the jitter time in nano seconds. */ +#define mainNS_PER_CLOCK ( ( unsigned portLONG ) ( ( 1.0 / ( double ) configCPU_CLOCK_HZ ) * 1000000000.0 ) ) + +/* Constants used when writing strings to the display. */ +#define mainCHARACTER_HEIGHT ( 9 ) +#define mainMAX_ROWS ( mainCHARACTER_HEIGHT * 7 ) +#define mainFULL_SCALE ( 15 ) +#define ulSSI_FREQUENCY 1000000 + +/*-----------------------------------------------------------*/ + +/* + * Checks the status of all the demo tasks then prints a message to the + * display. The message will be either PASS - an include in brackets the + * maximum measured jitter time (as described at the to of the file), or a + * message that describes which of the standard demo tasks an error has been + * discovered in. + * + * Messages are not written directly to the terminal, but passed to vOLEDTask + * via a queue. + */ +static void vCheckTask( void *pvParameters ); + +/* + * The task that handles the uIP stack. All TCP/IP processing is performed in + * this task. + */ +extern void vuIP_Task( void *pvParameters ); + +/* + * The display is written two by more than one task so is controlled by a + * 'gatekeeper' task. This is the only task that is actually permitted to + * access the display directly. Other tasks wanting to display a message send + * the message to the gatekeeper. + */ +static void vOLEDTask( void *pvParameters ); + +/* + * Configure the hardware for the demo. + */ +static void prvSetupHardware( void ); + +/* + * Configures the high frequency timers - those used to measure the timing + * jitter while the real time kernel is executing. + */ +extern void vSetupTimer( void ); + +/*-----------------------------------------------------------*/ + +/* The queue used to send messages to the OLED task. */ +xQueueHandle xOLEDQueue; + +/* The welcome text. */ +const portCHAR * const pcWelcomeMessage = " www.FreeRTOS.org"; + +/*-----------------------------------------------------------*/ + +int main( void ) +{ + prvSetupHardware(); + + /* Create the queue used by the OLED task. Messages for display on the OLED + are received via this queue. */ + xOLEDQueue = xQueueCreate( mainOLED_QUEUE_SIZE, sizeof( xOLEDMessage ) ); + + /* Create the uIP task. */ + xTaskCreate( vuIP_Task, ( signed portCHAR * ) "uIP", mainBASIC_WEB_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY - 1, NULL ); + + /* Start the standard demo tasks. */ + vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY ); + vCreateBlockTimeTasks(); + vStartSemaphoreTasks( mainSEM_TEST_PRIORITY ); + vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY ); + vStartIntegerMathTasks( mainINTEGER_TASK_PRIORITY ); + + /* Start the tasks defined within this file/specific to this demo. */ + xTaskCreate( vCheckTask, ( signed portCHAR * ) "Check", mainCHECK_TASK_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL ); + xTaskCreate( vOLEDTask, ( signed portCHAR * ) "OLED", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL ); + + /* The suicide tasks must be created last as they need to know how many + tasks were running prior to their creation in order to ascertain whether + or not the correct/expected number of tasks are running at any given time. */ + vCreateSuicidalTasks( mainCREATOR_TASK_PRIORITY ); + + /* Configure the high frequency interrupt used to measure the interrupt + jitter time. */ + #ifdef __ICCARM__ + vSetupTimer(); + #endif + + /* Start the scheduler. */ + vTaskStartScheduler(); + + /* Will only get here if there was insufficient memory to create the idle + task. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void prvSetupHardware( void ) +{ + /* Set the clocking to run from the PLL at 50 MHz */ + SysCtlClockSet( SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ ); + + /* Enable/Reset the Ethernet Controller */ + SysCtlPeripheralEnable( SYSCTL_PERIPH_ETH ); + SysCtlPeripheralReset( SYSCTL_PERIPH_ETH ); + + /* Enable Port F for Ethernet LEDs + LED0 Bit 3 Output + LED1 Bit 2 Output */ + SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOF ); + GPIODirModeSet( GPIO_PORTF_BASE, (GPIO_PIN_2 | GPIO_PIN_3), GPIO_DIR_MODE_HW ); + GPIOPadConfigSet( GPIO_PORTF_BASE, (GPIO_PIN_2 | GPIO_PIN_3 ), GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD ); + + vParTestInitialise(); +} +/*-----------------------------------------------------------*/ + +static void vCheckTask( void *pvParameters ) +{ +portTickType xLastExecutionTime; +xOLEDMessage xMessage; +static portCHAR cPassMessage[ mainMAX_MSG_LEN ]; +extern unsigned portLONG ulMaxJitter; + + xLastExecutionTime = xTaskGetTickCount(); + xMessage.pcMessage = cPassMessage; + + for( ;; ) + { + /* Perform this check every mainCHECK_DELAY milliseconds. */ + vTaskDelayUntil( &xLastExecutionTime, mainCHECK_DELAY ); + + /* Has an error been found in any task? */ + + if( xAreBlockingQueuesStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN BLOCK Q"; + } + else if( xAreBlockTimeTestTasksStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN BLOCK TIME"; + } + else if( xAreSemaphoreTasksStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN SEMAPHORE"; + } + else if( xArePollingQueuesStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN POLL Q"; + } + else if( xIsCreateTaskStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN CREATE"; + } + else if( xAreIntegerMathsTaskStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN MATH"; + } + else + { + #ifdef __ICCARM__ + sprintf( cPassMessage, "PASS [%uns]", ulMaxJitter * mainNS_PER_CLOCK ); + #else + sprintf( cPassMessage, "PASS" ); + #endif + } + + /* Send the message to the OLED gatekeeper for display. */ + xQueueSend( xOLEDQueue, &xMessage, portMAX_DELAY ); + } +} +/*-----------------------------------------------------------*/ + + + +void vOLEDTask( void *pvParameters ) +{ +xOLEDMessage xMessage; +unsigned portLONG ulY = mainMAX_ROWS; + + /* Initialise the OLED and display a startup message. */ + OSRAM128x64x4Init( ulSSI_FREQUENCY ); + + OSRAM128x64x4StringDraw( " POWERED BY FreeRTOS", 0, 0, mainFULL_SCALE ); + OSRAM128x64x4ImageDraw( pucImage, 0, mainCHARACTER_HEIGHT + 1, bmpBITMAP_WIDTH, bmpBITMAP_HEIGHT ); + + for( ;; ) + { + /* Wait for a message to arrive that requires displaying. */ + xQueueReceive( xOLEDQueue, &xMessage, portMAX_DELAY ); + + /* Write the message on the next available row. */ + ulY += mainCHARACTER_HEIGHT; + if( ulY >= mainMAX_ROWS ) + { + ulY = mainCHARACTER_HEIGHT; + OSRAM128x64x4Clear(); + OSRAM128x64x4StringDraw( pcWelcomeMessage, 0, 0, mainFULL_SCALE ); + } + + /* Display the message. */ + OSRAM128x64x4StringDraw( xMessage.pcMessage, 0, ulY, mainFULL_SCALE ); + } +} diff --git a/Demo/CORTEX_LM3S6965_KEIL/startup_rvmdk.S b/Demo/CORTEX_LM3S6965_KEIL/startup_rvmdk.S new file mode 100644 index 000000000..ddedd9af5 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/startup_rvmdk.S @@ -0,0 +1,248 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2007 Luminary Micro, Inc. All rights reserved. +; +; Software License Agreement +; +; Luminary Micro, Inc. (LMI) is supplying this software for use solely and +; exclusively on LMI's microcontroller products. +; +; The software is owned by LMI and/or its suppliers, and is protected under +; applicable copyright laws. All rights are reserved. Any use in violation +; of the foregoing restrictions may subject the user to criminal sanctions +; under applicable laws, as well as to civil liability for the breach of the +; terms and conditions of this license. +; +; THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +; OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +; MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +; LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +; CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 1408 of the Stellaris Peripheral Driver Library. +; +;****************************************************************************** + +;****************************************************************************** +; +; 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 + +;****************************************************************************** +; +; 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 ; MPU Fault Handler + DCD IntDefaultHandler ; Bus Fault Handler + DCD IntDefaultHandler ; 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 + EXTERN xPortPendSVHandler + DCD xPortPendSVHandler ; PendSV Handler + EXTERN xPortSysTickHandler + DCD xPortSysTickHandler ; 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 + DCD IntDefaultHandler ; UART1 + DCD IntDefaultHandler ; SSI + DCD IntDefaultHandler ; I2C + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog + EXTERN Timer0IntHandler + DCD Timer0IntHandler ; Timer 0A + DCD IntDefaultHandler ; Timer 0B + DCD IntDefaultHandler ; Timer 1A + DCD IntDefaultHandler ; Timer 1B + DCD IntDefaultHandler ; Timer 2A + DCD IntDefaultHandler ; Timer 2B + DCD IntDefaultHandler ; Comp 0 + DCD IntDefaultHandler ; Comp 1 + DCD IntDefaultHandler ; Comp 2 + DCD IntDefaultHandler ; System Control + 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 + EXTERN vEMAC_ISR + DCD vEMAC_ISR ; Ethernet + DCD IntDefaultHandler ; Hibernate + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; 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. It will then call __rt_entry, which will be either the + ; C library version or the one supplied here depending on the + ; configured startup type. + ; + 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/Demo/CORTEX_LM3S6965_KEIL/timertest.c b/Demo/CORTEX_LM3S6965_KEIL/timertest.c new file mode 100644 index 000000000..2eddbfcda --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/timertest.c @@ -0,0 +1,133 @@ +/* + FreeRTOS.org V4.3.0 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + + Also see http://www.SafeRTOS.com for an IEC 61508 compliant version along + with commercial development and support options. + *************************************************************************** +*/ + +/* High speed timer test as described in main.c. */ + +/* Scheduler includes. */ +#include "FreeRTOS.h" + +/* Library includes. */ +#include "hw_ints.h" +#include "hw_memmap.h" +#include "hw_types.h" +#include "interrupt.h" +#include "sysctl.h" +#include "LMI_timer.h" + +/* The set frequency of the interrupt. Deviations from this are measured as +the jitter. */ +#define timerINTERRUPT_FREQUENCY ( 20000UL ) + +/* The expected time between each of the timer interrupts - if the jitter was +zero. */ +#define timerEXPECTED_DIFFERENCE_VALUE ( configCPU_CLOCK_HZ / timerINTERRUPT_FREQUENCY ) + +/* The highest available interrupt priority. */ +#define timerHIGHEST_PRIORITY ( 0 ) + +/* Misc defines. */ +#define timerMAX_32BIT_VALUE ( 0xffffffffUL ) +#define timerTIMER_1_COUNT_VALUE ( * ( ( unsigned long * ) ( TIMER1_BASE + 0x48 ) ) ) + +/*-----------------------------------------------------------*/ + +/* Interrupt handler in which the jitter is measured. */ +void Timer0IntHandler( void ); + +/* Stores the value of the maximum recorded jitter between interrupts. */ +unsigned portLONG ulMaxJitter = 0; + +/*-----------------------------------------------------------*/ + +void vSetupTimer( void ) +{ +unsigned long ulFrequency; + + /* Timer zero is used to generate the interrupts, and timer 1 is used + to measure the jitter. */ + SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER0 ); + SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER1 ); + TimerConfigure( TIMER0_BASE, TIMER_CFG_32_BIT_PER ); + TimerConfigure( TIMER1_BASE, TIMER_CFG_32_BIT_PER ); + + /* Set the timer interrupt to be above the kernel - highest. */ + IntPrioritySet( INT_TIMER0A, timerHIGHEST_PRIORITY ); + + /* Just used to measure time. */ + TimerLoadSet(TIMER1_BASE, TIMER_A, timerMAX_32BIT_VALUE ); + + /* The rate at which the timer will interrupt. */ + ulFrequency = configCPU_CLOCK_HZ / timerINTERRUPT_FREQUENCY; + TimerLoadSet( TIMER0_BASE, TIMER_A, ulFrequency ); + IntEnable( INT_TIMER0A ); + TimerIntEnable( TIMER0_BASE, TIMER_TIMA_TIMEOUT ); + + /* Enable both timers. */ + TimerEnable( TIMER0_BASE, TIMER_A ); + TimerEnable( TIMER1_BASE, TIMER_A ); +} +/*-----------------------------------------------------------*/ + +void Timer0IntHandler( void ) +{ +unsigned portLONG ulDifference, ulCurrentCount; +static portLONG ulMaxDifference = 0, ulLastCount = 0; + + /* We use the timer 1 counter value to measure the clock cycles between + the timer 0 interrupts. */ + ulCurrentCount = timerTIMER_1_COUNT_VALUE; + + if( ulCurrentCount < ulLastCount ) + { + /* How many times has timer 1 counted since the last interrupt? */ + ulDifference = ulLastCount - ulCurrentCount; + + /* Is this the largest difference we have measured yet? */ + if( ulDifference > ulMaxDifference ) + { + ulMaxDifference = ulDifference; + ulMaxJitter = ulMaxDifference - timerEXPECTED_DIFFERENCE_VALUE; + } + } + + ulLastCount = ulCurrentCount; + + TimerIntClear( TIMER0_BASE, TIMER_TIMA_TIMEOUT ); +} + + + + + diff --git a/Demo/CORTEX_LM3S6965_KEIL/webserver/Makefile.webserver b/Demo/CORTEX_LM3S6965_KEIL/webserver/Makefile.webserver new file mode 100644 index 000000000..f38c47a72 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/webserver/Makefile.webserver @@ -0,0 +1 @@ +APP_SOURCES += httpd.c http-strings.c httpd-fs.c httpd-cgi.c diff --git a/Demo/CORTEX_LM3S6965_KEIL/webserver/clock-arch.h b/Demo/CORTEX_LM3S6965_KEIL/webserver/clock-arch.h new file mode 100644 index 000000000..cde657b62 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/webserver/clock-arch.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2006, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: clock-arch.h,v 1.2 2006/06/12 08:00:31 adam Exp $ + */ + +#ifndef __CLOCK_ARCH_H__ +#define __CLOCK_ARCH_H__ + +#include "FreeRTOS.h" + +typedef unsigned long clock_time_t; +#define CLOCK_CONF_SECOND configTICK_RATE_HZ + +#endif /* __CLOCK_ARCH_H__ */ diff --git a/Demo/CORTEX_LM3S6965_KEIL/webserver/emac.c b/Demo/CORTEX_LM3S6965_KEIL/webserver/emac.c new file mode 100644 index 000000000..77e21c399 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/webserver/emac.c @@ -0,0 +1,281 @@ +/* + FreeRTOS.org V4.3.0 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + *************************************************************************** +*/ + +/* Kernel includes. */ +#include "FreeRTOS.h" +#include "Semphr.h" +#include "task.h" + +/* Demo includes. */ +#include "EMAC.h" + +/* uIP includes. */ +#include "uip.h" + +/* Hardware library includes. */ +#include "hw_types.h" +#include "hw_memmap.h" +#include "hw_ints.h" +#include "hw_ethernet.h" +#include "ethernet.h" +#include "interrupt.h" + +#define emacNUM_RX_BUFFERS 5 +#define emacFRAM_SIZE_BYTES 2 +#define macNEGOTIATE_DELAY 2000 +#define macWAIT_SEND_TIME ( 10 ) + +/* The task that handles the MAC peripheral. This is created at a high +priority and is effectively a deferred interrupt handler. The peripheral +handling is deferred to a task to prevent the entire FIFO having to be read +from within an ISR. */ +void vMACHandleTask( void *pvParameters ); + +/*-----------------------------------------------------------*/ + +/* The semaphore used to wake the uIP task when data arrives. */ +xSemaphoreHandle xEMACSemaphore = NULL; + +/* The semaphore used to wake the interrupt handler task. The peripheral +is processed at the task level to prevent the need to read the entire FIFO from +within the ISR itself. */ +xSemaphoreHandle xMACInterruptSemaphore = NULL; + +/* The buffer used by the uIP stack. In this case the pointer is used to +point to one of the Rx buffers. */ +unsigned portCHAR *uip_buf; + +/* Buffers into which Rx data is placed. */ +static unsigned portCHAR ucRxBuffers[ emacNUM_RX_BUFFERS ][ UIP_BUFSIZE + ( 4 * emacFRAM_SIZE_BYTES ) ]; + +/* The length of the data within each of the Rx buffers. */ +static unsigned portLONG ulRxLength[ emacNUM_RX_BUFFERS ]; + +/* Used to keep a track of the number of bytes to transmit. */ +static unsigned portLONG ulNextTxSpace; + +/*-----------------------------------------------------------*/ + +portBASE_TYPE vInitEMAC( void ) +{ +unsigned long ulTemp; +portBASE_TYPE xReturn; + + /* Ensure all interrupts are disabled. */ + EthernetIntDisable( ETH_BASE, ( ETH_INT_PHY | ETH_INT_MDIO | ETH_INT_RXER | ETH_INT_RXOF | ETH_INT_TX | ETH_INT_TXER | ETH_INT_RX)); + + /* Clear any interrupts that were already pending. */ + ulTemp = EthernetIntStatus( ETH_BASE, pdFALSE ); + EthernetIntClear( ETH_BASE, ulTemp ); + + /* Initialise the MAC and connect. */ + EthernetInit( ETH_BASE ); + EthernetConfigSet( ETH_BASE, ( ETH_CFG_TX_DPLXEN | ETH_CFG_TX_CRCEN | ETH_CFG_TX_PADEN ) ); + EthernetEnable( ETH_BASE ); + + /* Mark each Rx buffer as empty. */ + for( ulTemp = 0; ulTemp < emacNUM_RX_BUFFERS; ulTemp++ ) + { + ulRxLength[ ulTemp ] = 0; + } + + /* Create the queue and task used to defer the MAC processing to the + task level. */ + vSemaphoreCreateBinary( xMACInterruptSemaphore ); + xSemaphoreTake( xMACInterruptSemaphore, 0 ); + xReturn = xTaskCreate( vMACHandleTask, ( signed portCHAR * ) "MAC", configMINIMAL_STACK_SIZE, NULL, configMAX_PRIORITIES - 1, NULL ); + vTaskDelay( macNEGOTIATE_DELAY ); + + /* We are only interested in Rx interrupts. */ + IntPrioritySet( INT_ETH, configKERNEL_INTERRUPT_PRIORITY ); + IntEnable( INT_ETH ); + EthernetIntEnable(ETH_BASE, ETH_INT_RX); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +unsigned int uiGetEMACRxData( unsigned char *ucBuffer ) +{ +static unsigned long ulNextRxBuffer = 0; +unsigned int iLen; + + iLen = ulRxLength[ ulNextRxBuffer ]; + + if( iLen != 0 ) + { + /* Leave room for the size at the start of the buffer. */ + uip_buf = &( ucRxBuffers[ ulNextRxBuffer ][ 2 ] ); + + ulRxLength[ ulNextRxBuffer ] = 0; + + ulNextRxBuffer++; + if( ulNextRxBuffer >= emacNUM_RX_BUFFERS ) + { + ulNextRxBuffer = 0; + } + } + + return iLen; +} +/*-----------------------------------------------------------*/ + +void vInitialiseSend( void ) +{ + /* Set the index to the first byte to send - skipping over the size + bytes. */ + ulNextTxSpace = 2; +} +/*-----------------------------------------------------------*/ + +void vIncrementTxLength( unsigned portLONG ulLength ) +{ + ulNextTxSpace += ulLength; +} +/*-----------------------------------------------------------*/ + +void vSendBufferToMAC( void ) +{ +unsigned long *pulSource; +unsigned portSHORT * pus; +unsigned portLONG ulNextWord; + + /* Locate the data to be send. */ + pus = ( unsigned portSHORT * ) uip_buf; + + /* Add in the size of the data. */ + pus--; + *pus = ulNextTxSpace; + + /* Wait for data to be sent if there is no space immediately. */ + while( !EthernetSpaceAvail( ETH_BASE ) ) + { + vTaskDelay( macWAIT_SEND_TIME ); + } + + pulSource = ( unsigned portLONG * ) pus; + + for( ulNextWord = 0; ulNextWord < ulNextTxSpace; ulNextWord += sizeof( unsigned portLONG ) ) + { + HWREG(ETH_BASE + MAC_O_DATA) = *pulSource; + pulSource++; + } + + /* Go. */ + HWREG( ETH_BASE + MAC_O_TR ) = MAC_TR_NEWTX; +} +/*-----------------------------------------------------------*/ + +void vEMAC_ISR( void ) +{ +portBASE_TYPE xSwitchRequired = pdFALSE; +unsigned portLONG ulTemp; + + /* Clear the interrupt. */ + ulTemp = EthernetIntStatus( ETH_BASE, pdFALSE ); + EthernetIntClear( ETH_BASE, ulTemp ); + + /* Was it an Rx interrupt? */ + if( ulTemp & ETH_INT_RX ) + { + xSwitchRequired = pdTRUE; + xSemaphoreGiveFromISR( xMACInterruptSemaphore, pdFALSE ); + EthernetIntDisable( ETH_BASE, ETH_INT_RX ); + } + + /* Switch to the uIP task. */ + portEND_SWITCHING_ISR( xSwitchRequired ); +} +/*-----------------------------------------------------------*/ + +void vMACHandleTask( void *pvParameters ) +{ +unsigned long ulLen = 0, i; +unsigned portLONG ulLength, ulInt; +unsigned long *pulBuffer; +static unsigned portLONG ulNextRxBuffer = 0; +portBASE_TYPE xSwitchRequired = pdFALSE; + + for( ;; ) + { + /* Wait for something to do. */ + xSemaphoreTake( xMACInterruptSemaphore, portMAX_DELAY ); + + while( ( ulInt = ( EthernetIntStatus( ETH_BASE, pdFALSE ) & ETH_INT_RX ) ) != 0 ) + { + ulLength = HWREG( ETH_BASE + MAC_O_DATA ); + + /* Leave room at the start of the buffer for the size. */ + pulBuffer = ( unsigned long * ) &( ucRxBuffers[ ulNextRxBuffer ][ 2 ] ); + *pulBuffer = ( ulLength >> 16 ); + + /* Get the size of the data. */ + pulBuffer = ( unsigned long * ) &( ucRxBuffers[ ulNextRxBuffer ][ 4 ] ); + ulLength &= 0xFFFF; + + if( ulLength > 4 ) + { + ulLength -= 4; + + if( ulLength >= UIP_BUFSIZE ) + { + /* The data won't fit in our buffer. Ensure we don't + try to write into the buffer. */ + ulLength = 0; + } + + /* Read out the data into our buffer. */ + for( i = 0; i < ulLength; i += sizeof( unsigned portLONG ) ) + { + *pulBuffer = HWREG( ETH_BASE + MAC_O_DATA ); + pulBuffer++; + } + + /* Store the length of the data into the separate array. */ + ulRxLength[ ulNextRxBuffer ] = ulLength; + + /* Use the next buffer the next time through. */ + ulNextRxBuffer++; + if( ulNextRxBuffer >= emacNUM_RX_BUFFERS ) + { + ulNextRxBuffer = 0; + } + + /* Ensure the uIP task is not blocked as data has arrived. */ + xSemaphoreGive( xEMACSemaphore ); + } + } + + EthernetIntEnable( ETH_BASE, ETH_INT_RX ); + } +} + diff --git a/Demo/CORTEX_LM3S6965_KEIL/webserver/emac.h b/Demo/CORTEX_LM3S6965_KEIL/webserver/emac.h new file mode 100644 index 000000000..a49b59828 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/webserver/emac.h @@ -0,0 +1,322 @@ +/*---------------------------------------------------------------------------- + * LPC2378 Ethernet Definitions + *---------------------------------------------------------------------------- + * Name: EMAC.H + * Purpose: Philips LPC2378 EMAC hardware definitions + *---------------------------------------------------------------------------- + * Copyright (c) 2006 KEIL - An ARM Company. All rights reserved. + *---------------------------------------------------------------------------*/ +#ifndef __EMAC_H +#define __EMAC_H + +/* MAC address definition. The MAC address must be unique on the network. */ +#define emacETHADDR0 0 +#define emacETHADDR1 0xbd +#define emacETHADDR2 0x33 +#define emacETHADDR3 0x02 +#define emacETHADDR4 0x64 +#define emacETHADDR5 0x24 + + +/* EMAC Memory Buffer configuration for 16K Ethernet RAM. */ +#define NUM_RX_FRAG 4 /* Num.of RX Fragments 4*1536= 6.0kB */ +#define NUM_TX_FRAG 2 /* Num.of TX Fragments 2*1536= 3.0kB */ +#define ETH_FRAG_SIZE 1536 /* Packet Fragment size 1536 Bytes */ + +#define ETH_MAX_FLEN 1536 /* Max. Ethernet Frame Size */ + +/* EMAC variables located in 16K Ethernet SRAM */ +#define RX_DESC_BASE 0x7FE00000 +#define RX_STAT_BASE (RX_DESC_BASE + NUM_RX_FRAG*8) +#define TX_DESC_BASE (RX_STAT_BASE + NUM_RX_FRAG*8) +#define TX_STAT_BASE (TX_DESC_BASE + NUM_TX_FRAG*8) +#define RX_BUF_BASE (TX_STAT_BASE + NUM_TX_FRAG*4) +#define TX_BUF_BASE (RX_BUF_BASE + NUM_RX_FRAG*ETH_FRAG_SIZE) + +/* RX and TX descriptor and status definitions. */ +#define RX_DESC_PACKET(i) (*(unsigned int *)(RX_DESC_BASE + 8*i)) +#define RX_DESC_CTRL(i) (*(unsigned int *)(RX_DESC_BASE+4 + 8*i)) +#define RX_STAT_INFO(i) (*(unsigned int *)(RX_STAT_BASE + 8*i)) +#define RX_STAT_HASHCRC(i) (*(unsigned int *)(RX_STAT_BASE+4 + 8*i)) +#define TX_DESC_PACKET(i) (*(unsigned int *)(TX_DESC_BASE + 8*i)) +#define TX_DESC_CTRL(i) (*(unsigned int *)(TX_DESC_BASE+4 + 8*i)) +#define TX_STAT_INFO(i) (*(unsigned int *)(TX_STAT_BASE + 4*i)) +#define RX_BUF(i) (RX_BUF_BASE + ETH_FRAG_SIZE*i) +#define TX_BUF(i) (TX_BUF_BASE + ETH_FRAG_SIZE*i) + +/* MAC Configuration Register 1 */ +#define MAC1_REC_EN 0x00000001 /* Receive Enable */ +#define MAC1_PASS_ALL 0x00000002 /* Pass All Receive Frames */ +#define MAC1_RX_FLOWC 0x00000004 /* RX Flow Control */ +#define MAC1_TX_FLOWC 0x00000008 /* TX Flow Control */ +#define MAC1_LOOPB 0x00000010 /* Loop Back Mode */ +#define MAC1_RES_TX 0x00000100 /* Reset TX Logic */ +#define MAC1_RES_MCS_TX 0x00000200 /* Reset MAC TX Control Sublayer */ +#define MAC1_RES_RX 0x00000400 /* Reset RX Logic */ +#define MAC1_RES_MCS_RX 0x00000800 /* Reset MAC RX Control Sublayer */ +#define MAC1_SIM_RES 0x00004000 /* Simulation Reset */ +#define MAC1_SOFT_RES 0x00008000 /* Soft Reset MAC */ + +/* MAC Configuration Register 2 */ +#define MAC2_FULL_DUP 0x00000001 /* Full Duplex Mode */ +#define MAC2_FRM_LEN_CHK 0x00000002 /* Frame Length Checking */ +#define MAC2_HUGE_FRM_EN 0x00000004 /* Huge Frame Enable */ +#define MAC2_DLY_CRC 0x00000008 /* Delayed CRC Mode */ +#define MAC2_CRC_EN 0x00000010 /* Append CRC to every Frame */ +#define MAC2_PAD_EN 0x00000020 /* Pad all Short Frames */ +#define MAC2_VLAN_PAD_EN 0x00000040 /* VLAN Pad Enable */ +#define MAC2_ADET_PAD_EN 0x00000080 /* Auto Detect Pad Enable */ +#define MAC2_PPREAM_ENF 0x00000100 /* Pure Preamble Enforcement */ +#define MAC2_LPREAM_ENF 0x00000200 /* Long Preamble Enforcement */ +#undef MAC2_NO_BACKOFF /* Remove compiler warning. */ +#define MAC2_NO_BACKOFF 0x00001000 /* No Backoff Algorithm */ +#define MAC2_BACK_PRESSURE 0x00002000 /* Backoff Presurre / No Backoff */ +#define MAC2_EXCESS_DEF 0x00004000 /* Excess Defer */ + +/* Back-to-Back Inter-Packet-Gap Register */ +#define IPGT_FULL_DUP 0x00000015 /* Recommended value for Full Duplex */ +#define IPGT_HALF_DUP 0x00000012 /* Recommended value for Half Duplex */ + +/* Non Back-to-Back Inter-Packet-Gap Register */ +#define IPGR_DEF 0x00000012 /* Recommended value */ + +/* Collision Window/Retry Register */ +#define CLRT_DEF 0x0000370F /* Default value */ + +/* PHY Support Register */ +#undef SUPP_SPEED /* Remove compiler warning. */ +#define SUPP_SPEED 0x00000100 /* Reduced MII Logic Current Speed */ +#define SUPP_RES_RMII 0x00000800 /* Reset Reduced MII Logic */ + +/* Test Register */ +#define TEST_SHCUT_PQUANTA 0x00000001 /* Shortcut Pause Quanta */ +#define TEST_TST_PAUSE 0x00000002 /* Test Pause */ +#define TEST_TST_BACKP 0x00000004 /* Test Back Pressure */ + +/* MII Management Configuration Register */ +#define MCFG_SCAN_INC 0x00000001 /* Scan Increment PHY Address */ +#define MCFG_SUPP_PREAM 0x00000002 /* Suppress Preamble */ +#define MCFG_CLK_SEL 0x0000001C /* Clock Select Mask */ +#define MCFG_RES_MII 0x00008000 /* Reset MII Management Hardware */ + +/* MII Management Command Register */ +#undef MCMD_READ /* Remove compiler warning. */ +#define MCMD_READ 0x00000001 /* MII Read */ +#undef MCMD_SCAN /* Remove compiler warning. */ +#define MCMD_SCAN 0x00000002 /* MII Scan continuously */ + +#define MII_WR_TOUT 0x00050000 /* MII Write timeout count */ +#define MII_RD_TOUT 0x00050000 /* MII Read timeout count */ + +/* MII Management Address Register */ +#define MADR_REG_ADR 0x0000001F /* MII Register Address Mask */ +#define MADR_PHY_ADR 0x00001F00 /* PHY Address Mask */ + +/* MII Management Indicators Register */ +#undef MIND_BUSY /* Remove compiler warning. */ +#define MIND_BUSY 0x00000001 /* MII is Busy */ +#define MIND_SCAN 0x00000002 /* MII Scanning in Progress */ +#define MIND_NOT_VAL 0x00000004 /* MII Read Data not valid */ +#define MIND_MII_LINK_FAIL 0x00000008 /* MII Link Failed */ + +/* Command Register */ +#define CR_RX_EN 0x00000001 /* Enable Receive */ +#define CR_TX_EN 0x00000002 /* Enable Transmit */ +#define CR_REG_RES 0x00000008 /* Reset Host Registers */ +#define CR_TX_RES 0x00000010 /* Reset Transmit Datapath */ +#define CR_RX_RES 0x00000020 /* Reset Receive Datapath */ +#define CR_PASS_RUNT_FRM 0x00000040 /* Pass Runt Frames */ +#define CR_PASS_RX_FILT 0x00000080 /* Pass RX Filter */ +#define CR_TX_FLOW_CTRL 0x00000100 /* TX Flow Control */ +#define CR_RMII 0x00000200 /* Reduced MII Interface */ +#define CR_FULL_DUP 0x00000400 /* Full Duplex */ + +/* Status Register */ +#define SR_RX_EN 0x00000001 /* Enable Receive */ +#define SR_TX_EN 0x00000002 /* Enable Transmit */ + +/* Transmit Status Vector 0 Register */ +#define TSV0_CRC_ERR 0x00000001 /* CRC error */ +#define TSV0_LEN_CHKERR 0x00000002 /* Length Check Error */ +#define TSV0_LEN_OUTRNG 0x00000004 /* Length Out of Range */ +#define TSV0_DONE 0x00000008 /* Tramsmission Completed */ +#define TSV0_MCAST 0x00000010 /* Multicast Destination */ +#define TSV0_BCAST 0x00000020 /* Broadcast Destination */ +#define TSV0_PKT_DEFER 0x00000040 /* Packet Deferred */ +#define TSV0_EXC_DEFER 0x00000080 /* Excessive Packet Deferral */ +#define TSV0_EXC_COLL 0x00000100 /* Excessive Collision */ +#define TSV0_LATE_COLL 0x00000200 /* Late Collision Occured */ +#define TSV0_GIANT 0x00000400 /* Giant Frame */ +#define TSV0_UNDERRUN 0x00000800 /* Buffer Underrun */ +#define TSV0_BYTES 0x0FFFF000 /* Total Bytes Transferred */ +#define TSV0_CTRL_FRAME 0x10000000 /* Control Frame */ +#define TSV0_PAUSE 0x20000000 /* Pause Frame */ +#define TSV0_BACK_PRESS 0x40000000 /* Backpressure Method Applied */ +#define TSV0_VLAN 0x80000000 /* VLAN Frame */ + +/* Transmit Status Vector 1 Register */ +#define TSV1_BYTE_CNT 0x0000FFFF /* Transmit Byte Count */ +#define TSV1_COLL_CNT 0x000F0000 /* Transmit Collision Count */ + +/* Receive Status Vector Register */ +#define RSV_BYTE_CNT 0x0000FFFF /* Receive Byte Count */ +#define RSV_PKT_IGNORED 0x00010000 /* Packet Previously Ignored */ +#define RSV_RXDV_SEEN 0x00020000 /* RXDV Event Previously Seen */ +#define RSV_CARR_SEEN 0x00040000 /* Carrier Event Previously Seen */ +#define RSV_REC_CODEV 0x00080000 /* Receive Code Violation */ +#define RSV_CRC_ERR 0x00100000 /* CRC Error */ +#define RSV_LEN_CHKERR 0x00200000 /* Length Check Error */ +#define RSV_LEN_OUTRNG 0x00400000 /* Length Out of Range */ +#define RSV_REC_OK 0x00800000 /* Frame Received OK */ +#define RSV_MCAST 0x01000000 /* Multicast Frame */ +#define RSV_BCAST 0x02000000 /* Broadcast Frame */ +#define RSV_DRIB_NIBB 0x04000000 /* Dribble Nibble */ +#define RSV_CTRL_FRAME 0x08000000 /* Control Frame */ +#define RSV_PAUSE 0x10000000 /* Pause Frame */ +#define RSV_UNSUPP_OPC 0x20000000 /* Unsupported Opcode */ +#define RSV_VLAN 0x40000000 /* VLAN Frame */ + +/* Flow Control Counter Register */ +#define FCC_MIRR_CNT 0x0000FFFF /* Mirror Counter */ +#define FCC_PAUSE_TIM 0xFFFF0000 /* Pause Timer */ + +/* Flow Control Status Register */ +#define FCS_MIRR_CNT 0x0000FFFF /* Mirror Counter Current */ + +/* Receive Filter Control Register */ +#define RFC_UCAST_EN 0x00000001 /* Accept Unicast Frames Enable */ +#define RFC_BCAST_EN 0x00000002 /* Accept Broadcast Frames Enable */ +#define RFC_MCAST_EN 0x00000004 /* Accept Multicast Frames Enable */ +#define RFC_UCAST_HASH_EN 0x00000008 /* Accept Unicast Hash Filter Frames */ +#define RFC_MCAST_HASH_EN 0x00000010 /* Accept Multicast Hash Filter Fram.*/ +#define RFC_PERFECT_EN 0x00000020 /* Accept Perfect Match Enable */ +#define RFC_MAGP_WOL_EN 0x00001000 /* Magic Packet Filter WoL Enable */ +#define RFC_PFILT_WOL_EN 0x00002000 /* Perfect Filter WoL Enable */ + +/* Receive Filter WoL Status/Clear Registers */ +#define WOL_UCAST 0x00000001 /* Unicast Frame caused WoL */ +#define WOL_BCAST 0x00000002 /* Broadcast Frame caused WoL */ +#define WOL_MCAST 0x00000004 /* Multicast Frame caused WoL */ +#define WOL_UCAST_HASH 0x00000008 /* Unicast Hash Filter Frame WoL */ +#define WOL_MCAST_HASH 0x00000010 /* Multicast Hash Filter Frame WoL */ +#define WOL_PERFECT 0x00000020 /* Perfect Filter WoL */ +#define WOL_RX_FILTER 0x00000080 /* RX Filter caused WoL */ +#define WOL_MAG_PACKET 0x00000100 /* Magic Packet Filter caused WoL */ + +/* Interrupt Status/Enable/Clear/Set Registers */ +#define INT_RX_OVERRUN 0x00000001 /* Overrun Error in RX Queue */ +#define INT_RX_ERR 0x00000002 /* Receive Error */ +#define INT_RX_FIN 0x00000004 /* RX Finished Process Descriptors */ +#define INT_RX_DONE 0x00000008 /* Receive Done */ +#define INT_TX_UNDERRUN 0x00000010 /* Transmit Underrun */ +#define INT_TX_ERR 0x00000020 /* Transmit Error */ +#define INT_TX_FIN 0x00000040 /* TX Finished Process Descriptors */ +#define INT_TX_DONE 0x00000080 /* Transmit Done */ +#define INT_SOFT_INT 0x00001000 /* Software Triggered Interrupt */ +#define INT_WAKEUP 0x00002000 /* Wakeup Event Interrupt */ + +/* Power Down Register */ +#define PD_POWER_DOWN 0x80000000 /* Power Down MAC */ + +/* RX Descriptor Control Word */ +#define RCTRL_SIZE 0x000007FF /* Buffer size mask */ +#define RCTRL_INT 0x80000000 /* Generate RxDone Interrupt */ + +/* RX Status Hash CRC Word */ +#define RHASH_SA 0x000001FF /* Hash CRC for Source Address */ +#define RHASH_DA 0x001FF000 /* Hash CRC for Destination Address */ + +/* RX Status Information Word */ +#define RINFO_SIZE 0x000007FF /* Data size in bytes */ +#define RINFO_CTRL_FRAME 0x00040000 /* Control Frame */ +#define RINFO_VLAN 0x00080000 /* VLAN Frame */ +#define RINFO_FAIL_FILT 0x00100000 /* RX Filter Failed */ +#define RINFO_MCAST 0x00200000 /* Multicast Frame */ +#define RINFO_BCAST 0x00400000 /* Broadcast Frame */ +#define RINFO_CRC_ERR 0x00800000 /* CRC Error in Frame */ +#define RINFO_SYM_ERR 0x01000000 /* Symbol Error from PHY */ +#define RINFO_LEN_ERR 0x02000000 /* Length Error */ +#define RINFO_RANGE_ERR 0x04000000 /* Range Error (exceeded max. size) */ +#define RINFO_ALIGN_ERR 0x08000000 /* Alignment Error */ +#define RINFO_OVERRUN 0x10000000 /* Receive overrun */ +#define RINFO_NO_DESCR 0x20000000 /* No new Descriptor available */ +#define RINFO_LAST_FLAG 0x40000000 /* Last Fragment in Frame */ +#define RINFO_ERR 0x80000000 /* Error Occured (OR of all errors) */ + +#define RINFO_ERR_MASK (RINFO_FAIL_FILT | RINFO_CRC_ERR | RINFO_SYM_ERR | \ + RINFO_LEN_ERR | RINFO_ALIGN_ERR | RINFO_OVERRUN) + +/* TX Descriptor Control Word */ +#define TCTRL_SIZE 0x000007FF /* Size of data buffer in bytes */ +#define TCTRL_OVERRIDE 0x04000000 /* Override Default MAC Registers */ +#define TCTRL_HUGE 0x08000000 /* Enable Huge Frame */ +#define TCTRL_PAD 0x10000000 /* Pad short Frames to 64 bytes */ +#define TCTRL_CRC 0x20000000 /* Append a hardware CRC to Frame */ +#define TCTRL_LAST 0x40000000 /* Last Descriptor for TX Frame */ +#define TCTRL_INT 0x80000000 /* Generate TxDone Interrupt */ + +/* TX Status Information Word */ +#define TINFO_COL_CNT 0x01E00000 /* Collision Count */ +#define TINFO_DEFER 0x02000000 /* Packet Deferred (not an error) */ +#define TINFO_EXCESS_DEF 0x04000000 /* Excessive Deferral */ +#define TINFO_EXCESS_COL 0x08000000 /* Excessive Collision */ +#define TINFO_LATE_COL 0x10000000 /* Late Collision Occured */ +#define TINFO_UNDERRUN 0x20000000 /* Transmit Underrun */ +#define TINFO_NO_DESCR 0x40000000 /* No new Descriptor available */ +#define TINFO_ERR 0x80000000 /* Error Occured (OR of all errors) */ + +/* DP83848C PHY Registers */ +#define PHY_REG_BMCR 0x00 /* Basic Mode Control Register */ +#define PHY_REG_BMSR 0x01 /* Basic Mode Status Register */ +#define PHY_REG_IDR1 0x02 /* PHY Identifier 1 */ +#define PHY_REG_IDR2 0x03 /* PHY Identifier 2 */ +#define PHY_REG_ANAR 0x04 /* Auto-Negotiation Advertisement */ +#define PHY_REG_ANLPAR 0x05 /* Auto-Neg. Link Partner Abitily */ +#define PHY_REG_ANER 0x06 /* Auto-Neg. Expansion Register */ +#define PHY_REG_ANNPTR 0x07 /* Auto-Neg. Next Page TX */ + +/* PHY Extended Registers */ +#define PHY_REG_STS 0x10 /* Status Register */ +#define PHY_REG_MICR 0x11 /* MII Interrupt Control Register */ +#define PHY_REG_MISR 0x12 /* MII Interrupt Status Register */ +#define PHY_REG_FCSCR 0x14 /* False Carrier Sense Counter */ +#define PHY_REG_RECR 0x15 /* Receive Error Counter */ +#define PHY_REG_PCSR 0x16 /* PCS Sublayer Config. and Status */ +#define PHY_REG_RBR 0x17 /* RMII and Bypass Register */ +#define PHY_REG_LEDCR 0x18 /* LED Direct Control Register */ +#define PHY_REG_PHYCR 0x19 /* PHY Control Register */ +#define PHY_REG_10BTSCR 0x1A /* 10Base-T Status/Control Register */ +#define PHY_REG_CDCTRL1 0x1B /* CD Test Control and BIST Extens. */ +#define PHY_REG_EDCR 0x1D /* Energy Detect Control Register */ + +#define PHY_FULLD_100M 0x2100 /* Full Duplex 100Mbit */ +#define PHY_HALFD_100M 0x2000 /* Half Duplex 100Mbit */ +#define PHY_FULLD_10M 0x0100 /* Full Duplex 10Mbit */ +#define PHY_HALFD_10M 0x0000 /* Half Duplex 10MBit */ +#define PHY_AUTO_NEG 0x3000 /* Select Auto Negotiation */ + +#define DP83848C_DEF_ADR 0x0100 /* Default PHY device address */ +#define DP83848C_ID 0x20005C90 /* PHY Identifier */ + +// prototypes +portBASE_TYPE vInitEMAC(void); +unsigned short ReadFrameBE_EMAC(void); +void vIncrementTxLength(unsigned long ulLength); +void CopyFromFrame_EMAC(void *Dest, unsigned short Size); +void DummyReadFrame_EMAC(unsigned short Size); +unsigned short StartReadFrame(void); +void EndReadFrame(void); +unsigned int CheckFrameReceived(void); +void vInitialiseSend(void); +unsigned int Rdy4Tx(void); +void vSendBufferToMAC(void); +void vEMACWaitForInput( void ); +unsigned int uiGetEMACRxData( unsigned char *ucBuffer ); + + +#endif + +/*---------------------------------------------------------------------------- + * end of file + *---------------------------------------------------------------------------*/ + diff --git a/Demo/CORTEX_LM3S6965_KEIL/webserver/http-strings b/Demo/CORTEX_LM3S6965_KEIL/webserver/http-strings new file mode 100644 index 000000000..0d3c30cdd --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/webserver/http-strings @@ -0,0 +1,35 @@ +http_http "http://" +http_200 "200 " +http_301 "301 " +http_302 "302 " +http_get "GET " +http_10 "HTTP/1.0" +http_11 "HTTP/1.1" +http_content_type "content-type: " +http_texthtml "text/html" +http_location "location: " +http_host "host: " +http_crnl "\r\n" +http_index_html "/index.html" +http_404_html "/404.html" +http_referer "Referer:" +http_header_200 "HTTP/1.0 200 OK\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n" +http_header_404 "HTTP/1.0 404 Not found\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n" +http_content_type_plain "Content-type: text/plain\r\n\r\n" +http_content_type_html "Content-type: text/html\r\n\r\n" +http_content_type_css "Content-type: text/css\r\n\r\n" +http_content_type_text "Content-type: text/text\r\n\r\n" +http_content_type_png "Content-type: image/png\r\n\r\n" +http_content_type_gif "Content-type: image/gif\r\n\r\n" +http_content_type_jpg "Content-type: image/jpeg\r\n\r\n" +http_content_type_binary "Content-type: application/octet-stream\r\n\r\n" +http_html ".html" +http_shtml ".shtml" +http_htm ".htm" +http_css ".css" +http_png ".png" +http_gif ".gif" +http_jpg ".jpg" +http_text ".txt" +http_txt ".txt" + diff --git a/Demo/CORTEX_LM3S6965_KEIL/webserver/http-strings.c b/Demo/CORTEX_LM3S6965_KEIL/webserver/http-strings.c new file mode 100644 index 000000000..ef7a41c7d --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/webserver/http-strings.c @@ -0,0 +1,102 @@ +const char http_http[8] = +/* "http://" */ +{0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, }; +const char http_200[5] = +/* "200 " */ +{0x32, 0x30, 0x30, 0x20, }; +const char http_301[5] = +/* "301 " */ +{0x33, 0x30, 0x31, 0x20, }; +const char http_302[5] = +/* "302 " */ +{0x33, 0x30, 0x32, 0x20, }; +const char http_get[5] = +/* "GET " */ +{0x47, 0x45, 0x54, 0x20, }; +const char http_10[9] = +/* "HTTP/1.0" */ +{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, }; +const char http_11[9] = +/* "HTTP/1.1" */ +{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x31, }; +const char http_content_type[15] = +/* "content-type: " */ +{0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, }; +const char http_texthtml[10] = +/* "text/html" */ +{0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_location[11] = +/* "location: " */ +{0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, }; +const char http_host[7] = +/* "host: " */ +{0x68, 0x6f, 0x73, 0x74, 0x3a, 0x20, }; +const char http_crnl[3] = +/* "\r\n" */ +{0xd, 0xa, }; +const char http_index_html[12] = +/* "/index.html" */ +{0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_404_html[10] = +/* "/404.html" */ +{0x2f, 0x34, 0x30, 0x34, 0x2e, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_referer[9] = +/* "Referer:" */ +{0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x72, 0x3a, }; +const char http_header_200[84] = +/* "HTTP/1.0 200 OK\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n" */ +{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x32, 0x30, 0x30, 0x20, 0x4f, 0x4b, 0xd, 0xa, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x3a, 0x20, 0x75, 0x49, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x2f, 0x7e, 0x61, 0x64, 0x61, 0x6d, 0x2f, 0x75, 0x69, 0x70, 0x2f, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0xd, 0xa, }; +const char http_header_404[91] = +/* "HTTP/1.0 404 Not found\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n" */ +{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x34, 0x30, 0x34, 0x20, 0x4e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0xd, 0xa, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x3a, 0x20, 0x75, 0x49, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x2f, 0x7e, 0x61, 0x64, 0x61, 0x6d, 0x2f, 0x75, 0x69, 0x70, 0x2f, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0xd, 0xa, }; +const char http_content_type_plain[29] = +/* "Content-type: text/plain\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_html[28] = +/* "Content-type: text/html\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_css [27] = +/* "Content-type: text/css\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_text[28] = +/* "Content-type: text/text\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x74, 0x65, 0x78, 0x74, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_png [28] = +/* "Content-type: image/png\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x70, 0x6e, 0x67, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_gif [28] = +/* "Content-type: image/gif\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x67, 0x69, 0x66, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_jpg [29] = +/* "Content-type: image/jpeg\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x6a, 0x70, 0x65, 0x67, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_binary[43] = +/* "Content-type: application/octet-stream\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0xd, 0xa, 0xd, 0xa, }; +const char http_html[6] = +/* ".html" */ +{0x2e, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_shtml[7] = +/* ".shtml" */ +{0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_htm[5] = +/* ".htm" */ +{0x2e, 0x68, 0x74, 0x6d, }; +const char http_css[5] = +/* ".css" */ +{0x2e, 0x63, 0x73, 0x73, }; +const char http_png[5] = +/* ".png" */ +{0x2e, 0x70, 0x6e, 0x67, }; +const char http_gif[5] = +/* ".gif" */ +{0x2e, 0x67, 0x69, 0x66, }; +const char http_jpg[5] = +/* ".jpg" */ +{0x2e, 0x6a, 0x70, 0x67, }; +const char http_text[5] = +/* ".txt" */ +{0x2e, 0x74, 0x78, 0x74, }; +const char http_txt[5] = +/* ".txt" */ +{0x2e, 0x74, 0x78, 0x74, }; diff --git a/Demo/CORTEX_LM3S6965_KEIL/webserver/http-strings.h b/Demo/CORTEX_LM3S6965_KEIL/webserver/http-strings.h new file mode 100644 index 000000000..acbe7e17f --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/webserver/http-strings.h @@ -0,0 +1,34 @@ +extern const char http_http[8]; +extern const char http_200[5]; +extern const char http_301[5]; +extern const char http_302[5]; +extern const char http_get[5]; +extern const char http_10[9]; +extern const char http_11[9]; +extern const char http_content_type[15]; +extern const char http_texthtml[10]; +extern const char http_location[11]; +extern const char http_host[7]; +extern const char http_crnl[3]; +extern const char http_index_html[12]; +extern const char http_404_html[10]; +extern const char http_referer[9]; +extern const char http_header_200[84]; +extern const char http_header_404[91]; +extern const char http_content_type_plain[29]; +extern const char http_content_type_html[28]; +extern const char http_content_type_css [27]; +extern const char http_content_type_text[28]; +extern const char http_content_type_png [28]; +extern const char http_content_type_gif [28]; +extern const char http_content_type_jpg [29]; +extern const char http_content_type_binary[43]; +extern const char http_html[6]; +extern const char http_shtml[7]; +extern const char http_htm[5]; +extern const char http_css[5]; +extern const char http_png[5]; +extern const char http_gif[5]; +extern const char http_jpg[5]; +extern const char http_text[5]; +extern const char http_txt[5]; diff --git a/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-cgi.c b/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-cgi.c new file mode 100644 index 000000000..803b771e6 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-cgi.c @@ -0,0 +1,269 @@ +/** + * \addtogroup httpd + * @{ + */ + +/** + * \file + * Web server script interface + * \author + * Adam Dunkels + * + */ + +/* + * Copyright (c) 2001-2006, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: httpd-cgi.c,v 1.2 2006/06/11 21:46:37 adam Exp $ + * + */ + +#include "uip.h" +#include "psock.h" +#include "httpd.h" +#include "httpd-cgi.h" +#include "httpd-fs.h" + +#include +#include + +HTTPD_CGI_CALL(file, "file-stats", file_stats); +HTTPD_CGI_CALL(tcp, "tcp-connections", tcp_stats); +HTTPD_CGI_CALL(net, "net-stats", net_stats); +HTTPD_CGI_CALL(rtos, "rtos-stats", rtos_stats ); +HTTPD_CGI_CALL(io, "led-io", led_io ); + + +static const struct httpd_cgi_call *calls[] = { &file, &tcp, &net, &rtos, &io, NULL }; + +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(nullfunction(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +httpd_cgifunction +httpd_cgi(char *name) +{ + const struct httpd_cgi_call **f; + + /* Find the matching name in the table, return the function. */ + for(f = calls; *f != NULL; ++f) { + if(strncmp((*f)->name, name, strlen((*f)->name)) == 0) { + return (*f)->function; + } + } + return nullfunction; +} +/*---------------------------------------------------------------------------*/ +static unsigned short +generate_file_stats(void *arg) +{ + char *f = (char *)arg; + return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE, "%5u", httpd_fs_count(f)); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(file_stats(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + + PSOCK_GENERATOR_SEND(&s->sout, generate_file_stats, strchr(ptr, ' ') + 1); + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static const char closed[] = /* "CLOSED",*/ +{0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0}; +static const char syn_rcvd[] = /* "SYN-RCVD",*/ +{0x53, 0x59, 0x4e, 0x2d, 0x52, 0x43, 0x56, + 0x44, 0}; +static const char syn_sent[] = /* "SYN-SENT",*/ +{0x53, 0x59, 0x4e, 0x2d, 0x53, 0x45, 0x4e, + 0x54, 0}; +static const char established[] = /* "ESTABLISHED",*/ +{0x45, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x49, 0x53, 0x48, + 0x45, 0x44, 0}; +static const char fin_wait_1[] = /* "FIN-WAIT-1",*/ +{0x46, 0x49, 0x4e, 0x2d, 0x57, 0x41, 0x49, + 0x54, 0x2d, 0x31, 0}; +static const char fin_wait_2[] = /* "FIN-WAIT-2",*/ +{0x46, 0x49, 0x4e, 0x2d, 0x57, 0x41, 0x49, + 0x54, 0x2d, 0x32, 0}; +static const char closing[] = /* "CLOSING",*/ +{0x43, 0x4c, 0x4f, 0x53, 0x49, + 0x4e, 0x47, 0}; +static const char time_wait[] = /* "TIME-WAIT,"*/ +{0x54, 0x49, 0x4d, 0x45, 0x2d, 0x57, 0x41, + 0x49, 0x54, 0}; +static const char last_ack[] = /* "LAST-ACK"*/ +{0x4c, 0x41, 0x53, 0x54, 0x2d, 0x41, 0x43, + 0x4b, 0}; + +static const char *states[] = { + closed, + syn_rcvd, + syn_sent, + established, + fin_wait_1, + fin_wait_2, + closing, + time_wait, + last_ack}; + + +static unsigned short +generate_tcp_stats(void *arg) +{ + struct uip_conn *conn; + struct httpd_state *s = (struct httpd_state *)arg; + + conn = &uip_conns[s->count]; + return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE, + "

%d%u.%u.%u.%u:%u%s%u%u%c %c
+
+IP           Packets dropped
+             Packets received
+             Packets sent
+IP errors    IP version/header length
+             IP length, high byte
+             IP length, low byte
+             IP fragments
+             Header checksum
+             Wrong protocol
+ICMP	     Packets dropped
+             Packets received
+             Packets sent
+             Type errors
+TCP          Packets dropped
+             Packets received
+             Packets sent
+             Checksum errors
+             Data packets without ACKs
+             Resets
+             Retransmissions
+	     No connection avaliable
+	     Connection attempts to closed ports
+
%! net-stats
+
+ + + diff --git a/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fs/tcp.shtml b/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fs/tcp.shtml new file mode 100644 index 000000000..654d61f21 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fs/tcp.shtml @@ -0,0 +1,21 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +RTOS Stats | TCP Stats | Connections | FreeRTOS.org Homepage | IO +

+


+
+

Network connections

+

+ + +%! tcp-connections + + + + + diff --git a/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fsdata.c b/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fsdata.c new file mode 100644 index 000000000..a7fcfab5a --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fsdata.c @@ -0,0 +1,470 @@ +static const unsigned char data_404_html[] = { + /* /404.html */ + 0x2f, 0x34, 0x30, 0x34, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0, + 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xd, 0xa, 0x20, 0x20, + 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x62, 0x67, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3d, 0x22, 0x77, 0x68, 0x69, 0x74, 0x65, + 0x22, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x63, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3e, 0xd, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 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, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x68, 0x33, 0x3e, 0x47, 0x6f, 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, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, + 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3e, 0xd, 0xa, 0x20, + 0x20, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xd, 0xa, + 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0}; + +static const unsigned char data_index_html[] = { + /* /index.html */ + 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0, + 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, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, + 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, + 0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, + 0x57, 0x45, 0x42, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x20, 0x64, 0x65, 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x42, + 0x4f, 0x44, 0x59, 0x20, 0x6f, 0x6e, 0x4c, 0x6f, 0x61, 0x64, + 0x3d, 0x22, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x73, + 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, + 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x27, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x73, 0x68, 0x74, + 0x6d, 0x6c, 0x27, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x2c, + 0x31, 0x30, 0x30, 0x29, 0x22, 0x62, 0x67, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3d, 0x22, 0x23, 0x43, 0x43, 0x43, 0x43, 0x66, + 0x66, 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x66, 0x6f, 0x6e, 0x74, + 0x20, 0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 0x61, 0x72, 0x69, + 0x61, 0x6c, 0x22, 0x3e, 0xd, 0xa, 0x4c, 0x6f, 0x61, 0x64, + 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, + 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x2e, 0x20, 0x20, 0x43, 0x6c, + 0x69, 0x63, 0x6b, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, + 0x66, 0x3d, 0x22, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x73, + 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x68, 0x65, 0x72, 0x65, + 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, + 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x72, 0x65, 0x64, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x65, 0x64, 0x2e, 0xd, 0xa, 0x3c, + 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xd, 0xa, 0x3c, 0x2f, + 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x62, + 0x6f, 0x64, 0x79, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x68, 0x74, + 0x6d, 0x6c, 0x3e, 0xd, 0xa, 0xd, 0xa, 0}; + +static const unsigned char data_index_shtml[] = { + /* /index.shtml */ + 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0, + 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, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, + 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, + 0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, + 0x57, 0x45, 0x42, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x20, 0x64, 0x65, 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x42, + 0x4f, 0x44, 0x59, 0x20, 0x6f, 0x6e, 0x4c, 0x6f, 0x61, 0x64, + 0x3d, 0x22, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x73, + 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, + 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x27, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x73, 0x68, 0x74, + 0x6d, 0x6c, 0x27, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x2c, + 0x32, 0x30, 0x30, 0x30, 0x29, 0x22, 0x62, 0x67, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3d, 0x22, 0x23, 0x43, 0x43, 0x43, 0x43, + 0x66, 0x66, 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x66, 0x6f, 0x6e, + 0x74, 0x20, 0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 0x61, 0x72, + 0x69, 0x61, 0x6c, 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x61, 0x20, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x52, + 0x54, 0x4f, 0x53, 0x20, 0x53, 0x74, 0x61, 0x74, 0x73, 0x3c, + 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, + 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, + 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x54, 0x43, 0x50, 0x20, 0x53, + 0x74, 0x61, 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, + 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x74, 0x63, 0x70, + 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, + 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, + 0x62, 0x3e, 0x20, 0x3c, 0x61, 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, 0x2e, 0x6f, 0x72, 0x67, + 0x20, 0x48, 0x6f, 0x6d, 0x65, 0x70, 0x61, 0x67, 0x65, 0x3c, + 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, + 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x69, 0x6f, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, + 0x22, 0x3e, 0x49, 0x4f, 0x3c, 0x2f, 0x61, 0x3e, 0xd, 0xa, + 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0x3c, + 0x68, 0x72, 0x3e, 0xd, 0xa, 0x3c, 0x62, 0x72, 0x3e, 0x3c, + 0x70, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x32, 0x3e, 0x54, 0x61, + 0x73, 0x6b, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, + 0x69, 0x63, 0x73, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0xd, 0xa, + 0x50, 0x61, 0x67, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, + 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x20, 0x65, 0x76, + 0x65, 0x72, 0x79, 0x20, 0x32, 0x20, 0x73, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x73, 0x2e, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0x3c, + 0x66, 0x6f, 0x6e, 0x74, 0x20, 0x66, 0x61, 0x63, 0x65, 0x3d, + 0x22, 0x63, 0x6f, 0x75, 0x72, 0x69, 0x65, 0x72, 0x22, 0x3e, + 0x3c, 0x70, 0x72, 0x65, 0x3e, 0x54, 0x61, 0x73, 0x6b, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x20, 0x20, 0x50, 0x72, 0x69, 0x6f, + 0x72, 0x69, 0x74, 0x79, 0x20, 0x20, 0x53, 0x74, 0x61, 0x63, + 0x6b, 0x9, 0x23, 0x3c, 0x62, 0x72, 0x3e, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x3c, 0x62, 0x72, 0x3e, 0xd, + 0xa, 0x25, 0x21, 0x20, 0x72, 0x74, 0x6f, 0x73, 0x2d, 0x73, + 0x74, 0x61, 0x74, 0x73, 0xd, 0xa, 0x3c, 0x2f, 0x70, 0x72, + 0x65, 0x3e, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xd, + 0xa, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xd, 0xa, + 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xd, 0xa, 0x3c, + 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xd, 0xa, 0xd, 0xa, +0}; + +static const unsigned char data_io_shtml[] = { + /* /io.shtml */ + 0x2f, 0x69, 0x6f, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0, + 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, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, + 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, + 0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, + 0x57, 0x45, 0x42, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x20, 0x64, 0x65, 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x42, + 0x4f, 0x44, 0x59, 0x20, 0x62, 0x67, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3d, 0x22, 0x23, 0x43, 0x43, 0x43, 0x43, 0x66, 0x66, + 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x20, + 0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 0x61, 0x72, 0x69, 0x61, + 0x6c, 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x61, 0x20, 0x68, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, + 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x52, 0x54, 0x4f, + 0x53, 0x20, 0x53, 0x74, 0x61, 0x74, 0x73, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, + 0x6c, 0x22, 0x3e, 0x54, 0x43, 0x50, 0x20, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, + 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x74, 0x63, 0x70, 0x2e, 0x73, + 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 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, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x48, + 0x6f, 0x6d, 0x65, 0x70, 0x61, 0x67, 0x65, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x69, 0x6f, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, + 0x49, 0x4f, 0x3c, 0x2f, 0x61, 0x3e, 0xd, 0xa, 0x3c, 0x62, + 0x72, 0x3e, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x72, + 0x3e, 0xd, 0xa, 0x3c, 0x62, 0x3e, 0x4c, 0x45, 0x44, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x4c, 0x43, 0x44, 0x20, 0x49, 0x4f, + 0x3c, 0x2f, 0x62, 0x3e, 0x3c, 0x62, 0x72, 0x3e, 0xd, 0xa, + 0xd, 0xa, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0xd, 0xa, 0x55, + 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x20, 0x62, 0x6f, 0x78, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x6e, 0x20, 0x6f, 0x72, + 0x20, 0x6f, 0x66, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, + 0x45, 0x44, 0x2c, 0x20, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, + 0x74, 0x65, 0x78, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x20, 0x6f, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x4f, 0x4c, 0x45, 0x44, 0x20, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x20, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x20, 0x22, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x49, 0x4f, 0x22, 0x2e, + 0xd, 0xa, 0xd, 0xa, 0xd, 0xa, 0x3c, 0x70, 0x3e, 0xd, + 0xa, 0x3c, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x61, 0x46, 0x6f, 0x72, 0x6d, 0x22, 0x20, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x2f, 0x69, + 0x6f, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x20, 0x6d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3d, 0x22, 0x67, 0x65, 0x74, + 0x22, 0x3e, 0xd, 0xa, 0x25, 0x21, 0x20, 0x6c, 0x65, 0x64, + 0x2d, 0x69, 0x6f, 0xd, 0xa, 0x3c, 0x70, 0x3e, 0xd, 0xa, + 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, + 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, 0x49, 0x4f, 0x22, 0x3e, 0xd, + 0xa, 0x3c, 0x2f, 0x66, 0x6f, 0x72, 0x6d, 0x3e, 0xd, 0xa, + 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0x3c, + 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xd, 0xa, 0x3c, 0x2f, + 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x68, + 0x74, 0x6d, 0x6c, 0x3e, 0xd, 0xa, 0xd, 0xa, 0}; + +static const unsigned char data_stats_shtml[] = { + /* /stats.shtml */ + 0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0, + 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, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, + 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, + 0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, + 0x57, 0x45, 0x42, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x20, 0x64, 0x65, 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x42, + 0x4f, 0x44, 0x59, 0x20, 0x62, 0x67, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3d, 0x22, 0x23, 0x43, 0x43, 0x43, 0x43, 0x66, 0x66, + 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x20, + 0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 0x61, 0x72, 0x69, 0x61, + 0x6c, 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x61, 0x20, 0x68, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, + 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x52, 0x54, 0x4f, + 0x53, 0x20, 0x53, 0x74, 0x61, 0x74, 0x73, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, + 0x6c, 0x22, 0x3e, 0x54, 0x43, 0x50, 0x20, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, + 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x74, 0x63, 0x70, 0x2e, 0x73, + 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 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, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x48, + 0x6f, 0x6d, 0x65, 0x70, 0x61, 0x67, 0x65, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x69, 0x6f, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, + 0x49, 0x4f, 0x3c, 0x2f, 0x61, 0x3e, 0xd, 0xa, 0x3c, 0x62, + 0x72, 0x3e, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x72, + 0x3e, 0xd, 0xa, 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x70, 0x3e, + 0xd, 0xa, 0x3c, 0x68, 0x32, 0x3e, 0x4e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, + 0x74, 0x69, 0x63, 0x73, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0xd, + 0xa, 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3d, 0x22, 0x33, 0x30, 0x30, 0x22, 0x20, + 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3d, 0x22, 0x30, 0x22, + 0x3e, 0xd, 0xa, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x64, + 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x6c, 0x65, + 0x66, 0x74, 0x22, 0x3e, 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x20, + 0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 0x63, 0x6f, 0x75, 0x72, + 0x69, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x65, 0x3e, + 0xd, 0xa, 0x49, 0x50, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x73, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, + 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x73, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, + 0x64, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, + 0x65, 0x74, 0x73, 0x20, 0x73, 0x65, 0x6e, 0x74, 0xd, 0xa, + 0x49, 0x50, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x20, + 0x20, 0x20, 0x20, 0x49, 0x50, 0x20, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xd, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x49, 0x50, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x2c, 0x20, 0x68, 0x69, 0x67, 0x68, 0x20, 0x62, 0x79, + 0x74, 0x65, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x49, 0x50, 0x20, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x20, 0x6c, 0x6f, + 0x77, 0x20, 0x62, 0x79, 0x74, 0x65, 0xd, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x49, 0x50, 0x20, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x73, 0x75, 0x6d, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x57, 0x72, + 0x6f, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0xd, 0xa, 0x49, 0x43, 0x4d, 0x50, 0x9, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x73, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0xd, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x73, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, + 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x73, 0x20, 0x73, 0x65, 0x6e, 0x74, 0xd, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x54, 0x79, 0x70, 0x65, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x73, 0xd, 0xa, 0x54, 0x43, 0x50, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, + 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x64, 0x72, 0x6f, 0x70, + 0x70, 0x65, 0x64, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, + 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x72, 0x65, 0x63, 0x65, + 0x69, 0x76, 0x65, 0x64, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, + 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x73, 0x65, 0x6e, + 0x74, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x73, 0x75, 0x6d, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x73, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x44, 0x61, 0x74, 0x61, + 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x41, 0x43, 0x4b, + 0x73, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x52, 0x65, 0x73, 0x65, + 0x74, 0x73, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x52, 0x65, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0xd, 0xa, 0x9, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x4e, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x76, 0x61, 0x6c, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0xd, 0xa, 0x9, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, + 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, + 0x20, 0x70, 0x6f, 0x72, 0x74, 0x73, 0xd, 0xa, 0x3c, 0x2f, + 0x70, 0x72, 0x65, 0x3e, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, + 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, + 0x3c, 0x70, 0x72, 0x65, 0x3e, 0x25, 0x21, 0x20, 0x6e, 0x65, + 0x74, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x73, 0xd, 0xa, 0x3c, + 0x2f, 0x70, 0x72, 0x65, 0x3e, 0x3c, 0x2f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, + 0x74, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, + 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, + 0xd, 0xa, 0}; + +static const unsigned char data_tcp_shtml[] = { + /* /tcp.shtml */ + 0x2f, 0x74, 0x63, 0x70, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0, + 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, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, + 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, + 0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, + 0x57, 0x45, 0x42, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x20, 0x64, 0x65, 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x42, + 0x4f, 0x44, 0x59, 0x20, 0x62, 0x67, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3d, 0x22, 0x23, 0x43, 0x43, 0x43, 0x43, 0x66, 0x66, + 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x20, + 0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 0x61, 0x72, 0x69, 0x61, + 0x6c, 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x61, 0x20, 0x68, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, + 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x52, 0x54, 0x4f, + 0x53, 0x20, 0x53, 0x74, 0x61, 0x74, 0x73, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, + 0x6c, 0x22, 0x3e, 0x54, 0x43, 0x50, 0x20, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, + 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x74, 0x63, 0x70, 0x2e, 0x73, + 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 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, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x48, + 0x6f, 0x6d, 0x65, 0x70, 0x61, 0x67, 0x65, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x69, 0x6f, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, + 0x49, 0x4f, 0x3c, 0x2f, 0x61, 0x3e, 0xd, 0xa, 0x3c, 0x62, + 0x72, 0x3e, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x72, + 0x3e, 0xd, 0xa, 0x3c, 0x62, 0x72, 0x3e, 0xd, 0xa, 0x3c, + 0x68, 0x32, 0x3e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0xd, 0xa, 0x3c, + 0x70, 0x3e, 0xd, 0xa, 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x3e, 0xd, 0xa, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x68, + 0x3e, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x2f, 0x74, 0x68, + 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x52, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x3c, 0x2f, 0x74, 0x68, 0x3e, + 0x3c, 0x74, 0x68, 0x3e, 0x52, 0x65, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3c, + 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x54, 0x69, + 0x6d, 0x65, 0x72, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, + 0x68, 0x3e, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x3c, 0x2f, 0x74, + 0x68, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0xd, 0xa, 0x25, + 0x21, 0x20, 0x74, 0x63, 0x70, 0x2d, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0xd, 0xa, 0x3c, + 0x2f, 0x70, 0x72, 0x65, 0x3e, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, + 0x74, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, + 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, + 0xd, 0xa, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xd, + 0xa, 0xd, 0xa, 0}; + +const struct httpd_fsdata_file file_404_html[] = {{NULL, data_404_html, data_404_html + 10, sizeof(data_404_html) - 10}}; + +const struct httpd_fsdata_file file_index_html[] = {{file_404_html, data_index_html, data_index_html + 12, sizeof(data_index_html) - 12}}; + +const struct httpd_fsdata_file file_index_shtml[] = {{file_index_html, data_index_shtml, data_index_shtml + 13, sizeof(data_index_shtml) - 13}}; + +const struct httpd_fsdata_file file_io_shtml[] = {{file_index_shtml, data_io_shtml, data_io_shtml + 10, sizeof(data_io_shtml) - 10}}; + +const struct httpd_fsdata_file file_stats_shtml[] = {{file_io_shtml, data_stats_shtml, data_stats_shtml + 13, sizeof(data_stats_shtml) - 13}}; + +const struct httpd_fsdata_file file_tcp_shtml[] = {{file_stats_shtml, data_tcp_shtml, data_tcp_shtml + 11, sizeof(data_tcp_shtml) - 11}}; + +#define HTTPD_FS_ROOT file_tcp_shtml + +#define HTTPD_FS_NUMFILES 6 diff --git a/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fsdata.h b/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fsdata.h new file mode 100644 index 000000000..52d35c265 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd-fsdata.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2001, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: httpd-fsdata.h,v 1.1 2006/06/07 09:13:08 adam Exp $ + */ +#ifndef __HTTPD_FSDATA_H__ +#define __HTTPD_FSDATA_H__ + +#include "uip.h" + +struct httpd_fsdata_file { + const struct httpd_fsdata_file *next; + const char *name; + const char *data; + const int len; +#ifdef HTTPD_FS_STATISTICS +#if HTTPD_FS_STATISTICS == 1 + u16_t count; +#endif /* HTTPD_FS_STATISTICS */ +#endif /* HTTPD_FS_STATISTICS */ +}; + +struct httpd_fsdata_file_noconst { + struct httpd_fsdata_file *next; + char *name; + char *data; + int len; +#ifdef HTTPD_FS_STATISTICS +#if HTTPD_FS_STATISTICS == 1 + u16_t count; +#endif /* HTTPD_FS_STATISTICS */ +#endif /* HTTPD_FS_STATISTICS */ +}; + +#endif /* __HTTPD_FSDATA_H__ */ diff --git a/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd.c b/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd.c new file mode 100644 index 000000000..644cf16b7 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd.c @@ -0,0 +1,346 @@ +/** + * \addtogroup apps + * @{ + */ + +/** + * \defgroup httpd Web server + * @{ + * The uIP web server is a very simplistic implementation of an HTTP + * server. It can serve web pages and files from a read-only ROM + * filesystem, and provides a very small scripting language. + + */ + +/** + * \file + * Web server + * \author + * Adam Dunkels + */ + + +/* + * Copyright (c) 2004, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: httpd.c,v 1.2 2006/06/11 21:46:38 adam Exp $ + */ + +#include "uip.h" +#include "httpd.h" +#include "httpd-fs.h" +#include "httpd-cgi.h" +#include "http-strings.h" + +#include + +#define STATE_WAITING 0 +#define STATE_OUTPUT 1 + +#define ISO_nl 0x0a +#define ISO_space 0x20 +#define ISO_bang 0x21 +#define ISO_percent 0x25 +#define ISO_period 0x2e +#define ISO_slash 0x2f +#define ISO_colon 0x3a + + +/*---------------------------------------------------------------------------*/ +static unsigned short +generate_part_of_file(void *state) +{ + struct httpd_state *s = (struct httpd_state *)state; + + if(s->file.len > uip_mss()) { + s->len = uip_mss(); + } else { + s->len = s->file.len; + } + memcpy(uip_appdata, s->file.data, s->len); + + return s->len; +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(send_file(struct httpd_state *s)) +{ + PSOCK_BEGIN(&s->sout); + + do { + PSOCK_GENERATOR_SEND(&s->sout, generate_part_of_file, s); + s->file.len -= s->len; + s->file.data += s->len; + } while(s->file.len > 0); + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(send_part_of_file(struct httpd_state *s)) +{ + PSOCK_BEGIN(&s->sout); + + PSOCK_SEND(&s->sout, s->file.data, s->len); + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static void +next_scriptstate(struct httpd_state *s) +{ + char *p; + p = strchr(s->scriptptr, ISO_nl) + 1; + s->scriptlen -= (unsigned short)(p - s->scriptptr); + s->scriptptr = p; +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(handle_script(struct httpd_state *s)) +{ + char *ptr; + + PT_BEGIN(&s->scriptpt); + + + while(s->file.len > 0) { + + /* Check if we should start executing a script. */ + if(*s->file.data == ISO_percent && + *(s->file.data + 1) == ISO_bang) { + s->scriptptr = s->file.data + 3; + s->scriptlen = s->file.len - 3; + if(*(s->scriptptr - 1) == ISO_colon) { + httpd_fs_open(s->scriptptr + 1, &s->file); + PT_WAIT_THREAD(&s->scriptpt, send_file(s)); + } else { + PT_WAIT_THREAD(&s->scriptpt, + httpd_cgi(s->scriptptr)(s, s->scriptptr)); + } + next_scriptstate(s); + + /* The script is over, so we reset the pointers and continue + sending the rest of the file. */ + s->file.data = s->scriptptr; + s->file.len = s->scriptlen; + } else { + /* See if we find the start of script marker in the block of HTML + to be sent. */ + + if(s->file.len > uip_mss()) { + s->len = uip_mss(); + } else { + s->len = s->file.len; + } + + if(*s->file.data == ISO_percent) { + ptr = strchr(s->file.data + 1, ISO_percent); + } else { + ptr = strchr(s->file.data, ISO_percent); + } + if(ptr != NULL && + ptr != s->file.data) { + s->len = (int)(ptr - s->file.data); + if(s->len >= uip_mss()) { + s->len = uip_mss(); + } + } + PT_WAIT_THREAD(&s->scriptpt, send_part_of_file(s)); + s->file.data += s->len; + s->file.len -= s->len; + + } + } + + PT_END(&s->scriptpt); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(send_headers(struct httpd_state *s, const char *statushdr)) +{ + char *ptr; + + PSOCK_BEGIN(&s->sout); + + PSOCK_SEND_STR(&s->sout, statushdr); + + ptr = strrchr(s->filename, ISO_period); + if(ptr == NULL) { + PSOCK_SEND_STR(&s->sout, http_content_type_binary); + } else if(strncmp(http_html, ptr, 5) == 0 || + strncmp(http_shtml, ptr, 6) == 0) { + PSOCK_SEND_STR(&s->sout, http_content_type_html); + } else if(strncmp(http_css, ptr, 4) == 0) { + PSOCK_SEND_STR(&s->sout, http_content_type_css); + } else if(strncmp(http_png, ptr, 4) == 0) { + PSOCK_SEND_STR(&s->sout, http_content_type_png); + } else if(strncmp(http_gif, ptr, 4) == 0) { + PSOCK_SEND_STR(&s->sout, http_content_type_gif); + } else if(strncmp(http_jpg, ptr, 4) == 0) { + PSOCK_SEND_STR(&s->sout, http_content_type_jpg); + } else { + PSOCK_SEND_STR(&s->sout, http_content_type_plain); + } + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(handle_output(struct httpd_state *s)) +{ + char *ptr; + + PT_BEGIN(&s->outputpt); + + if(!httpd_fs_open(s->filename, &s->file)) { + httpd_fs_open(http_404_html, &s->file); + strcpy(s->filename, http_404_html); + PT_WAIT_THREAD(&s->outputpt, + send_headers(s, + http_header_404)); + PT_WAIT_THREAD(&s->outputpt, + send_file(s)); + } else { + PT_WAIT_THREAD(&s->outputpt, + send_headers(s, + http_header_200)); + ptr = strchr(s->filename, ISO_period); + if(ptr != NULL && strncmp(ptr, http_shtml, 6) == 0) { + PT_INIT(&s->scriptpt); + PT_WAIT_THREAD(&s->outputpt, handle_script(s)); + } else { + PT_WAIT_THREAD(&s->outputpt, + send_file(s)); + } + } + PSOCK_CLOSE(&s->sout); + PT_END(&s->outputpt); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(handle_input(struct httpd_state *s)) +{ + PSOCK_BEGIN(&s->sin); + + PSOCK_READTO(&s->sin, ISO_space); + + + if(strncmp(s->inputbuf, http_get, 4) != 0) { + PSOCK_CLOSE_EXIT(&s->sin); + } + PSOCK_READTO(&s->sin, ISO_space); + + if(s->inputbuf[0] != ISO_slash) { + PSOCK_CLOSE_EXIT(&s->sin); + } + + if(s->inputbuf[1] == ISO_space) { + strncpy(s->filename, http_index_html, sizeof(s->filename)); + } else { + + s->inputbuf[PSOCK_DATALEN(&s->sin) - 1] = 0; + + /* Process any form input being sent to the server. */ + { + extern void vApplicationProcessFormInput( char *pcInputString, long xInputLength ); + vApplicationProcessFormInput( s->inputbuf, PSOCK_DATALEN(&s->sin) ); + } + + strncpy(s->filename, &s->inputbuf[0], sizeof(s->filename)); + } + + /* httpd_log_file(uip_conn->ripaddr, s->filename);*/ + + s->state = STATE_OUTPUT; + + while(1) { + PSOCK_READTO(&s->sin, ISO_nl); + + if(strncmp(s->inputbuf, http_referer, 8) == 0) { + s->inputbuf[PSOCK_DATALEN(&s->sin) - 2] = 0; + /* httpd_log(&s->inputbuf[9]);*/ + } + } + + PSOCK_END(&s->sin); +} +/*---------------------------------------------------------------------------*/ +static void +handle_connection(struct httpd_state *s) +{ + handle_input(s); + if(s->state == STATE_OUTPUT) { + handle_output(s); + } +} +/*---------------------------------------------------------------------------*/ +void +httpd_appcall(void) +{ + struct httpd_state *s = (struct httpd_state *)&(uip_conn->appstate); + + if(uip_closed() || uip_aborted() || uip_timedout()) { + } else if(uip_connected()) { + PSOCK_INIT(&s->sin, s->inputbuf, sizeof(s->inputbuf) - 1); + PSOCK_INIT(&s->sout, s->inputbuf, sizeof(s->inputbuf) - 1); + PT_INIT(&s->outputpt); + s->state = STATE_WAITING; + /* timer_set(&s->timer, CLOCK_SECOND * 100);*/ + s->timer = 0; + handle_connection(s); + } else if(s != NULL) { + if(uip_poll()) { + ++s->timer; + if(s->timer >= 20) { + uip_abort(); + } + } else { + s->timer = 0; + } + handle_connection(s); + } else { + uip_abort(); + } +} +/*---------------------------------------------------------------------------*/ +/** + * \brief Initialize the web server + * + * This function initializes the web server and should be + * called at system boot-up. + */ +void +httpd_init(void) +{ + uip_listen(HTONS(80)); +} +/*---------------------------------------------------------------------------*/ +/** @} */ diff --git a/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd.h b/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd.h new file mode 100644 index 000000000..7f7a6666e --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/webserver/httpd.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2001-2005, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: httpd.h,v 1.2 2006/06/11 21:46:38 adam Exp $ + * + */ + +#ifndef __HTTPD_H__ +#define __HTTPD_H__ + +#include "psock.h" +#include "httpd-fs.h" + +struct httpd_state { + unsigned char timer; + struct psock sin, sout; + struct pt outputpt, scriptpt; + char inputbuf[50]; + char filename[20]; + char state; + struct httpd_fs_file file; + int len; + char *scriptptr; + int scriptlen; + + unsigned short count; +}; + +void httpd_init(void); +void httpd_appcall(void); + +void httpd_log(char *msg); +void httpd_log_file(u16_t *requester, char *file); + +#endif /* __HTTPD_H__ */ diff --git a/Demo/CORTEX_LM3S6965_KEIL/webserver/makefsdata b/Demo/CORTEX_LM3S6965_KEIL/webserver/makefsdata new file mode 100644 index 000000000..8d2715a8a --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/webserver/makefsdata @@ -0,0 +1,78 @@ +#!/usr/bin/perl + +open(OUTPUT, "> httpd-fsdata.c"); + +chdir("httpd-fs"); + +opendir(DIR, "."); +@files = grep { !/^\./ && !/(CVS|~)/ } readdir(DIR); +closedir(DIR); + +foreach $file (@files) { + + if(-d $file && $file !~ /^\./) { + print "Processing directory $file\n"; + opendir(DIR, $file); + @newfiles = grep { !/^\./ && !/(CVS|~)/ } readdir(DIR); + closedir(DIR); + printf "Adding files @newfiles\n"; + @files = (@files, map { $_ = "$file/$_" } @newfiles); + next; + } +} + +foreach $file (@files) { + if(-f $file) { + + print "Adding file $file\n"; + + open(FILE, $file) || die "Could not open file $file\n"; + + $file =~ s-^-/-; + $fvar = $file; + $fvar =~ s-/-_-g; + $fvar =~ s-\.-_-g; + # for AVR, add PROGMEM here + print(OUTPUT "static const unsigned char data".$fvar."[] = {\n"); + print(OUTPUT "\t/* $file */\n\t"); + for($j = 0; $j < length($file); $j++) { + printf(OUTPUT "%#02x, ", unpack("C", substr($file, $j, 1))); + } + printf(OUTPUT "0,\n"); + + + $i = 0; + while(read(FILE, $data, 1)) { + if($i == 0) { + print(OUTPUT "\t"); + } + printf(OUTPUT "%#02x, ", unpack("C", $data)); + $i++; + if($i == 10) { + print(OUTPUT "\n"); + $i = 0; + } + } + print(OUTPUT "0};\n\n"); + close(FILE); + push(@fvars, $fvar); + push(@pfiles, $file); + } +} + +for($i = 0; $i < @fvars; $i++) { + $file = $pfiles[$i]; + $fvar = $fvars[$i]; + + if($i == 0) { + $prevfile = "NULL"; + } else { + $prevfile = "file" . $fvars[$i - 1]; + } + print(OUTPUT "const struct httpd_fsdata_file file".$fvar."[] = {{$prevfile, data$fvar, "); + print(OUTPUT "data$fvar + ". (length($file) + 1) .", "); + print(OUTPUT "sizeof(data$fvar) - ". (length($file) + 1) ."}};\n\n"); +} + +print(OUTPUT "#define HTTPD_FS_ROOT file$fvars[$i - 1]\n\n"); +print(OUTPUT "#define HTTPD_FS_NUMFILES $i\n"); diff --git a/Demo/CORTEX_LM3S6965_KEIL/webserver/makestrings b/Demo/CORTEX_LM3S6965_KEIL/webserver/makestrings new file mode 100644 index 000000000..8a13c6d29 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/webserver/makestrings @@ -0,0 +1,40 @@ +#!/usr/bin/perl + + +sub stringify { + my $name = shift(@_); + open(OUTPUTC, "> $name.c"); + open(OUTPUTH, "> $name.h"); + + open(FILE, "$name"); + + while() { + if(/(.+) "(.+)"/) { + $var = $1; + $data = $2; + + $datan = $data; + $datan =~ s/\\r/\r/g; + $datan =~ s/\\n/\n/g; + $datan =~ s/\\01/\01/g; + $datan =~ s/\\0/\0/g; + + printf(OUTPUTC "const char $var\[%d] = \n", length($datan) + 1); + printf(OUTPUTC "/* \"$data\" */\n"); + printf(OUTPUTC "{"); + for($j = 0; $j < length($datan); $j++) { + printf(OUTPUTC "%#02x, ", unpack("C", substr($datan, $j, 1))); + } + printf(OUTPUTC "};\n"); + + printf(OUTPUTH "extern const char $var\[%d];\n", length($datan) + 1); + + } + } + close(OUTPUTC); + close(OUTPUTH); +} +stringify("http-strings"); + +exit 0; + diff --git a/Demo/CORTEX_LM3S6965_KEIL/webserver/uIP_Task.c b/Demo/CORTEX_LM3S6965_KEIL/webserver/uIP_Task.c new file mode 100644 index 000000000..0b9a0f855 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/webserver/uIP_Task.c @@ -0,0 +1,300 @@ +/* + FreeRTOS.org V4.3.0 - Copyright (C) 2003-2007 Richard Barry. + + This file is part of the FreeRTOS.org distribution. + + FreeRTOS.org is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + FreeRTOS.org is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FreeRTOS.org; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + A special exception to the GPL can be applied should you wish to distribute + a combined work that includes FreeRTOS.org, without being obliged to provide + the source code for any proprietary components. See the licensing section + of http://www.FreeRTOS.org for full details of how and when the exception + can be applied. + + *************************************************************************** + See http://www.FreeRTOS.org for documentation, latest information, license + and contact details. Please ensure to read the configuration and relevant + port sections of the online documentation. + *************************************************************************** +*/ +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "semphr.h" + +#include "lcd_message.h" + +/* uip includes. */ +#include "hw_types.h" + +#include "uip.h" +#include "uip_arp.h" +#include "httpd.h" +#include "timer.h" +#include "clock-arch.h" +#include "hw_ethernet.h" +#include "ethernet.h" +#include "hw_memmap.h" +#include "lmi_flash.h" + +/* Demo includes. */ +#include "emac.h" +#include "partest.h" + +/*-----------------------------------------------------------*/ + +/* IP address configuration. */ +#define uipIP_ADDR0 172 +#define uipIP_ADDR1 25 +#define uipIP_ADDR2 218 +#define uipIP_ADDR3 9 + +/* How long to wait before attempting to connect the MAC again. */ +#define uipINIT_WAIT 100 + +/* Shortcut to the header within the Rx buffer. */ +#define xHeader ((struct uip_eth_hdr *) &uip_buf[ 0 ]) + +/* Standard constant. */ +#define uipTOTAL_FRAME_HEADER_SIZE 54 + +/*-----------------------------------------------------------*/ + +/* + * Send the uIP buffer to the MAC. + */ +static void prvENET_Send(void); + +/* + * Setup the MAC address in the MAC itself, and in the uIP stack. + */ +static void prvSetMACAddress( void ); + +/* + * Port functions required by the uIP stack. + */ +void clock_init( void ); +clock_time_t clock_time( void ); + +/*-----------------------------------------------------------*/ + +/* The semaphore used by the ISR to wake the uIP task. */ +extern xSemaphoreHandle xEMACSemaphore; + +/*-----------------------------------------------------------*/ + +void clock_init(void) +{ + /* This is done when the scheduler starts. */ +} +/*-----------------------------------------------------------*/ + +clock_time_t clock_time( void ) +{ + return xTaskGetTickCount(); +} +/*-----------------------------------------------------------*/ + +void vuIP_Task( void *pvParameters ) +{ +portBASE_TYPE i; +uip_ipaddr_t xIPAddr; +struct timer periodic_timer, arp_timer; +extern void ( vEMAC_ISR )( void ); + + /* Create the semaphore used by the ISR to wake this task. */ + vSemaphoreCreateBinary( xEMACSemaphore ); + + /* Initialise the uIP stack. */ + timer_set( &periodic_timer, configTICK_RATE_HZ / 2 ); + timer_set( &arp_timer, configTICK_RATE_HZ * 10 ); + uip_init(); + uip_ipaddr( xIPAddr, uipIP_ADDR0, uipIP_ADDR1, uipIP_ADDR2, uipIP_ADDR3 ); + uip_sethostaddr( xIPAddr ); + httpd_init(); + + while( vInitEMAC() != pdPASS ) + { + vTaskDelay( uipINIT_WAIT ); + } + prvSetMACAddress(); + + + for( ;; ) + { + /* Is there received data ready to be processed? */ + uip_len = uiGetEMACRxData( uip_buf ); + + if( uip_len > 0 ) + { + /* Standard uIP loop taken from the uIP manual. */ + + if( xHeader->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(); + prvENET_Send(); + } + } + else if( xHeader->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 ) + { + prvENET_Send(); + } + } + } + else + { + if( timer_expired( &periodic_timer ) ) + { + timer_reset( &periodic_timer ); + for( i = 0; i < UIP_CONNS; i++ ) + { + uip_periodic( i ); + + /* 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(); + prvENET_Send(); + } + } + + /* Call the ARP timer function every 10 seconds. */ + if( timer_expired( &arp_timer ) ) + { + timer_reset( &arp_timer ); + uip_arp_timer(); + } + } + else + { + /* We did not receive a packet, and there was no periodic + processing to perform. Block for a fixed period. If a packet + is received during this period we will be woken by the ISR + giving us the Semaphore. */ + xSemaphoreTake( xEMACSemaphore, configTICK_RATE_HZ / 2 ); + } + } + } +} +/*-----------------------------------------------------------*/ + +static void prvENET_Send(void) +{ + vInitialiseSend(); + vIncrementTxLength( uip_len ); + vSendBufferToMAC(); +} +/*-----------------------------------------------------------*/ + +static void prvSetMACAddress( void ) +{ +unsigned portLONG ulUser0, ulUser1; +unsigned char pucMACArray[8]; +struct uip_eth_addr xAddr; + + /* Get the device MAC address from flash */ + FlashUserGet(&ulUser0, &ulUser1); + + /* Convert the MAC address from flash into sequence of bytes. */ + pucMACArray[0] = ((ulUser0 >> 0) & 0xff); + pucMACArray[1] = ((ulUser0 >> 8) & 0xff); + pucMACArray[2] = ((ulUser0 >> 16) & 0xff); + pucMACArray[3] = ((ulUser1 >> 0) & 0xff); + pucMACArray[4] = ((ulUser1 >> 8) & 0xff); + pucMACArray[5] = ((ulUser1 >> 16) & 0xff); + + /* Program the MAC address. */ + EthernetMACAddrSet(ETH_BASE, pucMACArray); + + xAddr.addr[ 0 ] = pucMACArray[0]; + xAddr.addr[ 1 ] = pucMACArray[1]; + xAddr.addr[ 2 ] = pucMACArray[2]; + xAddr.addr[ 3 ] = pucMACArray[3]; + xAddr.addr[ 4 ] = pucMACArray[4]; + xAddr.addr[ 5 ] = pucMACArray[5]; + uip_setethaddr( xAddr ); +} +/*-----------------------------------------------------------*/ + +void vApplicationProcessFormInput( portCHAR *pcInputString, portBASE_TYPE xInputLength ) +{ +char *c, *pcText; +static portCHAR cMessageForDisplay[ 32 ]; +extern xQueueHandle xOLEDQueue; +xOLEDMessage xOLEDMessage; + + /* Process the form input sent by the IO page of the served HTML. */ + + c = strstr( pcInputString, "?" ); + + if( c ) + { + /* Turn LED's on or off in accordance with the check box status. */ + if( strstr( c, "LED0=1" ) != NULL ) + { + vParTestSetLED( 0, 1 ); + } + else + { + vParTestSetLED( 0, 0 ); + } + + /* Find the start of the text to be displayed on the LCD. */ + pcText = strstr( c, "LCD=" ); + pcText += strlen( "LCD=" ); + + /* Terminate the file name for further processing within uIP. */ + *c = 0x00; + + /* Terminate the LCD string. */ + c = strstr( pcText, " " ); + if( c != NULL ) + { + *c = 0x00; + } + + /* Add required spaces. */ + while( ( c = strstr( pcText, "+" ) ) != NULL ) + { + *c = ' '; + } + + /* Write the message to the LCD. */ + strcpy( cMessageForDisplay, pcText ); + xOLEDMessage.pcMessage = cMessageForDisplay; + xQueueSend( xOLEDQueue, &xOLEDMessage, portMAX_DELAY ); + } +} + diff --git a/Demo/CORTEX_LM3S6965_KEIL/webserver/uip-conf.h b/Demo/CORTEX_LM3S6965_KEIL/webserver/uip-conf.h new file mode 100644 index 000000000..664077d89 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/webserver/uip-conf.h @@ -0,0 +1,159 @@ +/** + * \addtogroup uipopt + * @{ + */ + +/** + * \name Project-specific configuration options + * @{ + * + * uIP has a number of configuration options that can be overridden + * for each project. These are kept in a project-specific uip-conf.h + * file and all configuration names have the prefix UIP_CONF. + */ + +/* + * Copyright (c) 2006, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: uip-conf.h,v 1.6 2006/06/12 08:00:31 adam Exp $ + */ + +/** + * \file + * An example uIP configuration file + * \author + * Adam Dunkels + */ + +#ifndef __UIP_CONF_H__ +#define __UIP_CONF_H__ + +#include + +/** + * 8 bit datatype + * + * This typedef defines the 8-bit type used throughout uIP. + * + * \hideinitializer + */ +typedef uint8_t u8_t; + +/** + * 16 bit datatype + * + * This typedef defines the 16-bit type used throughout uIP. + * + * \hideinitializer + */ +typedef uint16_t u16_t; + +/** + * Statistics datatype + * + * This typedef defines the dataype used for keeping statistics in + * uIP. + * + * \hideinitializer + */ +typedef unsigned short uip_stats_t; + +/** + * Maximum number of TCP connections. + * + * \hideinitializer + */ +#define UIP_CONF_MAX_CONNECTIONS 40 + +/** + * Maximum number of listening TCP ports. + * + * \hideinitializer + */ +#define UIP_CONF_MAX_LISTENPORTS 40 + +/** + * uIP buffer size. + * + * \hideinitializer + */ +#define UIP_CONF_BUFFER_SIZE 1500 + +/** + * CPU byte order. + * + * \hideinitializer + */ +#define UIP_CONF_BYTE_ORDER LITTLE_ENDIAN + +/** + * Logging on or off + * + * \hideinitializer + */ +#define UIP_CONF_LOGGING 0 + +/** + * UDP support on or off + * + * \hideinitializer + */ +#define UIP_CONF_UDP 0 + +/** + * UDP checksums on or off + * + * \hideinitializer + */ +#define UIP_CONF_UDP_CHECKSUMS 1 + +/** + * uIP statistics on or off + * + * \hideinitializer + */ +#define UIP_CONF_STATISTICS 1 + +/* Here we include the header file for the application(s) we use in + our project. */ +/*#include "smtp.h"*/ +/*#include "hello-world.h"*/ +/*#include "telnetd.h"*/ +#include "webserver.h" +/*#include "dhcpc.h"*/ +/*#include "resolv.h"*/ +/*#include "webclient.h"*/ + +#define UIP_CONF_EXTERNAL_BUFFER + +#endif /* __UIP_CONF_H__ */ + +/** @} */ +/** @} */ diff --git a/Demo/CORTEX_LM3S6965_KEIL/webserver/webserver.h b/Demo/CORTEX_LM3S6965_KEIL/webserver/webserver.h new file mode 100644 index 000000000..1acb290b8 --- /dev/null +++ b/Demo/CORTEX_LM3S6965_KEIL/webserver/webserver.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: webserver.h,v 1.2 2006/06/11 21:46:38 adam Exp $ + * + */ +#ifndef __WEBSERVER_H__ +#define __WEBSERVER_H__ + +#include "httpd.h" + +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 + + +#endif /* __WEBSERVER_H__ */ -- 2.39.2
LocalRemoteStateRetransmissionsTimerFlags