AM243x Motor Control SDK  09.02.00
tamagawa_drv.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2022 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 #ifndef TAMAGAWA_DRV_H_
34 #define TAMAGAWA_DRV_H_
35 
45 #ifdef __cplusplus
46 extern "C" {
47 #endif
48 
49 /* ========================================================================== */
50 /* Include Files */
51 /* ========================================================================== */
52 
53 #include <stdio.h>
54 #include <string.h>
55 #include <math.h>
56 
57 #include <drivers/pruicss.h>
58 
59 /* ========================================================================== */
60 /* Macros & Typedefs */
61 /* ========================================================================== */
62 
66 #define TAMAGAWA_MULTI_CH0 (1 << 0)
67 
71 #define TAMAGAWA_MULTI_CH1 (1 << 1)
72 
76 #define TAMAGAWA_MULTI_CH2 (1 << 2)
77 
81 #define MAX_CHANNELS (3)
82 
86 #define MAX_EEPROM_ADDRESS (127)
87 
91 #define MAX_EEPROM_WRITE_DATA (255)
92 
93 
97 enum data_id
98 {
109  DATA_ID_NUM
110 };
111 
112 /* ========================================================================== */
113 /* Structure Declarations */
114 /* ========================================================================== */
115 
122 {
123  volatile uint32_t pos_word0;
125  volatile uint32_t pos_word1;
127  volatile uint32_t pos_word2;
129  volatile uint32_t cal_crc;
131 };
132 
139 {
140  volatile uint32_t word0;
142  volatile uint32_t word1;
148 };
149 
156 {
157  volatile uint8_t opmode;
158  volatile uint8_t channel;
162  volatile uint8_t trigger;
164  volatile uint8_t status;
165 };
166 
171 {
172  uint32_t abs;
173  uint32_t abm;
174  uint8_t cf;
175  uint8_t sf;
176  uint8_t enid;
177  uint8_t almc;
178  uint8_t adf;
179  uint8_t edf;
180  uint8_t crc;
181 };
186 {
187  uint8_t ch_mask; //**< Mask for what channel is required*/
188  volatile uint32_t rx_div_factor; //**< Rx Divide factor*/
189 
190  volatile uint32_t tx_div_factor; //**< Tx Divide factor*/
191 
192  volatile uint32_t oversample_rate; //**< Oversampling rate*/
193 
194  uint32_t version;
195  uint8_t data_id;
197  uint8_t tx_frames;
198  uint8_t rx_frames;
199 };
200 
201 struct config
202 {
203  uint8_t ch0;
204  uint8_t ch1;
205  uint8_t ch2;
206 };
207 
212 {
213  volatile uint32_t cmd;
214  volatile uint32_t adf;
215  volatile uint32_t edf;
216  volatile uint32_t crc;
218  volatile uint32_t word0;
219  volatile uint32_t word1;
220  volatile uint32_t word2;
222  uint64_t eeprom_tx_data;
223 };
224 
225 
233 {
234  struct tamagawa_config config;
235  struct tamagawa_cmd cmd;
236  struct tamagawa_ch_info ch[3];
240 };
241 
247 {
248  uint16_t rx_div;
249  uint16_t tx_div;
250  uint16_t rx_en_cnt;
251  uint16_t rx_div_attr;
252 };
253 
254 
260 {
270 };
271 
277 {
278  int32_t channel;
279  uint16_t rx_en_cnt;
281  void *pruss_cfg;
282  int32_t slice_value;
284  void *pruss_iep;
285  uint64_t cmp3;
286  uint64_t cmp0;
287 };
288 
289 /* ========================================================================== */
290 /* Function Declarations */
291 /* ========================================================================== */
292 
304 int32_t tamagawa_command_process(struct tamagawa_priv *priv, int32_t cmd, uint8_t gTamagawa_multi_ch_mask);
305 
317 int32_t tamagawa_command_build(struct tamagawa_priv *priv, int32_t cmd, uint8_t gTamagawa_multi_ch_mask);
318 
326 
334 
335 
343 void tamagawa_config_clock(struct tamagawa_priv *priv, struct tamagawa_clk_cfg *clk_cfg);
344 
352 
360 
368 void tamagawa_config_channel(struct tamagawa_priv *priv, uint32_t ch);
369 
377 void tamagawa_config_multi_channel_mask(struct tamagawa_priv *priv, uint8_t mask);
378 
391 
401 void tamagawa_multi_channel_set_cur(struct tamagawa_priv *priv, uint32_t ch);
402 
403 
404 
418 
428 void tamagawa_update_data_id(struct tamagawa_priv *priv, int32_t cmd);
429 
440 void tamagawa_update_adf(struct tamagawa_priv *priv, uint32_t val, uint32_t ch);
441 
452 void tamagawa_update_edf(struct tamagawa_priv *priv, uint32_t val, uint32_t ch);
453 
454 
463 int32_t tamagawa_parse(int32_t cmd, struct tamagawa_priv *priv);
464 
475 int32_t tamagawa_crc_verify(struct tamagawa_priv *priv);
476 
487 void tamagawa_update_crc(struct tamagawa_priv *priv, int32_t cmd, uint32_t ch);
488 
498 void tamagawa_set_baudrate(struct tamagawa_priv *priv, double baudrate);
499 
509 
520 uint32_t tamagawa_reverse_bits(int8_t data);
521 
533 uint64_t tamagawa_prepare_eeprom_tx_data(uint64_t eeprom_tx_data, volatile uint32_t data);
534 
545 void tamagawa_prepare_eeprom_command(struct tamagawa_priv *priv, int32_t cmd, uint32_t ch);
546 
549 #ifdef __cplusplus
550 }
551 #endif
552 
553 #endif
tamagawa_clk_cfg::tx_div
uint16_t tx_div
Definition: tamagawa_drv.h:249
tamagawa_init
struct tamagawa_priv * tamagawa_init(struct tamagawa_xchg *tamagawa_xchg, void *pruss_cfg, void *pruss_iep, uint32_t slice_value)
Initialize tamagawa firmware interface address and get the pointer to struct tamagawa_priv instance.
tamagawa_priv::cmp3
uint64_t cmp3
Definition: tamagawa_drv.h:285
DATA_ID_0
@ DATA_ID_0
Definition: tamagawa_drv.h:99
tamagawa_priv::rx_en_cnt
uint16_t rx_en_cnt
Definition: tamagawa_drv.h:279
tamagawa_eeprom_interface::edf
volatile uint32_t edf
Definition: tamagawa_drv.h:215
tamagawa_command_send
void tamagawa_command_send(struct tamagawa_priv *priv)
trigger sending the tamagawa command in PRU
tamagawa_config_clock
void tamagawa_config_clock(struct tamagawa_priv *priv, struct tamagawa_clk_cfg *clk_cfg)
configure tamagawa clock
tamagawa_priv::pruss_iep
void * pruss_iep
Definition: tamagawa_drv.h:284
tamagawa_xchg
Structure defining Tamagawa interface.
Definition: tamagawa_drv.h:233
tamagawa_command_build
int32_t tamagawa_command_build(struct tamagawa_priv *priv, int32_t cmd, uint8_t gTamagawa_multi_ch_mask)
setup the tamagawa command in the PRU interface buffer
rx_frames_received::edf
uint8_t edf
Definition: tamagawa_drv.h:179
data_id
data_id
Data ID codes.
Definition: tamagawa_drv.h:98
config
Definition: tamagawa_drv.h:202
rx_frames_received::enid
uint8_t enid
Definition: tamagawa_drv.h:176
tamagawa_multi_channel_detected
uint8_t tamagawa_multi_channel_detected(struct tamagawa_priv *priv)
select channels detected in multi channel configuration by tamagawa master. required to be invoked ...
tamagawa_update_data_id
void tamagawa_update_data_id(struct tamagawa_priv *priv, int32_t cmd)
update the current requested command id in tamagawa interface.
tamagawa_crc_verify
int32_t tamagawa_crc_verify(struct tamagawa_priv *priv)
verify the CRC computed with the encoder crc.
tamagawa_interface::version
uint32_t version
Definition: tamagawa_drv.h:194
tamagawa_interface::oversample_rate
volatile uint32_t oversample_rate
Definition: tamagawa_drv.h:192
tamagawa_ch_info::pos_word0
volatile uint32_t pos_word0
Definition: tamagawa_drv.h:123
tamagawa_interface
Tamagawa Interface.
Definition: tamagawa_drv.h:186
register_offsets::ICSS_CFG_PRUx_ED_RXCFG
int32_t ICSS_CFG_PRUx_ED_RXCFG
Definition: tamagawa_drv.h:268
tamagawa_priv
Used to structures defining the Tamagawa interface, PRU slice and register offsets.
Definition: tamagawa_drv.h:277
tamagawa_eeprom_interface::crc
volatile uint32_t crc
Definition: tamagawa_drv.h:216
rx_frames_received::abm
uint32_t abm
Definition: tamagawa_drv.h:173
tamagawa_config::trigger
volatile uint8_t trigger
Definition: tamagawa_drv.h:162
tamagawa_interface::ch_mask
uint8_t ch_mask
Definition: tamagawa_drv.h:187
rx_frames_received::cf
uint8_t cf
Definition: tamagawa_drv.h:174
tamagawa_cmd::word0
volatile uint32_t word0
Definition: tamagawa_drv.h:140
tamagawa_config_channel
void tamagawa_config_channel(struct tamagawa_priv *priv, uint32_t ch)
select channel to be used by tamagawa master
tamagawa_priv::tamagawa_xchg
struct tamagawa_xchg * tamagawa_xchg
Definition: tamagawa_drv.h:280
tamagawa_xchg::ch
struct tamagawa_ch_info ch[3]
Definition: tamagawa_drv.h:236
DATA_ID_8
@ DATA_ID_8
Definition: tamagawa_drv.h:105
tamagawa_eeprom_interface::word1
volatile uint32_t word1
Definition: tamagawa_drv.h:219
tamagawa_cmd
Structure defining Tamagawa command interface.
Definition: tamagawa_drv.h:139
tamagawa_interface::rx_div_factor
volatile uint32_t rx_div_factor
Definition: tamagawa_drv.h:188
tamagawa_interface::rx_frames
uint8_t rx_frames
Definition: tamagawa_drv.h:198
tamagawa_config
Structure defining Tamagawa configuration interface.
Definition: tamagawa_drv.h:156
tamagawa_command_process
int32_t tamagawa_command_process(struct tamagawa_priv *priv, int32_t cmd, uint8_t gTamagawa_multi_ch_mask)
send the tamagawa command and wait till firmware acknowledges
tamagawa_eeprom_interface::cmd
volatile uint32_t cmd
Definition: tamagawa_drv.h:213
config::ch2
uint8_t ch2
Definition: tamagawa_drv.h:205
tamagawa_set_baudrate
void tamagawa_set_baudrate(struct tamagawa_priv *priv, double baudrate)
Update the values for oversample rate and division factor for Tx and Rx.
DATA_ID_2
@ DATA_ID_2
Definition: tamagawa_drv.h:101
tamagawa_parse
int32_t tamagawa_parse(int32_t cmd, struct tamagawa_priv *priv)
Parse the data in tamagawa interface.
tamagawa_update_adf
void tamagawa_update_adf(struct tamagawa_priv *priv, uint32_t val, uint32_t ch)
update the adf(address of EEPROM) field entered by user for EEPROM command in tamagawa interface.
tamagawa_interface::tx_frames
uint8_t tx_frames
Definition: tamagawa_drv.h:197
DATA_ID_1
@ DATA_ID_1
Definition: tamagawa_drv.h:100
tamagawa_config::opmode
volatile uint8_t opmode
Definition: tamagawa_drv.h:157
tamagawa_eeprom_interface
Tamagawa EEPROM Interface.
Definition: tamagawa_drv.h:212
tamagawa_update_edf
void tamagawa_update_edf(struct tamagawa_priv *priv, uint32_t val, uint32_t ch)
update the edf(data for EEPROM) field entered by user for EEPROM command in tamagawa interface.
tamagawa_clk_cfg::rx_div_attr
uint16_t rx_div_attr
Definition: tamagawa_drv.h:251
rx_frames_received::sf
uint8_t sf
Definition: tamagawa_drv.h:175
DATA_ID_C
@ DATA_ID_C
Definition: tamagawa_drv.h:106
DATA_ID_7
@ DATA_ID_7
Definition: tamagawa_drv.h:104
tamagawa_interface::data_id
uint8_t data_id
Definition: tamagawa_drv.h:195
register_offsets::ICSS_CFG_PRUx_ED_CH1_CFG1
int32_t ICSS_CFG_PRUx_ED_CH1_CFG1
Definition: tamagawa_drv.h:265
tamagawa_eeprom_interface::word2
volatile uint32_t word2
Definition: tamagawa_drv.h:220
tamagawa_xchg::cmd
struct tamagawa_cmd cmd
Definition: tamagawa_drv.h:235
tamagawa_ch_info::pos_word2
volatile uint32_t pos_word2
Definition: tamagawa_drv.h:127
PERIODIC_TRIGGER_CMD
@ PERIODIC_TRIGGER_CMD
Definition: tamagawa_drv.h:108
tamagawa_priv::slice_value
int32_t slice_value
Definition: tamagawa_drv.h:282
config::ch1
uint8_t ch1
Definition: tamagawa_drv.h:204
tamagawa_config_multi_channel_mask
void tamagawa_config_multi_channel_mask(struct tamagawa_priv *priv, uint8_t mask)
select mask of channels to be used in multi channel configuration by tamagawa master
rx_frames_received
Tamagawa Interface Received data.
Definition: tamagawa_drv.h:171
register_offsets::ICSS_CFG_PRUx_ED_CH1_CFG0
int32_t ICSS_CFG_PRUx_ED_CH1_CFG0
Definition: tamagawa_drv.h:262
tamagawa_ch_info::pos_word1
volatile uint32_t pos_word1
Definition: tamagawa_drv.h:125
DATA_ID_D
@ DATA_ID_D
Definition: tamagawa_drv.h:107
config::ch0
uint8_t ch0
Definition: tamagawa_drv.h:203
tamagawa_eeprom_crc_reinit
void tamagawa_eeprom_crc_reinit(struct tamagawa_priv *priv)
Reset the values of the variables used in CRC calculation to 0.
register_offsets::ICSS_CFG_PRUx_ED_CH0_CFG1
int32_t ICSS_CFG_PRUx_ED_CH0_CFG1
Definition: tamagawa_drv.h:264
tamagawa_priv::pruss_cfg
void * pruss_cfg
Definition: tamagawa_drv.h:281
tamagawa_cmd::word1
volatile uint32_t word1
Definition: tamagawa_drv.h:142
rx_frames_received::adf
uint8_t adf
Definition: tamagawa_drv.h:178
DATA_ID_3
@ DATA_ID_3
Definition: tamagawa_drv.h:102
tamagawa_command_wait
void tamagawa_command_wait(struct tamagawa_priv *priv)
wait till PRU finishes tamagawa transaction
register_offsets::ICSS_CFG_PRUx_ED_TXCFG
int32_t ICSS_CFG_PRUx_ED_TXCFG
Definition: tamagawa_drv.h:269
tamagawa_eeprom_interface::adf
volatile uint32_t adf
Definition: tamagawa_drv.h:214
tamagawa_ch_info::cal_crc
volatile uint32_t cal_crc
Definition: tamagawa_drv.h:129
tamagawa_config_host_trigger
void tamagawa_config_host_trigger(struct tamagawa_priv *priv)
configure tamagawa master for host trigger mode
tamagawa_config::status
volatile uint8_t status
Definition: tamagawa_drv.h:164
tamagawa_config::channel
volatile uint8_t channel
Definition: tamagawa_drv.h:158
register_offsets::ICSS_CFG_PRUx_ED_CH2_CFG0
int32_t ICSS_CFG_PRUx_ED_CH2_CFG0
Definition: tamagawa_drv.h:263
tamagawa_clk_cfg
Used to configure the Tamagawa Clock.
Definition: tamagawa_drv.h:247
tamagawa_clk_cfg::rx_div
uint16_t rx_div
Definition: tamagawa_drv.h:248
tamagawa_update_crc
void tamagawa_update_crc(struct tamagawa_priv *priv, int32_t cmd, uint32_t ch)
Pass the values of CF(Control Field), ADF(address of EEPROM) and EDF(data for EEPROM) to the CRC calc...
tamagawa_multi_channel_set_cur
void tamagawa_multi_channel_set_cur(struct tamagawa_priv *priv, uint32_t ch)
In multi channel configuration, select channel before receive processing in multi channel configura...
tamagawa_priv::channel
int32_t channel
Definition: tamagawa_drv.h:278
tamagawa_eeprom_interface::eeprom_tx_data
uint64_t eeprom_tx_data
Definition: tamagawa_drv.h:222
DATA_ID_NUM
@ DATA_ID_NUM
Definition: tamagawa_drv.h:109
tamagawa_prepare_eeprom_tx_data
uint64_t tamagawa_prepare_eeprom_tx_data(uint64_t eeprom_tx_data, volatile uint32_t data)
Add the start and the stop bit to the reversed data.
tamagawa_priv::register_offset_val
struct register_offsets register_offset_val
Definition: tamagawa_drv.h:283
register_offsets
Used to store the register offsets depending on different PRU slices.
Definition: tamagawa_drv.h:260
register_offsets::ICSS_CFG_PRUx_ED_CH0_CFG0
int32_t ICSS_CFG_PRUx_ED_CH0_CFG0
Definition: tamagawa_drv.h:261
rx_frames_received::crc
uint8_t crc
Definition: tamagawa_drv.h:180
tamagawa_clk_cfg::rx_en_cnt
uint16_t rx_en_cnt
Definition: tamagawa_drv.h:250
rx_frames_received::almc
uint8_t almc
Definition: tamagawa_drv.h:177
tamagawa_ch_info
Structure defining tamagawa per channel interface.
Definition: tamagawa_drv.h:122
tamagawa_eeprom_interface::word0
volatile uint32_t word0
Definition: tamagawa_drv.h:218
tamagawa_interface::tx_div_factor
volatile uint32_t tx_div_factor
Definition: tamagawa_drv.h:190
rx_frames_received::abs
uint32_t abs
Definition: tamagawa_drv.h:172
register_offsets::ICSS_CFG_GPCFGx
int32_t ICSS_CFG_GPCFGx
Definition: tamagawa_drv.h:267
tamagawa_reverse_bits
uint32_t tamagawa_reverse_bits(int8_t data)
Reverse the bits of a number.
tamagawa_config_periodic_trigger
void tamagawa_config_periodic_trigger(struct tamagawa_priv *priv)
configure tamagawa master in periodic trigger mode
tamagawa_priv::cmp0
uint64_t cmp0
Definition: tamagawa_drv.h:286
DATA_ID_6
@ DATA_ID_6
Definition: tamagawa_drv.h:103
tamagawa_prepare_eeprom_command
void tamagawa_prepare_eeprom_command(struct tamagawa_priv *priv, int32_t cmd, uint32_t ch)
Prepare the required EEPROM command from the CF(Control Field), ADF(address of EEPROM) and EDF(data f...
register_offsets::ICSS_CFG_PRUx_ED_CH2_CFG1
int32_t ICSS_CFG_PRUx_ED_CH2_CFG1
Definition: tamagawa_drv.h:266