From 6a8662f20e556711aa0d22c371d1746dbee08482 Mon Sep 17 00:00:00 2001 From: patacongo Date: Mon, 29 Aug 2011 16:07:29 +0000 Subject: [PATCH] Bug fixes for BCH and TSC2007 drivers git-svn-id: https://nuttx.svn.sourceforge.net/svnroot/nuttx/trunk@3921 7fd9a85b-ad96-42d3-883c-3090e2eb8679 --- nuttx/ChangeLog | 4 +++- nuttx/drivers/bch/bchlib_read.c | 7 +++++-- nuttx/drivers/bch/bchlib_write.c | 20 ++++++++++++++++---- nuttx/drivers/input/tsc2007.c | 8 ++++---- 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 * * 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 */