2003-06-01 02:35:21 +08:00
|
|
|
|
|
|
|
#include <common.h>
|
2007-10-19 06:09:05 +08:00
|
|
|
#include <ssi.h>
|
|
|
|
|
2003-06-01 02:35:21 +08:00
|
|
|
static void ds1722_select(int dev)
|
|
|
|
{
|
|
|
|
ssi_set_interface(4096, 0, 0, 0);
|
|
|
|
ssi_chip_select(0);
|
|
|
|
udelay(1);
|
|
|
|
ssi_chip_select(dev);
|
|
|
|
udelay(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
u8 ds1722_read(int dev, int addr)
|
|
|
|
{
|
|
|
|
u8 res;
|
2003-06-28 05:31:46 +08:00
|
|
|
|
2003-06-01 02:35:21 +08:00
|
|
|
ds1722_select(dev);
|
2003-06-28 05:31:46 +08:00
|
|
|
|
|
|
|
ssi_tx_byte(addr);
|
|
|
|
res = ssi_rx_byte();
|
|
|
|
|
2003-06-01 02:35:21 +08:00
|
|
|
ssi_chip_select(0);
|
2003-06-28 05:31:46 +08:00
|
|
|
|
2003-06-01 02:35:21 +08:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ds1722_write(int dev, int addr, u8 data)
|
|
|
|
{
|
|
|
|
ds1722_select(dev);
|
2003-06-28 05:31:46 +08:00
|
|
|
|
|
|
|
ssi_tx_byte(0x80|addr);
|
|
|
|
ssi_tx_byte(data);
|
|
|
|
|
2003-06-01 02:35:21 +08:00
|
|
|
ssi_chip_select(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
u16 ds1722_temp(int dev, int resolution)
|
|
|
|
{
|
|
|
|
static int useconds[] = {
|
2003-06-28 05:31:46 +08:00
|
|
|
75000, 150000, 300000, 600000, 1200000
|
2003-06-01 02:35:21 +08:00
|
|
|
};
|
|
|
|
char temp;
|
|
|
|
u16 res;
|
2003-06-28 05:31:46 +08:00
|
|
|
|
|
|
|
|
2003-06-01 02:35:21 +08:00
|
|
|
/* set up the desired resulotion ... */
|
|
|
|
ds1722_write(dev, 0, 0xe0 | (resolution << 1));
|
2003-06-28 05:31:46 +08:00
|
|
|
|
2003-06-01 02:35:21 +08:00
|
|
|
/* wait while the chip measures the tremperature */
|
2003-06-28 05:31:46 +08:00
|
|
|
udelay(useconds[resolution]);
|
|
|
|
|
2003-06-01 02:35:21 +08:00
|
|
|
res = (temp = ds1722_read(dev, 2)) << 8;
|
2003-06-28 05:31:46 +08:00
|
|
|
|
|
|
|
if (temp < 0) {
|
2003-06-01 02:35:21 +08:00
|
|
|
temp = (16 - (ds1722_read(dev, 1) >> 4)) & 0x0f;
|
|
|
|
} else {
|
|
|
|
temp = (ds1722_read(dev, 1) >> 4);
|
|
|
|
}
|
2003-06-28 05:31:46 +08:00
|
|
|
|
2003-06-01 02:35:21 +08:00
|
|
|
switch (temp) {
|
|
|
|
case 0:
|
|
|
|
/* .0000 */
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
/* .0625 */
|
|
|
|
res |=1;
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
/* .1250 */
|
|
|
|
res |=1;
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
/* .1875 */
|
|
|
|
res |=2;
|
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
/* .2500 */
|
|
|
|
res |=3;
|
|
|
|
break;
|
|
|
|
case 5:
|
|
|
|
/* .3125 */
|
|
|
|
res |=3;
|
|
|
|
break;
|
|
|
|
case 6:
|
|
|
|
/* .3750 */
|
|
|
|
res |=4;
|
|
|
|
break;
|
|
|
|
case 7:
|
|
|
|
/* .4375 */
|
|
|
|
res |=4;
|
|
|
|
break;
|
|
|
|
case 8:
|
|
|
|
/* .5000 */
|
|
|
|
res |=5;
|
|
|
|
break;
|
|
|
|
case 9:
|
|
|
|
/* .5625 */
|
|
|
|
res |=6;
|
|
|
|
break;
|
|
|
|
case 10:
|
|
|
|
/* .6250 */
|
|
|
|
res |=6;
|
|
|
|
break;
|
|
|
|
case 11:
|
|
|
|
/* .6875 */
|
|
|
|
res |=7;
|
|
|
|
break;
|
|
|
|
case 12:
|
|
|
|
/* .7500 */
|
|
|
|
res |=8;
|
|
|
|
break;
|
|
|
|
case 13:
|
|
|
|
/* .8125 */
|
|
|
|
res |=8;
|
|
|
|
break;
|
|
|
|
case 14:
|
|
|
|
/* .8750 */
|
|
|
|
res |=9;
|
|
|
|
break;
|
|
|
|
case 15:
|
|
|
|
/* .9375 */
|
|
|
|
res |=9;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return res;
|
2003-06-28 05:31:46 +08:00
|
|
|
|
2003-06-01 02:35:21 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
int ds1722_probe(int dev)
|
|
|
|
{
|
|
|
|
u16 temp = ds1722_temp(dev, DS1722_RESOLUTION_12BIT);
|
|
|
|
printf("%d.%d deg C\n\n", (char)(temp >> 8), temp & 0xff);
|
|
|
|
return 0;
|
|
|
|
}
|