Re-added callback data pointer, because it is necessary for some applications.

This commit is contained in:
Florian Pose 2009-07-29 09:19:53 +00:00
parent 7db4bafbca
commit f411a51ca6
7 changed files with 54 additions and 31 deletions

View File

@ -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))) {

View File

@ -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))) {

View File

@ -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))) {

View File

@ -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__ */

View File

@ -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)

View File

@ -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;
}
/*****************************************************************************/

View File

@ -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 *);
/*****************************************************************************/