232 // write process data |
232 // write process data |
233 EC_WRITE_U8(domain1_pd + off_dig_out, blink ? 0x06 : 0x09); |
233 EC_WRITE_U8(domain1_pd + off_dig_out, blink ? 0x06 : 0x09); |
234 |
234 |
235 rt_sem_wait(&master_sem); |
235 rt_sem_wait(&master_sem); |
236 ecrt_domain_queue(domain1); |
236 ecrt_domain_queue(domain1); |
|
237 ecrt_master_send(master); |
237 rt_sem_signal(&master_sem); |
238 rt_sem_signal(&master_sem); |
238 ecrt_master_send(master); |
|
239 |
239 |
240 rt_task_wait_period(); |
240 rt_task_wait_period(); |
241 } |
241 } |
242 } |
242 } |
243 |
243 |
244 /*****************************************************************************/ |
244 /*****************************************************************************/ |
245 |
245 |
246 void request_lock_callback(void *cb_data) |
246 void send_callback(void *cb_data) |
247 { |
247 { |
248 ec_master_t *m = (ec_master_t *) cb_data; |
248 ec_master_t *m = (ec_master_t *) cb_data; |
249 rt_sem_wait(&master_sem); |
249 |
250 } |
250 // too close to the next real time cycle: deny access... |
251 |
251 if (get_cycles() - t_last_cycle <= t_critical) { |
252 /*****************************************************************************/ |
252 rt_sem_wait(&master_sem); |
253 |
253 ecrt_master_send_ext(m); |
254 void release_lock_callback(void *cb_data) |
254 rt_sem_signal(&master_sem); |
|
255 } |
|
256 } |
|
257 |
|
258 /*****************************************************************************/ |
|
259 |
|
260 void receive_callback(void *cb_data) |
255 { |
261 { |
256 ec_master_t *m = (ec_master_t *) cb_data; |
262 ec_master_t *m = (ec_master_t *) cb_data; |
257 rt_sem_signal(&master_sem); |
263 |
|
264 // too close to the next real time cycle: deny access... |
|
265 if (get_cycles() - t_last_cycle <= t_critical) { |
|
266 rt_sem_wait(&master_sem); |
|
267 ecrt_master_receive(m); |
|
268 rt_sem_signal(&master_sem); |
|
269 } |
258 } |
270 } |
259 |
271 |
260 /*****************************************************************************/ |
272 /*****************************************************************************/ |
261 |
273 |
262 int __init init_mod(void) |
274 int __init init_mod(void) |
273 |
285 |
274 t_critical = cpu_khz * 1000 / FREQUENCY - cpu_khz * INHIBIT_TIME / 1000; |
286 t_critical = cpu_khz * 1000 / FREQUENCY - cpu_khz * INHIBIT_TIME / 1000; |
275 |
287 |
276 master = ecrt_request_master(0); |
288 master = ecrt_request_master(0); |
277 if (!master) { |
289 if (!master) { |
278 ret = -EBUSY; |
290 ret = -EBUSY; |
279 printk(KERN_ERR PFX "Requesting master 0 failed!\n"); |
291 printk(KERN_ERR PFX "Requesting master 0 failed!\n"); |
280 goto out_return; |
292 goto out_return; |
281 } |
293 } |
282 |
294 |
283 ecrt_master_callbacks(master, request_lock_callback, release_lock_callback, master); |
295 ecrt_master_callbacks(master, send_callback, receive_callback, master); |
284 |
296 |
285 printk(KERN_INFO PFX "Registering domain...\n"); |
297 printk(KERN_INFO PFX "Registering domain...\n"); |
286 if (!(domain1 = ecrt_master_create_domain(master))) { |
298 if (!(domain1 = ecrt_master_create_domain(master))) { |
287 printk(KERN_ERR PFX "Domain creation failed!\n"); |
299 printk(KERN_ERR PFX "Domain creation failed!\n"); |
288 goto out_release_master; |
300 goto out_release_master; |