#ifndef _MOTENC_H_
#define _MOTENC_H_
#include "hal.h"
#define MOTENC_VENDOR_ID 0x10B5
#define MOTENC_DEVICE_ID 0x3001
#define MOTENC_SUB_SYS_VENDOR_ID 0x10B5
#define MOTENC_SUB_SYS_DEVICE_ID 0x9030
#define MOTENC_PCI_MEM_LEN 512
#define MOTENC_NUM_ADC_CHANNELS 8
#define MOTENC_NUM_DAC_CHANNELS 8
#define MOTENC_FPGA_NUM_ENCODER_CHANNELS 4
#define MOTENC_FPGA_NUM_DIGITAL_INPUTS 36
#define MOTENC_FPGA_NUM_DIGITAL_OUTPUTS 16
#define MOTENC_NUM_FPGA 2
#define MOTENC_NUM_ENCODER_CHANNELS (MOTENC_NUM_FPGA * MOTENC_FPGA_NUM_ENCODER_CHANNELS)
#define MOTENC_NUM_DIGITAL_INPUTS (MOTENC_NUM_FPGA * MOTENC_FPGA_NUM_DIGITAL_INPUTS - 4)
#define MOTENC_NUM_DIGITAL_OUTPUTS (MOTENC_NUM_FPGA * MOTENC_FPGA_NUM_DIGITAL_OUTPUTS)
typedef struct {
hal_s32_t encoderCount[MOTENC_FPGA_NUM_ENCODER_CHANNELS];
hal_u32_t digitalIo;
hal_u32_t statusControl;
hal_u32_t reserved;
hal_u32_t boardVersion;
} volatile MotencFpgaRegMap;
#define MOTENC_DIGITAL_OUT 0x0000FFFF
#define MOTENC_DIGITAL_OUT_SHFT 0
#define MOTENC_DIGITAL_IN 0xFFFF0000
#define MOTENC_DIGITAL_IN_SHFT 16
#define MOTENC_CONTROL_ENCODER_RESET 0x0000000F
#define MOTENC_CONTROL_ENCODER_RESET_SHFT 0
#define MOTENC_STATUS_DIGITAL_IN 0x0000FFFF
#define MOTENC_STATUS_DIGITAL_IN_SHFT 0
#define MOTENC_STATUS_BOARD_ID 0x00030000
#define MOTENC_STATUS_BOARD_ID_SHFT 16
#define MOTENC_STATUS_ADC_DONE 0x00040000
#define MOTENC_STATUS_ESTOP 0x00080000
#define MOTENC_STATUS_DIGITAL_IN2 0x000F0000
#define MOTENC_STATUS_DIGITAL_IN2_SHFT 16
#define MOTENC_STATUS_INDEX 0x00F00000
#define MOTENC_STATUS_INDEX_SHFT 20
#define MOTENC_STATUS_INDEX_LATCH 0x0F000000
#define MOTENC_STATUS_INDEX_LATCH_SHFT 24
typedef struct {
MotencFpgaRegMap fpga[MOTENC_NUM_FPGA];
hal_u32_t timerCompare;
hal_u32_t timerIrqDisable;
hal_u32_t timerIrqEnable;
hal_u32_t watchdogControl;
hal_u32_t watchdogReset;
hal_u32_t reserved1[3];
hal_u32_t dac[MOTENC_NUM_DAC_CHANNELS];
hal_u32_t adcDataCommand;
hal_u32_t reserved2[7];
hal_u32_t adcStartConversion;
} volatile MotencRegMap;
#define MOTENC_WATCHDOG_CTL_TIMEBASE 0x00000001
#define MOTENC_WATCHDOG_CTL_8MS 0x00000000
#define MOTENC_WATCHDOG_CTL_16MS 0x00000001
#define MOTENC_WATCHDOG_CTL_ENABLE 0x00000004
#define MOTENC_WATCHDOG_CTL_AUTO_RESET 0x00000010
#define MOTENC_WATCHDOG_RESET_VALUE 0x0000005A
#define MOTENC_DAC_COUNT_ZERO 0x00001000
#define MOTENC_DAC_VOLTS_MIN -10.0
#define MOTENC_DAC_VOLTS_MAX 10.0
#define MOTENC_DAC_SCALE_MULTIPLY -8191.0
#define MOTENC_DAC_SCALE_DIVIDE (MOTENC_DAC_VOLTS_MAX - MOTENC_DAC_VOLTS_MIN)
#define MOTENC_ADC_COMMAND_CHN_0 0
#define MOTENC_ADC_COMMAND_CHN_0_1 1
#define MOTENC_ADC_COMMAND_CHN_0_1_2 2
#define MOTENC_ADC_COMMAND_CHN_0_1_2_3 3
#define MOTENC_ADC_COMMAND_CHN_4 4
#define MOTENC_ADC_COMMAND_CHN_4_5 5
#define MOTENC_ADC_COMMAND_CHN_4_5_6 6
#define MOTENC_ADC_COMMAND_CHN_4_5_6_7 7
#define MOTENC_ADC_COMMAND_POWER_DOWN 8
#define MOTENC_ADC_SIGN_BIT 0x00002000
#define MOTENC_ADC_SIGN_EXTEND 0xFFFFC000
#define MOTENC_ADC_VOLTS_MIN -5.0
#define MOTENC_ADC_VOLTS_MAX 5.0
#define MOTENC_ADC_SCALE_MULTIPLY (MOTENC_ADC_VOLTS_MAX - MOTENC_ADC_VOLTS_MIN)
#define MOTENC_ADC_SCALE_DIVIDE 16384.0
#endif