mirror of
https://gitlab.com/etherlab.org/ethercat.git
synced 2026-02-06 03:41:52 +08:00
merge
This commit is contained in:
1
TODO
1
TODO
@@ -44,6 +44,7 @@ Version 1.5.0:
|
||||
* Read AL status code on spontaneous state change.
|
||||
* Fix clearing domains etc. when not activated and releasing.
|
||||
* Output -EPROTO if mailbox protocol is not supported.
|
||||
* Only output watchdog config if not default.
|
||||
|
||||
Future issues:
|
||||
|
||||
|
||||
24
configure.ac
24
configure.ac
@@ -512,6 +512,30 @@ if test "x${hrtimer}" = "x1"; then
|
||||
AC_DEFINE([EC_USE_HRTIMER], [1], [Use hrtimer for scheduling])
|
||||
fi
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Read alias address from register
|
||||
#------------------------------------------------------------------------------
|
||||
|
||||
AC_ARG_ENABLE([regalias],
|
||||
AS_HELP_STRING([--enable-regalias],
|
||||
[Read alias adresses from register (default: no)]),
|
||||
[
|
||||
case "${enableval}" in
|
||||
yes) regalias=1
|
||||
;;
|
||||
no) regalias=0
|
||||
;;
|
||||
*) AC_MSG_ERROR([Invalid value for --enable-regalias])
|
||||
;;
|
||||
esac
|
||||
],
|
||||
[regalias=0]
|
||||
)
|
||||
|
||||
if test "x${regalias}" = "x1"; then
|
||||
AC_DEFINE([EC_REGALIAS], [1], [Read alias adresses from register])
|
||||
fi
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Command-line tool
|
||||
#-----------------------------------------------------------------------------
|
||||
|
||||
@@ -76,8 +76,8 @@ static cycles_t t_last_cycle = 0, t_critical;
|
||||
// process data
|
||||
static uint8_t *domain1_pd; // process data memory
|
||||
|
||||
#define AnaInSlavePos 0, 1
|
||||
#define DigOutSlavePos 0, 3
|
||||
#define AnaInSlavePos 0, 3
|
||||
#define DigOutSlavePos 0, 2
|
||||
|
||||
#define Beckhoff_EL2004 0x00000002, 0x07D43052
|
||||
#define Beckhoff_EL3162 0x00000002, 0x0C5A3052
|
||||
@@ -286,8 +286,8 @@ int __init init_mod(void)
|
||||
t_critical = cpu_khz * 1000 / FREQUENCY - cpu_khz * INHIBIT_TIME / 1000;
|
||||
|
||||
master = ecrt_request_master(0);
|
||||
if (IS_ERR(master)) {
|
||||
ret = PTR_ERR(master);
|
||||
if (!master) {
|
||||
ret = -EBUSY;
|
||||
printk(KERN_ERR PFX "Requesting master 0 failed!\n");
|
||||
goto out_return;
|
||||
}
|
||||
|
||||
@@ -1724,7 +1724,6 @@ int ec_cdev_ioctl_deactivate(
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/** Set max. number of databytes in a cycle
|
||||
|
||||
@@ -52,7 +52,9 @@ void ec_fsm_slave_scan_state_dc_times(ec_fsm_slave_scan_t *);
|
||||
void ec_fsm_slave_scan_state_datalink(ec_fsm_slave_scan_t *);
|
||||
void ec_fsm_slave_scan_state_sii_size(ec_fsm_slave_scan_t *);
|
||||
void ec_fsm_slave_scan_state_sii_data(ec_fsm_slave_scan_t *);
|
||||
#ifdef EC_REGALIAS
|
||||
void ec_fsm_slave_scan_state_regalias(ec_fsm_slave_scan_t *);
|
||||
#endif
|
||||
void ec_fsm_slave_scan_state_preop(ec_fsm_slave_scan_t *);
|
||||
void ec_fsm_slave_scan_state_sync(ec_fsm_slave_scan_t *);
|
||||
void ec_fsm_slave_scan_state_pdos(ec_fsm_slave_scan_t *);
|
||||
@@ -61,7 +63,9 @@ void ec_fsm_slave_scan_state_end(ec_fsm_slave_scan_t *);
|
||||
void ec_fsm_slave_scan_state_error(ec_fsm_slave_scan_t *);
|
||||
|
||||
void ec_fsm_slave_scan_enter_datalink(ec_fsm_slave_scan_t *);
|
||||
#ifdef EC_REGALIAS
|
||||
void ec_fsm_slave_scan_enter_regalias(ec_fsm_slave_scan_t *);
|
||||
#endif
|
||||
void ec_fsm_slave_scan_enter_preop(ec_fsm_slave_scan_t *);
|
||||
void ec_fsm_slave_scan_enter_pdos(ec_fsm_slave_scan_t *);
|
||||
|
||||
@@ -694,7 +698,15 @@ void ec_fsm_slave_scan_state_sii_data(ec_fsm_slave_scan_t *fsm /**< slave state
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef EC_REGALIAS
|
||||
ec_fsm_slave_scan_enter_regalias(fsm);
|
||||
#else
|
||||
if (slave->sii.mailbox_protocols & EC_MBOX_COE) {
|
||||
ec_fsm_slave_scan_enter_preop(fsm);
|
||||
} else {
|
||||
fsm->state = ec_fsm_slave_scan_state_end;
|
||||
}
|
||||
#endif
|
||||
return;
|
||||
|
||||
end:
|
||||
@@ -703,13 +715,12 @@ end:
|
||||
fsm->state = ec_fsm_slave_scan_state_error;
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/**
|
||||
Slave scan entry function: REGALIAS.
|
||||
*/
|
||||
#ifdef EC_REGALIAS
|
||||
|
||||
/** Slave scan entry function: REGALIAS.
|
||||
*/
|
||||
void ec_fsm_slave_scan_enter_regalias(
|
||||
ec_fsm_slave_scan_t *fsm /**< slave state machine */
|
||||
)
|
||||
@@ -727,9 +738,8 @@ void ec_fsm_slave_scan_enter_regalias(
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/**
|
||||
Slave scan state: REGALIAS.
|
||||
*/
|
||||
/** Slave scan state: REGALIAS.
|
||||
*/
|
||||
void ec_fsm_slave_scan_state_regalias(
|
||||
ec_fsm_slave_scan_t *fsm /**< slave state machine */
|
||||
)
|
||||
@@ -754,6 +764,7 @@ void ec_fsm_slave_scan_state_regalias(
|
||||
EC_SLAVE_DBG(slave, 1, "Read alias %u from register.\n",
|
||||
slave->effective_alias);
|
||||
}
|
||||
|
||||
if (slave->sii.mailbox_protocols & EC_MBOX_COE) {
|
||||
ec_fsm_slave_scan_enter_preop(fsm);
|
||||
} else {
|
||||
@@ -761,6 +772,8 @@ void ec_fsm_slave_scan_state_regalias(
|
||||
}
|
||||
}
|
||||
|
||||
#endif // defined EC_REGALIAS
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/** Enter slave scan state PREOP.
|
||||
|
||||
@@ -439,6 +439,20 @@ void ec_master_clear_domains(ec_master_t *master)
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/** Clear the configuration applied by the application.
|
||||
*/
|
||||
void ec_master_clear_config(
|
||||
ec_master_t *master /**< EtherCAT master. */
|
||||
)
|
||||
{
|
||||
down(&master->master_sem);
|
||||
ec_master_clear_domains(master);
|
||||
ec_master_clear_slave_configs(master);
|
||||
up(&master->master_sem);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/** Internal sending callback.
|
||||
*/
|
||||
void ec_master_internal_send_cb(
|
||||
@@ -653,15 +667,17 @@ void ec_master_leave_operation_phase(
|
||||
ec_master_t *master /**< EtherCAT master */
|
||||
)
|
||||
{
|
||||
if (master->active)
|
||||
ecrt_master_deactivate(master);
|
||||
if (master->active) {
|
||||
ecrt_master_deactivate(master); // also clears config
|
||||
} else {
|
||||
ec_master_clear_config(master);
|
||||
}
|
||||
|
||||
EC_MASTER_DBG(master, 1, "OPERATION -> IDLE.\n");
|
||||
|
||||
master->phase = EC_IDLE;
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/** Injects external datagrams that fit into the datagram queue.
|
||||
@@ -1989,8 +2005,7 @@ void ecrt_master_deactivate(ec_master_t *master)
|
||||
int eoe_was_running;
|
||||
#endif
|
||||
|
||||
EC_MASTER_DBG(master, 1, "ecrt_master_deactivate(master = 0x%p)\n",
|
||||
master);
|
||||
EC_MASTER_DBG(master, 1, "%s(master = 0x%p)\n", __func__, master);
|
||||
|
||||
if (!master->active) {
|
||||
EC_MASTER_WARN(master, "%s: Master not active.\n", __func__);
|
||||
@@ -2007,10 +2022,7 @@ void ecrt_master_deactivate(ec_master_t *master)
|
||||
master->receive_cb = ec_master_internal_receive_cb;
|
||||
master->cb_data = master;
|
||||
|
||||
down(&master->master_sem);
|
||||
ec_master_clear_domains(master);
|
||||
ec_master_clear_slave_configs(master);
|
||||
up(&master->master_sem);
|
||||
ec_master_clear_config(master);
|
||||
|
||||
for (slave = master->slaves;
|
||||
slave < master->slaves + master->slave_count;
|
||||
|
||||
@@ -170,11 +170,12 @@ struct ec_master {
|
||||
unsigned int injection_seq_rt; /**< Datagram injection sequence number
|
||||
for the realtime side. */
|
||||
|
||||
|
||||
ec_slave_t *slaves; /**< Array of slaves on the bus. */
|
||||
unsigned int slave_count; /**< Number of slaves on the bus. */
|
||||
|
||||
/* Configuration applied by the application. */
|
||||
struct list_head configs; /**< List of slave configurations. */
|
||||
struct list_head domains; /**< List of domains. */
|
||||
|
||||
u64 app_time; /**< Time of the last ecrt_master_sync() call. */
|
||||
u64 app_start_time; /**< Application start time. */
|
||||
@@ -213,7 +214,6 @@ struct ec_master {
|
||||
struct list_head external_datagram_queue; /**< External Datagram queue. */
|
||||
unsigned int send_interval; /**< Interval between calls to ecrt_master_send */
|
||||
size_t max_queue_size; /**< Maximum size of datagram queue */
|
||||
struct list_head domains; /**< List of domains. */
|
||||
|
||||
unsigned int debug_level; /**< Master debug level. */
|
||||
ec_stats_t stats; /**< Cyclic statistics. */
|
||||
@@ -242,7 +242,6 @@ struct ec_master {
|
||||
|
||||
struct list_head reg_requests; /**< Register requests. */
|
||||
wait_queue_head_t reg_queue; /**< Wait queue for register requests. */
|
||||
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
@@ -687,6 +687,12 @@ void ecrt_slave_config_dc(ec_slave_config_t *sc, uint16_t assign_activate,
|
||||
uint32_t sync0_cycle_time, uint32_t sync0_shift_time,
|
||||
uint32_t sync1_cycle_time, uint32_t sync1_shift_time)
|
||||
{
|
||||
EC_CONFIG_DBG(sc, 1, "%s(sc = 0x%p, assign_activate = 0x%04X,"
|
||||
" sync0_cycle = %u, sync0_shift = %u,"
|
||||
" sync1_cycle = %u, sync1_shift = %u\n",
|
||||
__func__, sc, assign_activate, sync0_cycle_time, sync0_shift_time,
|
||||
sync1_cycle_time, sync1_shift_time);
|
||||
|
||||
sc->dc_assign_activate = assign_activate;
|
||||
sc->dc_sync[0].cycle_time = sync0_cycle_time;
|
||||
sc->dc_sync[0].shift_time = sync0_shift_time;
|
||||
|
||||
Reference in New Issue
Block a user