mirror of
				https://source.denx.de/u-boot/u-boot.git
				synced 2025-10-31 00:11:51 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			138 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #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;
 | |
| }
 |