22 |
22 |
23 /** |
23 /** |
24 Konstruktor des EtherCAT-Masters. |
24 Konstruktor des EtherCAT-Masters. |
25 |
25 |
26 @param master Zeiger auf den zu initialisierenden |
26 @param master Zeiger auf den zu initialisierenden |
27 EtherCAT-Master |
27 EtherCAT-Master |
28 @param dev Zeiger auf das EtherCAT-Gerät, mit dem der |
|
29 Master arbeiten soll |
|
30 |
28 |
31 @return 0 bei Erfolg, sonst < 0 (= dev ist NULL) |
29 @return 0 bei Erfolg, sonst < 0 (= dev ist NULL) |
32 */ |
30 */ |
33 |
31 |
34 int EtherCAT_master_init(EtherCAT_master_t *master, |
32 void EtherCAT_master_init(EtherCAT_master_t *master) |
35 EtherCAT_device_t *dev) |
33 { |
36 { |
|
37 if (!dev) |
|
38 { |
|
39 printk(KERN_ERR "EtherCAT: Master init without device!\n"); |
|
40 return -1; |
|
41 } |
|
42 |
|
43 master->slaves = NULL; |
34 master->slaves = NULL; |
44 master->slave_count = 0; |
35 master->slave_count = 0; |
45 master->dev = dev; |
36 master->dev = NULL; |
46 master->command_index = 0x00; |
37 master->command_index = 0x00; |
47 master->tx_data_length = 0; |
38 master->tx_data_length = 0; |
48 master->process_data = NULL; |
39 master->process_data = NULL; |
49 master->process_data_length = 0; |
40 master->process_data_length = 0; |
50 master->debug_level = 0; |
41 master->debug_level = 0; |
51 |
|
52 return 0; |
|
53 } |
42 } |
54 |
43 |
55 /***************************************************************/ |
44 /***************************************************************/ |
56 |
45 |
57 /** |
46 /** |
73 kfree(master->process_data); |
62 kfree(master->process_data); |
74 master->process_data = NULL; |
63 master->process_data = NULL; |
75 } |
64 } |
76 |
65 |
77 master->process_data_length = 0; |
66 master->process_data_length = 0; |
|
67 } |
|
68 |
|
69 /***************************************************************/ |
|
70 |
|
71 /** |
|
72 Setzt das EtherCAT-Geraet, auf dem der Master arbeitet. |
|
73 |
|
74 Registriert das Geraet beim master, der es daraufhin oeffnet. |
|
75 |
|
76 @param master Der EtherCAT-Master |
|
77 @param device Das EtherCAT-Geraet |
|
78 @return 0, wenn alles o.k., |
|
79 < 0, wenn bereits ein Geraet registriert |
|
80 oder das Geraet nicht geoeffnet werden konnte. |
|
81 */ |
|
82 |
|
83 int EtherCAT_register_device(EtherCAT_master_t *master, |
|
84 EtherCAT_device_t *device) |
|
85 { |
|
86 if (!master || !device) |
|
87 { |
|
88 printk(KERN_ERR "EtherCAT: Illegal parameters for register_device()!\n"); |
|
89 return -1; |
|
90 } |
|
91 |
|
92 if (master->dev) |
|
93 { |
|
94 printk(KERN_ERR "EtherCAT: Master already has a device.\n"); |
|
95 return -1; |
|
96 } |
|
97 |
|
98 if (EtherCAT_device_open(device) < 0) |
|
99 { |
|
100 printk(KERN_ERR "EtherCAT: Could not open device %X!\n", |
|
101 (unsigned int) master->dev); |
|
102 return -1; |
|
103 } |
|
104 |
|
105 master->dev = device; |
|
106 |
|
107 return 0; |
|
108 } |
|
109 |
|
110 /***************************************************************/ |
|
111 |
|
112 /** |
|
113 Loescht das EtherCAT-Geraet, auf dem der Master arbeitet. |
|
114 |
|
115 @param master Der EtherCAT-Master |
|
116 @param device Das EtherCAT-Geraet |
|
117 */ |
|
118 |
|
119 void EtherCAT_unregister_device(EtherCAT_master_t *master, |
|
120 EtherCAT_device_t *device) |
|
121 { |
|
122 if (master->dev != device) |
|
123 { |
|
124 printk(KERN_WARNING "EtherCAT: Trying to unregister unknown device.\n"); |
|
125 return; |
|
126 } |
|
127 |
|
128 if (EtherCAT_device_close(master->dev) < 0) |
|
129 { |
|
130 printk(KERN_WARNING "EtherCAT: Could not close device!\n"); |
|
131 } |
|
132 |
|
133 master->dev = NULL; |
78 } |
134 } |
79 |
135 |
80 /***************************************************************/ |
136 /***************************************************************/ |
81 |
137 |
82 /** |
138 /** |
323 EtherCAT_command_t cmd; |
379 EtherCAT_command_t cmd; |
324 EtherCAT_slave_t *cur; |
380 EtherCAT_slave_t *cur; |
325 unsigned int i, j, found, length, pos; |
381 unsigned int i, j, found, length, pos; |
326 unsigned char data[2]; |
382 unsigned char data[2]; |
327 |
383 |
328 // EtherCAT_clear_slaves() must be called before! |
|
329 if (master->slaves || master->slave_count) |
|
330 { |
|
331 printk(KERN_ERR "EtherCAT duplicate slave check!"); |
|
332 return -1; |
|
333 } |
|
334 |
|
335 // No slaves. |
|
336 if (slave_count == 0) |
384 if (slave_count == 0) |
337 { |
385 { |
338 printk(KERN_ERR "EtherCAT: No slaves in list!"); |
386 printk(KERN_ERR "EtherCAT: No slaves in list!\n"); |
339 return -1; |
387 return -1; |
340 } |
388 } |
341 |
389 |
342 // Determine number of slaves on bus |
390 // Determine number of slaves on bus |
343 |
391 |
1088 |
1136 |
1089 /***************************************************************/ |
1137 /***************************************************************/ |
1090 |
1138 |
1091 EXPORT_SYMBOL(EtherCAT_master_init); |
1139 EXPORT_SYMBOL(EtherCAT_master_init); |
1092 EXPORT_SYMBOL(EtherCAT_master_clear); |
1140 EXPORT_SYMBOL(EtherCAT_master_clear); |
|
1141 EXPORT_SYMBOL(EtherCAT_register_device); |
|
1142 EXPORT_SYMBOL(EtherCAT_unregister_device); |
1093 EXPORT_SYMBOL(EtherCAT_read_process_data); |
1143 EXPORT_SYMBOL(EtherCAT_read_process_data); |
1094 EXPORT_SYMBOL(EtherCAT_write_process_data); |
1144 EXPORT_SYMBOL(EtherCAT_write_process_data); |
1095 EXPORT_SYMBOL(EtherCAT_check_slaves); |
1145 EXPORT_SYMBOL(EtherCAT_check_slaves); |
1096 EXPORT_SYMBOL(EtherCAT_activate_all_slaves); |
1146 EXPORT_SYMBOL(EtherCAT_activate_all_slaves); |
1097 EXPORT_SYMBOL(EtherCAT_clear_process_data); |
1147 EXPORT_SYMBOL(EtherCAT_clear_process_data); |
1098 EXPORT_SYMBOL(EtherCAT_deactivate_all_slaves); |
1148 EXPORT_SYMBOL(EtherCAT_deactivate_all_slaves); |
|
1149 |
|
1150 /***************************************************************/ |