1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2008 by Rob Purchase
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
24 #define PCF50606_ADDR 0x10
26 int pcf50606_write(int address
, unsigned char val
)
28 unsigned char data
[] = { address
, val
};
29 return i2c_write(PCF50606_ADDR
, data
, 2);
32 int pcf50606_write_multiple(int address
, const unsigned char* buf
, int count
)
36 for (i
= 0; i
< count
; i
++)
37 pcf50606_write(address
+ i
, buf
[i
]);
42 int pcf50606_read(int address
)
44 unsigned char val
= -1;
45 i2c_readmem(PCF50606_ADDR
, address
, &val
, 1);
49 int pcf50606_read_multiple(int address
, unsigned char* buf
, int count
)
51 return i2c_readmem(PCF50606_ADDR
, address
, buf
, count
);
54 void pcf50606_init(void)
57 /* Set outputs as per OF - further investigation required. */
58 static const char init_data
[] =
59 {PCF5060X_DCDEC1
, 0xe4,
60 PCF5060X_IOREGC
, 0xf5,
61 PCF5060X_D1REGC1
, 0xf5,
62 PCF5060X_D2REGC1
, 0xe9,
63 PCF5060X_D3REGC1
, 0xf8, /* WM8985 3.3v */
64 PCF5060X_DCUDC1
, 0xe7,
65 PCF5060X_LPREGC1
, 0x0,
66 PCF5060X_LPREGC2
, 0x2,
70 for (ptr
= init_data
; *ptr
!= 0; ptr
+= 2)
71 pcf50606_write(ptr
[0], ptr
[1]);
75 void pcf50606_reset_timeout(void)
77 int level
= disable_irq_save();
78 pcf50606_write(PCF5060X_OOCC1
, pcf50606_read(PCF5060X_OOCC1
) | TOTRST
);
82 void pcf50606_read_adc(int adc
, short* res1
, short* res2
)
84 int adcs1
= 0, adcs2
= 0, adcs3
= 0;
86 int level
= disable_irq_save();
88 pcf50606_write(PCF5060X_ADCC2
, (adc
<<1) | 1); /* ADC start */
91 adcs2
= pcf50606_read(PCF5060X_ADCS2
);
92 } while (!(adcs2
& 0x80)); /* Busy wait on ADCRDY flag */
94 adcs1
= pcf50606_read(PCF5060X_ADCS1
);
95 if (res2
!= NULL
) adcs3
= pcf50606_read(PCF5060X_ADCS3
);
97 pcf50606_write(PCF5060X_ADCC2
, 0); /* ADC stop */
99 restore_interrupt(level
);
101 if (res1
!= NULL
) *res1
= (adcs1
<< 2) | (adcs2
& 3);
102 if (res2
!= NULL
) *res2
= (adcs3
<< 2) | ((adcs2
& 0xC) >> 2);