api: Change api licensing as it now has nothing to do with mbed
[contrib/mraa.git] / src / i2c / i2c.c
1 /*
2  * Author: Brendan Le Foll
3  * Copyright (c) 2014 Intel Corporation.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining
6  * a copy of this software and associated documentation files (the
7  * "Software"), to deal in the Software without restriction, including
8  * without limitation the rights to use, copy, modify, merge, publish,
9  * distribute, sublicense, and/or sell copies of the Software, and to
10  * permit persons to whom the Software is furnished to do so, subject to
11  * the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be
14  * included in all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23  */
24
25 #include "i2c.h"
26 #include "smbus.h"
27
28 maa_i2c_context*
29 maa_i2c_init()
30 {
31     maa_i2c_context* dev = (maa_i2c_context*) malloc(sizeof(maa_i2c_context));
32     if (dev == NULL)
33         return NULL;
34
35     // Galileo only has one I2C master which should be /dev/i2c-0
36     // reliability is a fickle friend!
37     if ((dev->fh = open("/dev/i2c-0", O_RDWR)) < 1) {
38         fprintf(stderr, "Failed to open requested i2c port");
39     }
40     return dev;
41 }
42
43 maa_result_t
44 maa_i2c_frequency(maa_i2c_context* dev, int hz)
45 {
46     dev->hz = hz;
47
48     return MAA_SUCCESS;
49 }
50
51 maa_result_t
52 maa_i2c_read(maa_i2c_context* dev, char *data, int length)
53 {
54     // this is the read(3) syscall not maa_i2c_read()
55     if (read(dev->fh, data, length) == length) {
56         return length;
57     }
58     return MAA_ERROR_NO_DATA_AVAILABLE;
59 }
60
61 int
62 maa_i2c_read_byte(maa_i2c_context* dev)
63 {
64     int byte;
65     byte = i2c_smbus_read_byte(dev->fh);
66     if (byte < 0) {
67         return -1;
68     }
69     return byte;
70 }
71
72 maa_result_t
73 maa_i2c_write(maa_i2c_context* dev, const char* data, int length)
74 {
75     if (i2c_smbus_write_i2c_block_data(dev->fh, data[0], length-1, (uint8_t*) data+1) < 0) {
76         fprintf(stderr, "Failed to write to i2c\n");
77         return MAA_ERROR_INVALID_HANDLE;
78     }
79     return MAA_SUCCESS;
80 }
81
82 maa_result_t
83 maa_i2c_write_byte(maa_i2c_context* dev, int data)
84 {
85     if (i2c_smbus_write_byte(dev->fh, data) < 0) {
86         fprintf(stderr, "Failed to write to i2c\n");
87         return MAA_ERROR_INVALID_HANDLE;
88     }
89     return MAA_SUCCESS;
90 }
91
92 maa_result_t
93 maa_i2c_address(maa_i2c_context* dev, int addr)
94 {
95     dev->addr = addr;
96     if (ioctl(dev->fh, I2C_SLAVE_FORCE, addr) < 0) {
97         fprintf(stderr, "Failed to set slave address %d\n", addr);
98         return MAA_ERROR_INVALID_HANDLE;
99     }
100     return MAA_SUCCESS;
101 }
102
103 maa_result_t
104 maa_i2c_stop(maa_i2c_context* dev)
105 {
106     free(dev);
107     return MAA_SUCCESS;
108 }