equal
deleted
inserted
replaced
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; |