aboutsummaryrefslogtreecommitdiff
path: root/apps/drivers/device/i2c.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'apps/drivers/device/i2c.cpp')
-rw-r--r--apps/drivers/device/i2c.cpp204
1 files changed, 0 insertions, 204 deletions
diff --git a/apps/drivers/device/i2c.cpp b/apps/drivers/device/i2c.cpp
deleted file mode 100644
index a416801eb..000000000
--- a/apps/drivers/device/i2c.cpp
+++ /dev/null
@@ -1,204 +0,0 @@
-/****************************************************************************
- *
- * Copyright (C) 2012 PX4 Development Team. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * 3. Neither the name PX4 nor the names of its contributors may be
- * used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- ****************************************************************************/
-
-/**
- * @file i2c.cpp
- *
- * Base class for devices attached via the I2C bus.
- *
- * @todo Bus frequency changes; currently we do nothing with the value
- * that is supplied. Should we just depend on the bus knowing?
- */
-
-#include "i2c.h"
-
-namespace device
-{
-
-I2C::I2C(const char *name,
- const char *devname,
- int bus,
- uint16_t address,
- uint32_t frequency,
- int irq) :
- // base class
- CDev(name, devname, irq),
- // public
- // protected
- _retries(0),
- // private
- _bus(bus),
- _address(address),
- _frequency(frequency),
- _dev(nullptr)
-{
-}
-
-I2C::~I2C()
-{
- if (_dev)
- up_i2cuninitialize(_dev);
-}
-
-int
-I2C::init()
-{
- int ret = OK;
-
- /* attach to the i2c bus */
- _dev = up_i2cinitialize(_bus);
-
- if (_dev == nullptr) {
- debug("failed to init I2C");
- ret = -ENOENT;
- goto out;
- }
-
- // call the probe function to check whether the device is present
- ret = probe();
-
- if (ret != OK) {
- debug("probe failed");
- goto out;
- }
-
- // do base class init, which will create device node, etc
- ret = CDev::init();
-
- if (ret != OK) {
- debug("cdev init failed");
- goto out;
- }
-
- // tell the world where we are
- log("on I2C bus %d at 0x%02x", _bus, _address);
-
-out:
- return ret;
-}
-
-int
-I2C::probe()
-{
- // Assume the device is too stupid to be discoverable.
- return OK;
-}
-
-int
-I2C::transfer(const uint8_t *send, unsigned send_len, uint8_t *recv, unsigned recv_len)
-{
- struct i2c_msg_s msgv[2];
- unsigned msgs;
- int ret;
- unsigned retry_count = 0;
-
- do {
- // debug("transfer out %p/%u in %p/%u", send, send_len, recv, recv_len);
-
- msgs = 0;
-
- if (send_len > 0) {
- msgv[msgs].addr = _address;
- msgv[msgs].flags = 0;
- msgv[msgs].buffer = const_cast<uint8_t *>(send);
- msgv[msgs].length = send_len;
- msgs++;
- }
-
- if (recv_len > 0) {
- msgv[msgs].addr = _address;
- msgv[msgs].flags = I2C_M_READ;
- msgv[msgs].buffer = recv;
- msgv[msgs].length = recv_len;
- msgs++;
- }
-
- if (msgs == 0)
- return -EINVAL;
-
- /*
- * I2C architecture means there is an unavoidable race here
- * if there are any devices on the bus with a different frequency
- * preference. Really, this is pointless.
- */
- I2C_SETFREQUENCY(_dev, _frequency);
- ret = I2C_TRANSFER(_dev, &msgv[0], msgs);
-
- /* success */
- if (ret == OK)
- break;
-
- /* if we have already retried once, or we are going to give up, then reset the bus */
- if ((retry_count >= 1) || (retry_count >= _retries))
- up_i2creset(_dev);
-
- } while (retry_count++ < _retries);
-
- return ret;
-
-}
-
-int
-I2C::transfer(i2c_msg_s *msgv, unsigned msgs)
-{
- int ret;
- unsigned retry_count = 0;
-
- /* force the device address into the message vector */
- for (unsigned i = 0; i < msgs; i++)
- msgv[i].addr = _address;
-
-
- do {
- /*
- * I2C architecture means there is an unavoidable race here
- * if there are any devices on the bus with a different frequency
- * preference. Really, this is pointless.
- */
- I2C_SETFREQUENCY(_dev, _frequency);
- ret = I2C_TRANSFER(_dev, msgv, msgs);
-
- /* success */
- if (ret == OK)
- break;
-
- /* if we have already retried once, or we are going to give up, then reset the bus */
- if ((retry_count >= 1) || (retry_count >= _retries))
- up_i2creset(_dev);
-
- } while (retry_count++ < _retries);
-
- return ret;
-}
-
-} // namespace device \ No newline at end of file