diff options
author | Thomas Doerfler <Thomas.Doerfler@embedded-brains.de> | 2008-09-08 09:52:49 +0000 |
---|---|---|
committer | Thomas Doerfler <Thomas.Doerfler@embedded-brains.de> | 2008-09-08 09:52:49 +0000 |
commit | b06d05522831aeb14e40c463a30a9faaca5ecb8b (patch) | |
tree | 8600f8a117cf63e6758774486ba2eb5b2dd3dbb9 /c | |
parent | corrected parameters in i2c driver for done signalling (diff) | |
download | rtems-b06d05522831aeb14e40c463a30a9faaca5ecb8b.tar.bz2 |
corrected parameters inside i2c driver for done signalling
Diffstat (limited to 'c')
-rw-r--r-- | c/src/lib/libbsp/m68k/mcf5206elite/ChangeLog | 5 | ||||
-rw-r--r-- | c/src/lib/libbsp/m68k/mcf5206elite/i2c/i2c.c | 18 | ||||
-rw-r--r-- | c/src/lib/libbsp/m68k/mcf5206elite/i2c/i2cdrv.c | 18 | ||||
-rw-r--r-- | c/src/lib/libbsp/m68k/mcf5206elite/include/i2c.h | 4 |
4 files changed, 28 insertions, 17 deletions
diff --git a/c/src/lib/libbsp/m68k/mcf5206elite/ChangeLog b/c/src/lib/libbsp/m68k/mcf5206elite/ChangeLog index e27f100e78..948f2cee0c 100644 --- a/c/src/lib/libbsp/m68k/mcf5206elite/ChangeLog +++ b/c/src/lib/libbsp/m68k/mcf5206elite/ChangeLog @@ -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". diff --git a/c/src/lib/libbsp/m68k/mcf5206elite/i2c/i2c.c b/c/src/lib/libbsp/m68k/mcf5206elite/i2c/i2c.c index 2ef856af99..e52acef83b 100644 --- a/c/src/lib/libbsp/m68k/mcf5206elite/i2c/i2c.c +++ b/c/src/lib/libbsp/m68k/mcf5206elite/i2c/i2c.c @@ -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) diff --git a/c/src/lib/libbsp/m68k/mcf5206elite/i2c/i2cdrv.c b/c/src/lib/libbsp/m68k/mcf5206elite/i2c/i2cdrv.c index 973c3fe6a1..ae95207876 100644 --- a/c/src/lib/libbsp/m68k/mcf5206elite/i2c/i2cdrv.c +++ b/c/src/lib/libbsp/m68k/mcf5206elite/i2c/i2cdrv.c @@ -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) { diff --git a/c/src/lib/libbsp/m68k/mcf5206elite/include/i2c.h b/c/src/lib/libbsp/m68k/mcf5206elite/include/i2c.h index 1ff270a973..c82358797f 100644 --- a/c/src/lib/libbsp/m68k/mcf5206elite/include/i2c.h +++ b/c/src/lib/libbsp/m68k/mcf5206elite/include/i2c.h @@ -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 |