| // Copyright (c) 2011 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef __FI2C_H__ |
| #define __FI2C_H__ |
| |
| #include <ftdi.h> |
| #include <unistd.h> |
| #include <string.h> |
| #include <stdint.h> |
| #include <stdio.h> |
| #include "ftdi_common.h" |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| // bit positions various signals in interface |
| #define SCL_POS 0x01 |
| #define SDA_POS 0x02 |
| // note, 0x04 has to be tied to SDA for I/O capabilities |
| #define SDB_POS 0x04 |
| |
| #define GP0_POS 0x08 |
| #define GP1_POS 0x10 |
| #define GP2_POS 0x20 |
| #define GP3_POS 0x40 |
| #define GP4_POS 0x80 |
| |
| #define FI2C_BUF_SIZE (1<<12) |
| #define FI2C_CHUNKSIZE (1<<12) |
| |
| #define FI2C_ERR_NONE 0 |
| #define FI2C_ERR_FTDI 1 |
| #define FI2C_ERR_ACK 2 |
| #define FI2C_ERR_CLK 3 |
| #define FI2C_ERR_READ 4 |
| #define FI2C_ERR_WRITE 5 |
| |
| #define FI2C_ACK_RETRY_MAX 10 |
| #define FI2C_READ_ATTEMPTS 5 |
| |
| #define ERROR_FI2C(ecode, ...) \ |
| fprintf(stderr, "-E- (%d) ", ecode); \ |
| fprintf(stderr, __VA_ARGS__) |
| |
| #ifndef DEBUG |
| #define DEBUG_FI2C(...) |
| #else |
| #define DEBUG_FI2C(...) prn_dbg( __VA_ARGS__) |
| #endif |
| |
| #define CHECK_FI2C(fic, fx, ...) do { \ |
| DEBUG_FI2C(__VA_ARGS__); \ |
| if ((fic->error = fx) < 0) { \ |
| ERROR_FI2C(fic->error,__VA_ARGS__); \ |
| } \ |
| } while (0) |
| |
| |
| #define FI2C_WBUF(fic, val) \ |
| fic->buf[fic->bufcnt++] = val |
| |
| // buf = { cmd, val, dir } |
| #define FI2C_CFG_IO(fic, val, dir) do { \ |
| FI2C_WBUF(fic, SET_BITS_LOW); \ |
| FI2C_WBUF(fic, ((val) | fic->gpio.value)); \ |
| FI2C_WBUF(fic, ((dir) | fic->gpio.direction)); \ |
| } while (0) |
| |
| struct fi2c_context { |
| // v--- DO NOT REORDER ---v |
| struct ftdi_context *fc; |
| struct gpio_s gpio; |
| // ^--- DO NOT REORDER ---^ |
| unsigned int clk; |
| int error; |
| uint8_t slv; |
| uint8_t *buf; |
| int bufcnt; |
| int bufsize; |
| }; |
| |
| int fi2c_init(struct fi2c_context *fic, struct ftdi_context *fc); |
| int fi2c_open(struct fi2c_context *fic, struct ftdi_common_args *fargs); |
| int fi2c_setclock(struct fi2c_context *fic, uint32_t clkhz); |
| int fi2c_reset(struct fi2c_context *fic); |
| int fi2c_wr_rd(struct fi2c_context *fic, uint8_t *wbuf, int wcnt, |
| uint8_t *rbuf, int rcnt); |
| int fi2c_close(struct fi2c_context *fic); |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| #endif //__FI2C_H__ |