143 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			143 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
 | 
						|
#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
 |