AM64x MCU+ SDK  08.06.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 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 #include <drivers/pruicss.h>
45 #include <motor_control/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 
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  uint16_t rx_div;
105  uint16_t tx_div;
106  uint16_t rx_en_cnt;
107  uint16_t rx_div_attr;
108 };
109 
110 struct flags
111 {
112  uint32_t info1 : 1;
113  uint32_t info2 : 1;
114 };
115 
116 struct id
117 {
118  uint32_t ascii;
119  uint32_t binary;
120 };
121 
122 struct sn
123 {
124  uint32_t ascii_msb;
125  uint32_t binary;
126  uint32_t ascii_lsb;
127 };
128 
129 enum { linear, rotary };
130 
132 { int32_t pruicss_slicex;
133  int32_t load_share;
134  int32_t pos_res;
136  int32_t multi_turn_res;
137  int32_t step;
144  struct flags flags;
145  struct id id;
146  struct sn sn;
147  uint32_t cmd_set_2_2;
148  int32_t type;
149  int32_t raw_data;
150  int32_t channel;
151  uint16_t rx_en_cnt;
152  struct endat_pruss_xchg *pruss_xchg;
153  int32_t has_safety;
154  void *pruss_cfg;
155 };
156 
158 {
159  /*
160  * uint8_t is ideal for address, but as scanf(%x) is done,
161  * there could be side effects as other fields may get corrupted,
162  * though it is not much of an issue as address is ensured to be
163  * less than 0xff. But to be on safer side keep it unsigned,
164  * same applies to block also
165  */
166  uint32_t address;
167  uint32_t data;
168  uint32_t block;
170  uint32_t frequency;
171 };
172 
174 {
175  /* position */
176  uint64_t recvd1;
177  /* addinfo 1/2 */
178  uint32_t recvd2;
179  /* addinfo 1 */
180  uint32_t recvd3;
181 };
182 
184 {
185  uint64_t position;
186  uint64_t revolution;
187  uint8_t f1;
188  uint8_t f2;
189  uint8_t crc;
190 };
191 
193 {
194  uint32_t addinfo;
195  uint8_t crc;
196 };
197 
199 {
200  struct endat_position position;
201  struct endat_addinfo addinfo1, addinfo2;
202 };
203 
205 {
206  uint8_t address;
207  uint16_t params;
208  uint8_t crc;
209 };
210 
212 {
213  uint64_t value;
214  uint8_t f1;
215  uint8_t crc;
216 };
217 
219 {
222  struct endat_test_values test;
223 };
224 
225 #define VALID_2_1_CMD(x) (((x) == 1) || ((x) == 2) || ((x) == 3) || ((x) == 4) || ((x) == 5) || ((x) == 6) || ((x) == 7) )
226 #define VALID_2_2_CMD(x) (((x) == 8) || ((x) == 9) || ((x) == 10) || ((x) == 11) || ((x) == 12) || ((x) == 13) || ((x) == 14))
227 
228 #define ENDAT_NUM_ADDITIONAL_INFO_DUMMY_BIT 1
229 #define ENDAT_NUM_BYTES_ADDITIONAL_INFO 3
230 
231 #define ENDAT_STATUS_WARN_SHIFT 7
232 #define ENDAT_STATUS_RM_SHIFT 6
233 #define ENDAT_STATUS_BUSY_SHIFT 5
234 #define ENDAT_STATUS_WARN_MASK (1 << ENDAT_STATUS_WARN_SHIFT)
235 #define ENDAT_STATUS_RM_MASK (1 << ENDAT_STATUS_RM_SHIFT)
236 #define ENDAT_STATUS_BUSY_MASK (1 << ENDAT_STATUS_BUSY_SHIFT)
237 #define ENDAT_INFORMATION_MASK 0x1f
238 
239 #define ENDAT_21_F1_SHIFT 31
240 #define ENDAT_21_F1_MASK (1 << ENDAT_21_F1_SHIFT)
241 #define ENDAT_22_F1_SHIFT ENDAT_21_F1_SHIFT
242 #define ENDAT_22_F1_MASK (1 << ENDAT_22_F1_SHIFT)
243 #define ENDAT_F2_SHIFT 30
244 #define ENDAT_F2_MASK (1 << ENDAT_F2_SHIFT)
245 
246 #define ENDAT_ADDITIONAL_INFO_RX_BITS 30
247 
248 #define ENDAT_SECTION2_MEMORY 0xBF
249 
250 #define ENDAT_NUM_BITS_VALID_PAGE0_WORD13 6
251 
252 #define ENDAT_NUM_BITS_VALID_PAGE1_WORD1 16
253 
254 #define ENDAT_MRS_SHIFT_C7_C4 (4)
255 #define ENDAT_MRS_VAL_C7_C4_SELECT_ADDITIONAL_INFO1 (0x4)
256 #define ENDAT_MRS_VAL_C7_C4_SELECT_ADDITIONAL_INFO2 (0x5)
257 #define ENDAT_MRS_MASK_SELECT_ADDITIONAL_INFO (0xF << ENDAT_MRS_SHIFT_C7_C4)
258 #define ENDAT_MRS_VAL_STOP_ADDITIONAL_INFO (0xF)
259 #define ENDAT_MRS_MASK_STOP_ADDITIONAL_INFO (ENDAT_MRS_VAL_STOP_ADDITIONAL_INFO)
260 
261 #define ENDAT_GET_POS_MULTI_TURN(pos, priv) (((pos) & (((unsigned long long) 1 << (priv)->pos_res) - 1)) >> (priv)->single_turn_res)
262 #define ENDAT_GET_POS_SINGLE_TURN(pos, priv) ((pos) & (((unsigned long long) 1 << (priv)->single_turn_res) - 1))
263 
264 #include "endat_api.h"
265 
266 #ifdef __cplusplus
267 }
268 #endif
269 
270 #endif
cmd_supplement::block
uint32_t block
Definition: endat_drv.h:168
cmd_supplement::address
uint32_t address
Definition: endat_drv.h:166
id::binary
uint32_t binary
Definition: endat_drv.h:119
endat_position
Definition: endat_drv.h:184
endat_position::crc
uint8_t crc
Definition: endat_drv.h:189
endat_clk_cfg::tx_div
uint16_t tx_div
Definition: endat_drv.h:105
rotary
@ rotary
Definition: endat_drv.h:129
endat_addinfo::crc
uint8_t crc
Definition: endat_drv.h:195
endat_priv::rx_en_cnt
uint16_t rx_en_cnt
Definition: endat_drv.h:151
endat_position_addinfo::addinfo2
struct endat_addinfo addinfo1 addinfo2
Definition: endat_drv.h:201
endat_priv::multi_turn_res
int32_t multi_turn_res
Definition: endat_drv.h:136
endat_test_values
Definition: endat_drv.h:212
endat_data::recvd3
uint32_t recvd3
Definition: endat_drv.h:180
endat_addr_params::crc
uint8_t crc
Definition: endat_drv.h:208
endat_clk_cfg::rx_div
uint16_t rx_div
Definition: endat_drv.h:104
endat_priv::pos_rx_bits_21_TXPRU
uint32_t pos_rx_bits_21_TXPRU
Definition: endat_drv.h:140
endat_priv::pos_rx_bits_22_TXPRU
uint32_t pos_rx_bits_22_TXPRU
Definition: endat_drv.h:143
endat_addr_params::params
uint16_t params
Definition: endat_drv.h:207
pruicss.h
cmd_supplement::frequency
uint32_t frequency
Definition: endat_drv.h:170
endat_clk_cfg::rx_div_attr
uint16_t rx_div_attr
Definition: endat_drv.h:107
endat_priv
Definition: endat_drv.h:132
endat_priv::pos_rx_bits_22_PRU
uint32_t pos_rx_bits_22_PRU
Definition: endat_drv.h:142
flags::info2
uint32_t info2
Definition: endat_drv.h:113
endat_position::f1
uint8_t f1
Definition: endat_drv.h:187
endat_priv::channel
int32_t channel
Definition: endat_drv.h:150
sn::ascii_lsb
uint32_t ascii_lsb
Definition: endat_drv.h:126
cmd_supplement::data
uint32_t data
Definition: endat_drv.h:167
id::ascii
uint32_t ascii
Definition: endat_drv.h:118
endat_priv::pruicss_slicex
int32_t pruicss_slicex
Definition: endat_drv.h:132
endat_format_data
Definition: endat_drv.h:219
endat_position::position
uint64_t position
Definition: endat_drv.h:185
endat_position::f2
uint8_t f2
Definition: endat_drv.h:188
endat_priv::pruss_xchg
struct endat_pruss_xchg * pruss_xchg
Definition: endat_drv.h:152
id
Definition: endat_drv.h:117
endat_clk_cfg
Definition: endat_drv.h:103
endat_data::recvd2
uint32_t recvd2
Definition: endat_drv.h:178
endat_position_addinfo::position
struct endat_position position
Definition: endat_drv.h:200
endat_data
Definition: endat_drv.h:174
cmd_supplement::has_block_address
uint8_t has_block_address
Definition: endat_drv.h:169
endat_priv::cmd_set_2_2
uint32_t cmd_set_2_2
Definition: endat_drv.h:147
endat_priv::single_turn_res
int32_t single_turn_res
Definition: endat_drv.h:135
endat_priv::pos_rx_bits_21_RTUPRU
uint32_t pos_rx_bits_21_RTUPRU
Definition: endat_drv.h:138
endat_api.h
sn
Definition: endat_drv.h:123
endat_test_values::f1
uint8_t f1
Definition: endat_drv.h:214
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:149
endat_addr_params::address
uint8_t address
Definition: endat_drv.h:206
endat_priv::pos_rx_bits_22_RTUPRU
uint32_t pos_rx_bits_22_RTUPRU
Definition: endat_drv.h:141
endat_test_values::crc
uint8_t crc
Definition: endat_drv.h:215
sn::ascii_msb
uint32_t ascii_msb
Definition: endat_drv.h:124
endat_clk_cfg::rx_en_cnt
uint16_t rx_en_cnt
Definition: endat_drv.h:106
endat_data::recvd1
uint64_t recvd1
Definition: endat_drv.h:176
flags::info1
uint32_t info1
Definition: endat_drv.h:112
endat_priv::type
int32_t type
Definition: endat_drv.h:148
endat_format_data::addr_params
struct endat_addr_params addr_params
Definition: endat_drv.h:221
sn::binary
uint32_t binary
Definition: endat_drv.h:125
endat_priv::pruss_cfg
void * pruss_cfg
Definition: endat_drv.h:154
endat_priv::load_share
int32_t load_share
Definition: endat_drv.h:133
linear
@ linear
Definition: endat_drv.h:129
endat_test_values::value
uint64_t value
Definition: endat_drv.h:213
endat_position::revolution
uint64_t revolution
Definition: endat_drv.h:186
endat_priv::step
int32_t step
Definition: endat_drv.h:137
endat_addinfo
Definition: endat_drv.h:193
endat_addinfo::addinfo
uint32_t addinfo
Definition: endat_drv.h:194
endat_addr_params
Definition: endat_drv.h:205
cmd_supplement
Definition: endat_drv.h:158
flags
Definition: endat_drv.h:111
endat_format_data::test
struct endat_test_values test
Definition: endat_drv.h:222
endat_format_data::position_addinfo
struct endat_position_addinfo position_addinfo
Definition: endat_drv.h:220
endat_priv::pos_rx_bits_21_PRU
uint32_t pos_rx_bits_21_PRU
Definition: endat_drv.h:139
endat_priv::pos_res
int32_t pos_res
Definition: endat_drv.h:134
endat_position_addinfo
Definition: endat_drv.h:199