forked from Imagelibrary/rtems
corrected parameters inside i2c driver for done signalling
This commit is contained in:
@@ -1,3 +1,8 @@
|
||||
2008-09-08 Thomas Doerfler <Thomas.Doerfler@embedded-brains.de>
|
||||
|
||||
* i2c/i2c.c, i2c/i2cdrv.c, include/i2c.h:
|
||||
converted done_arg to a void pointer
|
||||
|
||||
2008-09-06 Ralf Corsépius <ralf.corsepius@rtems.org>
|
||||
|
||||
* tod/todcfg.c: Convert to "bool".
|
||||
|
||||
@@ -23,9 +23,9 @@
|
||||
* arg - done function argument; it is RTEMS semaphore ID.
|
||||
*/
|
||||
static void
|
||||
i2c_transfer_sema_done_func(uint32_t arg)
|
||||
i2c_transfer_sema_done_func(void * arg)
|
||||
{
|
||||
rtems_id sema = (rtems_id)arg;
|
||||
rtems_id sema = *(rtems_id *)arg;
|
||||
rtems_semaphore_release(sema);
|
||||
}
|
||||
|
||||
@@ -38,7 +38,7 @@ i2c_transfer_sema_done_func(uint32_t arg)
|
||||
* arg - done function argument; address of poll_done_flag
|
||||
*/
|
||||
static void
|
||||
i2c_transfer_poll_done_func(uint32_t arg)
|
||||
i2c_transfer_poll_done_func(void *arg)
|
||||
{
|
||||
bool *poll_done_flag = (bool *)arg;
|
||||
*poll_done_flag = true;
|
||||
@@ -72,7 +72,8 @@ i2c_transfer_wait_sema(i2c_bus_number bus, i2c_message *msg, int nmsg)
|
||||
);
|
||||
if (sc != RTEMS_SUCCESSFUL)
|
||||
return I2C_RESOURCE_NOT_AVAILABLE;
|
||||
sc = i2c_transfer(bus, nmsg, msg, i2c_transfer_sema_done_func, sema);
|
||||
sc = i2c_transfer(bus, nmsg, msg,
|
||||
i2c_transfer_sema_done_func, &sema);
|
||||
if (sc != RTEMS_SUCCESSFUL)
|
||||
{
|
||||
rtems_semaphore_delete(sema);
|
||||
@@ -98,11 +99,16 @@ i2c_transfer_wait_sema(i2c_bus_number bus, i2c_message *msg, int nmsg)
|
||||
static rtems_status_code
|
||||
i2c_transfer_wait_poll(i2c_bus_number bus, i2c_message *msg, int nmsg)
|
||||
{
|
||||
/*
|
||||
* this looks nasty, but is correct:
|
||||
* we wait in this function, until the poll_done_flag is
|
||||
* set deep inside the i2c_poll() function
|
||||
*/
|
||||
volatile bool poll_done_flag;
|
||||
rtems_status_code sc;
|
||||
poll_done_flag = false;
|
||||
sc = i2c_transfer(bus, nmsg, msg, i2c_transfer_poll_done_func,
|
||||
(uint32_t)&poll_done_flag);
|
||||
sc = i2c_transfer(bus, nmsg, msg,
|
||||
i2c_transfer_poll_done_func,(void *)&poll_done_flag);
|
||||
if (sc != RTEMS_SUCCESSFUL)
|
||||
return sc;
|
||||
while (poll_done_flag == false)
|
||||
|
||||
@@ -49,7 +49,7 @@ typedef struct i2c_qel {
|
||||
i2c_message *msg; /* pointer to the transfer' messages array */
|
||||
int nmsg; /* number of messages in transfer */
|
||||
i2c_transfer_done done; /* transfer done callback function */
|
||||
uint32_t done_arg; /* arbitrary argument to done callback */
|
||||
void * done_arg_ptr; /* arbitrary arg pointer to done callback */
|
||||
} i2c_qel;
|
||||
|
||||
/* Memory for I2C transfer queue. This queue represented like a ring buffer */
|
||||
@@ -84,11 +84,11 @@ static void i2cdrv_unload(void);
|
||||
* transfer is finished.
|
||||
*/
|
||||
static void
|
||||
i2cdrv_done(uint32_t arg)
|
||||
i2cdrv_done(void * arg_ptr)
|
||||
{
|
||||
rtems_interrupt_level level;
|
||||
i2c_qel *qel = tqueue + tqueue_tail;
|
||||
qel->done(qel->done_arg);
|
||||
qel->done(qel->done_arg_ptr);
|
||||
rtems_interrupt_disable(level);
|
||||
tqueue_tail = (tqueue_tail + 1) % tqueue_size;
|
||||
mbus_busy = false;
|
||||
@@ -119,8 +119,8 @@ i2cdrv_unload(void)
|
||||
i2cdrv_bus_clock_div_current = i2cdrv_bus_clock_div[qel->bus];
|
||||
mcfmbus_select_clock_divider(&mbus, i2cdrv_bus_clock_div_current);
|
||||
}
|
||||
sc = mcfmbus_i2c_transfer(&mbus, qel->nmsg, qel->msg, i2cdrv_done,
|
||||
(uint32_t)qel);
|
||||
sc = mcfmbus_i2c_transfer(&mbus, qel->nmsg, qel->msg,
|
||||
i2cdrv_done,qel);
|
||||
if (sc != RTEMS_SUCCESSFUL)
|
||||
{
|
||||
int i;
|
||||
@@ -128,7 +128,7 @@ i2cdrv_unload(void)
|
||||
{
|
||||
qel->msg[i].status = I2C_RESOURCE_NOT_AVAILABLE;
|
||||
}
|
||||
i2cdrv_done((uint32_t)qel);
|
||||
i2cdrv_done(qel);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -147,7 +147,7 @@ i2cdrv_unload(void)
|
||||
* nmsg - number of messages
|
||||
* msg - pointer to messages array
|
||||
* done - function which is called when transfer is finished
|
||||
* done_arg - arbitrary argument passed to done funciton
|
||||
* done_arg_ptr - arbitrary argument pointer passed to done funciton
|
||||
*
|
||||
* RETURNS:
|
||||
* RTEMS_SUCCESSFUL if transfer initiated successfully, or error
|
||||
@@ -155,7 +155,7 @@ i2cdrv_unload(void)
|
||||
*/
|
||||
rtems_status_code
|
||||
i2c_transfer(i2c_bus_number bus, int nmsg, i2c_message *msg,
|
||||
i2c_transfer_done done, uint32_t done_arg)
|
||||
i2c_transfer_done done, void * done_arg_ptr)
|
||||
{
|
||||
i2c_qel qel;
|
||||
rtems_interrupt_level level;
|
||||
@@ -174,7 +174,7 @@ i2c_transfer(i2c_bus_number bus, int nmsg, i2c_message *msg,
|
||||
qel.msg = msg;
|
||||
qel.nmsg = nmsg;
|
||||
qel.done = done;
|
||||
qel.done_arg = done_arg;
|
||||
qel.done_arg_ptr = done_arg_ptr;
|
||||
rtems_interrupt_disable(level);
|
||||
if ((tqueue_head + 1) % tqueue_size == tqueue_tail)
|
||||
{
|
||||
|
||||
@@ -116,7 +116,7 @@ i2c_select_clock_rate(i2c_bus_number bus, int bps);
|
||||
* nmsg - number of messages
|
||||
* msg - pointer to messages array
|
||||
* done - function which is called when transfer is finished
|
||||
* done_arg - arbitrary argument passed to done funciton
|
||||
* done_arg_ptr - arbitrary argument ptr passed to done funciton
|
||||
*
|
||||
* RETURNS:
|
||||
* RTEMS_SUCCESSFUL if transfer initiated successfully, or error
|
||||
@@ -124,7 +124,7 @@ i2c_select_clock_rate(i2c_bus_number bus, int bps);
|
||||
*/
|
||||
rtems_status_code
|
||||
i2c_transfer(i2c_bus_number bus, int nmsg, i2c_message *msg,
|
||||
i2c_transfer_done done, uint32_t done_arg);
|
||||
i2c_transfer_done done, void * done_arg_ptr);
|
||||
|
||||
/* i2c_transfer_wait --
|
||||
* Initiate I2C bus transfer and block until this transfer will be
|
||||
|
||||
Reference in New Issue
Block a user