branch | kernel2.6 |
changeset 24 | d417dd9bdc2f |
parent 23 | 39364fbcd069 |
child 26 | 60435f959e5c |
23:39364fbcd069 | 24:d417dd9bdc2f |
---|---|
7 * $Date$ |
7 * $Date$ |
8 * $Author$ |
8 * $Author$ |
9 * |
9 * |
10 ***************************************************************/ |
10 ***************************************************************/ |
11 |
11 |
12 #include <linux/module.h> |
|
12 #include <linux/kernel.h> |
13 #include <linux/kernel.h> |
13 #include <linux/string.h> |
14 #include <linux/string.h> |
14 #include <linux/slab.h> |
15 #include <linux/slab.h> |
15 #include <linux/delay.h> |
16 #include <linux/delay.h> |
16 |
17 |
50 master->debug_level = 0; |
51 master->debug_level = 0; |
51 |
52 |
52 return 0; |
53 return 0; |
53 } |
54 } |
54 |
55 |
55 EXPORT_SYMBOL(EtherCAT_master_init); |
|
56 |
|
57 /***************************************************************/ |
56 /***************************************************************/ |
58 |
57 |
59 /** |
58 /** |
60 Destruktor eines EtherCAT-Masters. |
59 Destruktor eines EtherCAT-Masters. |
61 |
60 |
77 } |
76 } |
78 |
77 |
79 master->process_data_length = 0; |
78 master->process_data_length = 0; |
80 } |
79 } |
81 |
80 |
82 EXPORT_SYMBOL(EtherCAT_master_clear); |
|
83 |
|
84 /***************************************************************/ |
81 /***************************************************************/ |
85 |
82 |
86 /** |
83 /** |
87 Sendet ein einzelnes Kommando in einem Frame und |
84 Sendet ein einzelnes Kommando in einem Frame und |
88 wartet auf dessen Empfang. |
85 wartet auf dessen Empfang. |
96 int EtherCAT_simple_send_receive(EtherCAT_master_t *master, |
93 int EtherCAT_simple_send_receive(EtherCAT_master_t *master, |
97 EtherCAT_command_t *cmd) |
94 EtherCAT_command_t *cmd) |
98 { |
95 { |
99 unsigned int tries_left; |
96 unsigned int tries_left; |
100 |
97 |
98 // EC_DBG("ECAT send...\n"); //HM |
|
99 |
|
101 if (EtherCAT_simple_send(master, cmd) < 0) return -1; |
100 if (EtherCAT_simple_send(master, cmd) < 0) return -1; |
102 |
101 |
102 // EC_DBG("ECAT call isr \n"); //HM |
|
103 udelay(3); //FIXME nur zum Test HM |
|
104 |
|
103 EtherCAT_device_call_isr(master->dev); |
105 EtherCAT_device_call_isr(master->dev); |
104 |
106 |
105 tries_left = 1000; |
107 tries_left = 100; |
106 while (master->dev->state == ECAT_DS_SENT && tries_left) |
108 while (master->dev->state == ECAT_DS_SENT && tries_left) |
107 { |
109 { |
108 udelay(1); |
110 udelay(1); |
111 // EC_DBG("ECAT call isr \n"); //HM |
|
109 EtherCAT_device_call_isr(master->dev); |
112 EtherCAT_device_call_isr(master->dev); |
110 tries_left--; |
113 tries_left--; |
111 } |
114 } |
112 |
115 |
116 // EC_DBG("ECAT recieve \n"); //HM |
|
117 |
|
113 if (EtherCAT_simple_receive(master, cmd) < 0) return -1; |
118 if (EtherCAT_simple_receive(master, cmd) < 0) return -1; |
119 |
|
120 // EC_DBG("ECAT recieve done\n"); //HM |
|
114 |
121 |
115 return 0; |
122 return 0; |
116 } |
123 } |
117 |
124 |
118 /***************************************************************/ |
125 /***************************************************************/ |
500 master->slave_count = slave_count; |
507 master->slave_count = slave_count; |
501 |
508 |
502 return 0; |
509 return 0; |
503 } |
510 } |
504 |
511 |
505 EXPORT_SYMBOL(EtherCAT_check_slaves); |
|
506 |
|
507 /***************************************************************/ |
512 /***************************************************************/ |
508 |
513 |
509 /** |
514 /** |
510 Entfernt den Zeiger auf das Slave-Array. |
515 Entfernt den Zeiger auf das Slave-Array. |
511 |
516 |
633 return -2; |
638 return -2; |
634 } |
639 } |
635 |
640 |
636 if (cmd.working_counter != 1) |
641 if (cmd.working_counter != 1) |
637 { |
642 { |
638 EC_DBG(KERN_ERR "EtherCAT: Could not set state %02X - Device did not respond!\n", state_and_ack); |
643 EC_DBG(KERN_ERR "EtherCAT: Could not set state %02X - Device \"%s %s\" (%d) did not respond!\n", |
644 state_and_ack, |
|
645 slave->desc->vendor_name, |
|
646 slave->desc->product_name, |
|
647 slave->ring_position*(-1)); |
|
639 return -3; |
648 return -3; |
640 } |
649 } |
641 |
650 |
642 slave->requested_state = state_and_ack & 0x0F; |
651 slave->requested_state = state_and_ack & 0x0F; |
643 |
652 |
926 } |
935 } |
927 |
936 |
928 return 0; |
937 return 0; |
929 } |
938 } |
930 |
939 |
931 EXPORT_SYMBOL(EtherCAT_activate_all_slaves); |
|
932 |
|
933 /***************************************************************/ |
940 /***************************************************************/ |
934 |
941 |
935 /** |
942 /** |
936 Deaktiviert alle Slaves. |
943 Deaktiviert alle Slaves. |
937 |
944 |
955 } |
962 } |
956 } |
963 } |
957 |
964 |
958 return ret; |
965 return ret; |
959 } |
966 } |
960 |
|
961 EXPORT_SYMBOL(EtherCAT_deactivate_all_slaves); |
|
962 |
967 |
963 /***************************************************************/ |
968 /***************************************************************/ |
964 |
969 |
965 /** |
970 /** |
966 Sendet alle Prozessdaten an die Slaves. |
971 Sendet alle Prozessdaten an die Slaves. |
986 } |
991 } |
987 |
992 |
988 return 0; |
993 return 0; |
989 } |
994 } |
990 |
995 |
991 EXPORT_SYMBOL(EtherCAT_write_process_data); |
|
992 |
|
993 /***************************************************************/ |
996 /***************************************************************/ |
994 |
997 |
995 /** |
998 /** |
996 Empfängt alle Prozessdaten von den Slaves. |
999 Empfängt alle Prozessdaten von den Slaves. |
997 |
1000 |
1008 { |
1011 { |
1009 unsigned int tries_left; |
1012 unsigned int tries_left; |
1010 |
1013 |
1011 EtherCAT_device_call_isr(master->dev); |
1014 EtherCAT_device_call_isr(master->dev); |
1012 |
1015 |
1013 tries_left = 1000; |
1016 tries_left = 100; |
1014 while (master->dev->state == ECAT_DS_SENT && tries_left) |
1017 while (master->dev->state == ECAT_DS_SENT && tries_left) |
1015 { |
1018 { |
1016 udelay(1); |
1019 udelay(1); |
1017 EtherCAT_device_call_isr(master->dev); |
1020 EtherCAT_device_call_isr(master->dev); |
1018 tries_left--; |
1021 tries_left--; |
1041 master->process_data_length); |
1044 master->process_data_length); |
1042 |
1045 |
1043 return 0; |
1046 return 0; |
1044 } |
1047 } |
1045 |
1048 |
1046 EXPORT_SYMBOL(EtherCAT_read_process_data); |
|
1047 |
|
1048 /***************************************************************/ |
1049 /***************************************************************/ |
1049 |
1050 |
1050 /** |
1051 /** |
1051 Verwirft das zuletzt gesendete Prozessdatenkommando. |
1052 Verwirft das zuletzt gesendete Prozessdatenkommando. |
1052 |
1053 |
1057 { |
1058 { |
1058 EtherCAT_device_call_isr(master->dev); |
1059 EtherCAT_device_call_isr(master->dev); |
1059 master->dev->state = ECAT_DS_READY; |
1060 master->dev->state = ECAT_DS_READY; |
1060 } |
1061 } |
1061 |
1062 |
1062 EXPORT_SYMBOL(EtherCAT_clear_process_data); |
|
1063 |
|
1064 /***************************************************************/ |
1063 /***************************************************************/ |
1065 |
1064 |
1066 /** |
1065 /** |
1067 Gibt Frame-Inhalte zwecks Debugging aus. |
1066 Gibt Frame-Inhalte zwecks Debugging aus. |
1068 |
1067 |
1095 } |
1094 } |
1096 EC_DBG("\n"); |
1095 EC_DBG("\n"); |
1097 } |
1096 } |
1098 |
1097 |
1099 /***************************************************************/ |
1098 /***************************************************************/ |
1099 |
|
1100 EXPORT_SYMBOL(EtherCAT_master_init); |
|
1101 EXPORT_SYMBOL(EtherCAT_master_clear); |
|
1102 EXPORT_SYMBOL(EtherCAT_read_process_data); |
|
1103 EXPORT_SYMBOL(EtherCAT_write_process_data); |
|
1104 EXPORT_SYMBOL(EtherCAT_check_slaves); |
|
1105 EXPORT_SYMBOL(EtherCAT_activate_all_slaves); |
|
1106 EXPORT_SYMBOL(EtherCAT_clear_process_data); |
|
1107 EXPORT_SYMBOL(EtherCAT_deactivate_all_slaves); |