From 1d6d12675971955ce09be0e91f143b65e91cf1a3 Mon Sep 17 00:00:00 2001 From: Florian Pose <fp@igh-essen.com> Date: Wed, 29 Jul 2009 09:19:53 +0000 Subject: [PATCH] Re-added callback data pointer, because it is necessary for some applications. --- examples/dc_rtai/dc_rtai_sample.c | 14 +++++++++----- examples/mini/mini.c | 12 +++++++----- examples/rtai/rtai_sample.c | 14 +++++++++----- include/ecrt.h | 6 ++++-- master/cdev.c | 2 +- master/master.c | 23 ++++++++++++++++------- master/master.h | 14 ++++++++------ 7 files changed, 54 insertions(+), 31 deletions(-) diff --git a/examples/dc_rtai/dc_rtai_sample.c b/examples/dc_rtai/dc_rtai_sample.c index 94f4c1ca..5e40a480 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 f5bd27c1..69d96e25 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 2b804dd9..eb31b78c 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 259d9f44..1c269d9b 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 57e7bf33..0acf642d 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 cf7e442f..952c1e16 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 f5832d2e..225ccbb0 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 *); /*****************************************************************************/ -- GitLab