/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include "spi_device_impl.h" using android::sp; using android::os::IPeripheralManagerClient; using android::binder::Status; SpiDeviceImpl::SpiDeviceImpl(const std::string& name, sp client) : name_(name), client_(client) {} SpiDeviceImpl::~SpiDeviceImpl() { client_->ReleaseSpiDevice(name_); } int SpiDeviceImpl::WriteByte(uint8_t byte) { return client_->SpiDeviceWriteByte(name_, byte).serviceSpecificErrorCode(); } int SpiDeviceImpl::WriteBuffer(const uint8_t* data, size_t len) { std::vector v(data, data + len); return client_->SpiDeviceWriteBuffer(name_, v).serviceSpecificErrorCode(); } int SpiDeviceImpl::Transfer(const uint8_t* tx_data, uint8_t* rx_data, size_t len) { std::unique_ptr> sent; std::unique_ptr> received; if (tx_data == nullptr) return EINVAL; sent.reset(new std::vector(tx_data, tx_data + len)); Status status = client_->SpiDeviceTransfer(name_, sent, &received, len); if (status.isOk() && rx_data) memcpy(rx_data, received->data(), len); return status.serviceSpecificErrorCode(); } int SpiDeviceImpl::SetFrequency(uint32_t freq_hz) { return client_->SpiDeviceSetFrequency(name_, freq_hz) .serviceSpecificErrorCode(); } int SpiDeviceImpl::SetMode(int mode) { return client_->SpiDeviceSetMode(name_, mode).serviceSpecificErrorCode(); } int SpiDeviceImpl::SetBitJustification(int justification) { return client_ ->SpiDeviceSetBitJustification(name_, justification == SPI_LSB_FIRST) .serviceSpecificErrorCode(); } 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(); }