#include <stdio.h> // printf()
#include <stdlib.h> // exit()
#include <fcntl.h> // open(), 0_RDWR
//#include <unistd.h>
//#include <signal.h>
//#include <getopt.h>
#include <stdint.h>  // uint8_t

//#include "i2c.h"
#include "i2c-dev.h" // i2c_rdwr_ioctl_data, i2c_msg
//#include "i2c-io-api.h" // I2C_IO_Writereg8(), I2C_IO_READ_REG_8, I2C_IO_WRITE_REG_8
//#include "i2c-io.h" // I2C_IO_WriteReg8_t
#include "i2c-api.h" // I2cWriteBlock()

#define I2C_IO_READ_REG_8 0x07
#define I2C_IO_WRITE_REG_8 0x09

typedef struct
{
  uint8_t reg; // Index of the register to be read

} I2C_IO_ReadReg8_t;

typedef struct
{
  uint8_t reg; // Index of the register to be read
  uint8_t val; // Value to write into the register

} I2C_IO_WriteReg8_t;

int main(int argc, char **argv)
{
  uint8_t gI2cAddr = 0x0b; //strtol("0x0b",NULL,0);
  int i2cDev;
  const char * i2cDevName = "/dev/i2c-0";
  uint8_t portd = 0x12 + 0x20;
  uint8_t regVal;

printf("argc: %d  argv[0]: %s  argv[1]: %s\n", argc, argv[0], argv[1]);

  if(argc > 1)
    regVal = strtol(argv[ 1 ],NULL,0);
  else
    regVal = 127;

  struct i2c_rdwr_ioctl_data rdwr;
  struct i2c_msg msg[ 2 ];

  I2C_IO_WriteReg8_t writeReg;
  uint8_t wrLen = 0x80 | sizeof( writeReg );
  uint8_t wrBlock = (( wrLen & 0x80 ) != 0 );

  uint8_t wrBuf[ I2C_MAX_DATA_LEN + 3 ];

  if(( i2cDev = open( i2cDevName, O_RDWR )) < 0)
  {
    printf( "open failed\n");
    exit ( 1 );
  }

//  I2cSetSlaveAddress( i2cDev, gI2cAddr, I2C_USE_CRC );
  ioctl( i2cDev, I2C_SLAVE, gI2cAddr );

  writeReg.reg = portd;
  writeReg.val = regVal;

//  if ( !I2C_IO_WriteReg8( i2cDev, writeReg.reg, writeReg.val ))
//  if ( I2cWriteBlock( i2cDev, I2C_IO_WRITE_REG_8, &writeReg, sizeof( writeReg )) != 0 )
//  if ( I2cTransfer( i2cDev, I2C_IO_WRITE_REG_8, &writeReg, 0x80 | sizeof( writeReg ), NULL, 0, NULL) != 0 )
  msg [ 0 ].addr = gI2cAddr;
  msg [ 0 ].flags = 0;
  msg [ 0 ].len = sizeof( writeReg ) + 2;
  msg [ 0 ].buf = (char *)&wrBuf[ 0 ];

  wrBuf[ 0 ] = I2C_IO_WRITE_REG_8;
  wrBuf[ 1 ] = sizeof( writeReg );
  wrBuf[ 2 ] = portd;
  wrBuf[ 3 ] = regVal;

  rdwr.msgs = msg;
  rdwr.nmsgs = 1;

printf("Reg: %d  Val: %d  wrBlock: %d\n", writeReg.reg, writeReg.val, wrBlock);
//  if ( !I2C_IO_WriteReg8( i2cDev, writeReg.reg, writeReg.val ))
//  if ( I2cWriteBlock( i2cDev, I2C_IO_WRITE_REG_8, &writeReg, sizeof( writeReg ) ) != 0 )
//  if ( I2cTransfer( i2cDev, I2C_IO_WRITE_REG_8, &writeReg, 0x80 | sizeof( writeReg ), NULL, 0, NULL) != 0 )
  if ( ioctl( i2cDev, I2C_RDWR, &rdwr ) < 0 )
  {
    printf( "Error writing to register\n");
    exit ( 1 );
  }

  return 0;
}

