From 4a260f074de547dd91bb0dbc25ab52ca4c94eb53 Mon Sep 17 00:00:00 2001 From: Thomas Doerfler Date: Mon, 8 Sep 2008 09:51:46 +0000 Subject: corrected parameters in i2c driver for done signalling updated mscan CAN driver --- c/src/lib/libbsp/powerpc/gen5200/ChangeLog | 10 ++++++++++ c/src/lib/libbsp/powerpc/gen5200/i2c/i2c.c | 20 +++++++++++++------- c/src/lib/libbsp/powerpc/gen5200/i2c/i2cdrv.c | 18 +++++++++--------- c/src/lib/libbsp/powerpc/gen5200/i2c/mpc5200mbus.c | 8 ++++---- c/src/lib/libbsp/powerpc/gen5200/i2c/mpc5200mbus.h | 6 +++--- c/src/lib/libbsp/powerpc/gen5200/include/i2c.h | 6 +++--- .../lib/libbsp/powerpc/gen5200/include/mscan-base.h | 21 +++++++++++++++++---- 7 files changed, 59 insertions(+), 30 deletions(-) (limited to 'c') diff --git a/c/src/lib/libbsp/powerpc/gen5200/ChangeLog b/c/src/lib/libbsp/powerpc/gen5200/ChangeLog index d3d34271f6..7b4d176229 100644 --- a/c/src/lib/libbsp/powerpc/gen5200/ChangeLog +++ b/c/src/lib/libbsp/powerpc/gen5200/ChangeLog @@ -1,3 +1,13 @@ +2008-09-08 Sebastian Huber + + * include/mscan-base.h: Added bit timing macros. + +2008-09-08 Thomas Doerfler + + * i2c/i2c.c, i2c/i2cdrv.c, i2c/mpc5200mbus.c, i2c/mpc5200mbus.h, + include/i2c.h: + converted done_arg to a void pointer + 2008-09-06 Ralf Corsépius * bestcomm/bestcomm_glue.c, ide/pcmcia_ide.c, tod/todcfg.c: diff --git a/c/src/lib/libbsp/powerpc/gen5200/i2c/i2c.c b/c/src/lib/libbsp/powerpc/gen5200/i2c/i2c.c index 58830efa11..d3d4e7681a 100644 --- a/c/src/lib/libbsp/powerpc/gen5200/i2c/i2c.c +++ b/c/src/lib/libbsp/powerpc/gen5200/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) { - volatile bool poll_done_flag; + /* + * 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 rtems_boolean 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/powerpc/gen5200/i2c/i2cdrv.c b/c/src/lib/libbsp/powerpc/gen5200/i2c/i2cdrv.c index aa1d0552c3..9295aded99 100644 --- a/c/src/lib/libbsp/powerpc/gen5200/i2c/i2cdrv.c +++ b/c/src/lib/libbsp/powerpc/gen5200/i2c/i2cdrv.c @@ -70,7 +70,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 */ @@ -105,11 +105,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; @@ -140,8 +140,8 @@ i2cdrv_unload(void) i2cdrv_bus_clock_div_current = i2cdrv_bus_clock_div[qel->bus]; mpc5200mbus_select_clock_divider(&mbus[qel->bus], i2cdrv_bus_clock_div_current); } - sc = mpc5200mbus_i2c_transfer(&mbus[qel->bus], qel->nmsg, qel->msg, i2cdrv_done, - (uint32_t)qel); + sc = mpc5200mbus_i2c_transfer(&mbus[qel->bus], qel->nmsg, qel->msg, + i2cdrv_done,qel); if (sc != RTEMS_SUCCESSFUL) { int i; @@ -149,7 +149,7 @@ i2cdrv_unload(void) { qel->msg[i].status = I2C_RESOURCE_NOT_AVAILABLE; } - i2cdrv_done((uint32_t)qel); + i2cdrv_done(qel); } } else @@ -168,7 +168,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 @@ -176,7 +176,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; @@ -195,7 +195,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/powerpc/gen5200/i2c/mpc5200mbus.c b/c/src/lib/libbsp/powerpc/gen5200/i2c/mpc5200mbus.c index 8b5dc237b6..23c1345211 100644 --- a/c/src/lib/libbsp/powerpc/gen5200/i2c/mpc5200mbus.c +++ b/c/src/lib/libbsp/powerpc/gen5200/i2c/mpc5200mbus.c @@ -214,7 +214,7 @@ mpc5200mbus_machine(mpc5200mbus *bus, i2c_event event) next_state(bus, STATE_IDLE); bus->msg = bus->cmsg = NULL; bus->nmsg = bus->byte = 0; - bus->done(bus->done_arg); + bus->done(bus->done_arg_ptr); break; } @@ -627,7 +627,7 @@ mpc5200mbus_initialize(mpc5200mbus *i2c_bus) * 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 @@ -635,13 +635,13 @@ mpc5200mbus_initialize(mpc5200mbus *i2c_bus) */ rtems_status_code mpc5200mbus_i2c_transfer(mpc5200mbus *bus, int nmsg, i2c_message *msg, - i2c_transfer_done done, uint32_t done_arg) + i2c_transfer_done done, void *done_arg_ptr) { if (bus->state == STATE_UNINITIALIZED) return RTEMS_NOT_CONFIGURED; bus->done = done; - bus->done_arg = done_arg; + bus->done_arg_ptr = done_arg_ptr; bus->cmsg = bus->msg = msg; bus->nmsg = nmsg; bus->byte = 0; diff --git a/c/src/lib/libbsp/powerpc/gen5200/i2c/mpc5200mbus.h b/c/src/lib/libbsp/powerpc/gen5200/i2c/mpc5200mbus.h index 30d18a1015..b063076afc 100644 --- a/c/src/lib/libbsp/powerpc/gen5200/i2c/mpc5200mbus.h +++ b/c/src/lib/libbsp/powerpc/gen5200/i2c/mpc5200mbus.h @@ -56,7 +56,7 @@ typedef struct mpc5200_mbus { int byte; /* Byte number in current message */ rtems_id sema; /* MBUS semaphore */ i2c_transfer_done done; /* Transfer done function */ - uint32_t done_arg; /* Done function argument */ + void * done_arg_ptr; /* Done function argument pointer */ int bus_idx; /* bus index: 0 or 1 */ } mpc5200mbus; @@ -98,7 +98,7 @@ mpc5200mbus_select_clock_divider(mpc5200mbus *i2c_bus, int divider); * 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 @@ -106,7 +106,7 @@ mpc5200mbus_select_clock_divider(mpc5200mbus *i2c_bus, int divider); */ rtems_status_code mpc5200mbus_i2c_transfer(mpc5200mbus *bus, int nmsg, i2c_message *msg, - i2c_transfer_done done, uint32_t done_arg); + i2c_transfer_done done, void * done_arg_ptr); /* mpc5200mbus_i2c_done -- * Close ColdFire MBUS I2C bus controller and release all resources. diff --git a/c/src/lib/libbsp/powerpc/gen5200/include/i2c.h b/c/src/lib/libbsp/powerpc/gen5200/include/i2c.h index 06def340ee..8c014c02b6 100644 --- a/c/src/lib/libbsp/powerpc/gen5200/include/i2c.h +++ b/c/src/lib/libbsp/powerpc/gen5200/include/i2c.h @@ -67,7 +67,7 @@ typedef struct i2c_message { #define I2C_MSG_ERRSKIP (0x04) /* Skip message if last transfered message is failed */ /* Type for function which is called when transfer over I2C bus is finished */ -typedef void (*i2c_transfer_done) (uint32_t arg); +typedef void (*i2c_transfer_done) (void * arg); /* i2c_initialize -- * I2C driver initialization. This function usually called on device @@ -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); /* i2c_transfer_wait -- * Initiate I2C bus transfer and block until this transfer will be diff --git a/c/src/lib/libbsp/powerpc/gen5200/include/mscan-base.h b/c/src/lib/libbsp/powerpc/gen5200/include/mscan-base.h index e7b1bcba7a..e9daefe467 100644 --- a/c/src/lib/libbsp/powerpc/gen5200/include/mscan-base.h +++ b/c/src/lib/libbsp/powerpc/gen5200/include/mscan-base.h @@ -90,8 +90,14 @@ * @{ */ -#define BTR0_SJW(btr0) ((btr0) << 6) -#define BTR0_BRP(btr0) ((btr0) << 0) +#define BTR0_SJW_MASK 0xc0 +#define BTR0_BRP_MASK 0x3f + +#define BTR0_SJW( btr0) ((btr0) << 6) +#define BTR0_BRP( btr0) ((btr0) << 0) + +#define BTR0_GET_SJW( btr0) (((btr0) & BTR0_SJW_MASK) >> 6) +#define BTR0_GET_BRP( btr0) (((btr0) & BTR0_BRP_MASK) >> 0) /** @} */ @@ -101,9 +107,16 @@ * @{ */ +#define BTR1_SAMP_MASK 0x80 +#define BTR1_TSEG1_MASK 0x0f +#define BTR1_TSEG2_MASK 0x70 + #define BTR1_SAMP (1 << 7) -#define BTR1_TSEG2(btr1) ((btr1) << 4) -#define BTR1_TSEG1(btr1) ((btr1) << 0) +#define BTR1_TSEG1( btr1) ((btr1) << 0) +#define BTR1_TSEG2( btr1) ((btr1) << 4) + +#define BTR1_GET_TSEG1( btr0) (((btr0) & BTR1_TSEG1_MASK) >> 0) +#define BTR1_GET_TSEG2( btr0) (((btr0) & BTR1_TSEG2_MASK) >> 4) /** @} */ -- cgit v1.2.3