summaryrefslogtreecommitdiff
path: root/src/hal/drivers/motenc.h
blob: 922a2d14a91b5660429f18eb212cbd7be1225116 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/******************************************************************************
 *
 * Copyright (C) 2005 Peter G. Vavaroutsos <pete AT vavaroutsos DOT com>
 *
 *
 * Hardware register defines for Vital Systems MOTENC-100 board.
 * The board includes an 8 channel quadrature decoder, 8 analog inputs,
 * 8 analog outputs, 68 digital inputs, 32 digital outputs, programable
 * timer interrupts, a watch dog timer, and a hardware E-STOP circuit.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of version 2 of the GNU General
 * Public License as published by the Free Software Foundation.
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111 USA
 *
 * THE AUTHORS OF THIS LIBRARY ACCEPT ABSOLUTELY NO LIABILITY FOR
 * ANY HARM OR LOSS RESULTING FROM ITS USE.  IT IS _EXTREMELY_ UNWISE
 * TO RELY ON SOFTWARE ALONE FOR SAFETY.  Any machinery capable of
 * harming persons must have provisions for completely removing power
 * from all motors, etc, before persons enter any danger area.  All
 * machinery must be designed to comply with local and national safety
 * codes, and the authors of this software can not, and do not, take
 * any responsibility for such compliance.
 *
 * This code was written as part of the EMC HAL project.  For more
 * information, go to www.linuxcnc.org.
 *
 ******************************************************************************/

#ifndef _MOTENC_H_
#define _MOTENC_H_


#include "hal.h"


// Vendor and device ID.
#define MOTENC_VENDOR_ID		0x10B5	// PLX.
#define MOTENC_DEVICE_ID		0x3001	// MOTENC-100.
#define MOTENC_SUB_SYS_VENDOR_ID	0x10B5	// PLX.
#define MOTENC_SUB_SYS_DEVICE_ID	0x9030	// 9030 SMARTarget I/O Accelerator.

#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;

// For use with digitalIo reg.
#define MOTENC_DIGITAL_OUT		0x0000FFFF
#define MOTENC_DIGITAL_OUT_SHFT		0
#define MOTENC_DIGITAL_IN		0xFFFF0000
#define MOTENC_DIGITAL_IN_SHFT		16

// For use with statusControl reg.
#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	// FPGA 0.
#define MOTENC_STATUS_BOARD_ID_SHFT	16
#define MOTENC_STATUS_ADC_DONE		0x00040000
#define MOTENC_STATUS_ESTOP		0x00080000
#define MOTENC_STATUS_DIGITAL_IN2	0x000F0000	// FPGA 1.
#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;

// For use with watchdogControl reg.
#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	// Reset by DAC writes.

// For use with watchdogReset reg.
#define MOTENC_WATCHDOG_RESET_VALUE	0x0000005A

// For use with dac reg.
#define MOTENC_DAC_COUNT_ZERO		0x00001000	// 0 volts.
#define MOTENC_DAC_VOLTS_MIN		-10.0		// For converting volts to counts.
#define MOTENC_DAC_VOLTS_MAX		10.0
#define MOTENC_DAC_SCALE_MULTIPLY	-8191.0		// Higher counts are lower voltage.
#define MOTENC_DAC_SCALE_DIVIDE		(MOTENC_DAC_VOLTS_MAX - MOTENC_DAC_VOLTS_MIN)

// For use with adcDataCommand reg.
#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		// For converting counts to volts.
#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