#include <common.h> #include <asm/ic/ssi.h> #include <ds1722.h> 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; ds1722_select(dev); ssi_tx_byte(addr); res = ssi_rx_byte(); ssi_chip_select(0); return res; } void ds1722_write(int dev, int addr, u8 data) { ds1722_select(dev); ssi_tx_byte(0x80|addr); ssi_tx_byte(data); ssi_chip_select(0); } u16 ds1722_temp(int dev, int resolution) { static int useconds[] = { 75000, 150000, 300000, 600000, 1200000 }; char temp; u16 res; /* set up the desired resulotion ... */ ds1722_write(dev, 0, 0xe0 | (resolution << 1)); /* wait while the chip measures the tremperature */ udelay(useconds[resolution]); res = (temp = ds1722_read(dev, 2)) << 8; if (temp < 0) { temp = (16 - (ds1722_read(dev, 1) >> 4)) & 0x0f; } else { temp = (ds1722_read(dev, 1) >> 4); } 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; } 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; }