AM64x MCU+ SDK  08.06.00
APIs for ENDAT Encoder

Introduction

Here is the list of APIs used for EnDAT encoder communication protocol

Functions

int32_t endat_recvd_process (struct endat_priv *priv, int32_t cmd, union endat_format_data *u)
 process raw recieved data and format based on the command More...
 
uint32_t endat_recvd_validate (struct endat_priv *priv, int32_t cmd, union endat_format_data *u)
 CRC result indicated in return value as follows,
0th bit high position/address/params/test CRC success
0th bit low position/address/params/test CRC failure
1st bit high if addinfo 1 present, addinfo 1 CRC success
1st bit low if addinfo 1 present, addinfo 1 CRC failure
2nd bit high if addinfo 2 present, addinfo 2 CRC success
2nd bit low if addinfo 2 present, addinfo 2 CRC failure. More...
 
int32_t endat_command_process (struct endat_priv *priv, int32_t cmd, struct cmd_supplement *cmd_supplement)
 send the EnDat command and wait till firmware acknowledges More...
 
int32_t endat_command_build (struct endat_priv *priv, int32_t cmd, struct cmd_supplement *cmd_supplement)
 setup the EnDat command in the PRU interface buffer More...
 
void endat_command_send (struct endat_priv *priv)
 trigger sending the EnDat command in PRU More...
 
void endat_command_wait (struct endat_priv *priv)
 wait till PRU finishes EnDat transaction More...
 
uint32_t endat_get_recovery_time (struct endat_priv *priv)
 read RT from DMEM More...
 
int32_t endat_get_encoder_info (struct endat_priv *priv)
 update priv with position resolution, id, serial number, encoder type and supported command set More...
 
uint32_t endat_get_prop_delay (struct endat_priv *priv)
 get propagation delay automatically estimated by the firmware More...
 
void endat_addinfo_track (struct endat_priv *priv, int32_t cmd, struct cmd_supplement *cmd_supplement)
 track presence of additional information in priv More...
 
void endat_config_clock (struct endat_priv *priv, struct endat_clk_cfg *clk_cfg)
 configure EnDat clock More...
 
void endat_config_tst_delay (struct endat_priv *priv, uint16_t delay)
 configure tST delay More...
 
void endat_config_rx_arm_cnt (struct endat_priv *priv, uint16_t val)
 configure rx arm counter More...
 
void endat_config_wire_delay (struct endat_priv *priv, uint16_t val)
 configure wire delay for the selected channel More...
 
void endat_config_rx_clock_disable (struct endat_priv *priv, uint16_t val)
 configure clocks to be disabled at the end of rx to account for tD More...
 
int32_t endat_start_continuous_mode (struct endat_priv *priv)
 start continuous mode More...
 
void endat_stop_continuous_mode (struct endat_priv *priv)
 stop continuous mode More...
 
void endat_config_host_trigger (struct endat_priv *priv)
 configure EnDat master for host trigger mode More...
 
void endat_config_periodic_trigger (struct endat_priv *priv)
 configure EnDat master in periodic trigger mode More...
 
void endat_config_syn_bits (struct endat_priv *priv, uint8_t mask)
 
void endat_config_primary_core_mask (struct endat_priv *priv, uint8_t mask)
 set a core as primay core for global configuration, clk configuration and TX_GLOBAL_INIT More...
 
void endat_enable_load_share_mode (struct endat_priv *priv)
 enable load share mode if encoders has diffent make More...
 
void endat_config_channel (struct endat_priv *priv, int32_t ch)
 select channel to be used by EnDat master More...
 
void endat_config_multi_channel_mask (struct endat_priv *priv, uint8_t mask, uint8_t loadshare)
 select mask of channels to be used in multi channel configuration by EnDat master More...
 
uint8_t endat_multi_channel_detected (struct endat_priv *priv)
 select channels detected in multi channel configuration by EnDat master.
required to be invoked only if firmware indicates initialization failure
to know the channels that has been detected. Initialization success implies
that all channels indicated has been detected. More...
 
void endat_multi_channel_set_cur (struct endat_priv *priv, int32_t ch)
 In multi channel configuration, select channel before receive processing in
multi channel configuration. After receive is complete, select each channel
and invoke rx API's to parse data recieved in each channel. More...
 
int32_t endat_wait_initialization (struct endat_priv *priv, uint32_t timeout, uint8_t mask)
 wait for EnDat master firmware to initialize More...
 
struct endat_privendat_init (struct endat_pruss_xchg *pruss_xchg, void *pruss_cfg, int32_t slice)
 Initialize EnDat firmware interface address and get the pointer to struct endat_priv instance. More...
 
int32_t endat_get_2_2_angle (struct endat_priv *priv)
 Read EnDat 2.2 angular position in steps for rotary encoders
(prior to invoking this, 2.2 position command has to be completed)
This checks the CRC status (updated on-the-fly by firmware),
checks the group alarm errors (F1/F2 bits) and the angle value
recieved in reverse are reversed in a highly optimized way using
inline assembly.
Assumptions (that holds good for quite a few encoders):
More...
 

Function Documentation

◆ endat_recvd_process()

int32_t endat_recvd_process ( struct endat_priv priv,
int32_t  cmd,
union endat_format_data u 
)

process raw recieved data and format based on the command

Parameters
[in]privcookie returned by endat_init
[in]cmdEnDat command number
[out]upointer to union for storing formatted data based on cmd
Return values
0for success, -EINVAL for failure

◆ endat_recvd_validate()

uint32_t endat_recvd_validate ( struct endat_priv priv,
int32_t  cmd,
union endat_format_data u 
)

CRC result indicated in return value as follows,
0th bit high position/address/params/test CRC success
0th bit low position/address/params/test CRC failure
1st bit high if addinfo 1 present, addinfo 1 CRC success
1st bit low if addinfo 1 present, addinfo 1 CRC failure
2nd bit high if addinfo 2 present, addinfo 2 CRC success
2nd bit low if addinfo 2 present, addinfo 2 CRC failure.

Parameters
[in]privcookie returned by endat_init
[in]cmdEnDat command number
[in]upointer to union having formatted data based on cmd
Return values
statusposition/address/params/test CRC status

◆ endat_command_process()

int32_t endat_command_process ( struct endat_priv priv,
int32_t  cmd,
struct cmd_supplement cmd_supplement 
)

send the EnDat command and wait till firmware acknowledges

Parameters
[in]privcookie returned by endat_init
[in]cmdEnDat command number
[in]cmd_supplementSupplement information needed to setup EnDat cmd
Return values
0for success, -EINVAL for failure

◆ endat_command_build()

int32_t endat_command_build ( struct endat_priv priv,
int32_t  cmd,
struct cmd_supplement cmd_supplement 
)

setup the EnDat command in the PRU interface buffer

Parameters
[in]privcookie returned by endat_init
[in]cmdEnDat command number
[in]cmd_supplementSupplement information needed to setup EnDat cmd
Return values
0for success, -EINVAL for failure

◆ endat_command_send()

void endat_command_send ( struct endat_priv priv)

trigger sending the EnDat command in PRU

Parameters
[in]privcookie returned by endat_init

◆ endat_command_wait()

void endat_command_wait ( struct endat_priv priv)

wait till PRU finishes EnDat transaction

Parameters
[in]privcookie returned by endat_init

◆ endat_get_recovery_time()

uint32_t endat_get_recovery_time ( struct endat_priv priv)

read RT from DMEM

Parameters
[in]privcookie returned by endat_init
Return values
Valueof Recovery Time in nanoseconds

◆ endat_get_encoder_info()

int32_t endat_get_encoder_info ( struct endat_priv priv)

update priv with position resolution, id, serial number, encoder type and supported command set

Parameters
[in]privcookie returned by endat_init
Return values
0for success, -EINVAL for failure

◆ endat_get_prop_delay()

uint32_t endat_get_prop_delay ( struct endat_priv priv)

get propagation delay automatically estimated by the firmware

Parameters
[in]privcookie returned by endat_init
Return values
delayestimated propogation delay

◆ endat_addinfo_track()

void endat_addinfo_track ( struct endat_priv priv,
int32_t  cmd,
struct cmd_supplement cmd_supplement 
)

track presence of additional information in priv

Parameters
[in]privcookie returned by endat_init
[in]cmdEnDat command number
[in]cmd_supplementSupplement information needed to setup EnDat cmd

◆ endat_config_clock()

void endat_config_clock ( struct endat_priv priv,
struct endat_clk_cfg clk_cfg 
)

configure EnDat clock

Parameters
[in]privcookie returned by endat_init
[in]clk_cfgpointer to structure containing clock configuration data

◆ endat_config_tst_delay()

void endat_config_tst_delay ( struct endat_priv priv,
uint16_t  delay 
)

configure tST delay

Parameters
[in]privcookie returned by endat_init
[in]delaytST delay value

◆ endat_config_rx_arm_cnt()

void endat_config_rx_arm_cnt ( struct endat_priv priv,
uint16_t  val 
)

configure rx arm counter

Parameters
[in]privcookie returned by endat_init
[in]valrx arm counter value in ns

◆ endat_config_wire_delay()

void endat_config_wire_delay ( struct endat_priv priv,
uint16_t  val 
)

configure wire delay for the selected channel

Parameters
[in]privcookie returned by endat_init
[in]valwire delay in ns

◆ endat_config_rx_clock_disable()

void endat_config_rx_clock_disable ( struct endat_priv priv,
uint16_t  val 
)

configure clocks to be disabled at the end of rx to account for tD

Parameters
[in]privcookie returned by endat_init
[in]valnumber of clocks to be disabled

◆ endat_start_continuous_mode()

int32_t endat_start_continuous_mode ( struct endat_priv priv)

start continuous mode

Parameters
[in]privcookie returned by endat_init
Return values
0success, -EINVAL for failure

◆ endat_stop_continuous_mode()

void endat_stop_continuous_mode ( struct endat_priv priv)

stop continuous mode

Parameters
[in]privcookie returned by endat_init

◆ endat_config_host_trigger()

void endat_config_host_trigger ( struct endat_priv priv)

configure EnDat master for host trigger mode

Parameters
[in]privcookie returned by endat_init

◆ endat_config_periodic_trigger()

void endat_config_periodic_trigger ( struct endat_priv priv)

configure EnDat master in periodic trigger mode

Parameters
[in]privcookie returned by endat_init

◆ endat_config_syn_bits()

void endat_config_syn_bits ( struct endat_priv priv,
uint8_t  mask 
)

◆ endat_config_primary_core_mask()

void endat_config_primary_core_mask ( struct endat_priv priv,
uint8_t  mask 
)

set a core as primay core for global configuration, clk configuration and TX_GLOBAL_INIT

Parameters
[in]privcookie returned by endat_init
[in]maskchannels mask

◆ endat_enable_load_share_mode()

void endat_enable_load_share_mode ( struct endat_priv priv)

enable load share mode if encoders has diffent make

Parameters
[in]privcookie returned by endat_init

◆ endat_config_channel()

void endat_config_channel ( struct endat_priv priv,
int32_t  ch 
)

select channel to be used by EnDat master

Parameters
[in]privcookie returned by endat_init
[in]chchannel to be selected

◆ endat_config_multi_channel_mask()

void endat_config_multi_channel_mask ( struct endat_priv priv,
uint8_t  mask,
uint8_t  loadshare 
)

select mask of channels to be used in multi channel configuration by EnDat master

Parameters
[in]privcookie returned by endat_init
[in]maskchannel mask
[in]loadsharevalue for loadshare mode enable.

◆ endat_multi_channel_detected()

uint8_t endat_multi_channel_detected ( struct endat_priv priv)

select channels detected in multi channel configuration by EnDat master.
required to be invoked only if firmware indicates initialization failure
to know the channels that has been detected. Initialization success implies
that all channels indicated has been detected.

Parameters
[in]privcookie returned by endat_init
Return values
maskmask of the detected channels

◆ endat_multi_channel_set_cur()

void endat_multi_channel_set_cur ( struct endat_priv priv,
int32_t  ch 
)

In multi channel configuration, select channel before receive processing in
multi channel configuration. After receive is complete, select each channel
and invoke rx API's to parse data recieved in each channel.

Parameters
[in]privcookie returned by endat_init
[in]chchannel number to be selected

◆ endat_wait_initialization()

int32_t endat_wait_initialization ( struct endat_priv priv,
uint32_t  timeout,
uint8_t  mask 
)

wait for EnDat master firmware to initialize

Parameters
[in]privcookie returned by endat_init
[in]timeouttimeout to wait for initialization
[in]maskchannel mask
Return values
0for success, -EINVAL for failure

◆ endat_init()

struct endat_priv* endat_init ( struct endat_pruss_xchg *  pruss_xchg,
void *  pruss_cfg,
int32_t  slice 
)

Initialize EnDat firmware interface address and get the pointer to struct endat_priv instance.

Parameters
[in]pruss_xchgEnDat firmware interface address
[in]pruss_cfgICSS PRU config base address
[in]sliceICSS PRU SLICE
Return values
privpointer to struct endat_priv instance

◆ endat_get_2_2_angle()

int32_t endat_get_2_2_angle ( struct endat_priv priv)

Read EnDat 2.2 angular position in steps for rotary encoders
(prior to invoking this, 2.2 position command has to be completed)
This checks the CRC status (updated on-the-fly by firmware),
checks the group alarm errors (F1/F2 bits) and the angle value
recieved in reverse are reversed in a highly optimized way using
inline assembly.
Assumptions (that holds good for quite a few encoders):

  1. Total resolution >= 25
  2. Single turn resolution <= 30
Parameters
[in]privcookie returned by endat_init
Return values
anglefor angular position in steps on success, -1 for failure