Re-added callback data pointer, because it is necessary for some applications.
This commit is contained in:
parent
7db4bafbca
commit
f411a51ca6
|
|
@ -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))) {
|
||||
|
|
|
|||
|
|
@ -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))) {
|
||||
|
|
|
|||
|
|
@ -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))) {
|
||||
|
|
|
|||
|
|
@ -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__ */
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
|
|||
|
|
@ -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 *);
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue