diff options
Diffstat (limited to 'drivers/ds1722.c')
| -rw-r--r-- | drivers/ds1722.c | 142 | 
1 files changed, 142 insertions, 0 deletions
| diff --git a/drivers/ds1722.c b/drivers/ds1722.c new file mode 100644 index 000000000..34eb80ca2 --- /dev/null +++ b/drivers/ds1722.c @@ -0,0 +1,142 @@ + +#include <common.h> + +#include <ssi.h> + +#ifdef CONFIG_DS1722 + +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; +} + +#endif |