summaryrefslogtreecommitdiffstats
path: root/c
diff options
context:
space:
mode:
authorThomas Doerfler <Thomas.Doerfler@embedded-brains.de>2008-09-08 09:51:46 +0000
committerThomas Doerfler <Thomas.Doerfler@embedded-brains.de>2008-09-08 09:51:46 +0000
commit4a260f074de547dd91bb0dbc25ab52ca4c94eb53 (patch)
tree1027df4b08790901aabb2ca7ad40d16dff52497b /c
parent2008-09-08 Ralf Corsépius <ralf.corsepius@rtems.org> (diff)
downloadrtems-4a260f074de547dd91bb0dbc25ab52ca4c94eb53.tar.bz2
corrected parameters in i2c driver for done signalling
updated mscan CAN driver
Diffstat (limited to 'c')
-rw-r--r--c/src/lib/libbsp/powerpc/gen5200/ChangeLog10
-rw-r--r--c/src/lib/libbsp/powerpc/gen5200/i2c/i2c.c20
-rw-r--r--c/src/lib/libbsp/powerpc/gen5200/i2c/i2cdrv.c18
-rw-r--r--c/src/lib/libbsp/powerpc/gen5200/i2c/mpc5200mbus.c8
-rw-r--r--c/src/lib/libbsp/powerpc/gen5200/i2c/mpc5200mbus.h6
-rw-r--r--c/src/lib/libbsp/powerpc/gen5200/include/i2c.h6
-rw-r--r--c/src/lib/libbsp/powerpc/gen5200/include/mscan-base.h21
7 files changed, 59 insertions, 30 deletions
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 <sebastian.huber@embedded-brains.de>
+
+ * include/mscan-base.h: Added bit timing macros.
+
+2008-09-08 Thomas Doerfler <Thomas.Doerfler@embedded-brains.de>
+
+ * 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 <ralf.corsepius@rtems.org>
* 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)
/** @} */