- 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:
schlaepfer
2005-11-17 10:13:58 +00:00
parent 5603e3f132
commit 1ffab0f7ab
8 changed files with 241 additions and 165 deletions

View 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);
}
}

View File

@@ -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++) {

View File

@@ -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);

View 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);
}
}

View 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();
}
}

View File

@@ -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;
}

View 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);
}
}

View 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();
}
}