summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2011-08-29 16:07:29 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2011-08-29 16:07:29 +0000
commit3000e30c53c6e1b4dcbd7c2efe9d7bba551b23fb (patch)
tree071f95f8219d83fc1992dcbb5eb5c2b9e2cc782c
parent0671167e2a192d26fd43efa2130c4fccc32b76b8 (diff)
downloadpx4-nuttx-3000e30c53c6e1b4dcbd7c2efe9d7bba551b23fb.tar.gz
px4-nuttx-3000e30c53c6e1b4dcbd7c2efe9d7bba551b23fb.tar.bz2
px4-nuttx-3000e30c53c6e1b4dcbd7c2efe9d7bba551b23fb.zip
Bug fixes for BCH and TSC2007 drivers
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3921 42af7a65-404d-4744-a932-0658087f49c3
-rw-r--r--nuttx/ChangeLog4
-rw-r--r--nuttx/drivers/bch/bchlib_read.c7
-rw-r--r--nuttx/drivers/bch/bchlib_write.c20
-rw-r--r--nuttx/drivers/input/tsc2007.c8
4 files changed, 28 insertions, 11 deletions
diff --git a/nuttx/ChangeLog b/nuttx/ChangeLog
index 3f5fa7e6d..682cf49ef 100644
--- a/nuttx/ChangeLog
+++ b/nuttx/ChangeLog
@@ -2040,4 +2040,6 @@
the path to a block driver and then erases the underlying FLASH memory
(assuming that the block driver is an MTD driver wrapped in the FTL
layer).
-
+ * drivers/bch: Fixed some important bugs in the BCH driver (noted by
+ Li Zhuoyi (Lzyy)). This would have effected any large reads or writes
+ (larger than the hardware sector size).
diff --git a/nuttx/drivers/bch/bchlib_read.c b/nuttx/drivers/bch/bchlib_read.c
index 7319e3412..e146f02f8 100644
--- a/nuttx/drivers/bch/bchlib_read.c
+++ b/nuttx/drivers/bch/bchlib_read.c
@@ -145,7 +145,9 @@ ssize_t bchlib_read(FAR void *handle, FAR char *buffer, size_t offset, size_t le
len -= nbytes;
}
- /* Then read all of the full sectors following the partial sector */
+ /* Then read all of the full sectors following the partial sector directly
+ * into the user buffer.
+ */
if (len >= bch->sectsize )
{
@@ -155,7 +157,8 @@ ssize_t bchlib_read(FAR void *handle, FAR char *buffer, size_t offset, size_t le
nsectors = bch->nsectors - sector;
}
- ret = bch->inode->u.i_bops->read(bch->inode, bch->buffer, sector, nsectors);
+ ret = bch->inode->u.i_bops->read(bch->inode, (FAR uint8_t *)buffer,
+ sector, nsectors);
if (ret < 0)
{
fdbg("Read failed: %d\n");
diff --git a/nuttx/drivers/bch/bchlib_write.c b/nuttx/drivers/bch/bchlib_write.c
index 0f362ef8d..956f1619f 100644
--- a/nuttx/drivers/bch/bchlib_write.c
+++ b/nuttx/drivers/bch/bchlib_write.c
@@ -1,7 +1,7 @@
/****************************************************************************
* drivers/bch/bchlib_write.c
*
- * Copyright (C) 2008-2009 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2008-2009, 2011 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* Redistribution and use in source and binary forms, with or without
@@ -145,7 +145,9 @@ ssize_t bchlib_write(FAR void *handle, FAR const char *buffer, size_t offset, si
len -= nbytes;
}
- /* Then write all of the full sectors following the partial sector */
+ /* Then write all of the full sectors following the partial sector
+ * directly from the user buffer.
+ */
if (len >= bch->sectsize )
{
@@ -157,10 +159,11 @@ ssize_t bchlib_write(FAR void *handle, FAR const char *buffer, size_t offset, si
/* Write the contiguous sectors */
- ret = bch->inode->u.i_bops->write(bch->inode, bch->buffer, sector, nsectors);
+ ret = bch->inode->u.i_bops->write(bch->inode, (FAR uint8_t *)buffer,
+ sector, nsectors);
if (ret < 0)
{
- fdbg("Write failed: %d\n");
+ fdbg("Write failed: %d\n", ret);
return ret;
}
@@ -199,6 +202,15 @@ ssize_t bchlib_write(FAR void *handle, FAR const char *buffer, size_t offset, si
byteswritten += len;
}
+ /* Finally, flush any cached writes to the device as well */
+
+ ret = bchlib_flushsector(bch);
+ if (ret < 0)
+ {
+ fdbg("Flush failed: %d\n", ret);
+ return ret;
+ }
+
return byteswritten;
}
diff --git a/nuttx/drivers/input/tsc2007.c b/nuttx/drivers/input/tsc2007.c
index 4a5082f08..25c748823 100644
--- a/nuttx/drivers/input/tsc2007.c
+++ b/nuttx/drivers/input/tsc2007.c
@@ -460,7 +460,7 @@ static int tsc2007_transfer(FAR struct tsc2007_dev_s *priv, uint8_t cmd)
*/
ret = (unsigned int)data12[0] << 4 | (unsigned int)data12[1] >> 4;
- ivdbg(&tsc->client->dev, "data: 0x%04x\n", ret);
+ ivdbg("data: 0x%04x\n", ret);
return ret;
}
@@ -579,7 +579,7 @@ static void tsc2007_worker(FAR void *arg)
pressure = (x * config->rxplate * (z2 - z1)) / z1;
pressure = (pressure + 2048) >> 12;
- ivdbg("Position: (%d,%4d) pressure: %u z1/2: (%d,%d)\n"
+ ivdbg("Position: (%d,%4d) pressure: %u z1/2: (%d,%d)\n",
x, y, pressure, z1, z2);
/* Ignore out of range caculcations */
@@ -1105,9 +1105,9 @@ int tsc2007_register(FAR struct i2c_dev_s *dev,
/* Debug-only sanity checks */
- DEBUGASSERT(dev != NULL && config != NULL && minor > 0 && minor < 100);
+ DEBUGASSERT(dev != NULL && config != NULL && minor >= 0 && minor < 100);
DEBUGASSERT((config->address & 0xfc) == 0x48);
- DEBUGASSERT(config->attach != NULL && config->enable != NULL
+ DEBUGASSERT(config->attach != NULL && config->enable != NULL &&
config->clear != NULL && config->pendown != NULL);
/* Create and initialize a TSC2007 device driver instance */