AM243x Motor Control SDK  09.01.00
endat_drv.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2021-23 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 EXPRESS 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 #include <drivers/pruicss.h>
45 #include <position_sense/endat/include/endat_interface.h>
46 #define ENDAT_MODE_SINGLE_CHANNEL_SINGLE_PRU (0U)
47 #define ENDAT_MODE_MULTI_CHANNEL_SINGLE_PRU (1U)
48 #define ENDAT_MODE_MULTI_CHANNEL_MULTI_PRU (2U)
49 #define HWREG(x) \
50  (*((volatile uint32_t *)(x)))
51 #define HWREGB(x) \
52  (*((volatile uint8_t *)(x)))
53 #define HWREGH(x) \
54  (*((volatile uint16_t *)(x)))
55 
56 
57 /*12 words */
58 #define MRS_CODE_PARAM_ENCODER_MANUFACTURER_PAGE0 0xA1
59 /*16 words */
60 #define MRS_CODE_PARAM_ENCODER_MANUFACTURER_PAGE1 0xA3
61 /*16 words*/
62 #define MRS_CODE_PARAM_ENCODER_MANUFACTURER_PAGE2 0xA5
63 
64 /* Adjust 1-bit as we transmit early */
65 #define ENDAT_TX_30BITS (30 + 1)
66 /*Adjust 1-bit as we transmit early */
67 #define ENDAT_TX_6BITS (6 + 1)
68 #define ENDAT_RX_29BITS 29
69 /* For EnDat 2.1: encoder to send test values */
70 #define ENDAT_RX_46BITS 46
71 
72 #define APP_ENDAT_WORD_0 0
73 #define APP_ENDAT_WORD_1 1
74 #define APP_ENDAT_WORD_2 2
75 #define APP_ENDAT_WORD_3 3
76 #define APP_ENDAT_WORD_4 4
77 #define APP_ENDAT_WORD_5 5
78 #define APP_ENDAT_WORD_6 6
79 #define APP_ENDAT_WORD_7 7
80 #define APP_ENDAT_WORD_8 8
81 #define APP_ENDAT_WORD_9 9
82 #define APP_ENDAT_WORD_10 10
83 #define APP_ENDAT_WORD_11 11
84 #define APP_ENDAT_WORD_12 12
85 #define APP_ENDAT_WORD_13 13
86 #define APP_ENDAT_WORD_14 14
87 #define APP_ENDAT_WORD_15 15
88 #define APP_ENDAT_WORD_16 16
89 #define APP_ENDAT_WORD_17 17
90 #define APP_ENDAT_WORD_18 18
91 #define APP_ENDAT_WORD_19 19
92 
93 #define ENDAT_NUM_BITS_POSITION_CRC 5
94 #define ENDAT_NUM_BITS_F1 1
95 #define ENDAT_NUM_BITS_F2 1
96 #define ENDAT_NUM_BITS_PARAMETER 16
97 #define ENDAT_NUM_BITS_ADDRESS 8
98 
99 #define EINVAL 1
100 
102 {
103  uint16_t rx_div;
104  uint16_t tx_div;
105  uint16_t rx_en_cnt;
106  uint16_t rx_div_attr;
107 };
108 
109 struct flags
110 {
111  uint32_t info1 : 1;
112  uint32_t info2 : 1;
113 };
114 
115 struct id
116 {
117  uint32_t ascii;
118  uint32_t binary;
119 };
120 
121 struct sn
122 {
123  uint32_t ascii_msb;
124  uint32_t binary;
125  uint32_t ascii_lsb;
126 };
127 
128 enum { linear, rotary };
129 
131 { int32_t pruicss_slicex;
132  int32_t load_share;
133  int32_t pos_res;
135  int32_t multi_turn_res;
136  int32_t step;
143  struct flags flags;
144  struct id id;
145  struct sn sn;
146  uint32_t cmd_set_2_2;
147  int32_t type;
148  int32_t raw_data;
149  int32_t channel;
150  uint16_t rx_en_cnt;
151  struct endat_pruss_xchg *pruss_xchg;
153  int32_t has_safety;
154  void *pruss_cfg;
155  void *pruss_iep;
156  uint64_t cmp3;
157  uint64_t cmp5;
158  uint64_t cmp6;
159 
160 };
161 
163 {
164  /*
165  * uint8_t is ideal for address, but as scanf(%x) is done,
166  * there could be side effects as other fields may get corrupted,
167  * though it is not much of an issue as address is ensured to be
168  * less than 0xff. But to be on safer side keep it unsigned,
169  * same applies to block also
170  */
171  uint32_t address;
172  uint32_t data;
173  uint32_t block;
175  uint32_t frequency;
176  uint64_t cmp3;
177  uint64_t cmp5;
178  uint64_t cmp6;
179 };
180 
182 {
183  /* position */
184  uint64_t recvd1;
185  /* addinfo 1/2 */
186  uint32_t recvd2;
187  /* addinfo 1 */
188  uint32_t recvd3;
189 };
190 
192 {
193  uint64_t position;
194  uint64_t revolution;
195  uint8_t f1;
196  uint8_t f2;
197  uint8_t crc;
198 };
199 
201 {
202  uint32_t addinfo;
203  uint8_t crc;
204 };
205 
207 {
208  struct endat_position position;
209  struct endat_addinfo addinfo1, addinfo2;
210 };
211 
213 {
214  uint8_t address;
215  uint16_t params;
216  uint8_t crc;
217 };
218 
220 {
221  uint64_t value;
222  uint8_t f1;
223  uint8_t crc;
224 };
225 
227 {
230  struct endat_test_values test;
231 };
232 
233 #define VALID_2_1_CMD(x) (((x) == 1) || ((x) == 2) || ((x) == 3) || ((x) == 4) || ((x) == 5) || ((x) == 6) || ((x) == 7) )
234 #define VALID_2_2_CMD(x) (((x) == 8) || ((x) == 9) || ((x) == 10) || ((x) == 11) || ((x) == 12) || ((x) == 13) || ((x) == 14))
235 
236 #define ENDAT_NUM_ADDITIONAL_INFO_DUMMY_BIT 1
237 #define ENDAT_NUM_BYTES_ADDITIONAL_INFO 3
238 
239 #define ENDAT_STATUS_WARN_SHIFT 7
240 #define ENDAT_STATUS_RM_SHIFT 6
241 #define ENDAT_STATUS_BUSY_SHIFT 5
242 #define ENDAT_STATUS_WARN_MASK (1 << ENDAT_STATUS_WARN_SHIFT)
243 #define ENDAT_STATUS_RM_MASK (1 << ENDAT_STATUS_RM_SHIFT)
244 #define ENDAT_STATUS_BUSY_MASK (1 << ENDAT_STATUS_BUSY_SHIFT)
245 #define ENDAT_INFORMATION_MASK 0x1f
246 
247 #define ENDAT_21_F1_SHIFT 31
248 #define ENDAT_21_F1_MASK (1 << ENDAT_21_F1_SHIFT)
249 #define ENDAT_22_F1_SHIFT ENDAT_21_F1_SHIFT
250 #define ENDAT_22_F1_MASK (1 << ENDAT_22_F1_SHIFT)
251 #define ENDAT_F2_SHIFT 30
252 #define ENDAT_F2_MASK (1 << ENDAT_F2_SHIFT)
253 
254 #define ENDAT_ADDITIONAL_INFO_RX_BITS 30
255 
256 #define ENDAT_SECTION2_MEMORY 0xBF
257 
258 #define ENDAT_NUM_BITS_VALID_PAGE0_WORD13 6
259 
260 #define ENDAT_NUM_BITS_VALID_PAGE1_WORD1 16
261 
262 #define ENDAT_MRS_SHIFT_C7_C4 (4)
263 #define ENDAT_MRS_VAL_C7_C4_SELECT_ADDITIONAL_INFO1 (0x4)
264 #define ENDAT_MRS_VAL_C7_C4_SELECT_ADDITIONAL_INFO2 (0x5)
265 #define ENDAT_MRS_MASK_SELECT_ADDITIONAL_INFO (0xF << ENDAT_MRS_SHIFT_C7_C4)
266 #define ENDAT_MRS_VAL_STOP_ADDITIONAL_INFO (0xF)
267 #define ENDAT_MRS_MASK_STOP_ADDITIONAL_INFO (ENDAT_MRS_VAL_STOP_ADDITIONAL_INFO)
268 
269 #define ENDAT_GET_POS_MULTI_TURN(pos, priv) (((pos) & (((unsigned long long) 1 << (priv)->pos_res) - 1)) >> (priv)->single_turn_res)
270 #define ENDAT_GET_POS_SINGLE_TURN(pos, priv) ((pos) & (((unsigned long long) 1 << (priv)->single_turn_res) - 1))
271 
272 #include "endat_api.h"
273 
274 #ifdef __cplusplus
275 }
276 #endif
277 
278 #endif
cmd_supplement::block
uint32_t block
Definition: endat_drv.h:173
cmd_supplement::address
uint32_t address
Definition: endat_drv.h:171
id::binary
uint32_t binary
Definition: endat_drv.h:118
endat_position
Definition: endat_drv.h:192
endat_position::crc
uint8_t crc
Definition: endat_drv.h:197
endat_clk_cfg::tx_div
uint16_t tx_div
Definition: endat_drv.h:104
rotary
@ rotary
Definition: endat_drv.h:128
endat_addinfo::crc
uint8_t crc
Definition: endat_drv.h:203
endat_priv::rx_en_cnt
uint16_t rx_en_cnt
Definition: endat_drv.h:150
endat_position_addinfo::addinfo2
struct endat_addinfo addinfo1 addinfo2
Definition: endat_drv.h:209
endat_priv::multi_turn_res
int32_t multi_turn_res
Definition: endat_drv.h:135
endat_test_values
Definition: endat_drv.h:220
endat_data::recvd3
uint32_t recvd3
Definition: endat_drv.h:188
endat_addr_params::crc
uint8_t crc
Definition: endat_drv.h:216
endat_clk_cfg::rx_div
uint16_t rx_div
Definition: endat_drv.h:103
endat_priv::pos_rx_bits_21_TXPRU
uint32_t pos_rx_bits_21_TXPRU
Definition: endat_drv.h:139
endat_priv::pos_rx_bits_22_TXPRU
uint32_t pos_rx_bits_22_TXPRU
Definition: endat_drv.h:142
endat_addr_params::params
uint16_t params
Definition: endat_drv.h:215
cmd_supplement::frequency
uint32_t frequency
Definition: endat_drv.h:175
endat_priv::pruss_iep
void * pruss_iep
Definition: endat_drv.h:155
endat_clk_cfg::rx_div_attr
uint16_t rx_div_attr
Definition: endat_drv.h:106
endat_priv
Definition: endat_drv.h:131
cmd_supplement::cmp5
uint64_t cmp5
Definition: endat_drv.h:177
endat_priv::pos_rx_bits_22_PRU
uint32_t pos_rx_bits_22_PRU
Definition: endat_drv.h:141
flags::info2
uint32_t info2
Definition: endat_drv.h:112
endat_position::f1
uint8_t f1
Definition: endat_drv.h:195
endat_priv::cmp3
uint64_t cmp3
Definition: endat_drv.h:156
endat_priv::channel
int32_t channel
Definition: endat_drv.h:149
sn::ascii_lsb
uint32_t ascii_lsb
Definition: endat_drv.h:125
cmd_supplement::data
uint32_t data
Definition: endat_drv.h:172
id::ascii
uint32_t ascii
Definition: endat_drv.h:117
endat_priv::pruicss_slicex
int32_t pruicss_slicex
Definition: endat_drv.h:131
endat_format_data
Definition: endat_drv.h:227
endat_position::position
uint64_t position
Definition: endat_drv.h:193
endat_position::f2
uint8_t f2
Definition: endat_drv.h:196
endat_priv::pruss_xchg
struct endat_pruss_xchg * pruss_xchg
Definition: endat_drv.h:151
id
Definition: endat_drv.h:116
endat_clk_cfg
Definition: endat_drv.h:102
endat_data::recvd2
uint32_t recvd2
Definition: endat_drv.h:186
endat_position_addinfo::position
struct endat_position position
Definition: endat_drv.h:208
endat_data
Definition: endat_drv.h:182
cmd_supplement::has_block_address
uint8_t has_block_address
Definition: endat_drv.h:174
endat_priv::cmd_set_2_2
uint32_t cmd_set_2_2
Definition: endat_drv.h:146
endat_priv::single_turn_res
int32_t single_turn_res
Definition: endat_drv.h:134
endat_priv::pos_rx_bits_21_RTUPRU
uint32_t pos_rx_bits_21_RTUPRU
Definition: endat_drv.h:137
endat_api.h
sn
Definition: endat_drv.h:122
endat_test_values::f1
uint8_t f1
Definition: endat_drv.h:222
cmd_supplement::cmp6
uint64_t cmp6
Definition: endat_drv.h:178
cmd_supplement::cmp3
uint64_t cmp3
Definition: endat_drv.h:176
endat_priv::has_safety
int32_t has_safety
Definition: endat_drv.h:153
endat_priv::raw_data
int32_t raw_data
Definition: endat_drv.h:148
endat_addr_params::address
uint8_t address
Definition: endat_drv.h:214
endat_priv::pos_rx_bits_22_RTUPRU
uint32_t pos_rx_bits_22_RTUPRU
Definition: endat_drv.h:140
endat_test_values::crc
uint8_t crc
Definition: endat_drv.h:223
sn::ascii_msb
uint32_t ascii_msb
Definition: endat_drv.h:123
endat_clk_cfg::rx_en_cnt
uint16_t rx_en_cnt
Definition: endat_drv.h:105
endat_data::recvd1
uint64_t recvd1
Definition: endat_drv.h:184
flags::info1
uint32_t info1
Definition: endat_drv.h:111
endat_priv::type
int32_t type
Definition: endat_drv.h:147
endat_format_data::addr_params
struct endat_addr_params addr_params
Definition: endat_drv.h:229
sn::binary
uint32_t binary
Definition: endat_drv.h:124
endat_priv::endatChRxInfo
struct endatChRxInfo * endatChRxInfo
Definition: endat_drv.h:152
endat_priv::pruss_cfg
void * pruss_cfg
Definition: endat_drv.h:154
endat_priv::load_share
int32_t load_share
Definition: endat_drv.h:132
linear
@ linear
Definition: endat_drv.h:128
endat_test_values::value
uint64_t value
Definition: endat_drv.h:221
endat_position::revolution
uint64_t revolution
Definition: endat_drv.h:194
endat_priv::step
int32_t step
Definition: endat_drv.h:136
endat_addinfo
Definition: endat_drv.h:201
endat_priv::cmp6
uint64_t cmp6
Definition: endat_drv.h:158
endat_addinfo::addinfo
uint32_t addinfo
Definition: endat_drv.h:202
endat_addr_params
Definition: endat_drv.h:213
cmd_supplement
Definition: endat_drv.h:163
flags
Definition: endat_drv.h:110
endat_format_data::test
struct endat_test_values test
Definition: endat_drv.h:230
endat_format_data::position_addinfo
struct endat_position_addinfo position_addinfo
Definition: endat_drv.h:228
endat_priv::pos_rx_bits_21_PRU
uint32_t pos_rx_bits_21_PRU
Definition: endat_drv.h:138
endat_priv::cmp5
uint64_t cmp5
Definition: endat_drv.h:157
endat_priv::pos_res
int32_t pos_res
Definition: endat_drv.h:133
endat_position_addinfo
Definition: endat_drv.h:207