/******************************************************************************
Project: Portable command line ISP for NXP LPC1000 / LPC2000 family
and Analog Devices ADUC70xx
Filename: lsp21isp.h
Compiler: Microsoft VC 6/7, Microsoft VS2008, Microsoft VS2010,
GCC Cygwin, GCC Linux, GCC ARM ELF
Author: Martin Maurer (Martin.Maurer@clibb.de)
Copyright: (c) Martin Maurer 2003-2011, All rights reserved
Portions Copyright (c) by Aeolus Development 2004 http://www.aeolusdevelopment.com
This file is part of lpc21isp.
lpc21isp is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
any later version.
lpc21isp 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 Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
and GNU General Public License along with lpc21isp.
If not, see .
*/
// #define INTEGRATED_IN_WIN_APP
#if defined(_WIN32) && !defined(__CYGWIN__)
#define COMPILE_FOR_WINDOWS
#define COMPILED_FOR "Windows"
#elif defined(__CYGWIN__)
#define COMPILE_FOR_CYGWIN
#define COMPILED_FOR "Cygwin"
#elif defined(__arm__) || defined(__thumb__)
#define COMPILE_FOR_LPC21
#define COMPILED_FOR "ARM"
#define printf iprintf
#elif defined(__APPLE__)
#define COMPILE_FOR_LINUX
#define COMPILED_FOR "Apple MacOS X"
#elif defined(__FreeBSD__)
#define COMPILE_FOR_LINUX
#define COMPILED_FOR "FreeBSD"
#elif defined(__OpenBSD__)
#define COMPILE_FOR_LINUX
#define COMPILED_FOR "OpenBSD"
#else
#define COMPILE_FOR_LINUX
#define COMPILED_FOR "Linux"
#endif
// The Required features can be enabled / disabled here
#define LPC_SUPPORT
#ifndef COMPILE_FOR_LPC21
#define AD_SUPPORT
#define TERMINAL_SUPPORT
#endif
#if defined COMPILE_FOR_WINDOWS || defined COMPILE_FOR_CYGWIN
#include
#include
#endif // defined COMPILE_FOR_WINDOWS || defined COMPILE_FOR_CYGWIN
#if defined COMPILE_FOR_WINDOWS
#include
//#define TRACE(x) OutputDebugString(x)
#define TRACE(x) printf("%s",x)
#endif // defined COMPILE_FOR_WINDOWS
#if defined COMPILE_FOR_CYGWIN
//#define TRACE(x) OutputDebugString(x)
#define TRACE(x) printf("%s",x)
#endif // defined COMPILE_FOR_WINDOWS
#if defined COMPILE_FOR_LINUX
#include
#include
#include
#include
#include
#include
extern void Sleep(unsigned long MilliSeconds);
#define TRACE(x) printf("%s",x)
#endif // defined COMPILE_FOR_LINUX
#if defined COMPILE_FOR_LINUX || defined COMPILE_FOR_CYGWIN
#include
#include // for read and return value of lseek
#include // for select_time
extern int kbhit(void);
extern int getch(void);
extern struct termios keyboard_origtty;
#endif // defined COMPILE_FOR_LINUX || defined COMPILE_FOR_CYGWIN
#include // isdigit()
#include // stdout
#include
#include
#if defined (COMPILE_FOR_LINUX)
#if defined(__OpenBSD__)
#include
#else
#include
#endif
#endif
#if defined COMPILE_FOR_LPC21
#include
#include
//#include // if using libc serial port communication
#else
#include
#endif
typedef enum
{
NXP_ARM,
ANALOG_DEVICES_ARM
} TARGET;
typedef enum
{
PROGRAM_MODE,
RUN_MODE
} TARGET_MODE;
typedef enum
{
FORMAT_BINARY,
FORMAT_HEX
} FILE_FORMAT_TYPE;
typedef unsigned char BINARY; // Data type used for microcontroller
/** Used to create list of files to read in. */
typedef struct file_list FILE_LIST;
/** Structure used to build list of input files. */
struct file_list
{
const char *name; /**< The name of the input file. */
FILE_LIST *prev; /**< The previous file name in the list.*/
char hex_flag; /**< True if the input file is hex. */
};
typedef struct
{
#if !defined COMPILE_FOR_LPC21
TARGET micro; // The type of micro that will be programmed.
FILE_FORMAT_TYPE FileFormat;
unsigned char ProgramChip; // Normally set
unsigned char ControlLines;
unsigned char ControlLinesSwapped;
unsigned char ControlLinesInverted;
unsigned char LogFile;
FILE_LIST *f_list; // List of files to read in.
int nQuestionMarks; // how many times to try to synchronise
int DoNotStart;
char *serial_port; // Name of the serial port to use to
// communicate with the microcontroller.
// Read from the command line.
#endif // !defined COMPILE_FOR_LPC21
unsigned char TerminalOnly; // Declared here for lazyness saves ifdef's
#ifdef TERMINAL_SUPPORT
unsigned char TerminalAfterUpload;
unsigned char LocalEcho;
#endif
unsigned char HalfDuplex; // Only used for LPC Programming
unsigned char DetectOnly;
unsigned char WipeDevice;
unsigned char Verify;
int DetectedDevice; /* index in LPCtypes[] array */
char *baud_rate; /**< Baud rate to use on the serial
* port communicating with the
* microcontroller. Read from the
* command line. */
char StringOscillator[6]; /**< Holds representation of oscillator
* speed from the command line. */
BINARY *FileContent;
BINARY *BinaryContent; /**< Binary image of the */
/* microcontroller's memory. */
unsigned long BinaryLength;
unsigned long BinaryOffset;
unsigned long StartAddress;
unsigned long BinaryMemSize;
#if defined COMPILE_FOR_WINDOWS || defined COMPILE_FOR_CYGWIN
HANDLE hCom;
#endif // defined COMPILE_FOR_WINDOWS || defined COMPILE_FOR_CYGWIN
#if defined COMPILE_FOR_LINUX || defined COMPILE_FOR_LPC21
int fdCom;
#endif // defined COMPILE_FOR_LINUX || defined COMPILE_FOR_LPC21
#if defined COMPILE_FOR_LINUX
struct termios oldtio, newtio;
#endif // defined COMPILE_FOR_LINUX
#ifdef INTEGRATED_IN_WIN_APP
unsigned char NoSync;
#endif
unsigned serial_timeout_count; /**< Local used to track timeouts on serial port read. */
} ISP_ENVIRONMENT;
#if defined COMPILE_FOR_LPC21
#define DebugPrintf(in, ...)
#else
extern int debug_level;
#if defined INTEGRATED_IN_WIN_APP
#define DebugPrintf AppDebugPrintf
void AppDebugPrintf(int level, const char *fmt, ...);
#define exit(val) AppException(val)
void AppException(int exception_level);
int AppDoProgram(int argc, char *argv[]);
#define Exclude_kbhit 1
int AppSyncing(int trials);
void AppWritten(int size);
#else
void DebugPrintf(int level, const char *fmt, ...);
//#define DebugPrintf(level, ...) if (level <= debug_level) { TRACE( __VA_ARGS__ ); }
#endif
void ClearSerialPortBuffers(ISP_ENVIRONMENT *IspEnvironment);
#endif
#if defined COMPILE_FOR_LINUX
#define stricmp strcasecmp
#define strnicmp strncasecmp
#endif // defined COMPILE_FOR_LINUX
#ifndef O_BINARY
#define O_BINARY 0
#endif // O_BINARY
#ifndef DWORD
#define DWORD unsigned long
#endif // DWORD
/*
debug levels
0 - very quiet - Nothing gets printed at this level
1 - quiet - Only error messages should be printed
2 - indicate progress - Add progress messages
3 - first level debug - Major level tracing
4 - second level debug - Add detailed debugging
5 - log comm's - log serial I/O
*/
void ReceiveComPort(ISP_ENVIRONMENT *IspEnvironment,
const char *Ans, unsigned long MaxSize,
unsigned long *RealSize, unsigned long WantedNr0x0A,
unsigned timeOutMilliseconds);
void PrepareKeyboardTtySettings(void);
void ResetKeyboardTtySettings(void);
void ResetTarget(ISP_ENVIRONMENT *IspEnvironment, TARGET_MODE mode);
void DumpString(int level, const void *s, size_t size, const char *prefix_string);
void SendComPort(ISP_ENVIRONMENT *IspEnvironment, const char *s);
void SendComPortBlock(ISP_ENVIRONMENT *IspEnvironment, const void *s, size_t n);
int ReceiveComPortBlockComplete(ISP_ENVIRONMENT *IspEnvironment, void *block, size_t size, unsigned timeout);
void ClearSerialPortBuffers(ISP_ENVIRONMENT *IspEnvironment);
int lpctest(char* FileName);