} catch (Exception e) { throw new RuntimeException(e); }
}
+ protected int dbits = 0;
+ protected synchronized void dbang(int bit, boolean val) {
+ dbits = val ? (dbits | (1 << bit)) : (dbits & (~(1 << bit)));
+ try {
+ getOutputStream().write((byte)dbits);
+ } catch (IOException e) { throw new RuntimeException(e); }
+ }
+
public void doReset() {
dmask =
flush();
//purge();
- dbangmode(dmask);
+ dbus_mode(dmask);
flush();
clk(false);
// we can pull it down (assert reset) from uart-mode, or we can
// let it float upward from either mode.
public void reset(boolean on) {
- uart(1<<1, on ? (1<<1) : 0);
+ uart_and_cbus_mode(1<<1, on ? (1<<1) : 0);
flush();
if (on) {
- dbangmode(dmask);
+ dbus_mode(dmask);
flush();
}
}
public boolean con() {
flush();
//dmask &= ~(1<<0);
- dbangmode(dmask);
+ dbus_mode(dmask);
return (readPins() & (1<<0)) != 0;
}
public boolean rcon() {
flush();
dmask &= ~(1<<0);
- dbangmode(dmask);
+ dbus_mode(dmask);
return (readPins() & (1<<0)) != 0;
}
public void con(boolean on) {
flush();
dmask |= (1<<0);
dbang(0, on);
- dbangmode(dmask);
+ dbus_mode(dmask);
}
}
package com.ftdi.usb;
import java.io.*;
+/**
+ * A Java wrapper around libftdi.
+ *
+ * Note: blocking reads are currently implemented by busy-waiting.
+ * This is really ugly. Check the linux kernel source to see how to
+ * get libftdi to do it properly.
+ *
+ * Flow control is also not properly supported.
+ */
public class FtdiUart {
private SWIGTYPE_p_ftdi_context context = example.new_ftdi_context();
purge();
}
+ /**
+ * Switch to uart mode, with read/write access to four CBUS lines.
+ * This function is used to write to the CBUS lines (re-invoke it to change their state).
+ * I think readPins() is used to read from them, but I'm not sure.
+ *
+ * @param cbus_mask a four-bit mask; set bit=1 to write to a CBUS line, bit=0 to read from it
+ * @param cbus_bits a four-bit mask; the bits to assert on the write-enabled CBUS lines
+ */
+ public synchronized void uart_and_cbus_mode(int cbus_mask, int cbus_bits) {
+ example.ftdi_set_bitmode(context, (short)((cbus_mask << 4) | cbus_bits), (short)0x20);
+ }
+
+ /**
+ * Switch to dbus mode; CBUS lines will be released (ie they will float).
+ * Use getInputStream()/getOutputStream() to read/write the eight DBUS lines.
+ *
+ * @param dbus_mask an eight-bit mask; set bit=1 to write to a DBUS line, bit=0 to read from it
+ */
+ public synchronized void dbus_mode(int dbus_mask) {
+ example.ftdi_set_bitmode(context, (short)dbus_mask, (short)0x01);
+ }
+
+ /** returns the instantaneous value present on the DBUS pins */
public synchronized int readPins() {
try {
getOutputStream().flush();
return b[0];
}
+ /** purge the on-chip buffers */
public synchronized void purge() {
example.ftdi_usb_purge_buffers(context);
}
- public synchronized void uart(int cbus_mask, int cbus_bits) {
- example.ftdi_set_bitmode(context, (short)((cbus_mask << 4) | cbus_bits), (short)0x20);
- }
- public synchronized void dbangmode(int dmask) {
- example.ftdi_set_bitmode(context, (short)dmask, (short)0x01);
- }
-
- protected int dbits = 0;
-
- protected synchronized void dbang(int bit, boolean val) {
- dbits = val ? (dbits | (1 << bit)) : (dbits & (~(1 << bit)));
- try {
- out.write((byte)dbits);
- } catch (IOException e) { throw new RuntimeException(e); }
- }
-
private final InputStream in = new InputStream() {
public int available() throws IOException {
// FIXME