269 lines
8.0 KiB
C
269 lines
8.0 KiB
C
/*
|
|
* Motorola Background Debug Mode Driver
|
|
* Copyright (C) 1995 W. Eric Norum
|
|
* Copyright (C) 1998 Chris Johns
|
|
*
|
|
* Based on:
|
|
* 1. `A Background Debug Mode Driver Package for Motorola's
|
|
* 16- and 32-Bit Microcontrollers', Scott Howard, Motorola
|
|
* Canada, 1993.
|
|
* 2. `Linux device driver for public domain BDM Interface',
|
|
* M. Schraut, Technische Universitaet Muenchen, Lehrstuhl
|
|
* fuer Prozessrechner, 1995.
|
|
*
|
|
* Extended to support the ColdFire BDM interface using the P&E
|
|
* module which comes with the EVB. Currently only tested with the
|
|
* 5206 (5V) device.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
*
|
|
* W. Eric Norum
|
|
* Saskatchewan Accelerator Laboratory
|
|
* University of Saskatchewan
|
|
* 107 North Road
|
|
* Saskatoon, Saskatchewan, CANADA
|
|
* S7N 5C6
|
|
*
|
|
* eric@skatter.usask.ca
|
|
*
|
|
* Coldfire support by:
|
|
* Chris Johns
|
|
* chris@contemporary.net.au
|
|
*
|
|
*/
|
|
|
|
#ifndef _BDM_H_
|
|
#define _BDM_H_
|
|
|
|
/*
|
|
* Version of the driver.
|
|
*/
|
|
|
|
#define BDM_DRV_VERSION 0x020d
|
|
|
|
/*
|
|
* Hook for Linux kernel
|
|
*/
|
|
|
|
#define BDM_MAJOR_NUMBER 34
|
|
|
|
/*
|
|
* Allocation of the minor numbers. The number of minors per interface
|
|
* must be a factor of 2.
|
|
*/
|
|
|
|
#define BDM_MINORS_PER_IFACE 4
|
|
#define BDM_IFACE_MINOR(m) (m & (BDM_MINORS_PER_IFACE - 1))
|
|
#define BDM_IFACE(m) (m / BDM_MINORS_PER_IFACE)
|
|
#define BDM_NUM_OF_MINORS (BDM_NUM_OF_IFACES * BDM_MINORS_PER_IFACE)
|
|
|
|
/*
|
|
* Processors
|
|
*/
|
|
|
|
#define BDM_CPU32 0
|
|
#define BDM_COLDFIRE 1
|
|
|
|
/*
|
|
* Interfaces, used of offset the major number.
|
|
*/
|
|
|
|
#define BDM_CPU32_ERIC 0
|
|
#define BDM_CPU32_PD BDM_CPU32_ERIC
|
|
#define BDM_COLDFIRE_PE 1
|
|
#define BDM_CPU32_ICD 2
|
|
#define BDM_COLDFIRE_TBLCF 3
|
|
#define BDM_NUM_OF_IFACES 4 /* last */
|
|
|
|
/*
|
|
* Error codes
|
|
*/
|
|
#define BDM_FAULT_UNKNOWN 210
|
|
#define BDM_FAULT_POWER 211
|
|
#define BDM_FAULT_CABLE 212
|
|
#define BDM_FAULT_RESPONSE 213
|
|
#define BDM_FAULT_RESET 214
|
|
#define BDM_FAULT_PORT 215
|
|
#define BDM_FAULT_BERR 216
|
|
#define BDM_FAULT_NVC 217
|
|
#define BDM_FAULT_TIMEOUT 218
|
|
#define BDM_FAULT_FORCED_TA 219
|
|
|
|
/*
|
|
* Structure for I/O requests
|
|
* Address and value are in host-endian order
|
|
*/
|
|
struct BDMioctl {
|
|
unsigned long int address;
|
|
unsigned long int value;
|
|
};
|
|
|
|
/*
|
|
* The ioctl codes. If these change insure the remote client and server
|
|
* interfaces are kept in sync. Assumes Cygwin does not define Win32.
|
|
*/
|
|
|
|
#if !defined (_IO)
|
|
#if defined (__WIN32__)
|
|
#include <winsock2.h>
|
|
#else
|
|
#include <sys/ioctl.h>
|
|
#endif
|
|
#endif
|
|
|
|
/*
|
|
* If the OS does not provide any ioctl support as found on
|
|
* some Unix systems then provide something.
|
|
*/
|
|
#if !defined (_IO)
|
|
#undef _IOR
|
|
#undef _IOW
|
|
#undef _IOWR
|
|
#define _IO(x,y) ((x<<8)|y|0x00000)
|
|
#define _IOR(x,y,t) ((x<<8)|y|0x10000)
|
|
#define _IOW(x,y,t) ((x<<8)|y|0x20000)
|
|
#define _IOWR(x,y,t) ((x<<8)|y|0x30000)
|
|
#endif
|
|
|
|
#if !defined (_IOWR)
|
|
#if !defined (IOC_OUTIN)
|
|
#define IOC_OUTIN 0x10000000 /* copy in parameters */
|
|
#endif
|
|
#define _IOWR(x,y,t) (IOC_OUTIN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|(x<<8)|y)
|
|
#endif
|
|
|
|
#define BDM_INIT _IO('B', 0)
|
|
#define BDM_RESET_CHIP _IO('B', 1)
|
|
#define BDM_RESTART_CHIP _IO('B', 2)
|
|
#define BDM_STOP_CHIP _IO('B', 3)
|
|
#define BDM_STEP_CHIP _IO('B', 4)
|
|
#define BDM_GET_STATUS _IOR('B', 5, int)
|
|
#define BDM_SPEED _IOW('B', 6, int)
|
|
#define BDM_DEBUG _IOW('B', 7, int)
|
|
#define BDM_RELEASE_CHIP _IO('B', 8)
|
|
#define BDM_GO _IO('B', 9)
|
|
|
|
/*
|
|
* Input/output requests
|
|
*/
|
|
/*
|
|
* Addition for general register access.
|
|
*
|
|
* Note, the control and debug registers has been added at the start
|
|
* so the other allocated number do not change.
|
|
*/
|
|
#define BDM_READ_CTLREG _IOWR('B', 16, struct BDMioctl)
|
|
#define BDM_WRITE_CTLREG _IOW('B', 17, struct BDMioctl)
|
|
#define BDM_READ_DBREG _IOWR('B', 18, struct BDMioctl)
|
|
#define BDM_WRITE_DBREG _IOW('B', 19, struct BDMioctl)
|
|
#define BDM_READ_REG _IOWR('B', 20, struct BDMioctl)
|
|
#define BDM_READ_SYSREG _IOWR('B', 21, struct BDMioctl)
|
|
#define BDM_READ_LONGWORD _IOWR('B', 22, struct BDMioctl)
|
|
#define BDM_READ_WORD _IOWR('B', 23, struct BDMioctl)
|
|
#define BDM_READ_BYTE _IOWR('B', 24, struct BDMioctl)
|
|
#define BDM_WRITE_REG _IOW('B', 25, struct BDMioctl)
|
|
#define BDM_WRITE_SYSREG _IOW('B', 26, struct BDMioctl)
|
|
#define BDM_WRITE_LONGWORD _IOW('B', 27, struct BDMioctl)
|
|
#define BDM_WRITE_WORD _IOW('B', 28, struct BDMioctl)
|
|
#define BDM_WRITE_BYTE _IOW('B', 29, struct BDMioctl)
|
|
|
|
/*
|
|
* Detect the driver version, processor or interface type
|
|
*/
|
|
#define BDM_GET_DRV_VER _IOR('B', 30, int)
|
|
#define BDM_GET_CPU_TYPE _IOR('B', 31, int)
|
|
#define BDM_GET_IF_TYPE _IOR('B', 32, int)
|
|
|
|
/*
|
|
* Coldfire specific call to control the use of the
|
|
* PST signals. This is only needed on 5206e targets that
|
|
* use the PST signals for IO.
|
|
*/
|
|
|
|
#define BDM_GET_CF_PST _IOR('B', 33, int)
|
|
#define BDM_SET_CF_PST _IOR('B', 34, int)
|
|
|
|
/*
|
|
* bits in status word returned by BDM_GET_STATUS ioctl
|
|
*/
|
|
#define BDM_TARGETRESET (1 << 0) /* Target reset */
|
|
#define BDM_TARGETHALT (1 << 1) /* Target halt */
|
|
#define BDM_TARGETSTOPPED (1 << 2) /* Target stopped */
|
|
#define BDM_TARGETPOWER (1 << 3) /* Power failed */
|
|
#define BDM_TARGETNC (1 << 4) /* Target not connected */
|
|
|
|
/*
|
|
* Register codes for BDM_READ_SYSREG/BDM_WRITE_SYSREG ioctls
|
|
*
|
|
* These are the control and debug registers for the CPU32 and
|
|
* Coldfire processor.
|
|
*
|
|
* These are ony logical numbers not the actual registers values used
|
|
* on the BDM port. The driver maps these to the correct command and
|
|
* register pair .
|
|
*
|
|
* Using only the one call keeps the changes to Eric's library and gdb
|
|
* code to a minimum.
|
|
*
|
|
* The WR only registers are shadowed in the driver.
|
|
*/
|
|
#define BDM_REG_RPC 0x0 /* CPU32, Coldfire */
|
|
#define BDM_REG_PCC 0x1 /* CPU32 */
|
|
#define BDM_REG_SR 0x2 /* CPU32, Coldfire */
|
|
#define BDM_REG_USP 0x3 /* CPU32 */
|
|
#define BDM_REG_SSP 0x4 /* CPU32 */
|
|
#define BDM_REG_SFC 0x5 /* CPU32 */
|
|
#define BDM_REG_DFC 0x6 /* CPU32 */
|
|
#define BDM_REG_ATEMP 0x7 /* CPU32 */
|
|
#define BDM_REG_FAR 0x8 /* CPU32 */
|
|
#define BDM_REG_VBR 0x9 /* CPU32, Coldfire */
|
|
#define BDM_REG_CACR 0xa /* Coldfire */
|
|
#define BDM_REG_ACR0 0xb /* Coldfire */
|
|
#define BDM_REG_ACR1 0xc /* Coldfire */
|
|
#define BDM_REG_RAMBAR 0xd /* Coldfire */
|
|
#define BDM_REG_MBAR 0xe /* Coldfire */
|
|
#define BDM_REG_CSR 0xf /* Coldfire */
|
|
#define BDM_REG_AATR 0x10 /* WR only, Coldfire */
|
|
#define BDM_REG_TDR 0x11 /* WR only, Coldfire */
|
|
#define BDM_REG_PBR 0x12 /* WR only, Coldfire */
|
|
#define BDM_REG_PBMR 0x13 /* WR only, Coldfire */
|
|
#define BDM_REG_ABHR 0x14 /* WR only, Coldfire */
|
|
#define BDM_REG_ABLR 0x15 /* WR only, Coldfire */
|
|
#define BDM_REG_DBR 0x16 /* WR only, Coldfire */
|
|
#define BDM_REG_DBMR 0x17 /* WR only, Coldfire */
|
|
#define BDM_MAX_SYSREG (BDM_REG_DBMR + 1)
|
|
|
|
/*
|
|
* Register codes for BDM_READ_REG/BDM_WRITE_REG ioctls
|
|
*/
|
|
#define BDM_REG_D0 0x0
|
|
#define BDM_REG_D1 0x1
|
|
#define BDM_REG_D2 0x2
|
|
#define BDM_REG_D3 0x3
|
|
#define BDM_REG_D4 0x4
|
|
#define BDM_REG_D5 0x5
|
|
#define BDM_REG_D6 0x6
|
|
#define BDM_REG_D7 0x7
|
|
#define BDM_REG_A0 0x8
|
|
#define BDM_REG_A1 0x9
|
|
#define BDM_REG_A2 0xa
|
|
#define BDM_REG_A3 0xb
|
|
#define BDM_REG_A4 0xc
|
|
#define BDM_REG_A5 0xd
|
|
#define BDM_REG_A6 0xe
|
|
#define BDM_REG_A7 0xf /* use this for the stack pointer */
|
|
|
|
#endif /* _BDM_H_ */
|