ftdi-prog/ftdi-vcp-rs/src/mpsse.rs

142 lines
5.3 KiB
Rust

// /* Transfer Command bits */
// /* All byte based commands consist of:
// * - Command byte
// * - Length lsb
// * - Length msb
// *
// * If data out is enabled the data follows after the above command bytes,
// * otherwise no additional data is needed.
// * - Data * n
// *
// * All bit based commands consist of:
// * - Command byte
// * - Length
// *
// * If data out is enabled a byte containing bitst to transfer follows.
// * Otherwise no additional data is needed. Only up to 8 bits can be transferred
// * per transaction when in bit mode.
// */
// /* b 0000 0000
// * |||| |||`- Data out negative enable. Update DO on negative clock edge.
// * |||| ||`-- Bit count enable. When reset count represents bytes.
// * |||| |`--- Data in negative enable. Latch DI on negative clock edge.
// * |||| `---- LSB enable. When set clock data out LSB first.
// * ||||
// * |||`------ Data out enable
// * ||`------- Data in enable
// * |`-------- TMS mode enable
// * `--------- Special command mode enable. See mpsse_cmd enum.
// */
// pub enum CommandBits {
// #define MC_DATA_TMS (0x40) /* When set use TMS mode */
// #define MC_DATA_IN (0x20) /* When set read data (Data IN) */
// #define MC_DATA_OUT (0x10) /* When set write data (Data OUT) */
// #define MC_DATA_LSB (0x08) /* When set input/output data LSB first. */
// #define MC_DATA_ICN (0x04) /* When set receive data on negative clock edge */
// #define MC_DATA_BITS (0x02) /* When set count bits not bytes */
// #define MC_DATA_OCN (0x01) /* When set update data on negative clock edge */
// }
/* MPSSE engine command definitions */
#[allow(non_camel_case_types)]
pub enum Command {
// Mode commands
/// Set Data bits LowByte
MC_SETB_LOW,
/// Read Data bits LowByte
MC_READB_LOW,
/// Set Data bits HighByte
MC_SETB_HIGH,
/// Read data bits HighByte
MC_READB_HIGH,
/// Enable loopback
MC_LOOPBACK_EN,
/// Disable loopback
MC_LOOPBACK_DIS,
/// Set clock divisor
MC_SET_CLK_DIV,
/// Flush buffer fifos to the PC.
MC_FLUSH,
/// Wait on GPIOL1 to go high.
MC_WAIT_H,
/// Wait on GPIOL1 to go low.
MC_WAIT_L,
/// Disable /5 div, enables 60MHz master clock
MC_TCK_X5,
/// Enable /5 div, backward compat to FT2232D
MC_TCK_D5,
/// Enable 3 phase clk, DDR I2C
MC_EN_3PH_CLK,
/// Disable 3 phase clk
MC_DIS_3PH_CLK,
/// Clock every bit, used for JTAG
MC_CLK_N,
/// Clock every byte, used for JTAG
MC_CLK_N8,
/// Clock until GPIOL1 goes high
MC_CLK_TO_H,
/// Clock until GPIOL1 goes low
MC_CLK_TO_L,
/// Enable adaptive clocking
MC_EN_ADPT_CLK,
/// Disable adaptive clocking
MC_DIS_ADPT_CLK,
/// Clock until GPIOL1 goes high, count bytes
MC_CLK8_TO_H,
/// Clock until GPIOL1 goes low, count bytes
MC_CLK8_TO_L,
/// Set IO to only drive on 0 and tristate on 1
MC_TRI,
/// CPU mode commands
/// CPUMode read short address
MC_CPU_RS,
/// CPUMode read extended address
MC_CPU_RE,
/// CPUMode write short address
MC_CPU_WS,
/// CPUMode write extended address
MC_CPU_WE,
}
impl Command {
pub fn to_u8(&self) -> u8{
use Command::*;
match *self {
/* Mode commands */
MC_SETB_LOW => 0x80, /* Set Data bits LowByte */
MC_READB_LOW => 0x81, /* Read Data bits LowByte */
MC_SETB_HIGH => 0x82, /* Set Data bits HighByte */
MC_READB_HIGH => 0x83, /* Read data bits HighByte */
MC_LOOPBACK_EN => 0x84, /* Enable loopback */
MC_LOOPBACK_DIS => 0x85, /* Disable loopback */
MC_SET_CLK_DIV => 0x86, /* Set clock divisor */
MC_FLUSH => 0x87, /* Flush buffer fifos to the PC. */
MC_WAIT_H => 0x88, /* Wait on GPIOL1 to go high. */
MC_WAIT_L => 0x89, /* Wait on GPIOL1 to go low. */
MC_TCK_X5 => 0x8A, /* Disable /5 div, enables 60MHz master clock */
MC_TCK_D5 => 0x8B, /* Enable /5 div, backward compat to FT2232D */
MC_EN_3PH_CLK => 0x8C, /* Enable 3 phase clk, DDR I2C */
MC_DIS_3PH_CLK => 0x8D, /* Disable 3 phase clk */
MC_CLK_N => 0x8E, /* Clock every bit, used for JTAG */
MC_CLK_N8 => 0x8F, /* Clock every byte, used for JTAG */
MC_CLK_TO_H => 0x94, /* Clock until GPIOL1 goes high */
MC_CLK_TO_L => 0x95, /* Clock until GPIOL1 goes low */
MC_EN_ADPT_CLK => 0x96, /* Enable adaptive clocking */
MC_DIS_ADPT_CLK => 0x97, /* Disable adaptive clocking */
MC_CLK8_TO_H => 0x9C, /* Clock until GPIOL1 goes high, count bytes */
MC_CLK8_TO_L => 0x9D, /* Clock until GPIOL1 goes low, count bytes */
MC_TRI => 0x9E, /* Set IO to only drive on 0 and tristate on 1 */
/* CPU mode commands */
MC_CPU_RS => 0x90, /* CPUMode read short address */
MC_CPU_RE => 0x91, /* CPUMode read extended address */
MC_CPU_WS => 0x92, /* CPUMode write short address */
MC_CPU_WE => 0x93, /* CPUMode write extended address */
}
}
}