ds1722.c 1.8 KB

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