ds1722.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #include <common.h>
  2. #include <ssi.h>
  3. static void ds1722_select(int dev)
  4. {
  5. ssi_set_interface(4096, 0, 0, 0);
  6. ssi_chip_select(0);
  7. udelay(1);
  8. ssi_chip_select(dev);
  9. udelay(1);
  10. }
  11. u8 ds1722_read(int dev, int addr)
  12. {
  13. u8 res;
  14. ds1722_select(dev);
  15. ssi_tx_byte(addr);
  16. res = ssi_rx_byte();
  17. ssi_chip_select(0);
  18. return res;
  19. }
  20. void ds1722_write(int dev, int addr, u8 data)
  21. {
  22. ds1722_select(dev);
  23. ssi_tx_byte(0x80|addr);
  24. ssi_tx_byte(data);
  25. ssi_chip_select(0);
  26. }
  27. u16 ds1722_temp(int dev, int resolution)
  28. {
  29. static int useconds[] = {
  30. 75000, 150000, 300000, 600000, 1200000
  31. };
  32. char temp;
  33. u16 res;
  34. /* set up the desired resulotion ... */
  35. ds1722_write(dev, 0, 0xe0 | (resolution << 1));
  36. /* wait while the chip measures the tremperature */
  37. udelay(useconds[resolution]);
  38. res = (temp = ds1722_read(dev, 2)) << 8;
  39. if (temp < 0) {
  40. temp = (16 - (ds1722_read(dev, 1) >> 4)) & 0x0f;
  41. } else {
  42. temp = (ds1722_read(dev, 1) >> 4);
  43. }
  44. switch (temp) {
  45. case 0:
  46. /* .0000 */
  47. break;
  48. case 1:
  49. /* .0625 */
  50. res |=1;
  51. break;
  52. case 2:
  53. /* .1250 */
  54. res |=1;
  55. break;
  56. case 3:
  57. /* .1875 */
  58. res |=2;
  59. break;
  60. case 4:
  61. /* .2500 */
  62. res |=3;
  63. break;
  64. case 5:
  65. /* .3125 */
  66. res |=3;
  67. break;
  68. case 6:
  69. /* .3750 */
  70. res |=4;
  71. break;
  72. case 7:
  73. /* .4375 */
  74. res |=4;
  75. break;
  76. case 8:
  77. /* .5000 */
  78. res |=5;
  79. break;
  80. case 9:
  81. /* .5625 */
  82. res |=6;
  83. break;
  84. case 10:
  85. /* .6250 */
  86. res |=6;
  87. break;
  88. case 11:
  89. /* .6875 */
  90. res |=7;
  91. break;
  92. case 12:
  93. /* .7500 */
  94. res |=8;
  95. break;
  96. case 13:
  97. /* .8125 */
  98. res |=8;
  99. break;
  100. case 14:
  101. /* .8750 */
  102. res |=9;
  103. break;
  104. case 15:
  105. /* .9375 */
  106. res |=9;
  107. break;
  108. }
  109. return res;
  110. }
  111. int ds1722_probe(int dev)
  112. {
  113. u16 temp = ds1722_temp(dev, DS1722_RESOLUTION_12BIT);
  114. printf("%d.%d deg C\n\n", (char)(temp >> 8), temp & 0xff);
  115. return 0;
  116. }