- comment updated

git-svn-id: https://svn.code.sf.net/p/libusbjava/code/trunk@129 94ad28fe-ef68-46b1-9651-e7ae4fcf1c4c
This commit is contained in:
schlaepfer
2006-04-10 07:08:56 +00:00
parent 514f79e6de
commit 81e14c81e8
2 changed files with 256 additions and 39 deletions

View File

@@ -10,6 +10,12 @@ import ch.ntb.usb.Device;
import ch.ntb.usb.USB; import ch.ntb.usb.USB;
import ch.ntb.usb.USBException; import ch.ntb.usb.USBException;
/**
* Represents the Background Debugging Interface of the MPC555 microcontroller.
*
* @author schlaepfer
*
*/
public class MPC555 { public class MPC555 {
private static McdpLogger logger = LogUtil.ch_ntb_mcdp_bdi; private static McdpLogger logger = LogUtil.ch_ntb_mcdp_bdi;
@@ -120,18 +126,42 @@ public class MPC555 {
*/ */
private static final int NULL_INDICATION = -1; private static final int NULL_INDICATION = -1;
/**
* Maximal number of wordsfor one usb-packet to download (fastDownload).
*/
private int maxNofWordsFastDownload; private int maxNofWordsFastDownload;
/**
* Internal state whether the fast download procedure has been started.
*/
private boolean fastDownloadStarted; private boolean fastDownloadStarted;
/**
* The last known state on the freeze signal.
*/
private boolean targetInDebugMode; private boolean targetInDebugMode;
/**
* Temporary buffer of the data to send.
*/
private byte[] sendData; private byte[] sendData;
/**
* Temporary register values (see <code>epilogue</code> and
* <code>prologue</code>).
*/
private int gpr30, gpr31, ecr; private int gpr30, gpr31, ecr;
/**
* The USB device to connect to.
*/
private Device device; private Device device;
/**
* @param device
* The USB device to connect to. Before using any methods which
* communicate with the device, the device must be connected.
*/
public MPC555(Device device) { public MPC555(Device device) {
targetInDebugMode = false; targetInDebugMode = false;
fastDownloadStarted = false; fastDownloadStarted = false;
@@ -139,6 +169,15 @@ public class MPC555 {
sendData = new byte[USB.HIGHSPEED_MAX_BULK_PACKET_SIZE]; sendData = new byte[USB.HIGHSPEED_MAX_BULK_PACKET_SIZE];
} }
/**
* Initialize an USB packet.
*
* @param STYPE
* the subtype
* @param dataLength
* length of the data contained in the packet (not the length of
* the USB packet).
*/
private void initPacket(byte STYPE, int dataLength) { private void initPacket(byte STYPE, int dataLength) {
logger.finest("initPacket(0x" + Integer.toHexString(STYPE) + ", " logger.finest("initPacket(0x" + Integer.toHexString(STYPE) + ", "
+ dataLength + ")"); + dataLength + ")");
@@ -150,6 +189,15 @@ public class MPC555 {
sendData[DataPacket.PACKET_DATA_OFFSET + dataLength] = DataPacket.PACKET_END; sendData[DataPacket.PACKET_DATA_OFFSET + dataLength] = DataPacket.PACKET_END;
} }
/**
* Transmit an USB packet and receive the result.
*
* @param dataLength
* @return
* @throws USBException
* @throws DispatchException
* @throws BDIException
*/
private DataPacket transmit(int dataLength) throws USBException, private DataPacket transmit(int dataLength) throws USBException,
DispatchException, BDIException { DispatchException, BDIException {
// write USB-command // write USB-command
@@ -168,6 +216,14 @@ public class MPC555 {
return data; return data;
} }
/**
*
*
* @param modeBit
* @param controlBit
* @param data
* @param offset
*/
private void fillPacket(boolean modeBit, boolean controlBit, int data, private void fillPacket(boolean modeBit, boolean controlBit, int data,
int offset) { int offset) {
@@ -450,6 +506,19 @@ public class MPC555 {
fastDownloadStarted = true; fastDownloadStarted = true;
} }
/**
* Update the internal maximal values for the <code>fastDownload</code>
* procedure.
*/
private void updateMaxValues() {
// update the value (now the device should be connected)
if (maxNofWordsFastDownload <= 0) {
maxNofWordsFastDownload = ((device.getMaxPacketSize() - DataPacket.PACKET_MIN_LENGTH) / BDI_DATA35_LENGTH);
logger.finer("update maxNofWordsFastDownload: "
+ maxNofWordsFastDownload);
}
}
/** /**
* Fill one USB-Packet with data to download. The maximal number of words is * Fill one USB-Packet with data to download. The maximal number of words is
* defined by <code>maxNofWordsFastDownload</code><br> * defined by <code>maxNofWordsFastDownload</code><br>
@@ -470,12 +539,7 @@ public class MPC555 {
if (!fastDownloadStarted) { if (!fastDownloadStarted) {
throw new BDIException("start fast download first"); throw new BDIException("start fast download first");
} }
// update the value (now the device should be connected) updateMaxValues();
if (maxNofWordsFastDownload <= 0) {
maxNofWordsFastDownload = ((device.getMaxPacketSize() - DataPacket.PACKET_MIN_LENGTH) / BDI_DATA35_LENGTH);
logger.finer("update maxNofWordsFastDownload: "
+ maxNofWordsFastDownload);
}
// check if data fits into USB-packet // check if data fits into USB-packet
if (dataLength > maxNofWordsFastDownload) { if (dataLength > maxNofWordsFastDownload) {
throw new BDIException("data larger than maxNofWordsFastDownload: " throw new BDIException("data larger than maxNofWordsFastDownload: "
@@ -532,6 +596,16 @@ public class MPC555 {
transferAndParse35(false, true, 0x0); transferAndParse35(false, true, 0x0);
} }
/**
* Write a value to the specified memory address.
*
* @param addr
* @param value
* @param size
* @throws USBException
* @throws DispatchException
* @throws BDIException
*/
public void writeMem(int addr, int value, int size) throws USBException, public void writeMem(int addr, int value, int size) throws USBException,
DispatchException, BDIException { DispatchException, BDIException {
logger.fine("writeMem(0x" + Integer.toHexString(addr) + ", 0x" logger.fine("writeMem(0x" + Integer.toHexString(addr) + ", 0x"
@@ -567,6 +641,16 @@ public class MPC555 {
} }
} }
/**
* Read a value from the specified memory address.
*
* @param addr
* @param size
* @return
* @throws USBException
* @throws DispatchException
* @throws BDIException
*/
public int readMem(int addr, int size) throws USBException, public int readMem(int addr, int size) throws USBException,
DispatchException, BDIException { DispatchException, BDIException {
logger.fine("readMem(0x" + Integer.toHexString(addr) + ", " + size logger.fine("readMem(0x" + Integer.toHexString(addr) + ", " + size
@@ -602,6 +686,16 @@ public class MPC555 {
return transferAndParse35(false, false, NOP); return transferAndParse35(false, false, NOP);
} }
/**
* Write a value to the next memory address set up with the
* <code>writeMem</code> command.
*
* @param value
* @param size
* @throws USBException
* @throws DispatchException
* @throws BDIException
*/
public void writeMemSeq(int value, int size) throws USBException, public void writeMemSeq(int value, int size) throws USBException,
DispatchException, BDIException { DispatchException, BDIException {
logger.fine("writeMemSeq(int, int)"); logger.fine("writeMemSeq(int, int)");
@@ -632,6 +726,16 @@ public class MPC555 {
} }
} }
/**
* Read a value from the next memory address set up with the
* <code>readMem</code> command.
*
* @param size
* @return
* @throws USBException
* @throws DispatchException
* @throws BDIException
*/
public int readMemSeq(int size) throws USBException, DispatchException, public int readMemSeq(int size) throws USBException, DispatchException,
BDIException { BDIException {
logger.fine("readMemSeq(int)"); logger.fine("readMemSeq(int)");
@@ -662,6 +766,15 @@ public class MPC555 {
return transferAndParse35(false, false, NOP); return transferAndParse35(false, false, NOP);
} }
/**
* Read a General Purpose Register.
*
* @param gpr
* @return
* @throws USBException
* @throws DispatchException
* @throws BDIException
*/
public int readGPR(int gpr) throws USBException, DispatchException, public int readGPR(int gpr) throws USBException, DispatchException,
BDIException { BDIException {
logger.fine("readGPR(" + gpr + ")"); logger.fine("readGPR(" + gpr + ")");
@@ -682,6 +795,15 @@ public class MPC555 {
return transferAndParse35(false, false, NOP); return transferAndParse35(false, false, NOP);
} }
/**
* Write a General Purpose Register.
*
* @param gpr
* @param value
* @throws USBException
* @throws DispatchException
* @throws BDIException
*/
public void writeGPR(int gpr, int value) throws USBException, public void writeGPR(int gpr, int value) throws USBException,
DispatchException, BDIException { DispatchException, BDIException {
logger.fine("writeGPR(" + gpr + ", 0x" + Integer.toHexString(value) logger.fine("writeGPR(" + gpr + ", 0x" + Integer.toHexString(value)
@@ -705,6 +827,15 @@ public class MPC555 {
transferAndParse35(false, true, value); transferAndParse35(false, true, value);
} }
/**
* Read a Special Purpose Register.
*
* @param spr
* @return
* @throws USBException
* @throws DispatchException
* @throws BDIException
*/
public int readSPR(int spr) throws USBException, DispatchException, public int readSPR(int spr) throws USBException, DispatchException,
BDIException { BDIException {
logger.fine("readSPR(" + spr + ")"); logger.fine("readSPR(" + spr + ")");
@@ -727,6 +858,15 @@ public class MPC555 {
return transferAndParse35(false, false, NOP); return transferAndParse35(false, false, NOP);
} }
/**
* Write a Special Purpose Register.
*
* @param spr
* @param value
* @throws USBException
* @throws DispatchException
* @throws BDIException
*/
public void writeSPR(int spr, int value) throws USBException, public void writeSPR(int spr, int value) throws USBException,
DispatchException, BDIException { DispatchException, BDIException {
logger.fine("writeSPR(" + spr + ", 0x" + Integer.toHexString(value) logger.fine("writeSPR(" + spr + ", 0x" + Integer.toHexString(value)
@@ -744,6 +884,14 @@ public class MPC555 {
transferAndParse35(false, false, cmd); transferAndParse35(false, false, cmd);
} }
/**
* Read the Machine Status Register.
*
* @return
* @throws USBException
* @throws DispatchException
* @throws BDIException
*/
public int readMSR() throws USBException, DispatchException, BDIException { public int readMSR() throws USBException, DispatchException, BDIException {
logger.fine("readMSR()"); logger.fine("readMSR()");
if (!targetInDebugMode) { if (!targetInDebugMode) {
@@ -758,6 +906,14 @@ public class MPC555 {
return transferAndParse35(false, false, NOP); return transferAndParse35(false, false, NOP);
} }
/**
* Write the Machine Status Register.
*
* @param value
* @throws USBException
* @throws DispatchException
* @throws BDIException
*/
public void writeMSR(int value) throws USBException, DispatchException, public void writeMSR(int value) throws USBException, DispatchException,
BDIException { BDIException {
logger.fine("writeMSR(0x" + Integer.toHexString(value) + ")"); logger.fine("writeMSR(0x" + Integer.toHexString(value) + ")");
@@ -772,6 +928,16 @@ public class MPC555 {
transferAndParse35(false, false, 0x7FC00124); transferAndParse35(false, false, 0x7FC00124);
} }
/**
* Read a Floating Point Register.
*
* @param fpr
* @param tmpMemAddr
* @return
* @throws USBException
* @throws DispatchException
* @throws BDIException
*/
public long readFPR(int fpr, int tmpMemAddr) throws USBException, public long readFPR(int fpr, int tmpMemAddr) throws USBException,
DispatchException, BDIException { DispatchException, BDIException {
logger.fine("readFPR(" + fpr + ", 0x" + Integer.toHexString(tmpMemAddr) logger.fine("readFPR(" + fpr + ", 0x" + Integer.toHexString(tmpMemAddr)
@@ -795,6 +961,16 @@ public class MPC555 {
+ readMem(tmpMemAddr + 4, 4); + readMem(tmpMemAddr + 4, 4);
} }
/**
* Write a Floating Point Register.
*
* @param fpr
* @param tmpMemAddr
* @param value
* @throws USBException
* @throws DispatchException
* @throws BDIException
*/
public void writeFPR(int fpr, int tmpMemAddr, long value) public void writeFPR(int fpr, int tmpMemAddr, long value)
throws USBException, DispatchException, BDIException { throws USBException, DispatchException, BDIException {
logger.fine("writeFPR(" + fpr + ", 0x" logger.fine("writeFPR(" + fpr + ", 0x"
@@ -822,6 +998,14 @@ public class MPC555 {
transferAndParse35(false, false, NOP); transferAndParse35(false, false, NOP);
} }
/**
* Read the Condition Register.
*
* @return
* @throws USBException
* @throws DispatchException
* @throws BDIException
*/
public int readCR() throws USBException, DispatchException, BDIException { public int readCR() throws USBException, DispatchException, BDIException {
logger.fine("readCR()"); logger.fine("readCR()");
if (!targetInDebugMode) { if (!targetInDebugMode) {
@@ -836,6 +1020,14 @@ public class MPC555 {
return transferAndParse35(false, false, NOP); return transferAndParse35(false, false, NOP);
} }
/**
* Write the Condition Register.
*
* @param value
* @throws USBException
* @throws DispatchException
* @throws BDIException
*/
public void writeCR(int value) throws USBException, DispatchException, public void writeCR(int value) throws USBException, DispatchException,
BDIException { BDIException {
logger.fine("writeCR(0x" + Integer.toHexString(value) + ")"); logger.fine("writeCR(0x" + Integer.toHexString(value) + ")");
@@ -851,6 +1043,14 @@ public class MPC555 {
transferAndParse35(false, false, 0x7FCFF120); transferAndParse35(false, false, 0x7FCFF120);
} }
/**
* Read the Floating-Point Status and Control Register.
*
* @return
* @throws USBException
* @throws DispatchException
* @throws BDIException
*/
public int readFPSCR() throws USBException, DispatchException, BDIException { public int readFPSCR() throws USBException, DispatchException, BDIException {
logger.fine("readFPSCR()"); logger.fine("readFPSCR()");
if (!targetInDebugMode) { if (!targetInDebugMode) {
@@ -881,6 +1081,14 @@ public class MPC555 {
return retVal; return retVal;
} }
/**
* Write the Floating-Point Status and Control Register.
*
* @param value
* @throws USBException
* @throws DispatchException
* @throws BDIException
*/
public void writeFPSCR(int value) throws USBException, DispatchException, public void writeFPSCR(int value) throws USBException, DispatchException,
BDIException { BDIException {
logger.fine("writeFPSCR(0x" + Integer.toHexString(value) + ")"); logger.fine("writeFPSCR(0x" + Integer.toHexString(value) + ")");
@@ -902,7 +1110,9 @@ public class MPC555 {
* up to date as the target state may have changed meanwhile. To get the up * up to date as the target state may have changed meanwhile. To get the up
* to date value use <code>isFreezeAsserted</code> which will issue an USB * to date value use <code>isFreezeAsserted</code> which will issue an USB
* request, read the freeze signal and update the internal value returned by * request, read the freeze signal and update the internal value returned by
* this method. * this method.<br>
* The value is also updated when parsing certain BDI results (see
* <code>parseResult35</code>).
* *
* @return the last known state of the freeze signal * @return the last known state of the freeze signal
*/ */
@@ -912,7 +1122,7 @@ public class MPC555 {
/** /**
* Read the currently stored value of the GPR 30 register.<br> * Read the currently stored value of the GPR 30 register.<br>
* This value is updated when entering debug mode (break -> prologue). * This value is updated when entering debug mode (<code>prologue</code>).
* *
* @return the store value of this register * @return the store value of this register
*/ */
@@ -923,7 +1133,7 @@ public class MPC555 {
/** /**
* Set the value of the GPR 30 register.<br> * Set the value of the GPR 30 register.<br>
* This value is written to the GPR30 register when the microcontroller * This value is written to the GPR30 register when the microcontroller
* resumes from debug mode (go -> epilogue). * resumes from debug mode (<code>epilogue</code>).
* *
* @param value * @param value
* value to write to the register * value to write to the register
@@ -935,7 +1145,7 @@ public class MPC555 {
/** /**
* Read the currently stored value of the GPR 31 register.<br> * Read the currently stored value of the GPR 31 register.<br>
* This value is updated when entering debug mode (break -> prologue). * This value is updated when entering debug mode (<code>prologue</code>).
* *
* @return the store value of this register * @return the store value of this register
*/ */
@@ -946,7 +1156,7 @@ public class MPC555 {
/** /**
* Set the value of the GPR 31 register.<br> * Set the value of the GPR 31 register.<br>
* This value is written to the GPR31 register when the microcontroller * This value is written to the GPR31 register when the microcontroller
* resumes from debug mode (go -> epilogue). * resumes from debug mode (<code>epilogue</code>).
* *
* @param value * @param value
* value to write to the register * value to write to the register
@@ -958,16 +1168,12 @@ public class MPC555 {
/** /**
* @return number of maximal words used in the <code>fastDownload</code> * @return number of maximal words used in the <code>fastDownload</code>
* procedure<br> * procedure.<br>
* Note that this procedure only returns a valid value if the device * Note that this procedure only returns a valid value if the device
* is already connected (the USB bulk transfer size must be known). * is already connected (the USB bulk transfer size must be known).
*/ */
public int getMaxNofWordsFastDownload() { public int getMaxNofWordsFastDownload() {
if (maxNofWordsFastDownload <= 0) { updateMaxValues();
maxNofWordsFastDownload = ((device.getMaxPacketSize() - DataPacket.PACKET_MIN_LENGTH) / BDI_DATA35_LENGTH);
logger.finer("update maxNofWordsFastDownload: "
+ maxNofWordsFastDownload);
}
return maxNofWordsFastDownload; return maxNofWordsFastDownload;
} }
} }

View File

@@ -15,26 +15,29 @@ public class BDI555test {
public static MPC555 bdi; public static MPC555 bdi;
// private static void testBdiTransaction() { private static void testBdiTransaction() {
// // test bdi transaction /*
// DataPacket result = null; // test bdi transaction
// try { DataPacket result = null;
// result = BDI555.transfer(false, false, 0x7FD69BA6); try {
// result = BDI555.transfer(false, false, 0x60000000); // result = bdi.transfer(false, false, 0x00000000);
// } catch (USBException e1) { result = bdi.transfer(false, false, 0x7FD69BA6);
// // TODO Auto-generated catch block // result = bdi.transfer(false, false, 0x60000000);
// e1.printStackTrace(); } catch (USBException e1) {
// } catch (DispatchException e1) { // TODO Auto-generated catch block
// // TODO Auto-generated catch block e1.printStackTrace();
// e1.printStackTrace(); } catch (DispatchException e1) {
// } catch (BDIException e) { // TODO Auto-generated catch block
// // TODO Auto-generated catch block e1.printStackTrace();
// e.printStackTrace(); } catch (BDIException e) {
// } // TODO Auto-generated catch block
// if (result != null) { e.printStackTrace();
// result.toString(); }
// } if (result != null) {
// } System.out.println(result.toString());
}
*/
}
private static void reset_target() { private static void reset_target() {
try { try {
@@ -197,9 +200,17 @@ public class BDI555test {
} }
} }
private static void nop() throws USBException, DispatchException,
BDIException {
// nop
System.out.println("nop");
//int data = bdi.transferAndParse35(true, true, 0x00000000);
//System.out.println("0x" + Integer.toHexString(data));
}
public static void button1() { public static void button1() {
// System.out.println("testBdiTransaction()"); System.out.println("testBdiTransaction()");
// testBdiTransaction(); testBdiTransaction();
} }
public static void button2() { public static void button2() {