aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBertrand SIMONNET <bsimonnet@google.com>2016-03-30 14:27:00 -0700
committerBertrand SIMONNET <bsimonnet@google.com>2016-03-30 14:48:24 -0700
commit2abf0833508ecfb74e44c3f00e6b6cdf8081019b (patch)
tree8e697e8aafbb586cee52556047808a161d31d41a
parentf4df29ac8ed4c45868b9bf93ad1d88478a92ceef (diff)
downloadperipheralmanager-2abf0833508ecfb74e44c3f00e6b6cdf8081019b.tar.gz
Allow setting the SPI message delay.
This CL adds an interface to set the delay to wait between two SPI messages. Bug: 27923916 Change-Id: Idb1fa208b974d489414d63d67ad5fa702e8b03e4
-rw-r--r--client/spi_device_impl.cc5
-rw-r--r--client/spi_device_impl.h2
-rw-r--r--client/spi_unittest.cc3
-rw-r--r--client/wrapper.cc4
-rw-r--r--daemon/peripheral_manager_client.cc16
-rw-r--r--daemon/peripheral_manager_client.h3
-rw-r--r--daemon/spi_driver.h1
-rw-r--r--daemon/spi_driver_spidev.cc10
-rw-r--r--daemon/spi_driver_spidev.h2
-rw-r--r--daemon/spi_manager.h4
-rw-r--r--include/peripheralmanager/spi_device.h6
-rw-r--r--ipc/android/os/IPeripheralManagerClient.aidl2
12 files changed, 57 insertions, 1 deletions
diff --git a/client/spi_device_impl.cc b/client/spi_device_impl.cc
index e21ca5a..d9bab6d 100644
--- a/client/spi_device_impl.cc
+++ b/client/spi_device_impl.cc
@@ -77,3 +77,8 @@ int SpiDeviceImpl::SetBitsPerWord(uint32_t bits_per_word) {
return client_->SpiDeviceSetBitsPerWord(name_, bits_per_word)
.serviceSpecificErrorCode();
}
+
+int SpiDeviceImpl::SetDelay(uint16_t delay_usecs) {
+ return client_->SpiDeviceSetDelay(name_, delay_usecs)
+ .serviceSpecificErrorCode();
+}
diff --git a/client/spi_device_impl.h b/client/spi_device_impl.h
index e5beb1a..ed076d5 100644
--- a/client/spi_device_impl.h
+++ b/client/spi_device_impl.h
@@ -42,6 +42,8 @@ class SpiDeviceImpl {
int SetBitsPerWord(uint32_t bits_per_word);
+ int SetDelay(uint16_t delay_usecs);
+
private:
std::string name_;
android::sp<android::os::IPeripheralManagerClient> client_;
diff --git a/client/spi_unittest.cc b/client/spi_unittest.cc
index c8df86d..d0529c0 100644
--- a/client/spi_unittest.cc
+++ b/client/spi_unittest.cc
@@ -143,6 +143,9 @@ TEST_F(SpiTest, SetConfiguration) {
// We can set the number of bits per word.
EXPECT_EQ(0, BSpiDevice_setBitsPerWord(device, 16));
+ // We can set the delay between transfers.
+ EXPECT_EQ(0, BSpiDevice_setDelay(device, 100));
+
BSpiDevice_delete(device);
BPeripheralManagerClient_delete(client);
}
diff --git a/client/wrapper.cc b/client/wrapper.cc
index 472154a..d9fb5c3 100644
--- a/client/wrapper.cc
+++ b/client/wrapper.cc
@@ -207,6 +207,10 @@ int BSpiDevice_setBitsPerWord(const BSpiDevice* device, uint8_t bits_per_word) {
return device->impl->SetBitsPerWord(bits_per_word);
}
+int BSpiDevice_setDelay(const BSpiDevice* device, uint16_t delay_usecs) {
+ return device->impl->SetDelay(delay_usecs);
+}
+
void BSpiDevice_delete(BSpiDevice* device) {
delete device->impl;
delete device;
diff --git a/daemon/peripheral_manager_client.cc b/daemon/peripheral_manager_client.cc
index e821288..d279a9f 100644
--- a/daemon/peripheral_manager_client.cc
+++ b/daemon/peripheral_manager_client.cc
@@ -235,6 +235,22 @@ Status PeripheralManagerClient::SpiDeviceSetBitsPerWord(const std::string& name,
return Status::fromServiceSpecificError(EREMOTEIO);
}
+Status PeripheralManagerClient::SpiDeviceSetDelay(const std::string& name,
+ int delay_usecs) {
+ if (!spi_devices_.count(name))
+ return Status::fromServiceSpecificError(EPERM);
+
+ // |delay_usecs| must be positive and fit in an unsigned 16 bit.
+ if (delay_usecs < 0 || delay_usecs > INT16_MAX)
+ return Status::fromServiceSpecificError(EINVAL);
+
+ if (spi_devices_.find(name)->second->SetDelay(
+ static_cast<uint16_t>(delay_usecs)))
+ return Status::ok();
+
+ return Status::fromServiceSpecificError(EREMOTEIO);
+}
+
Status PeripheralManagerClient::ListLeds(std::vector<std::string>* leds) {
*leds = LedManager::GetLedManager()->GetLeds();
return Status::ok();
diff --git a/daemon/peripheral_manager_client.h b/daemon/peripheral_manager_client.h
index 99f3999..23d15c7 100644
--- a/daemon/peripheral_manager_client.h
+++ b/daemon/peripheral_manager_client.h
@@ -92,6 +92,9 @@ class PeripheralManagerClient : public BnPeripheralManagerClient {
virtual Status SpiDeviceSetBitsPerWord(const std::string& name,
int nbits) override;
+ virtual Status SpiDeviceSetDelay(const std::string& name,
+ int delay_usecs) override;
+
virtual Status ListLeds(std::vector<std::string>* leds) override;
virtual Status OpenLed(const std::string& name) override;
diff --git a/daemon/spi_driver.h b/daemon/spi_driver.h
index 3f04e36..700a169 100644
--- a/daemon/spi_driver.h
+++ b/daemon/spi_driver.h
@@ -40,6 +40,7 @@ class SpiDriverInterface {
virtual bool SetMode(SpiMode mode) = 0;
virtual bool SetBitJustification(bool lsb_first) = 0;
virtual bool SetBitsPerWord(uint8_t bits_per_word) = 0;
+ virtual bool SetDelay(uint16_t delay_usecs) = 0;
};
class SpiDriverInfoBase {
diff --git a/daemon/spi_driver_spidev.cc b/daemon/spi_driver_spidev.cc
index 9a30b21..2ac4844 100644
--- a/daemon/spi_driver_spidev.cc
+++ b/daemon/spi_driver_spidev.cc
@@ -71,6 +71,9 @@ bool SpiDriverSpiDev::Init(uint32_t bus_id, uint32_t cs) {
}
speed_hz_ = max_freq;
+ // Default to 0 microseconds delay between transfers.
+ delay_usecs_ = 0;
+
// Default to 8 bits per word.
bits_per_word_ = 8;
@@ -85,7 +88,7 @@ bool SpiDriverSpiDev::Transfer(const void* tx_data, void* rx_data, size_t len) {
msg.rx_buf = (unsigned long)rx_data;
msg.speed_hz = speed_hz_;
msg.bits_per_word = bits_per_word_;
- msg.delay_usecs = 0;
+ msg.delay_usecs = delay_usecs_;
msg.len = len;
if (char_interface_->Ioctl(fd_, SPI_IOC_MESSAGE(1), &msg) < 0) {
@@ -161,4 +164,9 @@ bool SpiDriverSpiDev::SetBitsPerWord(uint8_t bits_per_word) {
return true;
}
+bool SpiDriverSpiDev::SetDelay(uint16_t delay_usecs) {
+ delay_usecs_ = delay_usecs;
+ return true;
+}
+
} // namespace android
diff --git a/daemon/spi_driver_spidev.h b/daemon/spi_driver_spidev.h
index 1214e2b..f573fb0 100644
--- a/daemon/spi_driver_spidev.h
+++ b/daemon/spi_driver_spidev.h
@@ -41,6 +41,7 @@ class SpiDriverSpiDev : public SpiDriverInterface {
bool SetMode(SpiMode mode) override;
bool SetBitJustification(bool lsb_first) override;
bool SetBitsPerWord(uint8_t bits_per_word) override;
+ bool SetDelay(uint16_t delay_usecs) override;
private:
bool GetMaxFrequency(uint32_t* max_freq);
@@ -48,6 +49,7 @@ class SpiDriverSpiDev : public SpiDriverInterface {
int fd_;
uint32_t bits_per_word_;
uint32_t speed_hz_;
+ uint16_t delay_usecs_;
std::unique_ptr<CharDeviceInterface> char_interface_;
// Used for unit testing and is null in production.
diff --git a/daemon/spi_manager.h b/daemon/spi_manager.h
index 80c9d64..deec13c 100644
--- a/daemon/spi_manager.h
+++ b/daemon/spi_manager.h
@@ -76,6 +76,10 @@ class SpiDevice {
return bus_->driver_->SetBitsPerWord(bits_per_word);
}
+ bool SetDelay(uint16_t delay_usecs) {
+ return bus_->driver_->SetDelay(delay_usecs);
+ }
+
private:
SpiDevBus* bus_;
};
diff --git a/include/peripheralmanager/spi_device.h b/include/peripheralmanager/spi_device.h
index e3392e2..e81bdc1 100644
--- a/include/peripheralmanager/spi_device.h
+++ b/include/peripheralmanager/spi_device.h
@@ -101,6 +101,12 @@ int BSpiDevice_setBitJustification(const BSpiDevice* device,
/// @return 0 on success, errno on error.
int BSpiDevice_setBitsPerWord(const BSpiDevice* device, uint8_t bits_per_word);
+/// Sets the delay to wait after each transfer.
+/// @param device Pointer to the BSpiDevice struct.
+/// @param delay_usecs Delay in microseconds.
+/// @return 0 on success, errno on error.
+int BSpiDevice_setDelay(const BSpiDevice* device, uint16_t delay_usecs);
+
/// Destroys a BSpiDevice struct.
/// @param device Pointer to the BSpiDevice struct.
void BSpiDevice_delete(BSpiDevice* device);
diff --git a/ipc/android/os/IPeripheralManagerClient.aidl b/ipc/android/os/IPeripheralManagerClient.aidl
index bdd7ac6..bc99415 100644
--- a/ipc/android/os/IPeripheralManagerClient.aidl
+++ b/ipc/android/os/IPeripheralManagerClient.aidl
@@ -57,6 +57,8 @@ interface IPeripheralManagerClient {
void SpiDeviceSetBitsPerWord(@utf8InCpp String name, int nbits);
+ void SpiDeviceSetDelay(@utf8InCpp String name, int delay_usecs);
+
void ListLeds(out @utf8InCpp List<String> leds);
void OpenLed(@utf8InCpp String name);