AM243x MCU+ SDK  08.04.00
endat_drv.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2021 Texas Instruments Incorporated
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *
11  * Redistributions in binary form must reproduce the above copyright
12  * notice, this list of conditions and the following disclaimer in the
13  * documentation and/or other materials provided with the
14  * distribution.
15  *
16  * Neither the name of Texas Instruments Incorporated nor the names of
17  * its contributors may be used to endorse or promote products derived
18  * from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  * "AS IS" AND ANY EXPgResS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 
34 #ifndef ENDAT_DRV_H_
35 #define ENDAT_DRV_H_
36 
37 #ifdef __cplusplus
38 extern "C" {
39 #endif
40 
41 #include <stdio.h>
42 #include <string.h>
43 #include <math.h>
44 
45 #include <drivers/pruicss.h>
46 #include <motor_control/position_sense/endat/include/endat_interface.h>
47 
48 #define PRUICSS_PRUx PRUICSS_PRU1
49 
50 #define HWREG(x) \
51  (*((volatile uint32_t *)(x)))
52 #define HWREGB(x) \
53  (*((volatile uint8_t *)(x)))
54 #define HWREGH(x) \
55  (*((volatile uint16_t *)(x)))
56 
57 
58 /*12 words */
59 #define MRS_CODE_PARAM_ENCODER_MANUFACTURER_PAGE0 0xA1
60 /*16 words */
61 #define MRS_CODE_PARAM_ENCODER_MANUFACTURER_PAGE1 0xA3
62 /*16 words*/
63 #define MRS_CODE_PARAM_ENCODER_MANUFACTURER_PAGE2 0xA5
64 
65 /* Adjust 1-bit as we transmit early */
66 #define ENDAT_TX_30BITS (30 + 1)
67 /*Adjust 1-bit as we transmit early */
68 #define ENDAT_TX_6BITS (6 + 1)
69 #define ENDAT_RX_29BITS 29
70 /* For EnDat 2.1: encoder to send test values */
71 #define ENDAT_RX_46BITS 46
72 
73 #define APP_ENDAT_WORD_0 0
74 #define APP_ENDAT_WORD_1 1
75 #define APP_ENDAT_WORD_2 2
76 #define APP_ENDAT_WORD_3 3
77 #define APP_ENDAT_WORD_4 4
78 #define APP_ENDAT_WORD_5 5
79 #define APP_ENDAT_WORD_6 6
80 #define APP_ENDAT_WORD_7 7
81 #define APP_ENDAT_WORD_8 8
82 #define APP_ENDAT_WORD_9 9
83 #define APP_ENDAT_WORD_10 10
84 #define APP_ENDAT_WORD_11 11
85 #define APP_ENDAT_WORD_12 12
86 #define APP_ENDAT_WORD_13 13
87 #define APP_ENDAT_WORD_14 14
88 #define APP_ENDAT_WORD_15 15
89 #define APP_ENDAT_WORD_16 16
90 #define APP_ENDAT_WORD_17 17
91 #define APP_ENDAT_WORD_18 18
92 #define APP_ENDAT_WORD_19 19
93 
94 #define ENDAT_NUM_BITS_POSITION_CRC 5
95 #define ENDAT_NUM_BITS_F1 1
96 #define ENDAT_NUM_BITS_F2 1
97 #define ENDAT_NUM_BITS_PARAMETER 16
98 #define ENDAT_NUM_BITS_ADDRESS 8
99 
100 #define EINVAL 1
101 
103 {
104  unsigned short rx_div;
105  unsigned short tx_div;
106  unsigned short rx_en_cnt;
107  unsigned short rx_div_attr;
108 };
109 
110 struct flags
111 {
112  unsigned info1 : 1;
113  unsigned info2 : 1;
114 };
115 
116 struct id
117 {
118  unsigned ascii;
119  unsigned binary;
120 };
121 
122 struct sn
123 {
124  unsigned ascii_msb;
125  unsigned binary;
126  unsigned ascii_lsb;
127 };
128 
129 enum { linear, rotary };
130 
132 {
133  int pos_res;
136  int step;
137  unsigned pos_rx_bits_21;
138  unsigned pos_rx_bits_22;
139  struct flags flags;
140  struct id id;
141  struct sn sn;
142  unsigned cmd_set_2_2;
143  int type;
144  int raw_data;
145  int channel;
146  unsigned short rx_en_cnt;
147  struct endat_pruss_xchg *pruss_xchg;
149  void *pruss_cfg;
150 };
151 
153 {
154  /*
155  * unsigned char is ideal for address, but as scanf(%x) is done,
156  * there could be side effects as other fields may get corrupted,
157  * though it is not much of an issue as address is ensured to be
158  * less than 0xff. But to be on safer side keep it unsigned,
159  * same applies to block also
160  */
161  unsigned address;
162  unsigned data;
163  unsigned block;
164  unsigned char has_block_address;
165  unsigned frequency;
166 };
167 
169 {
170  /* position */
171  unsigned long long recvd1;
172  /* addinfo 1/2 */
173  unsigned recvd2;
174  /* addinfo 1 */
175  unsigned recvd3;
176 };
177 
179 {
180  unsigned long long position;
181  unsigned long long revolution;
182  unsigned char f1;
183  unsigned char f2;
184  unsigned char crc;
185 };
186 
188 {
189  unsigned addinfo;
190  unsigned char crc;
191 };
192 
194 {
195  struct endat_position position;
196  struct endat_addinfo addinfo1, addinfo2;
197 };
198 
200 {
201  unsigned char address;
202  unsigned short params;
203  unsigned char crc;
204 };
205 
207 {
208  unsigned long long value;
209  unsigned char f1;
210  unsigned char crc;
211 };
212 
214 {
217  struct endat_test_values test;
218 };
219 
220 #define VALID_2_1_CMD(x) (((x) == 1) || ((x) == 2) || ((x) == 3) || ((x) == 4) || ((x) == 5) || ((x) == 6) || ((x) == 7) )
221 #define VALID_2_2_CMD(x) (((x) == 8) || ((x) == 9) || ((x) == 10) || ((x) == 11) || ((x) == 12) || ((x) == 13) || ((x) == 14))
222 
223 #define ENDAT_NUM_ADDITIONAL_INFO_DUMMY_BIT 1
224 #define ENDAT_NUM_BYTES_ADDITIONAL_INFO 3
225 
226 #define ENDAT_STATUS_WARN_SHIFT 7
227 #define ENDAT_STATUS_RM_SHIFT 6
228 #define ENDAT_STATUS_BUSY_SHIFT 5
229 #define ENDAT_STATUS_WARN_MASK (1 << ENDAT_STATUS_WARN_SHIFT)
230 #define ENDAT_STATUS_RM_MASK (1 << ENDAT_STATUS_RM_SHIFT)
231 #define ENDAT_STATUS_BUSY_MASK (1 << ENDAT_STATUS_BUSY_SHIFT)
232 #define ENDAT_INFORMATION_MASK 0x1f
233 
234 #define ENDAT_21_F1_SHIFT 31
235 #define ENDAT_21_F1_MASK (1 << ENDAT_21_F1_SHIFT)
236 #define ENDAT_22_F1_SHIFT ENDAT_21_F1_SHIFT
237 #define ENDAT_22_F1_MASK (1 << ENDAT_22_F1_SHIFT)
238 #define ENDAT_F2_SHIFT 30
239 #define ENDAT_F2_MASK (1 << ENDAT_F2_SHIFT)
240 
241 #define ENDAT_ADDITIONAL_INFO_RX_BITS 30
242 
243 #define ENDAT_SECTION2_MEMORY 0xBF
244 
245 #define ENDAT_NUM_BITS_VALID_PAGE0_WORD13 6
246 
247 #define ENDAT_NUM_BITS_VALID_PAGE1_WORD1 16
248 
249 #define ENDAT_MRS_SHIFT_C7_C4 (4)
250 #define ENDAT_MRS_VAL_C7_C4_SELECT_ADDITIONAL_INFO1 (0x4)
251 #define ENDAT_MRS_VAL_C7_C4_SELECT_ADDITIONAL_INFO2 (0x5)
252 #define ENDAT_MRS_MASK_SELECT_ADDITIONAL_INFO (0xF << ENDAT_MRS_SHIFT_C7_C4)
253 #define ENDAT_MRS_VAL_STOP_ADDITIONAL_INFO (0xF)
254 #define ENDAT_MRS_MASK_STOP_ADDITIONAL_INFO (ENDAT_MRS_VAL_STOP_ADDITIONAL_INFO)
255 
256 #define ENDAT_GET_POS_MULTI_TURN(pos, priv) (((pos) & (((unsigned long long) 1 << (priv)->pos_res) - 1)) >> (priv)->single_turn_res)
257 #define ENDAT_GET_POS_SINGLE_TURN(pos, priv) ((pos) & (((unsigned long long) 1 << (priv)->single_turn_res) - 1))
258 
259 #include "endat_api.h"
260 
261 #ifdef __cplusplus
262 }
263 #endif
264 
265 #endif
cmd_supplement::data
unsigned data
Definition: endat_drv.h:162
endat_position::revolution
unsigned long long revolution
Definition: endat_drv.h:181
endat_position
Definition: endat_drv.h:179
endat_test_values::f1
unsigned char f1
Definition: endat_drv.h:209
endat_addinfo::crc
unsigned char crc
Definition: endat_drv.h:190
rotary
@ rotary
Definition: endat_drv.h:129
id::ascii
unsigned ascii
Definition: endat_drv.h:118
endat_position_addinfo::addinfo2
struct endat_addinfo addinfo1 addinfo2
Definition: endat_drv.h:196
endat_priv::cmd_set_2_2
unsigned cmd_set_2_2
Definition: endat_drv.h:142
flags::info1
unsigned info1
Definition: endat_drv.h:112
endat_addr_params::crc
unsigned char crc
Definition: endat_drv.h:203
endat_test_values
Definition: endat_drv.h:207
endat_data::recvd3
unsigned recvd3
Definition: endat_drv.h:175
endat_data::recvd1
unsigned long long recvd1
Definition: endat_drv.h:171
id::binary
unsigned binary
Definition: endat_drv.h:119
endat_priv::rx_en_cnt
unsigned short rx_en_cnt
Definition: endat_drv.h:146
pruicss.h
cmd_supplement::frequency
unsigned frequency
Definition: endat_drv.h:165
endat_data::recvd2
unsigned recvd2
Definition: endat_drv.h:173
endat_priv::channel
int channel
Definition: endat_drv.h:145
sn::ascii_lsb
unsigned ascii_lsb
Definition: endat_drv.h:126
endat_priv
Definition: endat_drv.h:132
endat_priv::multi_turn_res
int multi_turn_res
Definition: endat_drv.h:135
endat_clk_cfg::rx_en_cnt
unsigned short rx_en_cnt
Definition: endat_drv.h:106
cmd_supplement::address
unsigned address
Definition: endat_drv.h:161
endat_priv::pos_rx_bits_22
unsigned pos_rx_bits_22
Definition: endat_drv.h:138
endat_position::crc
unsigned char crc
Definition: endat_drv.h:184
endat_priv::step
int step
Definition: endat_drv.h:136
endat_test_values::crc
unsigned char crc
Definition: endat_drv.h:210
endat_format_data
Definition: endat_drv.h:214
endat_priv::pos_res
int pos_res
Definition: endat_drv.h:133
sn::ascii_msb
unsigned ascii_msb
Definition: endat_drv.h:124
endat_position::f1
unsigned char f1
Definition: endat_drv.h:182
endat_priv::type
int type
Definition: endat_drv.h:143
endat_priv::pos_rx_bits_21
unsigned pos_rx_bits_21
Definition: endat_drv.h:137
endat_test_values::value
unsigned long long value
Definition: endat_drv.h:208
endat_priv::pruss_xchg
struct endat_pruss_xchg * pruss_xchg
Definition: endat_drv.h:147
id
Definition: endat_drv.h:117
endat_clk_cfg
Definition: endat_drv.h:103
endat_position_addinfo::position
struct endat_position position
Definition: endat_drv.h:195
endat_data
Definition: endat_drv.h:169
cmd_supplement::has_block_address
unsigned char has_block_address
Definition: endat_drv.h:164
endat_position::position
unsigned long long position
Definition: endat_drv.h:180
endat_api.h
sn
Definition: endat_drv.h:123
endat_addr_params::address
unsigned char address
Definition: endat_drv.h:201
endat_position::f2
unsigned char f2
Definition: endat_drv.h:183
endat_clk_cfg::tx_div
unsigned short tx_div
Definition: endat_drv.h:105
flags::info2
unsigned info2
Definition: endat_drv.h:113
endat_priv::raw_data
int raw_data
Definition: endat_drv.h:144
endat_format_data::addr_params
struct endat_addr_params addr_params
Definition: endat_drv.h:216
endat_addinfo::addinfo
unsigned addinfo
Definition: endat_drv.h:189
endat_priv::pruss_cfg
void * pruss_cfg
Definition: endat_drv.h:149
endat_priv::has_safety
int has_safety
Definition: endat_drv.h:148
sn::binary
unsigned binary
Definition: endat_drv.h:125
linear
@ linear
Definition: endat_drv.h:129
endat_clk_cfg::rx_div
unsigned short rx_div
Definition: endat_drv.h:104
endat_priv::single_turn_res
int single_turn_res
Definition: endat_drv.h:134
endat_addinfo
Definition: endat_drv.h:188
endat_addr_params::params
unsigned short params
Definition: endat_drv.h:202
endat_addr_params
Definition: endat_drv.h:200
cmd_supplement
Definition: endat_drv.h:153
flags
Definition: endat_drv.h:111
endat_format_data::test
struct endat_test_values test
Definition: endat_drv.h:217
endat_format_data::position_addinfo
struct endat_position_addinfo position_addinfo
Definition: endat_drv.h:215
endat_clk_cfg::rx_div_attr
unsigned short rx_div_attr
Definition: endat_drv.h:107
cmd_supplement::block
unsigned block
Definition: endat_drv.h:163
endat_position_addinfo
Definition: endat_drv.h:194