mirror of
https://github.com/apache/nuttx.git
synced 2026-06-02 09:38:37 +08:00
drivers/1wire: Adds some improvents
The following changes where added. - Removes dependency to slave structure. Selecting a device on the bus only requires the unique romcode. - Make search operation mutual exclusive on the bus. This is necessary to prevent another driver instance from making a transition on the bus at the same time. - Skip also rom when only 1 slave is expected on the bus. Physical connected devuce should be indicated by the maxslave paramter during initializing, not the reigstered slaves. - Fixes some compiler warnings in existing ds28e17 driver. Signed-off-by: Marco Krahl <ocram.lhark@gmail.com>
This commit is contained in:
+19
-9
@@ -330,9 +330,9 @@ int onewire_reset_resume(FAR struct onewire_master_s *master)
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
int onewire_reset_select(FAR struct onewire_slave_s *slave)
|
int onewire_reset_select(FAR struct onewire_master_s *master,
|
||||||
|
uint64_t romcode)
|
||||||
{
|
{
|
||||||
FAR struct onewire_master_s *master = slave->master;
|
|
||||||
uint64_t tmp;
|
uint64_t tmp;
|
||||||
uint8_t skip_rom[1] =
|
uint8_t skip_rom[1] =
|
||||||
{
|
{
|
||||||
@@ -354,13 +354,13 @@ int onewire_reset_select(FAR struct onewire_slave_s *slave)
|
|||||||
|
|
||||||
/* Issue skip-ROM if single slave, match-ROM otherwise. */
|
/* Issue skip-ROM if single slave, match-ROM otherwise. */
|
||||||
|
|
||||||
if (master->nslaves == 1)
|
if (master->nslaves == 1 || master->maxslaves == 1)
|
||||||
{
|
{
|
||||||
ret = ONEWIRE_WRITE(master->dev, skip_rom, sizeof(skip_rom));
|
ret = ONEWIRE_WRITE(master->dev, skip_rom, sizeof(skip_rom));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tmp = onewire_leuint64(slave->romcode);
|
tmp = onewire_leuint64(romcode);
|
||||||
memcpy(&match_rom[1], &tmp, 8);
|
memcpy(&match_rom[1], &tmp, 8);
|
||||||
ret = ONEWIRE_WRITE(master->dev, match_rom, sizeof(match_rom));
|
ret = ONEWIRE_WRITE(master->dev, match_rom, sizeof(match_rom));
|
||||||
}
|
}
|
||||||
@@ -541,6 +541,14 @@ int onewire_search(FAR struct onewire_master_s *master,
|
|||||||
|
|
||||||
DEBUGASSERT(master->insearch == false);
|
DEBUGASSERT(master->insearch == false);
|
||||||
|
|
||||||
|
/* Make complete search on the bus mutal exlusive */
|
||||||
|
|
||||||
|
ret = onewire_sem_wait(master);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Skip costly search if bus supports only a single slave. */
|
/* Skip costly search if bus supports only a single slave. */
|
||||||
|
|
||||||
if (master->maxslaves == 1)
|
if (master->maxslaves == 1)
|
||||||
@@ -554,7 +562,7 @@ int onewire_search(FAR struct onewire_master_s *master,
|
|||||||
nslaves_match++;
|
nslaves_match++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (ret < 0) ? ret : nslaves_match;
|
goto unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Select search type. */
|
/* Select search type. */
|
||||||
@@ -570,7 +578,7 @@ int onewire_search(FAR struct onewire_master_s *master,
|
|||||||
ret = ONEWIRE_RESET(dev);
|
ret = ONEWIRE_RESET(dev);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
return ret;
|
goto unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Send the Search-ROM command. */
|
/* Send the Search-ROM command. */
|
||||||
@@ -578,7 +586,7 @@ int onewire_search(FAR struct onewire_master_s *master,
|
|||||||
ret = ONEWIRE_WRITE(dev, cmd, sizeof(cmd));
|
ret = ONEWIRE_WRITE(dev, cmd, sizeof(cmd));
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
return ret;
|
goto unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
last_rom = rom;
|
last_rom = rom;
|
||||||
@@ -611,7 +619,7 @@ int onewire_search(FAR struct onewire_master_s *master,
|
|||||||
{
|
{
|
||||||
/* Error or zero valid directions. */
|
/* Error or zero valid directions. */
|
||||||
|
|
||||||
return ret;
|
goto unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret == 2 && taken_bit == 0)
|
if (ret == 2 && taken_bit == 0)
|
||||||
@@ -668,7 +676,9 @@ int onewire_search(FAR struct onewire_master_s *master,
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
return nslaves_match;
|
unlock:
|
||||||
|
onewire_sem_post(master);
|
||||||
|
return (ret < 0) ? ret : nslaves_match;
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
|||||||
@@ -111,7 +111,8 @@ int onewire_reset_resume(FAR struct onewire_master_s *master);
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
int onewire_reset_select(FAR struct onewire_slave_s *slave);
|
int onewire_reset_select(FAR struct onewire_master_s *master,
|
||||||
|
uint64_t romcode);
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: onewire_triplet
|
* Name: onewire_triplet
|
||||||
|
|||||||
+8
-16
@@ -132,7 +132,9 @@ struct ds_i2c_inst_s /* Must be cast-compatible with i2c_maste
|
|||||||
* Private Function Prototypes
|
* Private Function Prototypes
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef CONFIG_I2C_RESET
|
||||||
static int ds_i2c_reset(FAR struct i2c_master_s *i2cdev);
|
static int ds_i2c_reset(FAR struct i2c_master_s *i2cdev);
|
||||||
|
#endif
|
||||||
static int ds_i2c_transfer(FAR struct i2c_master_s *i2cdev,
|
static int ds_i2c_transfer(FAR struct i2c_master_s *i2cdev,
|
||||||
FAR struct i2c_msg_s *msgs, int count);
|
FAR struct i2c_msg_s *msgs, int count);
|
||||||
|
|
||||||
@@ -581,15 +583,15 @@ static int ds_i2c_setfrequency(FAR struct ds_i2c_inst_s *inst,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
i2cerr("ERROR: bad I2C freq %u\n", frequency);
|
i2cerr("ERROR: bad I2C freq %lu\n", frequency);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
i2cinfo("Changing I2C freq %u -> %u\n", inst->frequency, frequency);
|
i2cinfo("Changing I2C freq %lu -> %lu\n", inst->frequency, frequency);
|
||||||
|
|
||||||
/* Select DS28E17 */
|
/* Select DS28E17 */
|
||||||
|
|
||||||
ret = onewire_reset_select(&inst->slave);
|
ret = onewire_reset_select(master, inst->slave.romcode);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
i2cerr("ERROR: cannot change I2C freq\n");
|
i2cerr("ERROR: cannot change I2C freq\n");
|
||||||
@@ -640,7 +642,7 @@ static int ds_i2c_process(FAR struct i2c_master_s *i2cdev,
|
|||||||
|
|
||||||
/* Select DS28E17 */
|
/* Select DS28E17 */
|
||||||
|
|
||||||
i = onewire_reset_select(&inst->slave);
|
i = onewire_reset_select(master, inst->slave.romcode);
|
||||||
if (i < 0)
|
if (i < 0)
|
||||||
{
|
{
|
||||||
goto errout;
|
goto errout;
|
||||||
@@ -714,7 +716,7 @@ static int ds_i2c_process(FAR struct i2c_master_s *i2cdev,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ret = onewire_reset_select(&inst->slave);
|
ret = onewire_reset_select(master, inst->slave.romcode);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
@@ -877,20 +879,10 @@ int ds28e17_search(FAR struct ds28e17_dev_s *priv,
|
|||||||
void *arg)
|
void *arg)
|
||||||
{
|
{
|
||||||
FAR struct onewire_master_s *master = (FAR struct onewire_master_s *)priv;
|
FAR struct onewire_master_s *master = (FAR struct onewire_master_s *)priv;
|
||||||
int ret;
|
|
||||||
|
|
||||||
DEBUGASSERT(master != NULL && cb_search != NULL);
|
DEBUGASSERT(master != NULL && cb_search != NULL);
|
||||||
|
|
||||||
ret = onewire_sem_wait(master);
|
return onewire_search(master, DS_FAMILY, false, cb_search, arg);
|
||||||
if (ret < 0)
|
|
||||||
{
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = onewire_search(master, DS_FAMILY, false, cb_search, arg);
|
|
||||||
onewire_sem_post(master);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
|||||||
Reference in New Issue
Block a user