Layed out FMMU structure and methods to own files.
This commit is contained in:
parent
a5eabfa35d
commit
e14a82d992
|
|
@ -35,9 +35,9 @@ include $(src)/../config.kbuild
|
|||
|
||||
obj-m := ec_master.o
|
||||
|
||||
ec_master-objs := module.o master.o device.o device_id.o pdo.o sync.o slave.o \
|
||||
datagram.o domain.o mailbox.o canopen.o ethernet.o fsm_sii.o fsm_change.o \
|
||||
fsm_coe.o fsm_slave.o fsm_master.o xmldev.o
|
||||
ec_master-objs := module.o master.o device.o device_id.o pdo.o sync.o fmmu.o \
|
||||
slave.o datagram.o domain.o mailbox.o canopen.o ethernet.o fsm_sii.o \
|
||||
fsm_change.o fsm_coe.o fsm_slave.o fsm_master.o xmldev.o
|
||||
|
||||
ifeq ($(EC_DBG_IF),1)
|
||||
ec_master-objs += debug.o
|
||||
|
|
|
|||
|
|
@ -40,6 +40,7 @@ EXTRA_DIST = \
|
|||
device_id.c device_id.h \
|
||||
pdo.c pdo.h \
|
||||
sync.c sync.h \
|
||||
fmmu.c fmmu.h \
|
||||
domain.c domain.h \
|
||||
doxygen.c \
|
||||
ethernet.c ethernet.h \
|
||||
|
|
|
|||
|
|
@ -0,0 +1,97 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2006 Florian Pose, Ingenieurgemeinschaft IgH
|
||||
*
|
||||
* This file is part of the IgH EtherCAT Master.
|
||||
*
|
||||
* The IgH EtherCAT Master is free software; you can redistribute it
|
||||
* and/or modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* The IgH EtherCAT Master is distributed in the hope that it will be
|
||||
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with the IgH EtherCAT Master; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* The right to use EtherCAT Technology is granted and comes free of
|
||||
* charge under condition of compatibility of product made by
|
||||
* Licensee. People intending to distribute/sell products based on the
|
||||
* code, have to sign an agreement to guarantee that products using
|
||||
* software based on IgH EtherCAT master stay compatible with the actual
|
||||
* EtherCAT specification (which are released themselves as an open
|
||||
* standard) as the (only) precondition to have the right to use EtherCAT
|
||||
* Technology, IP and trade marks.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/**
|
||||
\file
|
||||
EtherCAT FMMU methods.
|
||||
*/
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
#include "globals.h"
|
||||
#include "slave.h"
|
||||
#include "master.h"
|
||||
#include "fmmu.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/**
|
||||
* FMMU Constructor.
|
||||
*/
|
||||
|
||||
void ec_fmmu_init(
|
||||
ec_fmmu_t *fmmu, /**< EtherCAT FMMU */
|
||||
ec_slave_t *slave, /**< EtherCAT slave */
|
||||
unsigned int index /**< FMMU index */
|
||||
)
|
||||
{
|
||||
fmmu->slave = slave;
|
||||
fmmu->index = index;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/**
|
||||
* Initializes an FMMU configuration page.
|
||||
* The referenced memory (\a data) must be at least EC_FMMU_SIZE bytes.
|
||||
*/
|
||||
|
||||
void ec_fmmu_config(
|
||||
const ec_fmmu_t *fmmu, /**< EtherCAT FMMU */
|
||||
uint8_t *data /**> configuration memory */
|
||||
)
|
||||
{
|
||||
size_t sync_size;
|
||||
|
||||
sync_size = ec_slave_calc_sync_size(fmmu->slave, fmmu->sync);
|
||||
|
||||
if (fmmu->slave->master->debug_level) {
|
||||
EC_DBG("FMMU%u: LogAddr 0x%08X, Size %3i, PhysAddr 0x%04X, Dir %s\n",
|
||||
fmmu->index, fmmu->logical_start_address,
|
||||
sync_size, fmmu->sync->physical_start_address,
|
||||
((fmmu->sync->control_register & 0x04) ? "out" : "in"));
|
||||
}
|
||||
|
||||
EC_WRITE_U32(data, fmmu->logical_start_address);
|
||||
EC_WRITE_U16(data + 4, sync_size); // size of fmmu
|
||||
EC_WRITE_U8 (data + 6, 0x00); // logical start bit
|
||||
EC_WRITE_U8 (data + 7, 0x07); // logical end bit
|
||||
EC_WRITE_U16(data + 8, fmmu->sync->physical_start_address);
|
||||
EC_WRITE_U8 (data + 10, 0x00); // physical start bit
|
||||
EC_WRITE_U8 (data + 11, ((fmmu->sync->control_register & 0x04)
|
||||
? 0x02 : 0x01));
|
||||
EC_WRITE_U16(data + 12, 0x0001); // enable
|
||||
EC_WRITE_U16(data + 14, 0x0000); // reserved
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
@ -0,0 +1,77 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2006 Florian Pose, Ingenieurgemeinschaft IgH
|
||||
*
|
||||
* This file is part of the IgH EtherCAT Master.
|
||||
*
|
||||
* The IgH EtherCAT Master is free software; you can redistribute it
|
||||
* and/or modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* The IgH EtherCAT Master is distributed in the hope that it will be
|
||||
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with the IgH EtherCAT Master; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* The right to use EtherCAT Technology is granted and comes free of
|
||||
* charge under condition of compatibility of product made by
|
||||
* Licensee. People intending to distribute/sell products based on the
|
||||
* code, have to sign an agreement to guarantee that products using
|
||||
* software based on IgH EtherCAT master stay compatible with the actual
|
||||
* EtherCAT specification (which are released themselves as an open
|
||||
* standard) as the (only) precondition to have the right to use EtherCAT
|
||||
* Technology, IP and trade marks.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/**
|
||||
\file
|
||||
EtherCAT FMMU structure.
|
||||
*/
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
#ifndef _EC_FMMU_H_
|
||||
#define _EC_FMMU_H_
|
||||
|
||||
#include "../include/ecrt.h"
|
||||
|
||||
#include "globals.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/** size of an FMMU configuration page */
|
||||
#define EC_FMMU_SIZE 16
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/**
|
||||
* FMMU configuration.
|
||||
*/
|
||||
|
||||
typedef struct
|
||||
{
|
||||
const ec_slave_t *slave; /**< EtherCAT slave, the FMMU belongs to */
|
||||
unsigned int index; /**< FMMU index */
|
||||
const ec_domain_t *domain; /**< domain */
|
||||
const ec_sync_t *sync; /**< sync manager */
|
||||
uint32_t logical_start_address; /**< logical start address */
|
||||
}
|
||||
ec_fmmu_t;
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
void ec_fmmu_init(ec_fmmu_t *, ec_slave_t *, unsigned int);
|
||||
|
||||
void ec_fmmu_config(const ec_fmmu_t *, uint8_t *);
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
#endif
|
||||
|
|
@ -879,8 +879,7 @@ void ec_fsm_slave_conf_enter_fmmu(ec_fsm_slave_t *fsm /**< slave state machine *
|
|||
0x0600, EC_FMMU_SIZE * slave->base_fmmu_count);
|
||||
memset(datagram->data, 0x00, EC_FMMU_SIZE * slave->base_fmmu_count);
|
||||
for (j = 0; j < slave->fmmu_count; j++) {
|
||||
ec_slave_fmmu_config(slave, &slave->fmmus[j],
|
||||
datagram->data + EC_FMMU_SIZE * j);
|
||||
ec_fmmu_config(&slave->fmmus[j], datagram->data + EC_FMMU_SIZE * j);
|
||||
}
|
||||
|
||||
ec_master_queue_datagram(master, datagram);
|
||||
|
|
|
|||
|
|
@ -78,9 +78,6 @@
|
|||
/** size of an EtherCAT datagram footer */
|
||||
#define EC_DATAGRAM_FOOTER_SIZE 2
|
||||
|
||||
/** size of an FMMU configuration page */
|
||||
#define EC_FMMU_SIZE 16
|
||||
|
||||
/** resulting maximum data size of a single datagram in a frame */
|
||||
#define EC_MAX_DATA_SIZE (ETH_DATA_LEN - EC_FRAME_HEADER_SIZE \
|
||||
- EC_DATAGRAM_HEADER_SIZE - EC_DATAGRAM_FOOTER_SIZE)
|
||||
|
|
|
|||
|
|
@ -591,21 +591,22 @@ char *ec_slave_sii_string(
|
|||
/*****************************************************************************/
|
||||
|
||||
/**
|
||||
Prepares an FMMU configuration.
|
||||
Configuration data for the FMMU is saved in the slave structure and is
|
||||
written to the slave in ecrt_master_activate().
|
||||
The FMMU configuration is done in a way, that the complete data range
|
||||
of the corresponding sync manager is covered. Seperate FMMUs are configured
|
||||
for each domain.
|
||||
If the FMMU configuration is already prepared, the function returns with
|
||||
success.
|
||||
\return 0 in case of success, else < 0
|
||||
*/
|
||||
* Prepares an FMMU configuration.
|
||||
* Configuration data for the FMMU is saved in the slave structure and is
|
||||
* written to the slave in ecrt_master_activate().
|
||||
* The FMMU configuration is done in a way, that the complete data range
|
||||
* of the corresponding sync manager is covered. Seperate FMMUs are configured
|
||||
* for each domain.
|
||||
* If the FMMU configuration is already prepared, the function returns with
|
||||
* success.
|
||||
* \return 0 in case of success, else < 0
|
||||
*/
|
||||
|
||||
int ec_slave_prepare_fmmu(ec_slave_t *slave, /**< EtherCAT slave */
|
||||
const ec_domain_t *domain, /**< domain */
|
||||
const ec_sync_t *sync /**< sync manager */
|
||||
)
|
||||
int ec_slave_prepare_fmmu(
|
||||
ec_slave_t *slave, /**< EtherCAT slave */
|
||||
const ec_domain_t *domain, /**< domain */
|
||||
const ec_sync_t *sync /**< sync manager */
|
||||
)
|
||||
{
|
||||
unsigned int i;
|
||||
ec_fmmu_t *fmmu;
|
||||
|
|
@ -626,12 +627,11 @@ int ec_slave_prepare_fmmu(ec_slave_t *slave, /**< EtherCAT slave */
|
|||
|
||||
fmmu = &slave->fmmus[slave->fmmu_count];
|
||||
|
||||
fmmu->index = slave->fmmu_count;
|
||||
ec_fmmu_init(fmmu, slave, slave->fmmu_count++);
|
||||
fmmu->domain = domain;
|
||||
fmmu->sync = sync;
|
||||
fmmu->logical_start_address = 0;
|
||||
|
||||
slave->fmmu_count++;
|
||||
slave->pdos_registered = 1;
|
||||
|
||||
ec_slave_request_state(slave, EC_SLAVE_STATE_OP);
|
||||
|
|
@ -1151,42 +1151,6 @@ void ec_slave_sync_config(const ec_slave_t *slave, /**< EtherCAT slave */
|
|||
|
||||
/*****************************************************************************/
|
||||
|
||||
/**
|
||||
Initializes an FMMU configuration page.
|
||||
The referenced memory (\a data) must be at least EC_FMMU_SIZE bytes.
|
||||
*/
|
||||
|
||||
void ec_slave_fmmu_config(const ec_slave_t *slave, /**< EtherCAT slave */
|
||||
const ec_fmmu_t *fmmu, /**< FMMU */
|
||||
uint8_t *data /**> configuration memory */
|
||||
)
|
||||
{
|
||||
size_t sync_size;
|
||||
|
||||
sync_size = ec_slave_calc_sync_size(slave, fmmu->sync);
|
||||
|
||||
if (slave->master->debug_level) {
|
||||
EC_DBG("Slave %3i, FMMU %2i:"
|
||||
" LogAddr 0x%08X, Size %3i, PhysAddr 0x%04X, Dir %s\n",
|
||||
slave->ring_position, fmmu->index, fmmu->logical_start_address,
|
||||
sync_size, fmmu->sync->physical_start_address,
|
||||
((fmmu->sync->control_register & 0x04) ? "out" : "in"));
|
||||
}
|
||||
|
||||
EC_WRITE_U32(data, fmmu->logical_start_address);
|
||||
EC_WRITE_U16(data + 4, sync_size); // size of fmmu
|
||||
EC_WRITE_U8 (data + 6, 0x00); // logical start bit
|
||||
EC_WRITE_U8 (data + 7, 0x07); // logical end bit
|
||||
EC_WRITE_U16(data + 8, fmmu->sync->physical_start_address);
|
||||
EC_WRITE_U8 (data + 10, 0x00); // physical start bit
|
||||
EC_WRITE_U8 (data + 11, ((fmmu->sync->control_register & 0x04)
|
||||
? 0x02 : 0x01));
|
||||
EC_WRITE_U16(data + 12, 0x0001); // enable
|
||||
EC_WRITE_U16(data + 14, 0x0000); // reserved
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/**
|
||||
\return non-zero if slave is a bus coupler
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -50,6 +50,7 @@
|
|||
#include "datagram.h"
|
||||
#include "pdo.h"
|
||||
#include "sync.h"
|
||||
#include "fmmu.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
|
|
@ -108,21 +109,6 @@ enum
|
|||
|
||||
/*****************************************************************************/
|
||||
|
||||
/**
|
||||
FMMU configuration.
|
||||
*/
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned int index; /**< FMMU index */
|
||||
const ec_domain_t *domain; /**< domain */
|
||||
const ec_sync_t *sync; /**< sync manager */
|
||||
uint32_t logical_start_address; /**< logical start address */
|
||||
}
|
||||
ec_fmmu_t;
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/**
|
||||
EtherCAT slave.
|
||||
*/
|
||||
|
|
@ -218,7 +204,6 @@ int ec_slave_fetch_sii_pdos(ec_slave_t *, const uint8_t *, size_t,
|
|||
|
||||
// misc.
|
||||
ec_sync_t *ec_slave_get_pdo_sync(ec_slave_t *, ec_direction_t);
|
||||
void ec_slave_fmmu_config(const ec_slave_t *, const ec_fmmu_t *, uint8_t *);
|
||||
uint16_t ec_slave_calc_sync_size(const ec_slave_t *, const ec_sync_t *);
|
||||
|
||||
int ec_slave_is_coupler(const ec_slave_t *);
|
||||
|
|
|
|||
Loading…
Reference in New Issue