26 @param slave Zeiger auf den zu initialisierenden Slave |
26 @param slave Zeiger auf den zu initialisierenden Slave |
27 */ |
27 */ |
28 |
28 |
29 void ec_slave_init(ec_slave_t *slave) |
29 void ec_slave_init(ec_slave_t *slave) |
30 { |
30 { |
31 slave->type = 0; |
31 slave->base_type = 0; |
32 slave->revision = 0; |
32 slave->base_revision = 0; |
33 slave->build = 0; |
33 slave->base_build = 0; |
34 slave->ring_position = 0; |
34 slave->ring_position = 0; |
35 slave->station_address = 0; |
35 slave->station_address = 0; |
36 slave->vendor_id = 0; |
36 slave->sii_vendor_id = 0; |
37 slave->product_code = 0; |
37 slave->sii_product_code = 0; |
38 slave->revision_number = 0; |
38 slave->sii_revision_number = 0; |
39 slave->serial_number = 0; |
39 slave->sii_serial_number = 0; |
40 slave->desc = NULL; |
40 slave->type = NULL; |
41 slave->logical_address = 0; |
41 slave->logical_address = 0; |
42 slave->current_state = EC_SLAVE_STATE_UNKNOWN; |
|
43 slave->requested_state = EC_SLAVE_STATE_UNKNOWN; |
|
44 slave->process_data = NULL; |
42 slave->process_data = NULL; |
|
43 slave->private_data = NULL; |
|
44 slave->configure = NULL; |
|
45 slave->registered = 0; |
45 slave->domain = 0; |
46 slave->domain = 0; |
46 slave->error_reported = 0; |
47 slave->error_reported = 0; |
47 } |
48 } |
48 |
|
49 /*****************************************************************************/ |
|
50 |
|
51 #if 0 |
|
52 /** |
|
53 Liest einen bestimmten Kanal des Slaves als Integer-Wert. |
|
54 |
|
55 Prüft zuerst, ob der entsprechende Slave eine |
|
56 bekannte Beschreibung besitzt, ob dort eine |
|
57 read()-Funktion hinterlegt ist und ob die angegebene |
|
58 Kanalnummer gültig ist. Wenn ja, wird der dekodierte |
|
59 Wert zurückgegeben, sonst ist der Wert 0. |
|
60 |
|
61 @param slave EtherCAT-Slave |
|
62 @param channel Kanalnummer |
|
63 |
|
64 @return Gelesener Wert bzw. 0 |
|
65 */ |
|
66 |
|
67 int EtherCAT_read_value(EtherCAT_slave_t *slave, |
|
68 unsigned int channel) |
|
69 { |
|
70 if (unlikely(!slave->desc)) { |
|
71 if (likely(slave->error_reported)) { |
|
72 printk(KERN_WARNING "EtherCAT: Reading failed on slave %04X (addr %0X)" |
|
73 " - Slave has no description.\n", |
|
74 slave->station_address, (unsigned int) slave); |
|
75 slave->error_reported = 1; |
|
76 } |
|
77 return 0; |
|
78 } |
|
79 |
|
80 if (unlikely(!slave->desc->read)) { |
|
81 if (likely(slave->error_reported)) { |
|
82 printk(KERN_WARNING "EtherCAT: Reading failed on slave %04X (addr %0X)" |
|
83 " - Slave type (%s %s) has no read method.\n", |
|
84 slave->station_address, (unsigned int) slave, |
|
85 slave->desc->vendor_name, slave->desc->product_name); |
|
86 slave->error_reported = 1; |
|
87 } |
|
88 return 0; |
|
89 } |
|
90 |
|
91 if (unlikely(channel >= slave->desc->channel_count)) { |
|
92 if (likely(slave->error_reported)) { |
|
93 printk(KERN_WARNING "EtherCAT: Reading failed on slave %4X (addr %0X)" |
|
94 " - Type (%s %s) has no channel %i.\n", |
|
95 slave->station_address, (unsigned int) slave, |
|
96 slave->desc->vendor_name, slave->desc->product_name, |
|
97 channel); |
|
98 slave->error_reported = 1; |
|
99 } |
|
100 return 0; |
|
101 } |
|
102 |
|
103 if (unlikely(!slave->process_data)) { |
|
104 if (likely(slave->error_reported)) { |
|
105 printk(KERN_WARNING "EtherCAT: Reading failed on slave %4X (addr %0X)" |
|
106 " - Slave does not belong to any process data object!\n", |
|
107 slave->station_address, (unsigned int) slave); |
|
108 slave->error_reported = 1; |
|
109 } |
|
110 return 0; |
|
111 } |
|
112 |
|
113 if (unlikely(slave->error_reported)) |
|
114 slave->error_reported = 0; |
|
115 |
|
116 return slave->desc->read(slave->process_data, channel); |
|
117 } |
|
118 |
|
119 /*****************************************************************************/ |
|
120 |
|
121 /** |
|
122 Schreibt einen bestimmten Kanal des Slaves als Integer-Wert . |
|
123 |
|
124 Prüft zuerst, ob der entsprechende Slave eine |
|
125 bekannte Beschreibung besitzt, ob dort eine |
|
126 write()-Funktion hinterlegt ist und ob die angegebene |
|
127 Kanalnummer gültig ist. Wenn ja, wird der Wert entsprechend |
|
128 kodiert und geschrieben. |
|
129 |
|
130 @param slave EtherCAT-Slave |
|
131 @param channel Kanalnummer |
|
132 @param value Zu schreibender Wert |
|
133 */ |
|
134 |
|
135 void EtherCAT_write_value(EtherCAT_slave_t *slave, |
|
136 unsigned int channel, |
|
137 int value) |
|
138 { |
|
139 if (unlikely(!slave->desc)) { |
|
140 if (likely(slave->error_reported)) { |
|
141 printk(KERN_WARNING "EtherCAT: Writing failed on slave %04X (addr %0X)" |
|
142 " - Slave has no description.\n", |
|
143 slave->station_address, (unsigned int) slave); |
|
144 slave->error_reported = 1; |
|
145 } |
|
146 return; |
|
147 } |
|
148 |
|
149 if (unlikely(!slave->desc->write)) { |
|
150 if (likely(slave->error_reported)) { |
|
151 printk(KERN_WARNING "EtherCAT: Writing failed on slave %04X (addr %0X)" |
|
152 " - Type (%s %s) has no write method.\n", |
|
153 slave->station_address, (unsigned int) slave, |
|
154 slave->desc->vendor_name, slave->desc->product_name); |
|
155 slave->error_reported = 1; |
|
156 } |
|
157 return; |
|
158 } |
|
159 |
|
160 if (unlikely(channel >= slave->desc->channel_count)) { |
|
161 if (likely(slave->error_reported)) { |
|
162 printk(KERN_WARNING "EtherCAT: Writing failed on slave %4X (addr %0X)" |
|
163 " - Type (%s %s) has no channel %i.\n", |
|
164 slave->station_address, (unsigned int) slave, |
|
165 slave->desc->vendor_name, slave->desc->product_name, |
|
166 channel); |
|
167 slave->error_reported = 1; |
|
168 } |
|
169 return; |
|
170 } |
|
171 |
|
172 if (unlikely(!slave->process_data)) { |
|
173 if (likely(slave->error_reported)) { |
|
174 printk(KERN_WARNING "EtherCAT: Writing failed on slave %4X (addr %0X)" |
|
175 " - Slave does not belong to any process data object!\n", |
|
176 slave->station_address, (unsigned int) slave); |
|
177 slave->error_reported = 1; |
|
178 } |
|
179 return; |
|
180 } |
|
181 |
|
182 if (unlikely(slave->error_reported)) |
|
183 slave->error_reported = 0; |
|
184 |
|
185 slave->desc->write(slave->process_data, channel, value); |
|
186 } |
|
187 |
|
188 /*****************************************************************************/ |
|
189 |
|
190 EXPORT_SYMBOL(EtherCAT_write_value); |
|
191 EXPORT_SYMBOL(EtherCAT_read_value); |
|
192 #endif |
|
193 |
49 |
194 /*****************************************************************************/ |
50 /*****************************************************************************/ |
195 |
51 |
196 /* Emacs-Konfiguration |
52 /* Emacs-Konfiguration |
197 ;;; Local Variables: *** |
53 ;;; Local Variables: *** |