// the following are interface types
#define NOT_FOUND             0xFFFF
#define DEVICE                0x0000
#define STREAMING_PORT        0x0100
#define IO_PIN                0x0200
#define UART                  0x0400

#define IO_PIN_ON             0x0001
#define IO_PIN_OFF            0x0000

#define STREAMING_ENABLE      0x0001
#define STREAMING_DISABLE     0x0000    
#define STREAMING_RECV        0x0000
#define STREAMING_TRANS       0x0001

#define MAX_PARAMETER_LENGTH  21

struct parameter {
  unsigned int next_descriptor;
  unsigned int parameter_id;
  unsigned int parameter_flags;
  unsigned long int current_value;
};

struct interface {
  unsigned int interface_type;
  unsigned long int interface_instance;
  unsigned long int parameter_offset;
  unsigned long int software_reg_offset;
  unsigned long int software_reg_size;
  struct parameter parameters[MAX_PARAMETER_LENGTH];
};

int UC1394_init(void);
struct interface UC1394_get_interface(unsigned long int, unsigned long int);
int UC1394_set_IO_PIN_state(struct interface inst, unsigned long int value);
int UC1394_close(void);
int UC1394_init_STREAMING(struct interface, unsigned long int);
int UC1394_start_STREAMING(struct interface, unsigned int *, unsigned long int);
int UC1394_stop_STREAMING(struct interface);
int UC1394_set_STREAMING_ACK(struct interface);
int UC1394_EXTERNAL_notifier();

#define UCBASE 0xFFFFF0000000

// the following are all offsets to the UCBASE
#define UC_FIRST_QUADLET      0x0400
#define UC_BUS_BASE           0x0404
#define UC_ROOT_BASE          0x0414

#define UC_MAGIC_NUMBER       0x42535030

#define DESCRIPTOR_OFFSET     0x81 // General descriptor for entries that are pointers
#define MODEL                 0x17 // General descriptor for model 

#define ENTRY_TYPE_MASK       0xFF000000
#define ENTRY_MASK_SHIFT_SIZE 24

// the following are Root directory entry types
#define VENDOR                0x03
#define HARDWARE_VERSION      0x04
#define CAPABILITIES          0x0C
#define INSTANCE_DIRECTORY    0xD8
#define UNIT_DIRECTORY_OFFSET 0xD1

// the following are Unit directory entry types
#define SPECIFIER             0x12
#define VERSION               0x13
#define REVISION              0x21
#define CSR_OFFSET            0x54

// the following are parameter types
#define VALUE_ONLY            0x0000
#define SIMPLE_RANGE          0x0001
#define RANGE                 0x0002
#define ENUMERATION           0x0003
#define FRACTION              0x0004
#define STRING                0x0005

// Parameter id types

// device Paramter ids
#define DEV_ID                0x0000
#define PARTNER_ID            0x0001
#define FPGA_VERSION          0x0002
#define FPGA_REVISION         0x0003

// streaming Parameter ids
#define STR_ID                0x0000
#define STR_DIR               0x0001
#define STR_WIDTH             0x0002
#define STR_ENDIAN            0x0003
#define STR_CLKM              0x0004
#define STR_CLKDIV            0x0005
#define STR_MASTER            0x0006
#define STR_IFTYPE            0x0007
#define STR_XFERTYPE          0x0008
#define STR_AUTO              0x0009
#define STR_SUSP              0x000A
#define STR_SUSP_STOP         0x000B
#define STR_SUSP_START        0x000C
#define STR_PKTSIZE           0x000D
#define STR_FRMSIZE           0x000E
#define STR_FRMSYNC           0x000F
#define STR_LINESIZE          0x0010
#define STR_LINESYNC          0x0011
#define STR_BLKSIZE           0x0012
#define STR_PARTNER_DEV       0x0013
#define STR_PARTNER_INST      0x0014

// streaming port Endianess
#define BIG_END               0x0000
#define BIT_SWAP              0x0001
#define BYTE_SWAP             0x0002
#define LITTLE_END            0x0003

// io pin Parameter ids
#define IO_DIR                0x0000
#define IO_OTYPE              0x0001
#define IO_STATE              0x0002
#define IO_CONNECT            0x0003
#define IO_PARTNER_DEV        0x0004
#define IO_PARTNER_INST       0x0005

// uart Parameter ids
#define UART_BAUD             0x0000
#define UART_HANDSHAKE        0x0001
#define UART_CONNECT          0x0002
#define UART_PARTNER_DEV      0x0003
#define UART_PARTNER_INST     0x0004

// for parameter flags see 6.4 parameter flags page 15 of vcp_1.3.doc

// software register offsets
#define SOFT_DEV_ID           0x2000
#define SOFT_PARTNER_ID       0x2004
#define SOFT_CFG_CTL          0x2008
#define SOFT_STR_CTL          0x200C
#define SOFT_STR_ID           0x2010
#define SOFT_PER0             0x2014
#define SOFT_PER1             0x2018
#define SOFT_PER2             0x201C
#define SOFT_PER3             0x2020
#define SOFT_PER4             0x2024
#define SOFT_PER5             0x2028
#define SOFT_PER6             0x202C
#define SOFT_PER7             0x2030
#define SOFT_PER8             0x2034
#define SOFT_PER9             0x2038
#define SOFT_PER10            0x203C
#define SOFT_PER11            0x2040
#define SOFT_PER12            0x2044
#define SOFT_PER13            0x2048
#define SOFT_PER14            0x204C
#define SOFT_PER15            0x2050
#define SOFT_PER16            0x2054
#define SOFT_PER17            0x2058
#define SOFT_PER18            0x205C
#define SOFT_PER19            0x2060
#define SOFT_PER20            0x2064
#define SOFT_PER21            0x2068
#define SOFT_UART_FIFO        0x206C


