diff --git a/CMakeLists.txt b/CMakeLists.txt index 5c5cd38..cd442a4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,6 @@ SET(CMAKE_SWIG_FLAGS "") option(test "Build all tests." OFF) add_subdirectory (src) -add_subdirectory (api) add_subdirectory (examples) if (test) diff --git a/api/CMakeLists.txt b/api/CMakeLists.txt deleted file mode 100644 index e69de29..0000000 diff --git a/src/i2c/i2c.h b/api/i2c.h similarity index 95% rename from src/i2c/i2c.h rename to api/i2c.h index e8d9fdd..628a68a 100644 --- a/src/i2c/i2c.h +++ b/api/i2c.h @@ -1,8 +1,6 @@ /* - * Copyright (C) Intel Corporation. - * * Author: Brendan Le Foll - * + * * Copyright © 2014 Intel Corporation * * Permission is hereby granted, free of charge, to any person obtaining @@ -25,6 +23,13 @@ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +#pragma once + +#include +#include + +#include "smbus.hpp" + namespace maa { /** An I2C Master, used for communicating with I2C slave devices @@ -133,5 +138,6 @@ public: protected: void aquire(); int _hz; + int i2c_handle; }; } diff --git a/api/maa.h b/api/maa.h new file mode 100644 index 0000000..4ab972f --- /dev/null +++ b/api/maa.h @@ -0,0 +1,31 @@ +/* + * Author: Brendan Le Foll + * + * Copyright © 2014 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#pragma once + +#include "i2c.h" + +#define MAA_LIBRARY_VERSION 1 + +int get_version(); diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 358a454..a0db23a 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,7 +1,7 @@ add_executable (readi2c readi2c.cpp) add_executable (hellomaa hellomaa.cpp) -include_directories(${PROJECT_SOURCE_DIR}/src) +include_directories(${PROJECT_SOURCE_DIR}/api ${PROJECT_SOURCE_DIR}/include) target_link_libraries (hellomaa maa) target_link_libraries (readi2c maa) diff --git a/include/linux/i2c-dev.h b/include/linux/i2c-dev.h index 92db53d..473d083 100644 --- a/include/linux/i2c-dev.h +++ b/include/linux/i2c-dev.h @@ -7,12 +7,6 @@ *** structures, and macros generated from the original header, and thus, *** contains no copyrightable information. *** - *** To edit the content of this header, modify the corresponding - *** source file (e.g. under external/kernel-headers/original/) then - *** run bionic/libc/kernel/tools/update_all.py - *** - *** Any manual change here will be lost the next time this script will - *** be run. You've been warned! *** **************************************************************************** ****************************************************************************/ @@ -20,30 +14,83 @@ #define _UAPI_LINUX_I2C_DEV_H #include #include -/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + #define I2C_RETRIES 0x0701 #define I2C_TIMEOUT 0x0702 #define I2C_SLAVE 0x0703 #define I2C_SLAVE_FORCE 0x0706 -/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + #define I2C_TENBIT 0x0704 #define I2C_FUNCS 0x0705 #define I2C_RDWR 0x0707 #define I2C_PEC 0x0708 -/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + #define I2C_SMBUS 0x0720 + struct i2c_smbus_ioctl_data { - __u8 read_write; + char read_write; __u8 command; -/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ - __u32 size; + int size; union i2c_smbus_data __user *data; }; struct i2c_rdwr_ioctl_data { -/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ struct i2c_msg __user *msgs; - __u32 nmsgs; + int nmsgs; }; + +#define I2C_SMBUS_BLOCK_MAX 32 +#define I2C_SMBUS_I2C_BLOCK_MAX 32 +union i2c_smbus_data { + __u8 byte; + __u16 word; + __u8 block[I2C_SMBUS_BLOCK_MAX + 2]; +}; + #define I2C_RDRW_IOCTL_MAX_MSGS 42 -/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + +struct i2c_msg { + __u16 addr; + unsigned short flags; +#define I2C_M_TEN 0x10 +#define I2C_M_RD 0x01 +#define I2C_M_NOSTART 0x4000 +#define I2C_M_REV_DIR_ADDR 0x2000 +#define I2C_M_IGNORE_NAK 0x1000 +#define I2C_M_NO_RD_ACK 0x0800 + short len; + char *buf; +}; + +#define I2C_NOCMD 0 +#define I2C_SMBUS_READ 1 +#define I2C_SMBUS_WRITE 0 + +#define I2C_SMBUS_QUICK 0 +#define I2C_SMBUS_BYTE 1 +#define I2C_SMBUS_BYTE_DATA 2 +#define I2C_SMBUS_WORD_DATA 3 +#define I2C_SMBUS_PROC_CALL 4 +#define I2C_SMBUS_BLOCK_DATA 5 +#define I2C_SMBUS_I2C_BLOCK_BROKEN 6 +#define I2C_SMBUS_BLOCK_PROC_CALL 7 +#define I2C_SMBUS_I2C_BLOCK_DATA 8 + +#define I2C_FUNC_I2C 0x00000001 +#define I2C_FUNC_10BIT_ADDR 0x00000002 +#define I2C_FUNC_PROTOCOL_MANGLING 0x00000004 +#define I2C_FUNC_SMBUS_PEC 0x00000008 +#define I2C_FUNC_SMBUS_BLOCK_PROC_CALL 0x00008000 +#define I2C_FUNC_SMBUS_QUICK 0x00010000 +#define I2C_FUNC_SMBUS_READ_BYTE 0x00020000 +#define I2C_FUNC_SMBUS_WRITE_BYTE 0x00040000 +#define I2C_FUNC_SMBUS_READ_BYTE_DATA 0x00080000 +#define I2C_FUNC_SMBUS_WRITE_BYTE_DATA 0x00100000 +#define I2C_FUNC_SMBUS_READ_WORD_DATA 0x00200000 +#define I2C_FUNC_SMBUS_WRITE_WORD_DATA 0x00400000 +#define I2C_FUNC_SMBUS_PROC_CALL 0x00800000 +#define I2C_FUNC_SMBUS_READ_BLOCK_DATA 0x01000000 +#define I2C_FUNC_SMBUS_WRITE_BLOCK_DATA 0x02000000 +#define I2C_FUNC_SMBUS_READ_I2C_BLOCK 0x04000000 +#define I2C_FUNC_SMBUS_WRITE_I2C_BLOCK 0x08000000 + #endif diff --git a/include/smbus.h b/include/smbus.h new file mode 100644 index 0000000..d9eb7c8 --- /dev/null +++ b/include/smbus.h @@ -0,0 +1,93 @@ +/* + * Author: Robin Knight (robin.knight@roadnarrows.com) + * + * Copyright © 2009 RoadNarrows LLC. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that + * (1) The above copyright notice and the following two paragraphs + * appear in all copies of the source code and (2) redistributions + * including binaries reproduces these notices in the supporting + * documentation. Substantial modifications to this software may be + * copyrighted by their authors and need not follow the licensing terms + * described here, provided that the new terms are clearly indicated in + * all files where they apply. + * + * IN NO EVENT SHALL THE AUTHOR, ROADNARROWS LLC, OR ANY MEMBERS/EMPLOYEES + * OF ROADNARROW LLC OR DISTRIBUTORS OF THIS SOFTWARE BE LIABLE TO ANY + * PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, + * EVEN IF THE AUTHORS OR ANY OF THE ABOVE PARTIES HAVE BEEN ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + * + * THE AUTHOR AND ROADNARROWS LLC SPECIFICALLY DISCLAIM ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN + * "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#include "linux/i2c-dev.h" + +typedef union i2c_smbus_data_union +{ + uint8_t byte; ///< data byte + unsigned short word; ///< data short word + uint8_t block[I2C_SMBUS_BLOCK_MAX + 2]; + ///< block[0] is used for length and one more for PEC +} i2c_smbus_data_t; + +typedef struct i2c_smbus_ioctl_data_struct +{ + uint8_t read_write; ///< operation direction + uint8_t command; ///< ioctl command + int size; ///< data size + i2c_smbus_data_t *data; ///< data +} i2c_smbus_ioctl_data_t; + +// --------------------------------------------------------------------------- +// Prototypes +// --------------------------------------------------------------------------- + +extern int i2c_smbus_access(int fd, uint8_t read_write, uint8_t command, + int size, i2c_smbus_data_t *data); + +extern int i2c_smbus_write_quick(int fd, uint8_t value); + +extern int i2c_smbus_read_byte(int fd); + +extern int i2c_smbus_write_byte(int fd, uint8_t value); + +extern int i2c_smbus_read_byte_data(int fd, uint8_t command); + +extern int i2c_smbus_write_byte_data(int fd, uint8_t command, uint8_t value); + +extern int i2c_smbus_read_word_data(int fd, uint8_t command); + +extern int i2c_smbus_write_word_data(int fd, uint8_t command, unsigned short value); + +extern int i2c_smbus_process_call(int fd, uint8_t command, unsigned short value); + +extern int i2c_smbus_read_block_data(int fd, uint8_t command, uint8_t *values); + +extern int i2c_smbus_write_block_data(int fd, uint8_t command, uint8_t length, + const uint8_t *values); +extern int i2c_smbus_read_i2c_block_data(int fd, uint8_t command, + uint8_t *values); + +extern int i2c_smbus_write_i2c_block_data(int fd, uint8_t command, uint8_t length, + const uint8_t *values); + +extern int i2c_smbus_block_process_call(int fd, uint8_t command, uint8_t length, + uint8_t *values); diff --git a/include/smbus.hpp b/include/smbus.hpp new file mode 100644 index 0000000..51277a7 --- /dev/null +++ b/include/smbus.hpp @@ -0,0 +1,8 @@ +#pragma once + +// This header is required to remove the issues with g++ name mangling + +extern "C" +{ +#include "smbus.h" +} diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e75ba55..e54fee1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,4 +1,15 @@ -add_library (maa i2c/i2c.cxx maa.cxx) +include_directories( + ${PROJECT_SOURCE_DIR}/api + ${PROJECT_SOURCE_DIR}/include +) + +set (maa_LIB_SRCS + ${PROJECT_SOURCE_DIR}/src/maa.cxx + ${PROJECT_SOURCE_DIR}/src/i2c/i2c.cxx + ${PROJECT_SOURCE_DIR}/src/i2c/smbus.c +) + +add_library (maa STATIC ${maa_LIB_SRCS}) add_subdirectory(python) add_subdirectory(javascript) diff --git a/src/i2c/i2c.cxx b/src/i2c/i2c.cxx index eeb22cc..39ea2f0 100644 --- a/src/i2c/i2c.cxx +++ b/src/i2c/i2c.cxx @@ -26,11 +26,17 @@ */ #include "i2c.h" +#include "smbus.h" using namespace maa; I2C::I2C(unsigned int sda, unsigned int scl) { + // Galileo only has one I2C device which is always /dev/i2c-0 + // reliability is a fickle friend! + if (i2c_handle = open("/dev/i2c-0", O_RDWR) < 1) { + fprintf(stderr, "Failed to open requested i2c port"); + } } void @@ -48,7 +54,11 @@ I2C::read(int address, char *data, int length, bool repeated) int I2C::read(int ack) { - return 0; + int byte; + if (byte = i2c_smbus_read_byte(i2c_handle) < 0) { + return -1; + } + return byte; } int diff --git a/src/i2c/smbus.c b/src/i2c/smbus.c new file mode 100644 index 0000000..68ceef7 --- /dev/null +++ b/src/i2c/smbus.c @@ -0,0 +1,420 @@ +// Library: libi2c API +// File: smbus.c + +/*! \file + * + * $LastChangedDate: 2009-09-09 09:44:12 -0600 (Wed, 09 Sep 2009) $ + * $Rev: 130 $ + * + * \brief System Management Bus (SMBus) over I2C communication + * interface. + * + * \author Robin Knight (robin.knight@roadnarrows.com) + * + * \par Copyright: + * (C) 2009. RoadNarrows LLC. + * (http://www.roadnarrows.com) \n + * All Rights Reserved + * + *
+ * \par Original Source and Copyright: + * See i2c-dev.h. + * + *
+ */ +// Permission is hereby granted, without written agreement and without +// license or royalty fees, to use, copy, modify, and distribute this +// software and its documentation for any purpose, provided that +// (1) The above copyright notice and the following two paragraphs +// appear in all copies of the source code and (2) redistributions +// including binaries reproduces these notices in the supporting +// documentation. Substantial modifications to this software may be +// copyrighted by their authors and need not follow the licensing terms +// described here, provided that the new terms are clearly indicated in +// all files where they apply. +// +// IN NO EVENT SHALL THE AUTHOR, ROADNARROWS LLC, OR ANY MEMBERS/EMPLOYEES +// OF ROADNARROW LLC OR DISTRIBUTORS OF THIS SOFTWARE BE LIABLE TO ANY +// PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, +// EVEN IF THE AUTHORS OR ANY OF THE ABOVE PARTIES HAVE BEEN ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. +// +// THE AUTHOR AND ROADNARROWS LLC SPECIFICALLY DISCLAIM ANY WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +// FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN +// "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO +// PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +// +//////////////////////////////////////////////////////////////////////////////// + +#include "smbus.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*! + * \brief Execute an SMBus IOCTL. + * + * \param fd File descriptor to opened SMBus device. + * \param read_write Operation access type. + * \param command Operation command or immediate data. + * \param size Data size. + * \param [in,out] data Read/write/control data + * + * \return + * Returns \h_ge 0 on success. + * Else errno is set appropriately and -1 is returned. + */ +int i2c_smbus_access(int fd, uint8_t read_write, uint8_t command, + int size, i2c_smbus_data_t *data) +{ + i2c_smbus_ioctl_data_t args; + + args.read_write = read_write; + args.command = command; + args.size = size; + args.data = data; + + return ioctl(fd, I2C_SMBUS, &args); +} + +/*! + * \brief Write a quick value to the SMBus. + * + * \param fd File descriptor to opened SMBus device. + * \param value Value to write + * + * \return + * Returns \h_ge 0 on success. + * Else errno is set appropriately and -1 is returned. + */ +int i2c_smbus_write_quick(int fd, uint8_t value) +{ + return i2c_smbus_access(fd, value, I2C_NOCMD, I2C_SMBUS_QUICK, NULL); +} + +/*! + * \brief Read an immediate byte from the SMBus. + * + * \param fd File descriptor to opened SMBus device. + * + * \return + * Returns read byte on on success. + * Else errno is set appropriately and -1 is returned. + */ +int i2c_smbus_read_byte(int fd) +{ + i2c_smbus_data_t data; + int rc; + + rc = i2c_smbus_access(fd, I2C_SMBUS_READ, I2C_NOCMD, I2C_SMBUS_BYTE, &data); + + return rc>=0? 0x0FF & data.byte: -1; +} + +/*! + * \brief Write an immediate byte to the SMBus. + * + * \param fd File descriptor to opened SMBus device. + * \param value Byte value to write. + * + * \return + * Returns \h_ge 0 on success. + * Else errno is set appropriately and -1 is returned. + */ +int i2c_smbus_write_byte(int fd, uint8_t value) +{ + return i2c_smbus_access(fd, I2C_SMBUS_WRITE, value, I2C_SMBUS_BYTE, NULL); +} + +/*! + * \brief Read a data byte from the SMBus. + * + * \param fd File descriptor to opened SMBus device. + * \param command Command to SMBus device. + * + * \return + * Returns read byte on on success. + * Else errno is set appropriately and -1 is returned. + */ +int i2c_smbus_read_byte_data(int fd, uint8_t command) +{ + i2c_smbus_data_t data; + int rc; + + rc = i2c_smbus_access(fd, I2C_SMBUS_READ, command, I2C_SMBUS_BYTE_DATA, + &data); + + return rc>=0? 0x0FF & data.byte: -1; +} + +/*! + * \brief Write a data byte to the SMBus. + * + * \param fd File descriptor to opened SMBus device. + * \param command Command to SMBus device. + * \param value Byte value to write. + * + * \return + * Returns \h_ge 0 on success. + * Else errno is set appropriately and -1 is returned. + */ +int i2c_smbus_write_byte_data(int fd, uint8_t command, uint8_t value) +{ + i2c_smbus_data_t data; + + data.byte = value; + + return i2c_smbus_access(fd, I2C_SMBUS_WRITE, command, + I2C_SMBUS_BYTE_DATA, &data); +} + +/*! + * \brief Read a data 2-byte word from the SMBus. + * + * \param fd File descriptor to opened SMBus device. + * \param command Command to SMBus device. + * + * \return + * Returns read 2-byte word on on success. + * Else errno is set appropriately and -1 is returned. + */ +int i2c_smbus_read_word_data(int fd, uint8_t command) +{ + i2c_smbus_data_t data; + int rc; + + rc = i2c_smbus_access(fd, I2C_SMBUS_READ, command, I2C_SMBUS_WORD_DATA, + &data); + + return rc>=0? 0x0FFFF & data.word: -1; +} + +/*! + * \brief Write a data 2-byte word to the SMBus. + * + * \param fd File descriptor to opened SMBus device. + * \param command Command to SMBus device. + * \param value Word value to write. + * + * \return + * Returns \h_ge 0 on success. + * Else errno is set appropriately and -1 is returned. + */ +int i2c_smbus_write_word_data(int fd, uint8_t command, unsigned short value) +{ + i2c_smbus_data_t data; + + data.word = value; + + return i2c_smbus_access(fd, I2C_SMBUS_WRITE, command, + I2C_SMBUS_WORD_DATA, &data); +} + +/*! + * \brief Issue a 2-byte word process call (write/read) to the SMBus. + * + * \param fd File descriptor to opened SMBus device. + * \param command Command to SMBus device. + * \param value Word value to write. + * + * \return + * Returns read 2-byte word on on success. + * Else errno is set appropriately and -1 is returned. + */ +int i2c_smbus_process_call(int fd, uint8_t command, unsigned short value) +{ + i2c_smbus_data_t data; + int rc; + + data.word = value; + + rc = i2c_smbus_access(fd, I2C_SMBUS_WRITE, command, I2C_SMBUS_PROC_CALL, + &data); + + return rc>=0? 0x0FFFF & data.word: -1; +} + + +/*! + * \brief Read a block of data from the SMBus. + * + * \param fd File descriptor to opened SMBus device. + * \param command Command to SMBus device. + * \param [out] values Buffer to hold the block of read byte values.\n + * Must be large enough to receive the data. + * + * \return + * On success, returns \h_ge 0 the number of bytes read, excluding any header + * fields. Else errno is set appropriately and -1 is returned. + */ +int i2c_smbus_read_block_data(int fd, uint8_t command, uint8_t *values) +{ + i2c_smbus_data_t data; + int i; + int rc; + + rc = i2c_smbus_access(fd, I2C_SMBUS_READ, command, I2C_SMBUS_BLOCK_DATA, + &data); + + if( rc >= 0 ) + { + for(i=1; i<=data.block[0]; ++i) + { + values[i-1] = data.block[i]; + } + rc = data.block[0]; + } + + return rc; +} + +/*! + * \brief Write a data block to the SMBus. + * + * \param fd File descriptor to opened SMBus device. + * \param command Command to SMBus device. + * \param length Length of buffer (bytes) to write. + * \param [in] values Buffer of data to write. + * + * \return + * Returns \h_ge 0 on success. + * Else errno is set appropriately and -1 is returned. + */ +int i2c_smbus_write_block_data(int fd, uint8_t command, uint8_t length, + const uint8_t *values) +{ + i2c_smbus_data_t data; + int i; + + if( length > I2C_SMBUS_BLOCK_MAX ) + { + length = I2C_SMBUS_BLOCK_MAX; + } + + for(i=1; i<=length; i++) + { + data.block[i] = values[i-1]; + } + data.block[0] = length; + + return i2c_smbus_access(fd, I2C_SMBUS_WRITE, command, + I2C_SMBUS_BLOCK_DATA, &data); +} + +/*! + * \brief Read a block of data from the SMBus via low-level I2C. + * + * \param fd File descriptor to opened SMBus device. + * \param command Command to SMBus device. + * \param [out] values Buffer to hold the block of read byte values.\n + * Must be large enough to receive the data. + * + * \return + * On success, returns \h_ge 0 the number of bytes read, excluding any header + * fields. Else errno is set appropriately and -1 is returned. + */ +int i2c_smbus_read_i2c_block_data(int fd, uint8_t command, uint8_t *values) +{ + i2c_smbus_data_t data; + int i; + int rc; + + rc = i2c_smbus_access(fd, I2C_SMBUS_READ, command, I2C_SMBUS_I2C_BLOCK_DATA, + &data); + if( rc >= 0 ) + { + for(i=1; i<=data.block[0]; i++) + { + values[i-1] = data.block[i]; + } + rc = data.block[0]; + } + return rc; +} + +/*! + * \brief Write a block of data to the SMBus via low-level I2C. + * + * \param fd File descriptor to opened SMBus device. + * \param command Command to SMBus device. + * \param length Length of buffer (bytes) to write. + * \param [in] values Buffer of data to write. + * + * \return + * Returns \h_ge 0 on success. + * Else errno is set appropriately and -1 is returned. + */ +int i2c_smbus_write_i2c_block_data(int fd, uint8_t command, uint8_t length, + const uint8_t *values) +{ + i2c_smbus_data_t data; + int i; + + if( length > I2C_SMBUS_I2C_BLOCK_MAX ) + { + length = I2C_SMBUS_I2C_BLOCK_MAX; + } + + for(i=1; i<=length; i++) + { + data.block[i] = values[i-1]; + } + data.block[0] = length; + + return i2c_smbus_access(fd, I2C_SMBUS_WRITE, command, + I2C_SMBUS_I2C_BLOCK_DATA, &data); +} + +/*! + * \brief Issue a block process call (write/read) to the SMBus. + * + * \param fd File descriptor to opened SMBus device. + * \param command Command to SMBus device. + * \param length Length of buffer (bytes) to write. + * \param [in,out] values Buffer of data to write and to hold the block of + * read byte values.\n + * Must be large enough to receive the data. + * + * \return + * On success, returns \h_ge 0 the number of bytes read, excluding any header + * fields. Else errno is set appropriately and -1 is returned. + */ +int i2c_smbus_block_process_call(int fd, uint8_t command, uint8_t length, + uint8_t *values) +{ + i2c_smbus_data_t data; + int i; + int rc; + + if( length > I2C_SMBUS_BLOCK_MAX ) + { + length = I2C_SMBUS_BLOCK_MAX; + } + + for(i=1; i<=length; i++) + { + data.block[i] = values[i-1]; + } + data.block[0] = length; + + rc = i2c_smbus_access(fd, I2C_SMBUS_WRITE, command, I2C_SMBUS_BLOCK_PROC_CALL, + &data); + + if( rc >= 0 ) + { + for(i=1; i<=data.block[0]; i++) + { + values[i-1] = data.block[i]; + } + rc = data.block[0]; + } + + return rc; +} + +#ifdef __cplusplus +} +#endif diff --git a/src/javascript/CMakeLists.txt b/src/javascript/CMakeLists.txt index 4f4f8df..e8e8eaf 100644 --- a/src/javascript/CMakeLists.txt +++ b/src/javascript/CMakeLists.txt @@ -16,7 +16,7 @@ include_directories( SET_SOURCE_FILES_PROPERTIES(maajs.i PROPERTIES CPLUSPLUS ON) SET_SOURCE_FILES_PROPERTIES(maajs.i PROPERTIES SWIG_FLAGS "-node") -SWIG_ADD_MODULE(maajs javascript maajs.i ../maa.cxx ../i2c/i2c.cxx) +SWIG_ADD_MODULE(maajs javascript ${maa_LIB_SRCS}) SWIG_LINK_LIBRARIES(maajs ${NODE_LIBRARIES}) set_target_properties(maajs PROPERTIES diff --git a/src/maa.h b/src/maa.h deleted file mode 100644 index 635cf4d..0000000 --- a/src/maa.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) Intel Corporation. - * - * Author: Brendan Le Foll - * - * Copyright © 2014 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#pragma once - -#include "i2c/i2c.h" - -#define MAA_LIBRARY_VERSION 1 - -int get_version(); diff --git a/src/maa.i b/src/maa.i index 19741bb..7998812 100644 --- a/src/maa.i +++ b/src/maa.i @@ -1,2 +1,6 @@ +%{ + #include "maa.h" +%} + %include "maa.h" -%include "i2c/i2c.h" +%include "i2c.h" diff --git a/src/python/CMakeLists.txt b/src/python/CMakeLists.txt index 6085528..a880a09 100644 --- a/src/python/CMakeLists.txt +++ b/src/python/CMakeLists.txt @@ -8,5 +8,5 @@ include_directories( SET_SOURCE_FILES_PROPERTIES(pymaa.i PROPERTIES CPLUSPLUS ON) -SWIG_ADD_MODULE(pymaa python pymaa.i ../maa.cxx ../i2c/i2c.cxx) +SWIG_ADD_MODULE(pymaa python pymaa.i ${maa_LIB_SRCS}) SWIG_LINK_LIBRARIES(pymaa ${PYTHON_LIBRARIES}) diff --git a/src/python/pymaa.i b/src/python/pymaa.i index 63838f3..fe26c1d 100644 --- a/src/python/pymaa.i +++ b/src/python/pymaa.i @@ -1,6 +1,3 @@ %module pymaa -%{ - #include "maa.h" -%} %include ../maa.i