equal
deleted
inserted
replaced
57 /*****************************************************************************/ |
57 /*****************************************************************************/ |
58 |
58 |
59 // EtherCAT |
59 // EtherCAT |
60 static ec_master_t *master = NULL; |
60 static ec_master_t *master = NULL; |
61 static ec_master_state_t master_state = {}; |
61 static ec_master_state_t master_state = {}; |
62 spinlock_t master_lock = SPIN_LOCK_UNLOCKED; |
|
63 |
62 |
64 static ec_domain_t *domain1 = NULL; |
63 static ec_domain_t *domain1 = NULL; |
65 static ec_domain_state_t domain1_state = {}; |
64 static ec_domain_state_t domain1_state = {}; |
66 |
65 |
67 static ec_slave_config_t *sc_ana_in = NULL; |
66 static ec_slave_config_t *sc_ana_in = NULL; |
144 |
143 |
145 void check_domain1_state(void) |
144 void check_domain1_state(void) |
146 { |
145 { |
147 ec_domain_state_t ds; |
146 ec_domain_state_t ds; |
148 |
147 |
149 spin_lock(&master_lock); |
148 rt_sem_wait(&master_sem); |
150 ecrt_domain_state(domain1, &ds); |
149 ecrt_domain_state(domain1, &ds); |
151 spin_unlock(&master_lock); |
150 rt_sem_signal(&master_sem); |
152 |
151 |
153 if (ds.working_counter != domain1_state.working_counter) |
152 if (ds.working_counter != domain1_state.working_counter) |
154 printk(KERN_INFO PFX "Domain1: WC %u.\n", ds.working_counter); |
153 printk(KERN_INFO PFX "Domain1: WC %u.\n", ds.working_counter); |
155 if (ds.wc_state != domain1_state.wc_state) |
154 if (ds.wc_state != domain1_state.wc_state) |
156 printk(KERN_INFO PFX "Domain1: State %u.\n", ds.wc_state); |
155 printk(KERN_INFO PFX "Domain1: State %u.\n", ds.wc_state); |
162 |
161 |
163 void check_master_state(void) |
162 void check_master_state(void) |
164 { |
163 { |
165 ec_master_state_t ms; |
164 ec_master_state_t ms; |
166 |
165 |
167 spin_lock(&master_lock); |
166 rt_sem_wait(&master_sem); |
168 ecrt_master_state(master, &ms); |
167 ecrt_master_state(master, &ms); |
169 spin_unlock(&master_lock); |
168 rt_sem_signal(&master_sem); |
170 |
169 |
171 if (ms.slaves_responding != master_state.slaves_responding) |
170 if (ms.slaves_responding != master_state.slaves_responding) |
172 printk(KERN_INFO PFX "%u slave(s).\n", ms.slaves_responding); |
171 printk(KERN_INFO PFX "%u slave(s).\n", ms.slaves_responding); |
173 if (ms.al_states != master_state.al_states) |
172 if (ms.al_states != master_state.al_states) |
174 printk(KERN_INFO PFX "AL states: 0x%02X.\n", ms.al_states); |
173 printk(KERN_INFO PFX "AL states: 0x%02X.\n", ms.al_states); |
182 |
181 |
183 void check_slave_config_states(void) |
182 void check_slave_config_states(void) |
184 { |
183 { |
185 ec_slave_config_state_t s; |
184 ec_slave_config_state_t s; |
186 |
185 |
187 spin_lock(&master_lock); |
186 rt_sem_wait(&master_sem); |
188 ecrt_slave_config_state(sc_ana_in, &s); |
187 ecrt_slave_config_state(sc_ana_in, &s); |
189 spin_unlock(&master_lock); |
188 rt_sem_signal(&master_sem); |
190 |
189 |
191 if (s.al_state != sc_ana_in_state.al_state) |
190 if (s.al_state != sc_ana_in_state.al_state) |
192 printk(KERN_INFO PFX "AnaIn: State 0x%02X.\n", s.al_state); |
191 printk(KERN_INFO PFX "AnaIn: State 0x%02X.\n", s.al_state); |
193 if (s.online != sc_ana_in_state.online) |
192 if (s.online != sc_ana_in_state.online) |
194 printk(KERN_INFO PFX "AnaIn: %s.\n", s.online ? "online" : "offline"); |
193 printk(KERN_INFO PFX "AnaIn: %s.\n", s.online ? "online" : "offline"); |
242 } |
241 } |
243 } |
242 } |
244 |
243 |
245 /*****************************************************************************/ |
244 /*****************************************************************************/ |
246 |
245 |
247 int request_lock(void *data) |
246 void send_callback(ec_master_t *master) |
248 { |
247 { |
249 // too close to the next real time cycle: deny access... |
248 // too close to the next real time cycle: deny access... |
250 if (get_cycles() - t_last_cycle > t_critical) return -1; |
249 if (get_cycles() - t_last_cycle <= t_critical) { |
251 |
250 rt_sem_wait(&master_sem); |
252 // allow access |
251 ecrt_master_send_ext(master); |
253 rt_sem_wait(&master_sem); |
252 rt_sem_signal(&master_sem); |
254 return 0; |
253 } |
255 } |
254 } |
256 |
255 |
257 /*****************************************************************************/ |
256 /*****************************************************************************/ |
258 |
257 |
259 void release_lock(void *data) |
258 void receive_callback(ec_master_t *master) |
260 { |
259 { |
261 rt_sem_signal(&master_sem); |
260 // too close to the next real time cycle: deny access... |
|
261 if (get_cycles() - t_last_cycle <= t_critical) { |
|
262 rt_sem_wait(&master_sem); |
|
263 ecrt_master_receive(master); |
|
264 rt_sem_signal(&master_sem); |
|
265 } |
262 } |
266 } |
263 |
267 |
264 /*****************************************************************************/ |
268 /*****************************************************************************/ |
265 |
269 |
266 int __init init_mod(void) |
270 int __init init_mod(void) |
275 |
279 |
276 rt_sem_init(&master_sem, 1); |
280 rt_sem_init(&master_sem, 1); |
277 |
281 |
278 t_critical = cpu_khz * 1000 / FREQUENCY - cpu_khz * INHIBIT_TIME / 1000; |
282 t_critical = cpu_khz * 1000 / FREQUENCY - cpu_khz * INHIBIT_TIME / 1000; |
279 |
283 |
280 |
|
281 master = ecrt_request_master(0); |
284 master = ecrt_request_master(0); |
282 if (IS_ERR(master)) { |
285 if (IS_ERR(master)) { |
283 ret = PTR_ERR(master); |
286 ret = PTR_ERR(master); |
284 printk(KERN_ERR PFX "Requesting master 0 failed!\n"); |
287 printk(KERN_ERR PFX "Requesting master 0 failed!\n"); |
285 goto out_return; |
288 goto out_return; |
286 } |
289 } |
287 |
290 |
288 ecrt_master_callbacks(master, request_lock, release_lock, NULL); |
291 ecrt_master_callbacks(master, send_callback, receive_callback); |
289 |
292 |
290 printk(KERN_INFO PFX "Registering domain...\n"); |
293 printk(KERN_INFO PFX "Registering domain...\n"); |
291 if (!(domain1 = ecrt_master_create_domain(master))) { |
294 if (!(domain1 = ecrt_master_create_domain(master))) { |
292 printk(KERN_ERR PFX "Domain creation failed!\n"); |
295 printk(KERN_ERR PFX "Domain creation failed!\n"); |
293 goto out_release_master; |
296 goto out_release_master; |