Skip to content
Snippets Groups Projects
ds1722.c 1.78 KiB
Newer Older
  • Learn to ignore specific revisions
  • 
    #include <common.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;
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    	ds1722_select(dev);
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    	ssi_tx_byte(addr);
    	res = ssi_rx_byte();
    
    
    	ssi_chip_select(0);
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    	return res;
    }
    
    void ds1722_write(int dev, int addr, u8 data)
    {
    	ds1722_select(dev);
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    	ssi_tx_byte(0x80|addr);
    	ssi_tx_byte(data);
    
    
    	ssi_chip_select(0);
    }
    
    
    u16 ds1722_temp(int dev, int resolution)
    {
    	static int useconds[] = {
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    		75000, 150000, 300000, 600000, 1200000
    
    	};
    	char temp;
    	u16 res;
    
    	/* set up the desired resulotion ... */
    	ds1722_write(dev, 0, 0xe0 | (resolution << 1));
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    	/* wait while the chip measures the tremperature */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	udelay(useconds[resolution]);
    
    
    	res = (temp = ds1722_read(dev, 2)) << 8;
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    	if (temp < 0) {
    
    		temp = (16 - (ds1722_read(dev, 1) >> 4)) & 0x0f;
    	} else {
    		temp = (ds1722_read(dev, 1) >> 4);
    	}
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    	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;
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    }
    
    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;
    }