From c3e4c9a25c2910d2d66d52215b3406b13d5b23d5 Mon Sep 17 00:00:00 2001 From: Yuval Adam Date: Sun, 29 Jun 2014 12:34:32 +0300 Subject: Add more board models --- boards/dk-tm4c129x/grlib_driver_test/Makefile | 93 + .../grlib_driver_test/ccs/.ccsimportspec | 11 + .../dk-tm4c129x/grlib_driver_test/ccs/.ccsproject | 10 + boards/dk-tm4c129x/grlib_driver_test/ccs/.cproject | 191 ++ boards/dk-tm4c129x/grlib_driver_test/ccs/.project | 80 + .../ccs/.settings/org.eclipse.cdt.codan.core.prefs | 3 + .../ccs/Debug/grlib_driver_test.bin | Bin 0 -> 35328 bytes .../ccs/Debug/grlib_driver_test.out | Bin 0 -> 324736 bytes .../grlib_driver_test/ccs/macros.ini_initial | 1 + .../grlib_driver_test/ccs/target_config.ccxml | 13 + .../dk-tm4c129x/grlib_driver_test/driver_config.h | 137 ++ .../ewarm/Exe/grlib_driver_test.bin | Bin 0 -> 33060 bytes .../ewarm/Exe/grlib_driver_test.out | Bin 0 -> 329664 bytes .../grlib_driver_test/gcc/grlib_driver_test.axf | Bin 0 -> 107901 bytes .../grlib_driver_test/gcc/grlib_driver_test.bin | Bin 0 -> 34084 bytes .../grlib_driver_test/grlib_driver_test.c | 2544 ++++++++++++++++++++ .../grlib_driver_test/grlib_driver_test.ewd | 614 +++++ .../grlib_driver_test/grlib_driver_test.ewp | 807 +++++++ .../grlib_driver_test/grlib_driver_test.icf | 78 + .../grlib_driver_test/grlib_driver_test.ld | 57 + .../grlib_driver_test/grlib_driver_test.sct | 47 + .../grlib_driver_test/grlib_driver_test.uvopt | 387 +++ .../grlib_driver_test/grlib_driver_test.uvproj | 459 ++++ .../grlib_driver_test/grlib_driver_test_ccs.cmd | 70 + boards/dk-tm4c129x/grlib_driver_test/images.c | 551 +++++ boards/dk-tm4c129x/grlib_driver_test/images.h | 41 + boards/dk-tm4c129x/grlib_driver_test/readme.txt | 117 + .../grlib_driver_test/rvmdk/grlib_driver_test.axf | Bin 0 -> 243204 bytes .../grlib_driver_test/rvmdk/grlib_driver_test.bin | Bin 0 -> 33644 bytes boards/dk-tm4c129x/grlib_driver_test/startup_ccs.c | 275 +++ .../dk-tm4c129x/grlib_driver_test/startup_ewarm.c | 306 +++ boards/dk-tm4c129x/grlib_driver_test/startup_gcc.c | 322 +++ .../dk-tm4c129x/grlib_driver_test/startup_rvmdk.S | 331 +++ 33 files changed, 7545 insertions(+) create mode 100644 boards/dk-tm4c129x/grlib_driver_test/Makefile create mode 100644 boards/dk-tm4c129x/grlib_driver_test/ccs/.ccsimportspec create mode 100644 boards/dk-tm4c129x/grlib_driver_test/ccs/.ccsproject create mode 100644 boards/dk-tm4c129x/grlib_driver_test/ccs/.cproject create mode 100644 boards/dk-tm4c129x/grlib_driver_test/ccs/.project create mode 100644 boards/dk-tm4c129x/grlib_driver_test/ccs/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 boards/dk-tm4c129x/grlib_driver_test/ccs/Debug/grlib_driver_test.bin create mode 100644 boards/dk-tm4c129x/grlib_driver_test/ccs/Debug/grlib_driver_test.out create mode 100644 boards/dk-tm4c129x/grlib_driver_test/ccs/macros.ini_initial create mode 100644 boards/dk-tm4c129x/grlib_driver_test/ccs/target_config.ccxml create mode 100644 boards/dk-tm4c129x/grlib_driver_test/driver_config.h create mode 100644 boards/dk-tm4c129x/grlib_driver_test/ewarm/Exe/grlib_driver_test.bin create mode 100644 boards/dk-tm4c129x/grlib_driver_test/ewarm/Exe/grlib_driver_test.out create mode 100644 boards/dk-tm4c129x/grlib_driver_test/gcc/grlib_driver_test.axf create mode 100644 boards/dk-tm4c129x/grlib_driver_test/gcc/grlib_driver_test.bin create mode 100644 boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.c create mode 100644 boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.ewd create mode 100644 boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.ewp create mode 100644 boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.icf create mode 100644 boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.ld create mode 100644 boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.sct create mode 100644 boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.uvopt create mode 100644 boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.uvproj create mode 100644 boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test_ccs.cmd create mode 100644 boards/dk-tm4c129x/grlib_driver_test/images.c create mode 100644 boards/dk-tm4c129x/grlib_driver_test/images.h create mode 100644 boards/dk-tm4c129x/grlib_driver_test/readme.txt create mode 100644 boards/dk-tm4c129x/grlib_driver_test/rvmdk/grlib_driver_test.axf create mode 100644 boards/dk-tm4c129x/grlib_driver_test/rvmdk/grlib_driver_test.bin create mode 100644 boards/dk-tm4c129x/grlib_driver_test/startup_ccs.c create mode 100644 boards/dk-tm4c129x/grlib_driver_test/startup_ewarm.c create mode 100644 boards/dk-tm4c129x/grlib_driver_test/startup_gcc.c create mode 100644 boards/dk-tm4c129x/grlib_driver_test/startup_rvmdk.S (limited to 'boards/dk-tm4c129x/grlib_driver_test') diff --git a/boards/dk-tm4c129x/grlib_driver_test/Makefile b/boards/dk-tm4c129x/grlib_driver_test/Makefile new file mode 100644 index 0000000..183be2a --- /dev/null +++ b/boards/dk-tm4c129x/grlib_driver_test/Makefile @@ -0,0 +1,93 @@ +#****************************************************************************** +# +# Makefile - Rules for building the A command-line driven testcase to aid development of GrLib display drivers. +# +# Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +# Software License Agreement +# +# Texas Instruments (TI) is supplying this software for use solely and +# exclusively on TI's microcontroller products. The software is owned by +# TI and/or its suppliers, and is protected under applicable copyright +# laws. You may not combine this software with "viral" open-source +# software in order to form a larger program. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +# NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +# NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +# CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +# DAMAGES, FOR ANY REASON WHATSOEVER. +# +# This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +# +#****************************************************************************** + +# +# Defines the part type that this project uses. +# +PART=TM4C129XNCZAD + +# +# The base directory for TivaWare. +# +ROOT=../../../.. + +# +# Include the common make definitions. +# +include ${ROOT}/makedefs + +# +# Where to find source files that do not live in this directory. +# +VPATH=../drivers +VPATH+=../../../../utils + +# +# Where to find header files that do not live in the source directory. +# +IPATH=.. +IPATH+=../../../.. + +# +# The default rule, which causes the A command-line driven testcase to aid development of GrLib display drivers to be built. +# +all: ${COMPILER} +all: ${COMPILER}/grlib_driver_test.axf + +# +# The rule to clean out all the build products. +# +clean: + @rm -rf ${COMPILER} ${wildcard *~} + +# +# The rule to create the target directory. +# +${COMPILER}: + @mkdir -p ${COMPILER} + +# +# Rules for building the A command-line driven testcase to aid development of GrLib display drivers. +# +${COMPILER}/grlib_driver_test.axf: ${COMPILER}/cmdline.o +${COMPILER}/grlib_driver_test.axf: ${COMPILER}/grlib_driver_test.o +${COMPILER}/grlib_driver_test.axf: ${COMPILER}/images.o +${COMPILER}/grlib_driver_test.axf: ${COMPILER}/kentec320x240x16_ssd2119.o +${COMPILER}/grlib_driver_test.axf: ${COMPILER}/pinout.o +${COMPILER}/grlib_driver_test.axf: ${COMPILER}/startup_${COMPILER}.o +${COMPILER}/grlib_driver_test.axf: ${COMPILER}/uartstdio.o +${COMPILER}/grlib_driver_test.axf: ${COMPILER}/ustdlib.o +${COMPILER}/grlib_driver_test.axf: ${ROOT}/grlib/${COMPILER}/libgr.a +${COMPILER}/grlib_driver_test.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a +${COMPILER}/grlib_driver_test.axf: grlib_driver_test.ld +SCATTERgcc_grlib_driver_test=grlib_driver_test.ld +ENTRY_grlib_driver_test=ResetISR +CFLAGSgcc=-DTARGET_IS_TM4C129_RA0 + +# +# Include the automatically generated dependency files. +# +ifneq (${MAKECMDGOALS},clean) +-include ${wildcard ${COMPILER}/*.d} __dummy__ +endif diff --git a/boards/dk-tm4c129x/grlib_driver_test/ccs/.ccsimportspec b/boards/dk-tm4c129x/grlib_driver_test/ccs/.ccsimportspec new file mode 100644 index 0000000..01de889 --- /dev/null +++ b/boards/dk-tm4c129x/grlib_driver_test/ccs/.ccsimportspec @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/grlib_driver_test/ccs/.ccsproject b/boards/dk-tm4c129x/grlib_driver_test/ccs/.ccsproject new file mode 100644 index 0000000..59a3400 --- /dev/null +++ b/boards/dk-tm4c129x/grlib_driver_test/ccs/.ccsproject @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/boards/dk-tm4c129x/grlib_driver_test/ccs/.cproject b/boards/dk-tm4c129x/grlib_driver_test/ccs/.cproject new file mode 100644 index 0000000..a50ef9c --- /dev/null +++ b/boards/dk-tm4c129x/grlib_driver_test/ccs/.cproject @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/grlib_driver_test/ccs/.project b/boards/dk-tm4c129x/grlib_driver_test/ccs/.project new file mode 100644 index 0000000..2d8a647 --- /dev/null +++ b/boards/dk-tm4c129x/grlib_driver_test/ccs/.project @@ -0,0 +1,80 @@ + + + grlib_driver_test + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + grlib_driver_test.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.c + + + grlib_driver_test_ccs.cmd + 1 + SW_ROOT/examples/boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test_ccs.cmd + + + images.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/grlib_driver_test/images.c + + + startup_ccs.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/grlib_driver_test/startup_ccs.c + + + drivers/kentec320x240x16_ssd2119.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/kentec320x240x16_ssd2119.c + + + drivers/pinout.c + 1 + SW_ROOT/examples/boards/dk-tm4c129x/drivers/pinout.c + + + utils/cmdline.c + 1 + SW_ROOT/utils/cmdline.c + + + utils/uartstdio.c + 1 + SW_ROOT/utils/uartstdio.c + + + utils/ustdlib.c + 1 + SW_ROOT/utils/ustdlib.c + + + + + SW_ROOT + $%7BPARENT-5-PROJECT_LOC%7D + + + diff --git a/boards/dk-tm4c129x/grlib_driver_test/ccs/.settings/org.eclipse.cdt.codan.core.prefs b/boards/dk-tm4c129x/grlib_driver_test/ccs/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..98b6350 --- /dev/null +++ b/boards/dk-tm4c129x/grlib_driver_test/ccs/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/boards/dk-tm4c129x/grlib_driver_test/ccs/Debug/grlib_driver_test.bin b/boards/dk-tm4c129x/grlib_driver_test/ccs/Debug/grlib_driver_test.bin new file mode 100644 index 0000000..e8beac8 Binary files /dev/null and b/boards/dk-tm4c129x/grlib_driver_test/ccs/Debug/grlib_driver_test.bin differ diff --git a/boards/dk-tm4c129x/grlib_driver_test/ccs/Debug/grlib_driver_test.out b/boards/dk-tm4c129x/grlib_driver_test/ccs/Debug/grlib_driver_test.out new file mode 100644 index 0000000..93d8cb5 Binary files /dev/null and b/boards/dk-tm4c129x/grlib_driver_test/ccs/Debug/grlib_driver_test.out differ diff --git a/boards/dk-tm4c129x/grlib_driver_test/ccs/macros.ini_initial b/boards/dk-tm4c129x/grlib_driver_test/ccs/macros.ini_initial new file mode 100644 index 0000000..31214b5 --- /dev/null +++ b/boards/dk-tm4c129x/grlib_driver_test/ccs/macros.ini_initial @@ -0,0 +1 @@ +SW_ROOT = ../../../../.. diff --git a/boards/dk-tm4c129x/grlib_driver_test/ccs/target_config.ccxml b/boards/dk-tm4c129x/grlib_driver_test/ccs/target_config.ccxml new file mode 100644 index 0000000..6e5ef45 --- /dev/null +++ b/boards/dk-tm4c129x/grlib_driver_test/ccs/target_config.ccxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/boards/dk-tm4c129x/grlib_driver_test/driver_config.h b/boards/dk-tm4c129x/grlib_driver_test/driver_config.h new file mode 100644 index 0000000..10c8ced --- /dev/null +++ b/boards/dk-tm4c129x/grlib_driver_test/driver_config.h @@ -0,0 +1,137 @@ +//***************************************************************************** +// +// driver_config.h - Modify this header file to tailor grlib_driver_test for +// operation with your board and graphics display driver. +// +// Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#ifndef __DRIVER_CONFIG_H__ +#define __DRIVER_CONFIG_H__ + +//***************************************************************************** +// +// TODO: Include the header file for your display driver here. The default +// driver is for the QVGA display on the DK-TM4C129X board. If your +// driver is dependent upon any other headers, include them here too. +// This may be the case if, for example, you are using a raster mode +// display and you have a header containing the timing parameters for +// the screen. +// +//***************************************************************************** +#include "drivers/kentec320x240x16_ssd2119.h" + +//***************************************************************************** +// +// These two headers are required by the default implementation and can likely +// be removed or reworked when you update the application to run on a custom +// board. +// +//***************************************************************************** +#include "drivers/frame.h" +#include "drivers/pinout.h" + +//***************************************************************************** +// +// TODO: Set DRIVER_NAME to the name of the tDisplay structure exported by +// your display driver. +// +//***************************************************************************** +#define DRIVER_NAME g_sKentec320x240x16_SSD2119 + +//***************************************************************************** +// +// TODO: Set DRIVER_SYS_CLOCK_CONFIG to the value you require for your system. +// This is the first parameter that is passed to the SysCtlClockFreqSet +// function. +// +//***************************************************************************** +#define DRIVER_SYS_CLOCK_CONFIG (SYSCTL_XTAL_25MHZ | \ + SYSCTL_OSC_MAIN | \ + SYSCTL_USE_PLL | \ + SYSCTL_CFG_VCO_480) + +//***************************************************************************** +// +// TODO: Set DRIVER_SYS_CLOCK_FREQUENCY to the value you require for your +// system. This is the second parameter that is passed to the +// SysCtlClockFreqSet function and represents the desired system clock +// frequency. +// +//***************************************************************************** +#define DRIVER_SYS_CLOCK_FREQUENCY 120000000 + +//***************************************************************************** +// +// TODO: Define the color depth of the display driver's frame buffer. If this +// value is 16 or greater, any operations involving the driver color +// palette will be compiled out of the test. If it is 8 or lower, make +// sure you also define the macro DRIVER_PALETTE_SET to allow the +// application to set colors in the driver's color lookup table. +// +//***************************************************************************** +#define DRIVER_BPP 16 + +#if (DRIVER_BPP < 16) +//***************************************************************************** +// +// TODO: This macro must be defined if your display driver uses a palettized +// pixel format and a global color lookup table. Parameter pui32Color +// points to an array of 32-bit values each containing and RGB888 color +// definition. ui32Index is the starting palette index in the driver's +// color table that will be changed and ui32NumEntries indicates both the +// number of colors in the array pointed to by pui32Color and the number +// of driver color palette locations that are to be written. +// +//***************************************************************************** +#define DRIVER_PALETTE_SET(pui32Color, ui32Index, ui32NumEntries) \ + YourDriverPaletteSet((pui32Color), (ui32Index), (ui32NumEntries)); + +#endif + +//***************************************************************************** +// +// TODO: This macro must be defined to perform all necessary hardware and +// software initialization for your display driver. This will typically +// involve configuring the LCD controller into the relevant mode for +// the driver, setting peripheral pin muxing, configuring the EPI and +// SDRAM if your driver uses raster mode and requires a frame buffer in +// EPI-connected memory and setting a default color palette if needed. +// +// The ui32SysClock parameter provides the configured system clock rate +// in Hz. +// +//***************************************************************************** +#define DRIVER_INIT(ui32SysClock) \ +{ \ + PinoutSet(); \ + Kentec320x240x16_SSD2119Init(ui32SysClock); \ +} + +//***************************************************************************** +// +// We allow the testcase to be built such that it issues no drawing orders +// other than those requested via the command line. This can be helpful +// when bringing up a new display driver. +// +//***************************************************************************** +//#define NO_GRLIB_CALLS_ON_STARTUP + +#endif diff --git a/boards/dk-tm4c129x/grlib_driver_test/ewarm/Exe/grlib_driver_test.bin b/boards/dk-tm4c129x/grlib_driver_test/ewarm/Exe/grlib_driver_test.bin new file mode 100644 index 0000000..8b41d40 Binary files /dev/null and b/boards/dk-tm4c129x/grlib_driver_test/ewarm/Exe/grlib_driver_test.bin differ diff --git a/boards/dk-tm4c129x/grlib_driver_test/ewarm/Exe/grlib_driver_test.out b/boards/dk-tm4c129x/grlib_driver_test/ewarm/Exe/grlib_driver_test.out new file mode 100644 index 0000000..9fb846a Binary files /dev/null and b/boards/dk-tm4c129x/grlib_driver_test/ewarm/Exe/grlib_driver_test.out differ diff --git a/boards/dk-tm4c129x/grlib_driver_test/gcc/grlib_driver_test.axf b/boards/dk-tm4c129x/grlib_driver_test/gcc/grlib_driver_test.axf new file mode 100644 index 0000000..e218a2f Binary files /dev/null and b/boards/dk-tm4c129x/grlib_driver_test/gcc/grlib_driver_test.axf differ diff --git a/boards/dk-tm4c129x/grlib_driver_test/gcc/grlib_driver_test.bin b/boards/dk-tm4c129x/grlib_driver_test/gcc/grlib_driver_test.bin new file mode 100644 index 0000000..239522e Binary files /dev/null and b/boards/dk-tm4c129x/grlib_driver_test/gcc/grlib_driver_test.bin differ diff --git a/boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.c b/boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.c new file mode 100644 index 0000000..c6ceafe --- /dev/null +++ b/boards/dk-tm4c129x/grlib_driver_test/grlib_driver_test.c @@ -0,0 +1,2544 @@ +//***************************************************************************** +// +// grlib_driver_test.c - A test tool intended to aid developers of drivers +// for the TivaWare Graphics Library +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_sysctl.h" +#include "inc/hw_types.h" +#include "inc/hw_memmap.h" +#include "inc/hw_gpio.h" +#include "inc/hw_ints.h" +#include "inc/hw_lcd.h" +#include "driverlib/sysctl.h" +#include "driverlib/gpio.h" +#include "driverlib/lcd.h" +#include "driverlib/interrupt.h" +#include "driverlib/systick.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "grlib/grlib.h" +#include "utils/cmdline.h" +#include "utils/uartstdio.h" +#include "utils/ustdlib.h" +#include "images.h" +#include "driver_config.h" + +//***************************************************************************** +// +//! \addtogroup example_list +//!

Graphics Driver Test Tool (grlib_driver_test)

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