Add toolchain and mbtk source

Change-Id: Ie12546301367ea59240bf23d5e184ad7e36e40b3
diff --git a/mbtk/ql_lib/src/ql_i2c.c b/mbtk/ql_lib/src/ql_i2c.c
new file mode 100755
index 0000000..8b8c6a0
--- /dev/null
+++ b/mbtk/ql_lib/src/ql_i2c.c
@@ -0,0 +1,222 @@
+#include <stdio.h>
+#include <linux/types.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <errno.h>
+#include <assert.h>
+#include <string.h>
+#include <linux/i2c.h>
+#include <linux/i2c-dev.h>
+
+#include "mbtk_log.h"
+#include "ql/ql_i2c.h"
+
+int Ql_I2C_Init(char *dev_name)
+{
+    int fd = open(dev_name, O_RDWR);
+    if(fd <= 0) {
+        LOGE("open (%s) fail:errno - %d", dev_name, errno);
+        return -1;
+    }
+    return fd;
+}
+
+
+int Ql_I2C_Read(int fd, unsigned short slaveAddr, unsigned char ofstAddr,  unsigned char* ptrBuff, unsigned short length)
+{
+    uint8_t outbuf[1];
+    struct i2c_rdwr_ioctl_data packets;
+    struct i2c_msg messages[2];
+
+    outbuf[0] = ofstAddr;
+    messages[0].addr = slaveAddr;
+    messages[0].flags = 0;
+    messages[0].len = sizeof(outbuf);
+    messages[0].buf = outbuf;
+
+    /* The data will get returned in this structure */
+    messages[1].addr = slaveAddr;
+    messages[1].flags = I2C_M_RD/* | I2C_M_NOSTART*/;
+    messages[1].len = length;
+    messages[1].buf = ptrBuff;
+
+    /* Send the request to the kernel and get the result back */
+    packets.msgs = messages;
+    packets.nmsgs = 2;
+    if(ioctl(fd, I2C_RDWR, &packets) < 0)
+    {
+        LOGE("Error: Unable to send data");
+        return -1;
+    }
+
+    return 0;
+}
+
+
+int Ql_I2C_Write(int fd, unsigned short slaveAddr, unsigned char ofstAddr,  unsigned char* ptrData, unsigned short length)
+{
+    uint8_t *outbuf = NULL;
+    struct i2c_rdwr_ioctl_data packets;
+    struct i2c_msg messages[1];
+
+    outbuf = malloc(length + 1);
+    if (!outbuf) {
+        printf("Error: No memory for buffer\n");
+        return -1;
+    }
+
+    outbuf[0] = ofstAddr;
+    memcpy(outbuf + 1, ptrData, length);
+
+    messages[0].addr = slaveAddr;
+    messages[0].flags = 0;
+    messages[0].len = length + 1;
+    messages[0].buf = outbuf;
+
+    /* Transfer the i2c packets to the kernel and verify it worked */
+    packets.msgs = messages;
+    packets.nmsgs = 1;
+    if(ioctl(fd, I2C_RDWR, &packets) < 0)
+    {
+        printf("Error: Unable to send data");
+        free(outbuf);
+        return -1;
+    }
+
+    free(outbuf);
+
+    return 0;
+}
+
+
+int Ql_I2C_Deinit(int fd)
+{
+    if (fd <= 0)
+        return -1;
+
+    close(fd);
+    return 0;
+}
+
+#if 0
+int open_i2c_dev(int i2cbus, char *filename, size_t size, int quiet)
+{
+	int file, len;
+
+	len = snprintf(filename, size, "/dev/i2c/%d", i2cbus);
+	if (len >= (int)size) {
+		fprintf(stderr, "%s: path truncated\n", filename);
+		return -EOVERFLOW;
+	}
+	file = open(filename, O_RDWR);
+
+	if (file < 0 && (errno == ENOENT || errno == ENOTDIR)) {
+		len = snprintf(filename, size, "/dev/i2c-%d", i2cbus);
+		if (len >= (int)size) {
+			fprintf(stderr, "%s: path truncated\n", filename);
+			return -EOVERFLOW;
+		}
+		file = open(filename, O_RDWR);
+	}
+	...
+	return file;
+}
+
+static int i2c_read_bytes(int fd, uint8_t slave_addr, uint8_t reg_addr, uint8_t *values, uint8_t len)
+{
+    uint8_t outbuf[1];
+    struct i2c_rdwr_ioctl_data packets;
+    struct i2c_msg messages[2];
+
+    outbuf[0] = reg_addr;
+    messages[0].addr = slave_addr;
+    messages[0].flags = 0;
+    messages[0].len = sizeof(outbuf);
+    messages[0].buf = outbuf;
+
+    /* The data will get returned in this structure */
+    messages[1].addr = slave_addr;
+    messages[1].flags = I2C_M_RD/* | I2C_M_NOSTART*/;
+    messages[1].len = len;
+    messages[1].buf = values;
+
+    /* Send the request to the kernel and get the result back */
+    packets.msgs = messages;
+    packets.nmsgs = 2;
+    if(ioctl(fd, I2C_RDWR, &packets) < 0)
+    {
+        printf("Error: Unable to send data");
+        return -1;
+    }
+
+    return 0;
+}
+
+
+static int i2c_write_bytes(int fd, uint8_t slave_addr, uint8_t reg_addr, uint8_t *values, uint8_t len)
+{
+    uint8_t *outbuf = NULL;
+    struct i2c_rdwr_ioctl_data packets;
+    struct i2c_msg messages[1];
+
+    outbuf = malloc(len + 1);
+    if (!outbuf) {
+        printf("Error: No memory for buffer\n");
+        return -1;
+    }
+
+    outbuf[0] = reg_addr;
+    memcpy(outbuf + 1, values, len);
+
+    messages[0].addr = slave_addr;
+    messages[0].flags = 0;
+    messages[0].len = len + 1;
+    messages[0].buf = outbuf;
+
+    /* Transfer the i2c packets to the kernel and verify it worked */
+    packets.msgs = messages;
+    packets.nmsgs = 1;
+    if(ioctl(fd, I2C_RDWR, &packets) < 0)
+    {
+        printf("Error: Unable to send data");
+        free(outbuf);
+        return -1;
+    }
+
+    free(outbuf);
+
+    return 0;
+}
+
+
+int set_slave_addr(int file, int address, int force)
+{
+	/* With force, let the user read from/write to the registers
+	   even when a driver is also running */
+	if (ioctl(file, force ? I2C_SLAVE_FORCE : I2C_SLAVE, address) < 0) {
+		fprintf(stderr,
+			"Error: Could not set address to 0x%02x: %s\n",
+			address, strerror(errno));
+		return -errno;
+	}
+
+	return 0;
+}
+
+
+int main(void)
+{
+	int fd = -1;
+        char send_data[64] = {0};
+	send_data[0] = 0x55;
+	send_data[1] = 0x00;
+	send_data[2] = 0x84;
+    	fd= open_i2c_dev(0, "i2c_test", 5, 0);
+	i2c_write_bytes(fd, 0x12, 0x10,send_data, 3)
+}
+#endif