diff --git a/examples/dc_rtai/dc_rtai_sample.c b/examples/dc_rtai/dc_rtai_sample.c index 94f4c1cae54a2999bea32c83651df0dbd22782e4..5e40a480cfc957c5cf9fbb7baab58ec8b221b8cb 100644 --- a/examples/dc_rtai/dc_rtai_sample.c +++ b/examples/dc_rtai/dc_rtai_sample.c @@ -238,24 +238,28 @@ void run(long data) /*****************************************************************************/ -void send_callback(ec_master_t *master) +void send_callback(void *cb_data) { + ec_master_t *m = (ec_master_t *) cb_data; + // too close to the next real time cycle: deny access... if (get_cycles() - t_last_cycle <= t_critical) { rt_sem_wait(&master_sem); - ecrt_master_send_ext(master); + ecrt_master_send_ext(m); rt_sem_signal(&master_sem); } } /*****************************************************************************/ -void receive_callback(ec_master_t *master) +void receive_callback(void *cb_data) { + ec_master_t *m = (ec_master_t *) cb_data; + // too close to the next real time cycle: deny access... if (get_cycles() - t_last_cycle <= t_critical) { rt_sem_wait(&master_sem); - ecrt_master_receive(master); + ecrt_master_receive(m); rt_sem_signal(&master_sem); } } @@ -281,7 +285,7 @@ int __init init_mod(void) goto out_return; } - ecrt_master_callbacks(master, send_callback, receive_callback); + ecrt_master_callbacks(master, send_callback, receive_callback, master); printk(KERN_INFO PFX "Registering domain...\n"); if (!(domain1 = ecrt_master_create_domain(master))) { diff --git a/examples/mini/mini.c b/examples/mini/mini.c index f5bd27c177fec355998aa6ca18ac83550a10c4a3..69d96e2522b213b8f4429ea623d056d7466fd429 100644 --- a/examples/mini/mini.c +++ b/examples/mini/mini.c @@ -354,19 +354,21 @@ void cyclic_task(unsigned long data) /*****************************************************************************/ -void send_callback(ec_master_t *master) +void send_callback(void *cb_data) { + ec_master_t *m = (ec_master_t *) cb_data; down(&master_sem); - ecrt_master_send_ext(master); + ecrt_master_send_ext(m); up(&master_sem); } /*****************************************************************************/ -void receive_callback(ec_master_t *master) +void receive_callback(void *cb_data) { + ec_master_t *m = (ec_master_t *) cb_data; down(&master_sem); - ecrt_master_receive(master); + ecrt_master_receive(m); up(&master_sem); } @@ -392,7 +394,7 @@ int __init init_mini_module(void) } init_MUTEX(&master_sem); - ecrt_master_callbacks(master, send_callback, receive_callback); + ecrt_master_callbacks(master, send_callback, receive_callback, master); printk(KERN_INFO PFX "Registering domain...\n"); if (!(domain1 = ecrt_master_create_domain(master))) { diff --git a/examples/rtai/rtai_sample.c b/examples/rtai/rtai_sample.c index 2b804dd9e330444ccaa6c2e229feca3b57bc0012..eb31b78c9523ed5f89f95dcdf224fa6f1d57ac2b 100644 --- a/examples/rtai/rtai_sample.c +++ b/examples/rtai/rtai_sample.c @@ -243,24 +243,28 @@ void run(long data) /*****************************************************************************/ -void send_callback(ec_master_t *master) +void send_callback(void *cb_data) { + ec_master_t *m = (ec_master_t *) cb_data; + // too close to the next real time cycle: deny access... if (get_cycles() - t_last_cycle <= t_critical) { rt_sem_wait(&master_sem); - ecrt_master_send_ext(master); + ecrt_master_send_ext(m); rt_sem_signal(&master_sem); } } /*****************************************************************************/ -void receive_callback(ec_master_t *master) +void receive_callback(void *cb_data) { + ec_master_t *m = (ec_master_t *) cb_data; + // too close to the next real time cycle: deny access... if (get_cycles() - t_last_cycle <= t_critical) { rt_sem_wait(&master_sem); - ecrt_master_receive(master); + ecrt_master_receive(m); rt_sem_signal(&master_sem); } } @@ -288,7 +292,7 @@ int __init init_mod(void) goto out_return; } - ecrt_master_callbacks(master, send_callback, receive_callback); + ecrt_master_callbacks(master, send_callback, receive_callback, master); printk(KERN_INFO PFX "Registering domain...\n"); if (!(domain1 = ecrt_master_create_domain(master))) { diff --git a/include/ecrt.h b/include/ecrt.h index 259d9f444c30a17541fe806ac9624960c2bcceeb..1c269d9bc840cc1b5d935bbd607f3b643776c318 100644 --- a/include/ecrt.h +++ b/include/ecrt.h @@ -477,8 +477,10 @@ int ecrt_master_reserve( */ void ecrt_master_callbacks( ec_master_t *master, /**< EtherCAT master */ - void (*send_cb)(ec_master_t *), /**< Datagram sending callback. */ - void (*receive_cb)(ec_master_t *) /**< Receive callback. */ + void (*send_cb)(void *), /**< Datagram sending callback. */ + void (*receive_cb)(void *), /**< Receive callback. */ + void *cb_data /**< Arbitraty pointer passed to the callback functions. + */ ); #endif /* __KERNEL__ */ diff --git a/master/cdev.c b/master/cdev.c index 57e7bf33078157b267e6ce6749a95c53a8b8200e..0acf642d19168745ba0e222e2ca31e970065d60e 100644 --- a/master/cdev.c +++ b/master/cdev.c @@ -1622,7 +1622,7 @@ int ec_cdev_ioctl_activate( } ecrt_master_callbacks(master, ec_master_internal_send_cb, - ec_master_internal_receive_cb); + ec_master_internal_receive_cb, master); ret = ecrt_master_activate(master); if (ret < 0) diff --git a/master/master.c b/master/master.c index cf7e442f5436a6b25644c07f221db45b519a6a80..952c1e169267d186b6c7b980fcb94f61ade0eff1 100644 --- a/master/master.c +++ b/master/master.c @@ -168,8 +168,10 @@ int ec_master_init(ec_master_t *master, /**< EtherCAT master */ init_MUTEX(&master->io_sem); master->send_cb = NULL; master->receive_cb = NULL; + master->cb_data = NULL; master->app_send_cb = NULL; master->app_receive_cb = NULL; + master->app_cb_data = NULL; INIT_LIST_HEAD(&master->sii_requests); init_waitqueue_head(&master->sii_queue); @@ -382,9 +384,10 @@ void ec_master_clear_domains(ec_master_t *master) /** Internal sending callback. */ void ec_master_internal_send_cb( - ec_master_t *master /**< EtherCAT master. */ + void *cb_data /**< Callback data. */ ) { + ec_master_t *master = (ec_master_t *) cb_data; down(&master->io_sem); ecrt_master_send_ext(master); up(&master->io_sem); @@ -395,9 +398,10 @@ void ec_master_internal_send_cb( /** Internal receiving callback. */ void ec_master_internal_receive_cb( - ec_master_t *master /**< EtherCAT master. */ + void *cb_data /**< Callback data. */ ) { + ec_master_t *master = (ec_master_t *) cb_data; down(&master->io_sem); ecrt_master_receive(master); up(&master->io_sem); @@ -473,6 +477,7 @@ int ec_master_enter_idle_phase( master->send_cb = ec_master_internal_send_cb; master->receive_cb = ec_master_internal_receive_cb; + master->cb_data = master; master->phase = EC_IDLE; ret = ec_master_thread_start(master, ec_master_idle_thread, @@ -574,6 +579,7 @@ int ec_master_enter_operation_phase(ec_master_t *master /**< EtherCAT master */) master->phase = EC_OPERATION; master->app_send_cb = NULL; master->app_receive_cb = NULL; + master->app_cb_data = NULL; return ret; out_allow: @@ -606,6 +612,7 @@ void ec_master_leave_operation_phase(ec_master_t *master master->send_cb = ec_master_internal_send_cb; master->receive_cb = ec_master_internal_receive_cb; + master->cb_data = master; down(&master->master_sem); ec_master_clear_domains(master); @@ -1130,7 +1137,7 @@ static int ec_master_eoe_thread(void *priv_data) goto schedule; // receive datagrams - master->receive_cb(master); + master->receive_cb(master->cb_data); // actual EoE processing sth_to_send = 0; @@ -1150,7 +1157,7 @@ static int ec_master_eoe_thread(void *priv_data) } // (try to) send datagrams down(&master->ext_queue_sem); - master->send_cb(master); + master->send_cb(master->cb_data); up(&master->ext_queue_sem); } @@ -1659,6 +1666,7 @@ int ecrt_master_activate(ec_master_t *master) master->send_cb = master->app_send_cb; master->receive_cb = master->app_receive_cb; + master->cb_data = master->app_cb_data; ret = ec_master_thread_start(master, ec_master_operation_thread, "EtherCAT-OP"); @@ -1836,15 +1844,16 @@ ec_slave_config_t *ecrt_master_slave_config(ec_master_t *master, /*****************************************************************************/ void ecrt_master_callbacks(ec_master_t *master, - void (*send_cb)(ec_master_t *), void (*receive_cb)(ec_master_t *)) + void (*send_cb)(void *), void (*receive_cb)(void *), void *cb_data) { if (master->debug_level) EC_DBG("ecrt_master_callbacks(master = 0x%x, send_cb = 0x%x, " - " receive_cb = 0x%x)\n", (u32) master, (u32) send_cb, - (u32) receive_cb); + " receive_cb = 0x%x, cb_data = 0x%x)\n", (u32) master, + (u32) send_cb, (u32) receive_cb, (u32) cb_data); master->app_send_cb = send_cb; master->app_receive_cb = receive_cb; + master->app_cb_data = cb_data; } /*****************************************************************************/ diff --git a/master/master.h b/master/master.h index f5832d2ec649c9f12ef095350879d04cbdb5cbc1..225ccbb0530bb8fa556e83719edd606964aeee37 100644 --- a/master/master.h +++ b/master/master.h @@ -166,12 +166,14 @@ struct ec_master { struct semaphore io_sem; /**< Semaphore used in \a IDLE phase. */ - void (*send_cb)(ec_master_t *); /**< Current send datagrams callback. */ - void (*receive_cb)(ec_master_t *); /**< Current receive datagrams callback. */ - void (*app_send_cb)(ec_master_t *); /**< Application's send datagrams + void (*send_cb)(void *); /**< Current send datagrams callback. */ + void (*receive_cb)(void *); /**< Current receive datagrams callback. */ + void *cb_data; /**< Current callback data. */ + void (*app_send_cb)(void *); /**< Application's send datagrams callback. */ - void (*app_receive_cb)(ec_master_t *); /**< Application's receive datagrams + void (*app_receive_cb)(void *); /**< Application's receive datagrams callback. */ + void *app_cb_data; /**< Application callback data. */ struct list_head sii_requests; /**< SII write requests. */ wait_queue_head_t sii_queue; /**< Wait queue for SII @@ -247,8 +249,8 @@ ec_slave_config_t *ecrt_master_slave_config_err(ec_master_t *, uint16_t, void ec_master_calc_dc(ec_master_t *); -void ec_master_internal_send_cb(ec_master_t *); -void ec_master_internal_receive_cb(ec_master_t *); +void ec_master_internal_send_cb(void *); +void ec_master_internal_receive_cb(void *); /*****************************************************************************/