l3-algo-bit.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:4k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * L3 bus algorithm module.
  3.  *
  4.  *  Copyright (C) 2001 Russell King, All Rights Reserved.
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License version 2 as
  8.  * published by the Free Software Foundation.
  9.  *
  10.  *  Note that L3 buses can share the same pins as I2C buses, so we must
  11.  *  _not_ generate an I2C start condition.  An I2C start condition is
  12.  *  defined as a high-to-low transition of the data line while the clock
  13.  *  is high.  Therefore, we must only change the data line while the
  14.  *  clock is low.
  15.  */
  16. #include <linux/module.h>
  17. #include <linux/kernel.h>
  18. #include <linux/delay.h>
  19. #include <linux/slab.h>
  20. #include <linux/init.h>
  21. #include <linux/errno.h>
  22. #include <linux/sched.h>
  23. #include <linux/l3/l3.h>
  24. #include <linux/l3/algo-bit.h>
  25. #define setdat(adap,val) adap->setdat(adap->data, val)
  26. #define setclk(adap,val) adap->setclk(adap->data, val)
  27. #define setmode(adap,val) adap->setmode(adap->data, val)
  28. #define setdatin(adap) adap->setdir(adap->data, 1)
  29. #define setdatout(adap) adap->setdir(adap->data, 0)
  30. #define getdat(adap) adap->getdat(adap->data)
  31. /*
  32.  * Send one byte of data to the chip.  Data is latched into the chip on
  33.  * the rising edge of the clock.
  34.  */
  35. static void sendbyte(struct l3_algo_bit_data *adap, unsigned int byte)
  36. {
  37. int i;
  38. for (i = 0; i < 8; i++) {
  39. setclk(adap, 0);
  40. udelay(adap->data_hold);
  41. setdat(adap, byte & 1);
  42. udelay(adap->data_setup);
  43. setclk(adap, 1);
  44. udelay(adap->clock_high);
  45. byte >>= 1;
  46. }
  47. }
  48. /*
  49.  * Send a set of bytes to the chip.  We need to pulse the MODE line
  50.  * between each byte, but never at the start nor at the end of the
  51.  * transfer.
  52.  */
  53. static void sendbytes(struct l3_algo_bit_data *adap, const char *buf, int len)
  54. {
  55. int i;
  56. for (i = 0; i < len; i++) {
  57. if (i) {
  58. udelay(adap->mode_hold);
  59. setmode(adap, 0);
  60. udelay(adap->mode);
  61. }
  62. setmode(adap, 1);
  63. udelay(adap->mode_setup);
  64. sendbyte(adap, buf[i]);
  65. }
  66. }
  67. /*
  68.  * Read one byte of data from the chip.  Data is latched into the chip on
  69.  * the rising edge of the clock.
  70.  */
  71. static unsigned int readbyte(struct l3_algo_bit_data *adap)
  72. {
  73. unsigned int byte = 0;
  74. int i;
  75. for (i = 0; i < 8; i++) {
  76. setclk(adap, 0);
  77. udelay(adap->data_hold + adap->data_setup);
  78. setclk(adap, 1);
  79. if (getdat(adap))
  80. byte |= 1 << i;
  81. udelay(adap->clock_high);
  82. }
  83. return byte;
  84. }
  85. /*
  86.  * Read a set of bytes from the chip.  We need to pulse the MODE line
  87.  * between each byte, but never at the start nor at the end of the
  88.  * transfer.
  89.  */
  90. static void readbytes(struct l3_algo_bit_data *adap, char *buf, int len)
  91. {
  92. int i;
  93. for (i = 0; i < len; i++) {
  94. if (i) {
  95. udelay(adap->mode_hold);
  96. setmode(adap, 0);
  97. }
  98. setmode(adap, 1);
  99. udelay(adap->mode_setup);
  100. buf[i] = readbyte(adap);
  101. }
  102. }
  103. static int l3_xfer(struct l3_adapter *l3_adap, struct l3_msg msgs[], int num)
  104. {
  105. struct l3_algo_bit_data *adap = l3_adap->algo_data;
  106. int i;
  107. /*
  108.  * If we share an I2C bus, ensure that it is in STOP mode
  109.  */
  110. setclk(adap, 1);
  111. setdat(adap, 1);
  112. setmode(adap, 1);
  113. setdatout(adap);
  114. udelay(adap->mode);
  115. for (i = 0; i < num; i++) {
  116. struct l3_msg *pmsg = &msgs[i];
  117. if (!(pmsg->flags & L3_M_NOADDR)) {
  118. setmode(adap, 0);
  119. udelay(adap->mode_setup);
  120. sendbyte(adap, pmsg->addr);
  121. udelay(adap->mode_hold);
  122. }
  123. if (pmsg->flags & L3_M_RD) {
  124. setdatin(adap);
  125. readbytes(adap, pmsg->buf, pmsg->len);
  126. } else {
  127. setdatout(adap);
  128. sendbytes(adap, pmsg->buf, pmsg->len);
  129. }
  130. }
  131. /*
  132.  * Ensure that we leave the bus in I2C stop mode.
  133.  */
  134. setclk(adap, 1);
  135. setdat(adap, 1);
  136. setmode(adap, 0);
  137. setdatin(adap);
  138. return num;
  139. }
  140. static struct l3_algorithm l3_bit_algo = {
  141. name: "L3 bit-shift algorithm",
  142. xfer: l3_xfer,
  143. };
  144. int l3_bit_add_bus(struct l3_adapter *adap)
  145. {
  146. adap->algo = &l3_bit_algo;
  147. return l3_add_adapter(adap);
  148. }
  149. int l3_bit_del_bus(struct l3_adapter *adap)
  150. {
  151. return l3_del_adapter(adap);
  152. }
  153. EXPORT_SYMBOL(l3_bit_add_bus);
  154. EXPORT_SYMBOL(l3_bit_del_bus);