| Index: gdb/sh-stub.c
|
| diff --git a/gdb/sh-stub.c b/gdb/sh-stub.c
|
| deleted file mode 100644
|
| index 76c98a5e8ad94129f3500681d63d476e8f4f3952..0000000000000000000000000000000000000000
|
| --- a/gdb/sh-stub.c
|
| +++ /dev/null
|
| @@ -1,1583 +0,0 @@
|
| -/* sh-stub.c -- debugging stub for the Renesas-SH.
|
| -
|
| - NOTE!! This code has to be compiled with optimization, otherwise the
|
| - function inlining which generates the exception handlers won't work.
|
| -
|
| -*/
|
| -
|
| -/* This is originally based on an m68k software stub written by Glenn
|
| - Engel at HP, but has changed quite a bit.
|
| -
|
| - Modifications for the SH by Ben Lee and Steve Chamberlain
|
| -
|
| -*/
|
| -
|
| -/****************************************************************************
|
| -
|
| - THIS SOFTWARE IS NOT COPYRIGHTED
|
| -
|
| - HP offers the following for use in the public domain. HP makes no
|
| - warranty with regard to the software or it's performance and the
|
| - user accepts the software "AS IS" with all faults.
|
| -
|
| - HP DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD
|
| - TO THIS SOFTWARE INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
| - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
| -
|
| -****************************************************************************/
|
| -
|
| -
|
| -/* Remote communication protocol.
|
| -
|
| - A debug packet whose contents are <data>
|
| - is encapsulated for transmission in the form:
|
| -
|
| - $ <data> # CSUM1 CSUM2
|
| -
|
| - <data> must be ASCII alphanumeric and cannot include characters
|
| - '$' or '#'. If <data> starts with two characters followed by
|
| - ':', then the existing stubs interpret this as a sequence number.
|
| -
|
| - CSUM1 and CSUM2 are ascii hex representation of an 8-bit
|
| - checksum of <data>, the most significant nibble is sent first.
|
| - the hex digits 0-9,a-f are used.
|
| -
|
| - Receiver responds with:
|
| -
|
| - + - if CSUM is correct and ready for next packet
|
| - - - if CSUM is incorrect
|
| -
|
| - <data> is as follows:
|
| - All values are encoded in ascii hex digits.
|
| -
|
| - Request Packet
|
| -
|
| - read registers g
|
| - reply XX....X Each byte of register data
|
| - is described by two hex digits.
|
| - Registers are in the internal order
|
| - for GDB, and the bytes in a register
|
| - are in the same order the machine uses.
|
| - or ENN for an error.
|
| -
|
| - write regs GXX..XX Each byte of register data
|
| - is described by two hex digits.
|
| - reply OK for success
|
| - ENN for an error
|
| -
|
| - write reg Pn...=r... Write register n... with value r...,
|
| - which contains two hex digits for each
|
| - byte in the register (target byte
|
| - order).
|
| - reply OK for success
|
| - ENN for an error
|
| - (not supported by all stubs).
|
| -
|
| - read mem mAA..AA,LLLL AA..AA is address, LLLL is length.
|
| - reply XX..XX XX..XX is mem contents
|
| - Can be fewer bytes than requested
|
| - if able to read only part of the data.
|
| - or ENN NN is errno
|
| -
|
| - write mem MAA..AA,LLLL:XX..XX
|
| - AA..AA is address,
|
| - LLLL is number of bytes,
|
| - XX..XX is data
|
| - reply OK for success
|
| - ENN for an error (this includes the case
|
| - where only part of the data was
|
| - written).
|
| -
|
| - cont cAA..AA AA..AA is address to resume
|
| - If AA..AA is omitted,
|
| - resume at same address.
|
| -
|
| - step sAA..AA AA..AA is address to resume
|
| - If AA..AA is omitted,
|
| - resume at same address.
|
| -
|
| - last signal ? Reply the current reason for stopping.
|
| - This is the same reply as is generated
|
| - for step or cont : SAA where AA is the
|
| - signal number.
|
| -
|
| - There is no immediate reply to step or cont.
|
| - The reply comes when the machine stops.
|
| - It is SAA AA is the "signal number"
|
| -
|
| - or... TAAn...:r...;n:r...;n...:r...;
|
| - AA = signal number
|
| - n... = register number
|
| - r... = register contents
|
| - or... WAA The process exited, and AA is
|
| - the exit status. This is only
|
| - applicable for certains sorts of
|
| - targets.
|
| - kill request k
|
| -
|
| - toggle debug d toggle debug flag (see 386 & 68k stubs)
|
| - reset r reset -- see sparc stub.
|
| - reserved <other> On other requests, the stub should
|
| - ignore the request and send an empty
|
| - response ($#<checksum>). This way
|
| - we can extend the protocol and GDB
|
| - can tell whether the stub it is
|
| - talking to uses the old or the new.
|
| - search tAA:PP,MM Search backwards starting at address
|
| - AA for a match with pattern PP and
|
| - mask MM. PP and MM are 4 bytes.
|
| - Not supported by all stubs.
|
| -
|
| - general query qXXXX Request info about XXXX.
|
| - general set QXXXX=yyyy Set value of XXXX to yyyy.
|
| - query sect offs qOffsets Get section offsets. Reply is
|
| - Text=xxx;Data=yyy;Bss=zzz
|
| - console output Otext Send text to stdout. Only comes from
|
| - remote target.
|
| -
|
| - Responses can be run-length encoded to save space. A '*' means that
|
| - the next character is an ASCII encoding giving a repeat count which
|
| - stands for that many repititions of the character preceding the '*'.
|
| - The encoding is n+29, yielding a printable character where n >=3
|
| - (which is where rle starts to win). Don't use an n > 126.
|
| -
|
| - So
|
| - "0* " means the same as "0000". */
|
| -
|
| -#include <string.h>
|
| -#include <setjmp.h>
|
| -
|
| -/* Renesas SH architecture instruction encoding masks */
|
| -
|
| -#define COND_BR_MASK 0xff00
|
| -#define UCOND_DBR_MASK 0xe000
|
| -#define UCOND_RBR_MASK 0xf0df
|
| -#define TRAPA_MASK 0xff00
|
| -
|
| -#define COND_DISP 0x00ff
|
| -#define UCOND_DISP 0x0fff
|
| -#define UCOND_REG 0x0f00
|
| -
|
| -/* Renesas SH instruction opcodes */
|
| -
|
| -#define BF_INSTR 0x8b00
|
| -#define BT_INSTR 0x8900
|
| -#define BRA_INSTR 0xa000
|
| -#define BSR_INSTR 0xb000
|
| -#define JMP_INSTR 0x402b
|
| -#define JSR_INSTR 0x400b
|
| -#define RTS_INSTR 0x000b
|
| -#define RTE_INSTR 0x002b
|
| -#define TRAPA_INSTR 0xc300
|
| -#define SSTEP_INSTR 0xc3ff
|
| -
|
| -/* Renesas SH processor register masks */
|
| -
|
| -#define T_BIT_MASK 0x0001
|
| -
|
| -/*
|
| - * BUFMAX defines the maximum number of characters in inbound/outbound
|
| - * buffers. At least NUMREGBYTES*2 are needed for register packets.
|
| - */
|
| -#define BUFMAX 1024
|
| -
|
| -/*
|
| - * Number of bytes for registers
|
| - */
|
| -#define NUMREGBYTES 112 /* 92 */
|
| -
|
| -/*
|
| - * typedef
|
| - */
|
| -typedef void (*Function) ();
|
| -
|
| -/*
|
| - * Forward declarations
|
| - */
|
| -
|
| -static int hex (char);
|
| -static char *mem2hex (char *, char *, int);
|
| -static char *hex2mem (char *, char *, int);
|
| -static int hexToInt (char **, int *);
|
| -static unsigned char *getpacket (void);
|
| -static void putpacket (char *);
|
| -static void handle_buserror (void);
|
| -static int computeSignal (int exceptionVector);
|
| -static void handle_exception (int exceptionVector);
|
| -void init_serial();
|
| -
|
| -void putDebugChar (char);
|
| -char getDebugChar (void);
|
| -
|
| -/* These are in the file but in asm statements so the compiler can't see them */
|
| -void catch_exception_4 (void);
|
| -void catch_exception_6 (void);
|
| -void catch_exception_9 (void);
|
| -void catch_exception_10 (void);
|
| -void catch_exception_11 (void);
|
| -void catch_exception_32 (void);
|
| -void catch_exception_33 (void);
|
| -void catch_exception_255 (void);
|
| -
|
| -
|
| -
|
| -#define catch_exception_random catch_exception_255 /* Treat all odd ones like 255 */
|
| -
|
| -void breakpoint (void);
|
| -
|
| -
|
| -#define init_stack_size 8*1024 /* if you change this you should also modify BINIT */
|
| -#define stub_stack_size 8*1024
|
| -
|
| -int init_stack[init_stack_size] __attribute__ ((section ("stack"))) = {0};
|
| -int stub_stack[stub_stack_size] __attribute__ ((section ("stack"))) = {0};
|
| -
|
| -
|
| -void INIT ();
|
| -void BINIT ();
|
| -
|
| -#define CPU_BUS_ERROR_VEC 9
|
| -#define DMA_BUS_ERROR_VEC 10
|
| -#define NMI_VEC 11
|
| -#define INVALID_INSN_VEC 4
|
| -#define INVALID_SLOT_VEC 6
|
| -#define TRAP_VEC 32
|
| -#define IO_VEC 33
|
| -#define USER_VEC 255
|
| -
|
| -
|
| -
|
| -char in_nmi; /* Set when handling an NMI, so we don't reenter */
|
| -int dofault; /* Non zero, bus errors will raise exception */
|
| -
|
| -int *stub_sp;
|
| -
|
| -/* debug > 0 prints ill-formed commands in valid packets & checksum errors */
|
| -int remote_debug;
|
| -
|
| -/* jump buffer used for setjmp/longjmp */
|
| -jmp_buf remcomEnv;
|
| -
|
| -enum regnames
|
| - {
|
| - R0, R1, R2, R3, R4, R5, R6, R7,
|
| - R8, R9, R10, R11, R12, R13, R14,
|
| - R15, PC, PR, GBR, VBR, MACH, MACL, SR,
|
| - TICKS, STALLS, CYCLES, INSTS, PLR
|
| - };
|
| -
|
| -typedef struct
|
| - {
|
| - short *memAddr;
|
| - short oldInstr;
|
| - }
|
| -stepData;
|
| -
|
| -int registers[NUMREGBYTES / 4];
|
| -stepData instrBuffer;
|
| -char stepped;
|
| -static const char hexchars[] = "0123456789abcdef";
|
| -static char remcomInBuffer[BUFMAX];
|
| -static char remcomOutBuffer[BUFMAX];
|
| -
|
| -char highhex(int x)
|
| -{
|
| - return hexchars[(x >> 4) & 0xf];
|
| -}
|
| -
|
| -char lowhex(int x)
|
| -{
|
| - return hexchars[x & 0xf];
|
| -}
|
| -
|
| -/*
|
| - * Assembly macros
|
| - */
|
| -
|
| -#define BREAKPOINT() asm("trapa #0x20"::);
|
| -
|
| -
|
| -/*
|
| - * Routines to handle hex data
|
| - */
|
| -
|
| -static int
|
| -hex (char ch)
|
| -{
|
| - if ((ch >= 'a') && (ch <= 'f'))
|
| - return (ch - 'a' + 10);
|
| - if ((ch >= '0') && (ch <= '9'))
|
| - return (ch - '0');
|
| - if ((ch >= 'A') && (ch <= 'F'))
|
| - return (ch - 'A' + 10);
|
| - return (-1);
|
| -}
|
| -
|
| -/* convert the memory, pointed to by mem into hex, placing result in buf */
|
| -/* return a pointer to the last char put in buf (null) */
|
| -static char *
|
| -mem2hex (char *mem, char *buf, int count)
|
| -{
|
| - int i;
|
| - int ch;
|
| - for (i = 0; i < count; i++)
|
| - {
|
| - ch = *mem++;
|
| - *buf++ = highhex (ch);
|
| - *buf++ = lowhex (ch);
|
| - }
|
| - *buf = 0;
|
| - return (buf);
|
| -}
|
| -
|
| -/* convert the hex array pointed to by buf into binary, to be placed in mem */
|
| -/* return a pointer to the character after the last byte written */
|
| -
|
| -static char *
|
| -hex2mem (char *buf, char *mem, int count)
|
| -{
|
| - int i;
|
| - unsigned char ch;
|
| - for (i = 0; i < count; i++)
|
| - {
|
| - ch = hex (*buf++) << 4;
|
| - ch = ch + hex (*buf++);
|
| - *mem++ = ch;
|
| - }
|
| - return (mem);
|
| -}
|
| -
|
| -/**********************************************/
|
| -/* WHILE WE FIND NICE HEX CHARS, BUILD AN INT */
|
| -/* RETURN NUMBER OF CHARS PROCESSED */
|
| -/**********************************************/
|
| -static int
|
| -hexToInt (char **ptr, int *intValue)
|
| -{
|
| - int numChars = 0;
|
| - int hexValue;
|
| -
|
| - *intValue = 0;
|
| -
|
| - while (**ptr)
|
| - {
|
| - hexValue = hex (**ptr);
|
| - if (hexValue >= 0)
|
| - {
|
| - *intValue = (*intValue << 4) | hexValue;
|
| - numChars++;
|
| - }
|
| - else
|
| - break;
|
| -
|
| - (*ptr)++;
|
| - }
|
| -
|
| - return (numChars);
|
| -}
|
| -
|
| -/*
|
| - * Routines to get and put packets
|
| - */
|
| -
|
| -/* scan for the sequence $<data>#<checksum> */
|
| -
|
| -char *
|
| -getpacket (void)
|
| -{
|
| - unsigned char *buffer = &remcomInBuffer[0];
|
| - unsigned char checksum;
|
| - unsigned char xmitcsum;
|
| - int count;
|
| - char ch;
|
| -
|
| - while (1)
|
| - {
|
| - /* wait around for the start character, ignore all other characters */
|
| - while ((ch = getDebugChar ()) != '$')
|
| - ;
|
| -
|
| -retry:
|
| - checksum = 0;
|
| - xmitcsum = -1;
|
| - count = 0;
|
| -
|
| - /* now, read until a # or end of buffer is found */
|
| - while (count < BUFMAX - 1)
|
| - {
|
| - ch = getDebugChar ();
|
| - if (ch == '$')
|
| - goto retry;
|
| - if (ch == '#')
|
| - break;
|
| - checksum = checksum + ch;
|
| - buffer[count] = ch;
|
| - count = count + 1;
|
| - }
|
| - buffer[count] = 0;
|
| -
|
| - if (ch == '#')
|
| - {
|
| - ch = getDebugChar ();
|
| - xmitcsum = hex (ch) << 4;
|
| - ch = getDebugChar ();
|
| - xmitcsum += hex (ch);
|
| -
|
| - if (checksum != xmitcsum)
|
| - {
|
| - putDebugChar ('-'); /* failed checksum */
|
| - }
|
| - else
|
| - {
|
| - putDebugChar ('+'); /* successful transfer */
|
| -
|
| - /* if a sequence char is present, reply the sequence ID */
|
| - if (buffer[2] == ':')
|
| - {
|
| - putDebugChar (buffer[0]);
|
| - putDebugChar (buffer[1]);
|
| -
|
| - return &buffer[3];
|
| - }
|
| -
|
| - return &buffer[0];
|
| - }
|
| - }
|
| - }
|
| -}
|
| -
|
| -
|
| -/* send the packet in buffer. */
|
| -
|
| -static void
|
| -putpacket (char *buffer)
|
| -{
|
| - int checksum;
|
| - int count;
|
| -
|
| - /* $<packet info>#<checksum>. */
|
| - do
|
| - {
|
| - char *src = buffer;
|
| - putDebugChar ('$');
|
| - checksum = 0;
|
| -
|
| - while (*src)
|
| - {
|
| - int runlen;
|
| -
|
| - /* Do run length encoding */
|
| - for (runlen = 0; runlen < 100; runlen ++)
|
| - {
|
| - if (src[0] != src[runlen])
|
| - {
|
| - if (runlen > 3)
|
| - {
|
| - int encode;
|
| - /* Got a useful amount */
|
| - putDebugChar (*src);
|
| - checksum += *src;
|
| - putDebugChar ('*');
|
| - checksum += '*';
|
| - checksum += (encode = runlen + ' ' - 4);
|
| - putDebugChar (encode);
|
| - src += runlen;
|
| - }
|
| - else
|
| - {
|
| - putDebugChar (*src);
|
| - checksum += *src;
|
| - src++;
|
| - }
|
| - break;
|
| - }
|
| - }
|
| - }
|
| -
|
| -
|
| - putDebugChar ('#');
|
| - putDebugChar (highhex(checksum));
|
| - putDebugChar (lowhex(checksum));
|
| - }
|
| - while (getDebugChar() != '+');
|
| -}
|
| -
|
| -
|
| -/* a bus error has occurred, perform a longjmp
|
| - to return execution and allow handling of the error */
|
| -
|
| -void
|
| -handle_buserror (void)
|
| -{
|
| - longjmp (remcomEnv, 1);
|
| -}
|
| -
|
| -/*
|
| - * this function takes the SH-1 exception number and attempts to
|
| - * translate this number into a unix compatible signal value
|
| - */
|
| -static int
|
| -computeSignal (int exceptionVector)
|
| -{
|
| - int sigval;
|
| - switch (exceptionVector)
|
| - {
|
| - case INVALID_INSN_VEC:
|
| - sigval = 4;
|
| - break;
|
| - case INVALID_SLOT_VEC:
|
| - sigval = 4;
|
| - break;
|
| - case CPU_BUS_ERROR_VEC:
|
| - sigval = 10;
|
| - break;
|
| - case DMA_BUS_ERROR_VEC:
|
| - sigval = 10;
|
| - break;
|
| - case NMI_VEC:
|
| - sigval = 2;
|
| - break;
|
| -
|
| - case TRAP_VEC:
|
| - case USER_VEC:
|
| - sigval = 5;
|
| - break;
|
| -
|
| - default:
|
| - sigval = 7; /* "software generated"*/
|
| - break;
|
| - }
|
| - return (sigval);
|
| -}
|
| -
|
| -void
|
| -doSStep (void)
|
| -{
|
| - short *instrMem;
|
| - int displacement;
|
| - int reg;
|
| - unsigned short opcode;
|
| -
|
| - instrMem = (short *) registers[PC];
|
| -
|
| - opcode = *instrMem;
|
| - stepped = 1;
|
| -
|
| - if ((opcode & COND_BR_MASK) == BT_INSTR)
|
| - {
|
| - if (registers[SR] & T_BIT_MASK)
|
| - {
|
| - displacement = (opcode & COND_DISP) << 1;
|
| - if (displacement & 0x80)
|
| - displacement |= 0xffffff00;
|
| - /*
|
| - * Remember PC points to second instr.
|
| - * after PC of branch ... so add 4
|
| - */
|
| - instrMem = (short *) (registers[PC] + displacement + 4);
|
| - }
|
| - else
|
| - instrMem += 1;
|
| - }
|
| - else if ((opcode & COND_BR_MASK) == BF_INSTR)
|
| - {
|
| - if (registers[SR] & T_BIT_MASK)
|
| - instrMem += 1;
|
| - else
|
| - {
|
| - displacement = (opcode & COND_DISP) << 1;
|
| - if (displacement & 0x80)
|
| - displacement |= 0xffffff00;
|
| - /*
|
| - * Remember PC points to second instr.
|
| - * after PC of branch ... so add 4
|
| - */
|
| - instrMem = (short *) (registers[PC] + displacement + 4);
|
| - }
|
| - }
|
| - else if ((opcode & UCOND_DBR_MASK) == BRA_INSTR)
|
| - {
|
| - displacement = (opcode & UCOND_DISP) << 1;
|
| - if (displacement & 0x0800)
|
| - displacement |= 0xfffff000;
|
| -
|
| - /*
|
| - * Remember PC points to second instr.
|
| - * after PC of branch ... so add 4
|
| - */
|
| - instrMem = (short *) (registers[PC] + displacement + 4);
|
| - }
|
| - else if ((opcode & UCOND_RBR_MASK) == JSR_INSTR)
|
| - {
|
| - reg = (char) ((opcode & UCOND_REG) >> 8);
|
| -
|
| - instrMem = (short *) registers[reg];
|
| - }
|
| - else if (opcode == RTS_INSTR)
|
| - instrMem = (short *) registers[PR];
|
| - else if (opcode == RTE_INSTR)
|
| - instrMem = (short *) registers[15];
|
| - else if ((opcode & TRAPA_MASK) == TRAPA_INSTR)
|
| - instrMem = (short *) ((opcode & ~TRAPA_MASK) << 2);
|
| - else
|
| - instrMem += 1;
|
| -
|
| - instrBuffer.memAddr = instrMem;
|
| - instrBuffer.oldInstr = *instrMem;
|
| - *instrMem = SSTEP_INSTR;
|
| -}
|
| -
|
| -
|
| -/* Undo the effect of a previous doSStep. If we single stepped,
|
| - restore the old instruction. */
|
| -
|
| -void
|
| -undoSStep (void)
|
| -{
|
| - if (stepped)
|
| - { short *instrMem;
|
| - instrMem = instrBuffer.memAddr;
|
| - *instrMem = instrBuffer.oldInstr;
|
| - }
|
| - stepped = 0;
|
| -}
|
| -
|
| -/*
|
| -This function does all exception handling. It only does two things -
|
| -it figures out why it was called and tells gdb, and then it reacts
|
| -to gdb's requests.
|
| -
|
| -When in the monitor mode we talk a human on the serial line rather than gdb.
|
| -
|
| -*/
|
| -
|
| -
|
| -void
|
| -gdb_handle_exception (int exceptionVector)
|
| -{
|
| - int sigval, stepping;
|
| - int addr, length;
|
| - char *ptr;
|
| -
|
| - /* reply to host that an exception has occurred */
|
| - sigval = computeSignal (exceptionVector);
|
| - remcomOutBuffer[0] = 'S';
|
| - remcomOutBuffer[1] = highhex(sigval);
|
| - remcomOutBuffer[2] = lowhex (sigval);
|
| - remcomOutBuffer[3] = 0;
|
| -
|
| - putpacket (remcomOutBuffer);
|
| -
|
| - /*
|
| - * exception 255 indicates a software trap
|
| - * inserted in place of code ... so back up
|
| - * PC by one instruction, since this instruction
|
| - * will later be replaced by its original one!
|
| - */
|
| - if (exceptionVector == 0xff
|
| - || exceptionVector == 0x20)
|
| - registers[PC] -= 2;
|
| -
|
| - /*
|
| - * Do the thangs needed to undo
|
| - * any stepping we may have done!
|
| - */
|
| - undoSStep ();
|
| -
|
| - stepping = 0;
|
| -
|
| - while (1)
|
| - {
|
| - remcomOutBuffer[0] = 0;
|
| - ptr = getpacket ();
|
| -
|
| - switch (*ptr++)
|
| - {
|
| - case '?':
|
| - remcomOutBuffer[0] = 'S';
|
| - remcomOutBuffer[1] = highhex (sigval);
|
| - remcomOutBuffer[2] = lowhex (sigval);
|
| - remcomOutBuffer[3] = 0;
|
| - break;
|
| - case 'd':
|
| - remote_debug = !(remote_debug); /* toggle debug flag */
|
| - break;
|
| - case 'g': /* return the value of the CPU registers */
|
| - mem2hex ((char *) registers, remcomOutBuffer, NUMREGBYTES);
|
| - break;
|
| - case 'G': /* set the value of the CPU registers - return OK */
|
| - hex2mem (ptr, (char *) registers, NUMREGBYTES);
|
| - strcpy (remcomOutBuffer, "OK");
|
| - break;
|
| -
|
| - /* mAA..AA,LLLL Read LLLL bytes at address AA..AA */
|
| - case 'm':
|
| - if (setjmp (remcomEnv) == 0)
|
| - {
|
| - dofault = 0;
|
| - /* TRY, TO READ %x,%x. IF SUCCEED, SET PTR = 0 */
|
| - if (hexToInt (&ptr, &addr))
|
| - if (*(ptr++) == ',')
|
| - if (hexToInt (&ptr, &length))
|
| - {
|
| - ptr = 0;
|
| - mem2hex ((char *) addr, remcomOutBuffer, length);
|
| - }
|
| - if (ptr)
|
| - strcpy (remcomOutBuffer, "E01");
|
| - }
|
| - else
|
| - strcpy (remcomOutBuffer, "E03");
|
| -
|
| - /* restore handler for bus error */
|
| - dofault = 1;
|
| - break;
|
| -
|
| - /* MAA..AA,LLLL: Write LLLL bytes at address AA.AA return OK */
|
| - case 'M':
|
| - if (setjmp (remcomEnv) == 0)
|
| - {
|
| - dofault = 0;
|
| -
|
| - /* TRY, TO READ '%x,%x:'. IF SUCCEED, SET PTR = 0 */
|
| - if (hexToInt (&ptr, &addr))
|
| - if (*(ptr++) == ',')
|
| - if (hexToInt (&ptr, &length))
|
| - if (*(ptr++) == ':')
|
| - {
|
| - hex2mem (ptr, (char *) addr, length);
|
| - ptr = 0;
|
| - strcpy (remcomOutBuffer, "OK");
|
| - }
|
| - if (ptr)
|
| - strcpy (remcomOutBuffer, "E02");
|
| - }
|
| - else
|
| - strcpy (remcomOutBuffer, "E03");
|
| -
|
| - /* restore handler for bus error */
|
| - dofault = 1;
|
| - break;
|
| -
|
| - /* cAA..AA Continue at address AA..AA(optional) */
|
| - /* sAA..AA Step one instruction from AA..AA(optional) */
|
| - case 's':
|
| - stepping = 1;
|
| - case 'c':
|
| - {
|
| - /* tRY, to read optional parameter, pc unchanged if no parm */
|
| - if (hexToInt (&ptr, &addr))
|
| - registers[PC] = addr;
|
| -
|
| - if (stepping)
|
| - doSStep ();
|
| - }
|
| - return;
|
| - break;
|
| -
|
| - /* kill the program */
|
| - case 'k': /* do nothing */
|
| - break;
|
| - } /* switch */
|
| -
|
| - /* reply to the request */
|
| - putpacket (remcomOutBuffer);
|
| - }
|
| -}
|
| -
|
| -
|
| -#define GDBCOOKIE 0x5ac
|
| -static int ingdbmode;
|
| -/* We've had an exception - choose to go into the monitor or
|
| - the gdb stub */
|
| -void handle_exception(int exceptionVector)
|
| -{
|
| -#ifdef MONITOR
|
| - if (ingdbmode != GDBCOOKIE)
|
| - monitor_handle_exception (exceptionVector);
|
| - else
|
| -#endif
|
| - gdb_handle_exception (exceptionVector);
|
| -
|
| -}
|
| -
|
| -void
|
| -gdb_mode (void)
|
| -{
|
| - ingdbmode = GDBCOOKIE;
|
| - breakpoint();
|
| -}
|
| -/* This function will generate a breakpoint exception. It is used at the
|
| - beginning of a program to sync up with a debugger and can be used
|
| - otherwise as a quick means to stop program execution and "break" into
|
| - the debugger. */
|
| -
|
| -void
|
| -breakpoint (void)
|
| -{
|
| - BREAKPOINT ();
|
| -}
|
| -
|
| -/**** Processor-specific routines start here ****/
|
| -/**** Processor-specific routines start here ****/
|
| -/**** Processor-specific routines start here ****/
|
| -
|
| -/* Note:
|
| -
|
| - The Renesas SH family uses two exception architectures:
|
| -
|
| - SH1 & SH2:
|
| -
|
| - These processors utilize an exception vector table.
|
| - Exceptions are vectored to the address stored at VBR + (exception_num * 4)
|
| -
|
| - SH3, SH3E, & SH4:
|
| -
|
| - These processors have fixed entry points relative to the VBR for
|
| - various exception classes.
|
| -*/
|
| -
|
| -#if defined(__sh1__) || defined(__sh2__)
|
| -
|
| -/* SH1/SH2 exception vector table format */
|
| -
|
| -typedef struct
|
| - {
|
| - void (*func_cold) ();
|
| - int *stack_cold;
|
| - void (*func_warm) ();
|
| - int *stack_warm;
|
| - void (*(handler[256 - 4])) ();
|
| - }
|
| -vec_type;
|
| -
|
| -/* vectable is the SH1/SH2 vector table. It must be at address 0
|
| - or wherever your vbr points. */
|
| -
|
| -const vec_type vectable =
|
| -{
|
| - &BINIT, /* 0: Power-on reset PC */
|
| - init_stack + init_stack_size, /* 1: Power-on reset SP */
|
| - &BINIT, /* 2: Manual reset PC */
|
| - init_stack + init_stack_size, /* 3: Manual reset SP */
|
| -{
|
| - &catch_exception_4, /* 4: General invalid instruction */
|
| - &catch_exception_random, /* 5: Reserved for system */
|
| - &catch_exception_6, /* 6: Invalid slot instruction */
|
| - &catch_exception_random, /* 7: Reserved for system */
|
| - &catch_exception_random, /* 8: Reserved for system */
|
| - &catch_exception_9, /* 9: CPU bus error */
|
| - &catch_exception_10, /* 10: DMA bus error */
|
| - &catch_exception_11, /* 11: NMI */
|
| - &catch_exception_random, /* 12: User break */
|
| - &catch_exception_random, /* 13: Reserved for system */
|
| - &catch_exception_random, /* 14: Reserved for system */
|
| - &catch_exception_random, /* 15: Reserved for system */
|
| - &catch_exception_random, /* 16: Reserved for system */
|
| - &catch_exception_random, /* 17: Reserved for system */
|
| - &catch_exception_random, /* 18: Reserved for system */
|
| - &catch_exception_random, /* 19: Reserved for system */
|
| - &catch_exception_random, /* 20: Reserved for system */
|
| - &catch_exception_random, /* 21: Reserved for system */
|
| - &catch_exception_random, /* 22: Reserved for system */
|
| - &catch_exception_random, /* 23: Reserved for system */
|
| - &catch_exception_random, /* 24: Reserved for system */
|
| - &catch_exception_random, /* 25: Reserved for system */
|
| - &catch_exception_random, /* 26: Reserved for system */
|
| - &catch_exception_random, /* 27: Reserved for system */
|
| - &catch_exception_random, /* 28: Reserved for system */
|
| - &catch_exception_random, /* 29: Reserved for system */
|
| - &catch_exception_random, /* 30: Reserved for system */
|
| - &catch_exception_random, /* 31: Reserved for system */
|
| - &catch_exception_32, /* 32: Trap instr (user vectors) */
|
| - &catch_exception_33, /* 33: Trap instr (user vectors) */
|
| - &catch_exception_random, /* 34: Trap instr (user vectors) */
|
| - &catch_exception_random, /* 35: Trap instr (user vectors) */
|
| - &catch_exception_random, /* 36: Trap instr (user vectors) */
|
| - &catch_exception_random, /* 37: Trap instr (user vectors) */
|
| - &catch_exception_random, /* 38: Trap instr (user vectors) */
|
| - &catch_exception_random, /* 39: Trap instr (user vectors) */
|
| - &catch_exception_random, /* 40: Trap instr (user vectors) */
|
| - &catch_exception_random, /* 41: Trap instr (user vectors) */
|
| - &catch_exception_random, /* 42: Trap instr (user vectors) */
|
| - &catch_exception_random, /* 43: Trap instr (user vectors) */
|
| - &catch_exception_random, /* 44: Trap instr (user vectors) */
|
| - &catch_exception_random, /* 45: Trap instr (user vectors) */
|
| - &catch_exception_random, /* 46: Trap instr (user vectors) */
|
| - &catch_exception_random, /* 47: Trap instr (user vectors) */
|
| - &catch_exception_random, /* 48: Trap instr (user vectors) */
|
| - &catch_exception_random, /* 49: Trap instr (user vectors) */
|
| - &catch_exception_random, /* 50: Trap instr (user vectors) */
|
| - &catch_exception_random, /* 51: Trap instr (user vectors) */
|
| - &catch_exception_random, /* 52: Trap instr (user vectors) */
|
| - &catch_exception_random, /* 53: Trap instr (user vectors) */
|
| - &catch_exception_random, /* 54: Trap instr (user vectors) */
|
| - &catch_exception_random, /* 55: Trap instr (user vectors) */
|
| - &catch_exception_random, /* 56: Trap instr (user vectors) */
|
| - &catch_exception_random, /* 57: Trap instr (user vectors) */
|
| - &catch_exception_random, /* 58: Trap instr (user vectors) */
|
| - &catch_exception_random, /* 59: Trap instr (user vectors) */
|
| - &catch_exception_random, /* 60: Trap instr (user vectors) */
|
| - &catch_exception_random, /* 61: Trap instr (user vectors) */
|
| - &catch_exception_random, /* 62: Trap instr (user vectors) */
|
| - &catch_exception_random, /* 63: Trap instr (user vectors) */
|
| - &catch_exception_random, /* 64: IRQ0 */
|
| - &catch_exception_random, /* 65: IRQ1 */
|
| - &catch_exception_random, /* 66: IRQ2 */
|
| - &catch_exception_random, /* 67: IRQ3 */
|
| - &catch_exception_random, /* 68: IRQ4 */
|
| - &catch_exception_random, /* 69: IRQ5 */
|
| - &catch_exception_random, /* 70: IRQ6 */
|
| - &catch_exception_random, /* 71: IRQ7 */
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_random,
|
| - &catch_exception_255}};
|
| -
|
| -#define BCR (*(volatile short *)(0x05FFFFA0)) /* Bus control register */
|
| -#define BAS (0x800) /* Byte access select */
|
| -#define WCR1 (*(volatile short *)(0x05ffffA2)) /* Wait state control register */
|
| -
|
| -asm ("_BINIT: mov.l L1,r15");
|
| -asm ("bra _INIT");
|
| -asm ("nop");
|
| -asm ("L1: .long _init_stack + 8*1024*4");
|
| -void
|
| -INIT (void)
|
| -{
|
| - /* First turn on the ram */
|
| - WCR1 = 0; /* Never sample wait */
|
| - BCR = BAS; /* use lowbyte/high byte */
|
| -
|
| - init_serial();
|
| -
|
| -#ifdef MONITOR
|
| - reset_hook ();
|
| -#endif
|
| -
|
| -
|
| - in_nmi = 0;
|
| - dofault = 1;
|
| - stepped = 0;
|
| -
|
| - stub_sp = stub_stack + stub_stack_size;
|
| - breakpoint ();
|
| -
|
| - while (1)
|
| - ;
|
| -}
|
| -
|
| -
|
| -static void sr()
|
| -{
|
| -
|
| -
|
| - /* Calling Reset does the same as pressing the button */
|
| - asm (".global _Reset
|
| - .global _WarmReset
|
| -_Reset:
|
| -_WarmReset:
|
| - mov.l L_sp,r15
|
| - bra _INIT
|
| - nop
|
| - .align 2
|
| -L_sp: .long _init_stack + 8000");
|
| -
|
| - asm("saveRegisters:
|
| - mov.l @(L_reg, pc), r0
|
| - mov.l @r15+, r1 ! pop R0
|
| - mov.l r2, @(0x08, r0) ! save R2
|
| - mov.l r1, @r0 ! save R0
|
| - mov.l @r15+, r1 ! pop R1
|
| - mov.l r3, @(0x0c, r0) ! save R3
|
| - mov.l r1, @(0x04, r0) ! save R1
|
| - mov.l r4, @(0x10, r0) ! save R4
|
| - mov.l r5, @(0x14, r0) ! save R5
|
| - mov.l r6, @(0x18, r0) ! save R6
|
| - mov.l r7, @(0x1c, r0) ! save R7
|
| - mov.l r8, @(0x20, r0) ! save R8
|
| - mov.l r9, @(0x24, r0) ! save R9
|
| - mov.l r10, @(0x28, r0) ! save R10
|
| - mov.l r11, @(0x2c, r0) ! save R11
|
| - mov.l r12, @(0x30, r0) ! save R12
|
| - mov.l r13, @(0x34, r0) ! save R13
|
| - mov.l r14, @(0x38, r0) ! save R14
|
| - mov.l @r15+, r4 ! save arg to handleException
|
| - add #8, r15 ! hide PC/SR values on stack
|
| - mov.l r15, @(0x3c, r0) ! save R15
|
| - add #-8, r15 ! save still needs old SP value
|
| - add #92, r0 ! readjust register pointer
|
| - mov r15, r2
|
| - add #4, r2
|
| - mov.l @r2, r2 ! R2 has SR
|
| - mov.l @r15, r1 ! R1 has PC
|
| - mov.l r2, @-r0 ! save SR
|
| - sts.l macl, @-r0 ! save MACL
|
| - sts.l mach, @-r0 ! save MACH
|
| - stc.l vbr, @-r0 ! save VBR
|
| - stc.l gbr, @-r0 ! save GBR
|
| - sts.l pr, @-r0 ! save PR
|
| - mov.l @(L_stubstack, pc), r2
|
| - mov.l @(L_hdl_except, pc), r3
|
| - mov.l @r2, r15
|
| - jsr @r3
|
| - mov.l r1, @-r0 ! save PC
|
| - mov.l @(L_stubstack, pc), r0
|
| - mov.l @(L_reg, pc), r1
|
| - bra restoreRegisters
|
| - mov.l r15, @r0 ! save __stub_stack
|
| -
|
| - .align 2
|
| -L_reg:
|
| - .long _registers
|
| -L_stubstack:
|
| - .long _stub_sp
|
| -L_hdl_except:
|
| - .long _handle_exception");
|
| -
|
| -}
|
| -
|
| -static void rr()
|
| -{
|
| -asm("
|
| - .align 2
|
| - .global _resume
|
| -_resume:
|
| - mov r4,r1
|
| -restoreRegisters:
|
| - add #8, r1 ! skip to R2
|
| - mov.l @r1+, r2 ! restore R2
|
| - mov.l @r1+, r3 ! restore R3
|
| - mov.l @r1+, r4 ! restore R4
|
| - mov.l @r1+, r5 ! restore R5
|
| - mov.l @r1+, r6 ! restore R6
|
| - mov.l @r1+, r7 ! restore R7
|
| - mov.l @r1+, r8 ! restore R8
|
| - mov.l @r1+, r9 ! restore R9
|
| - mov.l @r1+, r10 ! restore R10
|
| - mov.l @r1+, r11 ! restore R11
|
| - mov.l @r1+, r12 ! restore R12
|
| - mov.l @r1+, r13 ! restore R13
|
| - mov.l @r1+, r14 ! restore R14
|
| - mov.l @r1+, r15 ! restore programs stack
|
| - mov.l @r1+, r0
|
| - add #-8, r15 ! uncover PC/SR on stack
|
| - mov.l r0, @r15 ! restore PC onto stack
|
| - lds.l @r1+, pr ! restore PR
|
| - ldc.l @r1+, gbr ! restore GBR
|
| - ldc.l @r1+, vbr ! restore VBR
|
| - lds.l @r1+, mach ! restore MACH
|
| - lds.l @r1+, macl ! restore MACL
|
| - mov.l @r1, r0
|
| - add #-88, r1 ! readjust reg pointer to R1
|
| - mov.l r0, @(4, r15) ! restore SR onto stack+4
|
| - mov.l r2, @-r15
|
| - mov.l L_in_nmi, r0
|
| - mov #0, r2
|
| - mov.b r2, @r0
|
| - mov.l @r15+, r2
|
| - mov.l @r1+, r0 ! restore R0
|
| - rte
|
| - mov.l @r1, r1 ! restore R1
|
| -
|
| -");
|
| -}
|
| -
|
| -
|
| -static __inline__ void code_for_catch_exception(int n)
|
| -{
|
| - asm(" .globl _catch_exception_%O0" : : "i" (n) );
|
| - asm(" _catch_exception_%O0:" :: "i" (n) );
|
| -
|
| - asm(" add #-4, r15 ! reserve spot on stack ");
|
| - asm(" mov.l r1, @-r15 ! push R1 ");
|
| -
|
| - if (n == NMI_VEC)
|
| - {
|
| - /* Special case for NMI - make sure that they don't nest */
|
| - asm(" mov.l r0, @-r15 ! push R0");
|
| - asm(" mov.l L_in_nmi, r0");
|
| - asm(" tas.b @r0 ! Fend off against addtnl NMIs");
|
| - asm(" bt noNMI");
|
| - asm(" mov.l @r15+, r0");
|
| - asm(" mov.l @r15+, r1");
|
| - asm(" add #4, r15");
|
| - asm(" rte");
|
| - asm(" nop");
|
| - asm(".align 2");
|
| - asm("L_in_nmi: .long _in_nmi");
|
| - asm("noNMI:");
|
| - }
|
| - else
|
| - {
|
| -
|
| - if (n == CPU_BUS_ERROR_VEC)
|
| - {
|
| - /* Exception 9 (bus errors) are disasbleable - so that you
|
| - can probe memory and get zero instead of a fault.
|
| - Because the vector table may be in ROM we don't revector
|
| - the interrupt like all the other stubs, we check in here
|
| - */
|
| - asm("mov.l L_dofault,r1");
|
| - asm("mov.l @r1,r1");
|
| - asm("tst r1,r1");
|
| - asm("bf faultaway");
|
| - asm("bsr _handle_buserror");
|
| - asm(".align 2");
|
| - asm("L_dofault: .long _dofault");
|
| - asm("faultaway:");
|
| - }
|
| - asm(" mov #15<<4, r1 ");
|
| - asm(" ldc r1, sr ! disable interrupts ");
|
| - asm(" mov.l r0, @-r15 ! push R0 ");
|
| - }
|
| -
|
| - /* Prepare for saving context, we've already pushed r0 and r1, stick exception number
|
| - into the frame */
|
| - asm(" mov r15, r0 ");
|
| - asm(" add #8, r0 ");
|
| - asm(" mov %0,r1" :: "i" (n) );
|
| - asm(" extu.b r1,r1 ");
|
| - asm(" bra saveRegisters ! save register values ");
|
| - asm(" mov.l r1, @r0 ! save exception # ");
|
| -}
|
| -
|
| -
|
| -static void
|
| -exceptions (void)
|
| -{
|
| - code_for_catch_exception (CPU_BUS_ERROR_VEC);
|
| - code_for_catch_exception (DMA_BUS_ERROR_VEC);
|
| - code_for_catch_exception (INVALID_INSN_VEC);
|
| - code_for_catch_exception (INVALID_SLOT_VEC);
|
| - code_for_catch_exception (NMI_VEC);
|
| - code_for_catch_exception (TRAP_VEC);
|
| - code_for_catch_exception (USER_VEC);
|
| - code_for_catch_exception (IO_VEC);
|
| -}
|
| -
|
| -
|
| -
|
| -
|
| -
|
| -
|
| -/* Support for Serial I/O using on chip uart */
|
| -
|
| -#define SMR0 (*(volatile char *)(0x05FFFEC0)) /* Channel 0 serial mode register */
|
| -#define BRR0 (*(volatile char *)(0x05FFFEC1)) /* Channel 0 bit rate register */
|
| -#define SCR0 (*(volatile char *)(0x05FFFEC2)) /* Channel 0 serial control register */
|
| -#define TDR0 (*(volatile char *)(0x05FFFEC3)) /* Channel 0 transmit data register */
|
| -#define SSR0 (*(volatile char *)(0x05FFFEC4)) /* Channel 0 serial status register */
|
| -#define RDR0 (*(volatile char *)(0x05FFFEC5)) /* Channel 0 receive data register */
|
| -
|
| -#define SMR1 (*(volatile char *)(0x05FFFEC8)) /* Channel 1 serial mode register */
|
| -#define BRR1 (*(volatile char *)(0x05FFFEC9)) /* Channel 1 bit rate register */
|
| -#define SCR1 (*(volatile char *)(0x05FFFECA)) /* Channel 1 serial control register */
|
| -#define TDR1 (*(volatile char *)(0x05FFFECB)) /* Channel 1 transmit data register */
|
| -#define SSR1 (*(volatile char *)(0x05FFFECC)) /* Channel 1 serial status register */
|
| -#define RDR1 (*(volatile char *)(0x05FFFECD)) /* Channel 1 receive data register */
|
| -
|
| -/*
|
| - * Serial mode register bits
|
| - */
|
| -
|
| -#define SYNC_MODE 0x80
|
| -#define SEVEN_BIT_DATA 0x40
|
| -#define PARITY_ON 0x20
|
| -#define ODD_PARITY 0x10
|
| -#define STOP_BITS_2 0x08
|
| -#define ENABLE_MULTIP 0x04
|
| -#define PHI_64 0x03
|
| -#define PHI_16 0x02
|
| -#define PHI_4 0x01
|
| -
|
| -/*
|
| - * Serial control register bits
|
| - */
|
| -#define SCI_TIE 0x80 /* Transmit interrupt enable */
|
| -#define SCI_RIE 0x40 /* Receive interrupt enable */
|
| -#define SCI_TE 0x20 /* Transmit enable */
|
| -#define SCI_RE 0x10 /* Receive enable */
|
| -#define SCI_MPIE 0x08 /* Multiprocessor interrupt enable */
|
| -#define SCI_TEIE 0x04 /* Transmit end interrupt enable */
|
| -#define SCI_CKE1 0x02 /* Clock enable 1 */
|
| -#define SCI_CKE0 0x01 /* Clock enable 0 */
|
| -
|
| -/*
|
| - * Serial status register bits
|
| - */
|
| -#define SCI_TDRE 0x80 /* Transmit data register empty */
|
| -#define SCI_RDRF 0x40 /* Receive data register full */
|
| -#define SCI_ORER 0x20 /* Overrun error */
|
| -#define SCI_FER 0x10 /* Framing error */
|
| -#define SCI_PER 0x08 /* Parity error */
|
| -#define SCI_TEND 0x04 /* Transmit end */
|
| -#define SCI_MPB 0x02 /* Multiprocessor bit */
|
| -#define SCI_MPBT 0x01 /* Multiprocessor bit transfer */
|
| -
|
| -
|
| -/*
|
| - * Port B IO Register (PBIOR)
|
| - */
|
| -#define PBIOR (*(volatile char *)(0x05FFFFC6))
|
| -#define PB15IOR 0x8000
|
| -#define PB14IOR 0x4000
|
| -#define PB13IOR 0x2000
|
| -#define PB12IOR 0x1000
|
| -#define PB11IOR 0x0800
|
| -#define PB10IOR 0x0400
|
| -#define PB9IOR 0x0200
|
| -#define PB8IOR 0x0100
|
| -#define PB7IOR 0x0080
|
| -#define PB6IOR 0x0040
|
| -#define PB5IOR 0x0020
|
| -#define PB4IOR 0x0010
|
| -#define PB3IOR 0x0008
|
| -#define PB2IOR 0x0004
|
| -#define PB1IOR 0x0002
|
| -#define PB0IOR 0x0001
|
| -
|
| -/*
|
| - * Port B Control Register (PBCR1)
|
| - */
|
| -#define PBCR1 (*(volatile short *)(0x05FFFFCC))
|
| -#define PB15MD1 0x8000
|
| -#define PB15MD0 0x4000
|
| -#define PB14MD1 0x2000
|
| -#define PB14MD0 0x1000
|
| -#define PB13MD1 0x0800
|
| -#define PB13MD0 0x0400
|
| -#define PB12MD1 0x0200
|
| -#define PB12MD0 0x0100
|
| -#define PB11MD1 0x0080
|
| -#define PB11MD0 0x0040
|
| -#define PB10MD1 0x0020
|
| -#define PB10MD0 0x0010
|
| -#define PB9MD1 0x0008
|
| -#define PB9MD0 0x0004
|
| -#define PB8MD1 0x0002
|
| -#define PB8MD0 0x0001
|
| -
|
| -#define PB15MD PB15MD1|PB14MD0
|
| -#define PB14MD PB14MD1|PB14MD0
|
| -#define PB13MD PB13MD1|PB13MD0
|
| -#define PB12MD PB12MD1|PB12MD0
|
| -#define PB11MD PB11MD1|PB11MD0
|
| -#define PB10MD PB10MD1|PB10MD0
|
| -#define PB9MD PB9MD1|PB9MD0
|
| -#define PB8MD PB8MD1|PB8MD0
|
| -
|
| -#define PB_TXD1 PB11MD1
|
| -#define PB_RXD1 PB10MD1
|
| -#define PB_TXD0 PB9MD1
|
| -#define PB_RXD0 PB8MD1
|
| -
|
| -/*
|
| - * Port B Control Register (PBCR2)
|
| - */
|
| -#define PBCR2 0x05FFFFCE
|
| -#define PB7MD1 0x8000
|
| -#define PB7MD0 0x4000
|
| -#define PB6MD1 0x2000
|
| -#define PB6MD0 0x1000
|
| -#define PB5MD1 0x0800
|
| -#define PB5MD0 0x0400
|
| -#define PB4MD1 0x0200
|
| -#define PB4MD0 0x0100
|
| -#define PB3MD1 0x0080
|
| -#define PB3MD0 0x0040
|
| -#define PB2MD1 0x0020
|
| -#define PB2MD0 0x0010
|
| -#define PB1MD1 0x0008
|
| -#define PB1MD0 0x0004
|
| -#define PB0MD1 0x0002
|
| -#define PB0MD0 0x0001
|
| -
|
| -#define PB7MD PB7MD1|PB7MD0
|
| -#define PB6MD PB6MD1|PB6MD0
|
| -#define PB5MD PB5MD1|PB5MD0
|
| -#define PB4MD PB4MD1|PB4MD0
|
| -#define PB3MD PB3MD1|PB3MD0
|
| -#define PB2MD PB2MD1|PB2MD0
|
| -#define PB1MD PB1MD1|PB1MD0
|
| -#define PB0MD PB0MD1|PB0MD0
|
| -
|
| -
|
| -#ifdef MHZ
|
| -#define BPS 32 * 9600 * MHZ / ( BAUD * 10)
|
| -#else
|
| -#define BPS 32 /* 9600 for 10 Mhz */
|
| -#endif
|
| -
|
| -void handleError (char theSSR);
|
| -
|
| -void
|
| -nop (void)
|
| -{
|
| -
|
| -}
|
| -void
|
| -init_serial (void)
|
| -{
|
| - int i;
|
| -
|
| - /* Clear TE and RE in Channel 1's SCR */
|
| - SCR1 &= ~(SCI_TE | SCI_RE);
|
| -
|
| - /* Set communication to be async, 8-bit data, no parity, 1 stop bit and use internal clock */
|
| -
|
| - SMR1 = 0;
|
| - BRR1 = BPS;
|
| -
|
| - SCR1 &= ~(SCI_CKE1 | SCI_CKE0);
|
| -
|
| - /* let the hardware settle */
|
| -
|
| - for (i = 0; i < 1000; i++)
|
| - nop ();
|
| -
|
| - /* Turn on in and out */
|
| - SCR1 |= SCI_RE | SCI_TE;
|
| -
|
| - /* Set the PFC to make RXD1 (pin PB8) an input pin and TXD1 (pin PB9) an output pin */
|
| - PBCR1 &= ~(PB_TXD1 | PB_RXD1);
|
| - PBCR1 |= PB_TXD1 | PB_RXD1;
|
| -}
|
| -
|
| -
|
| -int
|
| -getDebugCharReady (void)
|
| -{
|
| - char mySSR;
|
| - mySSR = SSR1 & ( SCI_PER | SCI_FER | SCI_ORER );
|
| - if ( mySSR )
|
| - handleError ( mySSR );
|
| - return SSR1 & SCI_RDRF ;
|
| -}
|
| -
|
| -char
|
| -getDebugChar (void)
|
| -{
|
| - char ch;
|
| - char mySSR;
|
| -
|
| - while ( ! getDebugCharReady())
|
| - ;
|
| -
|
| - ch = RDR1;
|
| - SSR1 &= ~SCI_RDRF;
|
| -
|
| - mySSR = SSR1 & (SCI_PER | SCI_FER | SCI_ORER);
|
| -
|
| - if (mySSR)
|
| - handleError (mySSR);
|
| -
|
| - return ch;
|
| -}
|
| -
|
| -int
|
| -putDebugCharReady (void)
|
| -{
|
| - return (SSR1 & SCI_TDRE);
|
| -}
|
| -
|
| -void
|
| -putDebugChar (char ch)
|
| -{
|
| - while (!putDebugCharReady())
|
| - ;
|
| -
|
| - /*
|
| - * Write data into TDR and clear TDRE
|
| - */
|
| - TDR1 = ch;
|
| - SSR1 &= ~SCI_TDRE;
|
| -}
|
| -
|
| -void
|
| -handleError (char theSSR)
|
| -{
|
| - SSR1 &= ~(SCI_ORER | SCI_PER | SCI_FER);
|
| -}
|
| -
|
| -#endif
|
|
|