From 579c49521f93b381e63f8ae4929115149adfc50f Mon Sep 17 00:00:00 2001 From: Florian Pose Date: Wed, 19 Sep 2007 11:52:58 +0000 Subject: [PATCH] Master takes mailbox sync manager configurations from EEPROM words 0x0018-0x001b, if no sync manager configurations are provided. --- NEWS | 2 ++ master/fsm_slave.c | 45 ++++++++++++++++++++++++++++++++++++--------- 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/NEWS b/NEWS index 0f70e28d..1d09c78d 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,8 @@ $Id$ Changes in version 1.3.2: +* Master takes mailbox sync manager configurations from EEPROM words + 0x0018-0x001b, if no sync manager configurations are provided. * Calculate checksum when writing EEPROM or alias address. * Removed config.kbuild and replaced Kbuild files by Kbuild.in files. diff --git a/master/fsm_slave.c b/master/fsm_slave.c index 9da6c62f..861d8fd3 100644 --- a/master/fsm_slave.c +++ b/master/fsm_slave.c @@ -684,8 +684,8 @@ void ec_fsm_slave_conf_enter_mbox_sync( return; } - if (!slave->sii_mailbox_protocols || slave->sii_sync_count < 2) { - // no mailbox sync managers to be configured + if (!slave->sii_mailbox_protocols) { + // no mailbox protocols supported if (master->debug_level) EC_DBG("Slave %i does not support mailbox communication.\n", slave->ring_position); @@ -698,14 +698,41 @@ void ec_fsm_slave_conf_enter_mbox_sync( slave->ring_position); } - // configure sync managers - ec_datagram_npwr(datagram, slave->station_address, 0x0800, - EC_SYNC_SIZE * slave->sii_sync_count); - memset(datagram->data, 0x00, EC_SYNC_SIZE * slave->sii_sync_count); + if (slave->sii_sync_count >= 2) { + // configure sync managers + ec_datagram_npwr(datagram, slave->station_address, 0x0800, + EC_SYNC_SIZE * slave->sii_sync_count); + memset(datagram->data, 0x00, EC_SYNC_SIZE * slave->sii_sync_count); - for (i = 0; i < 2; i++) { - ec_sync_config(&slave->sii_syncs[i], - datagram->data + EC_SYNC_SIZE * i); + for (i = 0; i < 2; i++) { + ec_sync_config(&slave->sii_syncs[i], + datagram->data + EC_SYNC_SIZE * i); + } + } else { // no mailbox sync manager configurations provided + ec_sync_t sync; + + if (master->debug_level) + EC_DBG("Slave %i does not provide" + " mailbox sync manager configurations.\n", + slave->ring_position); + + ec_datagram_npwr(datagram, slave->station_address, 0x0800, + EC_SYNC_SIZE * 2); + memset(datagram->data, 0x00, EC_SYNC_SIZE * 2); + + ec_sync_init(&sync, slave, 0); + sync.physical_start_address = slave->sii_rx_mailbox_offset; + sync.length = slave->sii_rx_mailbox_size; + sync.control_register = 0x26; + sync.enable = 1; + ec_sync_config(&sync, datagram->data + EC_SYNC_SIZE * sync.index); + + ec_sync_init(&sync, slave, 1); + sync.physical_start_address = slave->sii_tx_mailbox_offset; + sync.length = slave->sii_tx_mailbox_size; + sync.control_register = 0x22; + sync.enable = 1; + ec_sync_config(&sync, datagram->data + EC_SYNC_SIZE * sync.index); } fsm->retries = EC_FSM_RETRIES;