1.修复spi无法断联。
2.限制直接操作spi总线引发的错误。
This commit is contained in:
44
device/spi.c
44
device/spi.c
@@ -130,25 +130,28 @@ static mr_err_t mr_spi_device_connect_bus(mr_spi_device_t spi_device, const char
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
spi_device->bus = MR_NULL;
|
||||
}
|
||||
|
||||
/* Set the spi-bus */
|
||||
spi_device->bus = (mr_spi_bus_t)spi_bus;
|
||||
|
||||
/* Slave mode monopolizes the bus */
|
||||
if (spi_device->config.host_slave == MR_SPI_SLAVE)
|
||||
/* Connect the new spi-bus */
|
||||
if (spi_device->bus != MR_NULL)
|
||||
{
|
||||
ret = mr_spi_device_take_bus(spi_device);
|
||||
if (ret != MR_ERR_OK)
|
||||
/* Slave mode monopolizes the bus */
|
||||
if (spi_device->config.host_slave == MR_SPI_SLAVE)
|
||||
{
|
||||
spi_device->bus = MR_NULL;
|
||||
return ret;
|
||||
ret = mr_spi_device_take_bus(spi_device);
|
||||
if (ret != MR_ERR_OK)
|
||||
{
|
||||
spi_device->bus = MR_NULL;
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Open the spi-bus */
|
||||
return mr_device_open(spi_bus, MR_DEVICE_OFLAG_RDWR);
|
||||
/* Open the spi-bus */
|
||||
return mr_device_open(spi_bus, MR_DEVICE_OFLAG_BUS);
|
||||
}
|
||||
}
|
||||
|
||||
return MR_ERR_OK;
|
||||
@@ -600,17 +603,21 @@ mr_err_t mr_spi_device_add(mr_spi_device_t spi_device, const char *name, mr_off_
|
||||
return mr_device_add(&spi_device->device, name, Mr_Device_Type_SPI, MR_DEVICE_OFLAG_RDWR, &device_ops, MR_NULL);
|
||||
}
|
||||
|
||||
static mr_err_t mr_spi_bus_close(mr_device_t device)
|
||||
static mr_err_t mr_spi_bus_open(mr_device_t device)
|
||||
{
|
||||
mr_spi_bus_t spi_bus = (mr_spi_bus_t)device;
|
||||
|
||||
/* Disable spi */
|
||||
spi_bus->config.baud_rate = 0;
|
||||
mr_mutex_init(&spi_bus->lock);
|
||||
|
||||
return spi_bus->ops->configure(spi_bus, &spi_bus->config);
|
||||
}
|
||||
|
||||
static mr_err_t mr_spi_bus_close(mr_device_t device)
|
||||
{
|
||||
mr_spi_bus_t spi_bus = (mr_spi_bus_t)device;
|
||||
struct mr_spi_config config = {0};
|
||||
|
||||
return spi_bus->ops->configure(spi_bus, &config);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function adds the spi bus device.
|
||||
*
|
||||
@@ -625,19 +632,20 @@ mr_err_t mr_spi_bus_add(mr_spi_bus_t spi_bus, const char *name, struct mr_spi_bu
|
||||
{
|
||||
static struct mr_device_ops device_ops =
|
||||
{
|
||||
MR_NULL,
|
||||
mr_spi_bus_open,
|
||||
mr_spi_bus_close,
|
||||
MR_NULL,
|
||||
MR_NULL,
|
||||
MR_NULL,
|
||||
};
|
||||
struct mr_spi_config default_config = MR_SPI_CONFIG_DEFAULT;
|
||||
|
||||
MR_ASSERT(spi_bus != MR_NULL);
|
||||
MR_ASSERT(name != MR_NULL);
|
||||
MR_ASSERT(ops != MR_NULL);
|
||||
|
||||
/* Initialize the private fields */
|
||||
spi_bus->config.baud_rate = 0;
|
||||
spi_bus->config = default_config;
|
||||
mr_mutex_init(&spi_bus->lock);
|
||||
spi_bus->owner = MR_NULL;
|
||||
|
||||
@@ -650,7 +658,7 @@ mr_err_t mr_spi_bus_add(mr_spi_bus_t spi_bus, const char *name, struct mr_spi_bu
|
||||
spi_bus->ops = ops;
|
||||
|
||||
/* Add the device */
|
||||
return mr_device_add(&spi_bus->device, name, Mr_Device_Type_SPIBUS, MR_DEVICE_OFLAG_RDWR, &device_ops, data);
|
||||
return mr_device_add(&spi_bus->device, name, Mr_Device_Type_SPIBUS, MR_DEVICE_OFLAG_BUS, &device_ops, data);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user