AM64x MCU+ SDK  08.06.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 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 #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 {
108  DATA_ID_NUM
109 };
110 
111 /* ========================================================================== */
112 /* Structure Declarations */
113 /* ========================================================================== */
114 
121 {
122  volatile uint32_t pos_word0;
124  volatile uint32_t pos_word1;
126  volatile uint32_t pos_word2;
128  volatile uint32_t cal_crc;
130 };
131 
138 {
139  volatile uint32_t word0;
141  volatile uint32_t word1;
147 };
148 
155 {
156  volatile uint8_t opmode;
157  volatile uint8_t channel;
161  volatile uint8_t trigger;
163  volatile uint8_t status;
164 };
165 
170 {
171  uint32_t abs;
172  uint32_t abm;
173  uint8_t cf;
174  uint8_t sf;
175  uint8_t enid;
176  uint8_t almc;
177  uint8_t adf;
178  uint8_t edf;
179  uint8_t crc;
180 };
185 {
186  uint8_t ch_mask; //**< Mask for what channel is required*/
187  volatile uint32_t rx_div_factor; //**< Rx Divide factor*/
188 
189  volatile uint32_t tx_div_factor; //**< Tx Divide factor*/
190 
191  volatile uint32_t oversample_rate; //**< Oversampling rate*/
192 
193  uint32_t version;
194  uint8_t data_id;
196  uint8_t tx_frames;
197  uint8_t rx_frames;
198 };
199 
200 struct config
201 {
202  uint8_t ch0;
203  uint8_t ch1;
204  uint8_t ch2;
205 };
206 
211 {
212  volatile uint32_t cmd;
213  volatile uint32_t adf;
214  volatile uint32_t edf;
215  volatile uint32_t crc;
217  volatile uint32_t word0;
218  volatile uint32_t word1;
219  volatile uint32_t word2;
221  uint64_t eeprom_tx_data;
222 };
223 
224 
232 {
233  struct tamagawa_config config;
234  struct tamagawa_cmd cmd;
235  struct tamagawa_ch_info ch[3];
239 };
240 
246 {
247  uint16_t rx_div;
248  uint16_t tx_div;
249  uint16_t rx_en_cnt;
250  uint16_t rx_div_attr;
251 };
252 
253 
259 {
269 };
270 
276 {
277  int32_t channel;
278  uint16_t rx_en_cnt;
280  void *pruss_cfg;
281  int32_t slice_value;
283 };
284 
285 /* ========================================================================== */
286 /* Function Declarations */
287 /* ========================================================================== */
288 
300 int32_t tamagawa_command_process(struct tamagawa_priv *priv, int32_t cmd, uint8_t gTamagawa_multi_ch_mask);
301 
313 int32_t tamagawa_command_build(struct tamagawa_priv *priv, int32_t cmd, uint8_t gTamagawa_multi_ch_mask);
314 
322 
330 
331 
339 void tamagawa_config_clock(struct tamagawa_priv *priv, struct tamagawa_clk_cfg *clk_cfg);
340 
348 
356 
364 void tamagawa_config_channel(struct tamagawa_priv *priv, uint32_t ch);
365 
373 void tamagawa_config_multi_channel_mask(struct tamagawa_priv *priv, uint8_t mask);
374 
387 
397 void tamagawa_multi_channel_set_cur(struct tamagawa_priv *priv, uint32_t ch);
398 
399 
400 
413 
423 void tamagawa_update_data_id(struct tamagawa_priv *priv, int32_t cmd);
424 
435 void tamagawa_update_adf(struct tamagawa_priv *priv, uint32_t val, uint32_t ch);
436 
447 void tamagawa_update_edf(struct tamagawa_priv *priv, uint32_t val, uint32_t ch);
448 
449 
458 int32_t tamagawa_parse(int32_t cmd, struct tamagawa_priv *priv);
459 
470 int32_t tamagawa_crc_verify(struct tamagawa_priv *priv);
471 
482 void tamagawa_update_crc(struct tamagawa_priv *priv, int32_t cmd, uint32_t ch);
483 
493 void tamagawa_set_baudrate(struct tamagawa_priv *priv, double baudrate);
494 
504 
515 uint32_t tamagawa_reverse_bits(int8_t data);
516 
528 uint64_t tamagawa_prepare_eeprom_tx_data(uint64_t eeprom_tx_data, volatile uint32_t data);
529 
540 void tamagawa_prepare_eeprom_command(struct tamagawa_priv *priv, int32_t cmd, uint32_t ch);
541 
544 #ifdef __cplusplus
545 }
546 #endif
547 
548 #endif
tamagawa_init
struct tamagawa_priv * tamagawa_init(struct tamagawa_xchg *tamagawa_xchg, void *pruss_cfg, uint32_t slice_value)
Initialize tamagawa firmware interface address and get the pointer to struct tamagawa_priv instance.
tamagawa_clk_cfg::tx_div
uint16_t tx_div
Definition: tamagawa_drv.h:248
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:278
tamagawa_eeprom_interface::edf
volatile uint32_t edf
Definition: tamagawa_drv.h:214
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_xchg
Structure defining Tamagawa interface.
Definition: tamagawa_drv.h:232
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:178
data_id
data_id
Data ID codes.
Definition: tamagawa_drv.h:98
config
Definition: tamagawa_drv.h:201
rx_frames_received::enid
uint8_t enid
Definition: tamagawa_drv.h:175
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:193
pruicss.h
tamagawa_interface::oversample_rate
volatile uint32_t oversample_rate
Definition: tamagawa_drv.h:191
tamagawa_ch_info::pos_word0
volatile uint32_t pos_word0
Definition: tamagawa_drv.h:122
tamagawa_interface
Tamagawa Interface.
Definition: tamagawa_drv.h:185
register_offsets::ICSS_CFG_PRUx_ED_RXCFG
int32_t ICSS_CFG_PRUx_ED_RXCFG
Definition: tamagawa_drv.h:267
tamagawa_priv
Used to structures defining the Tamagawa interface, PRU slice and register offsets.
Definition: tamagawa_drv.h:276
tamagawa_eeprom_interface::crc
volatile uint32_t crc
Definition: tamagawa_drv.h:215
rx_frames_received::abm
uint32_t abm
Definition: tamagawa_drv.h:172
tamagawa_config::trigger
volatile uint8_t trigger
Definition: tamagawa_drv.h:161
tamagawa_interface::ch_mask
uint8_t ch_mask
Definition: tamagawa_drv.h:186
rx_frames_received::cf
uint8_t cf
Definition: tamagawa_drv.h:173
tamagawa_cmd::word0
volatile uint32_t word0
Definition: tamagawa_drv.h:139
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:279
data
uint32_t data
Definition: tisci_rm_psil.h:1
tamagawa_xchg::ch
struct tamagawa_ch_info ch[3]
Definition: tamagawa_drv.h:235
DATA_ID_8
@ DATA_ID_8
Definition: tamagawa_drv.h:105
tamagawa_eeprom_interface::word1
volatile uint32_t word1
Definition: tamagawa_drv.h:218
tamagawa_cmd
Structure defining Tamagawa command interface.
Definition: tamagawa_drv.h:138
tamagawa_interface::rx_div_factor
volatile uint32_t rx_div_factor
Definition: tamagawa_drv.h:187
tamagawa_interface::rx_frames
uint8_t rx_frames
Definition: tamagawa_drv.h:197
tamagawa_config
Structure defining Tamagawa configuration interface.
Definition: tamagawa_drv.h:155
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:212
config::ch2
uint8_t ch2
Definition: tamagawa_drv.h:204
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:196
DATA_ID_1
@ DATA_ID_1
Definition: tamagawa_drv.h:100
tamagawa_config::opmode
volatile uint8_t opmode
Definition: tamagawa_drv.h:156
tamagawa_eeprom_interface
Tamagawa EEPROM Interface.
Definition: tamagawa_drv.h:211
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:250
rx_frames_received::sf
uint8_t sf
Definition: tamagawa_drv.h:174
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:194
register_offsets::ICSS_CFG_PRUx_ED_CH1_CFG1
int32_t ICSS_CFG_PRUx_ED_CH1_CFG1
Definition: tamagawa_drv.h:264
tamagawa_eeprom_interface::word2
volatile uint32_t word2
Definition: tamagawa_drv.h:219
tamagawa_xchg::cmd
struct tamagawa_cmd cmd
Definition: tamagawa_drv.h:234
tamagawa_ch_info::pos_word2
volatile uint32_t pos_word2
Definition: tamagawa_drv.h:126
tamagawa_priv::slice_value
int32_t slice_value
Definition: tamagawa_drv.h:281
config::ch1
uint8_t ch1
Definition: tamagawa_drv.h:203
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:170
register_offsets::ICSS_CFG_PRUx_ED_CH1_CFG0
int32_t ICSS_CFG_PRUx_ED_CH1_CFG0
Definition: tamagawa_drv.h:261
tamagawa_ch_info::pos_word1
volatile uint32_t pos_word1
Definition: tamagawa_drv.h:124
DATA_ID_D
@ DATA_ID_D
Definition: tamagawa_drv.h:107
config::ch0
uint8_t ch0
Definition: tamagawa_drv.h:202
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:263
tamagawa_priv::pruss_cfg
void * pruss_cfg
Definition: tamagawa_drv.h:280
tamagawa_cmd::word1
volatile uint32_t word1
Definition: tamagawa_drv.h:141
rx_frames_received::adf
uint8_t adf
Definition: tamagawa_drv.h:177
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:268
tamagawa_eeprom_interface::adf
volatile uint32_t adf
Definition: tamagawa_drv.h:213
tamagawa_ch_info::cal_crc
volatile uint32_t cal_crc
Definition: tamagawa_drv.h:128
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:163
tamagawa_config::channel
volatile uint8_t channel
Definition: tamagawa_drv.h:157
register_offsets::ICSS_CFG_PRUx_ED_CH2_CFG0
int32_t ICSS_CFG_PRUx_ED_CH2_CFG0
Definition: tamagawa_drv.h:262
tamagawa_clk_cfg
Used to configure the Tamagawa Clock.
Definition: tamagawa_drv.h:246
tamagawa_clk_cfg::rx_div
uint16_t rx_div
Definition: tamagawa_drv.h:247
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:277
tamagawa_eeprom_interface::eeprom_tx_data
uint64_t eeprom_tx_data
Definition: tamagawa_drv.h:221
DATA_ID_NUM
@ DATA_ID_NUM
Definition: tamagawa_drv.h:108
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:282
register_offsets
Used to store the register offsets depending on different PRU slices.
Definition: tamagawa_drv.h:259
register_offsets::ICSS_CFG_PRUx_ED_CH0_CFG0
int32_t ICSS_CFG_PRUx_ED_CH0_CFG0
Definition: tamagawa_drv.h:260
rx_frames_received::crc
uint8_t crc
Definition: tamagawa_drv.h:179
tamagawa_clk_cfg::rx_en_cnt
uint16_t rx_en_cnt
Definition: tamagawa_drv.h:249
rx_frames_received::almc
uint8_t almc
Definition: tamagawa_drv.h:176
tamagawa_ch_info
Structure defining tamagawa per channel interface.
Definition: tamagawa_drv.h:121
tamagawa_eeprom_interface::word0
volatile uint32_t word0
Definition: tamagawa_drv.h:217
tamagawa_interface::tx_div_factor
volatile uint32_t tx_div_factor
Definition: tamagawa_drv.h:189
rx_frames_received::abs
uint32_t abs
Definition: tamagawa_drv.h:171
register_offsets::ICSS_CFG_GPCFGx
int32_t ICSS_CFG_GPCFGx
Definition: tamagawa_drv.h:266
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
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:265