- Register dictionary updated (using Reflection)
- Support for 332/555 git-svn-id: https://svn.code.sf.net/p/libusbjava/code/trunk@47 94ad28fe-ef68-46b1-9651-e7ae4fcf1c4c
This commit is contained in:
32
mcdp/src/ch/ntb/mcdp/dict/Register.java
Normal file
32
mcdp/src/ch/ntb/mcdp/dict/Register.java
Normal file
@@ -0,0 +1,32 @@
|
||||
package ch.ntb.mcdp.dict;
|
||||
|
||||
public class Register {
|
||||
|
||||
// Register Types
|
||||
public static String[] types = null;
|
||||
|
||||
public Register(String name, int type, int value, int size,
|
||||
String description) {
|
||||
this.name = name;
|
||||
this.type = type;
|
||||
this.value = value;
|
||||
this.size = size;
|
||||
this.description = description;
|
||||
}
|
||||
|
||||
public final String name;
|
||||
|
||||
public final int type;
|
||||
|
||||
public final int value;
|
||||
|
||||
public final int size;
|
||||
|
||||
public final String description;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return new String(name + "\t" + types[type] + "\t0x"
|
||||
+ Integer.toHexString(value) + "\t" + size + "\t" + description);
|
||||
}
|
||||
}
|
||||
@@ -1,18 +1,14 @@
|
||||
package ch.ntb.mcdp.mc68332;
|
||||
package ch.ntb.mcdp.dict;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.io.Writer;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedList;
|
||||
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
import javax.xml.parsers.SAXParser;
|
||||
import javax.xml.parsers.SAXParserFactory;
|
||||
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.NamedNodeMap;
|
||||
@@ -21,11 +17,12 @@ import org.w3c.dom.NodeList;
|
||||
import org.xml.sax.ErrorHandler;
|
||||
import org.xml.sax.SAXException;
|
||||
import org.xml.sax.SAXParseException;
|
||||
import org.xml.sax.helpers.DefaultHandler;
|
||||
|
||||
public class RegisterDict {
|
||||
public abstract class RegisterDict {
|
||||
|
||||
private static LinkedList<Register> registers;
|
||||
private LinkedList registers;
|
||||
|
||||
private Class regClass;
|
||||
|
||||
private static final long serialVersionUID = -582382284126896830L;
|
||||
|
||||
@@ -43,80 +40,41 @@ public class RegisterDict {
|
||||
|
||||
private static final String REG_ATTR_TYPE = "type";
|
||||
|
||||
private static final String REG_ATTR_OFFSET = "offset";
|
||||
private static final String REG_ATTR_VALUE = "value";
|
||||
|
||||
private static final String REG_ATTR_SIZE = "size";
|
||||
|
||||
private static final String REG_ATTR_TYPE_CTRLREG = "CtrlReg";
|
||||
|
||||
private static final String REG_ATTR_TYPE_USERREG = "UserReg";
|
||||
|
||||
private static final String REG_ATTR_TYPE_SYSREG = "SysReg";
|
||||
|
||||
static {
|
||||
registers = new LinkedList<Register>();
|
||||
|
||||
// data registers
|
||||
add("D0", Register.UserReg, 0x0, 4, "data register 0");
|
||||
add("D1", Register.UserReg, 0x1, 4, "data register 1");
|
||||
add("D2", Register.UserReg, 0x2, 4, "data register 2");
|
||||
add("D3", Register.UserReg, 0x3, 4, "data register 3");
|
||||
add("D4", Register.UserReg, 0x4, 4, "data register 4");
|
||||
add("D5", Register.UserReg, 0x5, 4, "data register 5");
|
||||
add("D6", Register.UserReg, 0x6, 4, "data register 6");
|
||||
add("D7", Register.UserReg, 0x7, 4, "data register 7");
|
||||
|
||||
// address registers
|
||||
add("A0", Register.UserReg, 0x8, 4, "address register 0");
|
||||
add("A1", Register.UserReg, 0x9, 4, "address register 1");
|
||||
add("A2", Register.UserReg, 0xA, 4, "address register 2");
|
||||
add("A3", Register.UserReg, 0xB, 4, "address register 3");
|
||||
add("A4", Register.UserReg, 0xC, 4, "address register 4");
|
||||
add("A5", Register.UserReg, 0xD, 4, "address register 5");
|
||||
add("A6", Register.UserReg, 0xE, 4, "address register 6");
|
||||
add("A7", Register.UserReg, 0xF, 4, "address register 7");
|
||||
|
||||
// system registers
|
||||
add("RPC", Register.SysReg, 0x0, 4, "return program counter");
|
||||
add("PCC", Register.SysReg, 0x1, 4,
|
||||
"current instruction program counter");
|
||||
add("SR", Register.SysReg, 0xB, 2, "status register");
|
||||
add("USP", Register.SysReg, 0xC, 4, "user stack pointer (A7)");
|
||||
add("SSP", Register.SysReg, 0xD, 4, "supervisor stack pointer");
|
||||
add("SFC", Register.SysReg, 0xE, 4, "source function code register");
|
||||
add("DFC", Register.SysReg, 0xF, 4,
|
||||
"destination function code register");
|
||||
add("ATEMP", Register.SysReg, 0x8, 4, "temporary register A");
|
||||
add("FAR", Register.SysReg, 0x9, 4, "fault address register");
|
||||
add("VBR", Register.SysReg, 0xA, 4, "vector base register");
|
||||
|
||||
// TODO: remove
|
||||
protected RegisterDict(String registerClass) {
|
||||
try {
|
||||
addRegistersFromFile("resources/targets/mc68332/registerDictionary.xml");
|
||||
} catch (IOException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
} catch (ParserConfigurationException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
} catch (SAXException e) {
|
||||
// TODO Auto-generated catch block
|
||||
this.regClass = Class.forName(registerClass);
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
System.exit(1);
|
||||
}
|
||||
this.registers = new LinkedList();
|
||||
}
|
||||
|
||||
private static void add(String name, int type, int addr, int size,
|
||||
@SuppressWarnings("unchecked")
|
||||
protected void add(String name, int type, int value, int size,
|
||||
String description) {
|
||||
// remove before add for updates
|
||||
for (Iterator<Register> i = registers.iterator(); i.hasNext();) {
|
||||
if (i.next().name.equals(name)) {
|
||||
for (Iterator i = registers.iterator(); i.hasNext();) {
|
||||
if (((Register)i.next()).name.equals(name)) {
|
||||
i.remove();
|
||||
}
|
||||
}
|
||||
registers.add(new Register(name, type, addr, size, description));
|
||||
Constructor[] regConstructors = regClass.getDeclaredConstructors();
|
||||
Register reg = null;
|
||||
try {
|
||||
reg = (Register) regConstructors[0].newInstance(name, type, value, size, description);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
System.exit(1);
|
||||
}
|
||||
registers.add(reg);
|
||||
}
|
||||
|
||||
private static int parseInt(String s) {
|
||||
protected int parseInt(String s) {
|
||||
if (s == "")
|
||||
return 0;
|
||||
if (s.indexOf('x') > 0) {
|
||||
@@ -136,9 +94,9 @@ public class RegisterDict {
|
||||
}
|
||||
}
|
||||
|
||||
public static Register getRegister(String name) {
|
||||
for (Iterator<Register> i = registers.iterator(); i.hasNext();) {
|
||||
Register r = i.next();
|
||||
public Register getRegister(String name) {
|
||||
for (Iterator i = registers.iterator(); i.hasNext();) {
|
||||
Register r = (Register) i.next();
|
||||
if (r.name.equals(name)) {
|
||||
return r;
|
||||
}
|
||||
@@ -146,31 +104,15 @@ public class RegisterDict {
|
||||
return null;
|
||||
}
|
||||
|
||||
public static void printRegisters() {
|
||||
public void printRegisters() {
|
||||
System.out
|
||||
.println("******************** register dictionary *********************");
|
||||
System.out.println("Name \t Type \t\t Address \t Size \t Description");
|
||||
System.out.println("Name\tType\tAddress\tSize\tDescription");
|
||||
System.out
|
||||
.println("**************************************************************");
|
||||
for (Iterator<Register> i = registers.iterator(); i.hasNext();) {
|
||||
Register r = i.next();
|
||||
String type;
|
||||
switch (r.type) {
|
||||
case Register.CtrReg:
|
||||
type = "CtrReg";
|
||||
break;
|
||||
case Register.SysReg:
|
||||
type = "SysReg";
|
||||
break;
|
||||
case Register.UserReg:
|
||||
type = "UserReg";
|
||||
break;
|
||||
default:
|
||||
type = Integer.toString(r.type);
|
||||
}
|
||||
System.out.println(r.name + "\t" + type + "\t\t0x"
|
||||
+ Integer.toHexString(r.addr) + "\t\t" + r.size + "\t"
|
||||
+ r.description);
|
||||
for (Iterator i = registers.iterator(); i.hasNext();) {
|
||||
Register r = (Register) i.next();
|
||||
System.out.println(r.toString());
|
||||
}
|
||||
System.out
|
||||
.println("**************************************************************");
|
||||
@@ -189,8 +131,8 @@ public class RegisterDict {
|
||||
* @throws ParserConfigurationException
|
||||
* @throws SAXException
|
||||
*/
|
||||
public static void addRegistersFromFile(String xmlPathname)
|
||||
throws IOException, ParserConfigurationException, SAXException {
|
||||
public void addRegistersFromFile(String xmlPathname) throws IOException,
|
||||
ParserConfigurationException, SAXException {
|
||||
Document document;
|
||||
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
|
||||
factory.setValidating(true);
|
||||
@@ -206,7 +148,7 @@ public class RegisterDict {
|
||||
throw e;
|
||||
}
|
||||
|
||||
// treat warnings errors as fatal error
|
||||
// treat warnings as fatal error
|
||||
public void warning(SAXParseException e) throws SAXParseException {
|
||||
throw e;
|
||||
}
|
||||
@@ -228,12 +170,34 @@ public class RegisterDict {
|
||||
parseRegisterGroup(list.item(j), baseAddr);
|
||||
}
|
||||
}
|
||||
} else if (list.item(j).getNodeName().equals(REGISTER)) {
|
||||
NamedNodeMap attributes = list.item(j).getAttributes();
|
||||
// attributes: name, type, offset, size
|
||||
Node n = attributes.getNamedItem(REG_ATTR_NAME);
|
||||
String name = n.getNodeValue();
|
||||
n = attributes.getNamedItem(REG_ATTR_TYPE);
|
||||
String typeStr = n.getNodeValue();
|
||||
int type = convertType(typeStr);
|
||||
n = attributes.getNamedItem(REG_ATTR_VALUE);
|
||||
int value = parseInt(n.getNodeValue());
|
||||
n = attributes.getNamedItem(REG_ATTR_SIZE);
|
||||
int size = parseInt(n.getNodeValue());
|
||||
parseRegister(list.item(j), name, type, value, size);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void parseRegisterGroup(Node registerGroup, int baseAddr)
|
||||
protected int convertType(String typeStr) throws SAXException {
|
||||
for (int index = 0; index < Register.types.length; index++) {
|
||||
if (typeStr.equals(Register.types[index])) {
|
||||
return index;
|
||||
}
|
||||
}
|
||||
throw new SAXException("invalid register definition: " + typeStr);
|
||||
}
|
||||
|
||||
private void parseRegisterGroup(Node registerGroup, int baseAddr)
|
||||
throws SAXException {
|
||||
NodeList list = registerGroup.getChildNodes();
|
||||
for (int i = 0; i < list.getLength(); i++) {
|
||||
@@ -244,18 +208,8 @@ public class RegisterDict {
|
||||
String name = n.getNodeValue();
|
||||
n = attributes.getNamedItem(REG_ATTR_TYPE);
|
||||
String typeStr = n.getNodeValue();
|
||||
int type;
|
||||
if (typeStr.equals(REG_ATTR_TYPE_CTRLREG)) {
|
||||
type = Register.CtrReg;
|
||||
} else if (typeStr.equals(REG_ATTR_TYPE_SYSREG)) {
|
||||
type = Register.SysReg;
|
||||
} else if (typeStr.equals(REG_ATTR_TYPE_USERREG)) {
|
||||
type = Register.UserReg;
|
||||
} else {
|
||||
throw new SAXException("invalid register definition: "
|
||||
+ list.item(i).getNodeName());
|
||||
}
|
||||
n = attributes.getNamedItem(REG_ATTR_OFFSET);
|
||||
int type = convertType(typeStr);
|
||||
n = attributes.getNamedItem(REG_ATTR_VALUE);
|
||||
int offset = parseInt(n.getNodeValue());
|
||||
n = attributes.getNamedItem(REG_ATTR_SIZE);
|
||||
int size = parseInt(n.getNodeValue());
|
||||
@@ -265,8 +219,8 @@ public class RegisterDict {
|
||||
}
|
||||
}
|
||||
|
||||
private static void parseRegister(Node register, String name, int type,
|
||||
int addr, int size) throws SAXException {
|
||||
private void parseRegister(Node register, String name, int type, int addr,
|
||||
int size) throws SAXException {
|
||||
NodeList list = register.getChildNodes();
|
||||
String description = "";
|
||||
for (int i = 0; i < list.getLength(); i++) {
|
||||
@@ -7,24 +7,23 @@ import ch.ntb.usb.USBException;
|
||||
|
||||
public class IMCBTargetBoard {
|
||||
|
||||
static MC68332RegisterDict regDict = new MC68332RegisterDict();
|
||||
|
||||
private static void writeRegister(String name, int value)
|
||||
throws USBException, DispatchException, BDIException {
|
||||
System.out.println("0x" + Integer.toHexString(readRegister(name)));
|
||||
System.out.println("writeRegister: " + name + ", value: 0x"
|
||||
+ Integer.toHexString(value));
|
||||
Register r = RegisterDict.getRegister(name);
|
||||
MC68332Register r = (MC68332Register) regDict.getRegister(name);
|
||||
switch (r.type) {
|
||||
case Register.CtrReg:
|
||||
System.out.println("writeMem");
|
||||
MC68332.writeMem(r.addr, value, r.size);
|
||||
case MC68332Register.CtrlReg:
|
||||
MC68332.writeMem(r.value, value, r.size);
|
||||
break;
|
||||
case Register.SysReg:
|
||||
System.out.println("writeSysReg");
|
||||
MC68332.writeSysReg(r.addr, value);
|
||||
case MC68332Register.SysReg:
|
||||
MC68332.writeSysReg(r.value, value);
|
||||
break;
|
||||
case Register.UserReg:
|
||||
System.out.println("writeUserReg");
|
||||
MC68332.writeUserReg(r.addr, value);
|
||||
case MC68332Register.UserReg:
|
||||
MC68332.writeUserReg(r.value, value);
|
||||
break;
|
||||
}
|
||||
System.out.println("0x" + Integer.toHexString(readRegister(name)));
|
||||
@@ -33,17 +32,14 @@ public class IMCBTargetBoard {
|
||||
private static int readRegister(String name) throws USBException,
|
||||
DispatchException, BDIException {
|
||||
System.out.print("readRegister: " + name);
|
||||
Register r = RegisterDict.getRegister(name);
|
||||
MC68332Register r = (MC68332Register) regDict.getRegister(name);
|
||||
switch (r.type) {
|
||||
case Register.CtrReg:
|
||||
System.out.println("\treadMem");
|
||||
return MC68332.readMem(r.addr, r.size);
|
||||
case Register.SysReg:
|
||||
System.out.println("\treadSysReg");
|
||||
return MC68332.readSysReg(r.addr);
|
||||
case Register.UserReg:
|
||||
System.out.println("\treadUserReg");
|
||||
return MC68332.readUserReg(r.addr);
|
||||
case MC68332Register.CtrlReg:
|
||||
return MC68332.readMem(r.value, r.size);
|
||||
case MC68332Register.SysReg:
|
||||
return MC68332.readSysReg(r.value);
|
||||
case MC68332Register.UserReg:
|
||||
return MC68332.readUserReg(r.value);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
@@ -52,8 +48,8 @@ public class IMCBTargetBoard {
|
||||
BDIException {
|
||||
|
||||
MC68332.reset_target();
|
||||
|
||||
// RegisterDict.printRegisters();
|
||||
|
||||
// regDict.printRegisters();
|
||||
|
||||
writeRegister("SR", 0x2700);
|
||||
writeRegister("SFC", 0x05);
|
||||
|
||||
28
mcdp/src/ch/ntb/mcdp/mc68332/MC68332Register.java
Normal file
28
mcdp/src/ch/ntb/mcdp/mc68332/MC68332Register.java
Normal file
@@ -0,0 +1,28 @@
|
||||
package ch.ntb.mcdp.mc68332;
|
||||
|
||||
import ch.ntb.mcdp.dict.Register;
|
||||
|
||||
/**
|
||||
* For system and user registers the <code>value</code> value is used as BDI
|
||||
* specific identifier (code specific to each register from the Technical
|
||||
* Reference Manual).
|
||||
*/
|
||||
|
||||
public class MC68332Register extends Register {
|
||||
|
||||
// Register Types
|
||||
static {
|
||||
types = new String[] { "UserReg", "SysReg", "CtrlReg" };
|
||||
}
|
||||
|
||||
static final int UserReg = 0;
|
||||
|
||||
static final int SysReg = 1;
|
||||
|
||||
static final int CtrlReg = 2;
|
||||
|
||||
public MC68332Register(String name, int type, int value, int size,
|
||||
String description) {
|
||||
super(name, type, value, size, description);
|
||||
}
|
||||
}
|
||||
35
mcdp/src/ch/ntb/mcdp/mc68332/MC68332RegisterDict.java
Normal file
35
mcdp/src/ch/ntb/mcdp/mc68332/MC68332RegisterDict.java
Normal file
@@ -0,0 +1,35 @@
|
||||
package ch.ntb.mcdp.mc68332;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
import ch.ntb.mcdp.dict.RegisterDict;
|
||||
|
||||
public class MC68332RegisterDict extends RegisterDict {
|
||||
|
||||
private static final String REGISTER_CLASS = "ch.ntb.mcdp.mc68332.MC68332Register";
|
||||
|
||||
private static final String PATH_TO_REGISTER_FILE = "resources/targets/mc68332/registerDictionary.xml";
|
||||
|
||||
MC68332RegisterDict() {
|
||||
super(REGISTER_CLASS);
|
||||
|
||||
// TODO: remove
|
||||
try {
|
||||
addRegistersFromFile(PATH_TO_REGISTER_FILE);
|
||||
} catch (IOException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
} catch (ParserConfigurationException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
} catch (SAXException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
printRegisters();
|
||||
}
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
package ch.ntb.mcdp.mc68332;
|
||||
|
||||
class Register {
|
||||
|
||||
public final static int UserReg = 0;
|
||||
|
||||
public final static int SysReg = 1;
|
||||
|
||||
public final static int CtrReg = 2;
|
||||
|
||||
Register(String name, int type, int addr, int size, String description) {
|
||||
this.name = name;
|
||||
this.type = type;
|
||||
this.addr = addr;
|
||||
this.size = size;
|
||||
this.description = description;
|
||||
}
|
||||
|
||||
public final String name;
|
||||
|
||||
public final int type;
|
||||
|
||||
/**
|
||||
* Absolute address of this register. <br>
|
||||
* For system and user register this value is used as BDI specific
|
||||
* identifier.
|
||||
*/
|
||||
public final int addr;
|
||||
|
||||
public final int size;
|
||||
|
||||
public final String description;
|
||||
}
|
||||
29
mcdp/src/ch/ntb/mcdp/mpc555/MPC555Register.java
Normal file
29
mcdp/src/ch/ntb/mcdp/mpc555/MPC555Register.java
Normal file
@@ -0,0 +1,29 @@
|
||||
package ch.ntb.mcdp.mpc555;
|
||||
|
||||
import ch.ntb.mcdp.dict.Register;
|
||||
|
||||
public class MPC555Register extends Register {
|
||||
|
||||
// Register Types
|
||||
static final String[] types = new String[] { "GPR", "FPR", "SPR", "MSR",
|
||||
"CR", "FPSCR", "CtrlReg" };
|
||||
|
||||
static final int GPR = 0;
|
||||
|
||||
static final int FPR = 1;
|
||||
|
||||
static final int SPR = 2;
|
||||
|
||||
static final int MSR = 3;
|
||||
|
||||
static final int CR = 4;
|
||||
|
||||
static final int FPSCR = 5;
|
||||
|
||||
static final int CtrlReg = 6;
|
||||
|
||||
protected MPC555Register(String name, int type, int value, int size,
|
||||
String description) {
|
||||
super(name, type, value, size, description);
|
||||
}
|
||||
}
|
||||
35
mcdp/src/ch/ntb/mcdp/mpc555/MPC555RegisterDict.java
Normal file
35
mcdp/src/ch/ntb/mcdp/mpc555/MPC555RegisterDict.java
Normal file
@@ -0,0 +1,35 @@
|
||||
package ch.ntb.mcdp.mpc555;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
import ch.ntb.mcdp.dict.RegisterDict;
|
||||
|
||||
public class MPC555RegisterDict extends RegisterDict {
|
||||
|
||||
private static final String REGISTER_CLASS = "ch.ntb.mcdp.mpc555.MPC555RegisterDict";
|
||||
|
||||
private static final String PATH_TO_REGISTER_FILE = "resources/targets/mpc555/registerDictionary.xml";
|
||||
|
||||
MPC555RegisterDict() {
|
||||
super(REGISTER_CLASS);
|
||||
|
||||
// TODO: remove
|
||||
try {
|
||||
addRegistersFromFile(PATH_TO_REGISTER_FILE);
|
||||
} catch (IOException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
} catch (ParserConfigurationException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
} catch (SAXException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
printRegisters();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user