avionic design with actual uboot and tooling
submodule of avionic design uboot bootloader and with included tools to get you started , read readme.md and readme-tk1-loader.md
This commit is contained in:
137
u-boot/drivers/hwmon/ds1722.c
Normal file
137
u-boot/drivers/hwmon/ds1722.c
Normal file
@@ -0,0 +1,137 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user