#include <ezusb.h>
#include <ezregs.h>

#include "LTC1594.h"

/**
 * LTC1594
 *
 * === Connection ===
 * EzUSB      LTC1594
 *  PB0   <=>  -CS
 *  PB1   <=>  CLK
 *  PB7   <=>  DIN/DOUT
 */

#define ncs_up()     (OUTB |=  0x01)
#define ncs_down()   (OUTB &= ~0x01)
#define clk_up()     (OUTB |=  0x02)
#define clk_down()   (OUTB &= ~0x02)
#define mode_out()   (OEB  |=  0x80)
#define mode_in()    (OEB  &= ~0x80)
#define out_up()     (OUTB |=  0x80)
#define out_down()   (OUTB &= ~0x80)
#define is_in_up()   (PINSB &  0x80)

void ltc1594_init(void)
{
  PORTBCFG &= ~0x83;
  OEB |= 0x83;

  ncs_down();
  clk_up();
}

u16 ltc1594_read(u8 ch)
{
  u8 ch_mask = 0x04;
  u16 bit_mask = 0x0800;
  u16 result = 0;
  ncs_up();
  clk_down();
  mode_out();
  out_up();
  clk_up();
  do{
    clk_down();
    (ch & ch_mask) ? out_up() : out_down();
    clk_up();
  }while(ch_mask >>= 1);
  out_down();
  ncs_down();
  clk_down();
  clk_up();
  clk_down();
  clk_up();
  clk_down();
  clk_up();
  clk_down();
  mode_in();
  do{
    if(is_in_up()) result |= bit_mask;
    clk_up();
    clk_down();
  }while(bit_mask >>= 1);
  clk_up();
  return result;
}

