master/master.c
changeset 661 bc1de1362efb
parent 659 d7c5a958bad0
child 663 38d9c37664d9
equal deleted inserted replaced
660:582a90a34303 661:bc1de1362efb
   152 
   152 
   153     init_timer(&master->eoe_timer);
   153     init_timer(&master->eoe_timer);
   154     master->eoe_timer.function = ec_master_eoe_run;
   154     master->eoe_timer.function = ec_master_eoe_run;
   155     master->eoe_timer.data = (unsigned long) master;
   155     master->eoe_timer.data = (unsigned long) master;
   156     master->eoe_running = 0;
   156     master->eoe_running = 0;
   157     master->eoe_checked = 0;
       
   158     INIT_LIST_HEAD(&master->eoe_handlers);
   157     INIT_LIST_HEAD(&master->eoe_handlers);
   159 
   158 
   160     master->internal_lock = SPIN_LOCK_UNLOCKED;
   159     master->internal_lock = SPIN_LOCK_UNLOCKED;
   161     master->request_cb = NULL;
   160     master->request_cb = NULL;
   162     master->release_cb = NULL;
   161     master->release_cb = NULL;
   227 
   226 
   228 void ec_master_clear(
   227 void ec_master_clear(
   229         ec_master_t *master /**< EtherCAT master */
   228         ec_master_t *master /**< EtherCAT master */
   230         )
   229         )
   231 {
   230 {
   232     ec_eoe_t *eoe, *next_eoe;
   231     ec_master_clear_eoe_handlers(master);
   233     ec_datagram_t *datagram, *next_datagram;
       
   234 
       
   235     ec_master_destroy_slaves(master);
   232     ec_master_destroy_slaves(master);
   236     ec_master_destroy_domains(master);
   233     ec_master_destroy_domains(master);
   237 
       
   238     // list of EEPROM requests is empty,
       
   239     // otherwise master could not be cleared.
       
   240 
       
   241     // dequeue all datagrams
       
   242     list_for_each_entry_safe(datagram, next_datagram,
       
   243                              &master->datagram_queue, queue) {
       
   244         datagram->state = EC_DATAGRAM_ERROR;
       
   245         list_del_init(&datagram->queue);
       
   246     }
       
   247 
       
   248     ec_fsm_master_clear(&master->fsm);
   234     ec_fsm_master_clear(&master->fsm);
   249     ec_datagram_clear(&master->fsm_datagram);
   235     ec_datagram_clear(&master->fsm_datagram);
   250 
   236     ec_device_clear(&master->backup_device);
   251     // clear EoE objects
   237     ec_device_clear(&master->main_device);
   252     list_for_each_entry_safe(eoe, next_eoe, &master->eoe_handlers, list) {
   238 
       
   239     // destroy self
       
   240     kobject_del(&master->kobj);
       
   241     kobject_put(&master->kobj);
       
   242 }
       
   243 
       
   244 /*****************************************************************************/
       
   245 
       
   246 /**
       
   247  * Clear and free all EoE handlers.
       
   248  */
       
   249 
       
   250 void ec_master_clear_eoe_handlers(
       
   251         ec_master_t *master /**< EtherCAT master */
       
   252         )
       
   253 {
       
   254     ec_eoe_t *eoe, *next;
       
   255 
       
   256     list_for_each_entry_safe(eoe, next, &master->eoe_handlers, list) {
   253         list_del(&eoe->list);
   257         list_del(&eoe->list);
   254         ec_eoe_clear(eoe);
   258         ec_eoe_clear(eoe);
   255         kfree(eoe);
   259         kfree(eoe);
   256     }
   260     }
   257 
       
   258     ec_device_clear(&master->backup_device);
       
   259     ec_device_clear(&master->main_device);
       
   260 
       
   261     // destroy self
       
   262     kobject_del(&master->kobj);
       
   263     kobject_put(&master->kobj);
       
   264 
       
   265     EC_INFO("Master %u freed.\n", master->index);
       
   266 }
   261 }
   267 
   262 
   268 /*****************************************************************************/
   263 /*****************************************************************************/
   269 
   264 
   270 /**
   265 /**
   411  */
   406  */
   412 
   407 
   413 int ec_master_enter_operation_mode(ec_master_t *master /**< EtherCAT master */)
   408 int ec_master_enter_operation_mode(ec_master_t *master /**< EtherCAT master */)
   414 {
   409 {
   415     ec_slave_t *slave;
   410     ec_slave_t *slave;
       
   411     ec_eoe_t *eoe;
   416 
   412 
   417     down(&master->config_sem);
   413     down(&master->config_sem);
   418     master->allow_config = 0; // temporarily disable slave configuration
   414     master->allow_config = 0; // temporarily disable slave configuration
   419     up(&master->config_sem);
   415     up(&master->config_sem);
   420 
   416 
   444 
   440 
   445     // set states for all slaves
   441     // set states for all slaves
   446     list_for_each_entry(slave, &master->slaves, list) {
   442     list_for_each_entry(slave, &master->slaves, list) {
   447         ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP);
   443         ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP);
   448     }
   444     }
       
   445     // ... but set EoE slaves to OP
       
   446     list_for_each_entry(eoe, &master->eoe_handlers, list) {
       
   447         if (ec_eoe_is_open(eoe))
       
   448             ec_slave_request_state(eoe->slave, EC_SLAVE_STATE_OP);
       
   449     }
   449 
   450 
   450     if (master->debug_level)
   451     if (master->debug_level)
   451         EC_DBG("Switching to operation mode.\n");
   452         EC_DBG("Switching to operation mode.\n");
   452 
   453 
   453     master->mode = EC_MASTER_MODE_OPERATION;
   454     master->mode = EC_MASTER_MODE_OPERATION;
   454     master->pdo_slaves_offline = 0; // assume all PDO slaves online
   455     master->pdo_slaves_offline = 0; // assume all PDO slaves online
       
   456     master->ext_request_cb = NULL;
       
   457     master->ext_release_cb = NULL;
       
   458     master->ext_cb_data = NULL;
   455     return 0;
   459     return 0;
   456     
   460     
   457 out_allow:
   461 out_allow:
   458     master->allow_scan = 1;
   462     master->allow_scan = 1;
   459     master->allow_config = 1;
   463     master->allow_config = 1;
   468 
   472 
   469 void ec_master_leave_operation_mode(ec_master_t *master
   473 void ec_master_leave_operation_mode(ec_master_t *master
   470                                     /**< EtherCAT master */)
   474                                     /**< EtherCAT master */)
   471 {
   475 {
   472     ec_slave_t *slave;
   476     ec_slave_t *slave;
       
   477     ec_eoe_t *eoe;
   473 
   478 
   474     master->mode = EC_MASTER_MODE_IDLE;
   479     master->mode = EC_MASTER_MODE_IDLE;
   475 
   480 
   476     ec_master_eoe_stop(master);
   481     ec_master_eoe_stop(master);
   477     ec_master_thread_stop(master);
   482     ec_master_thread_stop(master);
   483     // set states for all slaves
   488     // set states for all slaves
   484     list_for_each_entry(slave, &master->slaves, list) {
   489     list_for_each_entry(slave, &master->slaves, list) {
   485         ec_slave_reset(slave);
   490         ec_slave_reset(slave);
   486         ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP);
   491         ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP);
   487     }
   492     }
       
   493     // ... but leave EoE slaves in OP
       
   494     list_for_each_entry(eoe, &master->eoe_handlers, list) {
       
   495         if (ec_eoe_is_open(eoe))
       
   496             ec_slave_request_state(eoe->slave, EC_SLAVE_STATE_OP);
       
   497     }
   488 
   498 
   489     ec_master_destroy_domains(master);
   499     ec_master_destroy_domains(master);
   490     
   500     
       
   501     if (ec_master_thread_start(master, ec_master_idle_thread))
       
   502         EC_WARN("Failed to restart master thread!\n");
       
   503     ec_master_eoe_start(master);
       
   504 
   491     master->allow_scan = 1;
   505     master->allow_scan = 1;
   492     master->allow_config = 1;
   506     master->allow_config = 1;
   493 
       
   494     if (ec_master_thread_start(master, ec_master_idle_thread)) {
       
   495         EC_WARN("Failed to restart master thread!\n");
       
   496     }
       
   497 }
   507 }
   498 
   508 
   499 /*****************************************************************************/
   509 /*****************************************************************************/
   500 
   510 
   501 /**
   511 /**
  1057    Starts Ethernet-over-EtherCAT processing on demand.
  1067    Starts Ethernet-over-EtherCAT processing on demand.
  1058 */
  1068 */
  1059 
  1069 
  1060 void ec_master_eoe_start(ec_master_t *master /**< EtherCAT master */)
  1070 void ec_master_eoe_start(ec_master_t *master /**< EtherCAT master */)
  1061 {
  1071 {
  1062     ec_eoe_t *eoe;
  1072     if (master->eoe_running) {
  1063     ec_slave_t *slave;
  1073         EC_WARN("EoE already running!\n");
  1064     unsigned int coupled, found;
  1074         return;
  1065 
  1075     }
  1066     if (master->eoe_running || master->eoe_checked) return;
  1076 
  1067 
  1077     if (list_empty(&master->eoe_handlers))
  1068     master->eoe_checked = 1;
  1078         return;
  1069 
  1079 
  1070     // decouple all EoE handlers
  1080     if (!master->request_cb || !master->release_cb) {
  1071     list_for_each_entry(eoe, &master->eoe_handlers, list)
  1081         EC_WARN("No EoE processing because of missing locking callbacks!\n");
  1072         eoe->slave = NULL;
       
  1073 
       
  1074     // couple a free EoE handler to every EoE-capable slave
       
  1075     coupled = 0;
       
  1076     list_for_each_entry(slave, &master->slaves, list) {
       
  1077         if (!(slave->sii_mailbox_protocols & EC_MBOX_EOE)) continue;
       
  1078 
       
  1079         found = 0;
       
  1080         list_for_each_entry(eoe, &master->eoe_handlers, list) {
       
  1081             if (eoe->slave) continue;
       
  1082             eoe->slave = slave;
       
  1083             found = 1;
       
  1084             coupled++;
       
  1085             EC_INFO("Coupling device %s to slave %i.\n",
       
  1086                     eoe->dev->name, slave->ring_position);
       
  1087             if (eoe->opened)
       
  1088                 ec_slave_request_state(slave, EC_SLAVE_STATE_OP);
       
  1089             else
       
  1090                 ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP);
       
  1091             break;
       
  1092         }
       
  1093 
       
  1094         if (!found) {
       
  1095             if (master->debug_level)
       
  1096                 EC_WARN("No EoE handler for slave %i!\n",
       
  1097                         slave->ring_position);
       
  1098             ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP);
       
  1099         }
       
  1100     }
       
  1101 
       
  1102     if (!coupled) {
       
  1103         EC_INFO("No EoE handlers coupled.\n");
       
  1104         return;
  1082         return;
  1105     }
  1083     }
  1106 
  1084 
  1107     EC_INFO("Starting EoE processing.\n");
  1085     EC_INFO("Starting EoE processing.\n");
  1108     master->eoe_running = 1;
  1086     master->eoe_running = 1;
  1109 
  1087 
  1110     // start EoE processing
  1088     // start EoE processing
  1111     master->eoe_timer.expires = jiffies + 10;
  1089     master->eoe_timer.expires = jiffies + 10;
  1112     add_timer(&master->eoe_timer);
  1090     add_timer(&master->eoe_timer);
  1113     return;
       
  1114 }
  1091 }
  1115 
  1092 
  1116 /*****************************************************************************/
  1093 /*****************************************************************************/
  1117 
  1094 
  1118 /**
  1095 /**
  1119    Stops the Ethernet-over-EtherCAT processing.
  1096    Stops the Ethernet-over-EtherCAT processing.
  1120 */
  1097 */
  1121 
  1098 
  1122 void ec_master_eoe_stop(ec_master_t *master /**< EtherCAT master */)
  1099 void ec_master_eoe_stop(ec_master_t *master /**< EtherCAT master */)
  1123 {
  1100 {
  1124     ec_eoe_t *eoe;
       
  1125 
       
  1126     master->eoe_checked = 0;
       
  1127 
       
  1128     if (!master->eoe_running) return;
  1101     if (!master->eoe_running) return;
  1129 
  1102 
  1130     EC_INFO("Stopping EoE processing.\n");
  1103     EC_INFO("Stopping EoE processing.\n");
  1131 
  1104 
  1132     del_timer_sync(&master->eoe_timer);
  1105     del_timer_sync(&master->eoe_timer);
  1133 
       
  1134     // decouple all EoE handlers
       
  1135     list_for_each_entry(eoe, &master->eoe_handlers, list) {
       
  1136         if (eoe->slave) {
       
  1137             ec_slave_request_state(eoe->slave, EC_SLAVE_STATE_PREOP);
       
  1138             eoe->slave = NULL;
       
  1139         }
       
  1140     }
       
  1141 
       
  1142     master->eoe_running = 0;
  1106     master->eoe_running = 0;
  1143 }
  1107 }
  1144 
  1108 
  1145 /*****************************************************************************/
  1109 /*****************************************************************************/
  1146 
  1110 
  1150 
  1114 
  1151 void ec_master_eoe_run(unsigned long data /**< master pointer */)
  1115 void ec_master_eoe_run(unsigned long data /**< master pointer */)
  1152 {
  1116 {
  1153     ec_master_t *master = (ec_master_t *) data;
  1117     ec_master_t *master = (ec_master_t *) data;
  1154     ec_eoe_t *eoe;
  1118     ec_eoe_t *eoe;
  1155     unsigned int active = 0;
  1119     unsigned int none_open = 1;
  1156     cycles_t cycles_start, cycles_end;
  1120     cycles_t cycles_start, cycles_end;
  1157     unsigned long restart_jiffies;
  1121     unsigned long restart_jiffies;
  1158 
  1122 
  1159     list_for_each_entry(eoe, &master->eoe_handlers, list) {
  1123     list_for_each_entry(eoe, &master->eoe_handlers, list) {
  1160         if (ec_eoe_active(eoe)) active++;
  1124         if (ec_eoe_is_open(eoe)) {
  1161     }
  1125             none_open = 0;
  1162     if (!active) goto queue_timer;
  1126             break;
       
  1127         }
       
  1128     }
       
  1129     if (none_open)
       
  1130         goto queue_timer;
  1163 
  1131 
  1164     // receive datagrams
  1132     // receive datagrams
  1165     if (master->request_cb(master->cb_data)) goto queue_timer;
  1133     if (master->request_cb(master->cb_data)) goto queue_timer;
  1166     cycles_start = get_cycles();
  1134     cycles_start = get_cycles();
  1167     ecrt_master_receive(master);
  1135     ecrt_master_receive(master);
  1286 /*****************************************************************************/
  1254 /*****************************************************************************/
  1287 
  1255 
  1288 /**
  1256 /**
  1289  * Translates an ASCII coded bus-address to a slave pointer.
  1257  * Translates an ASCII coded bus-address to a slave pointer.
  1290  * These are the valid addressing schemes:
  1258  * These are the valid addressing schemes:
  1291  * - \a "X" = the X. slave on the bus (ring position),
  1259  * - \a "X" = the Xth slave on the bus (ring position),
  1292  * - \a "X:Y" = the Y. slave after the X. branch (bus coupler),
       
  1293  * - \a "#X" = the slave with alias X,
  1260  * - \a "#X" = the slave with alias X,
  1294  * - \a "#X:Y" = the Y. slave after the branch (bus coupler) with alias X.
  1261  * - \a "#X:Y" = the Yth slave after the slave with alias X.
  1295  * X and Y are zero-based indices and may be provided in hexadecimal or octal
  1262  * X and Y are zero-based indices and may be provided in hexadecimal or octal
  1296  * notation (with respective prefix).
  1263  * notation (with appropriate prefix).
  1297  * \return pointer to the slave on success, else NULL
  1264  * \return pointer to the slave on success, else NULL
  1298  */
  1265  */
  1299 
  1266 
  1300 ec_slave_t *ec_master_parse_slave_address(
  1267 ec_slave_t *ec_master_parse_slave_address(
  1301         const ec_master_t *master, /**< EtherCAT master */
  1268         const ec_master_t *master, /**< EtherCAT master */
  1460     if (master->debug_level)
  1427     if (master->debug_level)
  1461         EC_DBG("FSM datagram is %x.\n", (unsigned int) &master->fsm_datagram);
  1428         EC_DBG("FSM datagram is %x.\n", (unsigned int) &master->fsm_datagram);
  1462 
  1429 
  1463     master->injection_seq_fsm = 0;
  1430     master->injection_seq_fsm = 0;
  1464     master->injection_seq_rt = 0;
  1431     master->injection_seq_rt = 0;
       
  1432     master->request_cb = master->ext_request_cb;
       
  1433     master->release_cb = master->ext_release_cb;
       
  1434     master->cb_data = master->ext_cb_data;
  1465     
  1435     
  1466     if (ec_master_thread_start(master, ec_master_operation_thread)) {
  1436     if (ec_master_thread_start(master, ec_master_operation_thread)) {
  1467         EC_ERR("Failed to start master thread!\n");
  1437         EC_ERR("Failed to start master thread!\n");
  1468         return -1;
  1438         return -1;
  1469     }
  1439     }
  1470 
  1440     ec_master_eoe_start(master);
  1471     return 0;
  1441     return 0;
  1472 }
  1442 }
  1473 
  1443 
  1474 /*****************************************************************************/
  1444 /*****************************************************************************/
  1475 
  1445 
  1575                            int (*request_cb)(void *), /**< request lock CB */
  1545                            int (*request_cb)(void *), /**< request lock CB */
  1576                            void (*release_cb)(void *), /**< release lock CB */
  1546                            void (*release_cb)(void *), /**< release lock CB */
  1577                            void *cb_data /**< data parameter */
  1547                            void *cb_data /**< data parameter */
  1578                            )
  1548                            )
  1579 {
  1549 {
  1580     master->request_cb = request_cb;
  1550     master->ext_request_cb = request_cb;
  1581     master->release_cb = release_cb;
  1551     master->ext_release_cb = release_cb;
  1582     master->cb_data = cb_data;
  1552     master->ext_cb_data = cb_data;
  1583 }
  1553 }
  1584 
  1554 
  1585 /*****************************************************************************/
  1555 /*****************************************************************************/
  1586 
  1556 
  1587 /**
  1557 /**