--- a/master/device.c Thu Mar 02 13:08:07 2006 +0000
+++ b/master/device.c Mon Mar 06 15:12:34 2006 +0000
@@ -19,6 +19,11 @@
/*****************************************************************************/
+void ec_data_print(const uint8_t *, size_t);
+void ec_data_print_diff(const uint8_t *, const uint8_t *, size_t);
+
+/*****************************************************************************/
+
/**
EtherCAT-Geräte-Konstuktor.
@@ -26,26 +31,36 @@
*/
int ec_device_init(ec_device_t *device, /**< EtherCAT-Gerät */
- ec_master_t *master /**< Zugehöriger Master */
+ ec_master_t *master, /**< Zugehöriger Master */
+ struct net_device *net_dev, /**< Net-Device */
+ ec_isr_t isr, /**< Adresse der ISR */
+ struct module *module /**< Modul-Adresse */
)
{
+ struct ethhdr *eth;
+
device->master = master;
- device->dev = NULL;
+ device->dev = net_dev;
+ device->isr = isr;
+ device->module = module;
+
device->open = 0;
- device->tx_time = 0;
- device->rx_time = 0;
- device->state = EC_DEVICE_STATE_READY;
- device->rx_data_size = 0;
- device->isr = NULL;
- device->module = NULL;
- device->error_reported = 0;
device->link_state = 0; // down
- if ((device->tx_skb = dev_alloc_skb(ETH_HLEN + EC_MAX_FRAME_SIZE)) == NULL) {
+ if (!(device->tx_skb = dev_alloc_skb(ETH_HLEN + EC_MAX_FRAME_SIZE))) {
EC_ERR("Error allocating device socket buffer!\n");
return -1;
}
+ device->tx_skb->dev = net_dev;
+
+ // Ethernet-II-Header hinzufuegen
+ skb_reserve(device->tx_skb, ETH_HLEN);
+ eth = (struct ethhdr *) skb_push(device->tx_skb, ETH_HLEN);
+ eth->h_proto = htons(0x88A4);
+ memcpy(eth->h_source, net_dev->dev_addr, net_dev->addr_len);
+ memset(eth->h_dest, 0xFF, net_dev->addr_len);
+
return 0;
}
@@ -61,13 +76,7 @@
void ec_device_clear(ec_device_t *device /**< EtherCAT-Gerät */)
{
if (device->open) ec_device_close(device);
-
- device->dev = NULL;
-
- if (device->tx_skb) {
- dev_kfree_skb(device->tx_skb);
- device->tx_skb = NULL;
- }
+ if (device->tx_skb) dev_kfree_skb(device->tx_skb);
}
/*****************************************************************************/
@@ -100,8 +109,6 @@
// Device could have received frames before
for (i = 0; i < 4; i++) ec_device_call_isr(device);
- // Reset old device state
- device->state = EC_DEVICE_STATE_READY;
device->link_state = 0;
if (device->dev->open(device->dev) == 0) device->open = 1;
@@ -127,10 +134,10 @@
if (!device->open) {
EC_WARN("Device already closed!\n");
- }
- else {
- if (device->dev->stop(device->dev) == 0) device->open = 0;
- }
+ return 0;
+ }
+
+ if (device->dev->stop(device->dev) == 0) device->open = 0;
return !device->open ? 0 : -1;
}
@@ -138,18 +145,14 @@
/*****************************************************************************/
/**
- Bereitet den geräteinternen Socket-Buffer auf den Versand vor.
+ Liefert einen Zeiger auf den Sende-Speicher.
\return Zeiger auf den Speicher, in den die Frame-Daten sollen.
*/
-uint8_t *ec_device_prepare(ec_device_t *device /**< EtherCAT-Gerät */)
-{
- skb_trim(device->tx_skb, 0); // Auf Länge 0 abschneiden
- skb_reserve(device->tx_skb, ETH_HLEN); // Reserve für Ethernet-II-Header
-
- // Vorerst Speicher für maximal langen Frame reservieren
- return skb_put(device->tx_skb, EC_MAX_FRAME_SIZE);
+uint8_t *ec_device_tx_data(ec_device_t *device /**< EtherCAT-Gerät */)
+{
+ return device->tx_skb->data + ETH_HLEN;
}
/*****************************************************************************/
@@ -163,65 +166,27 @@
*/
void ec_device_send(ec_device_t *device, /**< EtherCAT-Gerät */
- unsigned int length /**< Länge der zu sendenden Daten */
+ size_t size /**< Größe der zu sendenden Daten */
)
{
- struct ethhdr *eth;
-
if (unlikely(!device->link_state)) // Link down
return;
// Framegröße auf (jetzt bekannte) Länge abschneiden
- skb_trim(device->tx_skb, length);
-
- // Ethernet-II-Header hinzufuegen
- eth = (struct ethhdr *) skb_push(device->tx_skb, ETH_HLEN);
- eth->h_proto = htons(0x88A4);
- memcpy(eth->h_source, device->dev->dev_addr, device->dev->addr_len);
- memset(eth->h_dest, 0xFF, device->dev->addr_len);
-
- device->state = EC_DEVICE_STATE_SENT;
- device->rx_data_size = 0;
+ device->tx_skb->len = ETH_HLEN + size;
if (unlikely(device->master->debug_level > 1)) {
- EC_DBG("Sending frame:\n");
- ec_data_print(device->tx_skb->data + ETH_HLEN, device->tx_skb->len);
+ EC_DBG("sending frame:\n");
+ ec_data_print(device->tx_skb->data + ETH_HLEN, size);
}
// Senden einleiten
- rdtscl(device->tx_time); // Get CPU cycles
device->dev->hard_start_xmit(device->tx_skb, device->dev);
}
/*****************************************************************************/
/**
- Gibt die Anzahl der empfangenen Bytes zurück.
-
- \return Empfangene Bytes, oder 0, wenn kein Frame empfangen wurde.
-*/
-
-unsigned int ec_device_received(const ec_device_t *device)
-{
- return device->rx_data_size;
-}
-
-/*****************************************************************************/
-
-/**
- Gibt die empfangenen Daten zurück.
-
- \return Zeiger auf empfangene Daten.
-*/
-
-uint8_t *ec_device_data(ec_device_t *device)
-{
- return device->rx_data;
-}
-
-/*****************************************************************************/
-
-/**
Ruft die Interrupt-Routine der Netzwerkkarte auf.
*/
@@ -233,49 +198,6 @@
/*****************************************************************************/
/**
- Gibt alle Informationen über das Device-Objekt aus.
-*/
-
-void ec_device_print(ec_device_t *device /**< EtherCAT-Gerät */)
-{
- EC_DBG("---EtherCAT device information begin---\n");
-
- if (device) {
- EC_DBG("Assigned net_device: %X\n", (u32) device->dev);
- EC_DBG("Transmit socket buffer: %X\n", (u32) device->tx_skb);
- EC_DBG("Time of last transmission: %u\n", (u32) device->tx_time);
- EC_DBG("Time of last receive: %u\n", (u32) device->rx_time);
- EC_DBG("Actual device state: %i\n", (u8) device->state);
- EC_DBG("Receive buffer: %X\n", (u32) device->rx_data);
- EC_DBG("Receive buffer fill state: %u/%u\n",
- (u32) device->rx_data_size, EC_MAX_FRAME_SIZE);
- }
- else {
- EC_DBG("Device is NULL!\n");
- }
-
- EC_DBG("---EtherCAT device information end---\n");
-}
-
-/*****************************************************************************/
-
-/**
- Gibt das letzte Rahmenpaar aus.
-*/
-
-void ec_device_debug(const ec_device_t *device /**< EtherCAT-Gerät */)
-{
- EC_DBG(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
- ec_data_print(device->tx_skb->data + ETH_HLEN, device->tx_skb->len);
- EC_DBG("--------------------------------------\n");
- ec_data_print_diff(device->tx_skb->data + ETH_HLEN, device->rx_data,
- device->rx_data_size);
- EC_DBG("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n");
-}
-
-/*****************************************************************************/
-
-/**
Gibt Frame-Inhalte zwecks Debugging aus.
*/
@@ -328,19 +250,6 @@
*****************************************************************************/
/**
- Setzt den Zustand des EtherCAT-Gerätes.
-*/
-
-void EtherCAT_dev_state(ec_device_t *device, /**< EtherCAT-Gerät */
- ec_device_state_t state /**< Neuer Zustand */
- )
-{
- device->state = state;
-}
-
-/*****************************************************************************/
-
-/**
Prüft, ob das Net-Device \a dev zum registrierten EtherCAT-Gerät gehört.
\return 0 wenn nein, nicht-null wenn ja.
@@ -366,16 +275,12 @@
size_t size /**< Größe der empfangenen Daten */
)
{
- // Copy received data to ethercat-device buffer
- memcpy(device->rx_data, data, size);
- device->rx_data_size = size;
- device->state = EC_DEVICE_STATE_RECEIVED;
-
if (unlikely(device->master->debug_level > 1)) {
EC_DBG("Received frame:\n");
- ec_data_print_diff(device->tx_skb->data + ETH_HLEN, device->rx_data,
- device->rx_data_size);
- }
+ ec_data_print_diff(device->tx_skb->data + ETH_HLEN, data, size);
+ }
+
+ ec_master_receive(device->master, data, size);
}
/*****************************************************************************/
@@ -397,7 +302,6 @@
/*****************************************************************************/
EXPORT_SYMBOL(EtherCAT_dev_is_ec);
-EXPORT_SYMBOL(EtherCAT_dev_state);
EXPORT_SYMBOL(EtherCAT_dev_receive);
EXPORT_SYMBOL(EtherCAT_dev_link_state);