Fixed spacing and added some thoughts about the overlapping PDOs
implementation.
This commit is contained in:
parent
4802bcd961
commit
699bb79eca
|
|
@ -50,7 +50,7 @@ typedef struct {
|
|||
uint8_t sync_index; /**< Index of sync manager to use. */
|
||||
ec_direction_t dir; /**< FMMU direction. */
|
||||
uint32_t logical_start_address; /**< Logical start address. */
|
||||
size_t tx_size; /**< Transmitted (bus) size. */
|
||||
size_t tx_size; /**< Transmitted (bus) size. FIXME */
|
||||
uint32_t domain_address; /** Domain start address */
|
||||
unsigned int data_size; /**< Covered PDO size. */
|
||||
} ec_fmmu_config_t;
|
||||
|
|
|
|||
|
|
@ -938,24 +938,32 @@ void ec_master_send_datagrams(ec_master_t *master /**< EtherCAT master */)
|
|||
|
||||
// EtherCAT datagram data
|
||||
frame_datagram_data = cur_data;
|
||||
|
||||
// distinguish between domain and non-domain datagrams...
|
||||
// this is not nice... FIXME
|
||||
if (datagram->domain) {
|
||||
unsigned int datagram_address =
|
||||
EC_READ_U32(datagram->address);
|
||||
int i = 0;
|
||||
uint8_t *domain_data = datagram->data;
|
||||
|
||||
// FIXME all FMMU configs are taken into acount,
|
||||
// maybe the belong to another datagram?
|
||||
// test with large process data!
|
||||
|
||||
list_for_each_entry(domain_fmmu,
|
||||
&datagram->domain->fmmu_configs, list) {
|
||||
if (domain_fmmu->dir == EC_DIR_OUTPUT ) {
|
||||
if (domain_fmmu->dir == EC_DIR_OUTPUT) {
|
||||
unsigned int frame_offset =
|
||||
domain_fmmu->logical_start_address
|
||||
- datagram_address;
|
||||
memcpy(frame_datagram_data+frame_offset, domain_data,
|
||||
domain_fmmu->data_size);
|
||||
memcpy(frame_datagram_data + frame_offset,
|
||||
domain_data, domain_fmmu->data_size);
|
||||
if (unlikely(master->debug_level > 1)) {
|
||||
EC_DBG("sending dg %p i=0x%02X fmmu %u fp=%u"
|
||||
EC_MASTER_DBG(master, 0, "Sending datagram %p"
|
||||
" i=0x%02X FMMU %u fp=%u"
|
||||
" dp=%zu size=%u\n",
|
||||
datagram, datagram->index, i,
|
||||
frame_offset,
|
||||
datagram, datagram->index, i, frame_offset,
|
||||
domain_data - datagram->data,
|
||||
domain_fmmu->data_size);
|
||||
ec_print_data(domain_data,
|
||||
|
|
@ -963,7 +971,7 @@ void ec_master_send_datagrams(ec_master_t *master /**< EtherCAT master */)
|
|||
}
|
||||
}
|
||||
domain_data += domain_fmmu->data_size;
|
||||
++i;
|
||||
i++;
|
||||
}
|
||||
} else {
|
||||
memcpy(frame_datagram_data, datagram->data,
|
||||
|
|
@ -1030,14 +1038,15 @@ void ec_master_send_datagrams(ec_master_t *master /**< EtherCAT master */)
|
|||
*
|
||||
* \return 0 in case of success, else < 0
|
||||
*/
|
||||
void ec_master_receive_datagrams(ec_master_t *master, /**< EtherCAT master */
|
||||
const uint8_t *frame_data, /**< frame data */
|
||||
size_t size /**< size of the received data */
|
||||
)
|
||||
void ec_master_receive_datagrams(
|
||||
ec_master_t *master, /**< EtherCAT master */
|
||||
const uint8_t *frame_data, /**< Frame data */
|
||||
size_t size /**< Size of the received data */
|
||||
)
|
||||
{
|
||||
size_t frame_size, data_size;
|
||||
uint8_t datagram_type, datagram_index;
|
||||
unsigned int cmd_follows, matched;
|
||||
unsigned int datagram_follows, matched;
|
||||
const uint8_t *cur_data, *frame_datagram_data;
|
||||
ec_datagram_t *datagram;
|
||||
ec_fmmu_config_t* domain_fmmu;
|
||||
|
|
@ -1072,13 +1081,15 @@ void ec_master_receive_datagrams(ec_master_t *master, /**< EtherCAT master */
|
|||
return;
|
||||
}
|
||||
|
||||
cmd_follows = 1;
|
||||
while (cmd_follows) {
|
||||
datagram_follows = 1;
|
||||
|
||||
while (datagram_follows) {
|
||||
|
||||
// process datagram header
|
||||
datagram_type = EC_READ_U8 (cur_data);
|
||||
datagram_index = EC_READ_U8 (cur_data + 1);
|
||||
data_size = EC_READ_U16(cur_data + 6) & 0x07FF;
|
||||
cmd_follows = EC_READ_U16(cur_data + 6) & 0x8000;
|
||||
datagram_type = EC_READ_U8(cur_data);
|
||||
datagram_index = EC_READ_U8(cur_data + 1);
|
||||
data_size = EC_READ_U16(cur_data + 6) & 0x07FF;
|
||||
datagram_follows = EC_READ_U16(cur_data + 6) & 0x8000;
|
||||
cur_data += EC_DATAGRAM_HEADER_SIZE;
|
||||
|
||||
if (unlikely(cur_data - frame_data
|
||||
|
|
@ -1123,13 +1134,20 @@ void ec_master_receive_datagrams(ec_master_t *master, /**< EtherCAT master */
|
|||
cur_data += data_size + EC_DATAGRAM_FOOTER_SIZE;
|
||||
continue;
|
||||
}
|
||||
|
||||
frame_datagram_data = cur_data;
|
||||
|
||||
// distinguish between domain and non-domain datagrams
|
||||
// this is not nice FIXME
|
||||
if (datagram->domain) {
|
||||
size_t datagram_address = EC_READ_U32(datagram->address);
|
||||
int i = 0;
|
||||
uint8_t *domain_data = datagram->data;
|
||||
|
||||
// FIXME see ecrt_master_send_datagrams()
|
||||
// it is not correct to walk though *all* FMMU configs,
|
||||
// because they may not all belong to the same frame!
|
||||
|
||||
list_for_each_entry(domain_fmmu, &datagram->domain->fmmu_configs,
|
||||
list) {
|
||||
if (domain_fmmu->dir == EC_DIR_INPUT) {
|
||||
|
|
@ -1138,7 +1156,8 @@ void ec_master_receive_datagrams(ec_master_t *master, /**< EtherCAT master */
|
|||
memcpy(domain_data, frame_datagram_data + frame_offset,
|
||||
domain_fmmu->data_size);
|
||||
if (unlikely(master->debug_level > 1)) {
|
||||
EC_DBG("receiving dg %p i=0x%02X fmmu %u fp=%u"
|
||||
EC_MASTER_DBG(master, 0, "Receiving datagram %p"
|
||||
" i=0x%02X fmmu %u fp=%u"
|
||||
" dp=%zu size=%u\n",
|
||||
datagram, datagram->index, i,
|
||||
frame_offset, domain_data - datagram->data,
|
||||
|
|
@ -1147,12 +1166,13 @@ void ec_master_receive_datagrams(ec_master_t *master, /**< EtherCAT master */
|
|||
}
|
||||
}
|
||||
domain_data += domain_fmmu->data_size;
|
||||
++i;
|
||||
i++;
|
||||
}
|
||||
} else {
|
||||
// copy received data into the datagram memory
|
||||
memcpy(datagram->data, frame_datagram_data, data_size);
|
||||
}
|
||||
|
||||
cur_data += data_size;
|
||||
|
||||
// set the datagram's working counter
|
||||
|
|
|
|||
|
|
@ -161,8 +161,7 @@ int ec_slave_config_prepare_fmmu(
|
|||
)
|
||||
{
|
||||
unsigned int i;
|
||||
ec_fmmu_config_t *fmmu;
|
||||
ec_fmmu_config_t *prev_fmmu;
|
||||
ec_fmmu_config_t *fmmu, *prev_fmmu;
|
||||
uint32_t fmmu_logical_start_address;
|
||||
size_t tx_size, old_prev_tx_size;
|
||||
|
||||
|
|
@ -184,22 +183,26 @@ int ec_slave_config_prepare_fmmu(
|
|||
ec_fmmu_config_init(fmmu, sc, sync_index, dir);
|
||||
fmmu_logical_start_address = domain->tx_size;
|
||||
tx_size = fmmu->data_size;
|
||||
|
||||
// FIXME is it enough to take only the *previous* FMMU into account?
|
||||
|
||||
if (sc->allow_overlapping_pdos && sc->used_fmmus > 0) {
|
||||
prev_fmmu = &sc->fmmu_configs[sc->used_fmmus-1];
|
||||
prev_fmmu = &sc->fmmu_configs[sc->used_fmmus - 1];
|
||||
if (fmmu->dir != prev_fmmu->dir && prev_fmmu->tx_size != 0) {
|
||||
// prev fmmu has opposite direction
|
||||
// and is not already paired with prev-prev fmmu
|
||||
old_prev_tx_size = prev_fmmu->tx_size;
|
||||
prev_fmmu->tx_size = max(fmmu->data_size,prev_fmmu->data_size);
|
||||
prev_fmmu->tx_size = max(fmmu->data_size, prev_fmmu->data_size);
|
||||
domain->tx_size += prev_fmmu->tx_size - old_prev_tx_size;
|
||||
tx_size = 0;
|
||||
fmmu_logical_start_address = prev_fmmu->logical_start_address;
|
||||
}
|
||||
}
|
||||
ec_fmmu_config_domain(fmmu,domain,fmmu_logical_start_address,tx_size);
|
||||
|
||||
ec_fmmu_config_domain(fmmu, domain, fmmu_logical_start_address, tx_size);
|
||||
ec_mutex_unlock(&sc->master->master_mutex);
|
||||
|
||||
++sc->used_fmmus;
|
||||
sc->used_fmmus++;
|
||||
return fmmu->domain_address;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue