master/master.c
changeset 303 03fd45bc13ef
parent 298 d491d1f84ebc
child 305 03aab3068f08
equal deleted inserted replaced
302:ad630f38cca1 303:03fd45bc13ef
    66 /** \cond */
    66 /** \cond */
    67 
    67 
    68 EC_SYSFS_READ_ATTR(slave_count);
    68 EC_SYSFS_READ_ATTR(slave_count);
    69 EC_SYSFS_READ_ATTR(mode);
    69 EC_SYSFS_READ_ATTR(mode);
    70 EC_SYSFS_READ_WRITE_ATTR(eeprom_write_enable);
    70 EC_SYSFS_READ_WRITE_ATTR(eeprom_write_enable);
       
    71 EC_SYSFS_READ_WRITE_ATTR(debug_level);
    71 
    72 
    72 static struct attribute *ec_def_attrs[] = {
    73 static struct attribute *ec_def_attrs[] = {
    73     &attr_slave_count,
    74     &attr_slave_count,
    74     &attr_mode,
    75     &attr_mode,
    75     &attr_eeprom_write_enable,
    76     &attr_eeprom_write_enable,
       
    77     &attr_debug_level,
    76     NULL,
    78     NULL,
    77 };
    79 };
    78 
    80 
    79 static struct sysfs_ops ec_sysfs_ops = {
    81 static struct sysfs_ops ec_sysfs_ops = {
    80     .show = &ec_show_master_attribute,
    82     .show = &ec_show_master_attribute,
   315     unsigned int frame_count, more_datagrams_waiting;
   317     unsigned int frame_count, more_datagrams_waiting;
   316 
   318 
   317     frame_count = 0;
   319     frame_count = 0;
   318     t_start = get_cycles();
   320     t_start = get_cycles();
   319 
   321 
   320     if (unlikely(master->debug_level > 0))
   322     if (unlikely(master->debug_level > 1))
   321         EC_DBG("ec_master_send_datagrams\n");
   323         EC_DBG("ec_master_send_datagrams\n");
   322 
   324 
   323     do {
   325     do {
   324         // fetch pointer to transmit socket buffer
   326         // fetch pointer to transmit socket buffer
   325         frame_data = ec_device_tx_data(master->device);
   327         frame_data = ec_device_tx_data(master->device);
   341 
   343 
   342             datagram->state = EC_CMD_SENT;
   344             datagram->state = EC_CMD_SENT;
   343             datagram->t_sent = t_start;
   345             datagram->t_sent = t_start;
   344             datagram->index = master->datagram_index++;
   346             datagram->index = master->datagram_index++;
   345 
   347 
   346             if (unlikely(master->debug_level > 0))
   348             if (unlikely(master->debug_level > 1))
   347                 EC_DBG("adding datagram 0x%02X\n", datagram->index);
   349                 EC_DBG("adding datagram 0x%02X\n", datagram->index);
   348 
   350 
   349             // set "datagram following" flag in previous frame
   351             // set "datagram following" flag in previous frame
   350             if (follows_word)
   352             if (follows_word)
   351                 EC_WRITE_U16(follows_word, EC_READ_U16(follows_word) | 0x8000);
   353                 EC_WRITE_U16(follows_word, EC_READ_U16(follows_word) | 0x8000);
   367             EC_WRITE_U16(cur_data, 0x0000); // reset working counter
   369             EC_WRITE_U16(cur_data, 0x0000); // reset working counter
   368             cur_data += EC_DATAGRAM_FOOTER_SIZE;
   370             cur_data += EC_DATAGRAM_FOOTER_SIZE;
   369         }
   371         }
   370 
   372 
   371         if (cur_data - frame_data == EC_FRAME_HEADER_SIZE) {
   373         if (cur_data - frame_data == EC_FRAME_HEADER_SIZE) {
   372             if (unlikely(master->debug_level > 0))
   374             if (unlikely(master->debug_level > 1))
   373                 EC_DBG("nothing to send.\n");
   375                 EC_DBG("nothing to send.\n");
   374             break;
   376             break;
   375         }
   377         }
   376 
   378 
   377         // EtherCAT frame header
   379         // EtherCAT frame header
   380 
   382 
   381         // pad frame
   383         // pad frame
   382         while (cur_data - frame_data < ETH_ZLEN - ETH_HLEN)
   384         while (cur_data - frame_data < ETH_ZLEN - ETH_HLEN)
   383             EC_WRITE_U8(cur_data++, 0x00);
   385             EC_WRITE_U8(cur_data++, 0x00);
   384 
   386 
   385         if (unlikely(master->debug_level > 0))
   387         if (unlikely(master->debug_level > 1))
   386             EC_DBG("frame size: %i\n", cur_data - frame_data);
   388             EC_DBG("frame size: %i\n", cur_data - frame_data);
   387 
   389 
   388         // send frame
   390         // send frame
   389         ec_device_send(master->device, cur_data - frame_data);
   391         ec_device_send(master->device, cur_data - frame_data);
   390         frame_count++;
   392         frame_count++;
   391     }
   393     }
   392     while (more_datagrams_waiting);
   394     while (more_datagrams_waiting);
   393 
   395 
   394     if (unlikely(master->debug_level > 0)) {
   396     if (unlikely(master->debug_level > 1)) {
   395         t_end = get_cycles();
   397         t_end = get_cycles();
   396         EC_DBG("ec_master_send_datagrams sent %i frames in %ius.\n",
   398         EC_DBG("ec_master_send_datagrams sent %i frames in %ius.\n",
   397                frame_count, (unsigned int) (t_end - t_start) * 1000 / cpu_khz);
   399                frame_count, (unsigned int) (t_end - t_start) * 1000 / cpu_khz);
   398     }
   400     }
   399 }
   401 }
   778 {
   780 {
   779     size_t sync_size;
   781     size_t sync_size;
   780 
   782 
   781     sync_size = ec_slave_calc_eeprom_sync_size(slave, sync);
   783     sync_size = ec_slave_calc_eeprom_sync_size(slave, sync);
   782 
   784 
       
   785     if (slave->master->debug_level) {
       
   786         EC_INFO("Slave %i, sync manager %i:\n", slave->ring_position,
       
   787                 sync->index);
       
   788         EC_INFO("  Address: 0x%04X\n", sync->physical_start_address);
       
   789         EC_INFO("     Size: %i\n", sync_size);
       
   790         EC_INFO("  Control: 0x%02X\n", sync->control_register);
       
   791     }
       
   792 
   783     EC_WRITE_U16(data,     sync->physical_start_address);
   793     EC_WRITE_U16(data,     sync->physical_start_address);
   784     EC_WRITE_U16(data + 2, sync_size);
   794     EC_WRITE_U16(data + 2, sync_size);
   785     EC_WRITE_U8 (data + 4, sync->control_register);
   795     EC_WRITE_U8 (data + 4, sync->control_register);
   786     EC_WRITE_U8 (data + 5, 0x00); // status byte (read only)
   796     EC_WRITE_U8 (data + 5, 0x00); // status byte (read only)
   787     EC_WRITE_U16(data + 6, sync->enable ? 0x0001 : 0x0000); // enable
   797     EC_WRITE_U16(data + 6, sync->enable ? 0x0001 : 0x0000); // enable
   839                 return sprintf(buffer, "FREERUN\n");
   849                 return sprintf(buffer, "FREERUN\n");
   840             case EC_MASTER_MODE_RUNNING:
   850             case EC_MASTER_MODE_RUNNING:
   841                 return sprintf(buffer, "RUNNING\n");
   851                 return sprintf(buffer, "RUNNING\n");
   842         }
   852         }
   843     }
   853     }
       
   854     else if (attr == &attr_debug_level) {
       
   855         return sprintf(buffer, "%i\n", master->debug_level);
       
   856     }
   844 
   857 
   845     return 0;
   858     return 0;
   846 }
   859 }
   847 
   860 
   848 /*****************************************************************************/
   861 /*****************************************************************************/
   876 
   889 
   877         if (master->eeprom_write_enable) {
   890         if (master->eeprom_write_enable) {
   878             master->eeprom_write_enable = 0;
   891             master->eeprom_write_enable = 0;
   879             EC_INFO("Slave EEPROM writing disabled.\n");
   892             EC_INFO("Slave EEPROM writing disabled.\n");
   880         }
   893         }
       
   894     }
       
   895     else if (attr == &attr_debug_level) {
       
   896         if (!strcmp(buffer, "0\n")) {
       
   897             master->debug_level = 0;
       
   898         }
       
   899         else if (!strcmp(buffer, "1\n")) {
       
   900             master->debug_level = 1;
       
   901         }
       
   902         else if (!strcmp(buffer, "2\n")) {
       
   903             master->debug_level = 2;
       
   904         }
       
   905         else {
       
   906             EC_ERR("Invalid debug level value!\n");
       
   907             return -EINVAL;
       
   908         }
       
   909 
       
   910         EC_INFO("Master debug level set to %i.\n", master->debug_level);
       
   911         return size;
   881     }
   912     }
   882 
   913 
   883     return -EINVAL;
   914     return -EINVAL;
   884 }
   915 }
   885 
   916 
  1159                            eeprom_sync->index, slave->ring_position);
  1190                            eeprom_sync->index, slave->ring_position);
  1160                     return -1;
  1191                     return -1;
  1161                 }
  1192                 }
  1162             }
  1193             }
  1163         }
  1194         }
       
  1195 
  1164         else if (type) { // known slave type, take type's SM information
  1196         else if (type) { // known slave type, take type's SM information
  1165             for (j = 0; type->sync_managers[j] && j < EC_MAX_SYNC; j++) {
  1197             for (j = 0; type->sync_managers[j] && j < EC_MAX_SYNC; j++) {
  1166                 sync = type->sync_managers[j];
  1198                 sync = type->sync_managers[j];
  1167                 if (ec_datagram_npwr(datagram, slave->station_address,
  1199                 if (ec_datagram_npwr(datagram, slave->station_address,
  1168                                      0x0800 + j * EC_SYNC_SIZE, EC_SYNC_SIZE))
  1200                                      0x0800 + j * EC_SYNC_SIZE, EC_SYNC_SIZE))
  1173                            j, slave->ring_position);
  1205                            j, slave->ring_position);
  1174                     return -1;
  1206                     return -1;
  1175                 }
  1207                 }
  1176             }
  1208             }
  1177         }
  1209         }
  1178         else { // no sync manager information; guess mailbox settings
  1210 
       
  1211         // no sync manager information; guess mailbox settings
       
  1212         else if (slave->sii_mailbox_protocols) { 
  1179             mbox_sync.physical_start_address =
  1213             mbox_sync.physical_start_address =
  1180                 slave->sii_rx_mailbox_offset;
  1214                 slave->sii_rx_mailbox_offset;
  1181             mbox_sync.length = slave->sii_rx_mailbox_size;
  1215             mbox_sync.length = slave->sii_rx_mailbox_size;
  1182             mbox_sync.control_register = 0x26;
  1216             mbox_sync.control_register = 0x26;
  1183             mbox_sync.enable = 1;
  1217             mbox_sync.enable = 1;