diff --git a/Demo/MSP430X_MSP430F5438_CCS4/.ccsproject b/Demo/MSP430X_MSP430F5438_CCS4/.ccsproject
new file mode 100644
index 000000000..ac776e6da
--- /dev/null
+++ b/Demo/MSP430X_MSP430F5438_CCS4/.ccsproject
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Demo/MSP430X_MSP430F5438_CCS4/.cdtbuild b/Demo/MSP430X_MSP430F5438_CCS4/.cdtbuild
new file mode 100644
index 000000000..7b70eb301
--- /dev/null
+++ b/Demo/MSP430X_MSP430F5438_CCS4/.cdtbuild
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Demo/MSP430X_MSP430F5438_CCS4/.cdtproject b/Demo/MSP430X_MSP430F5438_CCS4/.cdtproject
new file mode 100644
index 000000000..fa825035b
--- /dev/null
+++ b/Demo/MSP430X_MSP430F5438_CCS4/.cdtproject
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Demo/MSP430X_MSP430F5438_CCS4/.project b/Demo/MSP430X_MSP430F5438_CCS4/.project
new file mode 100644
index 000000000..5201cfb28
--- /dev/null
+++ b/Demo/MSP430X_MSP430F5438_CCS4/.project
@@ -0,0 +1,20 @@
+
+
+ RTOSDemo
+
+
+
+
+
+ org.eclipse.cdt.managedbuilder.core.genmakebuilder
+
+
+
+
+
+ org.eclipse.cdt.core.cnature
+ org.eclipse.cdt.managedbuilder.core.managedBuildNature
+ org.eclipse.cdt.core.ccnature
+ com.ti.ccstudio.managedbuild.core.ccsNature
+
+
diff --git a/Demo/MSP430X_MSP430F5438_CCS4/.settings/org.eclipse.cdt.managedbuilder.core.prefs b/Demo/MSP430X_MSP430F5438_CCS4/.settings/org.eclipse.cdt.managedbuilder.core.prefs
new file mode 100644
index 000000000..42f0f270b
--- /dev/null
+++ b/Demo/MSP430X_MSP430F5438_CCS4/.settings/org.eclipse.cdt.managedbuilder.core.prefs
@@ -0,0 +1,6 @@
+#Sat Jan 01 13:05:50 GMT 2011
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.1203657382/internalBuilder/enabled=false
+com.ti.ccstudio.buildDefinitions.MSP430.Debug.1203657382/internalBuilder/ignoreErr=true
+eclipse.preferences.version=1
+environment/project=\r\n\r\n
+environment/project/com.ti.ccstudio.buildDefinitions.MSP430.Debug.1203657382=\r\n\r\n
diff --git a/Demo/MSP430X_MSP430F5438_CCS4/.settings/org.eclipse.ltk.core.refactoring.prefs b/Demo/MSP430X_MSP430F5438_CCS4/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 000000000..9a8bc90c8
--- /dev/null
+++ b/Demo/MSP430X_MSP430F5438_CCS4/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Sat Jan 01 16:11:34 GMT 2011
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false
diff --git a/Demo/MSP430X_MSP430F5438_CCS4/CreateProjectDirectoryStructure.bat b/Demo/MSP430X_MSP430F5438_CCS4/CreateProjectDirectoryStructure.bat
new file mode 100644
index 000000000..8d0e30052
--- /dev/null
+++ b/Demo/MSP430X_MSP430F5438_CCS4/CreateProjectDirectoryStructure.bat
@@ -0,0 +1,50 @@
+REM This file should be executed from the command line prior to the first
+REM build. It will be necessary to refresh the Eclipse project once the
+REM .bat file has been executed (normally just press F5 to refresh).
+
+REM Copies all the required files from their location within the standard
+REM FreeRTOS directory structure to under the Eclipse project directory.
+REM This permits the Eclipse project to be used in 'managed' mode and without
+REM having to setup any linked resources.
+
+REM Have the files already been copied?
+IF EXIST FreeRTOS_Source Goto END
+
+ REM Create the required directory structure.
+ MD FreeRTOS_Source
+ MD FreeRTOS_Source\include
+ MD FreeRTOS_Source\portable\CCS4
+ MD FreeRTOS_Source\portable\CCS4\MSP430X
+ MD FreeRTOS_Source\portable\MemMang
+ MD Demo_Source\Common_Demo_Files
+ MD Demo_Source\Common_Demo_Files\include
+
+ REM Copy the core kernel files.
+ copy ..\..\Source\tasks.c FreeRTOS_Source
+ copy ..\..\Source\queue.c FreeRTOS_Source
+ copy ..\..\Source\list.c FreeRTOS_Source
+
+ REM Copy the common header files
+
+ copy ..\..\Source\include\*.* FreeRTOS_Source\include
+
+ REM Copy the portable layer files
+ copy ..\..\Source\portable\GCC\ARM_CM3\*.* FreeRTOS_Source\portable\CCS4\MSP430X
+
+ REM Copy the basic memory allocation files
+ copy ..\..\Source\portable\MemMang\heap_1.c FreeRTOS_Source\portable\MemMang
+
+ REM Copy the files that define the common demo tasks.
+ copy ..\Common\minimal\dynamic.c Demo_Source\Common_Demo_Files
+ copy ..\Common\minimal\comtest.c Demo_Source\Common_Demo_Files
+ copy ..\Common\minimal\GenQTest.c Demo_Source\Common_Demo_Files
+
+ REM Copy the common demo file headers.
+ copy ..\Common\include\dynamic.h Demo_Source\Common_Demo_Files\include
+ copy ..\Common\include\comtest.h Demo_Source\Common_Demo_Files\include
+ copy ..\Common\include\comtest2.h Demo_Source\Common_Demo_Files\include
+ copy ..\Common\include\GenQTest.h Demo_Source\Common_Demo_Files\include
+ copy ..\Common\include\serial.h Demo_Source\Common_Demo_Files\include
+ copy ..\Common\include\partest.h Demo_Source\Common_Demo_Files\include
+
+: END
\ No newline at end of file
diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/F5XX_6XX_Core_Lib/hal_UCS.c b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/F5XX_6XX_Core_Lib/hal_UCS.c
new file mode 100644
index 000000000..0b67ec7e6
--- /dev/null
+++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/F5XX_6XX_Core_Lib/hal_UCS.c
@@ -0,0 +1,267 @@
+//*******************************************************************************
+// Provides Functions to Initialize the UCS/FLL and clock sources
+// File: hal_ucs.c
+//
+// Texas Instruments
+//
+// Version 1.2
+// 11/24/09
+//
+// V1.0 Initial Version
+// V1.1 Added timeout function
+// V1.1 Added parameter for XTDrive
+//*******************************************************************************
+
+#include "msp430.h"
+#include "hal_UCS.h"
+
+//************************************************************************
+// Check and define required Defines
+//************************************************************************
+
+#ifndef XT1LFOFFG // Defines if not available in header file
+#define XT1LFOFFG 0
+#endif
+#ifndef XT1HFOFFG // Defines if not available in header file
+#define XT1HFOFFG 0
+#endif
+#ifndef XT2OFFG // Defines if not available in header file
+#define XT2OFFG 0
+#endif
+#ifndef XTS // Defines if not available in header file
+#define XTS 0
+#endif
+#ifndef XT2DRIVE_3 // Defines if not available in header file
+#define XT2DRIVE_3 0
+#endif
+
+//====================================================================
+/**
+ * Startup routine for 32kHz Cristal on LFXT1
+ *
+*/
+void LFXT_Start(uint16_t xtdrive)
+{
+ UCSCTL6_L |= XT1DRIVE1_L+XT1DRIVE0_L; // Highest drive setting for XT1 startup
+
+ while (SFRIFG1 & OFIFG) { // check OFIFG fault flag
+ UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG); // Clear OSC flaut Flags fault flags
+ SFRIFG1 &= ~OFIFG; // Clear OFIFG fault flag
+ }
+ UCSCTL6 = (UCSCTL6 & ~(XT1DRIVE_3)) |(xtdrive); // set Drive mode
+}
+
+//====================================================================
+/**
+ * Startup routine for 32kHz Cristal on LFXT1 with timeout counter
+ *
+*/
+uint16_t LFXT_Start_Timeout(uint16_t xtdrive, uint16_t timeout)
+{
+ UCSCTL6_L |= XT1DRIVE1_L+XT1DRIVE0_L; // Highest drive setting for XT1 startup
+
+ while ((SFRIFG1 & OFIFG) && timeout--){ // check OFIFG fault flag
+ UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG); // Clear OSC flaut Flags fault flags
+ SFRIFG1 &= ~OFIFG; // Clear OFIFG fault flag
+ }
+ UCSCTL6 = (UCSCTL6 & ~(XT1DRIVE_3)) |(xtdrive); // set Drive mode
+ if (timeout)
+ return (UCS_STATUS_OK);
+ else
+ return (UCS_STATUS_ERROR);
+}
+
+
+//====================================================================
+/**
+ * Startup routine for XT1
+ *
+*/
+void XT1_Start(uint16_t xtdrive)
+{
+ UCSCTL6 &= ~(XT1OFF | XT1DRIVE_3); // enable XT1
+ UCSCTL6 |= (XTS | xtdrive); // enable XT1 and set XT1Drive
+
+ while (SFRIFG1 & OFIFG) { // check OFIFG fault flag
+ UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG); // Clear OSC flaut Flags
+ SFRIFG1 &= ~OFIFG; // Clear OFIFG fault flag
+ }
+}
+
+//====================================================================
+/**
+ * Startup routine for XT1 with timeout counter
+ *
+*/
+uint16_t XT1_Start_Timeout(uint16_t xtdrive, uint16_t timeout)
+{
+ UCSCTL6 &= ~(XT1OFF | XT1DRIVE_3); // enable XT1
+ UCSCTL6 |= (XTS | xtdrive); // enable XT1 and set XT1Drive
+
+ while ((SFRIFG1 & OFIFG) && timeout--) { // check OFIFG fault flag
+ UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG); // Clear OSC flaut Flags
+ SFRIFG1 &= ~OFIFG; // Clear OFIFG fault flag
+ }
+ if (timeout)
+ return (UCS_STATUS_OK);
+ else
+ return (UCS_STATUS_ERROR);
+}
+
+//====================================================================
+/**
+ * Use XT1 in Bypasss mode
+ *
+*/
+void XT1_Bypass(void)
+{
+ UCSCTL6 |= XT1BYPASS;
+
+ while (SFRIFG1 & OFIFG) { // check OFIFG fault flag
+ UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG); // Clear OSC flaut Flags
+ SFRIFG1 &= ~OFIFG; // Clear OFIFG fault flag
+ }
+}
+
+//====================================================================
+/**
+ * Startup routine for XT2
+ *
+*/
+void XT2_Start(uint16_t xtdrive)
+{
+ UCSCTL6 &= ~(XT2OFF | XT2DRIVE_3); // enable XT2
+ UCSCTL6 |= (xtdrive); // Set XT2Drive
+
+ while (SFRIFG1 & OFIFG) { // check OFIFG fault flag
+ UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG); // Clear OSC flaut Flags
+ SFRIFG1 &= ~OFIFG; // Clear OFIFG fault flag
+ }
+
+}
+
+//====================================================================
+/**
+ * Startup routine for XT2 with timeout counter
+ *
+*/
+uint16_t XT2_Start_Timeout(uint16_t xtdrive, uint16_t timeout)
+{
+ UCSCTL6 &= ~XT2OFF; // Set XT2 On
+ UCSCTL6 &= ~XT2DRIVE_3; // enable XT2
+ UCSCTL6 |= (xtdrive); // Set XT2Drive
+
+ while ((SFRIFG1 & OFIFG) && timeout--){ // check OFIFG fault flag
+ UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG); // Clear OSC flaut Flags
+ SFRIFG1 &= ~OFIFG; // Clear OFIFG fault flag
+ }
+ if (timeout)
+ return (UCS_STATUS_OK);
+ else
+ return (UCS_STATUS_ERROR);
+}
+
+//====================================================================
+/**
+ * Use XT2 in Bypasss mode
+ *
+*/
+void XT2_Bypass(void)
+{
+#ifdef XT2BYPASS // on devices without XT2 this function will be empty
+ UCSCTL6 |= XT2BYPASS;
+
+ while (SFRIFG1 & OFIFG) { // check OFIFG fault flag
+ UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG); // Clear OSC flaut Flags
+ SFRIFG1 &= ~OFIFG; // Clear OFIFG fault flag
+ }
+#endif
+}
+
+//====================================================================
+/**
+ * Initializes FLL of the UCS and wait till settled
+ *
+ * \param fsystem required system frequency (MCLK) in kHz
+ * \param ratio ratio between MCLK and FLLREFCLK
+ */
+void Init_FLL_Settle(uint16_t fsystem, uint16_t ratio)
+{
+ volatile uint16_t x = ratio * 32;
+ // save actual state of FLL loop control
+ uint16_t globalInterruptState = __get_SR_register() & SCG0;
+
+ __bic_SR_register(SCG0); // Enable FLL loop control
+
+ Init_FLL(fsystem, ratio);
+
+ while(x--)
+ {
+ __delay_cycles(30);
+ }
+
+ __bis_SR_register(globalInterruptState); // restore previous state
+
+}
+
+//====================================================================
+/**
+ * Initializes FLL of the UCS
+ *
+ * \param fsystem required system frequency (MCLK) in kHz
+ * \param ratio ratio between fsystem and FLLREFCLK
+ */
+static void Init_FLL(uint16_t fsystem, uint16_t ratio)
+{
+ uint16_t d, dco_div_bits;
+ uint16_t mode = 0;
+
+ d = ratio;
+ dco_div_bits = FLLD__2; // Have at least a divider of 2
+ if (fsystem > 16000){
+ d >>= 1 ;
+ mode = 1;
+ }
+ else
+ fsystem <<= 1; // fsystem = fsystem * 2
+
+ while (d > 512)
+ {
+ dco_div_bits = dco_div_bits + FLLD0; // set next higher div level
+ d >>= 1;
+ }
+
+ UCSCTL0 = 0x000; // Set DCO to lowest Tap
+
+ UCSCTL2 &= ~(0x3FF); // Reset FN bits
+ UCSCTL2 = dco_div_bits | (d - 1);
+
+ if (fsystem <= 630) // fsystem < 0.63MHz
+ UCSCTL1= DCORSEL_0 ;
+ else if (fsystem < 1250) // 0.63MHz < fsystem < 1.25MHz
+ UCSCTL1= DCORSEL_1 ;
+ else if (fsystem < 2500) // 1.25MHz < fsystem < 2.5MHz
+ UCSCTL1= DCORSEL_2 ;
+ else if (fsystem < 5000) // 2.5MHz < fsystem < 5MHz
+ UCSCTL1= DCORSEL_3 ;
+ else if (fsystem < 10000) // 5MHz < fsystem < 10MHz
+ UCSCTL1= DCORSEL_4 ;
+ else if (fsystem < 20000) // 10MHz < fsystem < 20MHz
+ UCSCTL1= DCORSEL_5 ;
+ else if (fsystem < 40000) // 20MHz < fsystem < 40MHz
+ UCSCTL1= DCORSEL_6 ;
+ else
+ UCSCTL1= DCORSEL_7 ;
+
+ while (SFRIFG1 & OFIFG) { // check OFIFG fault flag
+ UCSCTL7 &= ~(DCOFFG+XT1LFOFFG+XT1HFOFFG+XT2OFFG); // Clear OSC flaut Flags
+ SFRIFG1 &= ~OFIFG; // Clear OFIFG fault flag
+ }
+
+ if (mode == 1) // fsystem > 16000
+ SELECT_MCLK_SMCLK(SELM__DCOCLK + SELS__DCOCLK); // select DCOCLK
+ else
+ SELECT_MCLK_SMCLK(SELM__DCOCLKDIV + SELS__DCOCLKDIV); // selcet DCODIVCLK
+
+
+} // End of fll_init()
diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/F5XX_6XX_Core_Lib/hal_UCS.h b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/F5XX_6XX_Core_Lib/hal_UCS.h
new file mode 100644
index 000000000..d78aa5df6
--- /dev/null
+++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/F5XX_6XX_Core_Lib/hal_UCS.h
@@ -0,0 +1,143 @@
+//*******************************************************************************
+// Provides Functions to Initialize the UCS/FLL and clock sources
+// File: hal_ucs.c
+//
+// Texas Instruments
+//
+// Version 1.2
+// 11/24/09
+//
+// V1.0 Initial Version
+// V1.1 Added timeout function
+// V1.1 Added parameter for XTDrive
+//*******************************************************************************
+
+
+#ifndef __hal_UCS
+#define __hal_UCS
+
+#include
+#include "hal_macros.h"
+
+/*************************************************************************
+* MACROS
+**************************************************************************/
+
+/* Select source for FLLREF e.g. SELECT_FLLREF(SELREF__XT1CLK) */
+#define SELECT_FLLREF(source) st(UCSCTL3 = (UCSCTL3 & ~(SELREF_7)) | (source);)
+/* Select source for ACLK e.g. SELECT_ACLK(SELA__XT1CLK) */
+#define SELECT_ACLK(source) st(UCSCTL4 = (UCSCTL4 & ~(SELA_7)) | (source);)
+/* Select source for MCLK e.g. SELECT_MCLK(SELM__XT2CLK) */
+#define SELECT_MCLK(source) st(UCSCTL4 = (UCSCTL4 & ~(SELM_7)) | (source);)
+/* Select source for SMCLK e.g. SELECT_SMCLK(SELS__XT2CLK) */
+#define SELECT_SMCLK(source) st(UCSCTL4 = (UCSCTL4 & ~(SELS_7)) | (source);)
+/* Select source for MCLK and SMCLK e.g. SELECT_MCLK_SMCLK(SELM__DCOCLK + SELS__DCOCLK) */
+#define SELECT_MCLK_SMCLK(sources) st(UCSCTL4 = (UCSCTL4 & ~(SELM_7 + SELS_7)) | (sources);)
+
+/* set ACLK/x */
+#define ACLK_DIV(x) st(UCSCTL5 = (UCSCTL5 & ~(DIVA_7)) | (DIVA__##x);)
+/* set MCLK/x */
+#define MCLK_DIV(x) st(UCSCTL5 = (UCSCTL5 & ~(DIVM_7)) | (DIVM__##x);)
+/* set SMCLK/x */
+#define SMCLK_DIV(x) st(UCSCTL5 = (UCSCTL5 & ~(DIVS_7)) | (DIVS__##x);)
+/* Select divider for FLLREF e.g. SELECT_FLLREFDIV(2) */
+#define SELECT_FLLREFDIV(x) st(UCSCTL3 = (UCSCTL3 & ~(FLLREFDIV_7))|(FLLREFDIV__##x);)
+
+//************************************************************************
+// Defines
+//************************************************************************
+
+#define UCS_STATUS_OK 0
+#define UCS_STATUS_ERROR 1
+
+//====================================================================
+/**
+ * Startup routine for 32kHz Cristal on LFXT1
+ *
+ * \param xtdrive: Bits defining the LFXT drive mode after startup
+ *
+*/
+extern void LFXT_Start(uint16_t xtdrive);
+
+//====================================================================
+/**
+ * Startup routine for 32kHz Cristal on LFXT1 with timeout counter
+ *
+ * \param xtdrive: Bits defining the LFXT drive mode after startup
+ * \param timeout: value for the timeout counter
+ *
+*/
+extern uint16_t LFXT_Start_Timeout(uint16_t xtdrive, uint16_t timeout);
+
+//====================================================================
+/**
+ * Startup routine for XT1
+ *
+ * \param xtdrive: Bits defining the XT drive mode
+ *
+*/
+extern void XT1_Start(uint16_t xtdrive);
+
+//====================================================================
+/**
+ * Startup routine for XT1 with timeout counter
+ *
+ * \param xtdrive: Bits defining the XT drive mode
+ * \param timeout: value for the timeout counter
+ *
+*/
+extern uint16_t XT1_Start_Timeout(uint16_t xtdrive, uint16_t timeout);
+
+//====================================================================
+/**
+ * Use XT1 in Bypasss mode
+ *
+*/
+extern void XT1_Bypass(void);
+
+//====================================================================
+/**
+ * Startup routine for XT2
+ *
+ * \param xtdrive: Bits defining the XT drive mode
+ *
+*/
+extern void XT2_Start(uint16_t xtdrive);
+
+//====================================================================
+/**
+ * Startup routine for XT2 with timeout counter
+ *
+ * \param xtdrive: Bits defining the XT drive mode
+ * \param timeout: value for the timeout counter
+ *
+*/
+extern uint16_t XT2_Start_Timeout(uint16_t xtdrive, uint16_t timeout);
+
+//====================================================================
+/**
+ * Use XT2 in Bypasss mode for MCLK
+ *
+*/
+extern void XT2_Bypass(void);
+
+//====================================================================
+/**
+ * Initializes FLL of the UCS and wait till settled
+ *
+ * \param fsystem required system frequency (MCLK) in kHz
+ * \param ratio ratio between fsystem and FLLREFCLK
+ */
+extern void Init_FLL_Settle(uint16_t fsystem, uint16_t ratio);
+
+
+//====================================================================
+/**
+ * Initializes FLL of the UCS
+ *
+ * \param fsystem required system frequency (MCLK) in kHz
+ * \param ratio ratio between fsystem and FLLREFCLK
+ */
+static void Init_FLL(uint16_t fsystem, uint16_t ratio);
+
+#endif /* __hal_UCS */
diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/F5XX_6XX_Core_Lib/hal_macros.h b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/F5XX_6XX_Core_Lib/hal_macros.h
new file mode 100644
index 000000000..4eec43a1d
--- /dev/null
+++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/F5XX_6XX_Core_Lib/hal_macros.h
@@ -0,0 +1,4 @@
+/*
+ * This macro is for use by other macros to form a fully valid C statement.
+ */
+#define st(x) do { x } while (__LINE__ == -1)
diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/FreeRTOSConfig.h b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/FreeRTOSConfig.h
new file mode 100644
index 000000000..b66c9b28a
--- /dev/null
+++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/FreeRTOSConfig.h
@@ -0,0 +1,123 @@
+/*
+ FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd.
+
+ ***************************************************************************
+ * *
+ * If you are: *
+ * *
+ * + New to FreeRTOS, *
+ * + Wanting to learn FreeRTOS or multitasking in general quickly *
+ * + Looking for basic training, *
+ * + Wanting to improve your FreeRTOS skills and productivity *
+ * *
+ * then take a look at the FreeRTOS books - available as PDF or paperback *
+ * *
+ * "Using the FreeRTOS Real Time Kernel - a Practical Guide" *
+ * http://www.FreeRTOS.org/Documentation *
+ * *
+ * A pdf reference manual is also available. Both are usually delivered *
+ * to your inbox within 20 minutes to two hours when purchased between 8am *
+ * and 8pm GMT (although please allow up to 24 hours in case of *
+ * exceptional circumstances). Thank you for your support! *
+ * *
+ ***************************************************************************
+
+ This file is part of the FreeRTOS distribution.
+
+ FreeRTOS is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License (version 2) as published by the
+ Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
+ ***NOTE*** The exception to the GPL is included to allow you to distribute
+ a combined work that includes FreeRTOS without being obliged to provide the
+ source code for proprietary components outside of the FreeRTOS kernel.
+ FreeRTOS is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ more details. You should have received a copy of the GNU General Public
+ License and the FreeRTOS license exception along with FreeRTOS; if not it
+ can be viewed here: http://www.freertos.org/a00114.html and also obtained
+ by writing to Richard Barry, contact details for whom are available on the
+ FreeRTOS WEB site.
+
+ 1 tab == 4 spaces!
+
+ http://www.FreeRTOS.org - Documentation, latest information, license and
+ contact details.
+
+ http://www.SafeRTOS.com - A version that is certified for use in safety
+ critical systems.
+
+ http://www.OpenRTOS.com - Commercial support, development, porting,
+ licensing and training services.
+*/
+
+#ifndef FREERTOS_CONFIG_H
+#define FREERTOS_CONFIG_H
+
+/*-----------------------------------------------------------
+ * Application specific definitions.
+ *
+ * These definitions should be adjusted for your particular hardware and
+ * application requirements.
+ *
+ * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
+ * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
+ *
+ * See http://www.freertos.org/a00110.html.
+ *----------------------------------------------------------*/
+
+#define configUSE_PREEMPTION 1
+#define configUSE_IDLE_HOOK 1
+#define configUSE_TICK_HOOK 1
+#define configCPU_CLOCK_HZ ( 16000000UL )
+#define configTICK_RATE_HZ ( ( portTickType ) 1000 )
+#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 )
+#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 70 )
+#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 9 * 1024 ) )
+#define configMAX_TASK_NAME_LEN ( 10 )
+#define configUSE_TRACE_FACILITY 0
+#define configUSE_16_BIT_TICKS 0
+#define configIDLE_SHOULD_YIELD 1
+#define configUSE_MUTEXES 1
+#define configQUEUE_REGISTRY_SIZE 5
+#define configGENERATE_RUN_TIME_STATS 0
+#define configCHECK_FOR_STACK_OVERFLOW 2
+#define configUSE_RECURSIVE_MUTEXES 0
+#define configUSE_MALLOC_FAILED_HOOK 1
+#define configUSE_APPLICATION_TASK_TAG 0
+
+/* Co-routine definitions. */
+#define configUSE_CO_ROUTINES 0
+#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
+
+/* Set the following definitions to 1 to include the API function, or zero
+to exclude the API function. */
+#define INCLUDE_vTaskPrioritySet 1
+#define INCLUDE_uxTaskPriorityGet 1
+#define INCLUDE_vTaskDelete 0
+#define INCLUDE_vTaskCleanUpResources 0
+#define INCLUDE_vTaskSuspend 1
+#define INCLUDE_vTaskDelayUntil 1
+#define INCLUDE_vTaskDelay 1
+
+/* The MSP430X port uses a callback function to configure its tick interrupt.
+This allows the application to choose the tick interrupt source.
+configTICK_INTERRUPT_VECTOR must also be set in FreeRTOSConfig.h to the correct
+interrupt vector for the chosen tick interrupt source. This implementation of
+vApplicationSetupTimerInterrupt() generates the tick from timer A0, so in this
+case configTICK_INTERRUPT_VECTOR is set to TIMER0_A0_VECTOR. */
+#define configTICK_INTERRUPT_VECTOR TIMER0_A0_VECTOR
+
+/* Prevent the following definitions being included when FreeRTOSConfig.h
+is included from an asm file. */
+#ifdef __ICC430__
+ extern void vConfigureTimerForRunTimeStats( void );
+ extern inline unsigned long ulGetRunTimeStatsTime( void );
+ extern volatile unsigned long ulStatsOverflowCount;
+#endif /* __ICCARM__ */
+
+//#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() vConfigureTimerForRunTimeStats()
+//#define portGET_RUN_TIME_COUNTER_VALUE() ulGetRunTimeStatsTime()
+
+#endif /* FREERTOS_CONFIG_H */
+
diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_MSP-EXP430F5438.h b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_MSP-EXP430F5438.h
new file mode 100644
index 000000000..c1baa94ff
--- /dev/null
+++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_MSP-EXP430F5438.h
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ Filename: hal_MSP-EXP430F5438.h
+
+ Copyright 2010 Texas Instruments, Inc.
+
+This is the master header file and also the only necessary file to be included
+in order to use MSP-EXP430F5438 HAL.
+***************************************************************************/
+#ifndef HAL_MSP_EXP430F5438_H
+#define HAL_MSP_EXP430F5438_H
+
+#include "msp430.h"
+
+//#include "hal_PMM.h"
+#include "hal_UCS.h"
+
+#include "hal_lcd.h"
+#include "hal_buttons.h"
+//#include "hal_adc.h"
+#include "hal_board.h"
+//#include "hal_usb.h"
+#include "hal_buttons.h"
+//#include "hal_rf.h"
+//#include "hal_rtc.h"
+//#include "hal_tlv.h"
+
+#endif /* HAL_MSP_EXP430F5438_H */
diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_board.c b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_board.c
new file mode 100644
index 000000000..f44d7409a
--- /dev/null
+++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_board.c
@@ -0,0 +1,68 @@
+/**
+ * @file hal_board.c
+ *
+ * Copyright 2010 Texas Instruments, Inc.
+******************************************************************************/
+#include "msp430.h"
+#include "hal_MSP-EXP430F5438.h"
+
+/**********************************************************************//**
+ * @brief Initializes ACLK, MCLK, SMCLK outputs on P11.0, P11.1,
+ * and P11.2, respectively.
+ *
+ * @param none
+ *
+ * @return none
+ *************************************************************************/
+void halBoardOutputSystemClock(void) //outputs clock to testpoints
+{
+ CLK_PORT_DIR |= 0x07;
+ CLK_PORT_SEL |= 0x07;
+}
+
+/**********************************************************************//**
+ * @brief Stops the output of ACLK, MCLK, SMCLK on P11.0, P11.1, and P11.2.
+ *
+ * @param none
+ *
+ * @return none
+ *************************************************************************/
+void halBoardStopOutputSystemClock(void)
+{
+ CLK_PORT_OUT &= ~0x07;
+ CLK_PORT_DIR |= 0x07;
+ CLK_PORT_SEL &= ~0x07;
+}
+
+/**********************************************************************//**
+ * @brief Initializes all GPIO configurations.
+ *
+ * @param none
+ *
+ * @return none
+ *************************************************************************/
+void halBoardInit(void)
+{
+ //Tie unused ports
+ PAOUT = 0;
+ PADIR = 0xFFFF;
+ PASEL = 0;
+ PBOUT = 0;
+ PBDIR = 0xFFFF;
+ PBSEL = 0;
+ PCOUT = 0;
+ PCDIR = 0xFFFF;
+ PCSEL = 0;
+ PDOUT = 0;
+ PDDIR = 0xFFFF;
+ PDSEL = 0x0003;
+ PEOUT = 0;
+ PEDIR = 0xFEFF; // P10.0 to USB RST pin,
+ // ...if enabled with J5
+ PESEL = 0;
+ P11OUT = 0;
+ P11DIR = 0xFF;
+ PJOUT = 0;
+ PJDIR = 0xFF;
+ P11SEL = 0;
+}
diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_board.h b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_board.h
new file mode 100644
index 000000000..603c72836
--- /dev/null
+++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_board.h
@@ -0,0 +1,31 @@
+/**********************************************************************//**
+ Filename: hal_board.h
+
+ Copyright 2010 Texas Instruments, Inc.
+***************************************************************************/
+#ifndef HAL_BOARD_H
+#define HAL_BOARD_H
+
+#define LED_PORT_DIR P1DIR
+#define LED_PORT_OUT P1OUT
+#define LED_1 BIT0
+#define LED_2 BIT1
+
+#define CLK_PORT_DIR P11DIR //outputs clocks to testpoints
+#define CLK_PORT_OUT P11OUT
+#define CLK_PORT_SEL P11SEL
+
+/*----------------------------------------------------------------
+ * Function Prototypes
+ *----------------------------------------------------------------
+ */
+static void halBoardGetSystemClockSettings(unsigned char systemClockSpeed,
+ unsigned char *setDcoRange,
+ unsigned char *setVCore,
+ unsigned int *setMultiplier);
+
+extern void halBoardOutputSystemClock(void);
+extern void halBoardStopOutputSystemClock(void);
+extern void halBoardInit(void);
+
+#endif /* HAL_BOARD_H */
diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_buttons.c b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_buttons.c
new file mode 100644
index 000000000..42c8f0ec5
--- /dev/null
+++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_buttons.c
@@ -0,0 +1,76 @@
+/**
+ * @file hal_buttons.c
+ *
+ * Copyright 2010 Texas Instruments, Inc.
+***************************************************************************/
+#include "msp430.h"
+#include "hal_MSP-EXP430F5438.h"
+
+/**********************************************************************//**
+ * @brief Initializes the GPIO ports to act as buttons.
+ *
+ * @param buttonsMask The mask that specifies the button pins.
+ *
+ * @return none
+ *************************************************************************/
+void halButtonsInit(unsigned char buttonsMask)
+{
+ BUTTON_PORT_OUT |= buttonsMask;
+ BUTTON_PORT_DIR &= ~buttonsMask;
+ BUTTON_PORT_REN |= buttonsMask;
+ BUTTON_PORT_SEL &= ~buttonsMask;
+}
+
+/**********************************************************************//**
+ * @brief Returns LOW for the buttons pressed.
+ *
+ * @param none
+ *
+ * @return The buttons that have been pressed, identified by a bit = 0.
+ *************************************************************************/
+unsigned char halButtonsPressed(void)
+{
+ unsigned char value;
+ value = BUTTON_PORT_IN;
+ return (0xFF - value); //Low==ButtonPressed
+}
+
+/**********************************************************************//**
+ * @brief Enables button interrupt(s) with low to high transitions.
+ *
+ * @param buttonIntEnableMask The button pin(s) for which the interrupt(s)
+ * should be enabled.
+ *
+ * @return none
+ *************************************************************************/
+void halButtonsInterruptEnable(unsigned char buttonIntEnableMask)
+{
+ BUTTON_PORT_IES &= ~buttonIntEnableMask;
+ BUTTON_PORT_IFG &= ~buttonIntEnableMask;
+ BUTTON_PORT_IE |= buttonIntEnableMask;
+}
+
+/**********************************************************************//**
+ * @brief Disables button interrupts
+ *
+ * @param buttonIntEnableMask The button pin(s) for which the interrupt(s)
+ * should be disabled.
+ *
+ * @return none
+ *************************************************************************/
+void halButtonsInterruptDisable(unsigned char buttonIntEnableMask)
+{
+ BUTTON_PORT_IE &= ~buttonIntEnableMask;
+}
+
+/**********************************************************************//**
+ * @brief Clears the button GPIO settings, disables the buttons.
+ *
+ * @param none
+ *************************************************************************/
+void halButtonsShutDown()
+{
+ //All output, outputting 0s
+ BUTTON_PORT_OUT &= ~(BUTTON_ALL);
+ BUTTON_PORT_DIR |= BUTTON_ALL;
+}
diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_buttons.h b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_buttons.h
new file mode 100644
index 000000000..ffe691ae9
--- /dev/null
+++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_buttons.h
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ Filename: hal_buttons.h
+
+ Copyright 2010 Texas Instruments, Inc.
+***************************************************************************/
+#ifndef HAL_BUTTONS_H
+#define HAL_BUTTONS_H
+
+#define BUTTON_PORT_DIR P2DIR
+#define BUTTON_PORT_SEL P2SEL
+#define BUTTON_PORT_OUT P2OUT
+#define BUTTON_PORT_REN P2REN
+#define BUTTON_PORT_IE P2IE
+#define BUTTON_PORT_IES P2IES
+#define BUTTON_PORT_IFG P2IFG
+#define BUTTON_PORT_IN P2IN
+
+#define BUTTON_SELECT BIT3
+#define BUTTON_DOWN BIT5
+#define BUTTON_UP BIT4
+#define BUTTON_RIGHT BIT2
+#define BUTTON_LEFT BIT1
+#define BUTTON_S1 BIT6
+#define BUTTON_S2 BIT7
+#define BUTTON_ALL 0xFE
+
+extern volatile unsigned char buttonsPressed;
+
+/*-------------------------------------------------------------
+ * Function Prototypes
+ * ------------------------------------------------------------*/
+extern void halButtonsInit(unsigned char buttonsMask);
+extern unsigned char halButtonsPressed(void);
+extern void halButtonsInterruptEnable(unsigned char buttonIntEnableMask);
+extern void halButtonsInterruptDisable(unsigned char buttonIntEnableMask);
+extern void halButtonsShutDown();
+
+#endif /* HAL_BUTTONS_H */
diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_lcd.c b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_lcd.c
new file mode 100644
index 000000000..f589c23dd
--- /dev/null
+++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_lcd.c
@@ -0,0 +1,1122 @@
+/**
+ * @file hal_lcd.c
+ *
+ * Copyright 2010 Texas Instruments, Inc.
+***************************************************************************/
+
+#include "msp430.h"
+#include "hal_MSP-EXP430F5438.h"
+#include "hal_lcd_fonts.h"
+
+unsigned char LcdInitMacro[]={
+ 0x74,0x00,0x00,0x76,0x00,0x01, // R00 start oscillation
+ 0x74,0x00,0x01,0x76,0x00,0x0D, // R01 driver output control
+ 0x74,0x00,0x02,0x76,0x00,0x4C, // R02 LCD - driving waveform control
+ 0x74,0x00,0x03,0x76,0x12,0x14, // R03 Power control
+ 0x74,0x00,0x04,0x76,0x04,0x66, // R04 Contrast control
+ 0x74,0x00,0x05,0x76,0x00,0x10, // R05 Entry mode
+ 0x74,0x00,0x06,0x76,0x00,0x00, // R06 RAM data write mask
+ 0x74,0x00,0x07,0x76,0x00,0x15, // R07 Display control
+ 0x74,0x00,0x08,0x76,0x00,0x03, // R08 Cursor Control
+ 0x74,0x00,0x09,0x76,0x00,0x00, // R09 RAM data write mask
+ 0x74,0x00,0x0A,0x76,0x00,0x15, // R0A
+ 0x74,0x00,0x0B,0x76,0x00,0x03, // R0B Horizontal Cursor Position
+ 0x74,0x00,0x0C,0x76,0x00,0x03, // R0C Vertical Cursor Position
+ 0x74,0x00,0x0D,0x76,0x00,0x00, // R0D
+ 0x74,0x00,0x0E,0x76,0x00,0x15, // R0E
+ 0x74,0x00,0x0F,0x76,0x00,0x03, // R0F
+ 0x74,0x00,0x10,0x76,0x00,0x15, // R0E
+ 0x74,0x00,0x11,0x76,0x00,0x03, // R0F
+};
+
+unsigned char Read_Block_Address_Macro[]= {0x74,0x00,0x12,0x77,0x00,0x00};
+unsigned char Draw_Block_Value_Macro[]={0x74,0x00,0x12,0x76,0xFF,0xFF};
+unsigned char Draw_Block_Address_Macro[]={0x74,0x00,0x11,0x76,0x00,0x00};
+
+unsigned int LcdAddress = 0, LcdTableAddress = 0;
+unsigned char contrast = 0x66;
+unsigned char backlight = 8;
+int LCD_MEM[110*17]; //This array stores a copy of all data on the LCD
+ //screen. If memory is an issue though, this array
+ //can be eliminated and the halLcdReadBlock()
+ //command can be used instead whenever you are
+ //manipulating the currently displayed data.
+
+/**********************************************************************//**
+ * @brief Sends 3+3 bytes of data to the LCD using the format specified
+ * by the LCD Guide.
+ *
+ * @param Data[] Data array for transmission
+ *
+ * @return none
+ *************************************************************************/
+void halLcdSendCommand(unsigned char Data[])
+{
+ unsigned char i;
+
+ LCD_CS_RST_OUT &= ~LCD_CS_PIN; //CS = 0 --> Start Transfer
+ for ( i = 0; i < 6; i++ )
+ {
+ while (!(UCB2IFG & UCTXIFG)); // Wait for TXIFG
+ UCB2TXBUF = Data[i]; // Load data
+
+ if (i == 2) //Pull CS up after 3 bytes
+ {
+ while (UCB2STAT & UCBUSY);
+ LCD_CS_RST_OUT |= LCD_CS_PIN; //CS = 1 --> Stop Transfer
+ LCD_CS_RST_OUT &= ~LCD_CS_PIN; //CS = 0 --> Start Transfer
+ }
+ }
+ while (UCB2STAT & UCBUSY);
+ LCD_CS_RST_OUT |= LCD_CS_PIN; //CS = 1 --> Stop Transfer
+}
+
+/**********************************************************************//**
+ * @brief Initializes the USCI module, LCD device for communication.
+ *
+ * - Sets up the SPI2C Communication Module
+ * - Performs Hitachi LCD Initialization Procedure
+ *
+ * @param none
+ *
+ * @return none
+ *************************************************************************/
+void halLcdInit(void)
+{
+ volatile unsigned int i=0;
+
+ LCD_CS_RST_OUT |= LCD_CS_PIN | LCD_RESET_PIN ;
+ LCD_CS_RST_DIR |= LCD_CS_PIN | LCD_RESET_PIN ;
+
+ LCD_BACKLT_SEL |= LCD_BACKLIGHT_PIN;
+
+ LCD_CS_RST_OUT &= ~LCD_RESET_PIN; // Reset LCD
+ __delay_cycles(0x47FF); //Reset Pulse
+ LCD_CS_RST_OUT |= LCD_RESET_PIN;
+
+ // UCLK,MOSI setup, SOMI cleared
+ LCD_SPI_SEL |= LCD_MOSI_PIN + LCD_CLK_PIN;
+ LCD_SPI_SEL &= ~LCD_MISO_PIN;
+ LCD_SPI_DIR &= ~(LCD_MISO_PIN + LCD_MOSI_PIN); // Pin direction controlled by module,
+ // Set both pins to input as default
+
+ // Initialize the USCI_B2 module for SPI operation
+ UCB2CTL1 = UCSWRST; // Hold USCI in SW reset mode while configuring it
+ UCB2CTL0 = UCMST+UCSYNC+UCCKPL+UCMSB; // 3-pin, 8-bit SPI master
+ UCB2CTL1 |= UCSSEL_2; // SMCLK
+ UCB2BR0 = 4; // Note: Do not exceed D/S spec for UCLK!
+ UCB2BR1 = 0;
+ UCB2CTL1 &= ~UCSWRST; // Release USCI state machine
+ UCB2IFG &= ~UCRXIFG;
+
+ // Wake-up the LCD as per datasheet specifications
+ halLcdActive();
+
+ // LCD Initialization Routine Using Predefined Macros
+ halLcdSendCommand(&LcdInitMacro[ 1 * 6 ]);
+ halLcdSendCommand(&LcdInitMacro[ 2 * 6 ]);
+ halLcdSendCommand(&LcdInitMacro[ 4 * 6 ]);
+ halLcdSendCommand(&LcdInitMacro[ 5 * 6 ]);
+ halLcdSendCommand(&LcdInitMacro[ 6 * 6 ]);
+ halLcdSendCommand(&LcdInitMacro[ 7 * 6 ]);
+
+}
+
+/**********************************************************************//**
+ * @brief Shuts down the LCD display and hdisables the USCI communication.
+ *
+ * @param none
+ *
+ * @return none
+ *************************************************************************/
+void halLcdShutDown(void)
+{
+ halLcdStandby();
+
+ LCD_CS_RST_DIR |= LCD_CS_PIN | LCD_RESET_PIN ;
+ LCD_CS_RST_OUT &= ~(LCD_CS_PIN | LCD_RESET_PIN );
+ LCD_CS_RST_OUT &= ~LCD_RESET_PIN;
+
+ LCD_SPI_SEL &= ~(LCD_MOSI_PIN + LCD_CLK_PIN + LCD_MISO_PIN);
+ LCD_CS_RST_DIR |= LCD_MOSI_PIN + LCD_CLK_PIN + LCD_MISO_PIN;
+ LCD_CS_RST_OUT &= ~(LCD_MOSI_PIN + LCD_CLK_PIN + LCD_MISO_PIN);
+
+ UCB2CTL0 = UCSWRST;
+}
+
+/**********************************************************************//**
+ * @brief Initializes the LCD backlight PWM signal.
+ *
+ * @param none
+ *
+ * @return none
+ *
+ *************************************************************************/
+void halLcdBackLightInit(void)
+{
+ LCD_BACKLT_DIR |= LCD_BACKLIGHT_PIN;
+ LCD_BACKLT_OUT |= LCD_BACKLIGHT_PIN;
+ LCD_BACKLT_SEL |= LCD_BACKLIGHT_PIN;
+
+ TA0CCTL3 = OUTMOD_7;
+ TA0CCR3 = TA0CCR0 >> 1 ;
+ backlight = 8;
+
+ TA0CCR0 = 400;
+ TA0CTL = TASSEL_2+MC_1;
+}
+
+/**********************************************************************//**
+ * @brief Get function for the backlight PWM's duty cycle.
+ *
+ * @param none
+ *
+ * @return backlight One of the the 17 possible settings - valued 0 to 16.
+ *
+ *************************************************************************/
+unsigned int halLcdGetBackLight(void)
+{
+ return backlight;
+}
+
+/**********************************************************************//**
+ * @brief Set function for the backlight PWM's duty cycle
+ *
+ * @param BackLightLevel The target backlight duty cycle - valued 0 to 16.
+ *
+ * @return none
+ *************************************************************************/
+void halLcdSetBackLight(unsigned char BackLightLevel)
+{
+ unsigned int dutyCycle = 0, i, dummy;
+
+ if (BackLightLevel > 0)
+ {
+ TA0CCTL3 = OUTMOD_7;
+ dummy = (TA0CCR0 >> 4);
+
+ for (i = 0; i < BackLightLevel; i++)
+ dutyCycle += dummy;
+
+ TA0CCR3 = dutyCycle;
+
+ // If the backlight was previously turned off, turn it on.
+ if (!backlight)
+ TA0CTL |= MC0;
+ }
+ else
+ {
+ TA0CCTL3 = 0;
+ TA0CTL &= ~MC0;
+ }
+ backlight = BackLightLevel;
+}
+
+/**********************************************************************//**
+ * @brief Turns off the backlight.
+ *
+ * Clears the respective GPIO and timer settings.
+ *
+ * @param none
+ *
+ * @return none
+ *************************************************************************/
+void halLcdShutDownBackLight(void)
+{
+ LCD_BACKLT_DIR |= LCD_BACKLIGHT_PIN;
+ LCD_BACKLT_OUT &= ~(LCD_BACKLIGHT_PIN);
+ LCD_BACKLT_SEL &= ~LCD_BACKLIGHT_PIN;
+
+ TA0CCTL3 = 0;
+ TA0CTL = 0;
+
+ backlight = 0;
+}
+
+/**********************************************************************//**
+ * @brief Set function for the contrast level of the LCD.
+ *
+ * @param ContrastLevel The target contrast level
+ *
+ * @return none
+ *************************************************************************/
+void halLcdSetContrast(unsigned char ContrastLevel)
+{
+ if (ContrastLevel > 127) ContrastLevel = 127;
+ if (ContrastLevel < 70) ContrastLevel = 70;
+ LcdInitMacro[ 0x04 * 6 + 5 ] = ContrastLevel;
+ halLcdSendCommand(&LcdInitMacro[ 0x04 * 6 ]);
+}
+
+/**********************************************************************//**
+ * @brief Get function for the contrast level of the LCD.
+ *
+ * @param none
+ *
+ * @return ContrastLevel The LCD constrast level
+ *************************************************************************/
+unsigned char halLcdGetContrast(void)
+{
+ return LcdInitMacro[ 0x04 * 6 + 5 ] ;
+}
+
+/**********************************************************************//**
+ * @brief Turns the LCD cursor on at the current text position.
+ *
+ * @param none
+ *
+ * @return none
+ *************************************************************************/
+void halLcdCursor(void)
+{
+ LcdInitMacro[ 8 * 6 + 5 ] ^= BIT2;
+ halLcdSendCommand(&LcdInitMacro[ 8 * 6 ]);
+
+ LcdInitMacro[ 0x0B * 6 + 5 ] = ((LcdAddress & 0x1F) << 3) ;
+ LcdInitMacro[ 0x0B * 6 + 4 ] = ( (LcdAddress & 0x1F) << 3 ) + 3;
+ LcdInitMacro[ 0x0C * 6 + 5 ] = (LcdAddress >> 5);
+ LcdInitMacro[ 0x0C * 6 + 4 ] = (LcdAddress >> 5) + 7;
+ halLcdSendCommand(&LcdInitMacro[ 0x0B * 6 ]);
+ halLcdSendCommand(&LcdInitMacro[ 0x0C * 6 ]);
+
+ halLcdSetAddress(LcdAddress);
+}
+
+/**********************************************************************//**
+ * @brief Turns off the LCD cursor.
+ *
+ * @param none
+ *
+ * @return none
+ *************************************************************************/
+void halLcdCursorOff(void)
+{
+ LcdInitMacro[ 8 * 6 + 5 ] &= ~BIT2;
+ halLcdSendCommand(&LcdInitMacro[ 8 * 6 ]);
+}
+
+/**********************************************************************//**
+ * @brief Inverts the grayscale values of the LCD display (Black <> white).
+ *
+ * @param none
+ *
+ * @return none
+ *************************************************************************/
+void halLcdReverse(void)
+{
+ LcdInitMacro[ 7 * 6 + 5 ] ^= BIT1;
+ halLcdSendCommand(&LcdInitMacro[ 7 * 6 ]);
+}
+
+/**********************************************************************//**
+ * @brief Sets the LCD in standby mode to reduce power consumption.
+ *
+ * @param none
+ *
+ * @return none
+ *************************************************************************/
+void halLcdStandby(void)
+{
+ LcdInitMacro[ 3 * 6 + 5 ] &= (~BIT3) & (~BIT2);
+ LcdInitMacro[ 3 * 6 + 5 ] |= BIT0;
+ halLcdSendCommand(&LcdInitMacro[ 3 * 6 ]);
+}
+
+/**********************************************************************//**
+ * @brief Puts the LCD into active mode.
+ *
+ * @param none
+ *
+ * @return none
+ *************************************************************************/
+void halLcdActive(void)
+{
+ halLcdSendCommand(LcdInitMacro); // R00 start oscillation
+
+ // Wait a minimum of 25ms after issuing "start oscillation"
+ // command (to accomodate for MCLK up to 25MHz)
+ __delay_cycles(250000);
+
+ LcdInitMacro[ 3 * 6 + 5 ] |= BIT3;
+ LcdInitMacro[ 3 * 6 + 5 ] &= ~BIT0;
+ halLcdSendCommand(&LcdInitMacro[ 3 * 6 ]); // R03 Power control
+}
+
+/**********************************************************************//**
+ * @brief Sets the pointer location in the LCD.
+ *
+ * - LcdAddress = Address
+ * - LcdTableAddress = Correct Address Row + Column
+ * = (Address / 0x20)* 17 + Column
+ *
+ * @param Address The target pointer location in the LCD.
+ *
+ * @return none
+ *************************************************************************/
+void halLcdSetAddress(int Address)
+{
+ int temp;
+
+ Draw_Block_Address_Macro[4] = Address >> 8;
+ Draw_Block_Address_Macro[5] = Address & 0xFF;
+ halLcdSendCommand(Draw_Block_Address_Macro);
+ LcdAddress = Address;
+ temp = Address >> 5; // Divided by 0x20
+ temp = temp + (temp << 4);
+ //Multiplied by (1+16) and added by the offset
+ LcdTableAddress = temp + (Address & 0x1F);
+}
+
+/**********************************************************************//**
+ * @brief Draws a block at the specified LCD address.
+ *
+ * A block is the smallest addressable memory on the LCD and is
+ * equivalent to 8 pixels, each of which is represented by 2 bits
+ * that represent a grayscale value between 00b and 11b.
+ *
+ * @param Address The address at which to draw the block.
+ *
+ * @param Value The value of the block
+ *
+ * @return none
+ *************************************************************************/
+void halLcdDrawBlock(unsigned int Address, unsigned int Value)
+{
+ halLcdSetAddress(Address);
+ halLcdDrawCurrentBlock(Value);
+}
+
+/**********************************************************************//**
+ * @brief Writes Value to LCD CGram and MSP430 internal LCD table.
+ *
+ * Also updates the LcdAddress and LcdTableAddress to the correct values.
+ *
+ * @param Value The value of the block to be written to the LCD.
+ *
+ * @return none
+ *************************************************************************/
+void halLcdDrawCurrentBlock(unsigned int Value)
+{
+ int temp;
+
+ Draw_Block_Value_Macro[4] = Value >> 8;
+ Draw_Block_Value_Macro[5] = Value & 0xFF;
+ LCD_MEM[ LcdTableAddress ] = Value;
+
+ halLcdSendCommand(Draw_Block_Value_Macro);
+
+ LcdAddress++;
+ temp = LcdAddress >> 5; // Divided by 0x20
+ temp = temp + (temp << 4);
+ // Multiplied by (1+16) and added by the offset
+ LcdTableAddress = temp + (LcdAddress & 0x1F);
+
+ // If LcdAddress gets off the right edge, move to next line
+ if ((LcdAddress & 0x1F) > 0x11)
+ halLcdSetAddress( (LcdAddress & 0xFFE0) + 0x20 );
+ if (LcdAddress == LCD_Size)
+ halLcdSetAddress( 0 );
+}
+
+/**********************************************************************//**
+ * @brief Returns the LCD CGRAM value at location Address.
+ *
+ * @param Address The address of the block to be read from the LCD.
+ *
+ * @return Value The value held at the specified address.
+ *************************************************************************/
+int halLcdReadBlock(unsigned int Address)
+{
+ int i = 0, Value = 0, ReadData[7];
+
+ halLcdSetAddress( Address );
+ halLcdSendCommand(Read_Block_Address_Macro);
+
+ LCD_CS_RST_OUT &= ~LCD_CS_PIN; // start transfer CS=0
+ UCB2TXBUF = 0x77; // Transmit first character 0x77
+
+ while (!(UCB2IFG & UCTXIFG));
+ while (UCB2STAT & UCBUSY);
+
+ //Read 5 dummies values and 2 valid address data
+ LCD_SPI_SEL &= ~LCD_MOSI_PIN; //Change SPI2C Dir
+ LCD_SPI_SEL |= LCD_MISO_PIN;
+
+ for (i = 0; i < 7; i ++ )
+ {
+ UCB2IFG &= ~UCRXIFG;
+ UCB2TXBUF = 1; // load dummy byte 1 for clk
+ while (!(UCB2IFG & UCRXIFG));
+ ReadData[i] = UCB2RXBUF;
+ }
+ LCD_CS_RST_OUT |= LCD_CS_PIN; // Stop Transfer CS = 1
+
+ LCD_SPI_SEL |= LCD_MOSI_PIN; //Change SPI2C Dir
+ LCD_SPI_SEL &= ~LCD_MISO_PIN;
+ LCD_CS_RST_DIR |= LCD_MOSI_PIN + LCD_CLK_PIN;
+ LCD_CS_RST_DIR &= ~LCD_MISO_PIN;
+
+ Value = (ReadData[5] << 8) + ReadData[6];
+ return Value;
+}
+
+/**********************************************************************//**
+ * @brief Draw a Pixel of grayscale at coordinate (x,y) to LCD
+ *
+ * @param x x-coordinate for grayscale value
+ *
+ * @param y y-coordinate for grayscale value
+ *
+ * @param GrayScale The intended grayscale value of the pixel - one of
+ * four possible settings.
+ *
+ * @return none
+ *************************************************************************/
+void halLcdPixel( int x, int y, unsigned char GrayScale)
+{
+ int Address, Value;
+ unsigned char offset;
+
+ //Each line increments by 0x20
+ if ( (x>=0 ) && (x=0) && (y> 3) ; //Narrow down to 8 possible pixels
+
+ Value = LCD_MEM[(y << 4)+ y + (x>>3)]; //y * 17 --> row. x>>3 --> column
+
+ offset = (x & 0x07) << 1; //3 LSBs = pos. within the 8 columns
+ Value &= ~ (3 << offset); //clear out the corresponding bits
+ Value |= GrayScale << offset; //set pixel to GrayScale level
+
+ halLcdDrawBlock( Address, Value );
+ }
+}
+
+/**********************************************************************//**
+ * @brief Clears entire LCD CGRAM as well as LCD_MEM.
+ *
+ * @param none
+ *
+ * @return none
+ *************************************************************************/
+void halLcdClearScreen(void)
+{
+ int i, j, k, Current_Location = 0;
+ halLcdSetAddress(0);
+
+ for (i=0; i < 110; i++)
+ {
+ //prepare to send image
+ LCD_CS_RST_OUT &= ~LCD_CS_PIN; //CS = 0 --> Start Transfer
+ for ( k = 0; k < 3; k++ )
+ {
+ while (!(UCB2IFG & UCTXIFG)); // Wait for TXIFG
+ UCB2TXBUF = Draw_Block_Value_Macro[k]; // Load data
+ }
+ while (UCB2STAT & UCBUSY);
+ LCD_CS_RST_OUT |= LCD_CS_PIN; //CS = 1 --> Stop Transfer
+ LCD_CS_RST_OUT &= ~LCD_CS_PIN; //CS = 0 --> Start Transfer
+ while (!(UCB2IFG & UCTXIFG)); // Wait for TXIFG
+ UCB2TXBUF = Draw_Block_Value_Macro[3]; // Load data
+
+ //send blank line
+ for (j=0; j < 17; j++)
+ {
+ LCD_MEM[ LcdTableAddress++ ] = 0x00;
+ while (!(UCB2IFG & UCTXIFG)); // Wait for TXIFG
+ UCB2TXBUF = 0x00; // Load data
+ while (!(UCB2IFG & UCTXIFG)); // Wait for TXIFG
+ UCB2TXBUF = 0x00; // Load data
+ }
+ //Clear the partially visible block at the edge of the screen
+ while (!(UCB2IFG & UCTXIFG)); // Wait for TXIFG
+ UCB2TXBUF = 0x00; // Load data
+ while (!(UCB2IFG & UCTXIFG)); // Wait for TXIFG
+ UCB2TXBUF = 0x00; // Load data
+ while (UCB2STAT & UCBUSY);
+ LCD_CS_RST_OUT |= LCD_CS_PIN; //CS = 1 --> Stop Transfer
+
+ Current_Location += 0x20;
+ halLcdSetAddress(Current_Location );
+ }
+
+ halLcdSetAddress(0);
+}
+
+/**********************************************************************//**
+ * @brief Loads an image of size = rows * columns, starting at the
+ * coordinate (x,y).
+ *
+ * @param Image[] The image to be loaded
+ *
+ * @param Rows The number of rows in the image. Size = Rows * Columns.
+ *
+ * @param Columns The number of columns in the image. Size = Rows * Columns.
+ *
+ * @param x x-coordinate of the image's starting location
+ *
+ * @param y y-coordinate of the image's starting location
+ *
+ * @return none
+ *************************************************************************/
+void halLcdImage(const unsigned int Image[], int Columns, int Rows, int x, int y)
+{
+ int i, CurrentLocation;
+
+ CurrentLocation = (y << 5) + (x >> 3);
+ halLcdSetAddress(CurrentLocation);
+ for (i=0; i < Rows; i++)
+ {
+ halLcdDrawCurrentLine(Image, Columns);
+ Image += Columns;
+ CurrentLocation += 0x20;
+ halLcdSetAddress(CurrentLocation);
+ }
+}
+
+/**********************************************************************//**
+ * @brief Writes Value to LCD CGram and MSP430 internal LCD table.
+ *
+ * Also updates the LcdAddress and LcdTableAddress to the correct values.
+ *
+ * @param *value Pointer to the line to be written to the LCD.
+ *
+ * @return none
+ *************************************************************************/
+void halLcdDrawCurrentLine(const unsigned int *value, int Columns)
+{
+ unsigned char i;
+
+ //prepare to send image
+ LCD_CS_RST_OUT &= ~LCD_CS_PIN; //CS = 0 --> Start Transfer
+ for ( i = 0; i < 3; i++ )
+ {
+ while (!(UCB2IFG & UCTXIFG)); // Wait for TXIFG
+ UCB2TXBUF = Draw_Block_Value_Macro[i]; // Load data
+ }
+ while (UCB2STAT & UCBUSY);
+ LCD_CS_RST_OUT |= LCD_CS_PIN; //CS = 1 --> Stop Transfer
+ LCD_CS_RST_OUT &= ~LCD_CS_PIN; //CS = 0 --> Start Transfer
+ while (!(UCB2IFG & UCTXIFG)); // Wait for TXIFG
+ UCB2TXBUF = Draw_Block_Value_Macro[3]; // Load data
+
+ //send the image
+ for ( i = 0; i < Columns; i++ )
+ {
+ // Make sure we are not writing outside LCD_MEM[]
+ if (LcdTableAddress >= sizeof(LCD_MEM)) {
+ break;
+ }
+ LCD_MEM[ LcdTableAddress++ ] = *value;
+ while (!(UCB2IFG & UCTXIFG)); // Wait for TXIFG
+ UCB2TXBUF = (*value) >> 8; // Load data
+ while (!(UCB2IFG & UCTXIFG)); // Wait for TXIFG
+ UCB2TXBUF = (*value++) & 0xFF; // Load data
+ }
+
+ while (UCB2STAT & UCBUSY);
+ LCD_CS_RST_OUT |= LCD_CS_PIN; //CS = 1 --> Stop Transfer
+}
+
+/**********************************************************************//**
+ * @brief Clears an image of size rows x columns starting at (x, y).
+ *
+ * @param Columns The size, in columns, of the image to be cleared.
+ *
+ * @param Rows The size, in rows, of the image to be cleared.
+ *
+ * @param x x-coordinate of the image to be cleared
+ *
+ * @param y y-coordinate of the image to be cleared
+ *
+ * @return none
+ *************************************************************************/
+void halLcdClearImage(int Columns, int Rows, int x, int y)
+{
+ int i,j,k, Current_Location;
+ Current_Location = (y << 5) + (x >> 3);
+ halLcdSetAddress( Current_Location );
+
+ for (i=0; i < Rows; i++)
+ {
+ //prepare to send image
+ LCD_CS_RST_OUT &= ~LCD_CS_PIN; //CS = 0 --> Start Transfer
+ for ( k = 0; k < 3; k++ )
+ {
+ while (!(UCB2IFG & UCTXIFG)); // Wait for TXIFG
+ UCB2TXBUF = Draw_Block_Value_Macro[k]; // Load data
+ }
+ while (UCB2STAT & UCBUSY);
+ LCD_CS_RST_OUT |= LCD_CS_PIN; //CS = 1 --> Stop Transfer
+ LCD_CS_RST_OUT &= ~LCD_CS_PIN; //CS = 0 --> Start Transfer
+ while (!(UCB2IFG & UCTXIFG)); // Wait for TXIFG
+ UCB2TXBUF = Draw_Block_Value_Macro[3]; // Load data
+
+ //send blank line
+ for (j=0; j < Columns; j++)
+ {
+ LCD_MEM[ LcdTableAddress++ ] = 0x00;
+ while (!(UCB2IFG & UCTXIFG)); // Wait for TXIFG
+ UCB2TXBUF = 0x00; // Load data
+ while (!(UCB2IFG & UCTXIFG)); // Wait for TXIFG
+ UCB2TXBUF = 0x00; // Load data
+ }
+ while (UCB2STAT & UCBUSY);
+ LCD_CS_RST_OUT |= LCD_CS_PIN; //CS = 1 --> Stop Transfer
+
+ Current_Location += 0x20;
+ halLcdSetAddress(Current_Location );
+ }
+}
+
+/**********************************************************************//**
+ * @brief Writes Value to LCD CGRAM. Pointers internal to the LCD
+ * are also updated.
+ *
+ * @param Value The value to be written to the current LCD pointer
+ *
+ * @return none
+ *************************************************************************/
+void halLcdDrawTextBlock(unsigned int Value)
+{
+ int temp;
+
+ Draw_Block_Value_Macro[4] = Value >> 8;
+ Draw_Block_Value_Macro[5] = Value & 0xFF;
+ LCD_MEM[ LcdTableAddress ] = Value;
+
+ halLcdSendCommand(Draw_Block_Value_Macro);
+
+ LcdAddress++;
+ temp = LcdAddress >> 5; // Divided by 0x20
+ temp = temp + (temp << 4);
+ //Multiplied by (1+16) and added by the offset
+ LcdTableAddress = temp + (LcdAddress & 0x1F);
+
+ // If LcdAddress gets off the right edge, move to next line
+ if ((LcdAddress & 0x1F) > 0x10)
+ halLcdSetAddress( (LcdAddress & 0xFFE0) + 0x20 );
+
+ if (LcdAddress >= LCD_Size)
+ halLcdSetAddress( 0 );
+}
+
+/**********************************************************************//**
+ * @brief Displays the string to the LCD starting at current location.
+ *
+ * Writes all the data to LCD_MEM first, then updates all corresponding
+ * LCD CGRAM locations at once, in a continuous fashion.
+ *
+ * @param String[] The string to be displayed on LCD.
+ *
+ * @param TextStyle Value that specifies whether the string is to be
+ * inverted or overwritten.
+ * - Invert = 0x01
+ * - Overwrite = 0x04
+ *
+ * @return none
+ *************************************************************************/
+void halLcdPrint( char String[], unsigned char TextStyle)
+{
+ int i, j, Counter=0, BlockValue;
+ int Address, LCD_MEM_Add, ActualAddress;
+ int temp;
+ char LookUpChar;
+
+ ActualAddress = LcdAddress;
+ Counter = LcdAddress & 0x1F;
+ i=0;
+
+ while (String[i]!=0) // Stop on null character
+ {
+ LookUpChar = fonts_lookup[String[i]];
+
+ for (j=0;j < FONT_HEIGHT ;j++)
+ {
+ Address = ActualAddress + j*0x20;
+ temp = Address >> 5;
+ temp += (temp <<4);
+
+ LCD_MEM_Add = temp + (Address & 0x1F);
+
+ BlockValue = LCD_MEM[ LCD_MEM_Add ];
+
+ if(TextStyle & GRAYSCALE_TEXT)
+ {
+ if (TextStyle & INVERT_TEXT)
+ if (TextStyle & OVERWRITE_TEXT)
+ BlockValue = 0xAAAA - GrayScale_fonts[LookUpChar*(FONT_HEIGHT+1) +j];
+ else
+ BlockValue |= 0xAAAA - GrayScale_fonts[LookUpChar*(FONT_HEIGHT+1) +j];
+ else
+ if (TextStyle & OVERWRITE_TEXT)
+ BlockValue = GrayScale_fonts[LookUpChar*(FONT_HEIGHT+1) +j];
+ else
+ BlockValue |= GrayScale_fonts[LookUpChar*(FONT_HEIGHT+1) +j];
+ }
+ else
+ {
+ if (TextStyle & INVERT_TEXT)
+ if (TextStyle & OVERWRITE_TEXT)
+ BlockValue = 0xFFFF - fonts[LookUpChar*13+j];
+ else
+ BlockValue |= 0xFFFF - fonts[LookUpChar*13+j];
+
+ else
+ if (TextStyle & OVERWRITE_TEXT)
+ BlockValue = fonts[LookUpChar*(FONT_HEIGHT+1) +j];
+ else
+ BlockValue |= fonts[LookUpChar*(FONT_HEIGHT+1) +j];
+ }
+ halLcdDrawBlock( Address, BlockValue);
+ }
+
+ Counter++;
+ if (Counter == 17)
+ {
+ Counter = 0;
+ ActualAddress += 0x20*FONT_HEIGHT - 16;
+ if (ActualAddress > LCD_Last_Pixel-0x20*FONT_HEIGHT )
+ ActualAddress = 0;
+ }
+ else
+ ActualAddress++;
+ i++;
+ }
+ halLcdSetAddress(ActualAddress);
+
+}
+
+/**********************************************************************//**
+ * @brief Displays the string to the LCD starting at (x,y) location.
+ *
+ * Writes all the data to LCD_MEM first, then updates all corresponding
+ * LCD CGRAM locations at once, in a continuous fashion.
+ *
+ * @param String[] String to be displayed on LCD
+ *
+ * @param x x-coordinate of the write location on the LCD
+ *
+ * @param y y-coordinate of the write location on the LCD
+ *
+ * @param TextStyle Value that specifies whether the string is to be
+ * inverted or overwritten.
+ * - Invert = 0x01
+ * - Overwrite = 0x04
+ *************************************************************************/
+void halLcdPrintXY( char String[], int x, int y, unsigned char TextStyle)
+{
+ //Each line increments by 0x20
+ halLcdSetAddress( (y << 5) + (x >> 3)) ; //Narrow down to 8 possible pixels
+ halLcdPrint(String, TextStyle);
+}
+
+/**********************************************************************//**
+ * @brief Displays a string on the LCD on the specified line.
+ *
+ * @param String[] The string to be displayed on LCD.
+ *
+ * @param Line The line on the LCD on which to print the string.
+ *
+ * @param TextStyle Value that specifies whether the string is to be
+ * inverted or overwritten.
+ * - Invert = 0x01
+ * - Overwrite = 0x04
+ *
+ * @return none
+ *************************************************************************/
+void halLcdPrintLine(char String[], unsigned char Line, unsigned char TextStyle)
+{
+ int temp;
+ temp = Line * FONT_HEIGHT ;
+ halLcdSetAddress( temp << 5 ) ; // 0x20 = 2^5
+ halLcdPrint(String, TextStyle);
+}
+
+/**********************************************************************//**
+ * @brief Prints a string beginning on a given line and column.
+ *
+ * @param String[] The string to be displayed on LCD.
+ *
+ * @param Line The line on which to print the string of text
+ *
+ * @param Col The column on which to print the string of text
+ *
+ * @param TextStyle Value that specifies whether the string is to be
+ * inverted or overwritten.
+ * - Invert = 0x01
+ * - Overwrite = 0x04
+ *
+ * @return none
+ *************************************************************************/
+void halLcdPrintLineCol(char String[], unsigned char Line, unsigned char Col,
+ unsigned char TextStyle)
+{
+ int temp;
+
+ temp = Line * FONT_HEIGHT;
+ temp <<= 5;
+ temp += Col;
+
+ halLcdSetAddress( temp ) ; // 0x20 = 2^5
+ halLcdPrint(String, TextStyle);
+}
+
+
+/**********************************************************************//**
+ * @brief Draws a horizontral line from (x1,y) to (x2,y) of GrayScale level
+ *
+ * @param x1 x-coordinate of the first point
+ *
+ * @param x2 x-coordinate of the second point
+ *
+ * @param y y-coordinate of both points
+ *
+ * @param GrayScale Grayscale level of the horizontal line
+ *
+ * @return none
+ *************************************************************************/
+void halLcdHLine( int x1, int x2, int y, unsigned char GrayScale)
+{
+ int x_dir, x;
+ if ( x1 < x2 )
+ x_dir = 1;
+ else
+ x_dir = -1;
+ x = x1;
+ while (x != x2)
+ {
+ halLcdPixel( x,y, GrayScale);
+ x += x_dir;
+ }
+}
+
+/**********************************************************************//**
+ * @brief Draws a vertical line from (x,y1) to (x,y2) of GrayScale level
+ *
+ * @param x x-coordinate of both points
+ *
+ * @param y1 y-coordinate of the first point
+ *
+ * @param y2 y-coordinate of the second point
+ *
+ * @param GrayScale GrayScale level of the vertical line
+ *
+ * @return none
+ *************************************************************************/
+void halLcdVLine( int x, int y1, int y2, unsigned char GrayScale)
+{
+ int y_dir, y;
+ if ( y1 < y2 )
+ y_dir = 1;
+ else
+ y_dir = -1;
+ y = y1;
+ while (y != y2)
+ {
+ halLcdPixel( x,y, GrayScale);
+ y += y_dir;
+ }
+}
+
+/**********************************************************************//**
+ * @brief Draws a line from (x1,y1) to (x2,y2) of GrayScale level.
+ *
+ * Uses Bresenham's line algorithm.
+ *
+ * @param x1 x-coordinate of the first point
+ *
+ * @param y1 y-coordinate of the first point
+ *
+ * @param x2 x-coordinate of the second point
+ *
+ * @param y2 y-coordinate of the second point
+ *
+ * @param GrayScale Grayscale level of the line
+ *
+ * @return none
+ *************************************************************************/
+void halLcdLine( int x1, int y1, int x2, int y2, unsigned char GrayScale)
+{
+ int x, y, deltay, deltax, d;
+ int x_dir, y_dir;
+
+ if ( x1 == x2 )
+ halLcdVLine( x1, y1, y2, GrayScale );
+ else
+ {
+ if ( y1 == y2 )
+ halLcdHLine( x1, x2, y1, GrayScale );
+ else // a diagonal line
+ {
+ if (x1 > x2)
+ x_dir = -1;
+ else x_dir = 1;
+ if (y1 > y2)
+ y_dir = -1;
+ else y_dir = 1;
+
+ x = x1;
+ y = y1;
+ deltay = ABS(y2 - y1);
+ deltax = ABS(x2 - x1);
+
+ if (deltax >= deltay)
+ {
+ d = (deltay << 1) - deltax;
+ while (x != x2)
+ {
+ halLcdPixel(x, y, GrayScale);
+ if ( d < 0 )
+ d += (deltay << 1);
+ else
+ {
+ d += ((deltay - deltax) << 1);
+ y += y_dir;
+ }
+ x += x_dir;
+ }
+ }
+ else
+ {
+ d = (deltax << 1) - deltay;
+ while (y != y2)
+ {
+ halLcdPixel(x, y, GrayScale);
+ if ( d < 0 )
+ d += (deltax << 1);
+ else
+ {
+ d += ((deltax - deltay) << 1);
+ x += x_dir;
+ }
+ y += y_dir;
+ }
+ }
+ }
+ }
+}
+
+
+/**********************************************************************//**
+ * @brief Draw a circle of Radius with center at (x,y) of GrayScale level.
+ *
+ * Uses Bresenham's circle algorithm
+ *
+ * @param x x-coordinate of the circle's center point
+ *
+ * @param y y-coordinate of the circle's center point
+ *
+ * @param Radius Radius of the circle
+ *
+ * @param GrayScale Grayscale level of the circle
+ *************************************************************************/
+void halLcdCircle(int x, int y, int Radius, int GrayScale)
+{
+ int xx, yy, ddF_x, ddF_y, f;
+
+ ddF_x = 0;
+ ddF_y = -(2 * Radius);
+ f = 1 - Radius;
+
+ xx = 0;
+ yy = Radius;
+ halLcdPixel(x + xx, y + yy, GrayScale);
+ halLcdPixel(x + xx, y - yy, GrayScale);
+ halLcdPixel(x - xx, y + yy, GrayScale);
+ halLcdPixel(x - xx, y - yy, GrayScale);
+ halLcdPixel(x + yy, y + xx, GrayScale);
+ halLcdPixel(x + yy, y - xx, GrayScale);
+ halLcdPixel(x - yy, y + xx, GrayScale);
+ halLcdPixel(x - yy, y - xx, GrayScale);
+ while (xx < yy)
+ {
+ if (f >= 0)
+ {
+ yy--;
+ ddF_y += 2;
+ f += ddF_y;
+ }
+ xx++;
+ ddF_x += 2;
+ f += ddF_x + 1;
+ halLcdPixel(x + xx, y + yy, GrayScale);
+ halLcdPixel(x + xx, y - yy, GrayScale);
+ halLcdPixel(x - xx, y + yy, GrayScale);
+ halLcdPixel(x - xx, y - yy, GrayScale);
+ halLcdPixel(x + yy, y + xx, GrayScale);
+ halLcdPixel(x + yy, y - xx, GrayScale);
+ halLcdPixel(x - yy, y + xx, GrayScale);
+ halLcdPixel(x - yy, y - xx, GrayScale);
+ }
+}
+
+/**********************************************************************//**
+ * @brief Scrolls a single row of pixels one column to the left.
+ *
+ * The column that is scrolled out of the left side of the LCD will be
+ * displayed the right side of the LCD.
+ *
+ * @param y The row of pixels to scroll. y = 0 is at the top-left
+ * corner of the LCD.
+ *
+ * @return none
+ *************************************************************************/
+void halLcdScrollRow(int y)
+{
+ int i, Address, LcdTableAddressTemp;
+ unsigned int temp;
+
+ Address = y << 5;
+
+ halLcdSetAddress( Address );
+
+ //Multiplied by (1+16) and added by the offset
+ LcdTableAddressTemp = y + (y << 4);
+ temp = ((LCD_MEM[LcdTableAddressTemp] & 0x0003) <<14);
+
+ for (i = 0; i < 0x10; i++)
+ halLcdDrawCurrentBlock( ( (LCD_MEM[LcdTableAddressTemp+i] & 0xFFFC ) >> 2 ) \
+ + ((LCD_MEM[LcdTableAddressTemp+i+1] & 0x0003) << 14 ));
+
+ halLcdDrawCurrentBlock( (( LCD_MEM[LcdTableAddressTemp + 0x10] & 0xFFFC ) >> 2) + temp);
+}
+
+/**********************************************************************//**
+ * @brief Scrolls multiple rows of pixels, yStart to yEnd,
+ * one column to the left.
+ *
+ * The column that is scrolled out of the left side of the LCD will be
+ * displayed the right side of the LCD. y = 0 is at the top-left of the
+ * LCD screen.
+ *
+ * @param yStart The beginning row to be scrolled
+ *
+ * @param yEnd The last row to be scrolled
+ *
+ * @return none
+ *************************************************************************/
+void halLcdHScroll(int yStart, int yEnd)
+{
+ int i ;
+
+ for (i = yStart; i < yEnd+1; i++)
+ halLcdScrollRow(i);
+}
+
+/**********************************************************************//**
+ * @brief Scrolls a line of text one column to the left.
+ *
+ * @param Line The line of text to be scrolled.
+ *
+ * @return none
+ *************************************************************************/
+void halLcdScrollLine(int Line)
+{
+ int i, Row ;
+
+ Row = Line * FONT_HEIGHT;
+
+ for (i = Row; i < Row + FONT_HEIGHT ; i++)
+ halLcdScrollRow(i);
+}
diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_lcd.h b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_lcd.h
new file mode 100644
index 000000000..ab047b056
--- /dev/null
+++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_lcd.h
@@ -0,0 +1,122 @@
+/*******************************************************************************
+ Filename: hal_lcd.h
+
+ Copyright 2010 Texas Instruments, Inc.
+***************************************************************************/
+#ifndef HAL_LCD_H
+#define HAL_LCD_H
+
+#ifndef MIN
+#define MIN(n,m) (((n) < (m)) ? (n) : (m))
+#endif
+
+#ifndef MAX
+#define MAX(n,m) (((n) < (m)) ? (m) : (n))
+#endif
+
+#ifndef ABS
+#define ABS(n) (((n) < 0) ? -(n) : (n))
+#endif
+
+#define LCD_BACKLT_OUT P8OUT
+#define LCD_BACKLT_DIR P8DIR
+#define LCD_BACKLT_SEL P8SEL
+#define LCD_BACKLIGHT_PIN BIT3
+#define LCD_CS_RST_DIR P9DIR
+#define LCD_CS_RST_OUT P9OUT
+#define LCD_CS_PIN BIT6
+#define LCD_RESET_PIN BIT7
+#define LCD_SPI_SEL P9SEL
+#define LCD_SPI_DIR P9DIR
+#define LCD_MOSI_PIN BIT1
+#define LCD_MISO_PIN BIT2
+#define LCD_CLK_PIN BIT3
+
+#define LCD_ROW 110
+#define LCD_COL 138
+#define LCD_Size 3505
+#define LCD_MEM_Size 110*17
+#define LCD_Max_Column_Offset 0x10
+
+#define LCD_Last_Pixel 3505
+
+#define LCD_MEM_Row 0x11
+#define LCD_Row 0x20
+
+// Grayscale level definitions
+#define PIXEL_OFF 0
+#define PIXEL_LIGHT 1
+#define PIXEL_DARK 2
+#define PIXEL_ON 3
+
+#define INVERT_TEXT BIT0
+#define OVERWRITE_TEXT BIT2
+#define GRAYSCALE_TEXT BIT1
+
+/*-------------------------------------------------------------
+ * Function Prototypes
+ * ------------------------------------------------------------*/
+extern void halLcdInit(void);
+extern void halLcdShutDown(void);
+extern void halLcdBackLightInit(void);
+extern void halLcdSetBackLight(unsigned char BackLightLevel);
+extern unsigned int halLcdGetBackLight(void);
+extern void halLcdShutDownBackLight(void);
+extern void halLcdSendCommand(unsigned char Data[]) ;
+extern void halLcdSetContrast(unsigned char ContrastLevel);
+extern unsigned char halLcdGetContrast(void);
+extern void halLcdStandby(void);
+extern void halLcdActive(void);
+
+//Move to specified LCD address
+extern void halLcdSetAddress(int Address);
+
+//Draw at current segment location
+extern void halLcdDrawCurrentBlock(unsigned int Value);
+extern void halLcdDrawCurrentLine(const unsigned int *value, int length);
+
+//Draw at specified location by calling
+//LCD_Set_Address(Address) & LCD_Draw_Current_Block( value )
+extern void halLcdDrawBlock(unsigned int Address, unsigned int Value);
+
+//Read value from LCD CGRAM
+extern int halLcdReadBlock(unsigned int Address);
+
+//Clear LCD Screen
+extern void halLcdClearScreen(void);
+
+//Invert black to white and vice versa
+extern void halLcdReverse(void);
+
+// Draw a Pixel @ (x,y) with GrayScale level
+extern void halLcdPixel( int x, int y, unsigned char GrayScale);
+//Draw Line from (x1,y1) to (x2,y2) with GrayScale level
+extern void halLcdLine( int x1, int y1, int x2, int y2, unsigned char GrayScale);
+extern void halLcdHLine( int x1, int x2, int y, unsigned char GrayScale);
+extern void halLcdVLine( int x1, int x2, int y, unsigned char GrayScale);
+
+extern void halLcdCircle(int x, int y, int Radius, int GrayScale);
+
+extern void halLcdImage(const unsigned int Image[], int Columns, int Rows, int x, int y);
+extern void halLcdClearImage(int Columns, int Rows, int x, int y);
+
+//Print String of Length starting at current LCD location
+extern void halLcdPrint(char String[], unsigned char TextStyle) ;
+
+//Print String of Length starting at (x,y)
+extern void halLcdPrintXY(char String[], int x, int y, unsigned char TextStyle);
+
+//Print String of Length starting at (x,y)
+extern void halLcdPrintLine(char String[], unsigned char Line, unsigned char TextStyle);
+extern void halLcdPrintLineCol(char String[], unsigned char Line, unsigned char Col, unsigned char TextStyle);
+
+extern void halLcdCursor(void);
+extern void halLcdCursorOff(void);
+//Scroll a single row of pixels
+extern void halLcdScrollRow(int y);
+//Scroll a number of consecutive rows from yStart to yEnd
+extern void halLcdHScroll(int yStart, int yEnd);
+//Scroll a line of text
+extern void halLcdScrollLine(int Line);
+
+#endif /* HAL_LCD_H */
diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_lcd_fonts.c b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_lcd_fonts.c
new file mode 100644
index 000000000..06002ace6
--- /dev/null
+++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_lcd_fonts.c
@@ -0,0 +1,323 @@
+/**********************************************************************//**
+ * @file UserExperienceGraphics.c
+ *
+ * Copyright 2010 Texas Instruments, Inc.
+***************************************************************************/
+
+const unsigned char fonts_lookup[]={
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 64,65,0,69,0,68,67,0,0,1, //'0' = 48 = 0x30
+ 2,3,4,5,6,7,8,9,66,0, //'9' = 57 = 0x39
+ 0,70,0,62,0,10,11,12,13,14, //'A' --> 'Z'
+ 15,16,17,18,19,20,21,22,23,24,
+ 25,26,27,28,29,30,31,32,33,34,
+ 35,0,0,0,71,0,0,36,37,38, //'a' = 97
+ 39,40,41,42,43,44,45,46,47,48,
+ 49,50,51,52,53,54,55,56,57,58,
+ 59,60,61,62,0 ,0, 0, 72,73,74,
+ 75,76,77,78,79,80,81 //'z' = 122
+ };
+
+const unsigned int fonts[]= {
+ 0x0000, 0x0ffc, 0x3c0f, 0x3f0f, 0x3fcf, 0x3ccf, 0x3cff, 0x3c3f,
+ 0x3c0f, 0x0ffc, 0x0000, 0x0000, 0x0000, 0x0000, 0x00c0, 0x00f0,
+ 0x00ff, 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x0fff, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x03fc, 0x0f0f, 0x0f0f, 0x0f00, 0x03c0,
+ 0x00f0, 0x003c, 0x0f0f, 0x0fff, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x03fc, 0x0f0f, 0x0f00, 0x0f00, 0x03f0, 0x0f00, 0x0f00, 0x0f0f,
+ 0x03fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0f00, 0x0fc0, 0x0ff0,
+ 0x0f3c, 0x0f0f, 0x3fff, 0x0f00, 0x0f00, 0x3fc0, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0fff, 0x000f, 0x000f, 0x000f, 0x03ff, 0x0f00,
+ 0x0f00, 0x0f0f, 0x03fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x03f0,
+ 0x003c, 0x000f, 0x000f, 0x03ff, 0x0f0f, 0x0f0f, 0x0f0f, 0x03fc,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3fff, 0x3c0f, 0x3c0f, 0x3c00,
+ 0x0f00, 0x03c0, 0x00f0, 0x00f0, 0x00f0, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x03fc, 0x0f0f, 0x0f0f, 0x0f3f, 0x03fc, 0x0fcf, 0x0f0f,
+ 0x0f0f, 0x03fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x03fc, 0x0f0f,
+ 0x0f0f, 0x0f0f, 0x0ffc, 0x03c0, 0x03c0, 0x00f0, 0x00fc, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x00f0, 0x03fc, 0x0f0f, 0x0f0f, 0x0f0f,
+ 0x0fff, 0x0f0f, 0x0f0f, 0x0f0f, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0fff, 0x3c3c, 0x3c3c, 0x3c3c, 0x0ffc, 0x3c3c, 0x3c3c, 0x3c3c,
+ 0x0fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0ff0, 0x3c3c, 0x3c0f,
+ 0x000f, 0x000f, 0x000f, 0x3c0f, 0x3c3c, 0x0ff0, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x03ff, 0x0f3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c,
+ 0x3c3c, 0x0f3c, 0x03ff, 0x0000, 0x0000, 0x0000, 0x0000, 0x3fff,
+ 0x303c, 0x003c, 0x0c3c, 0x0ffc, 0x0c3c, 0x003c, 0x303c, 0x3fff,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3fff, 0x3c3c, 0x303c, 0x0c3c,
+ 0x0ffc, 0x0c3c, 0x003c, 0x003c, 0x00ff, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0ff0, 0x3c3c, 0x3c0f, 0x000f, 0x000f, 0x3f0f, 0x3c0f,
+ 0x3c3c, 0x3ff0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0f0f, 0x0f0f,
+ 0x0f0f, 0x0f0f, 0x0fff, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x03fc, 0x00f0, 0x00f0, 0x00f0, 0x00f0,
+ 0x00f0, 0x00f0, 0x00f0, 0x03fc, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3fc0, 0x0f00, 0x0f00, 0x0f00, 0x0f00, 0x0f0f, 0x0f0f, 0x0f0f,
+ 0x03fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c3f, 0x3c3c, 0x0f3c,
+ 0x0f3c, 0x03fc, 0x0f3c, 0x0f3c, 0x3c3c, 0x3c3f, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x00ff, 0x003c, 0x003c, 0x003c, 0x003c, 0x303c,
+ 0x3c3c, 0x3c3c, 0x3fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c0f,
+ 0x3f3f, 0x3fff, 0x3fff, 0x3ccf, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3c0f, 0x3c0f, 0x3c3f, 0x3cff,
+ 0x3fff, 0x3fcf, 0x3f0f, 0x3c0f, 0x3c0f, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x03f0, 0x0f3c, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f,
+ 0x0f3c, 0x03f0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0fff, 0x3c3c,
+ 0x3c3c, 0x3c3c, 0x0ffc, 0x003c, 0x003c, 0x003c, 0x00ff, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x03f0, 0x0f3c, 0x3c0f, 0x3c0f, 0x3c0f,
+ 0x3f0f, 0x3fcf, 0x0ffc, 0x0f00, 0x3fc0, 0x0000, 0x0000, 0x0000,
+ 0x0fff, 0x3c3c, 0x3c3c, 0x3c3c, 0x0ffc, 0x0f3c, 0x3c3c, 0x3c3c,
+ 0x3c3f, 0x0000, 0x0000, 0x0000, 0x0000, 0x03fc, 0x0f0f, 0x0f0f,
+ 0x000f, 0x00fc, 0x03c0, 0x0f0f, 0x0f0f, 0x03fc, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0fff, 0x0cf3, 0x00f0, 0x00f0, 0x00f0, 0x00f0,
+ 0x00f0, 0x00f0, 0x03fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0f0f,
+ 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x03fc,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f,
+ 0x0f0f, 0x0f0f, 0x0f0f, 0x03fc, 0x00f0, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3ccf, 0x3ccf, 0x0f3c,
+ 0x0f3c, 0x0f3c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0f0f, 0x0f0f,
+ 0x0f0f, 0x03fc, 0x00f0, 0x03fc, 0x0f0f, 0x0f0f, 0x0f0f, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x03fc,
+ 0x00f0, 0x00f0, 0x00f0, 0x03fc, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3fff, 0x3f0f, 0x03c3, 0x03c0, 0x00f0, 0x003c, 0x303c, 0x3c0f,
+ 0x3fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x03fc, 0x0f00, 0x0ffc, 0x0f0f, 0x0f0f, 0x3cfc, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x003f, 0x003c, 0x003c, 0x0ffc, 0x3c3c, 0x3c3c,
+ 0x3c3c, 0x3c3c, 0x0fcf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x03fc, 0x0f0f, 0x000f, 0x000f, 0x0f0f, 0x03fc,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0fc0, 0x0f00, 0x0f00, 0x0ffc,
+ 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x3cfc, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x03fc, 0x0f0f, 0x0fff, 0x000f,
+ 0x0f0f, 0x03fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x03f0, 0x0f3c,
+ 0x003c, 0x003c, 0x03ff, 0x003c, 0x003c, 0x003c, 0x00ff, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3cfc, 0x0f0f,
+ 0x0f0f, 0x0f0f, 0x0ffc, 0x0f00, 0x0f0f, 0x03fc, 0x0000, 0x0000,
+ 0x003f, 0x003c, 0x003c, 0x0f3c, 0x3cfc, 0x3c3c, 0x3c3c, 0x3c3c,
+ 0x3c3f, 0x0000, 0x0000, 0x0000, 0x0000, 0x03c0, 0x03c0, 0x0000,
+ 0x03fc, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x3ffc, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0f00, 0x0f00, 0x0000, 0x0ff0, 0x0f00, 0x0f00,
+ 0x0f00, 0x0f00, 0x0f0f, 0x0f0f, 0x03fc, 0x0000, 0x0000, 0x003f,
+ 0x003c, 0x003c, 0x3c3c, 0x0f3c, 0x03fc, 0x0f3c, 0x3c3c, 0x3c3f,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x03fc, 0x03c0, 0x03c0, 0x03c0,
+ 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x3ffc, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0fff, 0x3ccf, 0x3ccf, 0x3ccf,
+ 0x3ccf, 0x3c0f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x03ff, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03fc, 0x0f0f,
+ 0x0f0f, 0x0f0f, 0x0f0f, 0x03fc, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0fcf, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c,
+ 0x0ffc, 0x003c, 0x00ff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3cfc, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x0ffc, 0x0f00, 0x3fc0,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0f3f, 0x3f3c, 0x3cfc,
+ 0x003c, 0x003c, 0x00ff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x03fc, 0x0f0f, 0x003c, 0x03c0, 0x0f0f, 0x03fc,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0030, 0x003c, 0x0fff,
+ 0x003c, 0x003c, 0x003c, 0x0f3c, 0x03f0, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f,
+ 0x0f0f, 0x3cfc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0f0f, 0x0f0f, 0x0f0f, 0x0f0f, 0x03fc, 0x00f0, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c0f, 0x3c0f,
+ 0x3ccf, 0x3ccf, 0x0f3c, 0x0f3c, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3c0f, 0x0f3c, 0x03f0, 0x03f0, 0x0f3c,
+ 0x3c0f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x0ff0, 0x0f00, 0x03c0, 0x00ff,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0fff, 0x0f03, 0x03c0,
+ 0x003c, 0x0c0f, 0x0fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x03fc,
+ 0x0f0f, 0x0f00, 0x03c0, 0x00f0, 0x00f0, 0x0000, 0x00f0, 0x00f0,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0f00, 0x03c0, 0x00f0, 0x003c, 0x003c, 0x003c, 0x00f0,
+ 0x03c0, 0x0f00, 0x0000, 0x0000, 0x0000, 0x0000, 0x003c, 0x00f0,
+ 0x03c0, 0x0f00, 0x0f00, 0x0f00, 0x03c0, 0x00f0, 0x003c, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03f0, 0x03f0, 0x0000,
+ 0x0000, 0x03f0, 0x03f0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03f0,
+ 0x03f0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x3ffc, 0x3ffc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x03c0, 0x03c0, 0x3ffc, 0x3ffc,
+ 0x03c0, 0x03c0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3ffc, 0x0000, 0x0000, 0x3ffc, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x03fc, 0x0f0f, 0x0f0f, 0x0f0f,
+ 0x03fc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+//0---------------------------
+ 0x0000, 0x0ffc, 0x3c0f, 0x3f0f, 0x3fcf, 0x3ccf, 0x3cff, 0x3c3f,
+ 0x3c0f, 0x0ffc, 0x0000, 0x0000, 0x0000,
+//1---------------------------
+ 0x0000, 0x00c0, 0x00f0, 0x00ff, 0x00f0, 0x00f0, 0x00f0, 0x00f0,
+ 0x00f0, 0x0fff, 0x0000, 0x0000, 0x0000,
+//2---------------------------
+ 0x0000, 0x03fc, 0x0f0f, 0x0f0f, 0x0f00, 0x03c0, 0x00f0, 0x003c,
+ 0x0f0f, 0x0fff, 0x0000, 0x0000, 0x0000,
+//3---------------------------
+ 0x0000, 0x03fc, 0x0f0f, 0x0f00, 0x0f00, 0x03f0, 0x0f00, 0x0f00,
+ 0x0f0f, 0x03fc, 0x0000, 0x0000, 0x0000,
+//4---------------------------
+ 0x0000, 0x0f00, 0x0fc0, 0x0ff0, 0x0f3c, 0x0f0f, 0x3fff, 0x0f00,
+ 0x0f00, 0x3fc0, 0x0000, 0x0000, 0x0000,
+//5---------------------------
+ 0x0000, 0x0fff, 0x000f, 0x000f, 0x000f, 0x03ff, 0x0f00, 0x0f00,
+ 0x0f0f, 0x03fc, 0x0000, 0x0000, 0x0000,
+//6---------------------------
+ 0x0000, 0x03f0, 0x003c, 0x000f, 0x000f, 0x03ff, 0x0f0f, 0x0f0f,
+ 0x0f0f, 0x03fc, 0x0000, 0x0000, 0x0000,
+//7---------------------------
+ 0x0000, 0x3fff, 0x3c0f, 0x3c0f, 0x3c00, 0x0f00, 0x03c0, 0x00f0,
+ 0x00f0, 0x00f0, 0x0000, 0x0000, 0x0000,
+//8---------------------------
+ 0x0000, 0x03fc, 0x0f0f, 0x0f0f, 0x0f3f, 0x03fc, 0x0fcf, 0x0f0f,
+ 0x0f0f, 0x03fc, 0x0000, 0x0000, 0x0000,
+//9---------------------------
+ 0x0000, 0x03fc, 0x0f0f, 0x0f0f, 0x0f0f, 0x0ffc, 0x03c0, 0x03c0,
+ 0x00f0, 0x00fc, 0x0000, 0x0000, 0x0000,
+} ;
+
+
+const unsigned int GrayScale_fonts[]= {
+ 0x0000, 0x0aa8, 0x280a, 0x2a0a, 0x2a8a, 0x288a, 0x28aa, 0x282a,
+ 0x280a, 0x0aa8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x00a0,
+ 0x00aa, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x0aaa, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x02a8, 0x0a0a, 0x0a0a, 0x0a00, 0x0280,
+ 0x00a0, 0x0028, 0x0a0a, 0x0aaa, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x02a8, 0x0a0a, 0x0a00, 0x0a00, 0x02a0, 0x0a00, 0x0a00, 0x0a0a,
+ 0x02a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0a00, 0x0a80, 0x0aa0,
+ 0x0a28, 0x0a0a, 0x2aaa, 0x0a00, 0x0a00, 0x2a80, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0aaa, 0x000a, 0x000a, 0x000a, 0x02aa, 0x0a00,
+ 0x0a00, 0x0a0a, 0x02a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x02a0,
+ 0x0028, 0x000a, 0x000a, 0x02aa, 0x0a0a, 0x0a0a, 0x0a0a, 0x02a8,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x2aaa, 0x280a, 0x280a, 0x2800,
+ 0x0a00, 0x0280, 0x00a0, 0x00a0, 0x00a0, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x02a8, 0x0a0a, 0x0a0a, 0x0a2a, 0x02a8, 0x0a8a, 0x0a0a,
+ 0x0a0a, 0x02a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x02a8, 0x0a0a,
+ 0x0a0a, 0x0a0a, 0x0aa8, 0x0280, 0x0280, 0x00a0, 0x00a8, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x00a0, 0x02a8, 0x0a0a, 0x0a0a, 0x0a0a,
+ 0x0aaa, 0x0a0a, 0x0a0a, 0x0a0a, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0aaa, 0x2828, 0x2828, 0x2828, 0x0aa8, 0x2828, 0x2828, 0x2828,
+ 0x0aaa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0aa0, 0x2828, 0x280a,
+ 0x000a, 0x000a, 0x000a, 0x280a, 0x2828, 0x0aa0, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x02aa, 0x0a28, 0x2828, 0x2828, 0x2828, 0x2828,
+ 0x2828, 0x0a28, 0x02aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x2aaa,
+ 0x2028, 0x0028, 0x0828, 0x0aa8, 0x0828, 0x0028, 0x2028, 0x2aaa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x2aaa, 0x2828, 0x2028, 0x0828,
+ 0x0aa8, 0x0828, 0x0028, 0x0028, 0x00aa, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0aa0, 0x2828, 0x280a, 0x000a, 0x000a, 0x2a0a, 0x280a,
+ 0x2828, 0x2aa0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0a0a, 0x0a0a,
+ 0x0a0a, 0x0a0a, 0x0aaa, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x02a8, 0x00a0, 0x00a0, 0x00a0, 0x00a0,
+ 0x00a0, 0x00a0, 0x00a0, 0x02a8, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x2a80, 0x0a00, 0x0a00, 0x0a00, 0x0a00, 0x0a0a, 0x0a0a, 0x0a0a,
+ 0x02a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x282a, 0x2828, 0x0a28,
+ 0x0a28, 0x02a8, 0x0a28, 0x0a28, 0x2828, 0x282a, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x00aa, 0x0028, 0x0028, 0x0028, 0x0028, 0x2028,
+ 0x2828, 0x2828, 0x2aaa, 0x0000, 0x0000, 0x0000, 0x0000, 0x280a,
+ 0x2a2a, 0x2aaa, 0x2aaa, 0x288a, 0x280a, 0x280a, 0x280a, 0x280a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x280a, 0x280a, 0x282a, 0x28aa,
+ 0x2aaa, 0x2a8a, 0x2a0a, 0x280a, 0x280a, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x02a0, 0x0a28, 0x280a, 0x280a, 0x280a, 0x280a, 0x280a,
+ 0x0a28, 0x02a0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0aaa, 0x2828,
+ 0x2828, 0x2828, 0x0aa8, 0x0028, 0x0028, 0x0028, 0x00aa, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x02a0, 0x0a28, 0x280a, 0x280a, 0x280a,
+ 0x2a0a, 0x2a8a, 0x0aa8, 0x0a00, 0x2a80, 0x0000, 0x0000, 0x0000,
+ 0x0aaa, 0x2828, 0x2828, 0x2828, 0x0aa8, 0x0a28, 0x2828, 0x2828,
+ 0x282a, 0x0000, 0x0000, 0x0000, 0x0000, 0x02a8, 0x0a0a, 0x0a0a,
+ 0x000a, 0x00a8, 0x0280, 0x0a0a, 0x0a0a, 0x02a8, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0aaa, 0x08a2, 0x00a0, 0x00a0, 0x00a0, 0x00a0,
+ 0x00a0, 0x00a0, 0x02a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0a0a,
+ 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x02a8,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a,
+ 0x0a0a, 0x0a0a, 0x0a0a, 0x02a8, 0x00a0, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x280a, 0x280a, 0x280a, 0x280a, 0x288a, 0x288a, 0x0a28,
+ 0x0a28, 0x0a28, 0x0000, 0x0000, 0x0000, 0x0000, 0x0a0a, 0x0a0a,
+ 0x0a0a, 0x02a8, 0x00a0, 0x02a8, 0x0a0a, 0x0a0a, 0x0a0a, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x02a8,
+ 0x00a0, 0x00a0, 0x00a0, 0x02a8, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x2aaa, 0x2a0a, 0x0282, 0x0280, 0x00a0, 0x0028, 0x2028, 0x280a,
+ 0x2aaa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x02a8, 0x0a00, 0x0aa8, 0x0a0a, 0x0a0a, 0x28a8, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x002a, 0x0028, 0x0028, 0x0aa8, 0x2828, 0x2828,
+ 0x2828, 0x2828, 0x0a8a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x02a8, 0x0a0a, 0x000a, 0x000a, 0x0a0a, 0x02a8,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0a80, 0x0a00, 0x0a00, 0x0aa8,
+ 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x28a8, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x02a8, 0x0a0a, 0x0aaa, 0x000a,
+ 0x0a0a, 0x02a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x02a0, 0x0a28,
+ 0x0028, 0x0028, 0x02aa, 0x0028, 0x0028, 0x0028, 0x00aa, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x28a8, 0x0a0a,
+ 0x0a0a, 0x0a0a, 0x0aa8, 0x0a00, 0x0a0a, 0x02a8, 0x0000, 0x0000,
+ 0x002a, 0x0028, 0x0028, 0x0a28, 0x28a8, 0x2828, 0x2828, 0x2828,
+ 0x282a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0280, 0x0280, 0x0000,
+ 0x02a8, 0x0280, 0x0280, 0x0280, 0x0280, 0x2aa8, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0a00, 0x0a00, 0x0000, 0x0aa0, 0x0a00, 0x0a00,
+ 0x0a00, 0x0a00, 0x0a0a, 0x0a0a, 0x02a8, 0x0000, 0x0000, 0x002a,
+ 0x0028, 0x0028, 0x2828, 0x0a28, 0x02a8, 0x0a28, 0x2828, 0x282a,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x02a8, 0x0280, 0x0280, 0x0280,
+ 0x0280, 0x0280, 0x0280, 0x0280, 0x2aa8, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0aaa, 0x288a, 0x288a, 0x288a,
+ 0x288a, 0x280a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x02aa, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02a8, 0x0a0a,
+ 0x0a0a, 0x0a0a, 0x0a0a, 0x02a8, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0a8a, 0x2828, 0x2828, 0x2828, 0x2828,
+ 0x0aa8, 0x0028, 0x00aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x28a8, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x0aa8, 0x0a00, 0x2a80,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0a2a, 0x2a28, 0x28a8,
+ 0x0028, 0x0028, 0x00aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x02a8, 0x0a0a, 0x0028, 0x0280, 0x0a0a, 0x02a8,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0028, 0x0aaa,
+ 0x0028, 0x0028, 0x0028, 0x0a28, 0x02a0, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a,
+ 0x0a0a, 0x28a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x02a8, 0x00a0, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x280a, 0x280a,
+ 0x288a, 0x288a, 0x0a28, 0x0a28, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x280a, 0x0a28, 0x02a0, 0x02a0, 0x0a28,
+ 0x280a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x2828, 0x2828, 0x2828, 0x2828, 0x0aa0, 0x0a00, 0x0280, 0x00aa,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0aaa, 0x0a02, 0x0280,
+ 0x0028, 0x080a, 0x0aaa, 0x0000, 0x0000, 0x0000, 0x0000, 0x02a8,
+ 0x0a0a, 0x0a00, 0x0280, 0x00a0, 0x00a0, 0x0000, 0x00a0, 0x00a0,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0a00, 0x0280, 0x00a0, 0x0028, 0x0028, 0x0028, 0x00a0,
+ 0x0280, 0x0a00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0028, 0x00a0,
+ 0x0280, 0x0a00, 0x0a00, 0x0a00, 0x0280, 0x00a0, 0x0028, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02a0, 0x02a0, 0x0000,
+ 0x0000, 0x02a0, 0x02a0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02a0,
+ 0x02a0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2aa8, 0x2aa8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0280, 0x0280, 0x2aa8, 0x2aa8,
+ 0x0280, 0x0280, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x2aa8, 0x0000, 0x0000, 0x2aa8, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x02a8, 0x0a0a, 0x0a0a, 0x0a0a,
+ 0x02a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+//0---------------------------
+ 0x0000, 0x0aa8, 0x280a, 0x2a0a, 0x2a8a, 0x288a, 0x28aa, 0x282a,
+ 0x280a, 0x0aa8, 0x0000, 0x0000, 0x0000,
+//1---------------------------
+ 0x0000, 0x0080, 0x00a0, 0x00aa, 0x00a0, 0x00a0, 0x00a0, 0x00a0,
+ 0x00a0, 0x0aaa, 0x0000, 0x0000, 0x0000,
+//2---------------------------
+ 0x0000, 0x02a8, 0x0a0a, 0x0a0a, 0x0a00, 0x0280, 0x00a0, 0x0028,
+ 0x0a0a, 0x0aaa, 0x0000, 0x0000, 0x0000,
+//2---------------------------
+ 0x0000, 0x02a8, 0x0a0a, 0x0a00, 0x0a00, 0x02a0, 0x0a00, 0x0a00,
+ 0x0a0a, 0x02a8, 0x0000, 0x0000, 0x0000,
+//4---------------------------
+ 0x0000, 0x0a00, 0x0a80, 0x0aa0, 0x0a28, 0x0a0a, 0x2aaa, 0x0a00,
+ 0x0a00, 0x2a80, 0x0000, 0x0000, 0x0000,
+//5---------------------------
+ 0x0000, 0x0aaa, 0x000a, 0x000a, 0x000a, 0x02aa, 0x0a00, 0x0a00,
+ 0x0a0a, 0x02a8, 0x0000, 0x0000, 0x0000,
+//6---------------------------
+ 0x0000, 0x02a0, 0x0028, 0x000a, 0x000a, 0x02aa, 0x0a0a, 0x0a0a,
+ 0x0a0a, 0x02a8, 0x0000, 0x0000, 0x0000,
+//7---------------------------
+ 0x0000, 0x2aaa, 0x280a, 0x280a, 0x2800, 0x0a00, 0x0280, 0x00a0,
+ 0x00a0, 0x00a0, 0x0000, 0x0000, 0x0000,
+//8---------------------------
+ 0x0000, 0x02a8, 0x0a0a, 0x0a0a, 0x0a2a, 0x02a8, 0x0a8a, 0x0a0a,
+ 0x0a0a, 0x02a8, 0x0000, 0x0000, 0x0000,
+//9---------------------------
+ 0x0000, 0x02a8, 0x0a0a, 0x0a0a, 0x0a0a, 0x0aa8, 0x0280, 0x0280,
+ 0x00a0, 0x00a8, 0x0000, 0x0000, 0x0000,
+} ;
diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_lcd_fonts.h b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_lcd_fonts.h
new file mode 100644
index 000000000..48239c9f1
--- /dev/null
+++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/MSP-EXP430F5438_HAL/hal_lcd_fonts.h
@@ -0,0 +1,15 @@
+/*******************************************************************************
+ Filename: hal_lcd_fonts.h
+
+ Copyright 2010 Texas Instruments, Inc.
+***************************************************************************/
+#ifndef FONTS_H
+#define FONTS_H
+
+#define FONT_HEIGHT 12 // Each character has 13 lines
+
+extern const unsigned char fonts_lookup[];
+extern const unsigned int fonts[];
+extern const unsigned int GrayScale_fonts[];
+
+#endif /* FONTS_H */
diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/ParTest.c b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/ParTest.c
new file mode 100644
index 000000000..688deaa5c
--- /dev/null
+++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/ParTest.c
@@ -0,0 +1,144 @@
+/*
+ FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd.
+
+ ***************************************************************************
+ * *
+ * If you are: *
+ * *
+ * + New to FreeRTOS, *
+ * + Wanting to learn FreeRTOS or multitasking in general quickly *
+ * + Looking for basic training, *
+ * + Wanting to improve your FreeRTOS skills and productivity *
+ * *
+ * then take a look at the FreeRTOS books - available as PDF or paperback *
+ * *
+ * "Using the FreeRTOS Real Time Kernel - a Practical Guide" *
+ * http://www.FreeRTOS.org/Documentation *
+ * *
+ * A pdf reference manual is also available. Both are usually delivered *
+ * to your inbox within 20 minutes to two hours when purchased between 8am *
+ * and 8pm GMT (although please allow up to 24 hours in case of *
+ * exceptional circumstances). Thank you for your support! *
+ * *
+ ***************************************************************************
+
+ This file is part of the FreeRTOS distribution.
+
+ FreeRTOS is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License (version 2) as published by the
+ Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
+ ***NOTE*** The exception to the GPL is included to allow you to distribute
+ a combined work that includes FreeRTOS without being obliged to provide the
+ source code for proprietary components outside of the FreeRTOS kernel.
+ FreeRTOS is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ more details. You should have received a copy of the GNU General Public
+ License and the FreeRTOS license exception along with FreeRTOS; if not it
+ can be viewed here: http://www.freertos.org/a00114.html and also obtained
+ by writing to Richard Barry, contact details for whom are available on the
+ FreeRTOS WEB site.
+
+ 1 tab == 4 spaces!
+
+ http://www.FreeRTOS.org - Documentation, latest information, license and
+ contact details.
+
+ http://www.SafeRTOS.com - A version that is certified for use in safety
+ critical systems.
+
+ http://www.OpenRTOS.com - Commercial support, development, porting,
+ licensing and training services.
+*/
+
+/*-----------------------------------------------------------
+ * Simple parallel port IO routines to flash LEDs.
+ *-----------------------------------------------------------*/
+
+/* Kernel includes. */
+#include "FreeRTOS.h"
+#include "task.h"
+
+/* Hardware includes. */
+#include "msp430.h"
+#include "hal_MSP-EXP430F5438.h"
+
+/*-----------------------------------------------------------*/
+
+void vParTestInitialise( void )
+{
+ /* The port used by the two LEDs is configured from halBoardInit() so
+ nothing needs to be done here. */
+}
+/*-----------------------------------------------------------*/
+
+void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue )
+{
+ /* Only two LEDs are provided on the hardware. */
+ taskENTER_CRITICAL();
+ {
+ if( xValue != pdFALSE )
+ {
+ switch( uxLED )
+ {
+ case 0: LED_PORT_OUT |= LED_1;
+ break;
+
+ case 1: LED_PORT_OUT |= LED_2;
+ break;
+
+ default: /* Nothing to do here, there are only two LEDs. */
+ break;
+ }
+ }
+ else
+ {
+ switch( uxLED )
+ {
+ case 0: LED_PORT_OUT &= ~LED_1;
+ break;
+
+ case 1: LED_PORT_OUT &= ~LED_2;
+ break;
+ default: /* Nothing to do here, there are only two LEDs. */
+ break;
+ }
+ }
+ }
+ taskEXIT_CRITICAL();
+}
+/*-----------------------------------------------------------*/
+
+void vParTestToggleLED( unsigned portBASE_TYPE uxLED )
+{
+ taskENTER_CRITICAL();
+ {
+ switch( uxLED )
+ {
+ case 0: if( ( LED_PORT_OUT & LED_1 ) == 0 )
+ {
+ LED_PORT_OUT |= LED_1;
+ }
+ else
+ {
+ LED_PORT_OUT &= ~LED_1;
+ }
+ break;
+
+ case 1: if( ( LED_PORT_OUT & LED_2 ) == 0 )
+ {
+ LED_PORT_OUT |= LED_2;
+ }
+ else
+ {
+ LED_PORT_OUT &= ~LED_2;
+ }
+ break;
+ default: /* Nothing to do here, there are only two LEDs. */
+ break;
+ }
+ }
+ taskEXIT_CRITICAL();
+}
+/*-----------------------------------------------------------*/
+
diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/RegTest.asm b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/RegTest.asm
new file mode 100644
index 000000000..8e147017f
--- /dev/null
+++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/RegTest.asm
@@ -0,0 +1,188 @@
+;
+; FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd.
+;
+; ***************************************************************************
+; * *
+; * If you are: *
+; * *
+; * + New to FreeRTOS, *
+; * + Wanting to learn FreeRTOS or multitasking in general quickly *
+; * + Looking for basic training, *
+; * + Wanting to improve your FreeRTOS skills and productivity *
+; * *
+; * then take a look at the FreeRTOS books - available as PDF or paperback *
+; * *
+; * "Using the FreeRTOS Real Time Kernel - a Practical Guide" *
+; * http://www.FreeRTOS.org/Documentation *
+; * *
+; * A pdf reference manual is also available. Both are usually delivered *
+; * to your inbox within 20 minutes to two hours when purchased between 8am *
+; * and 8pm GMT (although please allow up to 24 hours in case of *
+; * exceptional circumstances). Thank you for your support! *
+; * *
+; ***************************************************************************
+;
+; This file is part of the FreeRTOS distribution.
+;
+; FreeRTOS is free software; you can redistribute it and/or modify it under
+; the terms of the GNU General Public License (version 2) as published by the
+; Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
+; ***NOTE*** The exception to the GPL is included to allow you to distribute
+; a combined work that includes FreeRTOS without being obliged to provide the
+; source code for proprietary components outside of the FreeRTOS kernel.
+; FreeRTOS is distributed in the hope that it will be useful, but WITHOUT
+; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+; more details. You should have received a copy of the GNU General Public
+; License and the FreeRTOS license exception along with FreeRTOS; if not it
+; can be viewed here: http://www.freertos.org/a00114.html and also obtained
+; by writing to Richard Barry, contact details for whom are available on the
+; FreeRTOS WEB site.
+;
+; 1 tab == 4 spaces!
+;
+; http://www.FreeRTOS.org - Documentation, latest information, license and
+; contact details.
+;
+; http://www.SafeRTOS.com - A version that is certified for use in safety
+; critical systems.
+;
+; http://www.OpenRTOS.com - Commercial support, development, porting,
+; licensing and training services.
+
+; * The definition of the "register test" tasks, as described at the top of
+; * main.c
+
+
+
+
+ .global usRegTest1Counter
+ .global usRegTest2Counter
+ .global vPortYield
+
+ .def vRegTest1Task
+ .def vRegTest2Task
+
+ .text
+
+vRegTest1Task:
+
+ ; Fill each general purpose register with a known value.
+ movx.a #0x44444, r4
+ movx.a #0x55555, r5
+ movx.a #0x66666, r6
+ movx.a #0x77777, r7
+ movx.a #0x88888, r8
+ movx.a #0x99999, r9
+ movx.a #0xaaaaa, r10
+ movx.a #0xbbbbb, r11
+ movx.a #0xccccc, r12
+ movx.a #0xddddd, r13
+ movx.a #0xeeeee, r14
+ movx.a #0xfffff, r15
+
+prvRegTest1Loop:
+
+ ; Test each general purpose register to check that it still contains the
+ ; expected known value, jumping to vRegTest1Error if any register contains
+ ; an unexpected value.
+ cmpx.a #0x44444, r4
+ jne vRegTest1Error
+ cmpx.a #0x55555, r5
+ jne vRegTest1Error
+ cmpx.a #0x66666, r6
+ jne vRegTest1Error
+ cmpx.a #0x77777, r7
+ jne vRegTest1Error
+ cmpx.a #0x88888, r8
+ jne vRegTest1Error
+ cmpx.a #0x99999, r9
+ jne vRegTest1Error
+ cmpx.a #0xaaaaa, r10
+ jne vRegTest1Error
+ cmpx.a #0xbbbbb, r11
+ jne vRegTest1Error
+ cmpx.a #0xccccc, r12
+ jne vRegTest1Error
+ cmpx.a #0xddddd, r13
+ jne vRegTest1Error
+ cmpx.a #0xeeeee, r14
+ jne vRegTest1Error
+ cmpx.a #0xfffff, r15
+ jne vRegTest1Error
+
+ ; This task is still running without jumping to vRegTest1Error, so increment
+ ; the loop counter so the check task knows the task is running error free.
+ incx.w &usRegTest1Counter
+
+ ; Loop again, performing the same tests.
+ jmp prvRegTest1Loop
+ nop
+
+
+vRegTest1Error:
+ jmp vRegTest1Error
+ nop
+
+; -----------------------------------------------------------
+
+; See the comments in vRegTest1Task. This task is the same, it just uses
+; different values in its registers.
+vRegTest2Task:
+
+ movx.a #0x14441, r4
+ movx.a #0x15551, r5
+ movx.a #0x16661, r6
+ movx.a #0x17771, r7
+ movx.a #0x18881, r8
+ movx.a #0x19991, r9
+ movx.a #0x1aaa1, r10
+ movx.a #0x1bbb1, r11
+ movx.a #0x1ccc1, r12
+ movx.a #0x1ddd1, r13
+ movx.a #0x1eee1, r14
+ movx.a #0x1fff1, r15
+
+prvRegTest2Loop:
+
+ cmpx.a #0x14441, r4
+ jne vRegTest2Error
+ cmpx.a #0x15551, r5
+ jne vRegTest2Error
+ cmpx.a #0x16661, r6
+ jne vRegTest2Error
+ cmpx.a #0x17771, r7
+ jne vRegTest2Error
+ cmpx.a #0x18881, r8
+ jne vRegTest2Error
+ cmpx.a #0x19991, r9
+ jne vRegTest2Error
+ cmpx.a #0x1aaa1, r10
+ jne vRegTest2Error
+ cmpx.a #0x1bbb1, r11
+ jne vRegTest2Error
+ cmpx.a #0x1ccc1, r12
+ jne vRegTest2Error
+ cmpx.a #0x1ddd1, r13
+ jne vRegTest2Error
+ cmpx.a #0x1eee1, r14
+ jne vRegTest2Error
+ cmpx.a #0x1fff1, r15
+ jne vRegTest2Error
+
+ ; Also perform a manual yield, just to increase the scope of the test.
+ calla #vPortYield
+
+ incx.w &usRegTest2Counter
+ jmp prvRegTest2Loop
+ nop
+
+
+vRegTest2Error:
+ jmp vRegTest2Error
+ nop
+; /*-----------------------------------------------------------
+
+
+ .end
+
diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/RunTimeStatsConfig.c b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/RunTimeStatsConfig.c
new file mode 100644
index 000000000..94dd0f953
--- /dev/null
+++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/RunTimeStatsConfig.c
@@ -0,0 +1,115 @@
+/*
+ FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd.
+
+ ***************************************************************************
+ * *
+ * If you are: *
+ * *
+ * + New to FreeRTOS, *
+ * + Wanting to learn FreeRTOS or multitasking in general quickly *
+ * + Looking for basic training, *
+ * + Wanting to improve your FreeRTOS skills and productivity *
+ * *
+ * then take a look at the FreeRTOS books - available as PDF or paperback *
+ * *
+ * "Using the FreeRTOS Real Time Kernel - a Practical Guide" *
+ * http://www.FreeRTOS.org/Documentation *
+ * *
+ * A pdf reference manual is also available. Both are usually delivered *
+ * to your inbox within 20 minutes to two hours when purchased between 8am *
+ * and 8pm GMT (although please allow up to 24 hours in case of *
+ * exceptional circumstances). Thank you for your support! *
+ * *
+ ***************************************************************************
+
+ This file is part of the FreeRTOS distribution.
+
+ FreeRTOS is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License (version 2) as published by the
+ Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
+ ***NOTE*** The exception to the GPL is included to allow you to distribute
+ a combined work that includes FreeRTOS without being obliged to provide the
+ source code for proprietary components outside of the FreeRTOS kernel.
+ FreeRTOS is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ more details. You should have received a copy of the GNU General Public
+ License and the FreeRTOS license exception along with FreeRTOS; if not it
+ can be viewed here: http://www.freertos.org/a00114.html and also obtained
+ by writing to Richard Barry, contact details for whom are available on the
+ FreeRTOS WEB site.
+
+ 1 tab == 4 spaces!
+
+ http://www.FreeRTOS.org - Documentation, latest information, license and
+ contact details.
+
+ http://www.SafeRTOS.com - A version that is certified for use in safety
+ critical systems.
+
+ http://www.OpenRTOS.com - Commercial support, development, porting,
+ licensing and training services.
+*/
+
+/* FreeRTOS includes. */
+#include "FreeRTOS.h"
+
+/* Hardware includes. */
+#include "msp430.h"
+#include "hal_MSP-EXP430F5438.h"
+
+/* This demo uses Timer A1 to generate the time base for gathering run time
+statistics information. Run time statistics show much processing time has
+been allocated to each task since the application booted. */
+
+/* The time base for the run time stats is generated by a 16 bit timer. Each
+time the timer overflows ulStatsOverflowCount is incremented. Therefore,
+when converting the total run time to a 32 bit number, the most significant two
+bytes are given by ulStatsOverflowCount and the least significant two bytes are
+given by the current timer counter value. Care must be taken with data
+consistency when combining the two in case a timer overflow occurs as the
+value is being read. */
+volatile unsigned long ulStatsOverflowCount = 0;
+
+/*-----------------------------------------------------------*/
+
+void vConfigureTimerForRunTimeStats( void )
+{
+ /* Ensure the timer is stopped. */
+ TA1CTL = 0;
+
+ /* Run the timer from the ACLK/4. */
+ TA1CTL = TASSEL_1 | ID__4;
+
+ /* Clear everything to start with. */
+ TA1CTL |= TACLR;
+
+ /* Enable the interrupts. */
+ TA1CCTL0 = CCIE;
+
+ /* Start up clean. */
+ TA1CTL |= TACLR;
+
+ /* Continuous mode. */
+ TA1CTL |= MC__CONTINOUS;
+}
+/*-----------------------------------------------------------*/
+
+#pragma vector=TIMER1_A0_VECTOR
+static __interrupt void prvRunTimeStatsOverflowISR( void )
+{
+ ulStatsOverflowCount++;
+}
+/*-----------------------------------------------------------*/
+
+inline unsigned long ulGetRunTimeStatsTime( void )
+{
+unsigned long ulReturn;
+
+ TA1CTL &= ~MC__CONTINOUS;
+ ulReturn = ( ( ulStatsOverflowCount << 16UL ) | ( unsigned long ) TA1R );
+ TA1CTL |= MC__CONTINOUS;
+
+ return ulReturn;
+}
+/*-----------------------------------------------------------*/
diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/main.c b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/main.c
new file mode 100644
index 000000000..7f83be8ca
--- /dev/null
+++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/main.c
@@ -0,0 +1,624 @@
+/*
+ FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd.
+
+ ***************************************************************************
+ * *
+ * If you are: *
+ * *
+ * + New to FreeRTOS, *
+ * + Wanting to learn FreeRTOS or multitasking in general quickly *
+ * + Looking for basic training, *
+ * + Wanting to improve your FreeRTOS skills and productivity *
+ * *
+ * then take a look at the FreeRTOS books - available as PDF or paperback *
+ * *
+ * "Using the FreeRTOS Real Time Kernel - a Practical Guide" *
+ * http://www.FreeRTOS.org/Documentation *
+ * *
+ * A pdf reference manual is also available. Both are usually delivered *
+ * to your inbox within 20 minutes to two hours when purchased between 8am *
+ * and 8pm GMT (although please allow up to 24 hours in case of *
+ * exceptional circumstances). Thank you for your support! *
+ * *
+ ***************************************************************************
+
+ This file is part of the FreeRTOS distribution.
+
+ FreeRTOS is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License (version 2) as published by the
+ Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
+ ***NOTE*** The exception to the GPL is included to allow you to distribute
+ a combined work that includes FreeRTOS without being obliged to provide the
+ source code for proprietary components outside of the FreeRTOS kernel.
+ FreeRTOS is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ more details. You should have received a copy of the GNU General Public
+ License and the FreeRTOS license exception along with FreeRTOS; if not it
+ can be viewed here: http://www.freertos.org/a00114.html and also obtained
+ by writing to Richard Barry, contact details for whom are available on the
+ FreeRTOS WEB site.
+
+ 1 tab == 4 spaces!
+
+ http://www.FreeRTOS.org - Documentation, latest information, license and
+ contact details.
+
+ http://www.SafeRTOS.com - A version that is certified for use in safety
+ critical systems.
+
+ http://www.OpenRTOS.com - Commercial support, development, porting,
+ licensing and training services.
+*/
+
+/*
+ * The documentation page for this demo available on http://www.FreeRTOS.org
+ * documents the hardware configuration required to run this demo. It also
+ * provides more information on the expected demo application behaviour.
+ *
+ * main() creates all the demo application tasks, then starts the scheduler.
+ * A lot of the created tasks are from the pool of "standard demo" tasks. The
+ * web documentation provides more details of the standard demo tasks, which
+ * provide no particular functionality but do provide good examples of how to
+ * use the FreeRTOS API.
+ *
+ * In addition to the standard demo tasks, the following tasks, interrupts and
+ * tests are defined and/or created within this file:
+ *
+ * "LCD" task - The LCD task is a 'gatekeeper' task. It is the only task that
+ * is permitted to access the LCD and therefore ensures access to the LCD is
+ * always serialised and there are no mutual exclusion issues. When a task or
+ * an interrupt wants to write to the LCD, it does not access the LCD directly
+ * but instead sends the message to the LCD task. The LCD task then performs
+ * the actual LCD output. This mechanism also allows interrupts to, in effect,
+ * write to the LCD by sending messages to the LCD task.
+ *
+ * The LCD task is also a demonstration of a 'controller' task design pattern.
+ * Some tasks do not actually send a string to the LCD task directly, but
+ * instead send a command that is interpreted by the LCD task. In a normal
+ * application these commands can be control values or set points, in this
+ * simple example the commands just result in messages being displayed on the
+ * LCD.
+ *
+ * "Button Poll" task - This task polls the state of the 'up' key on the
+ * joystick input device. It uses the vTaskDelay() API function to control
+ * the poll rate to ensure debouncing is not necessary and that the task does
+ * not use all the available CPU processing time.
+ *
+ * Button Interrupt and run time stats display - The select button on the
+ * joystick input device is configured to generate an external interrupt. The
+ * handler for this interrupt sends a message to LCD task, which interprets the
+ * message to mean, firstly write a message to the LCD, and secondly, generate
+ * a table of run time statistics. The run time statistics are displayed as a
+ * table that contains information on how much processing time each task has
+ * been allocated since the application started to execute. This information
+ * is provided both as an absolute time, and as a percentage of the total run
+ * time. The information is displayed in the terminal IO window of the IAR
+ * embedded workbench. The online documentation for this demo shows a screen
+ * shot demonstrating where the run time stats can be viewed.
+ *
+ * Idle Hook - The idle hook is a function that is called on each iteration of
+ * the idle task. In this case it is used to place the processor into a low
+ * power mode. Note however that this application is implemented using standard
+ * components, and is therefore not optimised for low power operation. Lower
+ * power consumption would be achieved by converting polling tasks into event
+ * driven tasks, and slowing the tick interrupt frequency.
+ *
+ * "Check" function called from the tick hook - The tick hook is called during
+ * each tick interrupt. It is called from an interrupt context so must execute
+ * quickly, not attempt to block, and not call any FreeRTOS API functions that
+ * do not end in "FromISR". In this case the tick hook executes a 'check'
+ * function. This only executes every five seconds. Its main function is to
+ * check that all the standard demo tasks are still operational. Each time it
+ * executes it sends a status code to the LCD task. The LCD task interprets the
+ * code and displays an appropriate message - which will be PASS if no tasks
+ * have reported any errors, or a message stating which task has reported an
+ * error.
+ *
+ * "Reg test" tasks - These fill the registers with known values, then check
+ * that each register still contains its expected value. Each task uses
+ * different values. The tasks run with very low priority so get preempted
+ * very frequently. A check variable is incremented on each iteration of the
+ * test loop. A register containing an unexpected value is indicative of an
+ * error in the context switching mechanism and will result in a branch to a
+ * null loop - which in turn will prevent the check variable from incrementing
+ * any further and allow the check task (described a above) to determine that an
+ * error has occurred. The nature of the reg test tasks necessitates that they
+ * are written in assembly code.
+ *
+ * *NOTE 2* vApplicationSetupTimerInterrupt() is called by the kernel to let
+ * the application set up a timer to generate the tick interrupt. In this
+ * example a timer A0 is used for this purpose.
+ *
+*/
+
+/* Standard includes. */
+#include
+
+/* FreeRTOS includes. */
+#include "FreeRTOS.h"
+#include "task.h"
+#include "queue.h"
+
+/* Hardware includes. */
+#include "msp430.h"
+#include "hal_MSP-EXP430F5438.h"
+
+/* Standard demo includes. */
+#include "ParTest.h"
+#include "dynamic.h"
+#include "comtest2.h"
+#include "GenQTest.h"
+
+/* Codes sent within messages to the LCD task so the LCD task can interpret
+exactly what the message it just received was. These are sent in the
+cMessageID member of the message structure (defined below). */
+#define mainMESSAGE_BUTTON_UP ( 1 )
+#define mainMESSAGE_BUTTON_SEL ( 2 )
+#define mainMESSAGE_STATUS ( 3 )
+
+/* When the cMessageID member of the message sent to the LCD task is
+mainMESSAGE_STATUS then these definitions are sent in the ulMessageValue member
+of the same message and indicate what the status actually is. */
+#define mainERROR_DYNAMIC_TASKS ( pdPASS + 1 )
+#define mainERROR_COM_TEST ( pdPASS + 2 )
+#define mainERROR_GEN_QUEUE_TEST ( pdPASS + 3 )
+#define mainERROR_REG_TEST ( pdPASS + 4 )
+
+/* The length of the queue (the number of items the queue can hold) that is used
+to send messages from tasks and interrupts the the LCD task. */
+#define mainQUEUE_LENGTH ( 5 )
+
+/* Priorities used by the test and demo tasks. */
+#define mainLCD_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 )
+#define mainCOM_TEST_PRIORITY ( tskIDLE_PRIORITY + 2 )
+#define mainGENERIC_QUEUE_TEST_PRIORITY ( tskIDLE_PRIORITY )
+
+/* The LED used by the comtest tasks. See the comtest.c file for more
+information. */
+#define mainCOM_TEST_LED ( 1 )
+
+/* The baud rate used by the comtest tasks described at the top of this file. */
+#define mainCOM_TEST_BAUD_RATE ( 38400 )
+
+/* The maximum number of lines of text that can be displayed on the LCD. */
+#define mainMAX_LCD_LINES ( 8 )
+/*-----------------------------------------------------------*/
+
+/*
+ * The reg test tasks as described at the top of this file.
+ */
+extern void vRegTest1Task( void *pvParameters );
+extern void vRegTest2Task( void *pvParameters );
+
+/*
+ * Configures clocks, LCD, port pints, etc. necessary to execute this demo.
+ */
+static void prvSetupHardware( void );
+
+/*
+ * Definition of the LCD/controller task described in the comments at the top
+ * of this file.
+ */
+static void prvLCDTask( void *pvParameters );
+
+/*
+ * Definition of the button poll task described in the comments at the top of
+ * this file.
+ */
+static void prvButtonPollTask( void *pvParameters );
+
+/*
+ * Converts a status message value into an appropriate string for display on
+ * the LCD. The string is written to pcBuffer.
+ */
+static void prvGenerateStatusMessage( char *pcBuffer, long lStatusValue );
+
+/*-----------------------------------------------------------*/
+
+/* Variables that are incremented on each iteration of the reg test tasks -
+provided the tasks have not reported any errors. The check task inspects these
+variables to ensure they are still incrementing as expected. If a variable
+stops incrementing then it is likely that its associate task has stalled. */
+volatile unsigned short usRegTest1Counter = 0, usRegTest2Counter = 0;
+
+/* The handle of the queue used to send messages from tasks and interrupts to
+the LCD task. */
+static xQueueHandle xLCDQueue = NULL;
+
+/* The definition of each message sent from tasks and interrupts to the LCD
+task. */
+typedef struct
+{
+ char cMessageID; /* << States what the message is. */
+ unsigned long ulMessageValue; /* << States the message value (can be an integer, string pointer, etc. depending on the value of cMessageID). */
+} xQueueMessage;
+
+/*-----------------------------------------------------------*/
+
+void main( void )
+{
+ /* Configure the peripherals used by this demo application. This includes
+ configuring the joystick input select button to generate interrupts. */
+ prvSetupHardware();
+
+ /* Create the queue used by tasks and interrupts to send strings to the LCD
+ task. */
+ xLCDQueue = xQueueCreate( mainQUEUE_LENGTH, sizeof( xQueueMessage ) );
+
+ /* If the queue could not be created then don't create any tasks that might
+ attempt to use the queue. */
+ if( xLCDQueue != NULL )
+ {
+ /* Add the created queue to the queue registry so it can be viewed in
+ the IAR FreeRTOS state viewer plug-in. */
+ vQueueAddToRegistry( xLCDQueue, ( signed char * ) "LCDQueue" );
+
+ /* Create the standard demo tasks. */
+ vAltStartComTestTasks( mainCOM_TEST_PRIORITY, mainCOM_TEST_BAUD_RATE, mainCOM_TEST_LED );
+ vStartDynamicPriorityTasks();
+ vStartGenericQueueTasks( mainGENERIC_QUEUE_TEST_PRIORITY );
+
+ /* Create the LCD, button poll and register test tasks, as described at
+ the top of this file. */
+ xTaskCreate( prvLCDTask, ( signed char * ) "LCD", configMINIMAL_STACK_SIZE * 2, NULL, mainLCD_TASK_PRIORITY, NULL );
+ xTaskCreate( prvButtonPollTask, ( signed char * ) "BPoll", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
+ xTaskCreate( vRegTest1Task, ( signed char * ) "Reg1", configMINIMAL_STACK_SIZE, NULL, 0, NULL );
+ xTaskCreate( vRegTest2Task, ( signed char * ) "Reg2", configMINIMAL_STACK_SIZE, NULL, 0, NULL );
+
+ /* Start the scheduler. */
+ vTaskStartScheduler();
+ }
+
+ /* If all is well then this line will never be reached. If it is reached
+ then it is likely that there was insufficient (FreeRTOS) heap memory space
+ to create the idle task. This may have been trapped by the malloc() failed
+ hook function, if one is configured. */
+ for( ;; );
+}
+/*-----------------------------------------------------------*/
+
+static void prvLCDTask( void *pvParameters )
+{
+xQueueMessage xReceivedMessage;
+
+/* Buffer into which strings are formatted and placed ready for display on the
+LCD. Note this is a static variable to prevent it being allocated on the task
+stack, which is too small to hold such a variable. The stack size is configured
+when the task is created. */
+static char cBuffer[ 512 ];
+unsigned char ucLine = 1;
+
+
+ /* This function is the only function that uses printf(). If printf() is
+ used from any other function then some sort of mutual exclusion on stdout
+ will be necessary.
+
+ This is also the only function that is permitted to access the LCD.
+
+ First print out the number of bytes that remain in the FreeRTOS heap. This
+ can be viewed in the terminal IO window within the IAR Embedded Workbench. */
+ printf( "%d bytes of heap space remain unallocated\n", ( int ) xPortGetFreeHeapSize() );
+
+ for( ;; )
+ {
+ /* Wait for a message to be received. Using portMAX_DELAY as the block
+ time will result in an indefinite wait provided INCLUDE_vTaskSuspend is
+ set to 1 in FreeRTOSConfig.h, therefore there is no need to check the
+ function return value and the function will only return when a value
+ has been received. */
+ xQueueReceive( xLCDQueue, &xReceivedMessage, portMAX_DELAY );
+
+ /* Clear the LCD if no room remains for any more text output. */
+ if( ucLine > mainMAX_LCD_LINES )
+ {
+ halLcdClearScreen();
+ ucLine = 0;
+ }
+
+ /* What is this message? What does it contain? */
+ switch( xReceivedMessage.cMessageID )
+ {
+ case mainMESSAGE_BUTTON_UP : /* The button poll task has just
+ informed this task that the up
+ button on the joystick input has
+ been pressed or released. */
+ sprintf( cBuffer, "Button up = %d", ( int ) xReceivedMessage.ulMessageValue );
+ break;
+
+ case mainMESSAGE_BUTTON_SEL : /* The select button interrupt
+ just informed this task that the
+ select button was pressed.
+ Generate a table of task run time
+ statistics and output this to
+ the terminal IO window in the IAR
+ embedded workbench. */
+ printf( "\nTask\t Abs Time\t %%Time\n*****************************************" );
+ fflush( stdout );
+ //vTaskGetRunTimeStats( ( signed char * ) cBuffer );
+ //printf( cBuffer );
+ //fflush( stdout );
+
+ /* Also print out a message to
+ the LCD - in this case the
+ pointer to the string to print
+ is sent directly in the
+ ulMessageValue member of the
+ message. This just demonstrates
+ a different communication
+ technique. */
+ sprintf( cBuffer, "%s", ( char * ) xReceivedMessage.ulMessageValue );
+ break;
+
+ case mainMESSAGE_STATUS : /* The tick interrupt hook
+ function has just informed this
+ task of the system status.
+ Generate a string in accordance
+ with the status value. */
+ prvGenerateStatusMessage( cBuffer, xReceivedMessage.ulMessageValue );
+ break;
+
+ default : sprintf( cBuffer, "Unknown message" );
+ break;
+ }
+
+ /* Output the message that was placed into the cBuffer array within the
+ switch statement above, then move onto the next line ready for the next
+ message to arrive on the queue. */
+ halLcdPrintLine( cBuffer, ucLine, OVERWRITE_TEXT );
+ ucLine++;
+ }
+}
+/*-----------------------------------------------------------*/
+
+static void prvGenerateStatusMessage( char *pcBuffer, long lStatusValue )
+{
+ /* Just a utility function to convert a status value into a meaningful
+ string for output onto the LCD. */
+ switch( lStatusValue )
+ {
+ case pdPASS : sprintf( pcBuffer, "Status = PASS" );
+ break;
+ case mainERROR_DYNAMIC_TASKS : sprintf( pcBuffer, "Err: Dynamic tsks" );
+ break;
+ case mainERROR_COM_TEST : sprintf( pcBuffer, "Err: COM test" );
+ break;
+ case mainERROR_GEN_QUEUE_TEST : sprintf( pcBuffer, "Error: Gen Q test" );
+ break;
+ case mainERROR_REG_TEST : sprintf( pcBuffer, "Error: Reg test" );
+ break;
+ default : sprintf( pcBuffer, "Unknown status" );
+ break;
+ }
+}
+/*-----------------------------------------------------------*/
+
+static void prvButtonPollTask( void *pvParameters )
+{
+unsigned char ucLastState = pdFALSE, ucState;
+xQueueMessage xMessage;
+
+ /* This tasks performs the button polling functionality as described at the
+ top of this file. */
+ for( ;; )
+ {
+ /* Check the button state. */
+ ucState = ( halButtonsPressed() & BUTTON_UP );
+
+ if( ucState != 0 )
+ {
+ /* The button was pressed. */
+ ucState = pdTRUE;
+ }
+
+ if( ucState != ucLastState )
+ {
+ /* The state has changed, send a message to the LCD task. */
+ xMessage.cMessageID = mainMESSAGE_BUTTON_UP;
+ xMessage.ulMessageValue = ( unsigned long ) ucState;
+ ucLastState = ucState;
+ xQueueSend( xLCDQueue, &xMessage, portMAX_DELAY );
+ }
+
+ /* Block for 10 milliseconds so this task does not utilise all the CPU
+ time and debouncing of the button is not necessary. */
+ vTaskDelay( 10 / portTICK_RATE_MS );
+ }
+}
+/*-----------------------------------------------------------*/
+
+static void prvSetupHardware( void )
+{
+/* Convert a Hz value to a KHz value, as required by the Init_FLL_Settle()
+function. */
+unsigned long ulCPU_Clock_KHz = ( configCPU_CLOCK_HZ / 1000UL );
+
+ taskDISABLE_INTERRUPTS();
+
+ /* Disable the watchdog. */
+ WDTCTL = WDTPW + WDTHOLD;
+
+ halBoardInit();
+
+ LFXT_Start( XT1DRIVE_0 );
+ Init_FLL_Settle( ( unsigned short ) ulCPU_Clock_KHz, 488 );
+
+ halButtonsInit( BUTTON_ALL );
+ halButtonsInterruptEnable( BUTTON_SELECT );
+
+ /* Initialise the LCD, but note that the backlight is not used as the
+ library function uses timer A0 to modulate the backlight, and this file
+ defines vApplicationSetupTimerInterrupt() to also use timer A0 to generate
+ the tick interrupt. If the backlight is required, then change either the
+ halLCD library or vApplicationSetupTimerInterrupt() to use a different
+ timer. Timer A1 is used for the run time stats time base6. */
+ halLcdInit();
+ halLcdSetContrast( 100 );
+ halLcdClearScreen();
+
+ halLcdPrintLine( " www.FreeRTOS.org", 0, OVERWRITE_TEXT );
+}
+/*-----------------------------------------------------------*/
+
+void vApplicationTickHook( void )
+{
+static unsigned short usLastRegTest1Counter = 0, usLastRegTest2Counter = 0;
+static unsigned long ulCounter = 0;
+static const unsigned long ulCheckFrequency = 5000UL / portTICK_RATE_MS;
+portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+
+/* Define the status message that is sent to the LCD task. By default the
+status is PASS. */
+static xQueueMessage xStatusMessage = { mainMESSAGE_STATUS, pdPASS };
+
+ /* This is called from within the tick interrupt and performs the 'check'
+ functionality as described in the comments at the top of this file.
+
+ Is it time to perform the 'check' functionality again? */
+ ulCounter++;
+ if( ulCounter >= ulCheckFrequency )
+ {
+ /* See if the standard demo tasks are executing as expected, changing
+ the message that is sent to the LCD task from PASS to an error code if
+ any tasks set reports an error. */
+ if( xAreComTestTasksStillRunning() != pdPASS )
+ {
+ xStatusMessage.ulMessageValue = mainERROR_COM_TEST;
+ }
+
+ if( xAreDynamicPriorityTasksStillRunning() != pdPASS )
+ {
+ xStatusMessage.ulMessageValue = mainERROR_DYNAMIC_TASKS;
+ }
+
+ if( xAreGenericQueueTasksStillRunning() != pdPASS )
+ {
+ xStatusMessage.ulMessageValue = mainERROR_GEN_QUEUE_TEST;
+ }
+
+ /* Check the reg test tasks are still cycling. They will stop
+ incrementing their loop counters if they encounter an error. */
+ if( usRegTest1Counter == usLastRegTest1Counter )
+ {
+ xStatusMessage.ulMessageValue = mainERROR_REG_TEST;
+ }
+
+ if( usRegTest2Counter == usLastRegTest2Counter )
+ {
+ xStatusMessage.ulMessageValue = mainERROR_REG_TEST;
+ }
+
+ usLastRegTest1Counter = usRegTest1Counter;
+ usLastRegTest2Counter = usRegTest2Counter;
+
+ /* As this is the tick hook the lHigherPriorityTaskWoken parameter is not
+ needed (a context switch is going to be performed anyway), but it must
+ still be provided. */
+ xQueueSendFromISR( xLCDQueue, &xStatusMessage, &xHigherPriorityTaskWoken );
+ ulCounter = 0;
+ }
+
+ /* Just periodically toggle an LED to show that the tick interrupt is
+ running. Note that this access LED_PORT_OUT in a non-atomic way, so tasks
+ that access the same port must do so from a critical section. */
+ if( ( ulCounter & 0xff ) == 0 )
+ {
+ if( ( LED_PORT_OUT & LED_1 ) == 0 )
+ {
+ LED_PORT_OUT |= LED_1;
+ }
+ else
+ {
+ LED_PORT_OUT &= ~LED_1;
+ }
+ }
+}
+/*-----------------------------------------------------------*/
+
+#pragma vector=PORT2_VECTOR
+interrupt void prvSelectButtonInterrupt( void )
+{
+/* Define the message sent to the LCD task from this interrupt. */
+static const xQueueMessage xMessage = { mainMESSAGE_BUTTON_SEL, ( unsigned long ) "Select Interrupt" };
+portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+
+ /* This is the interrupt handler for the joystick select button input.
+ The button has been pushed, write a message to the LCD via the LCD task. */
+ xQueueSendFromISR( xLCDQueue, &xMessage, &xHigherPriorityTaskWoken );
+
+ P2IFG = 0;
+
+ /* If writing to xLCDQueue caused a task to unblock, and the unblocked task
+ has a priority equal to or above the task that this interrupt interrupted,
+ then lHigherPriorityTaskWoken will have been set to pdTRUE internally within
+ xQueuesendFromISR(), and portEND_SWITCHING_ISR() will ensure that this
+ interrupt returns directly to the higher priority unblocked task. */
+ portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
+}
+/*-----------------------------------------------------------*/
+
+/* The MSP430X port uses this callback function to configure its tick interrupt.
+This allows the application to choose the tick interrupt source.
+configTICK_INTERRUPT_VECTOR must also be set in FreeRTOSConfig.h to the correct
+interrupt vector for the chosen tick interrupt source. This implementation of
+vApplicationSetupTimerInterrupt() generates the tick from timer A0, so in this
+case configTICK_INTERRUPT_VECTOR is set to TIMER0_A0_VECTOR. */
+void vApplicationSetupTimerInterrupt( void )
+{
+const unsigned short usACLK_Frequency_Hz = 32768;
+
+ /* Ensure the timer is stopped. */
+ TA0CTL = 0;
+
+ /* Run the timer from the ACLK. */
+ TA0CTL = TASSEL_1;
+
+ /* Clear everything to start with. */
+ TA0CTL |= TACLR;
+
+ /* Set the compare match value according to the tick rate we want. */
+ TA0CCR0 = usACLK_Frequency_Hz / configTICK_RATE_HZ;
+
+ /* Enable the interrupts. */
+ TA0CCTL0 = CCIE;
+
+ /* Start up clean. */
+ TA0CTL |= TACLR;
+
+ /* Up mode. */
+ TA0CTL |= MC_1;
+}
+/*-----------------------------------------------------------*/
+
+void vApplicationIdleHook( void )
+{
+ /* Called on each iteration of the idle task. In this case the idle task
+ just enters a low(ish) power mode. */
+ __bis_SR_register( LPM1_bits + GIE );
+}
+/*-----------------------------------------------------------*/
+
+void vApplicationMallocFailedHook( void )
+{
+ /* Called if a call to pvPortMalloc() fails because there is insufficient
+ free memory available in the FreeRTOS heap. pvPortMalloc() is called
+ internally by FreeRTOS API functions that create tasks, queues or
+ semaphores. */
+ taskDISABLE_INTERRUPTS();
+ for( ;; );
+}
+/*-----------------------------------------------------------*/
+
+void vApplicationStackOverflowHook( xTaskHandle *pxTask, signed char *pcTaskName )
+{
+ ( void ) pxTask;
+ ( void ) pcTaskName;
+
+ /* Run time stack overflow checking is performed if
+ configconfigCHECK_FOR_STACK_OVERFLOW is defined to 1 or 2. This hook
+ function is called if a stack overflow is detected. */
+ taskDISABLE_INTERRUPTS();
+ for( ;; );
+}
+/*-----------------------------------------------------------*/
+
diff --git a/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/serial.c b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/serial.c
new file mode 100644
index 000000000..639a7a32b
--- /dev/null
+++ b/Demo/MSP430X_MSP430F5438_CCS4/Demo_Source/serial.c
@@ -0,0 +1,205 @@
+/*
+ FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd.
+
+ ***************************************************************************
+ * *
+ * If you are: *
+ * *
+ * + New to FreeRTOS, *
+ * + Wanting to learn FreeRTOS or multitasking in general quickly *
+ * + Looking for basic training, *
+ * + Wanting to improve your FreeRTOS skills and productivity *
+ * *
+ * then take a look at the FreeRTOS books - available as PDF or paperback *
+ * *
+ * "Using the FreeRTOS Real Time Kernel - a Practical Guide" *
+ * http://www.FreeRTOS.org/Documentation *
+ * *
+ * A pdf reference manual is also available. Both are usually delivered *
+ * to your inbox within 20 minutes to two hours when purchased between 8am *
+ * and 8pm GMT (although please allow up to 24 hours in case of *
+ * exceptional circumstances). Thank you for your support! *
+ * *
+ ***************************************************************************
+
+ This file is part of the FreeRTOS distribution.
+
+ FreeRTOS is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License (version 2) as published by the
+ Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
+ ***NOTE*** The exception to the GPL is included to allow you to distribute
+ a combined work that includes FreeRTOS without being obliged to provide the
+ source code for proprietary components outside of the FreeRTOS kernel.
+ FreeRTOS is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ more details. You should have received a copy of the GNU General Public
+ License and the FreeRTOS license exception along with FreeRTOS; if not it
+ can be viewed here: http://www.freertos.org/a00114.html and also obtained
+ by writing to Richard Barry, contact details for whom are available on the
+ FreeRTOS WEB site.
+
+ 1 tab == 4 spaces!
+
+ http://www.FreeRTOS.org - Documentation, latest information, license and
+ contact details.
+
+ http://www.SafeRTOS.com - A version that is certified for use in safety
+ critical systems.
+
+ http://www.OpenRTOS.com - Commercial support, development, porting,
+ licensing and training services.
+*/
+
+
+/* BASIC INTERRUPT DRIVEN SERIAL PORT DRIVER.
+ *
+ * This is not a proper UART driver. It only supports one port, uses loopback
+ * mode, and is used to test interrupts that use the FreeRTOS API as part of
+ * a wider test suite. Nor is it intended to show an efficient implementation
+ * of a UART interrupt service routine as queues are used to pass individual
+ * characters one at a time!
+ */
+
+/* Standard includes. */
+#include
+
+/* Scheduler includes. */
+#include "FreeRTOS.h"
+#include "queue.h"
+#include "task.h"
+
+/* Demo application includes. */
+#include "serial.h"
+
+/* Misc. constants. */
+#define serNO_BLOCK ( ( portTickType ) 0 )
+
+/* The queue used to hold received characters. */
+static xQueueHandle xRxedChars;
+
+/* The queue used to hold characters waiting transmission. */
+static xQueueHandle xCharsForTx;
+
+/*-----------------------------------------------------------*/
+
+xComPortHandle xSerialPortInitMinimal( unsigned portLONG ulWantedBaud, unsigned portBASE_TYPE uxQueueLength )
+{
+unsigned portLONG ulBaudRateCount;
+
+ /* Initialise the hardware. */
+
+ /* Generate the baud rate constants for the wanted baud rate. */
+ ulBaudRateCount = configCPU_CLOCK_HZ / ulWantedBaud;
+
+ portENTER_CRITICAL();
+ {
+ /* Create the queues used by the com test task. */
+ xRxedChars = xQueueCreate( uxQueueLength, ( unsigned portBASE_TYPE ) sizeof( signed portCHAR ) );
+ xCharsForTx = xQueueCreate( uxQueueLength, ( unsigned portBASE_TYPE ) sizeof( signed portCHAR ) );
+
+ /* Reset UART. */
+ UCA1CTL1 |= UCSWRST;
+
+ /* Use SMCLK. */
+ UCA1CTL1 = UCSSEL0 | UCSSEL1;
+
+ /* Setup baud rate low byte. */
+ UCA1BR0 = ( unsigned portCHAR ) ( ulBaudRateCount & ( unsigned portLONG ) 0xff );
+
+ /* Setup baud rate high byte. */
+ ulBaudRateCount >>= 8UL;
+ UCA1BR1 = ( unsigned portCHAR ) ( ulBaudRateCount & ( unsigned portLONG ) 0xff );
+
+ /* UCLISTEN sets loopback mode! */
+ UCA1STAT = UCLISTEN;
+
+ /* Enable interrupts. */
+ UCA1IE |= UCRXIE;
+
+ /* Take out of reset. */
+ UCA1CTL1 &= ~UCSWRST;
+ }
+ portEXIT_CRITICAL();
+
+ /* Note the comments at the top of this file about this not being a generic
+ UART driver. */
+ return NULL;
+}
+/*-----------------------------------------------------------*/
+
+signed portBASE_TYPE xSerialGetChar( xComPortHandle pxPort, signed portCHAR *pcRxedChar, portTickType xBlockTime )
+{
+ /* Get the next character from the buffer. Return false if no characters
+ are available, or arrive before xBlockTime expires. */
+ if( xQueueReceive( xRxedChars, pcRxedChar, xBlockTime ) )
+ {
+ return pdTRUE;
+ }
+ else
+ {
+ return pdFALSE;
+ }
+}
+/*-----------------------------------------------------------*/
+
+signed portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, signed portCHAR cOutChar, portTickType xBlockTime )
+{
+signed portBASE_TYPE xReturn;
+
+ /* Send the next character to the queue of characters waiting transmission,
+ then enable the UART Tx interrupt, just in case UART transmission has already
+ completed and switched itself off. */
+ xReturn = xQueueSend( xCharsForTx, &cOutChar, xBlockTime );
+ UCA1IE |= UCTXIE;
+
+ return xReturn;
+}
+/*-----------------------------------------------------------*/
+
+#pragma vector=USCI_A1_VECTOR
+interrupt void prvUSCI_A0_ISR( void )
+{
+signed portCHAR cChar;
+portBASE_TYPE xTaskWoken = pdFALSE;
+portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+
+ while( ( UCA1IFG & UCRXIFG ) != 0 )
+ {
+ /* Get the character from the UART and post it on the queue of Rxed
+ characters. */
+ cChar = UCA1RXBUF;
+ xQueueSendFromISR( xRxedChars, &cChar, &xHigherPriorityTaskWoken );
+ }
+
+ /* If there is a Tx interrupt pending and the tx interrupts are enabled. */
+ if( ( UCA1IFG & UCTXIFG ) != 0 )
+ {
+ /* The previous character has been transmitted. See if there are any
+ further characters waiting transmission. */
+ if( xQueueReceiveFromISR( xCharsForTx, &cChar, &xTaskWoken ) == pdTRUE )
+ {
+ /* There was another character queued - transmit it now. */
+ UCA1TXBUF = cChar;
+ }
+ else
+ {
+ /* There were no other characters to transmit - disable the Tx
+ interrupt. */
+ UCA1IE &= ~UCTXIE;
+ }
+ }
+
+ __bic_SR_register_on_exit( SCG1 + SCG0 + OSCOFF + CPUOFF );
+
+ /* If writing to a queue caused a task to unblock, and the unblocked task
+ has a priority equal to or above the task that this interrupt interrupted,
+ then lHigherPriorityTaskWoken will have been set to pdTRUE internally within
+ xQueuesendFromISR(), and portEND_SWITCHING_ISR() will ensure that this
+ interrupt returns directly to the higher priority unblocked task.
+
+ THIS MUST BE THE LAST THING DONE IN THE ISR. */
+ portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
+}
+
+
diff --git a/Demo/MSP430X_MSP430F5438_CCS4/MSP430F5438A.ccxml b/Demo/MSP430X_MSP430F5438_CCS4/MSP430F5438A.ccxml
new file mode 100644
index 000000000..ab962b6ab
--- /dev/null
+++ b/Demo/MSP430X_MSP430F5438_CCS4/MSP430F5438A.ccxml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Demo/MSP430X_MSP430F5438_CCS4/lnk_msp430f5438a.cmd b/Demo/MSP430X_MSP430F5438_CCS4/lnk_msp430f5438a.cmd
new file mode 100644
index 000000000..449f775c5
--- /dev/null
+++ b/Demo/MSP430X_MSP430F5438_CCS4/lnk_msp430f5438a.cmd
@@ -0,0 +1,197 @@
+/******************************************************************************/
+/* lnk_msp430f5438a.cmd - LINKER COMMAND FILE FOR LINKING MSP430F5438A PROGRAMS */
+/* */
+/* Usage: lnk430 -o -m