master/module.c
changeset 91 0120d6214948
parent 88 98335157e54e
child 98 f564d0929292
equal deleted inserted replaced
90:044e97bce4bd 91:0120d6214948
    61    Init-Funktion des EtherCAT-Master-Treibermodules
    61    Init-Funktion des EtherCAT-Master-Treibermodules
    62 
    62 
    63    Initialisiert soviele Master, wie im Parameter ec_master_count
    63    Initialisiert soviele Master, wie im Parameter ec_master_count
    64    angegeben wurde (Default ist 1).
    64    angegeben wurde (Default ist 1).
    65 
    65 
    66    @returns 0, wenn alles o.k., -1 bei ungueltiger Anzahl Master
    66    \return 0 wenn alles ok, < 0 bei ungültiger Anzahl Master
    67    oder zu wenig Speicher.
    67            oder zu wenig Speicher.
    68 */
    68 */
    69 
    69 
    70 int __init ec_init_module(void)
    70 int __init ec_init_module(void)
    71 {
    71 {
    72     unsigned int i;
    72     unsigned int i;
   138  *****************************************************************************/
   138  *****************************************************************************/
   139 
   139 
   140 /**
   140 /**
   141    Registeriert das EtherCAT-Geraet fuer einen EtherCAT-Master.
   141    Registeriert das EtherCAT-Geraet fuer einen EtherCAT-Master.
   142 
   142 
   143    @param master_index Index des EtherCAT-Masters
   143    \return 0 wenn alles ok, oder < 0 wenn bereits ein Gerät registriert
   144    @param dev Das net_device des EtherCAT-Geraetes
   144            oder das Geraet nicht geöffnet werden konnte.
   145    @param isr Funktionszeiger auf die Interrupt-Service-Routine
       
   146    @param module Zeiger auf das Modul (fuer try_module_lock())
       
   147 
       
   148    @return 0, wenn alles o.k.,
       
   149    < 0, wenn bereits ein Geraet registriert oder das Geraet nicht
       
   150    geoeffnet werden konnte.
       
   151 */
   145 */
   152 
   146 
   153 ec_device_t *EtherCAT_dev_register(unsigned int master_index,
   147 ec_device_t *EtherCAT_dev_register(unsigned int master_index,
   154                                    struct net_device *dev,
   148                                    /**< Index des EtherCAT-Masters */
       
   149                                    struct net_device *net_dev,
       
   150                                    /**< net_device des EtherCAT-Gerätes */
   155                                    irqreturn_t (*isr)(int, void *,
   151                                    irqreturn_t (*isr)(int, void *,
   156                                                       struct pt_regs *),
   152                                                       struct pt_regs *),
   157                                    struct module *module)
   153                                    /**< Interrupt-Service-Routine */
   158 {
   154                                    struct module *module
   159     ec_device_t *ecd;
   155                                    /**< Zeiger auf das Modul */
       
   156                                    )
       
   157 {
       
   158     ec_device_t *device;
   160     ec_master_t *master;
   159     ec_master_t *master;
   161 
   160 
   162     if (master_index >= ec_master_count) {
   161     if (master_index >= ec_master_count) {
   163         EC_ERR("Master %i does not exist!\n", master_index);
   162         EC_ERR("Master %i does not exist!\n", master_index);
   164         return NULL;
   163         return NULL;
   165     }
   164     }
   166 
   165 
   167     if (!dev) {
   166     if (!net_dev) {
   168         EC_WARN("Device is NULL!\n");
   167         EC_WARN("Device is NULL!\n");
   169         return NULL;
   168         return NULL;
   170     }
   169     }
   171 
   170 
   172     master = ec_masters + master_index;
   171     master = ec_masters + master_index;
   174     if (master->device_registered) {
   173     if (master->device_registered) {
   175         EC_ERR("Master %i already has a device!\n", master_index);
   174         EC_ERR("Master %i already has a device!\n", master_index);
   176         return NULL;
   175         return NULL;
   177     }
   176     }
   178 
   177 
   179     ecd = &master->device;
   178     device = &master->device;
   180 
   179 
   181     if (ec_device_init(ecd, master) < 0) return NULL;
   180     if (ec_device_init(device, master) < 0) return NULL;
   182 
   181 
   183     ecd->dev = dev;
   182     device->dev = net_dev;
   184     ecd->tx_skb->dev = dev;
   183     device->tx_skb->dev = net_dev;
   185     ecd->isr = isr;
   184     device->isr = isr;
   186     ecd->module = module;
   185     device->module = module;
   187 
   186 
   188     master->device_registered = 1;
   187     master->device_registered = 1;
   189 
   188 
   190     return ecd;
   189     return device;
   191 }
   190 }
   192 
   191 
   193 /*****************************************************************************/
   192 /*****************************************************************************/
   194 
   193 
   195 /**
   194 /**
   196    Entfernt das EtherCAT-Geraet eines EtherCAT-Masters.
   195    Hebt die Registrierung eines EtherCAT-Gerätes auf.
   197 
   196 */
   198    @param master_index Der Index des EtherCAT-Masters
   197 
   199    @param ecd Das EtherCAT-Geraet
   198 void EtherCAT_dev_unregister(unsigned int master_index,
   200 */
   199                              /**< Index des EtherCAT-Masters */
   201 
   200                              ec_device_t *device
   202 void EtherCAT_dev_unregister(unsigned int master_index, ec_device_t *ecd)
   201                              /**< EtherCAT-Geraet */
       
   202                              )
   203 {
   203 {
   204     ec_master_t *master;
   204     ec_master_t *master;
   205 
   205 
   206     if (master_index >= ec_master_count) {
   206     if (master_index >= ec_master_count) {
   207         EC_WARN("Master %i does not exist!\n", master_index);
   207         EC_WARN("Master %i does not exist!\n", master_index);
   208         return;
   208         return;
   209     }
   209     }
   210 
   210 
   211     master = ec_masters + master_index;
   211     master = ec_masters + master_index;
   212 
   212 
   213     if (!master->device_registered || &master->device != ecd) {
   213     if (!master->device_registered || &master->device != device) {
   214         EC_WARN("Unable to unregister device!\n");
   214         EC_WARN("Unable to unregister device!\n");
   215         return;
   215         return;
   216     }
   216     }
   217 
   217 
   218     master->device_registered = 0;
   218     master->device_registered = 0;
   219     ec_device_clear(ecd);
   219     ec_device_clear(device);
   220 }
   220 }
   221 
   221 
   222 /******************************************************************************
   222 /******************************************************************************
   223  *
   223  *
   224  * Echtzeitschnittstelle
   224  * Echtzeitschnittstelle
   228 /**
   228 /**
   229    Reserviert einen bestimmten EtherCAT-Master und das zugehörige Gerät.
   229    Reserviert einen bestimmten EtherCAT-Master und das zugehörige Gerät.
   230 
   230 
   231    Gibt einen Zeiger auf den reservierten EtherCAT-Master zurueck.
   231    Gibt einen Zeiger auf den reservierten EtherCAT-Master zurueck.
   232 
   232 
   233    @param index Index des gewuenschten Masters
   233    \return Zeiger auf EtherCAT-Master oder NULL, wenn Parameter ungueltig.
   234    @returns Zeiger auf EtherCAT-Master oder NULL, wenn Parameter ungueltig.
   234 */
   235 */
   235 
   236 
   236 ec_master_t *EtherCAT_rt_request_master(unsigned int index
   237 ec_master_t *EtherCAT_rt_request_master(unsigned int index)
   237                                         /**< EtherCAT-Master-Index */
       
   238                                         )
   238 {
   239 {
   239     ec_master_t *master;
   240     ec_master_t *master;
   240 
   241 
   241     EC_INFO("===== Starting master %i... =====\n", index);
   242     EC_INFO("===== Starting master %i... =====\n", index);
   242 
   243 
   291 
   292 
   292 /*****************************************************************************/
   293 /*****************************************************************************/
   293 
   294 
   294 /**
   295 /**
   295    Gibt einen zuvor angeforderten EtherCAT-Master wieder frei.
   296    Gibt einen zuvor angeforderten EtherCAT-Master wieder frei.
   296 
   297 */
   297    @param master Zeiger auf den freizugebenden EtherCAT-Master.
   298 
   298 */
   299 void EtherCAT_rt_release_master(ec_master_t *master /**< EtherCAT-Masdter */)
   299 
       
   300 void EtherCAT_rt_release_master(ec_master_t *master)
       
   301 {
   300 {
   302     unsigned int i, found;
   301     unsigned int i, found;
   303 
   302 
   304     found = 0;
   303     found = 0;
   305     for (i = 0; i < ec_master_count; i++) {
   304     for (i = 0; i < ec_master_count; i++) {