Compare commits

...

298 Commits

Author SHA1 Message Date
Stefan Andritoiu
8ce214ae86 java: Added version information & checks to ensure Java version matches Native version
Signed-off-by: Stefan Andritoiu <stefan.andritoiu@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-06-01 11:30:08 +01:00
Houman brinjcargorabi
8329bcab62 intel_edison_fab_c.c: fixed the pins not being freed in the event of a tristate read failing
Signed-off-by: Houman Brinjcargorabi <houman.brinjcargorabi@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-06-01 11:29:17 +01:00
Houman brinjcargorabi
e8d6f38ee0 intel_nuc5.c: Fixed incorrect I2C numbering, effectively not shifting the pin number correctly
Signed-off-by: Houman Brinjcargorabi <houman.brinjcargorabi@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-06-01 11:29:15 +01:00
Brendan Le Foll
a177a3f729 cmake: Fix tests with multiple python bindings being built
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-06-01 11:21:20 +01:00
Brendan Le Foll
99841419ab python: Support building of both python2 & python3 bindings
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-05-26 14:51:34 +01:00
David Antler
1cfdfcddc6 Add JavaScript mraaStub project
Signed-off-by: David Antler <david.a.antler@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-05-24 11:28:04 +01:00
Houman brinjcargorabi
a321d6707f mraa.i: Swig interface options to ignore the void* IO constructors and pre-initialise the c++ template functions
Signed-off-by: Houman Brinjcargorabi <houman.brinjcargorabi@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-05-24 11:21:13 +01:00
Houman brinjcargorabi
b6e6374370 c++: Added the ability to initialise a class using a context struct
Signed-off-by: Houman Brinjcargorabi <houman.brinjcargorabi@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-05-24 11:21:13 +01:00
Houman brinjcargorabi
bcf1584fbe mraa.c: Added common function to init io from a description
Signed-off-by: Houman Brinjcargorabi <houman.brinjcargorabi@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-05-24 11:21:13 +01:00
Houman brinjcargorabi
a9de84b74a intel_galileo_rev_g.c: Corrected typo in mapping re setting the pincmd for GPIO2
Fixes typo in 95c259f6b2

Acked-by: Houman Brinjcargorabi <houman.brinjcargorabi@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-05-20 11:26:59 +01:00
Alex Tereschenko
0ee25fbd4d pwm.hpp: fixed some typos and styling in comments
Signed-off-by: Alex Tereschenko <alext.mkrs@gmail.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-05-19 11:52:16 +01:00
Bruno Meneguele
4fc3e7a73f banana_pi.md: fixed header table layout
In the second table (second 8-pin connector) wasn't present the table header and
because of that the layout was broken.

Signed-off-by: Bruno Eduardo de Oliveira Meneguele <bmeneguele@gmail.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-05-19 11:51:52 +01:00
Brendan Le Foll
88d878648b beaglebone.c: Remove unused variables
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-05-19 11:51:07 +01:00
Alexandru Timohi
828338a69a libmraa: Fix compilation warnings about unsigned ints
Make better use of unsigned/signed ints, signed ints are preffered unless there
is a good reason not to.

Signed-off-by: Alexandru Timohi <alexandru.timohi@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-05-19 11:50:33 +01:00
Brendan Le Foll
022b36355f x86: Fix capabilities being initialised with only 7 bits
This whilst ugly should not cause an issue because of our use of calloc.

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-05-19 10:23:10 +01:00
Brendan Le Foll
3969af2b24 iio.c: Fix the location mapping in iio
Go through channel array after getting byte mapping to correctly map channel
location. Doing it at the same time as mapping the indexes is unreliable
depending on filename etc...

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-05-16 12:31:47 +01:00
Stefan Andritoiu
b15ab84f61 README.md: Added java bindings to README
Signed-off-by: Stefan Andritoiu <stefan.andritoiu@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-05-16 09:05:39 +01:00
Michael Kellner
d3a220479d beaglebone.c: fix beaglebone i2c bus 2 not existing
Signed-off-by: Michael Kellner mkellner@intlweb.com
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-05-16 09:02:21 +01:00
Noel Eck
905abdec7c travis-ci: Updates to ensure MRAA builds with clang.
The MRAA clang build was getting overridden with gcc.
This commit allows MRAA to build with clang and adds nodejs
0.10 to the build matrix.  Note, this means 8 builds
(2 compilers x 4 versions of nodejs).

    * Added compiler directive for clang/gcc.

    * Added build for node010.

    * Added make install to cover the MRAA install.

Signed-off-by: Noel Eck <noel.eck@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-05-16 08:59:19 +01:00
Brendan Le Foll
db546456d2 building.md: Fix typos in INSTALL_PREFIX
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-05-04 17:26:02 +01:00
Jon Trulson
f6d9cf57c9 uart_ow: add ow specific context and store search state there
Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-05-04 09:50:02 +01:00
Mihai Tudor Panu
a702cdf4d5 ft4222: fixed pca9555 expander detection
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-05-04 09:48:40 +01:00
Evgen48
800c89bfa4 examples/java: input pin number should be parsed in base 10, not in base 8, similar to c++ sample
Signed-off-by: Eugene Smirnov <o1o2o3o4o5@gmail.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-05-04 09:46:16 +01:00
Brendan Le Foll
887acf54e1 mraa: Update to v1.0.0
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-04-28 15:59:40 +01:00
Brendan Le Foll
3a88c44620 i2c.c: rollback change to mraa_i2c_init that stopped default bus being used
Partly rollsback f2c4d95c15 which stopped
mraa_i2c_init from switching i2c bus silently. If you don't want this to
happen, you need to use mraa_i2c_init_raw. Closes #497.

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-04-26 10:59:59 +01:00
Brendan Le Foll
5e867419bc spi.hpp: rename Spi::write_word to Spi::WriteWord
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-04-25 15:38:21 +01:00
Brendan Le Foll
4195a61e52 pwm: remove pwm config_* apis as unused
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-04-25 15:37:50 +01:00
Brendan Le Foll
c524c3d372 spi: mraa_spi_write_word can now return -1 in error cases
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-04-25 15:11:08 +01:00
Brendan Le Foll
b258867c37 aio.c: pass channel to mraa_aio_init_internal
This fixes previous broken commit because dev is not defined before
_internal_init but since fp is taken during internal init we need to know the
channel number. This does not affect the internal override API.

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-04-25 12:17:32 +01:00
Brendan Le Foll
56e45f6de5 aio.c: Set channel number before grabbing filepointer
Fixes #495

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-04-25 11:53:49 +01:00
Robert Chiras
cdfdd2b9e3 Add support for android build
Using NPM, this module can be cross-compiled for Android using NDK.
But, when compiling for Android, we need to add glob.c to source files
(as in Android.mk).
Also, re-arranged the layout in binding.gyp for better readability.

Signed-off-by: Robert Chiras <robert.chiras@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-04-25 11:48:38 +01:00
Brendan Le Foll
c1465bd694 i2c: Make i2c advance function match new prototypes
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-04-22 11:59:17 +01:00
Brendan Le Foll
1e4516d026 i2c: Add exceptions for C++ i2c errors
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-04-22 11:58:57 +01:00
Brendan Le Foll
0b74aa68ab aio: Change mraa_aio_read to use int and return -1
This commit changes also the _replace function and adds exceptions to the C++
API for errors in AIO read

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-04-22 11:57:26 +01:00
Brendan Le Foll
e961558fd2 mraa: add mraa_remove_subplatform call
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-04-22 09:38:30 +01:00
Eugene Bolshakov
6d8ec87e0e edison: change pin initialization by adding pin commands
Pullup/pulldown resistors are disabled during GPIO initialization.

Signed-off-by: Eugene Bolshakov <pub@relvarsoft.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-04-19 18:39:11 +01:00
Brendan Le Foll
acf90073a8 types: Remove MRAA_ERROR_PLATFORM_ALREADY_INITIALISED
Enum was deprecated in 0.10.x and causes issues with strict C89 compliance so
is now removed

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-04-15 14:51:44 +01:00
wda2945
2404b0a683 pwm.c: Improve pwm error handling
Signed-off-by: Martin G Lane-Smith <mlanesmith@gmail.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-04-15 14:02:02 +01:00
wda2945
0da3d35a8f i2c.c: Fix typo in syslog message
Signed-off-by: Martin G Lane-Smith <mlanesmith@gmail.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-04-15 14:02:02 +01:00
wda2945
1ebe377487 uart.c: Improve error handling
Changed syslog messages and some error returns.

Signed-off-by: Martin G Lane-Smith <mlanesmith@gmail.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-04-15 14:02:02 +01:00
wda2945
e757844a3d gpio.c: Improve gpio error handling
Changed syslog messages and some error returns.

Signed-off-by: Martin G Lane-Smith <mlanesmith@gmail.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-04-15 13:46:25 +01:00
wda2945
f2c4d95c15 i2c: Improve i2c Error Handling
Edited syslog messages. Changed some return types to used signed and using -1
to indicate errors

Signed-off-by: Martin G Lane-Smith <mlanesmith@gmail.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-04-15 13:46:25 +01:00
Brendan Le Foll
c41c3b41d5 uart_ow: Better error handling in corner cases
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-04-15 12:03:32 +01:00
Brendan Le Foll
4a52ad6c4f uart_ow: Make onewire functionality optional but on by default
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-04-14 13:52:09 +01:00
Jon Trulson
a379eb7bf6 uart_ow: Initial support for Dallas 1-wire over UART support for MRAA
This commit introduces support for Dallas Semiconductor (DS) 1-wire
compliant device support using an available UART device.

The principle of operation is described in the following Application
note by Maxim Electronics:

https://www.maximintegrated.com/en/app-notes/index.mvp/id/214

with help (1-wire search) from:
https://www.maximintegrated.com/en/app-notes/index.mvp/id/187

It has been tested on Galileo 2 and Edison, with 2 DS 1-wire devices,
the DS18B20 and DS2413 connected to the bus.  A UPM driver for the
DS2413 is already complete and a PR will be submitted after this one.

It is important that you use a UART with CMOS/TTL level voltages
(3.3v/5v) RX and TX lines.  DO NOT use standard RS232 level voltages
or you are going to have a bad day.

In order for this to work, a simple interface circuit, using a single
diode must be constructed:

(forgive my "Asciihematic" :)

-|
U|
A| TX---|<--+
R|          |
T| RX-------o--------o 1-wire data bus
-|

The diode on TX is a 1N4148 (cheap and common), with the cathode
connected to TX, and the anode connected to RX and the 1-wire data
line.

The 1-wire data line requires a pull-up resistor, as the DS 1-wire
spec requires. 4.7-5K is typical for DS 1-wire buses.

NOTE: DHT-type (temp/humidity sensor) 1-wire devices ARE NOT DS 1-wire
compliant, and will not work with this code/circuit unfortunately.

Also note, this will use up one of your UARTs, which cannot be used
for any other purpose (ie: to access true UART-type serial devices).

You can however, connect as many DS 1-wire devices as feasible to this
UART, as it will function as a DS 1-wire bus master.

Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-04-14 13:41:31 +01:00
Noel Eck
69d9c26e6e pkg_config: Update mraa.pc.cmake to use new install dir
LIB_SUFFIX is no longer used.  Replaced with LIB_INSTALL_DIR
which provides the correct lib dir with arch suffix.

Moved the call to include(GNUInstallDirs) prior to checking the
CMAKE_INSTALL_LIBDIR - which is set by include(GNUInstallDirs).

Tested with cmake 2.8 and cmake 3.5.

Signed-off-by: Noel Eck <noel.eck@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-04-12 14:18:19 +01:00
Mihai Tudor Panu
62e113ed3f cmake: use LIB_INSTALL_DIR throughout instead of CMAKE_INSTALL_LIBDIR
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-04-12 14:18:19 +01:00
Alex Tereschenko
00a0abd030 isr.js: updated JS ISR example to avoid GPIO context being destroyed
Closes #403.

Signed-off-by: Alex Tereschenko <alext.mkrs@gmail.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-04-11 15:28:22 +01:00
Alex Tereschenko
ecf049eccd spi.c: removed hard frequency cap in mraa_spi_init_raw()
We rely on driver-supplied information in mraa_spi_frequency(),
so let's be consistent.

Closes #132.

Signed-off-by: Alex Tereschenko <alext.mkrs@gmail.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-04-11 15:27:34 +01:00
Fathi Boudra
e1c500414b docs: fix spelling errors
Signed-off-by: Fathi Boudra <fathi.boudra@linaro.org>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-04-11 15:13:06 +01:00
Thomas Ingleby
a9429204e3 mraa: Update to v0.10.1
Signed-off-by: Thomas Ingleby <thomas.ingleby@intel.com>
2016-03-28 17:11:31 +02:00
Thomas Ingleby
faa8d4d3d4 npm: remove imraa option from Node module
Signed-off-by: Thomas Ingleby <thomas.ingleby@intel.com>
2016-03-28 17:06:18 +02:00
Alex Tereschenko
b86ad8f073 docs: fixed invalid links in and to imraa docs
Signed-off-by: Alex Tereschenko <alext.mkrs@gmail.com>
Signed-off-by: Thomas Ingleby <thomas.ingleby@intel.com>
2016-03-28 16:57:32 +02:00
Brendan Le Foll
a218056905 i2c.c: Fix return value of mraa_i2c_write in error cases
ioctl() returns -1 on error, or otherwise a value certainly not within the
mraa_result_t enum. Fixes #480.

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-28 04:16:40 +01:00
Brendan Le Foll
52f9c48bbc mraa: Update to v0.10.0
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-24 17:01:01 +00:00
Houman Brinjcargorabi
0fabc9b46a imraa.md: Added building imraa
Signed-off-by: Houman Brinjcargorabi <houman.brinjcargorabi@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-24 14:34:12 +00:00
Brendan Le Foll
21bea74b74 mraa-gpio.c: Add return to list_pins
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-24 09:46:31 +00:00
Brendan Le Foll
8b02c419f8 edison.md: Add docs for MFD2
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-24 09:45:05 +00:00
Brendan Le Foll
296ed38227 up.c: Remove warnings about unsigned ints being passed
Whilst not the cleanest and the headers could do with an update, this is a
short term solution to stop the warnings

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-24 09:36:05 +00:00
Noel Eck
14de175425 mraajs: Allow user to override node module install path.
Currently, node modules install under the current environment's
node install path.  This happens even if cmake is passed a
CMAKE_INSTALL_PREFIX.

This change checks if a CMAKE_INSTALL_PREFIX has been provided,
in which case it prepens the install path to the NODE_MODULE_INSTALL_PATH.
If a CMAKE_INSTALL_PREFIX has NOT been provided, the the mraa node
modules get install according to the NODE_ROOT_DIR.

This fixes a problem with an install case where the caller does not
have write access to the NODE_ROOT_DIR.

Signed-off-by: Noel Eck <noel.eck@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-24 09:04:54 +00:00
Brendan Le Foll
63a29e92ea npm: add firmata & imraa support to npm
mraa_LIB_PLAT_SRCS_NOAUTO no longer used for firmata unlike USBPLAT but
mraa_LIB_SRCS_NOAUTO and this is now loaded before the standard src files for
mraa. The package still needs to be generated with IMRAA & FIRMATA enabled for
this to work.

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-23 17:00:44 +00:00
Mihai Tudor Panu
49ab97f81c firmata: very crude ISR implementation for EDGE_BOTH
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-23 15:07:23 +00:00
Brendan Le Foll
319c932036 mraa.c: made imraa mraa_add_from_lockfile more robust
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-23 11:31:53 +00:00
Brendan Le Foll
35b2426170 mraa.c: allow imraa lock file to be read if platform is unknown
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-23 10:50:03 +00:00
Brendan Le Foll
8c0aa5af2c cmake: disable TGZ from builds when IPK used
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:42:54 +00:00
Houman Brinjcargorabi
a7c688b867 galileorevh.md: Added SPI info, Fixed formatting
Added information on how to turn on GPIO 10 for CS and fixed the wild formatting

Signed-off-by: Houman Brinjcargorabi <houman.brinjcargorabi@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:30 +00:00
Houman Brinjcargorabi
6fc2bef13f hellomraa.c: Remove unused variables
Signed-off-by: Houman Brinjcargorabi <houman.brinjcargorabi@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:30 +00:00
Houman Brinjcargorabi
747429ca7e README.MD: Added mraa logo
Signed-off-by: Houman Brinjcargorabi <houman.brinjcargorabi@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:30 +00:00
deadprogram
c302269750 firmata: Call FirmataCurieIMU firmata plugin API to retrieve raw accelerometer data
Signed-off-by: Ron Evans <ron@hybridgroup.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:30 +00:00
deadprogram
de0b9e72c6 firmata: Add very simple mraa firmata examples for JS & Python
Signed-off-by: Ron Evans <ron@hybridgroup.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:30 +00:00
Brendan Le Foll
2fb577d348 firmata_mraa.c: Fix reg read to not use firmata contiuous mode
Firmata's i2c continuous mode is it's own thing and is currently not supported
in mraa

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:30 +00:00
Longwei Su
30322f8ac5 imraa.c: General imraa cleanup after static analysis
Signed-off-by: Longwei Su <lsu@ics.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:30 +00:00
Brendan Le Foll
5cfddd6bcc .travis.yml: Fix NODE_ROOT_PATH
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:30 +00:00
Brendan Le Foll
a17079c460 firmata: install node_modules to where cmake guessed node was
This does now mean that modules won't go to /usr/local with the default prefix
but may instead try to install in /usr/lib. However if using nvm they should go
to the right place as long as NODE_ROOT_DIR is set correctly. This commit
changes NODE_ROOT_DIR to actually refer to the root directory of node rather
than the include dir which is what FindNodejs gets

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:30 +00:00
Brendan Le Foll
fac9d99f01 firmata.c: check result cleanly of mraa_uart_set_baudrate
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:30 +00:00
Brendan Le Foll
ec267c3482 firmata: add timeout for firmata_pull failing
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:30 +00:00
Brendan Le Foll
df2e131d26 imraa.c: Cleanup formatting of imraa.c
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:30 +00:00
Longwei Su
317c85ecb6 imraa: add force flag and add safety checks
Signed-off-by: Longwei Su <lsu@ics.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:30 +00:00
Longwei Su
f1f578363a imraa: update udev cmake configuration
Signed-off-by: Longwei Su <lsu@ics.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:30 +00:00
longwei su
0fb2aed7af imraa: add first version of IO pinmuxing and clean up
Signed-off-by: Longwei Su <lsu@ics.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:30 +00:00
Mihai Tudor Panu
405e601387 firmata: implemented pwm functions
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:30 +00:00
Mihai Tudor Panu
0e5dadeb8c pwm: removed unused code and optimized flow for subplatform support
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:30 +00:00
Brendan Le Foll
9a5abb7d56 firmata_mraa.c: Fix type error in uint8 array
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:30 +00:00
Brendan Le Foll
334a57be11 gpio.c: Add close replace function hook
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:30 +00:00
Brendan Le Foll
1d4f721d4f firmata.md: Add basic firmata docs
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:30 +00:00
Brendan Le Foll
67eaf78fbf firmata: provide timeout for i2c read calls
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:30 +00:00
Noel Eck
451dcbad6c uart: Fix for failed malloc
Check malloc return in UART read. Throw if malloc fails.

Signed-off-by: Noel Eck <noel.eck@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:30 +00:00
Longwei Su
a52ce5d5bb imraa: add first version of imraa, the mraa initialisation daemon
Imraa allows the automatic flashing and setup of arduino101 subplatforms as
well as the initial setup of GPIO/i2c devices

Signed-off-by: Longwei Su <lsu@ics.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:30 +00:00
Rick Waldron
de42b9558f firmata: use correct i2c continuous read bits (0b00000010)
Signed-off-by: Rick Waldron <waldron.rick@gmail.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:30 +00:00
Rick Waldron
9b157e6f19 firmata: update dev->period, pwm_min_period, pwm_max_period, from ns to us
Signed-off-by: Rick Waldron <waldron.rick@gmail.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:30 +00:00
Brendan Le Foll
915be98d03 firmata.c: Remove superfleous debug output
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:30 +00:00
Brendan Le Foll
420486519b firmata_mraa.c: Fix broken handling of mraa_uart_write return values
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:30 +00:00
Brendan Le Foll
91452e5c83 firmata.c: fix possible crash if devs is wrong
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:30 +00:00
Brendan Le Foll
5789f5001d javascript/CMakeLists.txt: change SEND_ERROR for workaround to WARNING
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:30 +00:00
Brendan Le Foll
7088527339 tests/platform_checks.py: Fix test to check for NULL platform
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:30 +00:00
Brendan Le Foll
f07a442860 mraa.c: Fix pin mode test to check for NULL platform
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:30 +00:00
Mihai Tudor Panu
2919b38b15 firmata: added stubs for PWM functionality
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:30 +00:00
Mihai Tudor Panu
603834461f pwm: added hooks for subplatform support
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:29 +00:00
Brendan Le Foll
537a69923b examples: disable firmata examples if firmata disabled
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:29 +00:00
Brendan Le Foll
59107f0a29 firmata: add public firmata API to support custom firmata plugins
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:29 +00:00
Brendan Le Foll
612f566c99 firmata: remove servo stuff
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:29 +00:00
Shiran Ben-Melech
cae63bbd52 firmata: Added option to set uart non blocking state
Signed-off-by: Shiran Ben-Melech <shiran.ben-melech@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:29 +00:00
Shiran Ben-Melech
04f7cbff5d firmata: Convert mraa FirmataC implementation to work over Uart instead of serial implementation
Signed-off-by: Shiran Ben-Melech <shiran.ben-melech@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:29 +00:00
Brendan Le Foll
4b76fbd14c mraa: with NULL platform board max counts need to be checked to >= not just >
This fixes bugs when USBPLAT or FIRMATA is enabled when a NULL platform is
added or even a platform without ADC

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:29 +00:00
Brendan Le Foll
78caa990f1 firmata: initial work
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:29 +00:00
Brendan Le Foll
f2cbe1c68d aio.c: Attempt to make aio.c understand subplatforms
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:29 +00:00
Brendan Le Foll
10e1301bef types.hpp: Add C++ platform types
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:29 +00:00
Brendan Le Foll
edd554b606 cmake: Fix message handling
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:29 +00:00
Brendan Le Foll
168764481a cmake: Use correct message modes
INFO is not a valid cmake message mode, this commit cleans up a few messages to
use the correct cmake modes

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:29 +00:00
Eugene Bolshakov
3397c95c0a intel_galileo_rev_d.c: Add pin commands
Signed-off-by: Eugene Bolshakov <pub@relvarsoft.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:29 +00:00
Eugene Bolshakov
95c259f6b2 mraa.c: change pin initialization and fix Galileo Gen2 AIO
Add pin commands. Old mraa_setup_mux_mapped style is used for other boards
(pincmd = PINCMD_UNDEFINED) where pincmds are not defined.Remove useless
pullup_enable code, Galileo Gen2: review all pin mux and add commands Galileo
Gen2: remove doubled functionality: mraa_intel_galileo_gen2_i2c_init_pre and
mraa_intel_galileo_gen2_uart_init_pre. Galileo Gen2: fix "Invalid AIO pin
specified - do you have an ADC?" error. Galileo Gen2: pullup/pulldown
resistors are disabled during UART/GPIO/SPI/I2C/UIO initialization. Use
mraa_gpio_mode to enable resistors.

Signed-off-by: Eugene Bolshakov <pub@relvarsoft.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:12:29 +00:00
Henry Bruce
6c83886a51 examples: gpio-tool.js now catches exception if invalid pin is specified
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
2016-03-22 18:04:57 +00:00
Henry Bruce
143bc38e47 examples: hello_isr.py now catches exception if invalid pin is specified
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
2016-03-22 18:04:57 +00:00
Henry Bruce
a51f3a939f examples: Isr.java now catches exception if invalid pin is specified
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
2016-03-22 18:04:57 +00:00
Henry Bruce
65dc2e7ea3 javascript: Print message on stderr if mraa_init() fails
We should throw exception but SWIG_Error causes a seg fault.
We should use syslog instead of stderr but syslog.h is not swigable

Signed-off-by: Henry Bruce <henry.bruce@intel.com>
2016-03-22 18:04:57 +00:00
Henry Bruce
14617d0f36 java: Throw exception if mraa_init() fails
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
2016-03-22 18:04:57 +00:00
Henry Bruce
076a648ef9 python: Throw exception if mraa_init() fails
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
2016-03-22 18:04:57 +00:00
Henry Bruce
51c60a0ac4 api: Now returns MRAA_SUCCESS if platform is already initialized
To ensure backwards comptability MRAA_ERROR_PLATFORM_ALREADY_INITIALISED
remains as member of mraa_result_t but now has same code as MRAA_SUCCESS

Signed-off-by: Henry Bruce <henry.bruce@intel.com>
2016-03-22 18:04:57 +00:00
Henry Bruce
85a848960a examples: Java ISR example now displays pin number and level
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
2016-03-22 18:04:57 +00:00
Henry Bruce
a797003ec6 mraa.c: Create null platform if a known platform is not detected.
This is a partial replication of firmata branch commit 2f25468
as that patch would not apply to the javacheck2 branch

Signed-off-by: Henry Bruce <henry.bruce@intel.com>
2016-03-22 18:04:57 +00:00
Andrei Vasiliu
53058d500b java: Included jni.h in an external header
The reason for this is that applications that use mraa, like upm, need the
definitions contained in jni header.

Signed-off-by: Andrei Vasiliu <andrei.vasiliu@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:04:57 +00:00
Andrei Vasiliu
029e08669c java: Changed JNI version to 1.6
This change is needed to compile/run with OpenJDK 7, as well as with
OpenJDK 8.

Signed-off-by: Andrei Vasiliu <andrei.vasiliu@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:04:57 +00:00
Brendan Le Foll
12b5130c1a mraa.c: check lang_func allocated resources correctly
We need to distinguish from an error on mraa_init() and simply not having found
a platform

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:04:57 +00:00
Henry Bruce
237308898c examples: Added isrExit() call to gpio-tool.js for ISR shutdown testing
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:04:57 +00:00
Henry Bruce
b1fd66c561 examples: Updated python gpio isr example
Example now takes pin number from command line and displays gpio level
when it changes.

Signed-off-by: Henry Bruce <henry.bruce@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:04:57 +00:00
Henry Bruce
bc1c3469f5 python: Python native library now links to libmraa.so
Implementation is similar to approach taken for Java.

Signed-off-by: Henry Bruce <henry.bruce@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:04:57 +00:00
Henry Bruce
44b2367fdc java: Updated gpio.c to use JNI functions set in mraa_lang_func
This is a re-design of commit 0041801. mraa_lang_func_t structure has been
added (similar in design to mraa_adv_func_t) that points to JNI functions
implemented in src/java/mraajni.c. Functions are set by libmraajava.so,
see wrapper entry in src/java/mraajava.i. As gpio.c now uses these
functions, language specific #ifdef code has been removed as JNI code
is only called if functions are defined (i.e. not NULL)

Signed-off-by: Henry Bruce <henry.bruce@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:04:57 +00:00
Henry Bruce
d313ac0579 java: Allows Java GPIO ISR sample to exit so IsrExit() method can be tested
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:04:57 +00:00
Henry Bruce
9d497e08cd java: mraa jni library now dynamically links to libmraa
libmraajava.so was statically linking to mraa object files causing
duplicate mraa platform instances if a UPM Java module was also loaded.

JNI functionality has been moved into src/java/mraajni.c. JVM object is
now set when JVM is loaded; see updates to src/java/mraajava.i.
This was necessary as the JVM object cannot be directly referenced from
mraa as it will not be available when building C/C++ examples.

Signed-off-by: Henry Bruce <henry.bruce@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:04:57 +00:00
Henry Bruce
0633cd4145 javascript: Updated cmake so that mraa.node dynamically links to libmraa
mraa.node was statically linking to mraa object files causing duplicate
mraa platform instances if a upm node.js module was also loaded.

Signed-off-by: Henry Bruce <henry.bruce@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 18:04:57 +00:00
Brendan Le Foll
8230d7cb45 raspberry_pi.c: add Revision a02082 to rpi detection
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-22 15:23:32 +00:00
Brendan Le Foll
d8024bb516 mraa: Update to v0.9.6
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-09 14:39:33 +00:00
Thomas Ingleby
29ddf56b67 readme: correct spelling mistake in README
eithe to either

Signed-off-by: Thomas Ingleby <thomas.ingleby@intel.com>
2016-03-09 15:12:08 +01:00
Henry Bruce
3b9c4f2bad ft4222: added error checking for getting libft4222 function addresses
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-09 14:04:22 +00:00
Thomas Ingleby
7f78b6760f ft4222: move calls to libft4222.so to use dlopen
Makes the lib a runtime only dependency

Signed-off-by: Thomas Ingleby <thomas.ingleby@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-09 14:04:22 +00:00
Henry Bruce
441a24aaea ftdi_ft4222: Refactoring of I/O expander support.
Refactored of I/O expander support to simplify addition of new devices.
This had added ISR support for PCA9555.

Signed-off-by: Henry Bruce <henry.bruce@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-09 14:04:22 +00:00
Henry Bruce
9c2f3c83c9 ftdi_ft4222: Resolved conflicts with PCA9555 I/O expander (commit 3b2a5b8)
This has removed PCA9555 support. It will be introduced soon.

Signed-off-by: Henry Bruce <henry.bruce@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-09 14:04:22 +00:00
Henry Bruce
65514bb432 ftdi_ft4222: Refactored GPIO expander ISR code
GPIO expander ISRs were dropping interrupts as each pin had its own
thread which cleared the INT signal when reading the GPIO register.
Thus pending interrupts for GPIO on threads waiting to be scheduled
were dropped. Now a single thread polls the GPIO register when INT goes
low and sets interrupt flags for each GPIO line. The threads created
by mraa_gpio_isr() now poll the appropriate interrupt flag.

Signed-off-by: Henry Bruce <henry.bruce@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-09 14:04:22 +00:00
Henry Bruce
c770c4c669 ftdi_ft4222: Fixed i2c synchronization bug
Synchronization must be done at "context" level so that i2c bus
cannot be unexpectedly changed by a different thread.

Signed-off-by: Henry Bruce <henry.bruce@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-09 14:04:22 +00:00
Constantin Musca
511332cda5 Android.mk: enable support for UP Board
The commit which added support for UP Board didn't touch Android.mk.
Add up.c to LOCAL_SRC_FILES.

Signed-off-by: Constantin Musca <constantin.musca@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-08 20:19:09 +00:00
Brendan Le Foll
82cfa32f70 gpio.hpp: Fix copy and paste error in documentation of gpio modes
Fixes #455

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-05 19:13:23 +00:00
Brendan Le Foll
a387d5e4d4 mraa: Update to v0.9.5
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-01 17:38:31 +00:00
Andrei Vasiliu
df8d471cfb java: Changed JNI version to 1.6
This change is needed to compile/run with OpenJDK 7, as well as with
OpenJDK 8.

Signed-off-by: Andrei Vasiliu <andrei.vasiliu@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-03-01 16:22:54 +00:00
Alex Tereschenko
350a6489ee gpio.hpp: added HandleScope creation for Node 4+
Closes #387.

Signed-off-by: Alex Tereschenko <alext.mkrs@gmail.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-29 10:09:38 +00:00
Alex Tereschenko
389d0ceafd README.md: updated URLs for package repos
Signed-off-by: Alex Tereschenko <alext.mkrs@gmail.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-28 16:42:48 +00:00
Grant Likely
8e8ed7d52d 96boards: Use consistent pin numbering on 96boards platforms
Every 96Boards baseboard uses the same expansion connector, but the
current 96Boards initialization code assigns the SoC specific GPIO
numbers instead of being consistent across all boards. Change the code
to assign 96Boards GPIO-A through GPIO-L to MRAA GPIOs 23-34.

v2: Create info for all the LS connector pins, not just the GPIO pins.
    This gives us room to describe other pins in the future.

Signed-off-by: Grant Likely <grant.likely@linaro.org>
Jorge Ramirez-Ortiz <jorge.ramirez-ortiz@linaro.org>
Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
2016-02-25 13:50:27 +00:00
Dan O'Donovan
2b73083955 up: adding option to build for UP platform only
Adding cmake option to build for UP platform only:
 -DMRAAPLATFORMFORCE=MRAA_UP

Signed-off-by: Dan O'Donovan <dan@emutex.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-24 15:10:20 +00:00
Dan O'Donovan
f9501c5c78 up: add support for UP Board
Add support for UP board (www.up-board.org), scoping
the following functions available via 40-pin header:
* GPIO (via sysfs)
* UART
* I2C
* SPI
* PWM

Validated on UP board v0.2, running ubilinux 3.0

Signed-off-by: Dan O'Donovan <dan@emutex.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-24 15:10:20 +00:00
Mihai Tudor Panu
3b2a5b8429 ft4222: added full support for PCA9555 read/write
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-24 11:22:42 +00:00
Brendan Le Foll
00e8f72ef4 mraa: Update to v0.9.4
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-22 10:51:55 +00:00
Brendan Le Foll
e354c59b6c README.md: Add links to our mailing list
Instead of using my email address to send patches, you can now send patches to
our ML. Noice!

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-22 09:28:28 +00:00
Brendan Le Foll
ca11078fd0 intel_edison_fab_c.c: spi_init_pre on arduino should be called on mraa_init()
It's required to make ADC work as well as the SPI bus

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-20 09:24:09 +00:00
Brendan Le Foll
6b3794003f edison.md: Add warning on using reset button
Closes #432

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-17 11:15:40 +00:00
Brendan Le Foll
699d476de1 mraa: Update to v0.9.3
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-16 19:02:58 +00:00
Petre Eftime
0899f1e995 examples: java: Add test for subplatform GPIO pins
Signed-off-by: Petre Eftime <petre.p.eftime@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-16 17:34:27 +00:00
Alex Tereschenko
baa1fcf7be intel_edison_fab_c.c: Fixed file descriptor leak in case of read error
Signed-off-by: Alex Tereschenko <alext.mkrs@gmail.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-16 17:13:09 +00:00
Brendan Le Foll
32d36dfbd0 COPYING: Make it very clear this is an MIT license
Updated copyright year for good measure

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-15 08:13:20 +00:00
Brendan Le Foll
2a6bf2b16d mraa.c: Removed unused iio function
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-12 17:20:54 +00:00
Alex Tereschenko
b33bd5ccd2 intel_edison_fab_c.c: Enhanced detection of Arduino expansion board
Closes #318.

Signed-off-by: Alex Tereschenko <alext.mkrs@gmail.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-12 11:29:04 +00:00
Brendan Le Foll
1865dd0ba1 mraa.c: Add 3 chars to length of platform_name
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-12 11:27:02 +00:00
Henry Bruce
944670f66a ftdi_ft4222: Added mutex synchronize i2c operations
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
2016-02-12 11:25:38 +00:00
Henry Bruce
839bdb9011 mraa-i2c: Added "repeated read" command for stress testing
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
2016-02-12 11:25:38 +00:00
Henry Bruce
a73882240b cmake: Stop processing if JAVA_HOME environment variable is not set
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
2016-02-12 11:25:38 +00:00
Henry Bruce
43ae362be8 examples: Java GPIO ISR example now takes pin as command line argument
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
2016-02-12 11:25:38 +00:00
Henry Bruce
6bf706befb examples: Added JavaScript gpio tool
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
2016-02-12 11:25:38 +00:00
Henry Bruce
1fd4ed5736 ftdi_ft4222: Added GPIO interrupt support for language bindings.
- FT4222 GPIO ISR implementation was specific to C/C++ and ignored
  language binding support. This is now fixed via adv_func updates.
- GPIO ISR code has been refactored to reduce i2c traffic when using
  I/O expanders
- Added support for built-in FT4222 GPIO interrupts

Signed-off-by: Henry Bruce <henry.bruce@intel.com>
2016-02-12 11:25:38 +00:00
Henry Bruce
d2fcb88c4b cmake: Added INSTALLTOOLS option that installs both mraa-gpio and mraa-i2c
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
2016-02-12 11:25:38 +00:00
Andrei Vasiliu
cb4c9152d6 java/CMakeLists.txt: Updated install path for Java library file
Signed-off-by: Andrei Vasiliu <andrei.vasiliu@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-12 11:20:32 +00:00
Brendan Le Foll
61011df748 mraa: Update to v0.9.2
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-11 10:21:28 +00:00
Brendan Le Foll
d04911d569 mraa.c: Fix mraa_init with usb subplatform
This fix only affects USBPLAT=ON which would cause mraa_init to return
uninitialised if we had detected a platform. Whilst the initialisation had
actually been done correctly the results would be that platform_name was
unfilled and no iio initialisation was done

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-11 10:17:56 +00:00
Brendan Le Foll
1f57c6c082 Blink-IO.cpp: fix dual include of stdlib for no reason
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-09 16:04:14 +00:00
Brendan Le Foll
51340c6289 arm.c: fix conditionals instead of checking all possibilities
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-08 12:04:11 +00:00
Grant Likely
14960c4190 96boards: Fix recognizing the HiKey platform on recent kernels
Somewhere between kernel v3.18 and v4.4 the output of /proc/cpuinfo
stopped showing the board model. This confused MRAA when running on
HiKey. Eventually we want to do a better job of getting the kernel to
express hardware information to userspace, but in the mean time fix the
test so that MRAA will work on HiKey.

Signed-off-by: Grant Likely <grant.likely@linaro.org>
Cc: Jorge Ramirez-Ortiz <jorge.ramirez-ortiz@linaro.org>
Cc: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Cc: Brendan Le Foll <brendan.le.foll@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-08 11:57:03 +00:00
Alex Tereschenko
c101117ece js examples: removed surplus char() helper function
Closes #226.

Signed-off-by: Alex Tereschenko <alext.mkrs@gmail.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-08 11:16:10 +00:00
Constantin Musca
9202eb172d intel_edison_fab_c: don't call mraa_intel_edison_misc_spi for miniboard
mraa_intel_edison_misc_spi is specific to the Arduino board.
Call it only when miniboard is not 1.

Signed-off-by: Constantin Musca <constantin.musca@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-08 10:03:17 +00:00
Steven Müllener
3e1c528571 Spi: Constructor with chip select added in cpp header
Signed-off-by: Steven Müllener <steven.muellener@sius.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-05 17:02:22 +00:00
Constantin Musca
1ce28ee082 intel_edison_fab_c: minimize the platform init func
Move mraa_intel_edison_misc_spi to mraa_intel_edison_spi_init_pre.
There is no point in initializing SPI if it's not used.
Set the direction of GPIO 214 (TRI_STATE_ALL) only if it's not set
to *out*.

Signed-off-by: Constantin Musca <constantin.musca@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-05 15:47:56 +00:00
Brendan Le Foll
8710280142 gpio.hpp: Add direction read call for C++ & SWIG APIs
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-05 15:47:56 +00:00
Constantin Musca
cc4fe26c09 gpio: add mraa_gpio_read_dir
Add support for reading the direction of a GPIO
and expose it through mraa_gpio_read_dir.

Signed-off-by: Constantin Musca <constantin.musca@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-05 15:47:54 +00:00
Karena Anum Kamaruzaman
084883c210 Enable CherryHills (Braswell) support for GPIO
Enable the GPIOs for Cherryhills (Braswell).

Signed-off-by: Karena Anum Kamaruzaman <karena.anum.kamaruzaman@intel.com>
Signed-off-by: Constantin Musca <constantin.musca@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-05 15:47:35 +00:00
Brendan Le Foll
04f3b93f85 mraa: Update to v0.9.1
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-03 15:50:07 +00:00
Brendan Le Foll
5c10ad05ee common.hpp: remove whitespace
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-03 15:39:32 +00:00
Brendan Le Foll
1015beec47 i2c.hpp: Add function to get i2c default bus
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-03 15:37:41 +00:00
Brendan Le Foll
67f5ab7346 CONTRIBUTING.md: Add github style contributing rules
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-02 17:22:49 +00:00
Brendan Le Foll
1f41b2f97e .travis.yml: Add node.js versions to build matrix
This adds node5, node4 & 0.12 to build matrix and updates clang & gcc if
required (node4/5)

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-02 17:21:40 +00:00
Bernd Kuhls
7fce2e2a3a uart.c: fix build with musl libc
musl does not define CMSPAR on all archs, patch inspired by
http://git.alpinelinux.org/cgit/aports/plain/main/freerdp/musl-fix.patch

musl needs sys/select.h to provide fd_set.

Signed-off-by: Bernd Kuhls <bernd.kuhls@t-online.de>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-02 10:37:31 +00:00
Brendan Le Foll
44e705a518 java: Move mraajava.pc to java folder
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-02-02 10:05:57 +00:00
Henry Bruce
8ff42482ec nodejs: Fixed cmake bug in v8 and uv detection logic
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-01-28 14:21:30 +00:00
Henry Bruce
3924070171 nodejs: Updated FindNodejs.cmake so exported variables match package name
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-01-28 14:21:20 +00:00
Henry Bruce
ff31d6763c nodejs: cmake updates to more thoroughly check Node.js configuration
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-01-28 14:21:05 +00:00
Constantin Musca
ba5318fee9 intel_minnow_byt_compatible: include Turbot additions
The pinout for the Low Speed Expansion on the MinnowBoard
Turbot is the same as the MinnowBoard MAX A2 desgin, with
the exception of pin 26. Pin 26 was changed to provide an MCLK
reference clock for I2S.
In addition, the D2 LED is now under GPIO control.
Add support for these changes.

Signed-off-by: Constantin Musca <constantin.musca@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-01-25 15:49:53 +00:00
Eugene Bolshakov
2e5e3eaea2 mraajs: Check for CMAKE version > 3.1 or use workaround
Older cmake versions don't support the CXX_STANDARD property. Remove doubled
CMAKE_CXX_FLAGS in mraajs COMPILE_FLAGS

Closes #411

Signed-off-by: Eugene Bolshakov <pub@relvarsoft.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-01-24 16:56:41 +00:00
Henry Bruce
078218f680 pwm: Check for out of range pin number in pwm_init()
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-01-22 15:06:47 +00:00
Stefan Andritoiu
c86fe2a12b java: Ignored function, which should not have bindings created for it
Signed-off-by: Stefan Andritoiu <stefan.andritoiu@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-01-22 15:06:25 +00:00
Stefan Andritoiu
8b68f3040e java: added sanity checks for sample mapping and bindings
Signed-off-by: Stefan Andritoiu <stefan.andritoiu@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-01-21 15:28:03 +00:00
Stefan Andritoiu
c564dad68f CMakelists: Made tests building rule independent of the python build
Signed-off-by: Stefan Andritoiu <stefan.andritoiu@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-01-21 15:28:03 +00:00
Stefan Andritoiu
ecc04d7511 docs: Added reference to "Creating Java Bindings Guide"
Signed-off-by: Stefan Andritoiu <stefan.andritoiu@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-01-21 15:28:03 +00:00
Petre Eftime
c63e38a57e java: Migrate IsrCallbacks to Java's Runnable class
Signed-off-by: Petre Eftime <petre.p.eftime@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-01-21 15:28:03 +00:00
Brendan Le Foll
78a4d12a37 mraa.c: cache platform_name on mraa_init
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-01-21 15:28:03 +00:00
Brendan Le Foll
0aed0003ff mraa.c: make mraa_get_platform_name use a const char
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-01-21 15:28:03 +00:00
Brendan Le Foll
bdb5ef66e9 mraa.c: Add mraa_get_platform_version call
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-01-21 15:28:03 +00:00
Constantin Musca
caebb8b1fb iio: guard pthread_setcancelstate with HAVE_PTHREAD_CANCEL
Signed-off-by: Constantin Musca <constantin.musca@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-01-20 11:15:41 +00:00
Ian Johnson
ab14b9de43 mraa: Prefer calloc over malloc
Switch to using calloc on all calls to malloc where the memory isn't
initialized. For things like the mraa_board_t, not allocating all to zero
causes issues such as with the sub_platform member, where if that's not zero
mraa_get_platform_type will try to dereference a random memory location for the
sub_platform->platform_name, which can result in segmentation faults and other
issues.

Note that in some places where immediately after the malloc call is a copy
operation, there is no need for calloc, as all the memory gets overwritten
anyways, but in cases where there may or may not be memory written to (such as
in mraa_file_contains, with reading from a file), even though in most cases the
memory is overwritten, it could be the case that the read operation does
nothing, but the memory still has non-zero values, by virtue of the fact it
wasn't overwritten.

Signed-off-by: Ian Johnson <ijohnson@wolfram.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-01-20 08:20:28 +00:00
Bruce Beare
7e302242db x86.c: Add MinnowBoard Turbot initialization
Signed-off-by: Bruce Beare <bruce.j.beare@intel.com>
Signed-off-by: Constantin Musca <constantin.musca@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-01-13 14:03:23 +00:00
Brendan Le Foll
3483db363f i2c/LICENSE: Fix typo in roadnarrows url
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-01-13 13:28:59 +00:00
Brendan Le Foll
c2681dc78c binding.gyp.cmake: Fix npm builds for node 0.12.x
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-01-11 17:54:27 +00:00
Brendan Le Foll
6c0881848b Android.mk: Add missing src files to build file
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-01-07 16:19:47 +00:00
Brendan Le Foll
03d741ff3e intel_edison_fab_c.c: Change default i2c bus on miniboard from 6 to 1
Since on most 3rd party breakout boards the i2c bus exposed is 1 and not 6, it
makes more sense to have that as the default i2c bus

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-01-06 16:48:25 +00:00
Brendan Le Foll
0ebab9603e Blink-IO.js: Call the function after declaring it
This works ok if executing the whole file but the node.js interactive
interpreter gets confused when yoy copy and paste the code

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-01-06 16:37:15 +00:00
Pieterjan Camerlynck
a87a104efe CMakeLists.txt: do not require a C++ compiler
By default, CMake assumes both a C and C++ compiler are required.
This is not needed for mraa because it only provides C++ header
files. Note that if using SWIG you need one and if using node.js 3+ you'll need
a C++11 compiler

Signed-off-by: Pieterjan Camerlynck <pieterjan.camerlynck@gmail.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-01-06 10:42:40 +00:00
Henry Bruce
6d391ce605 uart: Added stdlib.h to uart.hpp so malloc() and free() are declared
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-01-06 10:38:51 +00:00
Henry Bruce
63604ef5cc uart: Added timeout support for uart read
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-01-06 10:38:51 +00:00
Henry Bruce
a708e08101 examples/mraa-i2c: Fixed physical bus id error in list command
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-01-06 10:38:51 +00:00
Henry Bruce
8c40842e4b ftdi_ft4222: Re-order pin numbering and support i2c switch
First four pins (0 to 3) are now built-in FTDI GPIO/I2C pins
If i2c GPIO expander is detected, next 8 pins (4 to 11) are its GPIO
If i2c switch is detected an extra 4 i2c busses are added

Signed-off-by: Henry Bruce <henry.bruce@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-01-06 10:38:51 +00:00
Henry Bruce
ed0124cc70 mraa_adv_func: Updated signature of gpio_init_internal_replace()
mraa_adv_func_t->gpio_init_internal_replace() now has mraa_gpio_context
parameter so that override function can access both physical and logical
pin numbers.

Signed-off-by: Henry Bruce <henry.bruce@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-01-06 10:38:51 +00:00
Samuel Martin
86a0e10c03 cmake: build shared libs by default on linux
The change allows to build shared libraries by default on Linux, while
respecting the requested library build type when the standard CMake flag
BUILD_SHARED_LIBS is defined.

Signed-off-by: Samuel Martin <s.martin49@gmail.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-01-06 10:18:19 +00:00
Brendan Le Foll
7f85f2bbdb edison.md: Add notes on using i2c-1 w/Arduino breakout
Closes #394

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-01-05 15:16:16 +00:00
Mihai Tudor Panu
92cc9ea176 ftdi_ft4222.md: updated docs with latest info
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-01-05 09:57:08 +00:00
Eugene Bolshakov
ff6b304fd2 mraajs.i: fixes and remove useless code
Uses ::Copy instead of ::New which creates an internal buffer with malloc. This
commit also removes some useless code done after exception is raised (so won't
ever be executed)

Signed-off-by: Eugene Bolshakov <pub@relvarsoft.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-01-04 15:08:10 +00:00
Brendan Le Foll
2bb00b494f docs: Add changelog.md
Makes changelog a seperate file, this fixes #388

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-01-04 12:01:20 +00:00
Brendan Le Foll
d430b5c2b5 mraa: Update to v0.9.0
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2016-01-04 11:50:51 +00:00
Brendan Le Foll
ea183b3738 iio.c: Fix indentation
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-21 15:49:08 +00:00
Brendan Le Foll
d4b32ec1c5 iio.c: Check return of fscanf
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-21 15:48:44 +00:00
Brendan Le Foll
e98bd8653a iio.c: Check return of fd before using ioctl
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-21 15:48:28 +00:00
Brendan Le Foll
ff34651325 iio.c: Replace sprintf with snprintf
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-21 15:48:02 +00:00
Brendan Le Foll
58cf292dfc iio.c: Closedir correctly and return error if we fail to read from the device dir
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-21 15:38:20 +00:00
Brendan Le Foll
15e400eaf2 iio.c: Fix leaking filedescriptor on read error
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-21 15:37:37 +00:00
Brendan Le Foll
8862ebd9f2 mraa: Remove trailing whitespace/tabs from various parts
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-21 15:27:15 +00:00
Brendan Le Foll
79609ba359 mraa: Remove executable bit from a few files
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-21 15:23:30 +00:00
Brendan Le Foll
27c097e82e x86.c: Fix include for sofia 3gr platform missing
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-21 15:18:44 +00:00
Brendan Le Foll
725ce5e946 iioc.: remove call to stat before mkdir as superflous
This is especailly true since we don't care about the outcome, or do we? We
probably should check errno for EEXIST and offer an error if the error is
something else

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-21 15:16:10 +00:00
Brendan Le Foll
fd531abd3d iio.c: Avoid reading uninitialised memory in cases of error
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-21 15:15:51 +00:00
Brendan Le Foll
f4385a8b82 iio: Check fd against != -1 and not > 0 and avoid leaks during error handling
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-21 15:15:15 +00:00
Brendan Le Foll
ee69045ea8 iio.c: Fix closedir not always been called leaving to leaked handles
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-21 15:12:55 +00:00
Srinivas Kandagatla
fcfdeb1304 96boards: remove a typo
This patch removes a typo in the board setup file which sets the number
of gpios to be zero.

Reported-by: Jorge Ramirez-Ortiz <jorge.ramirez-ortiz@linaro.org>
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-18 15:51:20 +00:00
Lay, Kuan Loon
d5233adbf9 iio.c: fix memory leak and out of bound array access issue
Fix memory leak in mraa_iio_update_channels() and mraa_iio_get_channel_data().
In mraa_iio_update_channels(), we add checking for out of bound array access.

Signed-off-by: Lay, Kuan Loon <kuan.loon.lay@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-17 11:28:26 +00:00
Lay, Kuan Loon
4ffb094063 SoFIA 3GR: Add SoFIA 3GR platform with i2c support
Add SoFIA 3GR platform file and define 4 i2c controller.

Signed-off-by: Lay, Kuan Loon <kuan.loon.lay@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-17 11:28:22 +00:00
Henry Bruce
8e4a809f12 iio: C API changes and C++ API enhancements
- C API read/write integer functions changed to int to match C types
- C API now has close function to release resources acquired during init
- iio internal type isr_event() function now has args param in signature
- C++ API now supports events with handler interface and new data structure
- C and C++ examples updated to use API changes

Signed-off-by: Henry Bruce <henry.bruce@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:14 +00:00
Henry Bruce
5f01de1bf1 docs: Added more detail to iio doc
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Henry Bruce
7703634bc5 mraa.c: Do not return with error if iio devices are not detected
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Brendan Le Foll
6a85c57c06 iio.c: Fix missing include file sys/stat.h
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Brendan Le Foll
924f4b4799 iio.c: Use sys/ioctl.h instead of stropts.h
Closes #377

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Henry Bruce
3429b5383d examples: Converted iio dummy driver test app to C++
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
2015-12-15 10:42:06 +00:00
Henry Bruce
bd4f6998a7 api: Added C++ API for IIO
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
2015-12-15 10:42:06 +00:00
Henry Bruce
11211936b6 iio: Fixed device id check bug
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
2015-12-15 10:42:06 +00:00
Henry Bruce
7ea11f0dd3 mraa.c: iio detect tidy up.
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
2015-12-15 10:42:06 +00:00
Henry Bruce
c1d081c783 examples: Extended iio_dummy_test to cover more cases.
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
2015-12-15 10:42:06 +00:00
Henry Bruce
ae80d4afc8 iio: Isolated use of open() to string read/write functions.
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
2015-12-15 10:42:06 +00:00
Henry Bruce
131021a629 mraa.c: Moved iio detection code into a function
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
2015-12-15 10:42:06 +00:00
Henry Bruce
0049ba1378 mraa_internal.h: Added mraa_iio_detect() function declaration
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
2015-12-15 10:42:06 +00:00
Henry Bruce
448f14f41c examples: Added iio_dummy_test, a test app that uses iio_dummy driver
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
2015-12-15 10:42:06 +00:00
Henry Bruce
fbfe3e315f iio: mraa_iio_write_string now using open insteam of fopen
Signed-off-by: Henry Bruce <henry.bruce@intel.com>
2015-12-15 10:42:06 +00:00
Brendan Le Foll
b77bf40c34 iio.md: add triger_now option
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Brendan Le Foll
cb09ff2327 iio.md: add kernel config option
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Brendan Le Foll
e975a690ab iio.md: skeleton documentation
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Lay, Kuan Loon
3750e2cfa2 iio: iio update channel
Signed-off-by: Lay, Kuan Loon <kuan.loon.lay@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Lay, Kuan Loon
e7e58509f0 iio: iio add create trigger
Signed-off-by: Lay, Kuan Loon <kuan.loon.lay@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Lay, Kuan Loon
8d7c0722ab iio: iio get mounting matrix remove unused variable and proper file close
Signed-off-by: Lay, Kuan Loon <kuan.loon.lay@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Lay, Kuan Loon
0bd1ab2c53 iio: iio add get mounting matrix
Signed-off-by: Lay, Kuan Loon <kuan.loon.lay@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Lay, Kuan Loon
edb7f8a215 iio: iio consolidate read and write API
Signed-off-by: Lay, Kuan Loon <kuan.loon.lay@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Brendan Le Foll
219632a1b8 iio.c: run clang format on iio.c
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Brendan Le Foll
8a548de8ae iio.c: add stropts.h include for iotctl
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Brendan Le Foll
13086cb2db mraa_internal.h: Add fnmatch.h include
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Brendan Le Foll
069985641e iio.c: Use MAX_SIZE var upgrading strings to 128 from 64
Fix inspired by Lay's PR #342 but doesn't use magic numbers

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Lay, Kuan Loon
657f28a67d iio: trigger buffer samples fix
Signed-off-by: Lay, Kuan Loon <kuan.loon.lay@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Lay, Kuan Loon
2df28fa883 iio: iio get channel and get event error checking
Signed-off-by: Lay, Kuan Loon <kuan.loon.lay@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Lay, Kuan Loon
078b6371d7 iio-example: printf take extra argument
Signed-off-by: Lay, Kuan Loon <kuan.loon.lay@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Lay, Kuan Loon
7a55a1384a iio: added mraa_iio_write
Signed-off-by: Lay, Kuan Loon <kuan.loon.lay@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Brendan Le Foll
dc240913c7 iio: remove exec perms
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Lay, Kuan Loon
4c41d2c2df iio: added event api
Signed-off-by: Lay, Kuan Loon <kuan.loon.lay@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Alex Tereschenko
e5f28ab04c mraa.c: we now remove trailing CR/LF from IIO dev names
E.g. on Edison they have LFs and that may cause problems
with downstream consumers of this data.

Signed-off-by: Alex Tereschenko <alext.mkrs@gmail.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Alex Tereschenko
325ac461d6 iio: added function returning IIO device number by name
Closes #309.

Signed-off-by: Alex Tereschenko <alext.mkrs@gmail.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Alex Tereschenko
7fa4990d81 iio: fixed IIO device counting
We now take into account only "iio:device*" files to filter out
fake devices like triggers.

Closes #299.

Signed-off-by: Alex Tereschenko <alext.mkrs@gmail.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Alex Tereschenko
3b55cc70bf iio: fixed comment typo
Signed-off-by: Alex Tereschenko <alext.mkrs@gmail.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Brendan Le Foll
65614f5f58 iio: Remove iio structures from mraa_platform_t
This means that a valid platform is no longer required for iio operations and
therefore this is now only a req for using USBPLAT

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Brendan Le Foll
529cf8a26e mraa_func.h: Remove unused code
Code crept in from ft4222 branch merge and is superflous becuase of the new
advance function structure

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Brendan Le Foll
acfb74f04e iio: Improve iio channel parsing to add enabled channels
scale and other attributes have to be read individually as they vary quite alot
depending on the channel. We only care/take data from scan_elements

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Brendan Le Foll
2c97fd5953 iio: initial pass at getting channel information from scan_elements
This commit creates a new structure inside each _iio device when used and can
then be used to understand the data being read after a trigger is run/executed

Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Brendan Le Foll
b192e7a223 iio_driver.c: remove weird API calls
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Brendan Le Foll
2b9e832ff9 iio: Simplify API
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Brendan Le Foll
d8c2c7c483 iio: Find attributes and channels in iio device
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Brendan Le Foll
8c19105309 iio_driver.c: Add example for iio interface
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Brendan Le Foll
ba9ab4b384 mraa.c: Fix path of iio device in sysfs
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Brendan Le Foll
d920d136ea iio: initial API and enumeration of devices
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Brendan Le Foll
0f312545e0 iio: Add initial module
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-15 10:42:06 +00:00
Alex Tereschenko
1947426baf docs: added UART examples into Python docs.
Signed-off-by: Alex Tereschenko <alext.mkrs@gmail.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-14 15:34:16 +00:00
Alex Tereschenko
f9a31956ab examples: added more elaborated Python UART example
Closes #376.

Signed-off-by: Alex Tereschenko <alext.mkrs@gmail.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-14 15:34:16 +00:00
Stefan Andritoiu
d80e4295aa mraajava.i: The director now uses a GlobalRef instead of a WeakRef to the IsrCallback object
Signed-off-by: Petre Eftime <petre.p.eftime@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-14 15:33:34 +00:00
Jorge Ramirez-Ortiz
36fabe3245 96boards: add support to HiKey 96board
This patch adds support to HiKey board which complies with 96boards spec.
More info about board @https://www.96boards.org/products/ce/hikey/

Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez-ortiz@linaro.org>
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-14 11:01:38 +00:00
Srinivas Kandagatla
c0dfb71237 96boards: add support to 96boards (https://www.96boards.org/)
This patch adds support to 96boards. 96boards is an open platform
specification. This spec strandardizes the pins on the external
connectors like Low speed and High speed. Given these pins are standard
across multiple boards, I think adding a generic 96boards made sense to
me.

The idea behind adding this generic board file is to make mraa work on
most of the 96boards with minimal changes to board support in libmraa.

This patch adds support to the LS expansion connector which has got 12
gpio pins + 2 i2c + 1 spi and 2 uarts.

For now I have added Dragaon board DB401c support as part of this patch
and is tested.
More info about board @ https://www.96boards.org/products/ce/dragonboard410c/

Long term plan is to get all this configuration from the /sys and
populate the board specifics dynamically, which is bit easy with
96boards specs in-place.

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-14 11:01:28 +00:00
Srinivas Kandagatla
47ec54c333 TargetArch.cmake: Add support to aarch64 based platforms
This patch adds support to aarch64 arm 64 bit platforms.

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-14 11:00:04 +00:00
Srinivas Kandagatla
38aa9e8fe6 uart.c: make use of no_bus_mux flag
This patch makes use of no_bus_mux flag in mraa_board_t to skip
unnessary mux checks.

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-14 11:00:04 +00:00
Srinivas Kandagatla
5e0c6d3807 spi.c: make use of no_bus_mux flag
This patch makes use of no_bus_mux flag in mraa_board_t to skip
unnessary mux checks.

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-14 11:00:00 +00:00
Srinivas Kandagatla
b2e8af641b i2c.c: make use of no_bus_mux flag
This patch makes use of no_bus_mux flag in mraa_board_t to skip
unnessary mux checks.

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-14 10:59:54 +00:00
Srinivas Kandagatla
e14534b071 mraa: Add flags to not setup bus pinmux
This is an attempt to make the mraa work on wide boards with minimal
board setup.

Most of the arm boards with latest kernel have pinmux already setup by
the driver and its really not necessary for mraa to check each pin and
icheck if the pinmux is required or not. Having this flag would cut lot
of code in board support and its possible to add some generic board
support which can make use of mraa easily.

Without this patch each board support has to have pins setup in there
bus structure.

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-14 10:52:27 +00:00
Mihai Serban
5cf54fdbc2 intel_edison_fab_c.c: Remove dependency on debugfs
The MRAA library needs the debugfs interface in order to access GPIO
pin modes attributes. Mounting the debugfs is not always desirable so this
patch instructs libmraa to first check for the required attributes in
the normal SYSFS CLASS GPIO interface and to use debugfs as a fallback.

Signed-off-by: Mihai Serban <mihai.serban@intel.com>
Signed-off-by: Constantin Musca <constantin.musca@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-04 15:37:20 +00:00
Mihai Serban
759d387c5a edison: fix SPI IO pointers usage
Check if SPI IO pointers are holding valid data before using them.

Signed-off-by: Jianxun Zhang <jianxun.zhang@intel.com>
Signed-off-by: Bruce Beare <bruce.j.beare@intel.com>
Signed-off-by: Mihai Serban <mihai.serban@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-04 15:37:19 +00:00
Mihai Serban
ccafc77641 Compile libmraa for Android and Brillo
Add makefile for building libmraa library.

Import glob functionality from the NetBSD project where the glob.c and
glob.h files are released under BSD 3-clause License. Minor changes were
applied in order to make them compile for Android and Brillo.

This patch adds a control pipe used to interrupt the poll() function
as an alternative to pthread cancellation API.

Change-Id: Id719da4c839acbd320b0cc0e0113c2a5239c8029
Signed-off-by: Mihai Serban <mihai.serban@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
2015-12-04 15:37:00 +00:00
163 changed files with 12720 additions and 1889 deletions

View File

@@ -1,8 +1,14 @@
language: cpp
env:
- NODE010=true
- NODE012=true
- NODE4=true
- NODE5=true
compiler:
- gcc
- clang
- gcc
install:
- if [ "${NODE4}" ]; then export CC=gcc-4.8 CXX=g++-4.8; fi
- sudo add-apt-repository --yes ppa:kalakris/cmake
- sudo add-apt-repository --yes ppa:fenics-packages/fenics-exp/swig
- sudo apt-get update -qq
@@ -10,7 +16,19 @@ install:
- sudo ln -s /usr/bin/swig3.0 /usr/bin/swig
- sudo update-java-alternatives -s java-8-oracle
before_script:
- if [ "$CC" = "gcc" ]; then export BUILDJAVA=ON; else export BUILDJAVA=OFF; fi
- export JAVA_HOME=/usr/lib/jvm/java-8-oracle
# Turn off JAVA SWIG for clang++, use 4.8 for all g++ builds
- if [ "$CC" == "gcc" ]; then export BUILDJAVA=ON; export CC=gcc-4.8; export CXX=g++-4.8; else export BUILDJAVA=OFF; fi
- if [ "${NODE012}" ]; then nvm install 0.12; fi
- if [ "${NODE4}" ]; then nvm install 4.1; fi
- if [ "${NODE5}" ]; then nvm install 5; fi
# Handle 0.10 NODE_ROOT_DIR differently than other versions
- if [ -z ${NODE010} ]; then export NODE_ROOT_DIR="/home/travis/.nvm/versions/node/`nvm version`"; else export NODE_ROOT_DIR=/home/travis/.nvm/v0.10.36; fi
script:
- mkdir build && cd build && cmake -DBUILDSWIGJAVA=$BUILDJAVA -DNODE_ROOT_DIR:PATH=/home/travis/.nvm/v0.10.36/include .. && make && make test
- echo "CC=$CC BUILDJAVA=$BUILDJAVA NODE010=$NODE010 NODE012=$NODE012 NODE4=$NODE4 NODE5=$NODE5 NODE_ROOT_DIR=$NODE_ROOT_DIR"
- mkdir build && cd build && cmake -DBUILDSWIGJAVA=$BUILDJAVA -DNODE_ROOT_DIR:PATH="${NODE_ROOT_DIR}" -DCMAKE_INSTALL_PREFIX:PATH=../install .. && make install && make test
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- g++-4.8

61
Android.mk Normal file
View File

@@ -0,0 +1,61 @@
# Copyright (C) 2015 Intel Corporation
#
# 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.
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libmraa
LOCAL_CFLAGS += -Wno-unused-parameter -DX86PLAT=1
LOCAL_SHARED_LIBRARIES := libcutils libutils libdl libc
LOCAL_SRC_FILES := \
src/mraa.c \
src/gpio/gpio.c \
src/i2c/i2c.c \
src/pwm/pwm.c \
src/spi/spi.c \
src/aio/aio.c \
src/uart/uart.c \
src/x86/x86.c \
src/iio/iio.c \
src/x86/intel_galileo_rev_d.c \
src/x86/intel_galileo_rev_g.c \
src/x86/intel_edison_fab_c.c \
src/x86/intel_de3815.c \
src/x86/intel_nuc5.c \
src/x86/intel_sofia_3gr.c \
src/x86/intel_minnow_byt_compatible.c \
src/x86/intel_cherryhills.c \
src/x86/up.c
# glob.c pulled in from NetBSD project (BSD 3-clause License)
LOCAL_SRC_FILES += \
src/glob/glob.c
LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/include \
$(LOCAL_PATH)/include/linux \
$(LOCAL_PATH)/include/x86 \
$(LOCAL_PATH)/api \
$(LOCAL_PATH)/api/mraa \
$(LOCAL_PATH)/src/glob
LOCAL_EXPORT_C_INCLUDE_DIRS := \
$(LOCAL_PATH)/api \
$(LOCAL_PATH)/api/mraa
LOCAL_MODULE_TAGS := optional
include $(BUILD_SHARED_LIBRARY)

View File

@@ -1,15 +1,28 @@
cmake_minimum_required (VERSION 2.8)
project (mraa)
project (mraa C)
FIND_PACKAGE (Threads REQUIRED)
set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -fno-omit-frame-pointer ")
set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall ")
set (LIB_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}" CACHE PATH "Installation path for libraries")
# Set CMAKE_LIB_INSTALL_DIR if not defined
# Set CMAKE_INSTALL_LIBDIR if not defined
include(GNUInstallDirs)
# Older cmake might not pick CMAKE_INSTALL_LIBDIR right
if (CMAKE_INSTALL_LIBDIR)
set (LIB_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}" CACHE PATH "Installation path for libraries")
else ()
set (LIB_INSTALL_DIR "lib" CACHE PATH "Installation path for libraries")
endif ()
# By default, build shared object libraries on linux
if (UNIX AND NOT APPLE)
if (NOT DEFINED BUILD_SHARED_LIBS)
set(BUILD_SHARED_LIBS ON)
endif()
endif()
# Appends the cmake/modules path to MAKE_MODULE_PATH variable.
set (CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules ${CMAKE_MODULE_PATH})
@@ -18,10 +31,11 @@ include (GetGitRevisionDescription)
git_describe (VERSION "--tags")
if ("x_${VERSION}" STREQUAL "x_GIT-NOTFOUND" OR "x_${VERSION}" STREQUAL "x_HEAD-HASH-NOTFOUND" OR "x_${VERSION}" STREQUAL "x_-128-NOTFOUND")
message (WARNING " - Install git to compile a production libmraa!")
set (VERSION "v0.8.1-dirty")
set (VERSION "v1.0.0-dirty")
endif ()
message (INFO " - libmraa Version ${VERSION}")
message (STATUS "INFO - libmraa Version ${VERSION}")
message (STATUS "INFO - cmake Version ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}")
#parse the version information into pieces.
string (REGEX REPLACE "^v([0-9]+)\\..*" "\\1" VERSION_MAJOR "${VERSION}")
@@ -55,14 +69,17 @@ option (BUILDSWIGPYTHON "Build swig python modules." ON)
option (BUILDSWIGNODE "Build swig node modules." ON)
option (BUILDSWIGJAVA "Build Java API." OFF)
option (USBPLAT "Detection USB platform." OFF)
option (FIRMATA "Add Firmata support to mraa." OFF)
option (ONEWIRE "Add Onewire support to mraa." ON)
option (IMRAA "Add Imraa support to mraa." OFF)
option (FTDI4222 "Build with FTDI FT4222 subplatform support." OFF)
option (IPK "Generate IPK using CPack" OFF)
option (RPM "Generate RPM using CPack" OFF)
option (BUILDPYTHON3 "Use python3 for building/installing" OFF)
option (ENABLEEXAMPLES "Disable building of examples" ON)
option (INSTALLGPIOTOOL "Install gpio tool" OFF)
option (INSTALLTOOLS "Install all tools" OFF)
option (BUILDARCH "Override architecture to build for - override" OFF)
option (TESTS "Override the addition of tests" ON)
option (BUILDTESTS "Override the addition of tests" ON)
set (MRAAPLATFORMFORCE "" CACHE STRING "ALL")
@@ -75,10 +92,10 @@ endif()
if (NOT BUILDARCH)
include (TargetArch)
target_architecture (DETECTED_ARCH)
message( INFO " - Target arch is ${DETECTED_ARCH}")
message (STATUS "INFO - Target arch is ${DETECTED_ARCH}")
else ()
set (DETECTED_ARCH ${BUILDARCH})
message( INFO " - Override arch is ${DETECTED_ARCH}")
message (STATUS "INFO - Override arch is ${DETECTED_ARCH}")
endif()
if (DETECTED_ARCH STREQUAL "i586" OR DETECTED_ARCH STREQUAL "x86_64"
@@ -87,22 +104,11 @@ if (DETECTED_ARCH STREQUAL "i586" OR DETECTED_ARCH STREQUAL "x86_64"
elseif (DETECTED_ARCH MATCHES "arm.*")
set (ARMPLAT ON)
else ()
message(FATAL_ERROR "Only x86 and arm platforms currently supported")
message (FATAL_ERROR "Only x86 and arm platforms currently supported")
endif()
if (BUILDSWIGPYTHON)
if (BUILDPYTHON3)
set (PYTHONBUILD_VERSION 3)
else ()
set (PYTHONBUILD_VERSION 2.7)
endif ()
find_package (PythonInterp ${PYTHONBUILD_VERSION} REQUIRED)
if (TESTS)
if (${PYTHONINTERP_FOUND})
enable_testing ()
add_subdirectory (tests)
endif ()
endif ()
if (BUILDSWIGPYTHON OR BUILDTESTS)
include (cmake/modules/OpenCVDetectPython.cmake)
endif ()
if (BUILDDOC)
@@ -134,9 +140,9 @@ if (IPK)
set (TARGET_ARCH ${DETECTED_ARCH})
endif ()
endif ()
message (INFO " - Package arch is ${TARGET_ARCH}")
message (STATUS "INFO - Package arch is ${TARGET_ARCH}")
set(CPACK_GENERATOR "DEB" "TGZ")
set(CPACK_GENERATOR "DEB")
set(OPKG_ARCH ${TARGET_ARCH})
set(CPACK_BINARY_DIR ${CMAKE_BINARY_DIR})
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Intel IoT-Devkit") #required
@@ -144,7 +150,7 @@ if (IPK)
if ("${VERSION_COMMIT}" STREQUAL "")
set(mraa_PACKAGE_ON_TAG "")
endif()
set(CPACK_PACKAGE_VERSION
set(CPACK_PACKAGE_VERSION
"${mraa_VERSION_MAJOR}.${mraa_VERSION_MINOR}.${mraa_VERSION_PATCH}${mraa_PACKAGE_ON_TAG}${VERSION_COMMIT}")
set(CPACK_PACKAGE_NAME "mraa")
set(CPACK_DEBIAN_PACKAGE_SECTION "libs")
@@ -158,7 +164,7 @@ if (IPK)
endif()
if (RPM)
message (INFO " - Enabled RPM packaging for ${DETECTED_ARCH}")
message (STATUS "INFO - Enabled RPM packaging for ${DETECTED_ARCH}")
set(CMAKE_INSTALL_PREFIX "/usr")
set(CPACK_PACKAGE_VERSION ${VERSION})
set(CPACK_GENERATOR "RPM")
@@ -185,3 +191,12 @@ add_subdirectory (src)
if (ENABLEEXAMPLES)
add_subdirectory (examples)
endif ()
if (IMRAA)
add_subdirectory (imraa)
endif ()
if (BUILDTESTS AND PYTHON_DEFAULT_EXECUTABLE)
enable_testing ()
add_subdirectory (tests)
endif ()

View File

@@ -1,4 +1,4 @@
Contributing to libmraa {#contributing}
Contributing to libmraa {#contributing}
======================
libmraa is an opensource project and we are actively looking for people to help
@@ -13,7 +13,8 @@ requests to the main project. You can open issues if you find any bugs/have
questions.
If you'd rather not use github you are more than welcome to send git formatted
patches to brendan.le.foll@intel.com.
patches to our mailing list mraa@lists.01.org which you can register for access
on: https://lists.01.org/mailman/listinfo/mraa
Basic rules
-----------

View File

@@ -1,4 +1,5 @@
Copyright © 2014 Intel Corporation
The MIT License (MIT)
Copyright © 2014-2016 Intel Corporation
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the

View File

@@ -755,7 +755,8 @@ WARN_LOGFILE =
INPUT = @CMAKE_CURRENT_SOURCE_DIR@/api/ \
@CMAKE_CURRENT_SOURCE_DIR@/api/mraa/ \
@CMAKE_CURRENT_SOURCE_DIR@/docs/
@CMAKE_CURRENT_SOURCE_DIR@/docs/ \
@CMAKE_CURRENT_SOURCE_DIR@/CONTRIBUTING.md
# This tag can be used to specify the character encoding of the source files
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses

View File

@@ -756,6 +756,7 @@ WARN_LOGFILE =
INPUT = @CMAKE_CURRENT_SOURCE_DIR@/api/ \
@CMAKE_CURRENT_SOURCE_DIR@/api/mraa/ \
@CMAKE_CURRENT_SOURCE_DIR@/docs/ \
@CMAKE_CURRENT_SOURCE_DIR@/docs/CONTRIBUTING.md \
@CMAKE_BINARY_DIR@/src/ \
@CMAKE_CURRENT_SOURCE_DIR@/docs/index.java.md \
@CMAKE_CURRENT_SOURCE_DIR@/README.md

View File

@@ -1,10 +1,13 @@
<p align="center">
<img src="http://iotdk.intel.com/misc/logos/mraa.png" height="150px" width="auto" algt="Mraa Logo"/>
</p>
libmraa - Low Level Skeleton Library for Communication on GNU/Linux platforms
==============
Libmraa is a C/C++ library with bindings to javascript & python to interface
with the IO on Galileo, Edison & other platforms, with a structured and sane
API where port names/numbering matches the board that you are on. Use of
libmraa does not tie you to specific hardware with board detection done at
Libmraa is a C/C++ library with bindings to Java, Python and JavaScript to
interface with the IO on Galileo, Edison & other platforms, with a structured
and sane API where port names/numbering matches the board that you are on. Use
of libmraa does not tie you to specific hardware with board detection done at
runtime you can create portable code that will work across the supported
platforms.
@@ -23,6 +26,7 @@ X86
* [Intel DE3815](../master/docs/intel_de3815.md)
* [Minnowboard Max](../master/docs/minnow_max.md)
* [NUC 5th generation](../master/docs/intel_nuc5.md)
* [UP](../master/docs/up.md)
ARM
---
@@ -42,7 +46,7 @@ based yocto poky image that supports opkg. Adding this repository is as simple
as and you'll have the latest stable tagged build of mraa installed!
``` bash
echo "src mraa-upm http://iotdk.intel.com/repos/2.0/intelgalactic" > /etc/opkg/mraa-upm.conf
echo "src mraa-upm http://iotdk.intel.com/repos/3.0/intelgalactic/opkg/i586" > /etc/opkg/mraa-upm.conf
opkg update
opkg install mraa
```
@@ -51,7 +55,7 @@ If you would like to get the latest & greatest builds from master HEAD you can
use our -dev repository
```bash
echo "src mraa-upm http://iotdk.intel.com/repos/2.0/intelgalactic-dev" > /etc/opkg/mraa-upm.conf
echo "src mraa-upm http://iotdk.intel.com/repos/3.0/intelgalactic-dev/opkg/i586" > /etc/opkg/mraa-upm.conf
opkg update
opkg install mraa
```
@@ -89,3 +93,17 @@ API Documentation
<a href="http://java.mraa.io"><img src="http://iotdk.intel.com/misc/logos/java.png"/></a>
<a href="http://py.mraa.io"><img src="http://iotdk.intel.com/misc/logos/python.png"/></a>
<a href="http://js.mraa.io"><img src="http://iotdk.intel.com/misc/logos/node.png"/></a>
Contact Us
==========
To ask questions either file issues in github or send emails on our [mailing
list](https://lists.01.org/mailman/listinfo/mraa). You might also catch us on
the mraa channel on freenode IRC.
See the [Contribution](CONTRIBUTING.md) documentation for more details.
Changelog
=========
Version changelog [here](docs/changelog.md).

View File

@@ -33,6 +33,7 @@ extern "C" {
#include "mraa/spi.h"
#include "mraa/i2c.h"
#include "mraa/uart.h"
#include "mraa/uart_ow.h"
#ifdef __cplusplus
}

View File

@@ -59,19 +59,20 @@ typedef struct _aio* mraa_aio_context;
mraa_aio_context mraa_aio_init(unsigned int pin);
/**
* Read the input voltage. By default mraa will shift
* the raw value up or down to a 10 bit value.
* Read the input voltage. By default mraa will shift the raw value up or down
* to a 10 bit value.
*
* @param dev The AIO context
* @returns The current input voltage.
* @returns The current input voltage or -1 for error
*/
unsigned int mraa_aio_read(mraa_aio_context dev);
int mraa_aio_read(mraa_aio_context dev);
/**
* Read the input voltage and return it as a normalized float (0.0f-1.0f).
*
* @param dev The AIO context
* @returns The current input voltage as a normalized float (0.0f-1.0f)
* @returns The current input voltage as a normalized float (0.0f-1.0f), error
* will be signaled by -1.0f
*/
float mraa_aio_read_float(mraa_aio_context dev);

View File

@@ -47,13 +47,26 @@ class Aio
*
* @param pin channel number to read ADC inputs
*/
Aio(unsigned int pin)
Aio(int pin)
{
m_aio = mraa_aio_init(pin);
if (m_aio == NULL) {
throw std::invalid_argument("Invalid AIO pin specified - do you have an ADC?");
}
}
/**
* Aio Constructor, takes a pointer to the AIO context and initialises
* the AIO class
*
* @param void * to an AIO context
*/
Aio(void* aio_context)
{
m_aio = (mraa_aio_context) aio_context;
if (m_aio == NULL) {
throw std::invalid_argument("Invalid AIO context");
}
}
/**
* Aio destructor
*/
@@ -65,22 +78,32 @@ class Aio
* Read a value from the AIO pin. By default mraa will shift
* the raw value up or down to a 10 bit value.
*
* @throws std::invalid_argument in case of error
* @returns The current input voltage. By default, a 10bit value
*/
int
unsigned int
read()
{
return mraa_aio_read(m_aio);
int x = mraa_aio_read(m_aio);
if (x == -1) {
throw std::invalid_argument("Unknown error in Aio::read()");
}
return (unsigned int) x;
}
/**
* Read a value from the AIO pin and return it as a normalized float.
*
* @throws std::invalid_argument in case of error
* @returns The current input voltage as a normalized float (0.0f-1.0f)
*/
float
readFloat()
{
return mraa_aio_read_float(m_aio);
float x = mraa_aio_read_float(m_aio);
if (x == -1.0f) {
throw std::invalid_argument("Unknown error in Aio::readFloat()");
}
return x;
}
/**
* Set the bit value which mraa will shift the raw reading

View File

@@ -36,6 +36,13 @@
#define MRAA_MAIN_PLATFORM_OFFSET 0
#define MRAA_SUB_PLATFORM_OFFSET 1
/** Executes function func and returns its result in case of error
*/
#define MRAA_RETURN_FOR_ERROR(func) do { \
mraa_result_t res; \
res = func; \
if (res != MRAA_SUCCESS) \
return res;} while(0)
/** @file
*
@@ -57,9 +64,7 @@ typedef unsigned int mraa_boolean_t;
*
* Detects running platform and attempts to use included pinmap, this is run on
* module/library init/load but is handy to rerun to check board initialised
* correctly. MRAA_SUCCESS inidicates correct (first time) initialisation
* whilst MRAA_ERROR_PLATFORM_ALREADY_INITIALISED indicates the board is
* already initialised correctly
* correctly. MRAA_SUCCESS inidicates correct initialisation.
*
* @return Result of operation
*/
@@ -133,7 +138,17 @@ mraa_result_t mraa_set_log_level(int level);
*
* @return platform name
*/
char* mraa_get_platform_name();
const char* mraa_get_platform_name();
/**
* Return the platform's versioning info, the information given depends per
* platform and can be NULL. platform_offset has to be given. Do not modify
* this pointer
*
* @param specified platform offset; 0 for main platform, 1 for sub platform
* @return platform's versioning string
*/
const char* mraa_get_platform_version(int platform_offset);
/**
* This function attempts to set the mraa process to a given priority and the
@@ -144,7 +159,7 @@ char* mraa_get_platform_name();
* @param priority Value from typically 0 to 99
* @return The priority value set
*/
int mraa_set_priority(const unsigned int priority);
int mraa_set_priority(const int priority);
/** Get the version string of mraa autogenerated from git tag
*
@@ -199,7 +214,7 @@ int mraa_get_i2c_bus_count();
* @param i2c_bus the logical I2C bus number
* @return I2C adapter number in sysfs. Function will return -1 on failure
*/
int mraa_get_i2c_bus_id(unsigned int i2c_bus);
int mraa_get_i2c_bus_id(int i2c_bus);
/**
* Get specified platform pincount, board must be initialised.
@@ -259,7 +274,37 @@ int mraa_get_sub_platform_id(int pin_or_bus_index);
*/
int mraa_get_sub_platform_index(int pin_or_bus_id);
/**
* Add mraa subplatform
*
* @param subplatform type
* @param uart device subplatform is on
*
* @return mraa_result_t indicating success
*/
mraa_result_t mraa_add_subplatform(mraa_platform_t subplatformtype, const char* uart_dev);
/**
* Remove a mraa subplatform
*
* @param subplatform type
*
* @return mraa_result indicating success
*/
mraa_result_t mraa_remove_subplatform(mraa_platform_t subplatformtype);
/**
* Create IO using a description in the format:
* [io]-[pin]
* [io]-[raw]-[pin]
* [io]-[raw]-[id]-[pin]
* [io]-[raw]-[path]
*
* @param IO description
*
* @return void* to IO context or NULL
*/
void* mraa_init_io(const char* desc);
#ifdef __cplusplus
}

View File

@@ -46,9 +46,7 @@ namespace mraa
*
* Detects running platform and attempts to use included pinmap, this is run on
* module/library init/load but is handy to rerun to check board initialised
* correctly. MRAA_SUCCESS inidicates correct (first time) initialisation
* whilst MRAA_ERROR_PLATFORM_ALREADY_INITIALISED indicates the board is
* already initialised correctly
* correctly. mraa::SUCCESS inidicates correct initialisation.
*
* @return Result of operation
*/
@@ -80,7 +78,7 @@ getVersion()
* @return The priority value set
*/
inline int
setPriority(const unsigned int priority)
setPriority(const int priority)
{
return mraa_set_priority(priority);
}
@@ -154,6 +152,19 @@ getPlatformName()
return ret_val;
}
/**
* Return platform versioning info. Returns NULL if no info present.
*
* @param optional subplatform identifier
* @return platform versioning info
*/
inline std::string
getPlatformVersion(int platform_offset=MRAA_MAIN_PLATFORM_OFFSET)
{
std::string ret_val(mraa_get_platform_version(platform_offset));
return ret_val;
}
/**
* Return count of physical pins on the running platform
*
@@ -184,7 +195,7 @@ getI2cBusCount()
* @return I2C adapter number in sysfs. Function will return -1 on failure
*/
inline int
getI2cBusId(unsigned int i2c_bus)
getI2cBusId(int i2c_bus)
{
return mraa_get_i2c_bus_id(i2c_bus);
}
@@ -227,8 +238,6 @@ hasSubPlatform()
return static_cast<bool>(mraa_has_sub_platform());
}
/**
* Check if pin or bus id includes sub platform mask.
*
@@ -249,7 +258,7 @@ isSubPlatformId(int pin_or_bus_id)
*
* @return int sub platform pin or bus number
*/
inline int
inline int
getSubPlatformId(int pin_or_bus_index)
{
return mraa_get_sub_platform_id(pin_or_bus_index);
@@ -267,4 +276,55 @@ getSubPlatformIndex(int pin_or_bus_id)
{
return mraa_get_sub_platform_index(pin_or_bus_id);
}
/**
* Get default i2c bus, board must be initialised.
*
* @param optional subplatform identifier
* @return default i2c bus for paltform
*/
inline int
getDefaultI2cBus(int platform_offset=MRAA_MAIN_PLATFORM_OFFSET)
{
return mraa_get_default_i2c_bus(platform_offset);
}
/**
* Add mraa subplatform
*
* @param subplatformtype the type of subplatform to add
* (e.g. MRAA_GENERIC_FIRMATA)
* @param uart_dev subplatform device string (e.g. "/dev/ttyACM0")
* @return Result of operation
*/
inline Result
addSubplatform(Platform subplatformtype, std::string uart_dev)
{
return (Result) mraa_add_subplatform((mraa_platform_t) subplatformtype, uart_dev.c_str());
}
inline Result
removeSubplatform(Platform subplatformtype)
{
return (Result) mraa_remove_subplatform((mraa_platform_t) subplatformtype);
}
/**
* Create IO using a description in the format:
* [io]-[pin]
* [io]-[raw]-[pin]
* [io]-[raw]-[id]-[pin]
* [io]-[raw]-[path]
*
* @param IO description
*
* @return class T initialised using pointer to IO or NULL
*/
template <class T>
inline T*
initIo(std::string desc)
{
return new T(mraa_init_io(desc.c_str()));
}
}

101
api/mraa/firmata.h Normal file
View File

@@ -0,0 +1,101 @@
/*
* Author: Brendan Le Foll <brendan.le.foll@intel.com>
* Copyright (c) 2016 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
/**
* @file
* @brief Firmata IO
*
* Firmata IO lets you SYSEX messages construct and ask for a callback on a
* SYSEX messages. This is meant to provide a way to call custom firmata APIs
* especially using the Custom firmata API
*
* @snippet firmata_curie_imu.c Interesting
*/
#ifdef __cplusplus
extern "C" {
#endif
#include "common.h"
/**
* Opaque pointer definition to the internal struct _firmata. This context
* refers to one firmata 'extension' letting you write/return SYSEX messages
* directly
*/
typedef struct _firmata* mraa_firmata_context;
/**
* Initialise firmata context on a feature. This feature is what will be
* listened on if you request a response callback
*
* @param firmata feature
* @return firmata context or NULL
*/
mraa_firmata_context mraa_firmata_init(int feature);
/**
* Sends a custom SYSEX message to the firmata board.
*
* @param dev The Firmata context
* @param msg The SYSEX message
* @param length The length of the sysex message
*/
mraa_result_t mraa_firmata_write_sysex(mraa_firmata_context dev, char* msg, int length);
/**
* Set a callback on 'feature'. This function is not thread safe and threads
* calling it need to make sure they are the only thread calling this.
*
* @param dev The Firmata context
* @param fptr Function pointer to function to be called when interrupt is
* triggered, the returned buffer and length are the arguments.
* @return Result of operation
*/
mraa_result_t mraa_firmata_response(mraa_firmata_context dev, void (*fptr)(uint8_t*, int));
/**
* Stop getting events on feature. This is more efficient than mraa_firmata_close
* as it can be re-enabled without adding a feature
*
* @param dev The Firmata context
* @return Result of operation
*/
mraa_result_t mraa_firmata_response_stop(mraa_firmata_context dev);
/**
* Free all firmata handle resources, this will leave an element in an array
* internally that will be skipped, avoid closing many firmata contexts often
* as there is a cost to doing this
*
* @param dev The Firmata context
* @return Result of operation
*/
mraa_result_t mraa_firmata_close(mraa_firmata_context dev);
#ifdef __cplusplus
}
#endif

View File

@@ -40,15 +40,17 @@
extern "C" {
#endif
#ifdef SWIGPYTHON
#include <Python.h>
#endif
#include <stdio.h>
#include <pthread.h>
#include "common.h"
#if defined(SWIGJAVA) || defined(JAVACALLBACK)
#include <jni.h>
extern "C" {
void mraa_java_isr_callback(void *args);
}
#endif
/**
* Opaque pointer definition to the internal struct _gpio
*/
@@ -75,13 +77,13 @@ typedef enum {
} mraa_gpio_dir_t;
/**
* Gpio Edge types for interupts
* Gpio Edge types for interrupts
*/
typedef enum {
MRAA_GPIO_EDGE_NONE = 0, /**< No interrupt on Gpio */
MRAA_GPIO_EDGE_BOTH = 1, /**< Interupt on rising & falling */
MRAA_GPIO_EDGE_RISING = 2, /**< Interupt on rising only */
MRAA_GPIO_EDGE_FALLING = 3 /**< Interupt on falling only */
MRAA_GPIO_EDGE_BOTH = 1, /**< Interrupt on rising & falling */
MRAA_GPIO_EDGE_RISING = 2, /**< Interrupt on rising only */
MRAA_GPIO_EDGE_FALLING = 3 /**< Interrupt on falling only */
} mraa_gpio_edge_t;
/**
@@ -110,11 +112,11 @@ mraa_gpio_context mraa_gpio_init_raw(int gpiopin);
mraa_result_t mraa_gpio_edge_mode(mraa_gpio_context dev, mraa_gpio_edge_t mode);
/**
* Set an interupt on pin
* Set an interrupt on pin
*
* @param dev The Gpio context
* @param edge The edge mode to set the gpio into
* @param fptr Function pointer to function to be called when interupt is
* @param fptr Function pointer to function to be called when interrupt is
* triggered
* @param args Arguments passed to the interrupt handler (fptr)
* @return Result of operation
@@ -122,7 +124,7 @@ mraa_result_t mraa_gpio_edge_mode(mraa_gpio_context dev, mraa_gpio_edge_t mode);
mraa_result_t mraa_gpio_isr(mraa_gpio_context dev, mraa_gpio_edge_t edge, void (*fptr)(void*), void* args);
/**
* Stop the current interupt watcher on this Gpio, and set the Gpio edge mode
* Stop the current interrupt watcher on this Gpio, and set the Gpio edge mode
* to MRAA_GPIO_EDGE_NONE
*
* @param dev The Gpio context
@@ -148,6 +150,15 @@ mraa_result_t mraa_gpio_mode(mraa_gpio_context dev, mraa_gpio_mode_t mode);
*/
mraa_result_t mraa_gpio_dir(mraa_gpio_context dev, mraa_gpio_dir_t dir);
/**
* Read Gpio direction
*
* @param dev The Gpio context
* @param dir The address where to store the Gpio direction
* @return Result of operation
*/
mraa_result_t mraa_gpio_read_dir(mraa_gpio_context dev, mraa_gpio_dir_t *dir);
/**
* Close the Gpio context
* - Will free the memory for the context and unexport the Gpio

View File

@@ -44,9 +44,9 @@ namespace mraa
*/
typedef enum {
MODE_STRONG = 0, /**< Default. Strong High and Low */
MODE_PULLUP = 1, /**< Interupt on rising & falling */
MODE_PULLDOWN = 2, /**< Interupt on rising only */
MODE_HIZ = 3 /**< Interupt on falling only */
MODE_PULLUP = 1, /**< Resistive High */
MODE_PULLDOWN = 2, /**< Resistive Low */
MODE_HIZ = 3 /**< High Z State */
} Mode;
/**
@@ -60,39 +60,15 @@ typedef enum {
} Dir;
/**
* Gpio Edge types for interupts
* Gpio Edge types for interrupts
*/
typedef enum {
EDGE_NONE = 0, /**< No interrupt on Gpio */
EDGE_BOTH = 1, /**< Interupt on rising & falling */
EDGE_RISING = 2, /**< Interupt on rising only */
EDGE_FALLING = 3 /**< Interupt on falling only */
EDGE_BOTH = 1, /**< Interrupt on rising & falling */
EDGE_RISING = 2, /**< Interrupt on rising only */
EDGE_FALLING = 3 /**< Interrupt on falling only */
} Edge;
#if defined(SWIGJAVA)
class IsrCallback
{
friend class Gpio;
public:
virtual ~IsrCallback()
{
}
virtual void
run()
{ /* empty, overloaded in Java*/
}
protected:
static void
generic_isr_callback(void* data)
{
IsrCallback* callback = (IsrCallback*) data;
callback->run();
}
};
#endif
/**
* @brief API to General Purpose IO
*
@@ -104,7 +80,7 @@ class Gpio
{
public:
/**
* Instanciates a Gpio object
* Instantiates a Gpio object
*
* @param pin pin number to use
* @param owner (optional) Set pin owner, default behaviour is to 'own'
@@ -131,6 +107,19 @@ class Gpio
mraa_gpio_owner(m_gpio, 0);
}
}
/**
* Gpio Constructor, takes a pointer to the GPIO context and initialises
* the GPIO class
*
* @param void * to GPIO context
*/
Gpio(void* gpio_context)
{
m_gpio = (mraa_gpio_context) gpio_context;
if (m_gpio == NULL) {
throw std::invalid_argument("Invalid GPIO context");
}
}
/**
* Gpio object destructor, this will only unexport the gpio if we where
* the owner
@@ -160,6 +149,9 @@ class Gpio
static void
v8isr(uv_work_t* req, int status)
{
#if NODE_MODULE_VERSION >= 0x000D
v8::HandleScope scope(v8::Isolate::GetCurrent());
#endif
mraa::Gpio* This = (mraa::Gpio*) req->data;
int argc = 1;
v8::Local<v8::Value> argv[] = { SWIGV8_INTEGER_NEW(-1) };
@@ -196,18 +188,18 @@ class Gpio
#endif
return (Result) mraa_gpio_isr(m_gpio, (mraa_gpio_edge_t) mode, &uvwork, this);
}
#elif defined(SWIGJAVA)
#elif defined(SWIGJAVA) || defined(JAVACALLBACK)
Result
isr(Edge mode, IsrCallback* cb)
isr(Edge mode, jobject runnable)
{
return (Result) mraa_gpio_isr(m_gpio, (mraa_gpio_edge_t) mode, &IsrCallback::generic_isr_callback, cb);
return (Result) mraa_gpio_isr(m_gpio, (mraa_gpio_edge_t) mode, mraa_java_isr_callback, runnable);
}
#else
#endif
/**
* Sets a callback to be called when pin value changes
*
* @param mode The edge mode to set
* @param fptr Function pointer to function to be called when interupt is
* @param fptr Function pointer to function to be called when interrupt is
* triggered
* @param args Arguments passed to the interrupt handler (fptr)
* @return Result of operation
@@ -217,9 +209,9 @@ class Gpio
{
return (Result) mraa_gpio_isr(m_gpio, (mraa_gpio_edge_t) mode, fptr, args);
}
#endif
/**
* Exits callback - this call will not kill the isr thread immediatly
* Exits callback - this call will not kill the isr thread immediately
* but only when it is out of it's critical section
*
* @return Result of operation
@@ -259,6 +251,23 @@ class Gpio
{
return (Result )mraa_gpio_dir(m_gpio, (mraa_gpio_dir_t) dir);
}
/**
* Read Gpio direction
*
* @throw std::runtime_error in case of failure
* @return Result of operation
*/
Dir
readDir()
{
mraa_gpio_dir_t dir;
if (mraa_gpio_read_dir(m_gpio, &dir) != MRAA_SUCCESS) {
throw std::runtime_error("Failed to read direction");
}
return (Dir) dir;
}
/**
* Read value from Gpio
*

View File

@@ -78,42 +78,40 @@ mraa_i2c_context mraa_i2c_init_raw(unsigned int bus);
mraa_result_t mraa_i2c_frequency(mraa_i2c_context dev, mraa_i2c_mode_t mode);
/**
* Simple bulk read from an i2c context, this will always begin with the i2c
* offset 0x0
* Simple bulk read from an i2c context
*
* @param dev The i2c context
* @param data pointer to the byte array to read data in to
* @param length max number of bytes to read
* @return length of the read in bytes or 0
* @return length of the read in bytes or -1
*/
int mraa_i2c_read(mraa_i2c_context dev, uint8_t* data, int length);
/**
* Simple read for a single byte from the i2c context, this will always begin
* with the i2c offset 0x0
* Simple read for a single byte from the i2c context
*
* @param dev The i2c context
* @return The result of the read and 0 if failed
* @return The result of the read or -1 if failed
*/
uint8_t mraa_i2c_read_byte(mraa_i2c_context dev);
int mraa_i2c_read_byte(mraa_i2c_context dev);
/**
* Read a single byte from i2c context, from designated register
*
* @param dev The i2c context
* @param command The register
* @return The result of the read and 0 if failed
* @return The result of the read or -1 if failed
*/
uint8_t mraa_i2c_read_byte_data(mraa_i2c_context dev, const uint8_t command);
int mraa_i2c_read_byte_data(mraa_i2c_context dev, const uint8_t command);
/**
* Read a single word from i2c context, from designated register
*
* @param dev The i2c context
* @param command The register
* @return The result of the read and 0 if failed
* @return The result of the read or -1 if failed
*/
uint16_t mraa_i2c_read_word_data(mraa_i2c_context dev, const uint8_t command);
int mraa_i2c_read_word_data(mraa_i2c_context dev, const uint8_t command);
/**
* Bulk read from i2c context, starting from designated register
@@ -138,7 +136,7 @@ int mraa_i2c_read_bytes_data(mraa_i2c_context dev, uint8_t command, uint8_t* dat
mraa_result_t mraa_i2c_write(mraa_i2c_context dev, const uint8_t* data, int length);
/**
* Write a single byte to an i2c context, always at offset 0x0
* Write a single byte to an i2c context
*
* @param dev The i2c context
* @param data The byte to write
@@ -167,12 +165,10 @@ mraa_result_t mraa_i2c_write_byte_data(mraa_i2c_context dev, const uint8_t data,
mraa_result_t mraa_i2c_write_word_data(mraa_i2c_context dev, const uint16_t data, const uint8_t command);
/**
* Sets the i2c context address.
* Sets the i2c slave address.
*
* @param dev The i2c context
* @param address The address to set for the slave (ignoring the least
* signifcant bit). If set to 0, the slave will only respond to the
* general call address.
* @param address The address to set for the slave (7-bit address)
* @return Result of operation
*/
mraa_result_t mraa_i2c_address(mraa_i2c_context dev, uint8_t address);

View File

@@ -62,6 +62,18 @@ class I2c
throw std::invalid_argument("Invalid i2c bus");
}
}
/**
* I2C constructor, takes a pointer to a I2C context and initialises the I2C class
*
* @param void * to an I2C context
*/
I2c(void* i2c_context)
{
m_i2c = (mraa_i2c_context) i2c_context;
if (m_i2c == NULL) {
throw std::invalid_argument("Invalid I2C context");
}
}
/**
* Closes the I2c Bus used. This does not guarrantee the bus will not
@@ -103,12 +115,17 @@ class I2c
/**
* Read exactly one byte from the bus
*
* @throws std::invalid_argument in case of error
* @return char read from the bus
*/
uint8_t
readByte()
{
return (uint8_t) mraa_i2c_read_byte(m_i2c);
int x = mraa_i2c_read_byte(m_i2c);
if (x == -1) {
throw std::invalid_argument("Unknown error in I2c::readByte()");
}
return (uint8_t) x;
}
/**
@@ -128,24 +145,36 @@ class I2c
* Read byte from an i2c register
*
* @param reg Register to read from
*
* @throws std::invalid_argument in case of error
* @return char read from register
*/
uint8_t
readReg(uint8_t reg)
{
return mraa_i2c_read_byte_data(m_i2c, reg);
int x = mraa_i2c_read_byte_data(m_i2c, reg);
if (x == -1) {
throw std::invalid_argument("Unknown error in I2c::readReg()");
}
return (uint8_t) x;
}
/**
* Read word from an i2c register
*
* @param reg Register to read from
*
* @throws std::invalid_argument in case of error
* @return char read from register
*/
uint16_t
readWordReg(uint8_t reg)
{
return mraa_i2c_read_word_data(m_i2c, reg);
int x = mraa_i2c_read_word_data(m_i2c, reg);
if (x == -1) {
throw std::invalid_argument("Unknown error in I2c::readReg()");
}
return (uint16_t) x;
}
/**

139
api/mraa/iio.h Normal file
View File

@@ -0,0 +1,139 @@
/*
* Author: Brendan Le Foll <brendan.le.foll@intel.com>
* Copyright (c) 2015 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 "common.h"
#include "iio_kernel_headers.h"
typedef struct {
int index;
int enabled;
char* type;
mraa_boolean_t lendian;
int signedd;
unsigned int offset;
uint64_t mask;
unsigned int bits_used;
unsigned int bytes;
unsigned int shift;
unsigned int location;
} mraa_iio_channel;
typedef struct {
char* name;
int enabled;
} mraa_iio_event;
/**
* @file
* @brief iio
*
* An iio context represents an IIO device
*
* @snippet iio_driver.c Interesting
*/
#ifdef __cplusplus
extern "C" {
#endif
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdint.h>
#include "common.h"
/**
* Opaque pointer definition to the internal struct _iio
*/
typedef struct _iio* mraa_iio_context;
/**
* Initialise iio context
*
* @param bus iio device to use
* @return i2c context or NULL
*/
mraa_iio_context mraa_iio_init(int device);
mraa_result_t mraa_iio_trigger_buffer(mraa_iio_context dev, void (*fptr)(char* data), void* args);
const char* mraa_iio_get_device_name(mraa_iio_context dev);
int mraa_iio_get_device_num_by_name(const char* name);
int mraa_iio_read_size(mraa_iio_context dev);
mraa_iio_channel* mraa_iio_get_channels(mraa_iio_context dev);
int mraa_iio_get_channel_count(mraa_iio_context dev);
mraa_result_t mraa_iio_read_float(mraa_iio_context dev, const char* filename, float* data);
mraa_result_t mraa_iio_read_int(mraa_iio_context dev, const char* filename, int* data);
mraa_result_t mraa_iio_read_string(mraa_iio_context dev, const char* filename, char* data, int max_len);
mraa_result_t mraa_iio_write_float(mraa_iio_context dev, const char* attr_chan, const float data);
mraa_result_t mraa_iio_write_int(mraa_iio_context dev, const char* attr_chan, const int data);
mraa_result_t mraa_iio_write_string(mraa_iio_context dev, const char* attr_chan, const char* data);
mraa_result_t mraa_iio_get_channel_data(mraa_iio_context dev);
mraa_result_t mraa_iio_get_event_data(mraa_iio_context dev);
mraa_result_t mraa_iio_event_poll(mraa_iio_context dev, struct iio_event_data* data);
mraa_result_t
mraa_iio_event_setup_callback(mraa_iio_context dev, void (*fptr)(struct iio_event_data* data, void* args), void* args);
mraa_result_t mraa_iio_event_extract_event(struct iio_event_data* event,
int* chan_type,
int* modifier,
int* type,
int* direction,
int* channel,
int* channel2,
int* different);
mraa_result_t mraa_iio_get_mounting_matrix(mraa_iio_context dev, float mm[9]);
mraa_result_t mraa_iio_create_trigger(mraa_iio_context dev, const char* trigger);
mraa_result_t mraa_iio_update_channels(mraa_iio_context dev);
/**
* De-inits an mraa_iio_context device
*
* @param dev The iio context
* @return Result of operation
*/
mraa_result_t mraa_iio_close(mraa_iio_context dev);
#ifdef __cplusplus
}
#endif

245
api/mraa/iio.hpp Normal file
View File

@@ -0,0 +1,245 @@
/*
* Author: Henry Bruce <henry.bruce@intel.com>
* Copyright (c) 2015 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 <stdexcept>
#include <sstream>
#include "iio.h"
#include "types.hpp"
namespace mraa
{
struct IioEventData
{
int channelType;
int modifier;
int type;
int direction;
int channel;
int channel2;
int diff;
};
class IioHandler
{
public:
virtual void onIioEvent(const IioEventData& eventData) = 0;
};
/**
* @brief API to Industrial IO
*
* This file defines the C++ iio interface for libmraa
*
* @snippet iio_dummy_test.cpp Interesting
*/
class Iio
{
public:
/**
* Iio Constructor, takes a device number which will map directly to sysfs
* e.g. device 0 maps to /sys/bus/iio/devices/iio:device0
*
* @param device IIO device number
*
* @throws std::invalid_argument if initialization fails
*/
Iio(int device)
{
m_iio = mraa_iio_init(device);
if (m_iio == NULL) {
std::ostringstream oss;
oss << "IIO device " << device << " is not valid";
throw std::invalid_argument(oss.str());
}
}
/**
* Iio Constructor
*
* @param deviceName IIO device name
*
* @throws std::invalid_argument if initialization fails
*/
Iio(const std::string& deviceName)
{
std::ostringstream oss;
int id = mraa_iio_get_device_num_by_name(deviceName.c_str());
if (id == -1) {
oss << "IIO device name " << deviceName << " not found";
throw std::invalid_argument(oss.str());
}
m_iio = mraa_iio_init(id);
if (m_iio == NULL) {
oss << "IIO device " << deviceName << " is not valid";
throw std::invalid_argument(oss.str());
}
}
/**
* Iio destructor
*/
~Iio()
{
mraa_iio_close(m_iio);
}
/**
* Get device name
*
* @returns The device name
*/
std::string
getDeviceName() const
{
return mraa_iio_get_device_name(m_iio);
}
/**
* Read an int value from specified attribute.
*
* @param attributeName attribute mame
*
* @returns The int value
*
* @throws std::invalid_argument if read fails
*/
int
readInt(const std::string& attributeName) const
{
int value;
mraa_result_t res = mraa_iio_read_int(m_iio, attributeName.c_str(), &value);
if (res != MRAA_SUCCESS) {
std::ostringstream oss;
oss << "IIO readInt for attibute " << attributeName << " failed";
throw std::runtime_error(oss.str());
}
return value;
}
/**
* Read a float value from specified attribute.
*
* @param attributeName attribute mame
*
* @returns The float value
*
* @throws std::invalid_argument if read fails
*/
float
readFloat(const std::string& attributeName) const
{
float value;
mraa_result_t res = mraa_iio_read_float(m_iio, attributeName.c_str(), &value);
if (res != MRAA_SUCCESS) {
std::ostringstream oss;
oss << "IIO readFloat for attibute " << attributeName << " failed";
throw std::runtime_error(oss.str());
}
return value;
}
/**
* Write an int value to specified attribute.
*
* @param attributeName attribute mame
* @param value int value
*
* @throws std::invalid_argument if write fails
*/
void
writeInt(const std::string& attributeName, int value) const
{
mraa_result_t res = mraa_iio_write_int(m_iio, attributeName.c_str(), value);
if (res != MRAA_SUCCESS) {
std::ostringstream oss;
oss << "IIO writeInt for attibute " << attributeName << " failed";
throw std::runtime_error(oss.str());
}
}
/**
* Write a float value to specified attribute.
*
* @param attributeName attribute mame
* @param value float value
*
* @throws std::invalid_argument if write fails
*/
void
writeFloat(const std::string& attributeName, float value) const
{
mraa_result_t res = mraa_iio_write_float(m_iio, attributeName.c_str(), value);
if (res != MRAA_SUCCESS) {
std::ostringstream oss;
oss << "IIO writeFloat for attibute " << attributeName << " failed";
throw std::runtime_error(oss.str());
}
}
/**
* Register event handler.
*
* @param handler handler class that implements IioHandler
*
* @throws std::invalid_argument on failure
*/
void
registerEventHandler(IioHandler* handler) const
{
mraa_result_t res = mraa_iio_event_setup_callback(m_iio, private_event_handler, handler);
if (res != MRAA_SUCCESS) {
throw std::runtime_error("registerEventHandler failed");
}
}
private:
static void private_event_handler(iio_event_data* data, void *args)
{
if (args != NULL) {
IioHandler* handler = (IioHandler*)args;
IioEventData eventData;
int chan_type, modifier, type, direction, channel, channel2, different;
mraa_iio_event_extract_event(data, &chan_type, &modifier, &type, &direction, &channel, &channel2, &different);
eventData.channelType = chan_type;
eventData.modifier = modifier;
eventData.type = type;
eventData.direction = direction;
eventData.channel = channel;
eventData.channel2 = channel2;
eventData.diff = different;
handler->onIioEvent(eventData);
}
}
mraa_iio_context m_iio;
};
}

View File

@@ -0,0 +1,136 @@
/*
* Author: Lay, Kuan Loon <kuan.loon.lay@intel.com>
* Copyright (c) 2015 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.
*/
//For kernel 4.1+,
//#include <linux/iio/types.h>
//#include <linux/iio/events.h>
//linux/iio/types.h
enum iio_chan_type {
IIO_VOLTAGE,
IIO_CURRENT,
IIO_POWER,
IIO_ACCEL,
IIO_ANGL_VEL,
IIO_MAGN,
IIO_LIGHT,
IIO_INTENSITY,
IIO_PROXIMITY,
IIO_TEMP,
IIO_INCLI,
IIO_ROT,
IIO_ANGL,
IIO_TIMESTAMP,
IIO_CAPACITANCE,
IIO_ALTVOLTAGE,
IIO_CCT,
IIO_PRESSURE,
IIO_HUMIDITYRELATIVE,
IIO_ACTIVITY,
IIO_STEPS,
IIO_ENERGY,
IIO_DISTANCE,
IIO_VELOCITY,
};
enum iio_modifier {
IIO_NO_MOD,
IIO_MOD_X,
IIO_MOD_Y,
IIO_MOD_Z,
IIO_MOD_X_AND_Y,
IIO_MOD_X_AND_Z,
IIO_MOD_Y_AND_Z,
IIO_MOD_X_AND_Y_AND_Z,
IIO_MOD_X_OR_Y,
IIO_MOD_X_OR_Z,
IIO_MOD_Y_OR_Z,
IIO_MOD_X_OR_Y_OR_Z,
IIO_MOD_LIGHT_BOTH,
IIO_MOD_LIGHT_IR,
IIO_MOD_ROOT_SUM_SQUARED_X_Y,
IIO_MOD_SUM_SQUARED_X_Y_Z,
IIO_MOD_LIGHT_CLEAR,
IIO_MOD_LIGHT_RED,
IIO_MOD_LIGHT_GREEN,
IIO_MOD_LIGHT_BLUE,
IIO_MOD_QUATERNION,
IIO_MOD_TEMP_AMBIENT,
IIO_MOD_TEMP_OBJECT,
IIO_MOD_NORTH_MAGN,
IIO_MOD_NORTH_TRUE,
IIO_MOD_NORTH_MAGN_TILT_COMP,
IIO_MOD_NORTH_TRUE_TILT_COMP,
IIO_MOD_RUNNING,
IIO_MOD_JOGGING,
IIO_MOD_WALKING,
IIO_MOD_STILL,
IIO_MOD_ROOT_SUM_SQUARED_X_Y_Z,
};
enum iio_event_type {
IIO_EV_TYPE_THRESH,
IIO_EV_TYPE_MAG,
IIO_EV_TYPE_ROC,
IIO_EV_TYPE_THRESH_ADAPTIVE,
IIO_EV_TYPE_MAG_ADAPTIVE,
IIO_EV_TYPE_CHANGE,
};
enum iio_event_direction {
IIO_EV_DIR_EITHER,
IIO_EV_DIR_RISING,
IIO_EV_DIR_FALLING,
IIO_EV_DIR_NONE,
};
//linux/iio/events.h
#include <linux/ioctl.h>
/**
* struct iio_event_data - The actual event being pushed to userspace
* @id: event identifier
* @timestamp: best estimate of time of event occurrence (often from
* the interrupt handler)
*/
struct iio_event_data {
unsigned long long int id;
long long int timestamp;
};
#define IIO_GET_EVENT_FD_IOCTL _IOR('i', 0x90, int)
#define IIO_EVENT_CODE_EXTRACT_TYPE(mask) ((mask >> 56) & 0xFF)
#define IIO_EVENT_CODE_EXTRACT_DIR(mask) ((mask >> 48) & 0x7F)
#define IIO_EVENT_CODE_EXTRACT_CHAN_TYPE(mask) ((mask >> 32) & 0xFF)
/* Event code number extraction depends on which type of event we have.
* Perhaps review this function in the future*/
#define IIO_EVENT_CODE_EXTRACT_CHAN(mask) ((short int)(mask & 0xFFFF))
#define IIO_EVENT_CODE_EXTRACT_CHAN2(mask) ((short int)(((mask) >> 16) & 0xFFFF))
#define IIO_EVENT_CODE_EXTRACT_MODIFIER(mask) ((mask >> 40) & 0xFF)
#define IIO_EVENT_CODE_EXTRACT_DIFF(mask) (((mask) >> 55) & 0x1)

View File

@@ -65,7 +65,7 @@ mraa_pwm_context mraa_pwm_init(int pin);
mraa_pwm_context mraa_pwm_init_raw(int chipid, int pin);
/**
* Set the ouput duty-cycle percentage, as a float
* Set the output duty-cycle percentage, as a float
*
* @param dev The Pwm context to use
* @param percentage A floating-point value representing percentage of output.
@@ -76,7 +76,7 @@ mraa_pwm_context mraa_pwm_init_raw(int chipid, int pin);
mraa_result_t mraa_pwm_write(mraa_pwm_context dev, float percentage);
/**
* Read the ouput duty-cycle percentage, as a float
* Read the output duty-cycle percentage, as a float
*
* @param dev The Pwm context to use
* @return percentage A floating-point value representing percentage of output.
@@ -166,39 +166,21 @@ mraa_result_t mraa_pwm_owner(mraa_pwm_context dev, mraa_boolean_t owner);
*/
mraa_result_t mraa_pwm_close(mraa_pwm_context dev);
/**
* Set Both Period and DutyCycle on a PWM context
*
* @param dev The pwm context to use
* @param period represented in ms.
* @param duty dutycycle of the pwm signal.
* @return Result of operation
*/
mraa_result_t mraa_pwm_config_ms(mraa_pwm_context dev, int period, float duty);
/**
* Set Both Period and DutyCycle on a PWM context. Duty represented as percentage.
*
* @param dev The pwm context to use
* @param period represented in ms.
* @param duty duty percantage. i.e. 50% = 0.5f
* @return Result of operation
*/
mraa_result_t mraa_pwm_config_percent(mraa_pwm_context dev, int period, float duty);
/**
* Get the maximum pwm period in us
*
* @param dev The pwm context to use
* @return max pwm in us
*/
int mraa_pwm_get_max_period();
int mraa_pwm_get_max_period(mraa_pwm_context dev);
/**
* Get the minimum pwm period in us
*
* @param dev The pwm context to use
* @return min pwm in us
*/
int mraa_pwm_get_min_period();
int mraa_pwm_get_min_period(mraa_pwm_context dev);
#ifdef __cplusplus
}

View File

@@ -46,9 +46,9 @@ class Pwm
*
* @param pin the pin number used on your board
* @param owner if you are the owner of the pin the destructor will
* @param chipid the pwmchip to use, use only in raw mode
* unexport the pin from sysfs, default behaviour is you are the owner
* if the pinmapper exported it
* @param chipid the pwmchip to use, use only in raw mode
*/
Pwm(int pin, bool owner = true, int chipid = -1)
{
@@ -66,6 +66,20 @@ class Pwm
mraa_pwm_owner(m_pwm, 0);
}
}
/**
* Pwm constructor, takes a pointer to the PWM context and
* initialises the class
*
* @param void * to a PWM context
*/
Pwm(void* pwm_context)
{
m_pwm = (mraa_pwm_context) pwm_context;
if (m_pwm == NULL) {
throw std::invalid_argument("Invalid PWM context");
}
}
/**
* Pwm destructor
*/
@@ -77,7 +91,7 @@ class Pwm
* Set the output duty-cycle percentage, as a float
*
* @param percentage A floating-point value representing percentage of
* output. The value should lie between 0.0f (representing on 0%) and
* output. The value should lie between 0.0f (representing 0%) and
* 1.0f Values above or below this range will be set at either 0.0f or
* 1.0f
* @return Result of operation
@@ -88,10 +102,10 @@ class Pwm
return (Result) mraa_pwm_write(m_pwm, percentage);
}
/**
* Read the ouput duty-cycle percentage, as a float
* Read the output duty-cycle percentage, as a float
*
* @return A floating-point value representing percentage of
* output. The value should lie between 0.0f (representing on 0%) and
* output. The value should lie between 0.0f (representing 0%) and
* 1.0f Values above or below this range will be set at either 0.0f or
* 1.0f
*/
@@ -134,7 +148,7 @@ class Pwm
return (Result) mraa_pwm_period_us(m_pwm, us);
}
/**
* Set pulsewidth, As represnted by seconds in a (float)
* Set pulsewidth, as represented by seconds in a float
*
* @param seconds The duration of a pulse
* @return Result of operation
@@ -176,54 +190,27 @@ class Pwm
Result
enable(bool enable)
{
if (enable)
return (Result) mraa_pwm_enable(m_pwm, 1);
else
return (Result) mraa_pwm_enable(m_pwm, 0);
return (Result) mraa_pwm_enable(m_pwm, enable);
}
/**
* Set the period and duty of a PWM object.
* Get the maximum PWM period in us
*
* @param period represented in ms.
* @param duty represnted in ms as float.
* @return Result of operation
*/
Result
config_ms(int period, float duty)
{
return (Result) mraa_pwm_config_ms(m_pwm, period, duty);
}
/**
* Set the period and duty (percent) of a PWM object.
*
* @param period as represented in ms.
* @param duty percentage i.e. 50% = 0.5f
* @return Result of operation
*/
Result
config_percent(int period, float duty)
{
return (Result) mraa_pwm_config_percent(m_pwm, period, duty);
}
/**
* Get the maximum pwm period in us
*
* @return max pwm in us
* @return max PWM period in us
*/
int
max_period()
{
return mraa_pwm_get_max_period();
return mraa_pwm_get_max_period(m_pwm);
}
/**
* Get the minimum pwm period in us
* Get the minimum PWM period in us
*
* @return min pwm in us
* @return min PWM period in us
*/
int
min_period()
{
return mraa_pwm_get_min_period();
return mraa_pwm_get_min_period(m_pwm);
}
private:

View File

@@ -111,13 +111,13 @@ mraa_result_t mraa_spi_frequency(mraa_spi_context dev, int hz);
int mraa_spi_write(mraa_spi_context dev, uint8_t data);
/**
*Write Two Bytes to the SPI device.
* Write Two Bytes to the SPI device.
*
* @param dev The Spi context
* @param data Data to send
* @return Data received on the miso line
*/
uint16_t mraa_spi_write_word(mraa_spi_context dev, uint16_t data);
int mraa_spi_write_word(mraa_spi_context dev, uint16_t data);
/**
* Write Buffer of bytes to the SPI device. The pointer return has to be

View File

@@ -70,6 +70,29 @@ class Spi
}
}
Spi(int bus, int cs)
{
m_spi = mraa_spi_init_raw(bus, cs);
if (m_spi == NULL) {
throw std::invalid_argument("Error initialising SPI bus");
}
}
/**
* Spi Constructor, takes a pointer to a SPI context and initialises
* the SPI class
*
* @param void * to SPI context
*/
Spi(void* spi_context)
{
m_spi = (mraa_spi_context) spi_context;
if (m_spi == NULL) {
throw std::invalid_argument("Invalid SPI context");
}
}
/**
* Closes spi bus
*/
@@ -118,10 +141,10 @@ class Spi
* Write single byte to the SPI device
*
* @param data the byte to send
* @return data received on the miso line
* @return data received on the miso line or -1 in case of error
*/
uint16_t
write_word(uint16_t data)
int
writeWord(uint16_t data)
{
return mraa_spi_write_word(m_spi, (uint16_t) data);
}
@@ -152,7 +175,7 @@ class Spi
* @return uint8_t* data received on the miso line. Same length as passed in
*/
uint16_t*
write_word(uint16_t* txBuf, int length)
writeWord(uint16_t* txBuf, int length)
{
return mraa_spi_write_buf_word(m_spi, txBuf, length);
}

View File

@@ -46,10 +46,17 @@ typedef enum {
MRAA_BEAGLEBONE = 6, /**< The different BeagleBone Black Modes B/C */
MRAA_BANANA = 7, /**< Allwinner A20 based Banana Pi and Banana Pro */
MRAA_INTEL_NUC5 = 8, /**< The Intel 5th generations Broadwell NUCs */
MRAA_96BOARDS = 9, /**< Linaro 96boards */
MRAA_INTEL_SOFIA_3GR = 10, /**< The Intel SoFIA 3GR */
MRAA_INTEL_CHERRYHILLS = 11, /**< The Intel Braswell Cherryhills */
MRAA_UP = 12, /**< The UP Board */
// USB platform extenders start at 256
MRAA_FTDI_FT4222 = 256, /**< FTDI FT4222 USB to i2c bridge */
// contains bit 9 so is subplatform
MRAA_GENERIC_FIRMATA = 1280, /**< Firmata uart platform/bridge */
MRAA_NULL_PLATFORM = 98, /**< Platform with no capabilities that hosts a sub platform */
MRAA_UNKNOWN_PLATFORM =
99 /**< An unknown platform type, typically will load INTEL_GALILEO_GEN1 */
@@ -199,7 +206,9 @@ typedef enum {
MRAA_ERROR_NO_DATA_AVAILABLE = 9, /**< No data available */
MRAA_ERROR_INVALID_PLATFORM = 10, /**< Platform not recognised */
MRAA_ERROR_PLATFORM_NOT_INITIALISED = 11, /**< Board information not initialised */
MRAA_ERROR_PLATFORM_ALREADY_INITIALISED = 12, /**< Board is already initialised */
MRAA_ERROR_UART_OW_SHORTED = 12, /**< UART OW Short Circuit Detected*/
MRAA_ERROR_UART_OW_NO_DEVICES = 13, /**< UART OW No devices detected */
MRAA_ERROR_UART_OW_DATA_ERROR = 14, /**< UART OW Data/Bus error detected */
MRAA_ERROR_UNSPECIFIED = 99 /**< Unknown Error */
} mraa_result_t;
@@ -235,8 +244,6 @@ typedef enum {
MRAA_UART_PARITY_SPACE = 4
} mraa_uart_parity_t;
#ifdef __cplusplus
}
#endif

View File

@@ -46,7 +46,16 @@ typedef enum {
RASPBERRY_PI = 5, /**< The different Raspberry PI Models -like A,B,A+,B+ */
BEAGLEBONE = 6, /**< The different BeagleBone Black Modes B/C */
BANANA = 7, /**< Allwinner A20 based Banana Pi and Banana Pro */
INTEL_NUC5 = 8, /**< The Intel 5th generations Broadwell NUCs */
A96BOARDS = 9, /**< Linaro 96boards, A prefix for 'ARM' since not allowed numerical */
INTEL_SOFIA_3GR = 10, /**< The Intel SoFIA 3GR */
INTEL_CHERRYHILLS = 11, /**< The Intel Braswell Cherryhills */
FTDI_FT4222 = 256, /**< FTDI FT4222 USB to i2c bridge */
GENERIC_FIRMATA = 1280, /**< Firmata uart platform/bridge */
NULL_PLATFORM = 98,
UNKNOWN_PLATFORM =
99 /**< An unknown platform type, typically will load INTEL_GALILEO_GEN1 */
} Platform;
@@ -195,7 +204,9 @@ typedef enum {
ERROR_NO_DATA_AVAILABLE = 9, /**< No data available */
ERROR_INVALID_PLATFORM = 10, /**< Platform not recognised */
ERROR_PLATFORM_NOT_INITIALISED = 11, /**< Board information not initialised */
ERROR_PLATFORM_ALREADY_INITIALISED = 12, /**< Board is already initialised */
ERROR_UART_OW_SHORTED = 12, /**< UART OW Short Circuit Detected*/
ERROR_UART_OW_NO_DEVICES = 13, /**< UART OW No devices detected */
ERROR_UART_OW_DATA_ERROR = 14, /**< UART OW Data/Bus error detected */
ERROR_UNSPECIFIED = 99 /**< Unknown Error */
} Result;

View File

@@ -118,6 +118,15 @@ mraa_result_t mraa_uart_set_flowcontrol(mraa_uart_context dev, mraa_boolean_t xo
*/
mraa_result_t mraa_uart_set_timeout(mraa_uart_context dev, int read, int write, int interchar);
/**
* Set the blocking state for write operations
*
* @param dev The UART context
* @param nonblock new nonblocking state
* @return Result of operation
*/
mraa_result_t mraa_uart_set_non_blocking(mraa_uart_context dev, mraa_boolean_t nonblock);
/**
* Get Char pointer with tty device path within Linux
* For example. Could point to "/dev/ttyS0"

View File

@@ -28,6 +28,7 @@
#include "uart.h"
#include "types.hpp"
#include <stdlib.h>
#include <stdexcept>
#include <cstring>
@@ -74,6 +75,20 @@ class Uart
}
}
/**
* Uart Constructor, takes a pointer to the UART context and initialises
* the UART class
*
* @param void * to a UART context
*/
Uart(void* uart_context)
{
m_uart = (mraa_uart_context) uart_context;
if (m_uart == NULL) {
throw std::invalid_argument("Invalid UART context");
}
}
/**
* Uart destructor
*/
@@ -125,12 +140,17 @@ class Uart
* Read bytes from the device into a String object
*
* @param length to read
* @throws std::bad_alloc If there is no space left for read.
* @return string of data
*/
std::string
readStr(int length)
{
char* data = (char*) malloc(sizeof(char) * length);
if (data == NULL) {
throw std::bad_alloc();
}
int v = mraa_uart_read(m_uart, data, (size_t) length);
std::string ret(data, v);
free(data);
@@ -235,6 +255,19 @@ class Uart
return (Result) mraa_uart_set_timeout(m_uart, read, write, interchar);
}
/**
* Set the blocking state for write operations
*
* @param dev The UART context
* @param nonblock new nonblocking state
* @return Result of operation
*/
Result
SetNonBlocking(bool nonblock)
{
return (Result) mraa_uart_set_non_blocking(m_uart, nonblock);
}
private:
mraa_uart_context m_uart;
};

197
api/mraa/uart_ow.h Normal file
View File

@@ -0,0 +1,197 @@
/*
* Author: Jon Trulson <jtrulson@ics.com>
* Copyright (c) 2016 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
/**
* @file
* @brief UART OW module
*
* This module allows one to use MRAA's UART support in order to
* interact with Dallas 1-wire compliant devices on a 1-wire bus. It
* makes use of the UART for timing purposes. The principle of
* operation is described here:
* https://www.maximintegrated.com/en/app-notes/index.mvp/id/214
*
* It is important the you use a UART with CMOS/TTL level voltages
* (3.3v/5v) RX and TX lines. DO NOT use standard RS232 level
* voltages, or you are going to have a bad day.
*
* In addition, a diode should be placed across the RX and
* TX lines like so:
*
* -|
* U|
* A| TX---|<--+
* R| |
* T| RX-------o--------o 1-wire data bus
* -|
*
* The diode on TX is a 1N4148 (cheap and common), with the cathode
* connected to TX, and the anode connected to RX and the rest of the
* 1-wire data line.
*
* @snippet uart_ow.c Interesting
*/
#ifdef __cplusplus
extern "C" {
#endif
#include <stdio.h>
#include "common.h"
#include "uart.h"
/* for now, we simply use the normal MRAA UART context */
typedef struct _mraa_uart_ow {
mraa_uart_context uart;
/* search state */
unsigned char ROM_NO[8]; /* 8 byte (64b) rom code */
int LastDiscrepancy;
int LastFamilyDiscrepancy;
mraa_boolean_t LastDeviceFlag;
} *mraa_uart_ow_context;
/* 8 bytes (64 bits) for a device rom code */
static const int MRAA_UART_OW_ROMCODE_SIZE = 8;
/**
* UART One Wire ROM related Command bytes
*/
typedef enum {
MRAA_UART_OW_CMD_READ_ROM = 0x33, /**< read rom, when only one device on bus */
MRAA_UART_OW_CMD_MATCH_ROM = 0x55, /**< match a specific rom code */
MRAA_UART_OW_CMD_SKIP_ROM = 0xcc, /**< skip match/search rom */
MRAA_UART_OW_CMD_SEARCH_ROM_ALARM = 0xec, /**< search all roms in alarm state */
MRAA_UART_OW_CMD_SEARCH_ROM = 0xf0 /**< search all rom codes */
} mraa_uart_ow_rom_cmd_t;
/**
* Initialise uart_ow_context, uses UART board mapping
*
* @param uart the index of the uart set to use
* @return uart_ow context or NULL
*/
mraa_uart_ow_context mraa_uart_ow_init(int uart);
/**
* Initialise a raw uart_ow_context. No board setup.
*
* @param path for example "/dev/ttyS0"
* @return uart_ow context or NULL
*/
mraa_uart_ow_context mraa_uart_ow_init_raw(const char* path);
/**
* Get char pointer with tty device path within Linux
* For example. Could point to "/dev/ttyS0"
*
* @param dev uart_ow context
* @return char pointer of device path
*/
const char* mraa_uart_ow_get_dev_path(mraa_uart_ow_context dev);
/**
* Destroy a mraa_uart_ow_context
*
* @param dev uart_ow context
* @return mraa_result_t
*/
mraa_result_t mraa_uart_ow_stop(mraa_uart_ow_context dev);
/**
* Read a byte from the 1-wire bus
*
* @param dev uart_ow context
* @return the byte read or -1 for error
*/
int mraa_uart_ow_read_byte(mraa_uart_ow_context dev);
/**
* Write a byte to a 1-wire bus
*
* @param dev uart_ow context
* @param byte the byte to write to the bus
* @return the byte read back during the time slot or -1 for error
*/
int mraa_uart_ow_write_byte(mraa_uart_ow_context dev, uint8_t byte);
/**
* Write a bit to a 1-wire bus and read a bit corresponding to the
* time slot back. This is possible due to the way we wired the TX
* and RX together with a diode, forming a loopback.
*
* @param dev uart_ow context
* @param bit the bit to write to the bus
* @return the bit read back during the time slot or -1 for error
*/
int mraa_uart_ow_bit(mraa_uart_ow_context dev, uint8_t bit);
/**
* Send a reset pulse to the 1-wire bus and test for device presence
*
* @param dev uart_ow context
* @return one of the mraa_result_t values
*/
mraa_result_t mraa_uart_ow_reset(mraa_uart_ow_context dev);
/**
* Begin a rom code search of the 1-wire bus. This function
* implements the 1-wire search algorithm. See the uart_ow.c example
* for an idea on how to use this function to identify all devices
* present on the bus.
*
* @param dev uart_ow context
* @param start true to start a new search from scratch, false to
* continue an existing search
* @param id the 8-byte rom code id of the current matched device when
* a device is found
* @return one of the mraa_result_t values
*/
mraa_result_t mraa_uart_ow_rom_search(mraa_uart_ow_context dev, mraa_boolean_t start, uint8_t* id);
/**
* Send a command byte to a device on the 1-wire bus
*
* @param dev uart_ow context
* @param command the command byte to send
* @param id the rom code id of the device to receive the command,
* NULL for all devices on the bus
* @return one of the mraa_result_t values
*/
mraa_result_t mraa_uart_ow_command(mraa_uart_ow_context dev, uint8_t command, uint8_t* id);
/**
* Perform a Dallas 1-wire compliant CRC8 computation on a buffer
*
* @param buffer the buffer containing the data
* @param length the length of the buffer
* @return the computed CRC
*/
uint8_t mraa_uart_ow_crc8(uint8_t* buffer, uint16_t length);
#ifdef __cplusplus
}
#endif

277
api/mraa/uart_ow.hpp Normal file
View File

@@ -0,0 +1,277 @@
/*
* Author: Jon Trulson <jtrulson@ics.com>
* Copyright (c) 2016 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 "uart_ow.h"
#include "types.hpp"
#include <stdexcept>
#include <cstring>
namespace mraa
{
/**
* @brief API for UART One Wire
*
* This file defines the UartOW (UART to Dallas 1-wire) interface for libmraa
*
* @snippet UartOW.cpp Interesting
*/
class UartOW
{
public:
/**
* UartOW Constructor, takes a pin number which will map directly to the
* linux uart number, this 'enables' the uart, nothing more
*
* @throws std::invalid_argument in case of error
* @param uart the index of the uart to use
*/
UartOW(int uart)
{
m_uart = mraa_uart_ow_init(uart);
if (m_uart == NULL) {
throw std::invalid_argument("Error initialising UART_OW");
}
}
/**
* UartOW Constructor, takes a string to the path of the serial
* interface that is needed.
*
* @throws std::invalid_argument in case of error
* @param path the file path for the UART to use
*/
UartOW(std::string path)
{
m_uart = mraa_uart_ow_init_raw(path.c_str());
if (m_uart == NULL) {
throw std::invalid_argument("Error initialising UART");
}
}
/**
* Uart destructor
*/
~UartOW()
{
mraa_uart_ow_stop(m_uart);
}
/**
* Get string with tty device path within Linux
* For example. Could point to "/dev/ttyS0"
*
* @return char pointer of device path
*/
std::string
getDevicePath()
{
std::string ret_val(mraa_uart_ow_get_dev_path(m_uart));
return ret_val;
}
/**
* Read a byte from the 1-wire bus
*
* @throws std::invalid_argument in case of error
* @return the byte read
*/
uint8_t
readByte()
{
int res = mraa_uart_ow_read_byte(m_uart);
if (res == -1) {
throw std::invalid_argument("Unknown UART_OW error");
}
return (uint8_t) res;
}
/**
* Write a byte to a 1-wire bus
*
* @param byte the byte to write to the bus
*
* @throws std::invalid_argument in case of error
* @return the byte read back during the time slot
*/
uint8_t
writeByte(uint8_t byte)
{
int res = mraa_uart_ow_write_byte(m_uart, byte);
if (res == -1) {
throw std::invalid_argument("Unknown UART_OW error");
}
return (uint8_t) res;
}
/**
* Write a bit to a 1-wire bus and read a bit corresponding to the
* time slot back. This is possible due to the way we wired the TX
* and RX together with a diode, forming a loopback.
*
* @param bit the bit to write to the bus
* @throws std::invalid_argument in case of error
* @return the bit read back during the time slot
*/
bool
writeBit(bool bit)
{
int res = mraa_uart_ow_bit(m_uart, (bit) ? 1 : 0);
if (res == -1) {
throw std::invalid_argument("Unknown UART_OW error");
}
return ((res) ? true : false);
}
/**
* Send a reset pulse to the 1-wire bus and test for device presence
*
* @return one of the mraa::Result values
*/
mraa::Result
reset()
{
return (mraa::Result) mraa_uart_ow_reset(m_uart);
}
/**
* Begin a rom code search of the 1-wire bus. This function
* implements the 1-wire search algorithm. See the uart_ow.c example
* for an idea on how to use this function to identify all devices
* present on the bus.
*
* @param start true to start a search from scratch, false to
* continue a previously started search
* @param id the 8-byte rom code id of the current matched device when a
* device is found
* @return one of the mraa::Result values
*/
mraa::Result
search(bool start, uint8_t* id)
{
return (mraa::Result) mraa_uart_ow_rom_search(m_uart, (start) ? 1 : 0, id);
}
/**
* Begin a rom code search of the 1-wire bus. This function
* implements the 1-wire search algorithm. See the UartOW.cpp
* example for an idea on how to use this function to identify all
* devices present on the bus.
*
* @param start true to start a search from scratch, false to
* continue a previously started search
* @return an empty string if no [more] devices are found, or a
* string containing the 8-byte romcode of a detected device.
*/
std::string
search(bool start)
{
uint8_t id[MRAA_UART_OW_ROMCODE_SIZE];
mraa_result_t rv;
rv = mraa_uart_ow_rom_search(m_uart, (start) ? 1 : 0, id);
if (rv == MRAA_SUCCESS) {
// we found one
std::string idStr((char*) id, MRAA_UART_OW_ROMCODE_SIZE);
return idStr;
} else {
// failure, or end of search
return "";
}
}
/**
* Send a command byte to a device on the 1-wire bus
*
* @param command the command byte to send
* @param id the rom code id of the device to receive the command,
* NULL for all devices on the bus
* @return one of the mraa::Result values
*/
mraa::Result
command(uint8_t command, uint8_t* id)
{
return (mraa::Result) mraa_uart_ow_command(m_uart, command, id);
}
/**
* Send a command byte to a device on the 1-wire bus, supplying
* the id as a std::string
*
* @param command the command byte to send
* @param id std::string representing the code id of the device to
* receive the command, or an empty string for all devices on the
* bus. This string should be 8 bytes in size.
* @return one of the mraa::Result values
*/
mraa::Result
command(uint8_t command, std::string id)
{
if (id.empty() == 0)
return (mraa::Result) mraa_uart_ow_command(m_uart, command, NULL);
else {
if (id.size() != 8) {
// Only 8 byte romcodes are legal.
throw std::invalid_argument(std::string(__FUNCTION__) +
": id must be 8 bytes only");
}
return (mraa::Result) mraa_uart_ow_command(m_uart, command, (uint8_t*) id.c_str());
}
}
/**
* Perform a Dallas 1-wire compliant CRC8 computation on a buffer
*
* @param buffer the buffer containing the data
* @param length the length of the buffer
* @return the computed CRC
*/
uint8_t
crc8(uint8_t* buffer, uint16_t length)
{
return mraa_uart_ow_crc8(buffer, length);
}
/**
* Perform a Dallas 1-wire compliant CRC8 computation on a
* std::string based buffer
*
* @param buffer std::string buffer containing the data
* @return the computed CRC
*/
uint8_t
crc8(std::string buffer)
{
return mraa_uart_ow_crc8((uint8_t*) buffer.c_str(), buffer.size());
}
private:
mraa_uart_ow_context m_uart;
};
}

View File

@@ -0,0 +1,21 @@
# JSON-C_FOUND - true if library and headers were found
# JSON-C_INCLUDE_DIRS - include directories
# JSON-C_LIBRARIES - library directories
find_package (PkgConfig)
pkg_check_modules (PC_JSON-C QUIET json-c)
find_path (JSON-C_INCLUDE_DIR json.h HINTS ${PC_JSON-C_INCLUDEDIR}
${PC_JSON-C_INCLUDE_DIRS} PATH_SUFFIXES json-c json)
find_library (JSON-C_LIBRARY NAMES json-c libjson-c HINTS ${PC_JSON-C_LIBDIR}
${PC_JSON-C_LIBRARY_DIRS})
set (JSON-C_LIBRARIES ${JSON-C_LIBRARY})
set (JSON-C_INCLUDE_DIRS ${JSON-C_INCLUDE_DIR})
include (FindPackageHandleStandardArgs)
find_package_handle_standard_args (JSON-C DEFAULT_MSG JSON-C_LIBRARY JSON-C_INCLUDE_DIR)
mark_as_advanced (JSON-C_INCLUDE_DIR JSON-C_LIBRARY)

View File

@@ -1,4 +1,12 @@
find_program (NODE_EXECUTABLE NAMES node nodejs
# Macro to add directory to NODEJS_INCLUDE_DIRS if it exists and is not /usr/include
macro(add_include_dir dir)
if (IS_DIRECTORY ${dir} AND NOT ${dir} STREQUAL "/usr/include")
set(NODEJS_INCLUDE_DIRS ${NODEJS_INCLUDE_DIRS} ${dir})
endif()
endmacro()
find_program (NODEJS_EXECUTABLE NAMES node nodejs
HINTS
$ENV{NODE_DIR}
PATH_SUFFIXES bin
@@ -7,26 +15,50 @@ find_program (NODE_EXECUTABLE NAMES node nodejs
include (FindPackageHandleStandardArgs)
find_path (NODE_ROOT_DIR "node/node.h" "src/node.h"
# If compat-libuv package exists, it must be at start of include path
find_path (UV_ROOT_DIR "uv.h" PATHS /usr/include/compat-libuv010 NO_DEFAULT_PATH)
if (UV_ROOT_DIR)
# set (NODEJS_INCLUDE_DIRS ${UV_ROOT_DIR})
add_include_dir(${UV_ROOT_DIR})
endif()
# Now look for node. Flag an error if not found
find_path (NODE_ROOT_DIR "include/node/node.h" "include/src/node.h"
PATHS /usr/include/nodejs /usr/local/include/nodejs /usr/local/include)
if (NODE_ROOT_DIR)
add_include_dir(${NODE_ROOT_DIR}/include/src)
add_include_dir(${NODE_ROOT_DIR}/include/node)
add_include_dir(${NODE_ROOT_DIR}/include/deps/v8/include)
add_include_dir(${NODE_ROOT_DIR}/include/deps/uv/include)
else()
unset(NODEJS_INCLUDE_DIRS)
message(ERROR " - node.h not found")
endif()
set (NODE_INCLUDE_DIRS
${NODE_ROOT_DIR}/src
${NODE_ROOT_DIR}/node
${NODE_ROOT_DIR}/deps/v8/include
${NODE_ROOT_DIR}/deps/uv/include
# Check that v8.h is in NODEJS_INCLUDE_DIRS
find_path (V8_ROOT_DIR "v8.h" PATHS ${NODEJS_INCLUDE_DIRS})
if (NOT V8_ROOT_DIR)
unset(NODEJS_INCLUDE_DIRS)
message(ERROR " - v8.h not found")
endif()
# Check that uv.h is in NODEJS_INCLUDE_DIRS
find_path (UV_ROOT_DIR "uv.h" PATHS ${NODEJS_INCLUDE_DIRS})
if (NOT UV_ROOT_DIR)
unset(NODEJS_INCLUDE_DIRS)
message(ERROR " - uv.h not found")
endif()
find_package_handle_standard_args (Nodejs DEFAULT_MSG
NODEJS_EXECUTABLE
NODEJS_INCLUDE_DIRS
)
find_package_handle_standard_args (Node DEFAULT_MSG
NODE_EXECUTABLE
NODE_INCLUDE_DIRS
)
if (NODE_EXECUTABLE)
execute_process(COMMAND ${NODE_EXECUTABLE} --version
if (NODEJS_EXECUTABLE)
execute_process(COMMAND ${NODEJS_EXECUTABLE} --version
OUTPUT_VARIABLE _VERSION
RESULT_VARIABLE _NODE_VERSION_RESULT)
execute_process(COMMAND ${NODE_EXECUTABLE} -e "console.log(process.versions.v8)"
execute_process(COMMAND ${NODEJS_EXECUTABLE} -e "console.log(process.versions.v8)"
OUTPUT_VARIABLE _V8_VERSION
RESULT_VARIABLE _V8_RESULT)
if (NOT _NODE_VERSION_RESULT AND NOT _V8_RESULT)
@@ -53,7 +85,10 @@ if (NODE_EXECUTABLE)
set (V8_VERSION_STRING "3.28.72")
message ("defaulted to node 0.10.30")
endif ()
message ("INFO - Node version is " ${NODE_VERSION_STRING} "INFO - Node using v8 " ${V8_VERSION_STRING})
string (REGEX REPLACE "\n" "" NODE_VERSION_STRING ${NODE_VERSION_STRING})
string (REGEX REPLACE "\n" "" V8_VERSION_STRING ${V8_VERSION_STRING})
message ("INFO - Node version is " ${NODE_VERSION_STRING})
message ("INFO - Node using v8 " ${V8_VERSION_STRING})
mark_as_advanced (NODEJS_EXECUTABLE)
endif ()
mark_as_advanced (NODE_EXECUTABLE)

View File

@@ -0,0 +1,21 @@
# UDEV_FOUND - true if library and headers were found
# UDEV_INCLUDE_DIRS - include directories
# UDEV_LIBRARIES - library directories
find_package (PkgConfig)
pkg_check_modules (PC_UDEV QUIET udev)
find_path (UDEV_INCLUDE_DIR libudev.h HINTS ${PC_UDEV_INCLUDEDIR}
${PC_UDEV_INCLUDE_DIRS} PATH_SUFFIXES udev)
find_library (UDEV_LIBRARY NAMES udev libudev HINTS ${PC_UDEV_LIBDIR}
${PC_UDEV_LIBRARY_DIRS})
set (UDEV_LIBRARIES ${UDEV_LIBRARY})
set (UDEV_INCLUDE_DIRS ${UDEV_INCLUDE_DIR})
include (FindPackageHandleStandardArgs)
find_package_handle_standard_args (UDEV DEFAULT_MSG UDEV_LIBRARY UDEV_INCLUDE_DIR)
mark_as_advanced (UDEV_INCLUDE_DIR UDEV_LIBRARY)

View File

@@ -0,0 +1,158 @@
# Find specified Python version
# Arguments:
# preferred_version (value): Version to check for first
# min_version (value): Minimum supported version
# library_env (value): Name of Python library ENV variable to check
# include_dir_env (value): Name of Python include directory ENV variable to check
# found (variable): Set if interpreter found
# executable (variable): Output of executable found
# version_string (variable): Output of found version
# version_major (variable): Output of found major version
# version_minor (variable): Output of found minor version
# libs_found (variable): Set if libs found
# libs_version_string (variable): Output of found libs version
# libraries (variable): Output of found Python libraries
# library (variable): Output of found Python library
# debug_libraries (variable): Output of found Python debug libraries
# debug_library (variable): Output of found Python debug library
# include_path (variable): Output of found Python include path
# include_dir (variable): Output of found Python include dir
# include_dir2 (variable): Output of found Python include dir2
# packages_path (variable): Output of found Python packages path
function(find_python preferred_version min_version library_env include_dir_env
found executable version_string version_major version_minor
libs_found libs_version_string libraries library debug_libraries
debug_library include_path include_dir include_dir2 packages_path)
if(NOT ${found})
if(${executable})
set(PYTHON_EXECUTABLE "${${executable}}")
endif()
find_package(PythonInterp "${preferred_version}")
if(NOT PYTHONINTERP_FOUND)
find_package(PythonInterp "${min_version}")
endif()
if(PYTHONINTERP_FOUND)
# Copy outputs
set(_found ${PYTHONINTERP_FOUND})
set(_executable ${PYTHON_EXECUTABLE})
set(_version_string ${PYTHON_VERSION_STRING})
set(_version_major ${PYTHON_VERSION_MAJOR})
set(_version_minor ${PYTHON_VERSION_MINOR})
set(_version_patch ${PYTHON_VERSION_PATCH})
# Clear find_host_package side effects
unset(PYTHONINTERP_FOUND)
unset(PYTHON_EXECUTABLE CACHE)
unset(PYTHON_VERSION_STRING)
unset(PYTHON_VERSION_MAJOR)
unset(PYTHON_VERSION_MINOR)
unset(PYTHON_VERSION_PATCH)
endif()
if(_found)
set(_version_major_minor "${_version_major}.${_version_minor}")
if(NOT ANDROID AND NOT APPLE_FRAMEWORK)
# not using _version_string here, because it might not conform to the CMake version format
if(CMAKE_CROSSCOMPILING)
# builder version can differ from target, matching base version (e.g. 2.7)
find_package(PythonLibs "${_version_major_minor}")
else()
find_package(PythonLibs "${_version_major_minor}.${_version_patch}" EXACT)
endif()
if(PYTHONLIBS_FOUND)
# Copy outputs
set(_libs_found ${PYTHONLIBS_FOUND})
set(_libraries ${PYTHON_LIBRARIES})
set(_include_path ${PYTHON_INCLUDE_PATH})
set(_include_dirs ${PYTHON_INCLUDE_DIRS})
set(_debug_libraries ${PYTHON_DEBUG_LIBRARIES})
set(_libs_version_string ${PYTHONLIBS_VERSION_STRING})
set(_debug_library ${PYTHON_DEBUG_LIBRARY})
set(_library ${PYTHON_LIBRARY})
set(_library_debug ${PYTHON_LIBRARY_DEBUG})
set(_library_release ${PYTHON_LIBRARY_RELEASE})
set(_include_dir ${PYTHON_INCLUDE_DIR})
set(_include_dir2 ${PYTHON_INCLUDE_DIR2})
# Clear find_package side effects
unset(PYTHONLIBS_FOUND)
unset(PYTHON_LIBRARIES)
unset(PYTHON_INCLUDE_PATH)
unset(PYTHON_INCLUDE_DIRS)
unset(PYTHON_DEBUG_LIBRARIES)
unset(PYTHONLIBS_VERSION_STRING)
unset(PYTHON_DEBUG_LIBRARY CACHE)
unset(PYTHON_LIBRARY)
unset(PYTHON_LIBRARY_DEBUG)
unset(PYTHON_LIBRARY_RELEASE)
unset(PYTHON_LIBRARY CACHE)
unset(PYTHON_LIBRARY_DEBUG CACHE)
unset(PYTHON_LIBRARY_RELEASE CACHE)
unset(PYTHON_INCLUDE_DIR CACHE)
unset(PYTHON_INCLUDE_DIR2 CACHE)
endif()
endif()
execute_process(COMMAND ${_executable} -c "from distutils.sysconfig import *; print(get_python_lib())"
RESULT_VARIABLE _cvpy_process
OUTPUT_VARIABLE _std_packages_path
OUTPUT_STRIP_TRAILING_WHITESPACE)
if("${_std_packages_path}" MATCHES "site-packages")
set(_packages_path "python${_version_major_minor}/site-packages")
else() #debian based assumed, install to the dist-packages.
set(_packages_path "python${_version_major_minor}/dist-packages")
endif()
if(EXISTS "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}/${${packages_path}}")
set(_packages_path "lib${LIB_SUFFIX}/${_packages_path}")
else()
set(_packages_path "lib/${_packages_path}")
endif()
endif()
# Export return values
set(${found} "${_found}" CACHE INTERNAL "")
set(${executable} "${_executable}" CACHE FILEPATH "Path to Python interpretor")
set(${version_string} "${_version_string}" CACHE INTERNAL "")
set(${version_major} "${_version_major}" CACHE INTERNAL "")
set(${version_minor} "${_version_minor}" CACHE INTERNAL "")
set(${libs_found} "${_libs_found}" CACHE INTERNAL "")
set(${libs_version_string} "${_libs_version_string}" CACHE INTERNAL "")
set(${libraries} "${_libraries}" CACHE INTERNAL "Python libraries")
set(${library} "${_library}" CACHE FILEPATH "Path to Python library")
set(${debug_libraries} "${_debug_libraries}" CACHE INTERNAL "")
set(${debug_library} "${_debug_library}" CACHE FILEPATH "Path to Python debug")
set(${include_path} "${_include_path}" CACHE INTERNAL "")
set(${include_dir} "${_include_dir}" CACHE PATH "Python include dir")
set(${include_dir2} "${_include_dir2}" CACHE PATH "Python include dir 2")
set(${packages_path} "${_packages_path}" CACHE PATH "Where to install the python packages.")
endif()
endfunction(find_python)
find_python(2.7 "${MIN_VER_PYTHON2}" PYTHON2_LIBRARY PYTHON2_INCLUDE_DIR
PYTHON2INTERP_FOUND PYTHON2_EXECUTABLE PYTHON2_VERSION_STRING
PYTHON2_VERSION_MAJOR PYTHON2_VERSION_MINOR PYTHON2LIBS_FOUND
PYTHON2LIBS_VERSION_STRING PYTHON2_LIBRARIES PYTHON2_LIBRARY
PYTHON2_DEBUG_LIBRARIES PYTHON2_LIBRARY_DEBUG PYTHON2_INCLUDE_PATH
PYTHON2_INCLUDE_DIR PYTHON2_INCLUDE_DIR2 PYTHON2_PACKAGES_PATH)
find_python(3 "${MIN_VER_PYTHON3}" PYTHON3_LIBRARY PYTHON3_INCLUDE_DIR
PYTHON3INTERP_FOUND PYTHON3_EXECUTABLE PYTHON3_VERSION_STRING
PYTHON3_VERSION_MAJOR PYTHON3_VERSION_MINOR PYTHON3LIBS_FOUND
PYTHON3LIBS_VERSION_STRING PYTHON3_LIBRARIES PYTHON3_LIBRARY
PYTHON3_DEBUG_LIBRARIES PYTHON3_LIBRARY_DEBUG PYTHON3_INCLUDE_PATH
PYTHON3_INCLUDE_DIR PYTHON3_INCLUDE_DIR2 PYTHON3_PACKAGES_PATH)
if(PYTHON_DEFAULT_EXECUTABLE)
set(PYTHON_DEFAULT_AVAILABLE "TRUE")
elseif(PYTHON2INTERP_FOUND) # Use Python 2 as default Python interpreter
set(PYTHON_DEFAULT_AVAILABLE "TRUE")
set(PYTHON_DEFAULT_EXECUTABLE "${PYTHON2_EXECUTABLE}")
elseif(PYTHON3INTERP_FOUND) # Use Python 2 as fallback Python interpreter (if there is no Python 2)
set(PYTHON_DEFAULT_AVAILABLE "TRUE")
set(PYTHON_DEFAULT_EXECUTABLE "${PYTHON3_EXECUTABLE}")
endif()

View File

@@ -13,7 +13,9 @@
# "There are many more known variants/revisions that we do not handle/detect."
set(archdetect_c_code "
#if defined(__arm__) || defined(__TARGET_ARCH_ARM)
#if defined(__aarch64__)
#error cmake_ARCH armv8
#elif defined(__arm__) || defined(__TARGET_ARCH_ARM)
#if defined(__ARM_ARCH_7__) \\
|| defined(__ARM_ARCH_7A__) \\
|| defined(__ARM_ARCH_7R__) \\

View File

@@ -75,6 +75,8 @@ style numbers.
There is also a second 8-pin connector on the Banana Pi, the pins are as follows:
| MRAA Number | Physical Pin | Function |
|-------------|--------------|-----------|
| 27 | P1-19 | 5V VCC |
| 28 | P1-20 | 3V3 VCC |
| 29 | P1-21 | GPIO(PH5) |

View File

@@ -1,10 +1,10 @@
Building libmraa {#building}
===============
libmraa uses cmake in order to make compilation relatively painless. CMake runs
build out of tree so the recommended way is to clone from git and make a `build/`
directory inside the clone directory.
For building imraa check [building imraa](./imraa.md)
## Build dependencies
Not all these are required but if you're unsure of what you're doing this is
what you'll need:
@@ -12,7 +12,7 @@ what you'll need:
* [git](http://git-scm.com)
* [python](http://python.org) 2.7 or 3.4+ (you'll need not just the interpreter but python-dev)
* [node.js](http://nodejs.org) 0.10.x or 0.12.x (you'll need not just the interpreter but nodejs-dev)
* [CMake](http://cmake.org) 2.8.8+
* [CMake](http://cmake.org) 2.8.8+ (3.1+ is recommended for node.js version 2+)
For Debian-like distros the below command installs the basic set:
@@ -92,10 +92,6 @@ Building doc, this will require [SPHINX](http://sphinx-doc.org) &
[Doxygen](http://doxygen.org):
`-DBUILDDOC=ON`
Building with Python 3 (careful you need to clear CMake cache between Python
version switches!)
`-DBUILDPYTHON3=ON`
Override build architecture (this is useful because on x86 ARM code is not
compiled so use this flag to force the target arch)
`-DBUILDARCH=arm`
@@ -164,13 +160,15 @@ To run, make sure `libmraajava.so` is in `LD_LIBRARY_PATH`
jave -cp $DIR_WHERE_YOU_INSTALLED_MRAA/mraa.jar:. Example
~~~~~~~~~~~~~
If you want to add or improve Java bindings for mraa, please follow the [Creating Java Bindings Guide](https://github.com/intel-iot-devkit/upm/blob/master/docs/creating_java_bindings.md).
## Building an IPK/RPM package using `cpack`
You can get `cpack` to generate an IPK or RPM package fairly easily if you have
the correct packaging tools
~~~~~~~~~~~~~{.sh}
cmake -DIPK=ON -DCMAKE_INSTAL_PREFIX=/usr ..
cmake -DIPK=ON -DCMAKE_INSTALL_PREFIX=/usr ..
make package
~~~~~~~~~~~~~
@@ -178,5 +176,5 @@ To use RPM simply enable the RPM option. You'll need `rpmbuild` installed on you
build machine.
~~~~~~~~~~~~~{.sh}
cmake -DRPM=ON -DCMAKE_INSTAL_PREFIX=/usr ..
cmake -DRPM=ON -DCMAKE_INSTALL_PREFIX=/usr ..
~~~~~~~~~~~~~

268
docs/changelog.md Normal file
View File

@@ -0,0 +1,268 @@
Changelog {#changelog}
=========
This changelog is meant as a quick & rough guide to what has changed between
versions. The API is now fairly stable but when new calls/features are added
they are listed here. Anything pre 0.2.x is ignored.
**1.0.0**
* Change API to enhance error checking in C. Changes include:
- mraa_aio_read
- mraa_i2c_read_byte
- mraa_i2c_read
- mraa_i2c_read_byte_data
- mraa_i2c_read_word_data
- mraa_spi_write_word
- mraa::Spi:write_word becomes mraa::Spi::writeWord
* Remove MRAA_ERROR_PLATFORM_ALREADY_INITIALISED which was deprecated for C89 compatibility
* Remove pwm config_* apis as unused
* Add mraa_remove_subplatform
* Support NPM for android
* Fix AIO always returning channel 0 with firmata support
**0.10.1**
* Remove imraa from node package
**0.10.0**
* Add Firmata support with -DFIRMATA=ON
* Add imraa with support for pinmuxing and arduino101 flashing
* Add better support for NVM installed node via NODE_ROOT_DIR.
* Mraa bindings now link to libmraa.so.x
* mraa_init() now returns MRAA_SUCCESS if platform is already initialize
* Mraa java bindings now support JNI 1.6+
* Added support for a02082 rpi2
* Mraa has a logo!
**0.9.6**
* ftdi ft4222 now dynamically loaded
* FT4222 improved ISR code
**0.9.5**
* Add support for the UP board (up-board.org)
* Support OpenJDK 7 as well as OpenJDK 8
* 96board better pin numbering
* node v4 improvements
* Support for PCA9555 i2c expander read/write on FT4222
**0.9.4**
* Fix issue with edison ADC initilisation
* documentation update
**0.9.3**
* Intel edison detection much improved
* ftdi ft4222 interrupt improvement
* small fixes to java lib
**0.9.2**
* Fix bug with mraa_init & USBPLAT
* Add mraa_gpio_read_dir call
* Enable cherryhill/braswell platform
* Improved 96 board support
**0.9.1**
* Minnowboard Turbot support
* Change to java runables for ISR support
* New platform version call
* Default i2c bus on edison miniboard is now i2c-1
* More compatibility with node.js versions > 0.10
* New C++ get i2c default bus call
* Various bug fixes & optimisations
**0.9.0**
* Beta iio API in C & C++ (no SWIG support)
* Added 96Board support
* Added Brillo/Android support
* Java ISR fixes
* FT4222 gpio support
**0.8.1**
* Nodejs 4.1.1 support
* Java examples fixes
* Nodejs SPI tweaks
* Misc fixes
**0.8.0**
* Better java support
* Support for FT4222 subplatforms
* New types.hpp improves C++ & SWIG APIs
* Added support for minnowboard max compatible boards
**0.7.5**
* 5th Generation NUC i2c support
* NPM 0.10.x ia32 fix
**0.7.4**
* Minnowboard i2c fix
* Add NPM arm support
* Uart initialisation improved
* Better i2c bus detection on DE3815 & mmax
**0.7.3**
* DE3815 i2c fix when using different kernels
* Fixed various memory leaks in SWIG wrappers
* gpio enums all prefixed with mraa_
* Fix SPI CS pin caps causing mux_total to be > 0
* Improved error checking/handling
**0.7.2**
* Fix node.js npm builds with binding.gyp that didn't use --target-arch
**0.7.1**
* Uart now uses binary arrays and has optional 'Str' functions in C++/SWIG
* Various Uart module bugfixes
* Node.js 0.12.4 support
* Node.js documentation support
**0.7.0**
* Uart module now contains read/write interactions and configuration
* Python API contains more buffer checks
* Java support
* RPM cpack support
**0.6.2**
* Node.js 0.12 support
* NPM support
* Formatting done with clang-format
* Various examples and documentation updates
* Supported added for Beaglebone Black + Banana Pi
**0.6.1**
* 16bit spi iunctions added
* Node.js ISR now supported
**0.6.0**
* add device path queries for uart
* add platform configuration querying
* gpio sample added
* improve i2c/spi write/read API for python & nodejs
* performance improvements on edison & galileo
**0.5.4**
* pwm read_* fix introduced in 0.5.3
* improved npmpkg support
**0.5.3**
* OE toolchain support added to CMake
* Various UART fixes
* SPI add CS exposure
* Remove functions from mraa.c into modules
* Rework of support for mmap
* Intel Edison MMAP support added. Read and Write
* I2C clean up, add cleaner functions
* MinnowBoard Max support added
* PWM period is written before duty
* Node GYP build supported added
* Add Get Platform Name function
**0.5.2**
* pwm improvement & bugfix
* spi mraa_spi_bit_per_word fix
* new spi transfer function
* i2c object api uses uint8_t
* i2c readReg() calls added
* edison i2c bus now defaults to a sensible value
* edison uart enable support
* edison hardware CS exposed as IO10
* DE3815tykhe NUC support
**0.5.1**
* Intel Edison - Mini breakout board support
* Change to use syslog throughout instead of printing to stderr.
* Fix misc issues brought up throuh coverity scans
* Clear up Analog call documentation
**0.5.0**
* Intel Edison - Arduino board support.
* Boost Allowable i2c busses to 12
* Additional platform hooks added
* ADC is now 10bits by default on all platforms but can be changed
**0.4.5**
* if only one spidev we default to it reguardless of number
* mraa_pwm_config_ms & mraa_pwm_config_percent functions added
* Uart C++ class added, adds python & node support
* galileo gen2 gpio modes supported
**0.4.4**
* prefix SPI mode with MRAA_SPI_
* added C++ adc bitness calls
**0.4.3**
* SPI Mode function now functional, API Change in SPI
* I2C read in swig worked on.
* Galileo Gen 2: PWM setting period sets all channel's period
* Galileo Gen 2: I2C setup now specific to Gen 2.
* General commits around freeing memory at the right times.
**0.4.2**
* Barebone UART module added.
* Hook branch merged.
* I2C init hooks added.
* Intel Galileo Gen 2, I2C gpio pins now go hiz input when I2C initialised.
**0.4.1**
* Rename python & nodejs modules to mraa
* common.hpp introduced for C++
* python & nodejs modules can now take binary strings for Spi & I2c
* improved Aio module and clear bitness
* Improved Galileo Gen 2 support
**0.4.0**
* Rename to mraa
* get_platform_type function added.
**0.3.1**
* Initial Intel Galileo Gen 2 support
* mraa_gpio_isr parameters added.
* Detection of different supported platforms added.
**0.3.0**
* mraa_i2c_read now returns length of read
**0.2.9**
* Add global mraa.h & mraa.hpp headers
* usage of "gpio.h" is not legal you need to use "mraa/gpio.h" unless adding
-L/usr/include/mraa
**0.2.8**
* Added mraa_set_priority call
* Added mmap gpio call mraa_gpio_use_mmaped
**0.2.7**
* C++ API now uses basic types and not unistd types as C
* Clearer and consistent use of unistd tpyes in C api
**0.2.6**
* C++ examples added, using c++ headers/api.
* moved to open instead of fopen in all modules
* rename mraa_check functions and made them internal to mraa only.
* removed "export" functions from api
* Intel Galileo Gen 1 (rev d) fixes, incorrect definition of some items
* SPI, implementation completed.
* I2C internal function, completed.
* PWM fix bug in period set method.
* Swig upstream can be used for building.
* No longer builds docs on default cmake, needs flag
* GPIO/PWM ownership guard prevents closing on existing pins, still can be forced.
**0.2.5**
* C++/Python/Node Enums/const names now do not contain MRAA_GPIO
* Enum type declaration for C++ changed
* Python/Node get_version() -> GetVersion()
* i2c read calls don't use const char* and i2c write calls do
**0.2.4**
* All mraa_ contexts now are pointers to the actual struct which is not
delcared in the header. The only end user change is that instead of
returning a type mraa_gpio_context pointer mraa_gpio_init() now returns a
mraa_gpio_context (which is actually a pointer to struct _gpio internally).
* C++ API is available, use the .hpp headers and add stdc++ to the linker
flags.
* Initial SPI implementation is provided
**0.2.3**
* mraa_aio_read_u16() -> mraa_aio_read()
* mraa_aio_read() now returns a uint16_t instead of an unsigned int
**0.2.2**
* First version with API considered 'stable'

View File

@@ -17,6 +17,8 @@ Intel Arduino board
The Edison used with the Arduino board has the following limitations
in libmraa:
- Do not use the 'reset' button on the arduino shields, there is a hardware
bug and the platform will likely not come back up correctly
- I2C is exposed on i2c-6, therefore you must use bus 6 and not bus 0
- PWM available on default swizzler positions. (3,5,6,9)
- SPI exposed is also used for the ADC. Try not to use your own CS.
@@ -31,6 +33,14 @@ in libmraa:
else. Therefore use `mraa_gpio_init(14)` to use A0 as a GPIO
- Arduino pin 7 can sometimes negatively impact the WiFi capability, if using
WiFi avoid using this pin
- Edison's i2c-1 can be used using for example the sparkfun i2c breakout ontop
of the Arduino breakout board, this is not supported officially so asking for
mraa_i2c_init(1) will result in getting i2c bus 6 (the default one). However
using raw mode (mraa_i2c_init_raw(1)) this bus is fully usable
- If you want to use /dev/ttyMFD2 you have to use the raw uart mode passing a
std::string or char* argument of "/dev/ttyMFD2" to mraa:Uart() or
mraa_uart_init_raw. By default there is a getty running on that interface so
you will need to disable that first
Because of the way IO is setup with the tristate on the Arduino breakout board
IO will be flipped as it is setup. It's recommended to setup IO pins &

37
docs/firmata.md Normal file
View File

@@ -0,0 +1,37 @@
Using Firmata board with mraa {#firmata}
=============================
Mraa can use a Firmata board as a subplatform. This means one can access the
native IO as well as the IO on a firmata compatible board
### Supported Firmata boards ###
- Genuino/Arduino 101 running either CustomFirmata or StandardFirmata
- Other Arduino boards will likely work but are as of yet unsuported
### Using the subplatform API ###
Using the subplatform API is relatively simple, simply add '512', the platform
offset to any IO calls. I2c 0 becomes I2c 512+0 etc... The API works from UPM
or mraa in any of the bindings as long as you compiled mraa with -DFIRMATA=ON.
Currently -DFIRMATA is not compatible with USBPLAT. Multiple subplatforms are
not yet supported
### Sending custom SYSSEX messages ###
You can use the firmata API to send custom SYSEX messages.
### CurieImu Plugin ###
Using Customisable firmata we're able to use the onboard IMU to get data. This
uses the public SYSEX firmata API from mraa and there is a UPM module that
exposes this capability in a simple way. To use it your board needs to use
CustomFirmata with the CurieIMU plugin
### Limitations ###
Only one instance of mraa (one process linking to mraa) can communicate to an
firmata subplatform. This is a limitation due to only having one application
using the Uart at once. In order to get around this a daemon type methodology
has to be used. Technically you can mirror the TTY port from firmata but this
is likely going to cause issues

View File

@@ -5,15 +5,65 @@ The FT4222H is a High/Full Speed USB2.0-to-Quad SPI/I2C device controller. Mraa
supports it as a USB subplatform using the libft4222 library from FTDI which
can be found
[here](http://www.ftdichip.com/Support/SoftwareExamples/libft4222-1.2.1.4.tgz).
You need the latest version for the GPIO to work
You need the latest version for the GPIO to work.
The FT 4222H has 4 configuration modes selected by {DCNF1, DCNF0}. The c hip
configuration mode will determine the number of USB interface s for data stream
s and for GPIOs control. Mraa supports only chip CNFMODE0.
The FT4222H has 4 configuration modes selected by {DCNF1, DCNF0}. The chip
configuration mode will determine the number of USB interfaces for data streams
and for GPIOs control. Mraa supports chip modes CNFMODE0 and CNFMODE3. In
CNFMODE0 the chip can provide either 4 GPIOs and SPI, or 2 GPIOs and I2C
since SCL/SDA are shared with GPIO0/GPIO1. It is possible to change this
selection dynamically by calling the corresponding mraa init functions.
CNFMODE3 on the other hand will only provide SPI or I2C.
Whilst mraa can support custom board in CNFMODE0 (support for other mode is
welcome!) there may be some work to be done. We test using FTDI's UNFT4222EV
reference board. More detail on this board can be found
By default, both modes start with I2C enabled and the driver will scan for
known GPIO expanders on the I2C bus when the FT4222H is initialized.
Supported GPIO expanders:
* PCA9672
* PCA9555
* PCF8575
Output from 'mraa-gpio list' would be as follows:
~~~~~~~~~~~~~
512 IGPIO0/SCL0: GPIO I2C
513 IGPIO1/SDA0: GPIO I2C
514 INT-GPIO2: GPIO
515 INT-GPIO3: GPIO
~~~~~~~~~~~~~
When an I2C GPIO expander is present, the pins on the expander will appear after
the 4 FT4222H GPIO pins (i.e. starting at physical pin #4, logical pin #516).
~~~~~~~~~~~~~
512 IGPIO0/SCL0: GPIO I2C
513 IGPIO1/SDA0: GPIO I2C
514 INT-GPIO2: GPIO
515 INT-GPIO3: GPIO
516 EXP-GPIO0: GPIO
517 EXP-GPIO1: GPIO
518 EXP-GPIO2: GPIO
519 EXP-GPIO3: GPIO
520 EXP-GPIO4: GPIO
521 EXP-GPIO5: GPIO
522 EXP-GPIO6: GPIO
523 EXP-GPIO7: GPIO
~~~~~~~~~~~~~
If a PCA9545 I2C switch is detected an extra four I2C busses will appear,
representing the four downstream busses. Output from 'mraa-i2c list'
would be as follows:
~~~~~~~~~~~~~
Bus 512: id=00 type=ft4222 default
Bus 513: id=01 type=ft4222
Bus 514: id=02 type=ft4222
Bus 515: id=03 type=ft4222
Bus 516: id=04 type=ft4222
~~~~~~~~~~~~~
Please note that some mraa features might not be fully implemented yet and they
are still under development (e.g. SPI replacement functions).
We tested the module using FTDI's UMFT4222EV reference board. More details on
this board can be found
[here](http://www.ftdichip.com/Support/Documents/DataSheets/Modules/DS_UMFT4222EV.pdf).
Interface notes
@@ -22,3 +72,9 @@ Interface notes
You will need to unload all ftdi kernel modules for libft4222 to work
correctly. You will also have to compile mraa with FT4222 support which may not
be enabled by default.
The cmake options to build this driver are:
~~~~~~~~~~~~~
FTDI4222=ON
USBPLAT=ON
~~~~~~~~~~~~~

View File

@@ -8,7 +8,7 @@ The rev D board has the following limitations in libmraa:
- gpio 13 will not switch the LED as it's a different Gpio, use raw gpio '3' to do this
- gpio register access via /dev/uio is limited to pin2 and 3
- gpio interupts will only work on GPIO_EDGE_BOTH
- gpio interrupts will only work on GPIO_EDGE_BOTH
- adc kernel module will return 12bit number. MRAA defaults shift this to 10bits
- AIO pins are treated as 0-5 in mraa_aio_init() but as 14-19 for everything
else. Therefore use mraa_gpio_init(14) to use A0 as a Gpio

View File

@@ -17,6 +17,16 @@ The Gen 2 board has the following limitations in libmraa:
accuracy of 10bits.
- AIO pins are treated as 0-5 in mraa_aio_init() but as 14-19 for everything
else. Therefore use mraa_gpio_init(14) to use A0 as a Gpio
- To explicitly use GPIO 10 for SPI and allow the kernel to handle the chip select, set
`intel_qrk_plat_galileo_gen2.gpio_cs=1` on the kernel line in the boot config on the
galileo, this can be found at `/media/mmcblk0p1/boot/grub/grub.conf`
- if done correctly it should look similiar to this:
<pre>
title Quark X1000 kernel-MassStorage iot-devkit on SD IMR-On IO-APIC/HPET NoEMU debug
root (hd0,0)
kernel /bzImage root=/dev/mmcblk0p2 <b>intel_qrk_plat_galileo_gen2.gpio_cs=1</b> rootwait console=ttyS1,115200n8 earlycon=uart8250,mmio32,0x8010f000,115200n8 reboot=efi,warm apic=debug rw LABEL=boot debugshell=5
</pre>
Uart 1 on gen2
--------------
@@ -26,8 +36,8 @@ possible to use it from A2(Rx)/A3(Tx). However mraa does not support this
directly so you need to enable the muxing manually. Here is an example of how
this is done, this was tested using an FTDI 3.3V TTL cable:
```
$ systemctl stop serial-getty@ttyS1.service
$ python
>>> # Configure the Muxes for Uart1 on Aio2/3
>>> import mraa as m
@@ -53,4 +63,4 @@ $ python
>>> x.writeStr('hello')
>>> x.read(5)
bytearray(b'dsds\n')
```

44
docs/iio.md Normal file
View File

@@ -0,0 +1,44 @@
iio {#iio}
===
IIO is the kernel's framework for supporting sensors.
## Using dummy_iio driver
For platforms without IIO hardware the iio_dummy driver can be used. You can
add the driver by either rebuilding the kernel with IIO component enabled or
just building the IIO modules and load them. You must add the following config
fragment. Known to work for kernel 3.19 and later.
<pre><code>
CONFIG_IIO_DUMMY_EVGEN=m
CONFIG_IIO_SIMPLE_DUMMY=m
CONFIG_IIO_SIMPLE_DUMMY_EVENTS=y
CONFIG_IIO_SIMPLE_DUMMY_BUFFER=y
</code></pre>
### Add driver to kernel
Boot with new kernel, then load modules
<pre><code>
$ modprobe iio_dummy
$ modprobe iio_dummy_evgen
</code></pre>
### Load kernel modules
Depending our your kernel config, some of these modules may already be loaded.
<pre><code>
$ insmod drivers/iio/industrialio.ko
$ insmod drivers/iio/kfifo_buf.ko
$ insmod drivers/staging/iio/iio_dummy_evgen.ko
$ insmod drivers/staging/iio/iio_dummy.ko
</code></pre>
## 'RAW' access
Mraa supports raw access
###Channels
###Attributes
###Events
###Triggers
Activate the trigger in /sys/class/iio
$ echo 1 > trigger0/trigger_now

63
docs/imraa.md Normal file
View File

@@ -0,0 +1,63 @@
# Building mraa with imraa {#buildingimraa}
Imraa allows seamless communication between the Arduino101 and your mraa
projects. Imraa will flash an arduino101 and allow automatic loading of the
MRAA_GENERIC_FIRMATA subplatform to the first process that calls imraa_init
(done through mraa_init automatically)
## Build dependencies
To build imraa, you'll need to build mraa with -DIMRAA=ON and all the normal
dependencies for build mraa, see [Building mraa](./building.md).
You'll also need the following:
* [dfu-utils-cross](https://github.com/arduino/dfu-utils-cross) or dfu 0.8 (0.9
does not work well with the 101). Precompiled binaries can be found on
[here](https://github.com/01org/intel-arduino-tools)
* [json-c](https://github.com/json-c/json-c): likely called libjson-c-dev or
json-c-devel
* libudev: likely called libudev-dev or libudev-devel
## Basic build steps
This will build mraa with imraa for the local default path. To build mraa for
the system add `-DCMAKE_INSTALL_PREFIX=/usr` to the cmake command before
running it.
```bash
mkdir build
cd build
cmake -DIMRAA=ON -DFIRMATA=ON ..
make
```
After you've built mraa you can install using `make install`.
## Running Imraa
Before being able to use mraa to program the Arduino101 you will need to run
imraa to flash the sketch file onto the board. The sketch file that imraa will
look for is located here: [Arduino101 Sketch](http://iotdk.intel.com/misc/ConfigurableFirmataCurieImu.ino.bin).
Once downloaded the file needs to be renamed and moved to the where mraa was
installed. This is dependant on whether you installed locally or for the
system. The example below is for a locally installed copy. Note this sketch is
using ConfigurableFirmata + the [CurieIMU plugin](https://github.com/intel-iot-devkit/FirmataCurieIMU).
```bash
$ mv ConfigurableFirmataCurieImu.ino.bin firmata101.ino.bin
$ mv firmata101.ino.bin /usr/local/share/mraa
```
You will also need to move the imraa config so that imraa can find it.
```bash
$ mv mraa/imraa/imraa.conf /etc/
```
To flash the board run imraa and it will create the lockfile and flash the
Arduino101. You may need root permissions or to add yourself to the uucp or
modem group to access the device node (typically /dev/ttyACM0).
```
$ imraa
```
After this is successful you will be able to use mraa like normal, in the
background mraa will handle talking to the arduino101 by creating
/tmp/imraa.lock which imraa_init() will parse on startup.

View File

@@ -64,3 +64,6 @@ More information on compiling is @ref building page.
Please see the @ref contributing page, the @ref internals page may also be of
use.
## API Changelog
Version @ref changelog here.

View File

@@ -46,6 +46,7 @@ Specific platform information for supported platforms is documented here:
- @ref bananapi
- @ref beaglebone
- @ref nuc5
- @ref up
- @ref ft4222
## DEBUGGING
@@ -66,198 +67,4 @@ use.
## API Changelog
This changelog is meant as a quick & rough guide to what has changed between
versions. The API is now fairly stable but when new calls/features are added
they are listed here. Anything pre 0.2.x is ignored.
**0.8.1**
* Nodejs 4.1.1 support
* Java examples fixes
* Nodejs SPI tweaks
* Misc fixes
**0.8.0**
* Better java support
* Support for FT4222 subplatforms
* New types.hpp improves C++ & SWIG APIs
* Added support for minnowboard max compatible boards
**0.7.5**
* 5th Generation NUC i2c support
* NPM 0.10.x ia32 fix
**0.7.4**
* Minnowboard i2c fix
* Add NPM arm support
* Uart initialisation improved
* Better i2c bus detection on DE3815 & mmax
**0.7.3**
* DE3815 i2c fix when using different kernels
* Fixed various memory leaks in SWIG wrappers
* gpio enums all prefixed with mraa_
* Fix SPI CS pin caps causing mux_total to be > 0
* Improved error checking/handling
**0.7.2**
* Fix node.js npm builds with binding.gyp that didn't use --target-arch
**0.7.1**
* Uart now uses binary arrays and has optional 'Str' functions in C++/SWIG
* Various Uart module bugfixes
* Node.js 0.12.4 support
* Node.js documentation support
**0.7.0**
* Uart module now contains read/write interactions and configuration
* Python API contains more buffer checks
* Java support
* RPM cpack support
**0.6.2**
* Node.js 0.12 support
* NPM support
* Formatting done with clang-format
* Various examples and documentation updates
* Supported added for Beaglebone Black + Banana Pi
**0.6.1**
* 16bit spi iunctions added
* Node.js ISR now supported
**0.6.0**
* add device path queries for uart
* add platform configuration querying
* gpio sample added
* improve i2c/spi write/read API for python & nodejs
* performance improvements on edison & galileo
**0.5.4**
* pwm read_* fix introduced in 0.5.3
* improved npmpkg support
**0.5.3**
* OE toolchain support added to CMake
* Various UART fixes
* SPI add CS exposure
* Remove functions from mraa.c into modules
* Rework of support for mmap
* Intel Edison MMAP support added. Read and Write
* I2C clean up, add cleaner functions
* MinnowBoard Max support added
* PWM period is written before duty
* Node GYP build supported added
* Add Get Platform Name function
**0.5.2**
* pwm improvement & bugfix
* spi mraa_spi_bit_per_word fix
* new spi transfer function
* i2c object api uses uint8_t
* i2c readReg() calls added
* edison i2c bus now defaults to a sensible value
* edison uart enable support
* edison hardware CS exposed as IO10
* DE3815tykhe NUC support
**0.5.1**
* Intel Edison - Mini breakout board support
* Change to use syslog throughout instead of printing to stderr.
* Fix misc issues brought up throuh coverity scans
* Clear up Analog call documentation
**0.5.0**
* Intel Edison - Arduino board support.
* Boost Allowable i2c busses to 12
* Additional platform hooks added
* ADC is now 10bits by default on all platforms but can be changed
**0.4.5**
* if only one spidev we default to it reguardless of number
* mraa_pwm_config_ms & mraa_pwm_config_percent functions added
* Uart C++ class added, adds python & node support
* galileo gen2 gpio modes supported
**0.4.4**
* prefix SPI mode with MRAA_SPI_
* added C++ adc bitness calls
**0.4.3**
* SPI Mode function now functional, API Change in SPI
* I2C read in swig worked on.
* Galileo Gen 2: PWM setting period sets all channel's period
* Galileo Gen 2: I2C setup now specific to Gen 2.
* General commits around freeing memory at the right times.
**0.4.2**
* Barebone UART module added.
* Hook branch merged.
* I2C init hooks added.
* Intel Galileo Gen 2, I2C gpio pins now go hiz input when I2C initialised.
**0.4.1**
* Rename python & nodejs modules to mraa
* common.hpp introduced for C++
* python & nodejs modules can now take binary strings for Spi & I2c
* improved Aio module and clear bitness
* Improved Galileo Gen 2 support
**0.4.0**
* Rename to mraa
* get_platform_type function added.
**0.3.1**
* Initial Intel Galileo Gen 2 support
* mraa_gpio_isr parameters added.
* Detection of different supported platforms added.
**0.3.0**
* mraa_i2c_read now returns length of read
**0.2.9**
* Add global mraa.h & mraa.hpp headers
* usage of "gpio.h" is not legal you need to use "mraa/gpio.h" unless adding
-L/usr/include/mraa
**0.2.8**
* Added mraa_set_priority call
* Added mmap gpio call mraa_gpio_use_mmaped
**0.2.7**
* C++ API now uses basic types and not unistd types as C
* Clearer and consistent use of unistd tpyes in C api
**0.2.6**
* C++ examples added, using c++ headers/api.
* moved to open instead of fopen in all modules
* rename mraa_check functions and made them internal to mraa only.
* removed "export" functions from api
* Intel Galileo Gen 1 (rev d) fixes, incorrect definition of some items
* SPI, implementation completed.
* I2C internal function, completed.
* PWM fix bug in period set method.
* Swig upstream can be used for building.
* No longer builds docs on default cmake, needs flag
* GPIO/PWM ownership guard prevents closing on existing pins, still can be forced.
**0.2.5**
* C++/Python/Node Enums/const names now do not contain MRAA_GPIO
* Enum type declaration for C++ changed
* Python/Node get_version() -> GetVersion()
* i2c read calls don't use const char* and i2c write calls do
**0.2.4**
* All mraa_ contexts now are pointers to the actual struct which is not
delcared in the header. The only end user change is that instead of
returning a type mraa_gpio_context pointer mraa_gpio_init() now returns a
mraa_gpio_context (which is actually a pointer to struct _gpio internally).
* C++ API is available, use the .hpp headers and add stdc++ to the linker
flags.
* Initial SPI implementation is provided
**0.2.3**
* mraa_aio_read_u16() -> mraa_aio_read()
* mraa_aio_read() now returns a uint16_t instead of an unsigned int
**0.2.2**
* First version with API considered 'stable'
Version @ref changelog here.

84
docs/up.md Normal file
View File

@@ -0,0 +1,84 @@
UP Board {#up}
============
UP Board is based on the Intel(R) Atom(TM) x5-Z83xx SoC (formerly Cherry Trail).
It includes 2GB RAM, 16/32GB eMMC flash, 6 USB2.0 ports, 1 USB 3.0 OTG port,
1 Gigabit Ethernet, HDMI and DSI Graphics ports, RTC and a 40-pin I/O header.
The form-factor for the board is based on the Raspberry Pi 2, and can be used
with many of the add-on HAT boards designed for the Raspberry Pi 2.
Interface notes
---------------
**PWM** PWM frequency range is from 293 Hz to 6.4 MHz. 8-bit resolution is
supported for duty-cycle adjustments, but this reduces for frequencies > 97.6kHz
**I2C** 2 I2C channels support standard-mode (100kHz) and fast-mode (400kHz).
Bus frequency can be selected in BIOS settings. Note that, unlike Raspberry Pi,
the I2C controller issues Repeated-START commands for combined transactions
(e.g. a write-then-read transaction) which may not be supported by some I2C
slave devices. For such devices, it is advisable to use separate write and
read transactions to ensure that Repeated-STARTs are not issued.
**SPI** Bus frequencies up to 25MHz are supported, in steps which are less
granular at higher speeds. E.g. Available speeds include:
25MHz, 12.5MHz, 8.33MHz, 6.25MHz, 5MHz, 4.167MHz, 3.571MHz, 3.125MHz, etc.
Please be aware that speeds in between those steps will be rounded UP to the
next nearest available speed, and capped at 25MHz.
At the time of writing, only a single native chip-select is available (SPI CS0).
**UART** 2 high-speed UARTs are available, supporting baud rates up to
support baud rates between 300 and 3686400. Hardware flow-control signals are
not exposed, so software flow-control may be needed for rates above 115200.
A console UART is also available but is not fully supported at this time.
Pin Mapping
-----------
The GPIO numbering in the following pin mapping is based on the Raspberry Pi
model 2 and B+ numbering scheme.
Note that there is an enum to use wiringPi style numbers.
| MRAA Number | Physical Pin | Function | Sysfs GPIO | Notes |
|-------------|--------------|----------|------------|----------------------|
| 1 | P1-01 | 3V3 VCC | | |
| 2 | P1-02 | 5V VCC | | |
| 3 | P1-03 | I2C SDA1 | 2 | I2C1 (/dev/i2c-1) |
| 4 | P1-04 | 5V VCC | | |
| 5 | P1-05 | I2C SCL1 | 3 | I2C1 (/dev/i2c-1) |
| 6 | P1-06 | GND | | |
| 7 | P1-07 | GPIO(4) | 4 | |
| 8 | P1-08 | UART TX1 | 14 | UART1 (/dev/ttyS1) |
| 9 | P1-09 | GND | | |
| 10 | P1-10 | UART RX1 | 15 | UART1 (/dev/ttyS1) |
| 11 | P1-11 | GPIO(17) | 17 | |
| 12 | P1-12 | I2S CLK | 18 | I2S0 (PCM Audio) |
| 13 | P1-13 | UART RX2 | 27 | UART2 (/dev/ttyS2) |
| 14 | P1-14 | GND | | |
| 15 | P1-15 | GPIO(22) | 22 | |
| 16 | P1-16 | GPIO(23) | 23 | |
| 17 | P1-17 | 3V3 VCC | | |
| 18 | P1-18 | GPIO(24) | 24 | |
| 19 | P1-19 | SPI MOSI | 10 | SPI2 (/dev/spidev2.x)|
| 20 | P1-20 | GND | | |
| 21 | P1-21 | SPI MISO | 9 | SPI2 (/dev/spidev2.x)|
| 22 | P1-22 | UART TX2 | 25 | UART2 (/dev/ttyS2) |
| 23 | P1-23 | SPI SCL | 11 | SPI2 (/dev/spidev2.x)|
| 24 | P1-24 | SPI CS0 | 8 | SPI2 (/dev/spidev2.0)|
| 25 | P1-25 | GND | | |
| 26 | P1-26 | SPI CS1 | 7 | SPI2 (/dev/spidev2.1)|
| 27 | P1-27 | I2C SDA0 | 0 | I2C0 (/dev/i2c-0) |
| 28 | P1-28 | I2C SCL0 | 1 | I2C0 (/dev/i2c-0) |
| 29 | P1-29 | GPIO(5) | 5 | |
| 30 | P1-30 | GND | | |
| 31 | P1-31 | GPIO(6) | 6 | |
| 32 | P1-32 | PWM0 | 12 | PWM Chip 0 Channel 0 |
| 33 | P1-33 | PWM1 | 13 | PWM Chip 1 Channel 0 |
| 34 | P1-34 | GND | | |
| 35 | P1-35 | I2S FRM | 19 | I2S0 (PCM Audio) |
| 36 | P1-36 | GPIO(16) | 16 | |
| 37 | P1-37 | GPIO(26) | 26 | |
| 38 | P1-38 | I2S DIN | 20 | I2S0 (PCM Audio) |
| 39 | P1-39 | GND | | |
| 40 | P1-40 | I2S DOUT | 21 | I2S0 (PCM Audio) |

View File

@@ -12,6 +12,7 @@ add_executable (uart uart.c)
add_executable (mraa-gpio mraa-gpio.c)
add_executable (mraa-i2c mraa-i2c.c)
add_executable (spi_max7219 spi_max7219.c)
add_executable (iio_driver iio_driver.c)
include_directories(${PROJECT_SOURCE_DIR}/api)
# FIXME Hack to access mraa internal types used by mraa-i2c
@@ -32,11 +33,29 @@ target_link_libraries (uart mraa)
target_link_libraries (mraa-gpio mraa)
target_link_libraries (mraa-i2c mraa)
target_link_libraries (spi_max7219 mraa)
target_link_libraries (iio_driver mraa)
if (ONEWIRE)
add_executable (uart_ow uart_ow.c)
target_link_libraries (uart_ow mraa)
endif ()
if (FIRMATA)
add_executable (firmata_curie_imu firmata_curie_imu.c)
add_executable (i2c_firmata i2c_firmata.c)
target_link_libraries (firmata_curie_imu mraa)
target_link_libraries (i2c_firmata mraa)
endif ()
add_subdirectory (c++)
install (DIRECTORY ${PROJECT_SOURCE_DIR}/examples/ DESTINATION ${CMAKE_INSTALL_DATADIR}/mraa/examples)
if (INSTALLGPIOTOOL)
if (INSTALLGPIOTOOL AND NOT INSTALLTOOLS)
install (TARGETS mraa-gpio DESTINATION bin)
endif()
if (INSTALLTOOLS)
install (TARGETS mraa-gpio DESTINATION bin)
install (TARGETS mraa-i2c DESTINATION bin)
endif()

View File

@@ -33,7 +33,7 @@ main(int argc, char** argv)
{
mraa_platform_t platform = mraa_get_platform_type();
mraa_gpio_context gpio, gpio_in = NULL;
char* board_name = mraa_get_platform_name();
const char* board_name = mraa_get_platform_name();
int ledstate = 0;
switch (platform) {

View File

@@ -26,7 +26,6 @@
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
#include <unistd.h>
#include "mraa.hpp"

View File

@@ -1,3 +1,5 @@
enable_language(CXX)
add_executable (AioA0 AioA0.cpp)
add_executable (blink-io-cpp Blink-IO.cpp)
add_executable (Pwm3-cycle Pwm3-cycle.cpp)
@@ -5,6 +7,7 @@ add_executable (I2c-compass I2c-compass.cpp)
add_executable (Spi-pot Spi-pot.cpp)
add_executable (Uart Uart-example.cpp)
add_executable (Isr-pin6 Isr-pin6.cpp)
add_executable (Iio-dummy Iio-dummy.cpp)
include_directories(${PROJECT_SOURCE_DIR}/api)
@@ -15,3 +18,9 @@ target_link_libraries (I2c-compass mraa stdc++ m)
target_link_libraries (Spi-pot mraa stdc++)
target_link_libraries (Uart mraa stdc++)
target_link_libraries (Isr-pin6 mraa stdc++)
target_link_libraries (Iio-dummy mraa stdc++)
if (ONEWIRE)
add_executable (UartOW UartOW.cpp)
target_link_libraries (UartOW mraa stdc++)
endif ()

157
examples/c++/Iio-dummy.cpp Normal file
View File

@@ -0,0 +1,157 @@
/*
* Author: Henry Bruce
* Copyright (c) 2015 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.
*/
#include <unistd.h>
#include <iostream>
#include <math.h>
#include <float.h>
#include "mraa/iio.hpp"
#define EXPECT_FAILURE 0
#define EXPECT_SUCCESS 1
#define IIO_TRY(func) \
{ \
bool success = true; \
try { \
iio_device->func; \
} catch (std::exception& e) { \
success = false; \
} \
log_result(#func, "", true, success); \
}
// Macro to run IIO method on attribute and log output
#define IIO_RUN(func, attr, value, expect) \
{ \
std::string attr_name = attr; \
bool success = true; \
try { \
iio_device->func(attr_name, value); \
} catch (std::exception& e) { \
success = false; \
} \
log_result(#func, attr_name, expect, success); \
}
// Macro to run IIO method on attribute and check for expected result and log output
#define IIO_TEST(func, attr, value, expect) \
{ \
std::string attr_name = attr; \
bool success = false; \
try { \
success = fabs(iio_device->func(attr_name) - value) < FLT_EPSILON; \
} catch (std::exception& e) { \
success = false; \
} \
log_result(#func, attr_name, expect, success); \
}
mraa::Iio* iio_device;
int eventCount = 0;
// Log result of test. Note a "fail" (i.e. success is false) will be displayed as a pass if a fail was expected
void log_result(std::string test_name, std::string attr_name, bool expect_success, bool success)
{
std::string result;
if (expect_success)
result = success ? "PASS" : "FAIL";
else
result = success ? "FAIL" : "PASS";
if (attr_name.empty())
fprintf(stdout, "%s: %s\n", test_name.c_str(), result.c_str());
else
fprintf(stdout, "%s(%s): %s\n", test_name.c_str(), attr_name.c_str(), result.c_str());
}
// Generate iio_dummy driver event by writing a string to a specific sysfs node
bool generate_event()
{
FILE *fp = fopen("/sys/bus/iio/devices/iio_evgen/poke_ev0", "w");
if (fp == NULL)
return false;
fprintf(fp, "1\n");
fclose(fp);
return true;
}
// IIO event handler that checks for event from dummy_iio_evgen driver
class IioTestHandler : public mraa::IioHandler
{
protected:
void onIioEvent(const mraa::IioEventData& eventData) {
if (eventData.channelType == IIO_VOLTAGE && eventData.direction == IIO_EV_DIR_RISING && eventData.type == IIO_EV_TYPE_THRESH)
eventCount++;
}
};
int
main()
{
IioTestHandler testHandler;
std::string deviceName;
try {
mraa::Iio* iio_device0 = new mraa::Iio(0);
std::cout << "IIO device 0 found by id." << std::endl;
deviceName = iio_device0->getDeviceName();
delete iio_device0;
} catch (std::exception& e) {
std::cerr << "IIO device 0 not found." << std::endl;
return EXIT_FAILURE;
}
try {
mraa::Iio* iio_device1 = new mraa::Iio(1);
delete iio_device1;
} catch (std::exception& e) {
std::cerr << "IIO device 1 not found. This is expected behavior." << std::endl;
}
try {
iio_device = new mraa::Iio(deviceName);
std::cout << "IIO device 0 found by name." << std::endl;
} catch (std::exception& e) {
std::cerr << "IIO device 0 not found." << std::endl;
return EXIT_FAILURE;
}
std::cout << "Using IIO device0. Name is " << iio_device->getDeviceName() << std::endl;
IIO_RUN(writeFloat, "in_accel_x_raw", 100, EXPECT_FAILURE);
IIO_RUN(writeFloat, "in_voltage0_scale", 100, EXPECT_FAILURE);
IIO_RUN(writeInt, "out_voltage0_raw", 100, EXPECT_SUCCESS);
IIO_TEST(readInt, "in_accel_x_raw", 34, EXPECT_SUCCESS);
IIO_TEST(readFloat, "in_voltage0_scale", 0.001333, EXPECT_SUCCESS);
IIO_RUN(writeInt, "events/in_voltage0_thresh_rising_en", 1, EXPECT_SUCCESS);
IIO_TRY(registerEventHandler(&testHandler));
eventCount = 0;
generate_event();
usleep(500000);
log_result("eventReceived", "", (eventCount == 1), true);
delete iio_device;
return EXIT_SUCCESS;
}

82
examples/c++/UartOW.cpp Normal file
View File

@@ -0,0 +1,82 @@
/*
* Author: Jon Trulson <jtrulson@ics.com>
* Copyright (c) 2016 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.
*/
#include "stdio.h"
#include "iostream"
//! [Interesting]
#include "uart_ow.hpp"
using namespace std;
int
main(int argc, char** argv)
{
mraa::UartOW* uart = new mraa::UartOW(0);
// Reset the ow bus and see if anything is present
mraa::Result rv;
if ((rv = uart->reset()) == mraa::SUCCESS) {
cout << "Reset succeeded, device(s) detected!" << endl;
} else {
cout << "Reset failed, returned " << int(rv) << ". No devices on bus?" << endl;
return 1;
}
cout << "Looking for devices..." << endl;
;
uint8_t count = 0;
// start the search from scratch
string id = uart->search(true);
if (id.empty()) {
cout << "No devices detected." << endl;
return 1;
}
while (!id.empty()) {
// hack so we don't need to cast each element of the romcode
// for printf purposes
uint8_t* ptr = (uint8_t*) id.c_str();
// The first byte (0) is the device type (family) code.
// The last byte (7) is the rom code CRC value. The
// intervening bytes are the unique 48 bit device ID.
printf("Device %02d Type 0x%02x ID %02x%02x%02x%02x%02x%02x CRC 0x%02x\n", count, ptr[0],
ptr[6], ptr[5], ptr[4], ptr[3], ptr[2], ptr[1], ptr[7]);
count++;
// continue the search with start argument set to false
id = uart->search(false);
}
cout << "Exiting..." << endl;
delete uart;
return 0;
}
//! [Interesting]

View File

@@ -0,0 +1,92 @@
/*
* Author: Brendan Le Foll
* Copyright (c) 2016 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.
*/
#include <unistd.h>
#include "mraa.h"
#include "mraa/firmata.h"
#define FIRMATA_START_SYSEX 0xF0
#define FIRMATA_END_SYSEX 0xF7
#define FIRMATA_CURIE_IMU 0x11
#define FIRMATA_CURIE_IMU_READ_ACCEL 0x00
void
interrupt(uint8_t* buf, int length)
{
printf("reg read returned: %d, with buffer size %d\n", ((buf[6] & 0x7f) | ((buf[7] & 0x7f) << 7)), length);
}
int
main()
{
mraa_init();
//! [Interesting]
/**
* This example reads from the FirmataCurieIMU plugin
*/
mraa_add_subplatform(MRAA_GENERIC_FIRMATA, "/dev/ttyACM0");
mraa_firmata_context firm = mraa_firmata_init(FIRMATA_CURIE_IMU);
if (firm == NULL) {
return EXIT_FAILURE;
}
mraa_firmata_response(firm, interrupt);
uint8_t* buffer = calloc(4, 0);
if (buffer == NULL) {
free(firm);
return EXIT_FAILURE;
}
buffer[0] = FIRMATA_START_SYSEX;
buffer[1] = FIRMATA_CURIE_IMU;
buffer[2] = FIRMATA_CURIE_IMU_READ_ACCEL;
buffer[3] = FIRMATA_END_SYSEX;
mraa_firmata_write_sysex(firm, buffer, 4);
sleep(1);
// stop the isr and set it again
mraa_firmata_response_stop(firm);
mraa_firmata_response(firm, interrupt);
mraa_firmata_write_sysex(firm, buffer, 4);
sleep(1);
// close everything and try again
mraa_firmata_close(firm);
firm = mraa_firmata_init(FIRMATA_CURIE_IMU);
mraa_firmata_response(firm, interrupt);
mraa_firmata_write_sysex(firm, buffer, 4);
sleep(10);
mraa_firmata_close(firm);
//! [Interesting]
return EXIT_SUCCESS;
}

View File

@@ -31,9 +31,7 @@
int
main(int argc, char** argv)
{
char* board_name = mraa_get_platform_name();
int i2c_bus, i, i2c_adapter;
const char* board_name = mraa_get_platform_name();
fprintf(stdout, "hello mraa\n Version: %s\n Running on %s\n", mraa_get_version(), board_name);
mraa_deinit();

64
examples/i2c_firmata.c Normal file
View File

@@ -0,0 +1,64 @@
/*
* Author: Brendan Le Foll <brendan.le.foll@intel.com>
* Copyright (c) 2016 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.
*/
#include "mraa.h"
int
main(int argc, char** argv)
{
mraa_init();
mraa_add_subplatform(MRAA_GENERIC_FIRMATA, "/dev/ttyACM0");
mraa_i2c_context i2c;
i2c = mraa_i2c_init(0 + 512);
#if 0
mraa_i2c_address(i2c, 0x62);
#if 1
uint8_t rx_tx_buf[2];
rx_tx_buf[0] = 0x0;
rx_tx_buf[1] = 0x0;
mraa_i2c_write(i2c, rx_tx_buf, 2);
#endif
//mraa_i2c_write_byte_data(i2c, 0x0, 0x0);
mraa_i2c_write_byte_data(i2c, 0x0, 0x1);
mraa_i2c_write_byte_data(i2c, 0xFF, 0x08);
mraa_i2c_write_byte_data(i2c, 0x00, 0x04);
mraa_i2c_write_byte_data(i2c, 0xA0, 0x02);
#else
mraa_i2c_address(i2c, 0x77);
int res = mraa_i2c_read_byte_data(i2c, 0xd0);
printf("res is 0x%x\n", res);
uint8_t data[2];
mraa_i2c_write_byte(i2c, 0x77);
mraa_i2c_read(i2c, data, 1);
res = mraa_i2c_read_word_data(i2c, 0xAA); // BMP085_CAL_AC1
printf("res is %d\n", res);
#endif
sleep(10);
}

145
examples/iio_driver.c Normal file
View File

@@ -0,0 +1,145 @@
/*
* Author: Brendan Le Foll
* Copyright (c) 2015 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.
*/
#include <unistd.h>
#include "mraa/iio.h"
static void
printword(uint16_t input, mraa_iio_channel* chan)
{
int16_t res;
if (!chan->lendian) {
input = be16toh(input);
} else {
input = le16toh(input);
}
input >>= chan->shift;
input &= chan->mask;
if (chan->signedd) {
res = (int16_t)(input << (16 - chan->bits_used)) >> (16 - chan->bits_used);
} else {
res = input;
}
printf(" value = %05f\n", (float) res);
}
mraa_iio_context iio_device0;
mraa_iio_context iio_device6;
void
interrupt(char* data)
{
mraa_iio_channel* channels = mraa_iio_get_channels(iio_device0);
int i = 0;
for (i; i < mraa_iio_get_channel_count(iio_device0); i++) {
if (channels[i].enabled) {
printf("channel %d - bytes %d\n", channels[i].index, channels[i].bytes);
switch (channels[i].bytes) {
case 2:
printword(*(uint16_t*) (data + channels[i].location), &channels[i]);
}
}
}
}
void
event_interrupt(struct iio_event_data* data)
{
int chan_type;
int modifier;
int type;
int direction;
int channel;
int channel2;
int different;
mraa_iio_event_extract_event(data, &chan_type, &modifier, &type, &direction, &channel, &channel2, &different);
printf("event time %lld id %lld extracted chan_type %d modifier %d type %d direction %d "
"channel %d channel2 %d different %d\n",
data->timestamp, data->id, chan_type, modifier, type, direction, channel, channel2, different);
}
int
main()
{
//! [Interesting]
iio_device0 = mraa_iio_init(0);
if (iio_device0 == NULL) {
return EXIT_FAILURE;
}
float iio_float;
int iio_int;
mraa_result_t ret;
ret = mraa_iio_write_float(iio_device0, "in_accel_scale", 0.019163);
if (ret == MRAA_SUCCESS) {
fprintf(stdout, "IIO write success\n");
}
ret = mraa_iio_read_float(iio_device0, "in_accel_scale", &iio_float);
if (ret == MRAA_SUCCESS) {
fprintf(stdout, "IIO read %f\n", iio_float);
}
ret = mraa_iio_write_int(iio_device0, "scan_elements/in_accel_x_en", 1);
if (ret == MRAA_SUCCESS) {
fprintf(stdout, "IIO write success\n");
}
ret = mraa_iio_read_int(iio_device0, "scan_elements/in_accel_x_en", &iio_int);
if (ret == MRAA_SUCCESS) {
fprintf(stdout, "IIO read %d\n", iio_int);
}
if (mraa_iio_trigger_buffer(iio_device0, interrupt, NULL) == MRAA_SUCCESS) {
sleep(100);
return EXIT_SUCCESS;
}
/*
struct iio_event_data event;
iio_device6 = mraa_iio_init(6);
if (iio_device6 == NULL) {
return EXIT_FAILURE;
}
mraa_iio_write_int(iio_device6, "events/in_proximity2_thresh_either_en", 1);
// Blocking until event fired
if (mraa_iio_event_poll(iio_device6, &event) == MRAA_SUCCESS) {
event_interrupt(&event); //just to show data
}
if (mraa_iio_event_setup_callback(iio_device6, event_interrupt, NULL) == MRAA_SUCCESS) {
sleep(100);
return EXIT_SUCCESS;
}*/
//! [Interesting]
return EXIT_FAILURE;
}

View File

@@ -50,7 +50,7 @@ public class BlinkIO {
if (argv.length == 0) {
System.out.println("Provide an int arg if you want to flash on something other than " + DEFAULT_IOPIN);
} else {
iopin = Integer.valueOf(argv[0], DEFAULT_IOPIN);
iopin = Integer.valueOf(argv[0]);
}
//! [Interesting]

View File

@@ -0,0 +1,62 @@
/*
* Author: Petre Eftime <petre.p.eftime@intel.com>
* Copyright (c) 2016 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.
*/
import mraa.*;
public class FTDITest {
public static void main(String[] args) throws InterruptedException {
String board = mraa.getPlatformName();
String version = mraa.getVersion();
System.out.println(String.format("Version: %s", version));
System.out.println(String.format("Running on %s", board));
if (mraa.hasSubPlatform()) {
System.out.println("Subplatform detected");
/* Print when button is pressed */
Gpio button = new Gpio(515);
button.dir(Dir.DIR_IN);
button.isr(Edge.EDGE_FALLING, new Runnable() {
@Override
public void run() {
System.out.println("Button pressed");
}
});
/* Blink FTDI board LED */
Gpio led = new Gpio(514);
led.dir(Dir.DIR_OUT);
for (int i = 0;; i = (i + 1) % 2) {
led.write(i);
Thread.sleep(500);
}
} else {
System.out.println("Subplatform not detected");
}
}
}

View File

@@ -22,10 +22,12 @@
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import mraa.Dir;
import mraa.Edge;
import mraa.Gpio;
import mraa.IsrCallback;
public class Isr {
static {
@@ -38,19 +40,46 @@ public class Isr {
System.exit(1);
}
}
public static void main(String argv[]) throws InterruptedException {
Gpio gpio = new Gpio(6);
IsrCallback callback = new JavaCallback();
int pin = 6;
if (argv.length == 1) {
try {
pin = Integer.parseInt(argv[0]);
} catch (Exception e) {
}
}
BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
Gpio gpio = null;
try {
gpio = new Gpio(pin);
} catch (Exception e) {
System.out.println(e.getMessage());
return;
}
System.out.println("Starting ISR for pin " + Integer.toString(pin) + ". Press ENTER to stop");
Runnable callback = new JavaCallback(gpio);
gpio.isr(Edge.EDGE_RISING, callback);
while (true)
Thread.sleep(999999);
};
try {
String input = console.readLine();
} catch (IOException e) {
}
gpio.isrExit();
}
}
class JavaCallback extends IsrCallback {
public JavaCallback() { super(); }
class JavaCallback implements Runnable {
private Gpio gpio;
public void run() { System.out.println("JavaCallback.run()"); }
public JavaCallback(Gpio gpio) {
this.gpio = gpio;
}
@Override
public void run() {
String pin = Integer.toString(gpio.getPin(true));
String level = Integer.toString(gpio.read());
System.out.println("Pin " + pin + " = " + level);
}
}

View File

@@ -29,11 +29,12 @@ var myLed = new m.Gpio(13); //LED hooked up to digital pin 13 (or built in pin o
myLed.dir(m.DIR_OUT); //set the gpio direction to output
var ledState = true; //Boolean to hold the state of Led
periodicActivity(); //call the periodicActivity function
function periodicActivity()
{
myLed.write(ledState?1:0); //if ledState is true then write a '1' (high) otherwise write a '0' (low)
ledState = !ledState; //invert the ledState
setTimeout(periodicActivity,1000); //call the indicated function after 1 second (1000 milliseconds)
}
periodicActivity(); //call the periodicActivity function

View File

@@ -26,30 +26,27 @@
var m = require('mraa'); //require mraa
// helper function to go from hex val to dec
function char(x) { return parseInt(x, 16); }
x = new m.I2c(0)
x.address(0x77)
// initialise device
if (x.readReg(char('0xd0')) != char('0x55')) {
if (x.readReg(0xd0) != 0x55) {
console.log("error");
}
// we want to read temperature so write 0x2e into control reg
x.writeReg(char('0xf4'), char('0x2e'))
x.writeReg(0xf4, 0x2e)
// read a 16bit reg, obviously it's uncalibrated so mostly a useless value :)
console.log(x.readWordReg(char('0xf6')))
console.log(x.readWordReg(0xf6))
// and we can do the same thing with the read()/write() calls if we wished
// thought I'd really not recommend it!
buf = new Buffer(2)
buf[0] = char('0xf4')
buf[1] = char('0x2e')
buf[0] = 0xf4
buf[1] = 0x2e
console.log(buf.toString('hex'))
x.write(buf)
x.writeByte(char('0xf6'))
x.writeByte(0xf6)
d = x.read(2)

View File

@@ -0,0 +1,29 @@
/*
* Author: Ron Evans (@deadprogram)
* Copyright (c) 2016 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.
*/
var mraa = require('mraa');
console.log('MRAA Version: ' + mraa.getVersion());
// open connection to firmata
mraa.addSubplatform(mraa.GENERIC_FIRMATA, "/dev/ttyACM0");

View File

@@ -0,0 +1,107 @@
/*
* Author: Henry Bruce <henry.bruce@intel.com>
* Copyright (c) 2016 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.
*/
var mraa = require('mraa');
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
function printUsage() {
console.log("version Print version");
console.log("get pin Get pin level");
console.log("set pin level Set pin level");
console.log("monitor pin Monitor pin level changes");
}
function getVersion() {
console.log('MRAA Version: ' + mraa.getVersion());
}
function setPin() {
var pinNumber = arguments[0];
var pinValue = arguments[1];
var pin = new mraa.Gpio(pinNumber);
pin.dir(mraa.DIR_OUT);
pin.write(pinNumber, pinValue);
}
function getPin() {
var pinNumber = arguments[0];
var pin = new mraa.Gpio(pinNumber);
pin.dir(mraa.DIR_IN);
console.log('Gpio ' + pinNumber + ' = ' + pin.read());
}
function onPinLevelChange() {
console.log('gpio level change');
}
function monitorPin() {
var pinNumber = arguments[0];
try {
var pin = new mraa.Gpio(pinNumber);
pin.dir(mraa.DIR_IN);
pin.isr(mraa.EDGE_BOTH, onPinLevelChange);
rl.question('Press ENTER to stop', function(answer) {
rl.close();
pin.isrExit();
});
} catch (err) {
console.log(err.message);
}
}
const args = process.argv;
const argc = args.length;
if (argc >= 3) {
const cmd = args[2];
switch (args[2]) {
case "version":
getVersion();
break;
case "get":
var pinNumber = parseInt(args[3]);
getPin(pinNumber);
break;
case "set":
var pinNumber = parseInt(args[3]);
var pinValue = parseInt(args[4]);
getPin(pinNumber, pinValue);
break;
case "monitor":
var pinNumber = parseInt(args[3]);
monitorPin(pinNumber);
break;
default:
console.log("Invalid command " + args[2]);
break;
}
} else {
console.log("Command not specified");
printUsage();
}

View File

@@ -8,3 +8,9 @@ function h() {
x = new m.Gpio(14)
x.isr(m.EDGE_BOTH, h)
setInterval(function() {
// It's important to refer to our GPIO context here,
// otherwise it will be garbage-collected
console.log("Waiting for an interrupt at GPIO pin " + x.getPin() + "...")
}, 10000)

View File

@@ -24,14 +24,11 @@
var m = require('mraa'); //require mraa
// helper function to go from hex val to dec
function char(x) { return parseInt(x, 16); }
x = new m.I2c(0)
x.address(0x62)
x.writeReg(0, 0)
x.writeReg(1, 0)
x.writeReg(char('0x08'), char('0xAA'))
x.writeReg(char('0x04'), 255)
x.writeReg(char('0x02'), 255)
x.writeReg(0x08, 0xAA)
x.writeReg(0x04, 255)
x.writeReg(0x02, 255)

View File

@@ -26,15 +26,12 @@
var m = require('mraa'); //require mraa
// helper function to go from hex val to dec
function char(x) { return parseInt(x, 16); }
x = new m.Spi(0)
buf = new Buffer(4)
buf[0] = char('0xf4')
buf[1] = char('0x2e')
buf[2] = char('0x3e')
buf[3] = char('0x4e')
buf[0] = 0xf4
buf[1] = 0x2e
buf[2] = 0x3e
buf[3] = 0x4e
buf2 = x.write(buf)
console.log("Sent: " + buf.toString('hex') + ". Received: " + buf2.toString('hex'))

View File

@@ -97,9 +97,9 @@ list_pins()
if (pin_count == 0) {
fprintf(stdout, "No Pins\n");
}
return pin_count;
}
mraa_result_t
gpio_set(int pin, int level, mraa_boolean_t raw)
{

View File

@@ -73,6 +73,7 @@ print_bus(mraa_board_t* board)
case MRAA_RASPBERRY_PI:
case MRAA_BEAGLEBONE:
case MRAA_BANANA:
case MRAA_UP:
bus = i;
busType = "linux";
break;
@@ -84,7 +85,7 @@ print_bus(mraa_board_t* board)
busType = "unknown";
break;
}
int id = board->i2c_bus[bus].bus_id;
int id = board->i2c_bus[i].bus_id;
fprintf(stdout, "Bus %3d: id=%02d type=%s ", bus, id, busType);
if (i == board->def_i2c_bus)
fprintf(stdout, " default");
@@ -176,6 +177,7 @@ i2c_detect_devices(int bus)
int
process_command(int argc, char** argv)
{
int status = 0;
if (strcmp(argv[1], "help") == 0) {
print_help();
return 0;
@@ -194,24 +196,33 @@ process_command(int argc, char** argv)
print_command_error();
return 1;
}
} else if ((strcmp(argv[1], "get") == 0)) {
} else if ((strcmp(argv[1], "get") == 0) || (strcmp(argv[1], "getrpt") == 0)) {
if (argc == 5) {
int interation = 0;
mraa_boolean_t should_repeat = strcmp(argv[1], "getrpt") == 0;
int bus = strtol(argv[2], NULL, 0);
uint8_t device_address = strtol(argv[3], NULL, 0);
uint8_t register_address = strtol(argv[4], NULL, 0);
// fprintf(stdout, "Device %02X, Register = %02X\n", device_address, register_address);
uint8_t data;
if (i2c_get(bus, device_address, register_address, &data) == MRAA_SUCCESS) {
fprintf(stdout, "Register %#02X = %#02X\n", register_address, data);
return 0;
} else {
fprintf(stdout, "i2c get failed\n");
return 1;
}
do {
if (i2c_get(bus, device_address, register_address, &data) == MRAA_SUCCESS) {
if (should_repeat)
fprintf(stdout, "%4d: ", interation);
fprintf(stdout, "Register %#02X = %#02X\n", register_address, data);
status = 0;
} else {
fprintf(stdout, "i2c get failed\n");
status = 1;
}
interation++;
usleep(10000);
} while (should_repeat && status == 0);
} else {
print_command_error();
return 1;
status = 1;
}
return status;
} else if ((strcmp(argv[1], "set") == 0)) {
if (argc == 6) {
int bus = strtol(argv[2], NULL, 0);

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python
# Author: Brendan Le Foll <brendan.le.foll@intel.com>
# Copyright (c) 2015 Intel Corporation.
# Author: Ron Evans (@deadprogram)
# Copyright (c) 2016 Intel Corporation.
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
@@ -20,9 +20,10 @@
# 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
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
import mraa
u = mraa.Uart(0)
print u.getDevicePath()
print (mraa.getVersion())
mraa.addSubplatform(mraa.GENERIC_FIRMATA, "/dev/ttyACM0");

View File

@@ -24,20 +24,31 @@
import mraa
import time
import sys
class Counter:
count = 0
c = Counter()
# inside a python interupt you cannot use 'basic' types so you'll need to use
# inside a python interrupt you cannot use 'basic' types so you'll need to use
# objects
def test(args):
print("wooo")
def test(gpio):
print("pin " + repr(gpio.getPin(True)) + " = " + repr(gpio.read()))
c.count+=1
x = mraa.Gpio(6)
x.dir(mraa.DIR_IN)
x.isr(mraa.EDGE_BOTH, test, test)
time.sleep(500)
pin = 6;
if (len(sys.argv) == 2):
try:
pin = int(sys.argv[1], 10)
except ValueError:
printf("Invalid pin " + sys.argv[1])
try:
x = mraa.Gpio(pin)
print("Starting ISR for pin " + repr(pin))
x.dir(mraa.DIR_IN)
x.isr(mraa.EDGE_BOTH, test, x)
var = raw_input("Press ENTER to stop")
x.isrExit()
except ValueError as e:
print(e)

View File

@@ -0,0 +1,44 @@
#!/usr/bin/env python
# Author: Alex Tereschenko <alext.mkrs@gmail.com>
# Copyright (c) 2015 Alex Tereschenko
#
# 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
import mraa
# Initialize UART
u=mraa.Uart(0)
# Set UART parameters
u.setBaudRate(115200)
u.setMode(8, mraa.UART_PARITY_NONE, 1)
u.setFlowcontrol(False, False)
# Start a neverending loop waiting for data to arrive.
# Press Ctrl+C to get out of it.
while True:
if u.dataAvailable():
# We are doing 1-byte reads here
data_byte = u.readStr(1)
print(data_byte)
# Just a two-way half-duplex communication example, "X" is a flag
if data_byte == "X":
u.writeStr("Yes, master!")

View File

@@ -0,0 +1,57 @@
#!/usr/bin/env python
# Author: Alex Tereschenko <alext.mkrs@gmail.com>
# Copyright (c) 2015 Alex Tereschenko
#
# 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
import mraa
import sys
sys.stdout.write("Initializing UART...")
u=mraa.Uart(0)
print("...done")
print("Setting UART parameters: baudrate 115200, 8N1, no flow control")
u.setBaudRate(115200)
u.setMode(8, mraa.UART_PARITY_NONE, 1)
u.setFlowcontrol(False, False)
msg_b = bytearray("Hello, mraa byte array!", "ascii")
print("Sending message as a byte array: '{0}'".format(msg_b))
u.write(msg_b)
# Make sure the message gets out to the line.
# It's generally unnecessary (and performance-degrading) to do this explicitly,
# UART driver normally takes care of that, but it may be useful with specific
# half-duplex endpoints, like Dynamixel servos.
u.flush()
msg_s = "Hello, mraa string!"
print("Sending message as a string: '{0}'".format(msg_s))
u.writeStr(msg_s)
sys.stdout.write("Two-way, half-duplex communication, sending a flag...")
u.writeStr("X")
print("...sent, awaiting response...")
# Checking for data in the RX buffer, giving it a 100ms timeout
if u.dataAvailable(100):
print("We've got a response: '{0}', says the other side".format(u.readStr(20)))
else:
print("No data received, do you have anything at the other end?")

92
examples/uart_ow.c Normal file
View File

@@ -0,0 +1,92 @@
/*
* Author: Jon Trulson <jtrulson@ics.com>
* Copyright (c) 2016 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.
*/
#include "stdio.h"
//! [Interesting]
#include "mraa.h"
int
main(int argc, char** argv)
{
mraa_uart_ow_context uart;
uart = mraa_uart_ow_init(0);
if (!uart) {
printf("mraa_uart_ow_init() failed\n");
return 1;
}
// Reset the ow bus and see if anything is present
mraa_result_t rv;
if ((rv = mraa_uart_ow_reset(uart)) == MRAA_SUCCESS) {
printf("Reset succeeded, device(s) detected!\n");
} else {
printf("Reset failed, returned %d. No devices on bus?\n", rv);
return 1;
}
printf("Looking for devices...\n");
uint8_t id[MRAA_UART_OW_ROMCODE_SIZE];
/* we are essentially doing a binary tree search through the 64
* bit address space. id is modified during this search, and will
* be set to the valid rom code for each device found.
*/
uint8_t count = 0;
// start the search from scratch
mraa_result_t result = mraa_uart_ow_rom_search(uart, 1, id);
if (result == MRAA_ERROR_UART_OW_NO_DEVICES) {
printf("No devices detected.\n");
return 1;
}
if (result == MRAA_ERROR_UART_OW_DATA_ERROR) {
printf("Bus/Data error.\n");
return 1;
}
while (result == MRAA_SUCCESS) {
/* The first byte (id[0]]) is the device type (family) code.
* The last byte (id[7]) is the rom code CRC value. The
* intervening bytes (id[1]-id[6]) are the unique 48 bit
* device ID.
*/
printf("Device %02d Type 0x%02x ID %02x%02x%02x%02x%02x%02x CRC 0x%02x\n", count, id[0],
id[6], id[5], id[4], id[3], id[2], id[1], id[7]);
count++;
// continue the search with start argument set to 0
result = mraa_uart_ow_rom_search(uart, 0, id);
}
printf("Exiting...\n");
mraa_uart_ow_stop(uart);
return 0;
}
//! [Interesting]

17
imraa/CMakeLists.txt Normal file
View File

@@ -0,0 +1,17 @@
add_executable (imraa imraa.c)
include_directories (${PROJECT_SOURCE_DIR}/api)
include_directories (${PROJECT_SOURCE_DIR}/include)
include_directories (${PROJECT_SOURCE_DIR}/api/mraa)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DIMRAA=1")
find_package (JSON-C REQUIRED)
include_directories (${JSON-C_INCLUDE_DIR})
find_package (UDEV REQUIRED)
include_directories (${UDEV_INCLUDE_DIR})
target_link_libraries (imraa mraa ${JSON-C_LIBRARIES} ${UDEV_LIBRARIES})
set_property (TARGET imraa PROPERTY C_STANDARD 99)
install (TARGETS imraa DESTINATION bin)

527
imraa/imraa.c Normal file
View File

@@ -0,0 +1,527 @@
/*
* Author: Brendan Le Foll <brendan.le.foll@intel.com>
* Author: Longwei Su <lsu@ics.com>
* Copyright (c) 2015 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.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdint.h>
#include <stdbool.h>
#include <unistd.h>
#include <json-c/json.h>
#include <libudev.h>
#include <mraa/uart.h>
#include <mraa/gpio.h>
#include <mraa/i2c.h>
#include <mraa/pwm.h>
#include <mraa_internal.h>
#define IMRAA_CONF_FILE "/etc/imraa.conf"
typedef struct mraa_io_objects_t {
const char* type;
int index;
bool raw;
const char* label;
} mraa_io_objects_t;
const char*
imraa_list_serialport()
{
struct udev* udev;
struct udev_enumerate* enumerate;
struct udev_list_entry *devices, *dev_list_entry;
struct udev_device* dev;
const char* ret = NULL;
udev = udev_new();
if (!udev) {
printf("Can't create udev, check libudev\n");
exit(1);
}
enumerate = udev_enumerate_new(udev);
udev_enumerate_add_match_subsystem(enumerate, "tty");
udev_enumerate_add_match_property(enumerate, "ID_VENDOR_ID", "8087");
udev_enumerate_add_match_property(enumerate, "ID_MODEL_ID", "0ab6");
// udev_enumerate_add_match_property(enumerate, "ID_SERIAL",
// "Intel_ARDUINO_101_AE6642SQ55000RS");
udev_enumerate_scan_devices(enumerate);
devices = udev_enumerate_get_list_entry(enumerate);
udev_list_entry_foreach(dev_list_entry, devices)
{
const char* path;
path = udev_list_entry_get_name(dev_list_entry);
dev = udev_device_new_from_syspath(udev, path);
ret = udev_device_get_devnode(dev);
}
udev_enumerate_unref(enumerate);
udev_unref(udev);
if (ret) {
printf("Ardunio 101 Device Node Path: %s\n", ret);
} else {
printf("Can't detect any Ardunio 101 Device on tty\n");
}
return ret;
}
mraa_result_t
imraa_reset_arduino(const char* modem)
{
mraa_uart_context uart;
uart = mraa_uart_init_raw(modem);
mraa_uart_set_baudrate(uart, 1200);
if (uart == NULL) {
fprintf(stderr, "UART failed to setup\n");
return MRAA_ERROR_UNSPECIFIED;
}
mraa_uart_stop(uart);
mraa_deinit();
return MRAA_SUCCESS;
}
int
imraa_flash_101(const char* bin_path, const char* bin_file_name, const char* tty)
{
if (imraa_reset_arduino(tty) != MRAA_SUCCESS) {
fprintf(stderr, "Failed to reset arduino on %s for unknown reason, carrying on...\n", tty);
}
char* ln = NULL;
size_t len = 0;
bool board_found = false;
const char* dfu_list = "/dfu-util -d ,8087:0ABA -l";
size_t bin_path_len = strlen(bin_path);
char* full_dfu_list = (char*) calloc((bin_path_len + strlen(dfu_list) + 1), sizeof(char));
if (!full_dfu_list) {
printf("imraa_flash_101 can't allocate string buffer for dfu list\n");
exit(1);
}
strncat(full_dfu_list, bin_path, strlen(bin_path));
strncat(full_dfu_list, dfu_list, strlen(dfu_list));
int i;
// dfu list is still needed, as the time for reset and recognized is varies from platform to
// platform.
// once dfu able to query available devices, then it is ready to flash
for (i = 0; i < 10 && board_found == false; i++) {
printf("Waiting for device...\n");
// dfu-util -d,8087:0ABA -l
FILE* dfu_result = popen(full_dfu_list, "r");
if (dfu_result == NULL) {
printf("Failed to run command\n");
exit(1);
}
if (i == 4) {
printf("Flashing is taking longer than expected\n");
printf("Try pressing MASTER_RESET button\n");
}
while (getline(&ln, &len, dfu_result) != -1) {
if (strstr(ln, "sensor_core")) {
board_found = true;
printf("Device found!\n");
break;
}
}
sleep(1);
if (pclose(dfu_result) != 0) {
printf("Failed to close command\n");
exit(1);
}
}
free(ln);
if (board_found == false) {
printf("ERROR: Device is not responding.\n");
exit(1);
}
const char* dfu_upload = "/dfu-util -d ,8087:0ABA -D ";
const char* dfu_option = " -v -a 7 -R";
int buffersize = bin_path_len + strlen(dfu_upload) + strlen(bin_file_name) + strlen(dfu_option) + 1;
char* full_dfu_upload = calloc(buffersize, sizeof(char));
if (!full_dfu_upload) {
printf("imraa_flash_101 can't allocate string buffer for dfu flash\n");
exit(1);
}
strncat(full_dfu_upload, bin_path, strlen(bin_path));
strncat(full_dfu_upload, dfu_upload, strlen(dfu_upload));
strncat(full_dfu_upload, bin_file_name, strlen(bin_file_name));
strncat(full_dfu_upload, dfu_option, strlen(dfu_option));
printf("flash cmd: %s\n", full_dfu_upload);
int status = system(full_dfu_upload);
if (status != 0) {
printf("ERROR: Upload failed on %s\n", tty);
exit(1);
}
printf("SUCCESS: Sketch will execute in about 5 seconds.\n");
free(full_dfu_list);
free(full_dfu_upload);
sleep(5);
return 0;
}
void
imraa_write_lockfile(const char* lock_file_location, const char* serialport)
{
FILE* fh;
char str[10];
json_object* platform1 = json_object_new_object();
snprintf(str, 10, "%d", MRAA_NULL_PLATFORM);
json_object_object_add(platform1, "id", json_object_new_string(str));
json_object* platform2 = json_object_new_object();
snprintf(str, 10, "%d", MRAA_GENERIC_FIRMATA);
json_object_object_add(platform2, "id", json_object_new_string(str));
json_object_object_add(platform2, "uart", json_object_new_string(serialport));
json_object* platfroms = json_object_new_array();
json_object_array_add(platfroms, platform1);
json_object_array_add(platfroms, platform2);
json_object* lock_file = json_object_new_object();
json_object_object_add(lock_file, "Platform", platfroms);
fh = fopen(lock_file_location, "w");
if (fh != NULL) {
fputs(json_object_to_json_string_ext(lock_file, JSON_C_TO_STRING_PRETTY), fh);
fclose(fh);
} else {
fprintf(stderr, "can't write to lock file\n");
}
json_object_put(lock_file);
}
void
imraa_handle_subplatform(struct json_object* jobj, bool force_update)
{
struct json_object* platform;
int i, ionum;
const char* dfu_loc = NULL;
const char* lockfile_loc = NULL;
const char* flash_loc = NULL;
const char* usbserial = NULL;
struct json_object* dfu_location;
if (json_object_object_get_ex(jobj, "dfu-utils-location", &dfu_location) == true) {
if (json_object_is_type(dfu_location, json_type_string)) {
printf("dfu location: %s\n", json_object_get_string(dfu_location));
dfu_loc = json_object_get_string(dfu_location);
} else {
fprintf(stderr, "dfu location string incorrectly parsed\n");
}
}
struct json_object* lockfile_location;
if (json_object_object_get_ex(jobj, "lockfile-location", &lockfile_location) == true) {
if (json_object_is_type(lockfile_location, json_type_string)) {
printf("lock file location: %s\n", json_object_get_string(lockfile_location));
lockfile_loc = json_object_get_string(lockfile_location);
} else {
fprintf(stderr, "lock file string incorrectly parsed\n");
}
}
if (json_object_object_get_ex(jobj, "Platform", &platform) == true) {
if (json_object_is_type(platform, json_type_array)) {
ionum = json_object_array_length(platform);
for (i = 0; i < ionum; i++) {
struct json_object* ioobj = json_object_array_get_idx(platform, i);
json_object_object_foreach(ioobj, key, val)
{
if (strcmp(key, "flash") == 0) {
flash_loc = json_object_get_string(val);
}
if (strcmp(key, "usbserial") == 0) {
usbserial = json_object_get_string(val);
}
}
}
} else {
fprintf(stderr, "platform string incorrectly parsed\n");
}
}
if (flash_loc == NULL || usbserial == NULL ) {
printf("conf didn't give image location or usb serial, skip flashing\n");
return;
}
if (!dfu_loc) {
dfu_loc = "/usr/bin";
printf("No dfu path found, using default path /usr/bin instead");
}
if (!lockfile_loc) {
lockfile_loc = "/tmp/imraa.lock";
printf("No lock path found, using default lock file /tmp/imraa.lock instead");
}
// got flash? do flash
if (access(lockfile_loc, F_OK) != -1 && force_update == false) {
printf("already exist a lock file, skip flashing\n");
printf("force upgrade? remove the lockfile or run with force\n", lockfile_loc);
return;
} else {
fprintf(stdout, "Starting to flash board\n");
if (force_update) {
fprintf(stdout, "**Caution: force update mode**\n");
}
// TODO flash img checksum, and serialport validation?
const char* detected_serialport = imraa_list_serialport();
if (detected_serialport == NULL) {
printf("No subplatform detected, check USB connection, skip flashing\n");
return;
}
if (strcmp(usbserial, "auto") != 0 && strcmp(usbserial, detected_serialport) != 0) {
printf("given serial port didn't match detected serial port, skip flashing\n");
return;
}
if (imraa_flash_101(dfu_loc, flash_loc, detected_serialport) == 0) {
imraa_write_lockfile(lockfile_loc, detected_serialport);
} else {
fprintf(stderr, "invalid flashing paramenters, please check agian\n");
fprintf(stderr, "DFU Util location: %s\n", dfu_loc);
fprintf(stderr, "Flash Img location: %s\n", dfu_loc);
fprintf(stderr, "USB Serial: %s\n", usbserial);
fprintf(stderr, "Flash failed, push master reset and try again\n");
}
}
}
void
imraa_handle_IO(struct json_object* jobj)
{
struct mraa_io_objects_t* mraa_io_obj;
struct json_object* ioarray;
int ionum = 0;
int i;
if (json_object_object_get_ex(jobj, "IO", &ioarray) == true) {
ionum = json_object_array_length(ioarray);
printf("Length of IO array is %d\n", ionum);
mraa_io_obj = (mraa_io_objects_t*) malloc(ionum * sizeof(mraa_io_objects_t));
if (!mraa_io_obj) {
printf("imraa_handle_IO malloc failed\n");
exit(1);
}
int index2 = -1;
; // optional index for io configuration;
if (json_object_is_type(ioarray, json_type_array)) {
for (i = 0; i < ionum; i++) {
struct json_object* ioobj = json_object_array_get_idx(ioarray, i);
struct json_object* x;
if (json_object_object_get_ex(ioobj, "type", &x) == true) {
mraa_io_obj[i].type = json_object_get_string(x);
}
if (json_object_object_get_ex(ioobj, "index", &x) == true) {
mraa_io_obj[i].index = json_object_get_int(x);
}
if (json_object_object_get_ex(ioobj, "raw", &x) == true) {
mraa_io_obj[i].raw = json_object_get_boolean(x);
}
if (json_object_object_get_ex(ioobj, "label", &x) == true) {
mraa_io_obj[i].label = json_object_get_string(x);
}
if (json_object_object_get_ex(ioobj, "index2", &x) == true) {
index2 = json_object_get_int(x);
}
// starting io configuration
if (strcmp(mraa_io_obj[i].type, "gpio") == 0) {
mraa_gpio_context gpio = NULL;
if (mraa_io_obj[i].raw) {
gpio = mraa_gpio_init_raw(mraa_io_obj[i].index);
} else {
gpio = mraa_gpio_init(mraa_io_obj[i].index);
}
if (gpio != NULL) {
mraa_result_t r = mraa_gpio_owner(gpio, 0);
if (r != MRAA_SUCCESS) {
mraa_result_print(r);
}
mraa_gpio_close(gpio);
}
} else if (strcmp(mraa_io_obj[i].type, "i2c") == 0) {
mraa_i2c_context i2c = NULL;
if (mraa_io_obj[i].raw) {
i2c = mraa_i2c_init_raw(mraa_io_obj[i].index);
} else {
i2c = mraa_i2c_init(mraa_io_obj[i].index);
}
if (i2c != NULL) {
mraa_i2c_stop(i2c);
}
} else if (strcmp(mraa_io_obj[i].type, "pwm") == 0) {
mraa_pwm_context pwm = NULL;
if (mraa_io_obj[i].raw) {
pwm = mraa_pwm_init_raw(index2, mraa_io_obj[i].index);
} else {
pwm = mraa_pwm_init(mraa_io_obj[i].index);
}
if (pwm != NULL) {
mraa_result_t r = mraa_pwm_owner(pwm, 0);
if (r != MRAA_SUCCESS) {
mraa_result_print(r);
}
mraa_pwm_close(pwm);
}
} else if (strcmp(mraa_io_obj[i].type, "spi") == 0) {
mraa_spi_context spi = NULL;
if (mraa_io_obj[i].raw) {
spi = mraa_spi_init_raw(mraa_io_obj[i].index, index2);
} else {
spi = mraa_spi_init(mraa_io_obj[i].index);
}
if (spi != NULL) {
mraa_spi_stop(spi);
}
} else if (strcmp(mraa_io_obj[i].type, "uart") == 0) {
mraa_uart_context uart = NULL;
if (mraa_io_obj[i].raw) {
uart = mraa_uart_init_raw(mraa_io_obj[i].label);
} else {
uart = mraa_uart_init(mraa_io_obj[i].index);
}
if (uart != NULL) {
mraa_uart_stop(uart);
}
}
}
} else {
fprintf(stderr, "IO array incorrectly parsed\n");
}
free(mraa_io_obj);
}
}
int
check_version(struct json_object* jobj)
{
struct json_object* imraa_version;
if (json_object_object_get_ex(jobj, "version", &imraa_version) == true) {
if (json_object_is_type(imraa_version, json_type_string)) {
printf("imraa version is %s good\n", json_object_get_string(imraa_version));
// TODO check version?
} else {
fprintf(stderr, "version string incorrectly parsed\n");
return -1;
}
} else {
fprintf(stderr, "no version specified\n");
}
return 0;
}
void
print_version()
{
fprintf(stdout, "Version %s on %s\n", mraa_get_version(), mraa_get_platform_name());
}
void
print_help()
{
fprintf(stdout, "version Get mraa version and board name\n");
fprintf(stdout, "force Force update subplatform\n");
fprintf(stdout, "conf_path Force update with override configuration\n");
}
void
print_command_error()
{
fprintf(stdout, "Invalid command, options are:\n");
print_help();
exit(EXIT_FAILURE);
}
int
main(int argc, char** argv)
{
char* buffer = NULL;
char* imraa_conf_file = IMRAA_CONF_FILE;
long fsize;
bool force_update = false;
int i = 0;
uint32_t ionum = 0;
if (argc > 2) {
print_command_error();
}
if (argc > 1) {
if (strcmp(argv[1], "help") == 0) {
print_help();
return EXIT_SUCCESS;
} else if (strcmp(argv[1], "version") == 0) {
print_version();
return EXIT_SUCCESS;
} else if (strcmp(argv[1], "force") == 0) {
force_update = true;
} else {
imraa_conf_file = argv[1];
force_update = true;
}
}
FILE* fh = fopen(imraa_conf_file, "r");
if (fh == NULL) {
fprintf(stderr, "Failed to open configuration file\n");
return EXIT_FAILURE;
}
fseek(fh, 0, SEEK_END);
fsize = ftell(fh) + 1;
fseek(fh, 0, SEEK_SET);
buffer = calloc(fsize, sizeof(char));
if (buffer != NULL) {
int result = fread(buffer, sizeof(char), fsize, fh);
if (result != fsize) {
printf("imraa conf reading error");
}
} else {
printf("imraa read_conf buffer can't allocated\n");
exit(1);
}
imraa_init();
json_object* jobj = json_tokener_parse(buffer);
if (check_version(jobj) != 0) {
printf("version of configuration file is not compatible, please check again\n");
} else {
mraa_platform_t type = mraa_get_platform_type();
imraa_handle_subplatform(jobj, force_update);
if (type == MRAA_NULL_PLATFORM || type == MRAA_UNKNOWN_PLATFORM) {
printf("imraa: Failed to do IO pinmuxing on null/unkown platform\n");
} else {
imraa_handle_IO(jobj);
}
}
fclose(fh);
json_object_put(jobj);
free(buffer);
return EXIT_SUCCESS;
}

12
imraa/imraa.conf Normal file
View File

@@ -0,0 +1,12 @@
{
"version": "0.9.6",
"lockfile-location": "/tmp/imraa.lock",
"dfu-utils-location": "/usr/bin",
"Platform" :[
{"id":"1280", "flash":"/usr/share/mraa/firmata101.ino.bin", "usbserial": "auto"}
],
"IO": [
{"type":"gpio", "index":0, "raw": false, "label": "none"},
{"type":"i2c", "index":0, "raw": false, "label": "i2c-0"}
]
}

9
imraa/imraa.service Normal file
View File

@@ -0,0 +1,9 @@
[Unit]
Description=imraa
[Service]
Type=oneshot
ExecStart=/usr/bin/imraa
[Install]
WantedBy = multi-user.target

46
include/arm/96boards.h Normal file
View File

@@ -0,0 +1,46 @@
/*
* Author: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
* Copyright (c) 2015 Linaro Limited.
* Copyright (c) 2014 Intel Corporation.
*
* Copied from include/arm/banana.h
*
* 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
#ifdef __cplusplus
extern "C" {
#endif
#include "mraa_internal.h"
#define MRAA_96BOARDS_LS_GPIO_COUNT 12
#define MRAA_96BOARDS_LS_I2C_COUNT 2
#define MRAA_96BOARDS_LS_SPI_COUNT 1
#define MRAA_96BOARDS_LS_UART_COUNT 2
#define MRAA_96BOARDS_LS_PIN_COUNT 40
mraa_board_t* mraa_96boards();
#ifdef __cplusplus
}
#endif

114
include/firmata/firmata.h Normal file
View File

@@ -0,0 +1,114 @@
/*
* Copyright (c) 2016 Intel Corporation
* Copyright (c) 2015 Jules Dourlens (jdourlens@gmail.com)
*
* 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 "uart.h"
#define MODE_INPUT 0x00
#define MODE_OUTPUT 0x01
#define MODE_ANALOG 0x02
#define MODE_PWM 0x03
#define MODE_SERVO 0x04
#define MODE_SHIFT 0x05
#define MODE_I2C 0x06
#define LOW 0
#define HIGH 1
#define FIRMATA_START_SYSEX 0xF0 // start a MIDI Sysex message
#define FIRMATA_END_SYSEX 0xF7 // end a MIDI Sysex message
#define FIRMATA_PIN_MODE_QUERY 0x72 // ask for current and supported pin modes
#define FIRMATA_PIN_MODE_RESPONSE 0x73 // reply with current and supported pin modes
#define FIRMATA_PIN_STATE_QUERY 0x6D
#define FIRMATA_PIN_STATE_RESPONSE 0x6E
#define FIRMATA_CAPABILITY_QUERY 0x6B
#define FIRMATA_CAPABILITY_RESPONSE 0x6C
#define FIRMATA_ANALOG_MAPPING_QUERY 0x69
#define FIRMATA_ANALOG_MAPPING_RESPONSE 0x6A
#define FIRMATA_DIGITAL_MESSAGE 0x90 // send data for a digital pin
#define FIRMATA_ANALOG_MESSAGE 0xE0 // send data for an analog pin (or PWM)
#define FIRMATA_ANALOG_MESSAGE 0xE0 // send data for an analog pin (or PWM)
#define FIRMATA_REPORT_ANALOG 0xC0 // enable analog input by pin #
#define FIRMATA_REPORT_DIGITAL 0xD0 // enable digital input by port pair
#define FIRMATA_I2C_CONFIG 0x78
#define FIRMATA_I2C_REPLY 0x77
#define FIRMATA_I2C_REQUEST 0x76
#define I2C_MODE_WRITE 0x00
#define I2C_MODE_READ 0x01
#define I2C_CONTINUOUSREAD 0x02
#define I2C_STOP_READING 0x03
#define FIRMATA_SET_PIN_MODE 0xF4 // set a pin to INPUT/OUTPUT/PWM/etc
#define FIRMATA_REPORT_VERSION 0xF9 // report protocol version
#define FIRMATA_SYSTEM_RESET 0xFF // reset from MIDI
#define FIRMATA_START_SYSEX 0xF0 // start a MIDI Sysex message
#define FIRMATA_END_SYSEX 0xF7 // end a MIDI Sysex message
// extended command set using sysex (0-127/0x00-0x7F)
/* 0x00-0x0F reserved for custom commands */
#define FIRMATA_SERVO_CONFIG 0x70 // set max angle, minPulse, maxPulse, freq
#define FIRMATA_STRING 0x71 // a string message with 14-bits per char
#define FIRMATA_REPORT_FIRMWARE 0x79 // report name and version of the firmware
#define FIRMATA_SYSEX_NON_REALTIME 0x7E // MIDI Reserved for non-realtime messages
#define FIRMATA_SYSEX_REALTIME 0x7F // MIDI Reserved for realtime messages
#define FIRMATA_MSG_LEN 1024
typedef struct s_pin {
uint8_t mode;
uint8_t analog_channel;
uint64_t supported_modes;
uint32_t value;
} t_pin;
typedef struct s_firmata {
mraa_uart_context uart;
t_pin pins[128];
int i2cmsg[256][256];
int parse_command_len;
int parse_count;
uint8_t parse_buff[FIRMATA_MSG_LEN];
int isReady;
char firmware[140];
uint8_t dev_count;
struct _firmata** devs;
} t_firmata;
t_firmata* firmata_new(const char* name);
void firmata_initPins(t_firmata* firmata);
int firmata_askFirmware(t_firmata* firmata);
int firmata_pinMode(t_firmata* firmata, int pin, int mode);
int firmata_digitalWrite(t_firmata* firmata, int pin, int value);
int firmata_analogWrite(t_firmata* firmata, int pin, int value);
int firmata_analogRead(t_firmata* firmata, int pin);
int firmata_pull(t_firmata* firmata);
void firmata_parse(t_firmata* firmata, const uint8_t* buf, int len);
void firmata_endParse(t_firmata* firmata);
void firmata_close(t_firmata* firmata);

View File

@@ -0,0 +1,38 @@
/*
* Author: Brendan Le Foll <brendan.le.foll@intel.com>
* Copyright (c) 2016 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
#ifdef __cplusplus
extern "C" {
#endif
#include "mraa_internal.h"
mraa_platform_t mraa_firmata_platform(mraa_board_t* board, const char* uart_dev);
#ifdef __cplusplus
}
#endif

46
include/java/mraajni.h Normal file
View File

@@ -0,0 +1,46 @@
/*
* Author: Henry Bruce <henry.bruce@intel.com>
* Copyright (c) 2014-2016 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
#ifdef __cplusplus
extern "C" {
#endif
#include <jni.h>
#include "mraa/types.h"
// location for defining JNI version to use
#define JNI_REQUIRED_VERSION JNI_VERSION_1_6
void mraa_java_set_jvm(JavaVM* vm);
void mraa_java_isr_callback(void* args);
mraa_result_t mraa_java_attach_thread();
void mraa_java_detach_thread();
void* mraa_java_create_global_ref(void* args);
void mraa_java_delete_global_ref(void* ref);
#ifdef __cplusplus
}
#endif

View File

@@ -32,16 +32,17 @@
#define IS_FUNC_DEFINED(dev, func) (dev != NULL && dev->advance_func != NULL && dev->advance_func->func != NULL)
typedef struct {
mraa_result_t (*gpio_init_internal_replace) (int pin);
mraa_result_t (*gpio_init_internal_replace) (mraa_gpio_context dev, int pin);
mraa_result_t (*gpio_init_pre) (int pin);
mraa_result_t (*gpio_init_post) (mraa_gpio_context dev);
mraa_result_t (*gpio_close_pre) (mraa_gpio_context dev);
mraa_result_t (*gpio_close_replace) (mraa_gpio_context dev);
mraa_result_t (*gpio_mode_replace) (mraa_gpio_context dev, mraa_gpio_mode_t mode);
mraa_result_t (*gpio_mode_pre) (mraa_gpio_context dev, mraa_gpio_mode_t mode);
mraa_result_t (*gpio_mode_post) (mraa_gpio_context dev, mraa_gpio_mode_t mode);
mraa_result_t (*gpio_edge_mode_replace) (mraa_gpio_context dev, mraa_gpio_edge_t mode);
mraa_result_t (*gpio_dir_replace) (mraa_gpio_context dev, mraa_gpio_dir_t dir);
@@ -53,7 +54,8 @@ typedef struct {
mraa_result_t (*gpio_write_pre) (mraa_gpio_context dev, int value);
mraa_result_t (*gpio_write_post) (mraa_gpio_context dev, int value);
mraa_result_t (*gpio_mmap_setup) (mraa_gpio_context dev, mraa_boolean_t en);
void* (*gpio_interrupt_handler_replace) (mraa_gpio_context dev);
mraa_result_t (*gpio_interrupt_handler_init_replace) (mraa_gpio_context dev);
mraa_result_t (*gpio_wait_interrupt_replace) (mraa_gpio_context dev);
mraa_result_t (*i2c_init_pre) (unsigned int bus);
mraa_result_t (*i2c_init_bus_replace) (mraa_i2c_context dev);
@@ -62,9 +64,9 @@ typedef struct {
mraa_result_t (*i2c_set_frequency_replace) (mraa_i2c_context dev, mraa_i2c_mode_t mode);
mraa_result_t (*i2c_address_replace) (mraa_i2c_context dev, uint8_t addr);
int (*i2c_read_replace) (mraa_i2c_context dev, uint8_t* data, int length);
uint8_t (*i2c_read_byte_replace) (mraa_i2c_context dev);
uint8_t (*i2c_read_byte_data_replace) (mraa_i2c_context dev, const uint8_t command);
uint16_t (*i2c_read_word_data_replace) (mraa_i2c_context dev, const uint8_t command);
int (*i2c_read_byte_replace) (mraa_i2c_context dev);
int (*i2c_read_byte_data_replace) (mraa_i2c_context dev, const uint8_t command);
int (*i2c_read_word_data_replace) (mraa_i2c_context dev, const uint8_t command);
int (*i2c_read_bytes_data_replace) (mraa_i2c_context dev, uint8_t command, uint8_t* data, int length);
mraa_result_t (*i2c_write_replace) (mraa_i2c_context dev, const uint8_t* data, int length);
mraa_result_t (*i2c_write_byte_replace) (mraa_i2c_context dev, uint8_t data);
@@ -72,14 +74,20 @@ typedef struct {
mraa_result_t (*i2c_write_word_data_replace) (mraa_i2c_context dev, const uint16_t data, const uint8_t command);
mraa_result_t (*i2c_stop_replace) (mraa_i2c_context dev);
mraa_result_t (*aio_init_internal_replace) (mraa_aio_context dev, int pin);
int (*aio_read_replace) (mraa_aio_context dev);
mraa_result_t (*aio_get_valid_fp) (mraa_aio_context dev);
mraa_result_t (*aio_init_pre) (unsigned int aio);
mraa_result_t (*aio_init_post) (mraa_aio_context dev);
mraa_pwm_context (*pwm_init_replace) (int pin);
mraa_pwm_context (*pwm_init_internal_replace) (void* func_table, int pin);
mraa_result_t (*pwm_init_pre) (int pin);
mraa_result_t (*pwm_init_post) (mraa_pwm_context pwm);
mraa_result_t (*pwm_period_replace) (mraa_pwm_context dev, int period);
float (*pwm_read_replace) (mraa_pwm_context dev);
mraa_result_t (*pwm_write_replace) (mraa_pwm_context dev, float duty);
mraa_result_t (*pwm_enable_replace) (mraa_pwm_context dev, int enable);
mraa_result_t (*spi_init_pre) (int bus);
mraa_result_t (*spi_init_post) (mraa_spi_context spi);

View File

@@ -1,51 +0,0 @@
/*
* Author: Henry Bruce <henry.bruce@intel.com>
* Copyright (c) 2015 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 "common.h"
#include "mraa.h"
#include "types.h"
typedef struct {
mraa_i2c_context (*i2c_init_raw) (unsigned int bus);
mraa_result_t (*i2c_frequency) (mraa_i2c_context dev, mraa_i2c_mode_t mode);
mraa_result_t (*i2c_address) (mraa_i2c_context dev, uint8_t addr);
int (*i2c_read) (mraa_i2c_context dev, uint8_t* data, int length);
uint8_t (*i2c_read_byte) (mraa_i2c_context dev);
uint8_t (*i2c_read_byte_data) (mraa_i2c_context dev, const uint8_t command);
uint16_t (*i2c_read_word_data) (mraa_i2c_context dev, const uint8_t command);
int (*i2c_read_bytes_data) (mraa_i2c_context dev, uint8_t command, uint8_t* data, int length);
mraa_result_t (*i2c_write) (mraa_i2c_context dev, const uint8_t* data, int length);
mraa_result_t (*i2c_write_byte) (mraa_i2c_context dev, const uint8_t data);
mraa_result_t (*i2c_write_byte_data) (mraa_i2c_context dev, const uint8_t data, const uint8_t command);
mraa_result_t (*i2c_write_word_data) (mraa_i2c_context dev, const uint16_t data, const uint8_t command);
mraa_result_t (*i2c_stop) (mraa_i2c_context dev);
} mraa_i2c_func_t;
typedef struct {
mraa_i2c_func_t* i2c;
} mraa_func_t;

View File

@@ -29,12 +29,16 @@ extern "C" {
#endif
#include <syslog.h>
#include <fnmatch.h>
#include "common.h"
#include "mraa_internal_types.h"
#include "mraa_adv_func.h"
#include "mraa_lang_func.h"
extern mraa_board_t* plat;
extern mraa_iio_info_t* plat_iio;
extern mraa_lang_func_t* lang_func;
/**
* Takes in pin information and sets up the multiplexors.
@@ -65,6 +69,13 @@ mraa_platform_t mraa_arm_platform();
*/
mraa_platform_t mraa_usb_platform_extender(mraa_board_t* board);
/**
* runtime detect iio subsystem
*
* @return mraa_result_t indicating success of iio detection
*/
mraa_result_t mraa_iio_detect();
/**
* helper function to check if file exists
*
@@ -121,6 +132,24 @@ mraa_boolean_t mraa_link_targets(const char* filename, const char* targetname);
*/
int mraa_find_i2c_bus(const char* devname, int startfrom);
#if defined(IMRAA)
/**
* read Imraa subplatform lock file, caller is responsible to free return
* struct array
*
* @param imraa lockfile location
* @return the number of subplatforms added
*/
uint32_t mraa_add_from_lockfile(const char* imraa_lock_file);
/**
* Internal imraa init function
*
* @return mraa_result_t indicating success
*/
mraa_result_t imraa_init();
#endif
#ifdef __cplusplus
}
#endif

View File

@@ -1,7 +1,7 @@
/*
* Author: Thomas Ingleby <thomas.c.ingleby@intel.com>
* Author: Brendan Le Foll <brendan.le.foll@intel.com>
* Copyright (c) 2014 Intel Corporation.
* Copyright (c) 2014-2016 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
@@ -27,14 +27,30 @@
#include "common.h"
#include "mraa.h"
#include "mraa_func.h"
#include "mraa_adv_func.h"
#include "iio.h"
// Bionic does not implement pthread cancellation API
#ifndef __BIONIC__
#define HAVE_PTHREAD_CANCEL
#endif
// general status failures for internal functions
#define MRAA_PLATFORM_NO_INIT -3
#define MRAA_IO_SETUP_FAILURE -2
#define MRAA_NO_SUCH_IO -1
#ifdef FIRMATA
struct _firmata {
/*@*/
uint8_t feature; /**< the feature */
uint8_t index;
void (* isr)(uint8_t*, int); /**< the feature response request */
mraa_boolean_t added; /**< boolean to set if responses already set in devs array */
/*@}*/
};
#endif
/**
* A structure representing a gpio pin.
*/
@@ -43,10 +59,13 @@ struct _gpio {
int pin; /**< the pin number, as known to the os. */
int phy_pin; /**< pin passed to clean init. -1 none and raw*/
int value_fp; /**< the file pointer to the value of the gpio */
void (* isr)(void *); /**< the interupt service request */
void *isr_args; /**< args return when interupt service request triggered */
void (* isr)(void *); /**< the interrupt service request */
void *isr_args; /**< args return when interrupt service request triggered */
pthread_t thread_id; /**< the isr handler thread id */
int isr_value_fp; /**< the isr file pointer on the value */
#ifndef HAVE_PTHREAD_CANCEL
int isr_control_pipe[2]; /**< a pipe used to interrupt the isr from polling the value fd*/
#endif
mraa_boolean_t isr_thread_terminating; /**< is the isr thread being terminated? */
mraa_boolean_t owner; /**< If this context originally exported the pin */
mraa_result_t (*mmap_write) (mraa_gpio_context dev, int value);
@@ -121,6 +140,25 @@ struct _uart {
/*@}*/
};
/**
* A structure representing an IIO device
*/
struct _iio {
int num; /**< IIO device number */
char* name; /**< IIO device name */
int fp; /**< IIO device in /dev */
int fp_event; /**< event file descriptor for IIO device */
void (* isr)(char* data); /**< the interrupt service request */
void *isr_args; /**< args return when interrupt service request triggered */
void (* isr_event)(struct iio_event_data* data, void* args); /**< the event interrupt service request */
int chan_num;
pthread_t thread_id; /**< the isr handler thread id */
mraa_iio_channel* channels;
int event_num;
mraa_iio_event* events;
int datasize;
};
/**
* A bitfield representing the capabilities of a pin.
*/
@@ -137,13 +175,31 @@ typedef struct {
/*@}*/
} mraa_pincapabilities_t;
/**
* Pin commands definition for mraa_mux_t struc
*/
typedef enum {
PINCMD_UNDEFINED = 0, // do not modify, default command for zero value, used for backward compatibility with boards where pincmd is not defined (it will be deleted later)
PINCMD_SET_VALUE = 1, // set a pin's value
PINCMD_SET_DIRECTION = 2, // set a pin's direction (value like MRAA_GPIO_OUT, MRAA_GPIO_OUT_HIGH...)
PINCMD_SET_IN_VALUE = 3, // set input direction and value
PINCMD_SET_OUT_VALUE = 4, // set output direction and value
PINCMD_SET_MODE = 5, // set pin's mode
PINCMD_SKIP = 6 // just skip this command, do not apply pin and value
} pincmd_t;
/**
* A Structure representing a multiplexer and the required value
*/
typedef struct {
/*@{*/
unsigned int pin; /**< Raw GPIO pin id */
unsigned int value; /**< Raw GPIO value */
unsigned int pincmd; /**< Pin command pincmd_xxxx */
/**< At this time not all boards will support it -> TO DO */
unsigned int pin; /**< Raw GPIO pin id */
unsigned int value; /**< Raw GPIO value */
/*@}*/
} mraa_mux_t;
@@ -162,7 +218,6 @@ typedef struct {
unsigned int mux_total; /** Numfer of muxes needed for operation of pin */
mraa_mux_t mux[6]; /** Array holding information about mux */
unsigned int output_enable; /** Output Enable GPIO, for level shifting */
unsigned int pullup_enable; /** Pull-Up enable GPIO, inputs */
mraa_pin_cap_complex_t complex_cap;
/*@}*/
} mraa_pin_t;
@@ -198,9 +253,9 @@ typedef struct {
*/
typedef struct {
/*@{*/
unsigned int bus_id; /**< ID as exposed in the system */
unsigned int scl; /**< i2c SCL */
unsigned int sda; /**< i2c SDA */
int bus_id; /**< ID as exposed in the system */
int scl; /**< i2c SCL */
int sda; /**< i2c SDA */
// mraa_drv_api_t drv_type; /**< Driver type */
/*@}*/
} mraa_i2c_bus_t;
@@ -213,10 +268,10 @@ typedef struct {
unsigned int bus_id; /**< The Bus ID as exposed to the system. */
unsigned int slave_s; /**< Slave select */
mraa_boolean_t three_wire; /**< Is the bus only a three wire system */
unsigned int sclk; /**< Serial Clock */
unsigned int mosi; /**< Master Out, Slave In. */
unsigned int miso; /**< Master In, Slave Out. */
unsigned int cs; /**< Chip Select, used when the board is a spi slave */
int sclk; /**< Serial Clock */
int mosi; /**< Master Out, Slave In. */
int miso; /**< Master In, Slave Out. */
int cs; /**< Chip Select, used when the board is a spi slave */
/*@}*/
} mraa_spi_bus_t;
@@ -238,29 +293,34 @@ typedef struct {
typedef struct _board_t {
/*@{*/
unsigned int phy_pin_count; /**< The Total IO pins on board */
int phy_pin_count; /**< The Total IO pins on board */
unsigned int gpio_count; /**< GPIO Count */
unsigned int aio_count; /**< Analog side Count */
unsigned int i2c_bus_count; /**< Usable i2c Count */
int i2c_bus_count; /**< Usable i2c Count */
mraa_i2c_bus_t i2c_bus[12]; /**< Array of i2c */
unsigned int def_i2c_bus; /**< Position in array of default i2c bus */
unsigned int spi_bus_count; /**< Usable spi Count */
int spi_bus_count; /**< Usable spi Count */
mraa_spi_bus_t spi_bus[12]; /**< Array of spi */
unsigned int def_spi_bus; /**< Position in array of defult spi bus */
unsigned int adc_raw; /**< ADC raw bit value */
unsigned int adc_supported; /**< ADC supported bit value */
unsigned int def_uart_dev; /**< Position in array of defult uart */
unsigned int uart_dev_count; /**< Usable spi Count */
int uart_dev_count; /**< Usable spi Count */
mraa_uart_dev_t uart_dev[6]; /**< Array of UARTs */
mraa_boolean_t no_bus_mux; /**< i2c/spi/adc/pwm/uart bus muxing setup not required */
int pwm_default_period; /**< The default PWM period is US */
int pwm_max_period; /**< Maximum period in us */
int pwm_min_period; /**< Minimum period in us */
mraa_platform_t platform_type; /**< Platform type */
const char* platform_name; /**< Platform Name pointer */
const char* platform_version; /**< Platform versioning info */
mraa_pininfo_t* pins; /**< Pointer to pin array */
mraa_adv_func_t* adv_func; /**< Pointer to advanced function disptach table */
struct _board_t* sub_platform; /**< Pointer to sub platform */
/*@}*/
} mraa_board_t;
typedef struct {
struct _iio* iio_devices; /**< Pointer to IIO devices */
uint8_t iio_device_count; /**< IIO device count */
} mraa_iio_info_t;

35
include/mraa_lang_func.h Normal file
View File

@@ -0,0 +1,35 @@
/*
* Author: Henry Bruce <henry.bruce@intel.com>
* Copyright (c) 2016 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
typedef struct {
void (*python_isr)(void (*isr)(void*), void* isr_args);
void (*java_isr_callback)(void *args);
mraa_result_t (*java_attach_thread)();
void (*java_detach_thread)();
void* (*java_create_global_ref)(void* args);
void (*java_delete_global_ref)(void* ref);
} mraa_lang_func_t;

27
include/python/mraapy.h Normal file
View File

@@ -0,0 +1,27 @@
/*
* Author: Henry Bruce <henry.bruce@intel.com>
* Copyright (c) 2016 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
void mraa_python_isr(void (*isr)(void*), void* isr_args);

View File

@@ -28,12 +28,13 @@
extern "C" {
#endif
#include <dlfcn.h>
#include "mraa_internal.h"
mraa_result_t mraa_ftdi_ft4222_init();
mraa_result_t mraa_ftdi_ft4222_get_version(unsigned int* versionChip, unsigned int* versionLib);
mraa_board_t* mraa_ftdi_ft4222();
void *libft4222_lib;
#ifdef __cplusplus
}

View File

@@ -0,0 +1,41 @@
/*
* Author: Karena Anum Kamaruzaman <karena.anum.kamaruzaman@intel.com>
* Copyright (c) 2016 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
#ifdef __cplusplus
extern "C" {
#endif
#include "mraa_internal.h"
// +1 as pins are "1 indexed"
#define MRAA_INTEL_CHERRYHILLS_PINCOUNT (5 + 1)
mraa_board_t*
mraa_intel_cherryhills();
#ifdef __cplusplus
}
#endif

View File

@@ -32,9 +32,10 @@ extern "C" {
// +1 as pins are "1 indexed"
#define MRAA_INTEL_MINNOW_MAX_PINCOUNT (26 + 1)
#define MRAA_INTEL_MINNOW_TURBOT_PINCOUNT (27 + 1)
mraa_board_t*
mraa_intel_minnowboard_byt_compatible();
mraa_intel_minnowboard_byt_compatible(mraa_boolean_t);
#ifdef __cplusplus
}

View File

@@ -0,0 +1,39 @@
/*
* Author: Lay, Kuan Loon <kuan.loon.lay@intel.com>
* Copyright (c) 2015 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
#ifdef __cplusplus
extern "C" {
#endif
#include "mraa_internal.h"
#define MRAA_INTEL_SOFIA_3GR_PINCOUNT 8
mraa_board_t* mraa_intel_sofia_3gr();
#ifdef __cplusplus
}
#endif

43
include/x86/up.h Normal file
View File

@@ -0,0 +1,43 @@
/*
* Author: Dan O'Donovan <dan@emutex.com>
* Copyright (c) 2015 Emutex Ltd.
* Copyright (c) 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
#ifdef __cplusplus
extern "C" {
#endif
#include "mraa_internal.h"
// +1 as pins are "1 indexed"
#define MRAA_UP_PINCOUNT (40 + 1)
#define MRAA_UP_GPIOCOUNT (28)
mraa_board_t*
mraa_up_board();
#ifdef __cplusplus
}
#endif

17
jsstub/Gruntfile.js Normal file
View File

@@ -0,0 +1,17 @@
module.exports = function(grunt) {
grunt.loadNpmTasks('grunt-mocha-test');
// Project configuration.
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
mochaTest: {
test: {
options: {
reporter: 'spec'
},
src: ['test/*.js']
}
}
});
grunt.registerTask('test', ['mochaTest:test']);
};

52
jsstub/README.md Normal file
View File

@@ -0,0 +1,52 @@
mraaStub - JavaScript simulation and stubs for mraa
====================
This project enables simulation of a device which might be accessed via mraa.
Currently this library supports I2c, SPI, and GPIO. This project provides
several benefits:
1. Prevent crashes in nodejs applications using mraa on unsuported or
misconfigured hardware.
2. Enable basic simulation of mraa-accessible devices for unit testing.
## Examples
The following example is based on an imaginary 'light bulb' device abstraction,
which exposes a value of brightness over a mraa-provided interface. Please see
the `test/index.js` file for an example.
## Installation
mraaStub is not yet in npm so has to be installed from git. In the future
you'll be able to install `mraaStub` from npm like this:
```
npm install mraaStub
```
Since we often switch between a mraaStub and the real mraa library, we
suggest creating an `index.js` file inside a `lib/mraaSwitcher` folder.
```js
/* index.js - file for switching between mraa and mraaStub
*/
// Define the conditions under which the mraaStub should be loaded
var platform = require('os').platform();
var m;
if (platform === 'win32') {
m = require('mraaStub');
} else {
m = require('mraa');
}
module.exports = m;
```
You can add this to your project in its own `lib/mraaSwitcher/index.js` file
and use `require('../mraaSwitcher')` everywhere!
## License
See [COPYING file](../COPYING) in the root of this repository.

223
jsstub/index.js Normal file
View File

@@ -0,0 +1,223 @@
/**
* @fileoverview This file implements a fake mraa stub which enables testing
* as well as the ability to run on Windows.
*/
var m;
var winston = require('winston');
var logger = new winston.Logger({
transports: [
new winston.transports.Console({
level: 'error',
handleExceptions: false,
json: false,
colorize: true})
],
exitOnError: false
});
/**
* @class mraaStub
* @classdesc This class is designed to stub out libmraa so we can run
* test code on unsupported platforms (specifically Windows).
*/
var mraaStub = function() {
var verison = '0.0.1';
var self = this;
self.EDGE_BOTH = 1;
self.EDGE_NONE = 2;
self.EDGE_RISING = 3;
self.EDGE_FALLING = 4;
self.DIR_IN = 1;
self.DIR_OUT = 2;
self.getVersion = function() {
return "mraaStub " + version;
};
// Stub out GPIO
function Gpio(num) {
this.num = num;
this._callback = null;
this._dir = null;
this._isr_mode = self.EDGE_NONE;
}
var logGpio = false;
Gpio.prototype._callIsr = function() {
if(this.isr_mode === self.EDGE_NONE) {
logger.log('info',"Could not call ISR. Not set up for triggering");
}
this._callback();
};
Gpio.prototype.isr = function(mode, handler){
if(logGpio) {
logger.log('info',"GPIO " + this.num + " isr stub invoked.");
}
this._isr_mode = self.EDGE_NONE;
this._callback = handler;
};
Gpio.prototype.dir = function(d) {
if(logGpio) {
logger.log('info',"GPIO " + this.num + " dir stub invoked.");
}
this._dir = d;
};
Gpio.prototype.write = function(z) {
if(logGpio) {
logger.log('logger',"GPIO " + this.num + " write stub invoked.");
}
if(this._dir !== self.DIR_OUT) {
logger.log('info',"GPIO " + this.num + " write called without DIR_OUT set.");
}
};
Gpio.prototype.read = function() {
if(logGpio) {
logger.log('info',"GPIO " + this.num + " read stub invoked.");
}
return 0;
};
// Stub out SPI
function Spi(num) {
var self = this;
this.num = num;
this._buffer = new Buffer(29);
this._buffer.fill(0);
this._loopback = false;
}
Spi.prototype._setOutput = function(buf) {
this._buffer = buf;
};
Spi.prototype._enableLoopback = function(x) {
if(x === true) {
this._loopback = true;
} else {
this._loopback = false;
}
};
Spi.prototype.write = function(b) {
logger.log('info',"SPI write stub invoked.");
if(this._loopback === true) {
return b;
}
return new Buffer(this._buffer);
};
Spi.prototype.frequency = function(f) {
logger.log('info',"SPI frequency stub invoked.");
return f;
};
Spi.prototype.lsbmode = function(t) {
logger.log('info',"SPI lsbmode stub invoked.");
};
Spi.prototype.mode = function(x) {
logger.log('info',"SPI mode stub invoked.");
};
function I2c(num) {
this._num = num;
this._regMapInitialized = false;
}
/* This function sets an internal register map for the I2c device.
*/
I2c.prototype._setRegisterMapInternal = function(buffer) {
this._regMapInitialized = true;
this._buffer = buffer;
};
I2c.prototype.frequency = function(freq) {
// Do nothing. We don't care.
};
I2c.prototype.address = function(address) {
var self = this;
self.address = address;
};
I2c.prototype.readReg = function(regAddr) {
if(!this._regMapInitialized) {
logger.log('error', "Need to set reg map");
}
if(!this.address) {
logger.log('error', "Need to set address");
}
return this._buffer.readUInt8(regAddr);
};
I2c.prototype.readWordReg = function(regAddr) {
if(!this._regMapInitialized) {
logger.log('error', "Need to set reg map");
}
if(!this.address) {
logger.log('error', "Need to set address");
}
return this._buffer.readUInt16LE(regAddr);
};
I2c.prototype.readBytesReg = function(regAddr, len) {
if(!this._regMapInitialized) {
logger.log('error', "Need to set reg map");
}
if(!this.address) {
logger.log('error', "Need to set address");
}
return this._buffer.slice(regAddr,regAddr+len);
};
I2c.prototype.write = function(buf) {
if(!this._regMapInitialized) {
logger.log('error', "Need to set reg map");
}
if(!this.address) {
logger.log('error', "Need to set address");
}
var regAddr = buf[0];
var newBuf = buf.slice(1);
newBuf.copy(this._buffer, regAddr);
};
I2c.prototype.writeReg = function(regAddr, data) {
if(!this._regMapInitialized) {
logger.log('error', "Need to set reg map");
}
if(!this.address) {
logger.log('error', "Need to set address");
}
this._buffer.writeUInt8(regAddr,data);
};
I2c.prototype.writeWordReg = function(regAddr, dataWord) {
if(!this._regMapInitialized) {
logger.log('error', "Need to set reg map");
}
if(!this.address) {
logger.log('error', "Need to set address");
}
this._buffer.writeUInt16LE(regAddr,data);
};
// Export our stubs
self.Gpio = Gpio;
self.Spi = Spi;
self.I2c = I2c;
};
m = new mraaStub();
module.exports = m;

34
jsstub/package.json Normal file
View File

@@ -0,0 +1,34 @@
{
"name": "mraaStub",
"version": "0.0.1",
"description": "Enables simulation of mraa interfaces for testing purposes",
"main": "index.js",
"scripts": {
"test": "grunt test"
},
"repository": {
"type": "git",
"url": "git+https://github.com/intel-iot-devkit/mraa.git"
},
"keywords": [
"mraa",
"iot",
"intel",
"libmraa",
"test",
"galileo",
"edison"
],
"author": "David A Antler <david.a.antler@intel.com>",
"license": "MIT",
"bugs": {
"url": "https://github.com/intel-iot-devkit/mraa/issues"
},
"homepage": "https://github.com/intel-iot-devkit/mraa#readme",
"devDependencies": {
"expect.js": "^0.3.1",
"grunt": "^1.0.1",
"grunt-mocha-test": "^0.12.7",
"mocha": "^2.4.5"
}
}

32
jsstub/test/index.js Normal file
View File

@@ -0,0 +1,32 @@
var expect = require('expect.js');
var m = require('../index');
var LightBulb = require('./lightbulb');
describe('LightBulb', function() {
/** Model the internal data of LightBulb as a buffer */
var bufferFullBrightness = new Buffer(
[ 'N', // Four bytes allocated for name
'a',
'm',
'e',
95 // One byte allocated for brightness. Stuff in '95' value!
]);
it('getBrightness() function should return 95', function() {
// Create a fake I2c bus based on the 'full brightness' data model
var testI2cBus = new m.I2c(0);
testI2cBus._setRegisterMapInternal(bufferFullBrightness);
// Create a new LightBulb that opens the testI2cBus, instead of a real
// mraa I2c bus.
var lightBulbI2c = new LightBulb(testI2cBus);
// presumably getBrightness will gather data from I2C and get '95'
var brightness = lightBulbI2c.getBrightness();
expect(brightness).to.be(95);
})
});

Some files were not shown because too many files have changed in this diff Show More