master/domain.c
changeset 446 8fede404c01f
parent 416 4f007cd2a79d
child 448 e4b76dc7910c
equal deleted inserted replaced
445:3b7eec329112 446:8fede404c01f
   137     ec_datagram_t *datagram, *next;
   137     ec_datagram_t *datagram, *next;
   138     ec_domain_t *domain;
   138     ec_domain_t *domain;
   139 
   139 
   140     domain = container_of(kobj, ec_domain_t, kobj);
   140     domain = container_of(kobj, ec_domain_t, kobj);
   141 
   141 
   142     EC_INFO("Clearing domain %i.\n", domain->index);
       
   143 
       
   144     list_for_each_entry_safe(datagram, next, &domain->datagrams, list) {
   142     list_for_each_entry_safe(datagram, next, &domain->datagrams, list) {
   145         ec_datagram_clear(datagram);
   143         ec_datagram_clear(datagram);
   146         kfree(datagram);
   144         kfree(datagram);
   147     }
   145     }
   148 
   146 
   220     data_reg->sync = sync;
   218     data_reg->sync = sync;
   221     data_reg->sync_offset = byte_offset;
   219     data_reg->sync_offset = byte_offset;
   222     data_reg->data_ptr = data_ptr;
   220     data_reg->data_ptr = data_ptr;
   223 
   221 
   224     list_add_tail(&data_reg->list, &domain->data_regs);
   222     list_add_tail(&data_reg->list, &domain->data_regs);
       
   223 
       
   224     ec_slave_request_state(slave, EC_SLAVE_STATE_OP);
       
   225 
   225     return 0;
   226     return 0;
   226 }
   227 }
   227 
   228 
   228 /*****************************************************************************/
   229 /*****************************************************************************/
   229 
   230 
   295                    sync->index, slave->ring_position, sync_length);
   296                    sync->index, slave->ring_position, sync_length);
   296         }
   297         }
   297     }
   298     }
   298 
   299 
   299     list_add_tail(&data_reg->list, &domain->data_regs);
   300     list_add_tail(&data_reg->list, &domain->data_regs);
       
   301 
       
   302     ec_slave_request_state(slave, EC_SLAVE_STATE_OP);
       
   303 
   300     return 0;
   304     return 0;
   301 }
   305 }
   302 
   306 
   303 /*****************************************************************************/
   307 /*****************************************************************************/
   304 
   308 
   446 
   450 
   447 /**
   451 /**
   448    Places all process data datagrams in the masters datagram queue.
   452    Places all process data datagrams in the masters datagram queue.
   449 */
   453 */
   450 
   454 
   451 void ec_domain_queue(ec_domain_t *domain /**< EtherCAT domain */)
   455 void ec_domain_queue_datagrams(ec_domain_t *domain /**< EtherCAT domain */)
   452 {
   456 {
   453     ec_datagram_t *datagram;
   457     ec_datagram_t *datagram;
   454 
   458 
   455     list_for_each_entry(datagram, &domain->datagrams, list) {
   459     list_for_each_entry(datagram, &domain->datagrams, list) {
   456         ec_master_queue_datagram(domain->master, datagram);
   460         ec_master_queue_datagram(domain->master, datagram);
       
   461     }
       
   462 }
       
   463 
       
   464 /*****************************************************************************/
       
   465 
       
   466 /**
       
   467    Dequeues all datagrams from the masters datagram queue.
       
   468 */
       
   469 
       
   470 void ec_domain_dequeue_datagrams(ec_domain_t *domain /**< EtherCAT domain */)
       
   471 {
       
   472     ec_datagram_t *datagram;
       
   473 
       
   474     list_for_each_entry(datagram, &domain->datagrams, list) {
       
   475         if (!list_empty(&datagram->queue)) // datagram queued?
       
   476             list_del_init(&datagram->queue);
   457     }
   477     }
   458 }
   478 }
   459 
   479 
   460 /*****************************************************************************/
   480 /*****************************************************************************/
   461 
   481 
   516 
   536 
   517     // translate address and validate slave
   537     // translate address and validate slave
   518     if (!(slave = ecrt_master_get_slave(master, address))) return NULL;
   538     if (!(slave = ecrt_master_get_slave(master, address))) return NULL;
   519     if (ec_slave_validate(slave, vendor_id, product_code)) return NULL;
   539     if (ec_slave_validate(slave, vendor_id, product_code)) return NULL;
   520 
   540 
   521     if (!data_ptr) {
   541     if (!data_ptr) return slave;
   522         // data_ptr is NULL => mark slave as "registered" (do not warn)
       
   523         slave->registered = 1;
       
   524     }
       
   525 
   542 
   526     list_for_each_entry(pdo, &slave->sii_pdos, list) {
   543     list_for_each_entry(pdo, &slave->sii_pdos, list) {
   527         list_for_each_entry(entry, &pdo->entries, list) {
   544         list_for_each_entry(entry, &pdo->entries, list) {
   528             if (entry->index != pdo_index
   545             if (entry->index != pdo_index
   529                 || entry->subindex != pdo_subindex) continue;
   546                 || entry->subindex != pdo_subindex) continue;
   530 
   547 
   531             if (data_ptr) {
   548             if (ec_domain_reg_pdo_entry(domain, slave, pdo, entry, data_ptr)) {
   532                 ec_domain_reg_pdo_entry(domain, slave, pdo, entry, data_ptr);
   549                 return NULL;
   533             }
   550             }
   534 
   551 
   535             return slave;
   552             return slave;
   536         }
   553         }
   537     }
   554     }
   538 
   555 
   539     EC_ERR("Slave %i does not provide PDO 0x%04X:%i.\n",
   556     EC_ERR("Slave %i does not provide PDO 0x%04X:%i.\n",
   540            slave->ring_position, pdo_index, pdo_subindex);
   557            slave->ring_position, pdo_index, pdo_subindex);
   541     slave->registered = 0;
       
   542     return NULL;
   558     return NULL;
   543 }
   559 }
   544 
   560 
   545 /*****************************************************************************/
   561 /*****************************************************************************/
   546 
   562 
   607 
   623 
   608     // translate address and validate slave
   624     // translate address and validate slave
   609     if (!(slave = ecrt_master_get_slave(master, address))) return NULL;
   625     if (!(slave = ecrt_master_get_slave(master, address))) return NULL;
   610     if (ec_slave_validate(slave, vendor_id, product_code)) return NULL;
   626     if (ec_slave_validate(slave, vendor_id, product_code)) return NULL;
   611 
   627 
   612     if (!data_ptr) {
   628     if (!data_ptr) return slave;
   613         // data_ptr is NULL => mark slave as "registered" (do not warn)
       
   614         slave->registered = 1;
       
   615         return slave;
       
   616     }
       
   617 
   629 
   618     if (ec_domain_reg_pdo_range(domain, slave,
   630     if (ec_domain_reg_pdo_range(domain, slave,
   619                                 direction, offset, length, data_ptr)) {
   631                                 direction, offset, length, data_ptr)) {
   620         return NULL;
   632         return NULL;
   621     }
   633     }
   664                     domain->response_count);
   676                     domain->response_count);
   665         }
   677         }
   666         domain->working_counter_changes = 0;
   678         domain->working_counter_changes = 0;
   667     }
   679     }
   668 
   680 
   669     ec_domain_queue(domain);
   681     ec_domain_queue_datagrams(domain);
   670 }
   682 }
   671 
   683 
   672 /*****************************************************************************/
   684 /*****************************************************************************/
   673 
   685 
   674 /**
   686 /**