# HG changeset patch # User Florian Pose # Date 1131122843 0 # Node ID 6f2508af550cdbcd424caba4ba8729362a9245f0 # Parent 394c89f02e4899c4114337dff376681d6c38236a Alle ?nderungen aus den Branches no_rtai und no_int nach Trunk portiert. diff -r 394c89f02e48 -r 6f2508af550c drivers/Makefile --- a/drivers/Makefile Fri Nov 04 09:38:50 2005 +0000 +++ b/drivers/Makefile Fri Nov 04 16:47:23 2005 +0000 @@ -9,40 +9,22 @@ # ################################################################# -#KERNELDIR=/usr/src/linux -#KERNELDIR=/home/rich/linux-2.4.20.CX1100-rthal5 -#KERNELDIR=./linux-2.4.20.CX1100-rthal5 +MSR_DIR = /vol/projekte/msr_messen_steuern_regeln +EC_DIR = $(MSR_DIR)/ethercat -#IgH -KERNELDIR = /vol/projekte/msr_messen_steuern_regeln/linux/kernel/2.4.20/include/linux-2.4.20.CX1100-rthal5 -RTAIDIR = /vol/projekte/msr_messen_steuern_regeln/linux/kernel/2.4.20/include/rtai-24.1.13 -RTLIBDIR = rt_lib - -#euler-nottuln +#KERNELDIR = $(EC_DIR)/linux-2.4.20.CX1100-rthal5-kdb +KERNELDIR = $(EC_DIR)/linux-2.4.20-kdb #KERNELDIR = /usr/src/linux -#RTAIDIR = /usr/src/rtai - -#patra -#KERNELDIR = /usr/src/linux-2.4.20.CX1100-rthal5 -#RTAIDIR = /usr/src/rtai-24.1.13 - -#include $(KERNELDIR)/.config ECAT_8139_OBJ = drv_8139too.o ec_device.o ec_master.o \ ec_slave.o ec_command.o ec_types.o - -CFLAGS = -O2 -Wall -Wuninitialized -D__KERNEL__ -DMODULE \ - -I$(KERNELDIR)/include -D_RTAI -I$(RTAIDIR)/include \ - -I$(RTLIBDIR)/msr-include - -ifdef CONFIG_SMP - CFLAGS += -D__SMP__ -DSMP -endif +CFLAGS = -O2 -Wall -Wuninitialized -D__KERNEL__ \ + -DMODULE -I$(KERNELDIR)/include ################################################################# -all: .depend ecat_8139too.o +all: .depend Makefile ecat_8139too.o ecat_8139too.o: $(ECAT_8139_OBJ) $(LD) -r $(ECAT_8139_OBJ) -o $@ @@ -55,7 +37,7 @@ ################################################################# -.depend: +.depend depend dep: $(CC) $(CFLAGS) -M *.c > .depend ifeq (.depend,$(wildcard .depend)) diff -r 394c89f02e48 -r 6f2508af550c drivers/drv_8139too.c --- a/drivers/drv_8139too.c Fri Nov 04 09:38:50 2005 +0000 +++ b/drivers/drv_8139too.c Fri Nov 04 16:47:23 2005 +0000 @@ -3,7 +3,7 @@ * drv_8139too.c * * EtherCAT-Treiber für RTL8139-kompatible Netzwerkkarten. - * + * * Autoren: Wilhelm Hagemeister, Florian Pose * * $Date$ @@ -136,8 +136,6 @@ /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ #include "ec_device.h" -#include -#include #include "ec_dbg.h" /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ @@ -193,6 +191,17 @@ /* bitmapped message enable number */ static int debug = -1; +/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ + +// Device index for EtherCAT device selection +static int ec_device_index = -1; + +//#define ECAT_DEBUG + +EtherCAT_device_t rtl_ecat_dev; + +/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ + /* Size of the in-memory receive ring. */ #define RX_BUF_LEN_IDX 2 /* 0==8K, 1==16K, 2==32K, 3==64K */ #define RX_BUF_LEN (8192 << RX_BUF_LEN_IDX) @@ -635,6 +644,13 @@ MODULE_PARM_DESC (media, "8139too: Bits 4+9: force full duplex, bit 5: 100Mbps"); MODULE_PARM_DESC (full_duplex, "8139too: Force full duplex for board(s) (1)"); +/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ + +MODULE_PARM(ec_device_index, "i"); +MODULE_PARM_DESC(ec_device_index, "Index of the device reserved for EtherCAT."); + +/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ + static int read_eeprom (void *ioaddr, int location, int addr_len); static int rtl8139_open (struct net_device *dev); static int mdio_read (struct net_device *dev, int phy_id, int location); @@ -647,7 +663,6 @@ struct net_device *dev); static void rtl8139_interrupt (int irq, void *dev_instance, struct pt_regs *regs); -static void rt_rtl8139_interrupt(void); static int rtl8139_close (struct net_device *dev); static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd); static struct net_device_stats *rtl8139_get_stats (struct net_device *dev); @@ -712,16 +727,6 @@ #endif /* USE_IO_OPS */ -/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ - -#define ECATcard 1 // Diese Ethernetkarte wird für Ethercat verwendet - -//#define ECAT_DEBUG - -EtherCAT_device_t rtl_ecat_dev; - -/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ - static const u16 rtl8139_intr_mask = PCIErr | PCSTimeout | RxUnderrun | RxOverflow | RxFIFOOver | TxErr | TxOK | RxErr | RxOK; @@ -999,7 +1004,7 @@ /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ - if (board_idx == ECATcard) + if (board_idx == ec_device_index) { EC_DBG("EtherCAT registering board %d.\n", board_idx); @@ -1046,7 +1051,7 @@ /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ - if (board_idx == ECATcard) + if (board_idx == ec_device_index) { rtl_ecat_dev.lock = &tp->lock; } @@ -1378,19 +1383,12 @@ /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ - if (dev != rtl_ecat_dev.dev) + if (dev != rtl_ecat_dev.dev) { retval = request_irq(dev->irq, rtl8139_interrupt, SA_SHIRQ, dev->name, dev); + if (retval) + return retval; } - else - { - //rt_disable_irq(dev->irq); - retval = rt_request_global_irq(dev->irq,rt_rtl8139_interrupt); - //rt_enable_irq(dev->irq); - } - - if (retval) - return retval; /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ @@ -1406,11 +1404,7 @@ { free_irq(dev->irq, dev); } - else - { - rt_free_global_irq (dev->irq); - } - + /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ if (tp->tx_bufs) @@ -1419,7 +1413,7 @@ if (tp->rx_ring) pci_free_consistent(tp->pci_dev, RX_BUF_TOT_LEN, tp->rx_ring, tp->rx_ring_dma); - + return -ENOMEM; } @@ -1449,12 +1443,6 @@ EC_DBG (KERN_WARNING "%s: unable to start kernel thread\n", dev->name); } -#if 0 - else - { - rt_enable_irq(dev->irq); - } -#endif /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ @@ -1470,6 +1458,7 @@ if (tp->phys[0] >= 0) { u16 mii_lpa = mdio_read(dev, tp->phys[0], MII_LPA); + if (mii_lpa == 0xffff) ; /* Not there */ else if ((mii_lpa & LPA_100FULL) == LPA_100FULL @@ -1551,14 +1540,20 @@ if ((!(tmp & CmdRxEnb)) || (!(tmp & CmdTxEnb))) RTL_W8 (ChipCmd, CmdRxEnb | CmdTxEnb); - /* Enable all known interrupts by setting the interrupt mask. */ - RTL_W16 (IntrMask, rtl8139_intr_mask); - /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ - if (dev != rtl_ecat_dev.dev) netif_start_queue (dev); - - /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ + if (dev != rtl_ecat_dev.dev) + { + /* Enable all known interrupts by setting the interrupt mask. */ + RTL_W16 (IntrMask, rtl8139_intr_mask); + netif_start_queue (dev); + } + else + { + RTL_W16 (IntrMask, 0x0000); + } + + /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ EC_DBG(KERN_DEBUG "%s: rtl8139_hw_start finished.\n", dev->name); } @@ -1829,23 +1824,11 @@ i == (int) (tp->dirty_tx % NUM_TX_DESC) ? " (queue head)" : ""); - /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ - /* Stop a shared interrupt from scavenging while we are. */ - if (dev == rtl_ecat_dev.dev) - { - flags = rt_spin_lock_irqsave (&tp->lock); - rtl8139_tx_clear (tp); - rt_spin_unlock_irqrestore (&tp->lock,flags); - } - else { - spin_lock_irqsave (&tp->lock, flags); - rtl8139_tx_clear (tp); - spin_unlock_irqrestore (&tp->lock, flags); - } - - /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ + spin_lock_irqsave (&tp->lock, flags); + rtl8139_tx_clear (tp); + spin_unlock_irqrestore (&tp->lock, flags); /* ...and finally, reset everything */ rtl8139_hw_start (dev); @@ -1876,7 +1859,7 @@ skb_copy_and_csum_dev(skb, tp->tx_buf[entry]); // Socket buffer nicht löschen, wenn vom EtherCAT-device - if (dev != rtl_ecat_dev.dev) dev_kfree_skb(skb); + if (dev != rtl_ecat_dev.dev) dev_kfree_skb(skb); } else { @@ -1885,17 +1868,10 @@ return 0; } + /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ + /* Note: the chip doesn't have auto-pad! */ - if (dev == rtl_ecat_dev.dev) - { - rt_spin_lock_irq(&tp->lock); - } - else - { - spin_lock_irq(&tp->lock); - } - - /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ + spin_lock_irq(&tp->lock); RTL_W32_F (TxStatus0 + (entry * sizeof (u32)), tp->tx_flag | max(len, (unsigned int)ETH_ZLEN)); @@ -1913,17 +1889,10 @@ netif_stop_queue (dev); } - if (dev == rtl_ecat_dev.dev) - { - rt_spin_unlock_irq(&tp->lock); - } - else - { - spin_unlock_irq(&tp->lock); - } - /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ + spin_unlock_irq(&tp->lock); + DPRINTK ("%s: Queued Tx packet size %u to slot %d.\n", dev->name, len, entry); @@ -1981,12 +1950,12 @@ tp->stats.tx_window_errors++; /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ - + if (dev == rtl_ecat_dev.dev) { rtl_ecat_dev.state = ECAT_DS_ERROR; } - + /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ } else { @@ -2059,12 +2028,12 @@ } /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ - + if (dev == rtl_ecat_dev.dev) { rtl_ecat_dev.state = ECAT_DS_ERROR; } - + /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ #ifndef CONFIG_8139_OLD_RX_RESET @@ -2170,7 +2139,7 @@ /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ -#if RTL8139_DEBUG > 2 +#if RTL8139_DEBUG > 2 if (dev == rtl_ecat_dev.dev) { int i; @@ -2259,7 +2228,7 @@ tp->stats.rx_packets++; } } - + /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ cur_rx = (cur_rx + rx_size + 4 + 3) & ~3; @@ -2330,8 +2299,6 @@ } } - - /* The interrupt handler does all of the Rx thread work and cleans up after the Tx thread. */ static void rtl8139_interrupt (int irq, void *dev_instance, @@ -2344,16 +2311,15 @@ int ackstat, status; int link_changed = 0; /* avoid bogus "uninit" warning */ - /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ + /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ if (dev == rtl_ecat_dev.dev) { - rt_spin_lock(&tp->lock); rtl_ecat_dev.intr_cnt++; } else { - spin_lock (&tp->lock); + spin_lock(&tp->lock); } /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ @@ -2424,13 +2390,9 @@ /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ - if (dev == rtl_ecat_dev.dev) + if (dev != rtl_ecat_dev.dev) { - rt_spin_unlock(&tp->lock); - } - else - { - spin_unlock(&tp->lock); + spin_unlock (&tp->lock); } /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ @@ -2439,15 +2401,6 @@ dev->name, RTL_R16 (IntrStatus)); } -/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ - -static void rt_rtl8139_interrupt(void) -{ - rtl8139_interrupt(rtl_ecat_dev.dev->irq, rtl_ecat_dev.dev, NULL); -} - -/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ - static int rtl8139_close (struct net_device *dev) { struct rtl8139_private *tp = dev->priv; @@ -2472,26 +2425,13 @@ wait_for_completion (&tp->thr_exited); } } - + /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ DPRINTK ("%s: Shutting down ethercard, status was 0x%4.4x.\n", dev->name, RTL_R16 (IntrStatus)); - /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ - - //mdelay(1); - - if (dev == rtl_ecat_dev.dev) - { - flags = rt_spin_lock_irqsave(&tp->lock); - } - else - { - spin_lock_irqsave(&tp->lock, flags); - } - - /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ + spin_lock_irqsave(&tp->lock, flags); /* Stop the chip's Tx and Rx DMA processes. */ RTL_W8 (ChipCmd, 0); @@ -2503,33 +2443,15 @@ tp->stats.rx_missed_errors += RTL_R32 (RxMissed); RTL_W32 (RxMissed, 0); + spin_unlock_irqrestore (&tp->lock, flags); + synchronize_irq (); + /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ - if (dev == rtl_ecat_dev.dev) - { - rt_spin_unlock_irqrestore (&tp->lock, flags); - synchronize_irq (); - } - else - { - spin_unlock_irqrestore (&tp->lock, flags); - synchronize_irq (); - } - - EC_DBG ("rtl8139: freeing irq"); - - //mdelay(1); - if (dev != rtl_ecat_dev.dev) { - free_irq (dev->irq, dev); - } - else - { - rt_disable_irq(dev->irq); - rt_free_global_irq (dev->irq); - rt_enable_irq(dev->irq); - } + free_irq(dev->irq, dev); + } /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ @@ -2744,7 +2666,7 @@ rc = -EFAULT; goto err_out_gregs; } - + if (regs.len > regs_len) regs.len = regs_len; if (regs.len < regs_len) { @@ -2868,22 +2790,12 @@ /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ - if (dev == rtl_ecat_dev.dev) + if (dev == rtl_ecat_dev.dev || netif_running(dev)) { - flags = rt_spin_lock_irqsave (&tp->lock); + spin_lock_irqsave (&tp->lock, flags); tp->stats.rx_missed_errors += RTL_R32 (RxMissed); RTL_W32 (RxMissed, 0); - rt_spin_unlock_irqrestore (&tp->lock, flags); - } - else - { - if (netif_running(dev)) - { - spin_lock_irqsave (&tp->lock, flags); - tp->stats.rx_missed_errors += RTL_R32 (RxMissed); - RTL_W32 (RxMissed, 0); - spin_unlock_irqrestore (&tp->lock, flags); - } + spin_unlock_irqrestore (&tp->lock, flags); } /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ @@ -2947,22 +2859,9 @@ unsigned long flags; struct rtl8139_private *tp = dev->priv; - /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ - - if (dev == rtl_ecat_dev.dev) - { - flags = rt_spin_lock_irqsave (&tp->lock); - __set_rx_mode(dev); - rt_spin_unlock_irqrestore (&tp->lock, flags); - } - else - { - spin_lock_irqsave (&tp->lock, flags); - __set_rx_mode(dev); - spin_unlock_irqrestore (&tp->lock, flags); - } - - /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ + spin_lock_irqsave (&tp->lock, flags); + __set_rx_mode(dev); + spin_unlock_irqrestore (&tp->lock, flags); } #ifdef CONFIG_PM diff -r 394c89f02e48 -r 6f2508af550c drivers/ec_dbg.h --- a/drivers/ec_dbg.h Fri Nov 04 09:38:50 2005 +0000 +++ b/drivers/ec_dbg.h Fri Nov 04 16:47:23 2005 +0000 @@ -6,16 +6,15 @@ #define ECMASTER_DEBUG -#include "../rs232dbg/rs232dbg.h" +//#include "../rs232dbg/rs232dbg.h" #ifdef ECMASTER_DEBUG /* note: prints function name for you */ //# define EC_DBG(fmt, args...) SDBG_print(fmt, ## args) -#define EC_DBG(fmt, args...) SDBG_print("%s: " fmt, __FUNCTION__ , ## args) -//#define EC_DBG(fmt, args...) printk(KERN_INFO fmt, ## args) - +//#define EC_DBG(fmt, args...) SDBG_print("%s: " fmt, __FUNCTION__ , ## args) +#define EC_DBG(fmt, args...) printk(fmt, ## args) #else #define EC_DBG(fmt, args...) #endif diff -r 394c89f02e48 -r 6f2508af550c drivers/ec_device.c --- a/drivers/ec_device.c Fri Nov 04 09:38:50 2005 +0000 +++ b/drivers/ec_device.c Fri Nov 04 16:47:23 2005 +0000 @@ -12,7 +12,6 @@ #include #include #include -#include #include #include "ec_device.h" @@ -22,7 +21,7 @@ /** EtherCAT-Geräte-Konstuktor. - + Initialisiert ein EtherCAT-Gerät, indem es die Variablen in der Struktur auf die Default-Werte setzt. @@ -48,7 +47,7 @@ /** EtherCAT-Geräte-Destuktor. - + Gibt den dynamisch allozierten Speicher des EtherCAT-Gerätes (die beiden Socket-Buffer) wieder frei. @@ -76,7 +75,7 @@ /** Weist einem EtherCAT-Gerät das entsprechende net_device zu. - + Prüft das net_device, allokiert Socket-Buffer in Sende- und Empfangsrichtung und weist dem EtherCAT-Gerät und den Socket-Buffern das net_device zu. @@ -280,6 +279,26 @@ /***************************************************************/ /** + Ruft manuell die Interrupt-Routine der Netzwerkkarte auf. + + @param ecd EtherCAT-Gerät + + @return Anzahl der kopierten Bytes bei Erfolg, sonst < 0 +*/ + +void EtherCAT_device_call_isr(EtherCAT_device_t *ecd) +{ + EC_DBG(KERN_DEBUG "EtherCAT: Calling ISR...\n"); + + // Manuell die ISR aufrufen + rtl8139_interrupt(0, ecd->dev, NULL); + + EC_DBG(KERN_DEBUG "EtherCAT: ISR finished.\n"); +} + +/***************************************************************/ + +/** Gibt alle Informationen über das Device-Objekt aus. @param ecd EtherCAT-Gerät diff -r 394c89f02e48 -r 6f2508af550c drivers/ec_device.h --- a/drivers/ec_device.h Fri Nov 04 09:38:50 2005 +0000 +++ b/drivers/ec_device.h Fri Nov 04 16:47:23 2005 +0000 @@ -78,6 +78,7 @@ int EtherCAT_device_send(EtherCAT_device_t *, unsigned char *, unsigned int); int EtherCAT_device_receive(EtherCAT_device_t *, unsigned char *, unsigned int); +void EtherCAT_device_call_isr(EtherCAT_device_t *); void EtherCAT_device_debug(EtherCAT_device_t *); diff -r 394c89f02e48 -r 6f2508af550c drivers/ec_master.c --- a/drivers/ec_master.c Fri Nov 04 09:38:50 2005 +0000 +++ b/drivers/ec_master.c Fri Nov 04 16:47:23 2005 +0000 @@ -18,9 +18,6 @@ #include "ec_master.h" #include "ec_dbg.h" -// FIXME: Klappt nur solange, wie es nur einen Master gibt! fp -static int ASYNC = 0; - /***************************************************************/ /** @@ -159,13 +156,12 @@ } else { - EC_DBG("EtherCAT: Slave count on bus: %i. Found: %i.\n", - cmd->working_counter, slave_count); + EC_DBG("EtherCAT: Found all %i slaves.\n", slave_count); } EtherCAT_remove_command(master, cmd); - // For every slave in the list + // For every slave in the list for (i = 0; i < slave_count; i++) { cur = &slaves[i]; @@ -239,21 +235,28 @@ if (EtherCAT_read_slave_information(master, cur->station_address, 0x0008, &cur->vendor_id) != 0) { - EC_DBG(KERN_ERR "EtherCAT: Could not read SII!\n"); + EC_DBG(KERN_ERR "EtherCAT: Could not read SII vendor id!\n"); return -1; } if (EtherCAT_read_slave_information(master, cur->station_address, 0x000A, &cur->product_code) != 0) { - EC_DBG(KERN_ERR "EtherCAT: Could not read SII!\n"); + EC_DBG(KERN_ERR "EtherCAT: Could not read SII product code!\n"); return -1; } if (EtherCAT_read_slave_information(master, cur->station_address, 0x000E, &cur->revision_number) != 0) { - EC_DBG(KERN_ERR "EtherCAT: Could not read SII!\n"); + EC_DBG(KERN_ERR "EtherCAT: Could not read SII revision number!\n"); + return -1; + } + + if (EtherCAT_read_slave_information(master, cur->station_address, + 0x0012, &cur->serial_number) != 0) + { + EC_DBG(KERN_ERR "EtherCAT: Could not read SII serial number!\n"); return -1; } @@ -284,7 +287,8 @@ if (!found) { - EC_DBG(KERN_ERR "EtherCAT: Unknown slave device (vendor %X, code %X) at position %i.\n", + EC_DBG(KERN_ERR "EtherCAT: Unknown slave device" + " (vendor %X, code %X) at position %i.\n", i, cur->vendor_id, cur->product_code); return -1; } @@ -312,8 +316,9 @@ slaves[i].process_data = master->process_data + pos; slaves[i].logical_address0 = pos; - EC_DBG(KERN_DEBUG "EtherCAT: Slave %i - \"%s %s\" - Logical Address 0x%08X\n", - i, slaves[i].desc->vendor_name, slaves[i].desc->product_name, pos); + EC_DBG(KERN_DEBUG "EtherCAT: Slave %i - Address 0x%X, \"%s %s\", s/n %u\n", + i, pos, slaves[i].desc->vendor_name, slaves[i].desc->product_name, + slaves[i].serial_number); pos += slaves[i].desc->data_length; } @@ -451,7 +456,7 @@ entsprechenden Antworten. @param master EtherCAT-Master - + @return 0 bei Erfolg, sonst < 0 */ @@ -459,28 +464,30 @@ { unsigned int wait_cycles; int i; - + // Send all commands for (i = 0; i < ECAT_NUM_RETRIES; i++) { - ASYNC = 1; if (EtherCAT_send(master) < 0) { return -1; } - ASYNC = 0; // Wait until something is received or an error has occurred + wait_cycles = 10; + EtherCAT_device_call_isr(master->dev); + while (master->dev->state == ECAT_DS_SENT && wait_cycles) { udelay(1000); wait_cycles--; - } - + EtherCAT_device_call_isr(master->dev); + } + //EC_DBG("Master async send: tries %d",tries_left); - + if (!wait_cycles) { EC_DBG(KERN_ERR "EtherCAT: Asynchronous receive timeout.\n"); @@ -492,7 +499,7 @@ EC_DBG(KERN_ERR "EtherCAT: Asyncronous send error. State %i\n", master->dev->state); continue; } - + // Receive all commands if (EtherCAT_receive(master) < 0) { @@ -518,7 +525,7 @@ Danach wird die Sendefunktion des EtherCAT-Gerätes aufgerufen. @param master EtherCAT-Master - + @return 0 bei Erfolg, sonst < 0 */ @@ -614,7 +621,7 @@ // Pad with zeros while (pos < 46) master->tx_data[pos++] = 0x00; - + master->tx_data_length = framelength; #ifdef DEBUG_SEND_RECEIVE @@ -635,7 +642,7 @@ { EC_DBG(KERN_DEBUG "device send...\n"); } - + // Send frame if (EtherCAT_device_send(master->dev, master->tx_data, framelength) != 0) { @@ -644,7 +651,7 @@ EC_DBG(KERN_DEBUG); for (i = 0; i < framelength; i++) { - EC_DBG("%02X ", master->tx_data[i]); + EC_DBG("%02X ", master->tx_data[i]); if ((i + 1) % 16 == 0) EC_DBG("\n" KERN_DEBUG); } EC_DBG("\n"); @@ -669,7 +676,7 @@ allen gesendeten Kommandos ihre Antworten zu. @param master EtherCAT-Master - + @return 0 bei Erfolg, sonst < 0 */ diff -r 394c89f02e48 -r 6f2508af550c drivers/ec_slave.c --- a/drivers/ec_slave.c Fri Nov 04 09:38:50 2005 +0000 +++ b/drivers/ec_slave.c Fri Nov 04 16:47:23 2005 +0000 @@ -37,9 +37,10 @@ slave->vendor_id = 0; slave->product_code = 0; slave->revision_number = 0; - + slave->serial_number = 0; + slave->desc = 0; - + slave->logical_address0 = 0; slave->current_state = ECAT_STATE_UNKNOWN; diff -r 394c89f02e48 -r 6f2508af550c drivers/ec_slave.h --- a/drivers/ec_slave.h Fri Nov 04 09:38:50 2005 +0000 +++ b/drivers/ec_slave.h Fri Nov 04 16:47:23 2005 +0000 @@ -18,6 +18,9 @@ /** EtherCAT-Slave + + Achtung: Bei Änderungen dieser Struktur immer das Define + ECAT_INIT_SLAVE anpassen! */ typedef struct @@ -35,6 +38,7 @@ unsigned int vendor_id; /**< Identifikationsnummer des Herstellers */ unsigned int product_code; /**< Herstellerspezifischer Produktcode */ unsigned int revision_number; /**< Revisionsnummer */ + unsigned int serial_number; /**< Seriennummer der Klemme */ const EtherCAT_slave_desc_t *desc; /**< Zeiger auf die Beschreibung des Slave-Typs */ @@ -49,7 +53,7 @@ } EtherCAT_slave_t; -#define ECAT_INIT_SLAVE(TYPE) {0, 0, 0, 0, 0, 0, 0, 0, \ +#define ECAT_INIT_SLAVE(TYPE) {0, 0, 0, 0, 0, 0, 0, 0, 0, \ TYPE, 0, ECAT_STATE_UNKNOWN, \ ECAT_STATE_UNKNOWN, NULL} diff -r 394c89f02e48 -r 6f2508af550c mini/Makefile --- a/mini/Makefile Fri Nov 04 09:38:50 2005 +0000 +++ b/mini/Makefile Fri Nov 04 16:47:23 2005 +0000 @@ -8,13 +8,18 @@ # #---------------------------------------------------------------- -MSRDIR = /vol/projekte/msr_messen_steuern_regeln -KERNELDIR = $(MSRDIR)/linux/kernel/2.4.20/include/linux-2.4.20.CX1100-rthal5 -CFLAGS = -O2 -Wall -Wuninitialized -D__KERNEL__ -DMODULE -I$(KERNELDIR)/include +EC_DIR = /vol/projekte/msr_messen_steuern_regeln/ethercat + +#KERNELDIR = $(EC_DIR)/linux-2.4.20.CX1100-rthal5-kdb +KERNELDIR = $(EC_DIR)/linux-2.4.20-kdb +#KERNELDIR = /usr/src/linux + +CFLAGS = -O2 -Wall -Wuninitialized -D__KERNEL__ \ + -DMODULE -I$(KERNELDIR)/include MODULE = ec_mini_mod.o -SRC = ec_mini.c +SRC = ec_mini.c OBJ = $(SRC:.c=.o) #---------------------------------------------------------------- diff -r 394c89f02e48 -r 6f2508af550c mini/ec_mini.c --- a/mini/ec_mini.c Fri Nov 04 09:38:50 2005 +0000 +++ b/mini/ec_mini.c Fri Nov 04 16:47:23 2005 +0000 @@ -12,19 +12,32 @@ #include #include #include +#include #include "../drivers/ec_master.h" #include "../drivers/ec_device.h" #include "../drivers/ec_types.h" #include "../drivers/ec_dbg.h" +/******************************************************************************/ + +#define ECAT_OPEN +#define ECAT_MASTER +#define ECAT_SLAVES +#define ECAT_CYCLIC_DATA + +/******************************************************************************/ + extern EtherCAT_device_t rtl_ecat_dev; -//static EtherCAT_master_t *ecat_master = NULL; - +#ifdef ECAT_MASTER +static EtherCAT_master_t *ecat_master = NULL; +#endif + +#ifdef ECAT_SLAVES +static EtherCAT_slave_t ecat_slaves[] = +{ #if 0 -static EtherCAT_slave_t ecat_slaves[] = -{ // Block 1 ECAT_INIT_SLAVE(Beckhoff_EK1100), ECAT_INIT_SLAVE(Beckhoff_EL4102), @@ -44,6 +57,7 @@ ECAT_INIT_SLAVE(Beckhoff_EL2004), ECAT_INIT_SLAVE(Beckhoff_EL2004), ECAT_INIT_SLAVE(Beckhoff_EL2004), +#endif // Block 2 ECAT_INIT_SLAVE(Beckhoff_EK1100), @@ -72,8 +86,13 @@ #define ECAT_SLAVES_COUNT (sizeof(ecat_slaves) / sizeof(EtherCAT_slave_t)) #endif +#ifdef ECAT_CYCLIC_DATA double value; int dig1; +struct tq_struct cyclic_task; +struct clientdata {task_queue *queue;} cyclic_data; +static DECLARE_COMPLETION(on_exit); +#endif /****************************************************************************** * @@ -81,7 +100,7 @@ * *****************************************************************************/ -#if 0 +#ifdef ECAT_CYCLIC_DATA static int next2004(int *wrap) { static int i = 0; @@ -109,20 +128,23 @@ /****************************************************************************** * - * Function: msr_controller + * Function: run * * Beschreibung: Zyklischer Prozess * *****************************************************************************/ -#if 0 -void msr_controller() -{ +#ifdef ECAT_CYCLIC_DATA +void run(void *ptr) +{ + struct clientdata *data = (struct clientdata *) ptr; + +#if 1 static int ms = 0; static int cnt = 0; static unsigned long int k = 0; static int firstrun = 1; - + static int klemme = 12; static int kanal = 0; static int up_down = 0; @@ -133,10 +155,10 @@ #if 0 ecat_tx_delay = ((unsigned int) (100000 / HZ) * (ecat_master->dev->tx_time-k)) - / (current_cpu_data.loops_per_jiffy / 10); + / (current_cpu_data.loops_per_jiffy / 10); ecat_rx_delay = ((unsigned int) (100000 / HZ) * (ecat_master->dev->rx_time-k)) - / (current_cpu_data.loops_per_jiffy / 10); - + / (current_cpu_data.loops_per_jiffy / 10); + rx_intr = ecat_master->dev->rx_intr_cnt; tx_intr = ecat_master->dev->tx_intr_cnt; total_intr = ecat_master->dev->intr_cnt; @@ -145,6 +167,8 @@ // Prozessdaten lesen if (!firstrun) { + klemme = next2004(&wrap); + EtherCAT_read_process_data(ecat_master); // Daten lesen und skalieren @@ -152,11 +176,13 @@ dig1 = EtherCAT_read_value(&ecat_master->slaves[3], 0); } +#if 0 // Daten schreiben EtherCAT_write_value(&ecat_master->slaves[4], 0, ms > 500 ? 1 : 0); EtherCAT_write_value(&ecat_master->slaves[4], 1, ms > 500 ? 0 : 1); EtherCAT_write_value(&ecat_master->slaves[4], 2, ms > 500 ? 0 : 1); EtherCAT_write_value(&ecat_master->slaves[4], 3, ms > 500 ? 1 : 0); +#endif if (cnt++ > 20) { @@ -168,7 +194,7 @@ klemme = next2004(&wrap); if (wrap == 1) - { + { if (up_down == 1) up_down = 0; else up_down = 1; } @@ -177,15 +203,29 @@ if (klemme >= 0) EtherCAT_write_value(&ecat_master->slaves[klemme], kanal,up_down); - - //EtherCAT_write_value(&ecat_master->slaves[13], 1, ms > 500 ? 0 : 1); - //EtherCAT_write_value(&ecat_master->slaves[14], 2, ms > 500 ? 0 : 1); - //EtherCAT_write_value(&ecat_master->slaves[15], 3, ms > 500 ? 1 : 0); - + +#if 0 + EtherCAT_write_value(&ecat_master->slaves[13], 1, ms > 500 ? 0 : 1); + EtherCAT_write_value(&ecat_master->slaves[14], 2, ms > 500 ? 0 : 1); + EtherCAT_write_value(&ecat_master->slaves[15], 3, ms > 500 ? 1 : 0); +#endif + // Prozessdaten schreiben rdtscl(k); EtherCAT_write_process_data(ecat_master); firstrun = 0; +#endif + + if (data->queue) + { + // Neu in die Taskqueue eintragen + queue_task(&cyclic_task, data->queue); + } + else + { + //last_queue_finished = 0; + complete(&on_exit); + } } #endif @@ -195,10 +235,8 @@ * ******************************************************************************/ -//#define ECAT_OPEN - int init() -{ +{ #ifdef ECAT_OPEN int rv = -1; #endif @@ -219,14 +257,13 @@ } if (!rtl_ecat_dev.dev) // Es gibt kein EtherCAT-Device - { + { EC_DBG(KERN_ERR "msr_modul: No EtherCAT device!\n"); goto out_close; } #endif -#if 0 - // EtherCAT-Master und Slaves initialisieren +#ifdef ECAT_MASTER EC_DBG("Initialising EtherCAT master\n"); if ((ecat_master = (EtherCAT_master_t *) kmalloc(sizeof(EtherCAT_master_t), GFP_KERNEL)) == 0) @@ -240,9 +277,11 @@ EC_DBG(KERN_ERR "EtherCAT could not init master!\n"); goto out_master; } -#endif - -#if 0 + + ecat_master->debug_level = 1; +#endif + +#ifdef ECAT_SLAVES EC_DBG("Checking EtherCAT slaves.\n"); if (EtherCAT_check_slaves(ecat_master, ecat_slaves, ECAT_SLAVES_COUNT) != 0) @@ -258,12 +297,15 @@ EC_DBG(KERN_ERR "EtherCAT: Could not activate slaves!\n"); goto out_masterclear; } - - // Zyklischen Aufruf starten - +#endif + +#ifdef ECAT_CYCLIC_DATA EC_DBG("Starting cyclic sample thread.\n"); - EtherCAT_write_process_data(ecat_master); + cyclic_task.routine = run; + cyclic_task.data = (void *) &cyclic_data; + cyclic_data.queue = &tq_timer; + queue_task(&cyclic_task, &tq_timer); EC_DBG("Initialised sample thread.\n"); #endif @@ -272,13 +314,13 @@ return 0; -#if 0 +#ifdef ECAT_SLAVES out_masterclear: EC_DBG(KERN_INFO "Clearing EtherCAT master.\n"); EtherCAT_master_clear(ecat_master); #endif -#if 0 +#ifdef ECAT_MASTER out_master: EC_DBG(KERN_INFO "Freeing EtherCAT master.\n"); kfree(ecat_master); @@ -304,14 +346,18 @@ { EC_DBG(KERN_INFO "=== Stopping Minimal EtherCAT environment... ===\n"); - // Noch einmal lesen - //EC_DBG(KERN_INFO "Reading process data.\n"); - //EtherCAT_read_process_data(ecat_master); - -#if 0 +#ifdef ECAT_MASTER if (ecat_master) { -#if 0 + //ecat_master->debug_level = 1; + +#ifdef ECAT_CYCLIC_DATA + cyclic_data.queue = NULL; + wait_for_completion(&on_exit); + EtherCAT_clear_process_data(ecat_master); +#endif + +#ifdef ECAT_SLAVES EC_DBG(KERN_INFO "Deactivating slaves.\n"); EtherCAT_deactivate_all_slaves(ecat_master); #endif diff -r 394c89f02e48 -r 6f2508af550c rs232dbg/Makefile --- a/rs232dbg/Makefile Fri Nov 04 09:38:50 2005 +0000 +++ b/rs232dbg/Makefile Fri Nov 04 16:47:23 2005 +0000 @@ -1,47 +1,22 @@ -#IgH -KERNELDIR = /vol/projekte/msr_messen_steuern_regeln/linux/kernel/2.4.20/include/linux-2.4.20.CX1100-rthal5 -RTAIDIR = /vol/projekte/msr_messen_steuern_regeln/linux/kernel/2.4.20/include/rtai-24.1.13 -RTLIBDIR = rt_lib -#euler-nottuln -#KERNELDIR = /usr/src/linux -#RTAIDIR = /usr/src/rtai +MSRDIR = /vol/projekte/msr_messen_steuern_regeln +ECATDIR = $(MSRDIR)/ethercat -#patra -#KERNELDIR = /usr/src/linux-2.4.20.CX1100-rthal5 -#RTAIDIR = /usr/src/rtai-24.1.13 +KERNELDIR = $(ECATDIR)/linux-2.4.20.CX1100-rthal5-kdb +RTAIDIR = $(MSRDIR)/linux/kernel/2.4.20/include/rtai-24.1.13 -RTLIBDIR=rt_lib - -#include $(KERNELDIR)/.config - -#CFLAGS = -DRTAI -D__KERNEL__ -DMODULE -I$(KERNELDIR)/include -I$(RTAIDIR)/include -I$(RTLIBDIR)/msr-include \ -# -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fomit-frame-pointer \ -# -pipe -mpreferred-stack-boundary=2 -march=i686 -nostdinc -iwithprefix include - -CFLAGS = -O2 -Wall -Wuninitialized -D__KERNEL__ -DMODULE -I$(KERNELDIR)/include -D_RTAI -I$(RTAIDIR)/include -I$(RTLIBDIR)/msr-include - -#CFLAGS += -DSIMULATION -#LDFLAGS = - -#VPATH = $(RTLIBDIR)/ +CFLAGS = -O2 -Wall -Wuninitialized -D__KERNEL__ -DMODULE \ + -I$(KERNELDIR)/include -D_RTAI -I$(RTAIDIR)/include -I$(RTLIBDIR)/msr-include TARGET = sdbg MODULE = $(TARGET).o SRC = rs232dbg.c aip_com.c -#Suchpfad für die Dateien aus dem RT-Lib-Verzeichnis -VPATH = $(RTLIBDIR)/msr-core:$(RTLIBDIR)/msr-control:$(RTLIBDIR)/msr-math:$(RTLIBDIR)/msr-misc:$(RTLIBDIR)/msr-utils - -#Datei aus dem RT-Libverzeichnis für dies Projekt -RTSRC = - -ALLSRC = $(SRC) $(RTSRC) +ALLSRC = $(SRC) OBJS = $(ALLSRC:.c=.o) - all: .depend $(TARGET).o Makefile $(TARGET).o: $(SRC:.c=.o) $(RTSRC:.c=.o) @@ -57,26 +32,6 @@ depend .depend dep: $(CC) $(CFLAGS) -M *.c > $@ - - - ifeq (.depend,$(wildcard .depend)) include .depend endif - - -#all: msr_module.o -# -#msr_io.o: msr_io.c msr_io.h -# $(CC) $(CFLAGS) -c -o $@ $< -# -#msr_module.o: msr_io.o -# $(LD) -r -o $@ $^ -# - -# $(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $< - - -#clean: -# rm -f *.o *~ core - diff -r 394c89f02e48 -r 6f2508af550c rs232dbg/aip_com.c --- a/rs232dbg/aip_com.c Fri Nov 04 09:38:50 2005 +0000 +++ b/rs232dbg/aip_com.c Fri Nov 04 16:47:23 2005 +0000 @@ -810,7 +810,7 @@ //void cleanup_module(void) Hm, IgH void cleanup_aip_com(void) { - int i; + unsigned int i; for (i = 0; i < RT_COM_CNT; i++) { struct rt_com_struct *p = &(rt_com_table[i]); if (0 < p->used) {