kspi.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. #include<linux/string.h>
  2. #include "defines.h"
  3. #include "kspi.h"
  4. #include "kfile.h"
  5. #include "ktiva.h"
  6. #include "ksync.h"
  7. /////////////////////////////////////////////////////////////////////////////
  8. /////////////////////////////////////////////////////////////////////////////
  9. int kspi_write_mode(struct file *pf, unsigned char mode)
  10. {
  11. int ret;
  12. ret = kf_ioctl(pf, SPI_IOC_WR_MODE, (unsigned long)&mode);
  13. if(ret < 0)
  14. {
  15. KALERT("%s: kf_ioctl failed: %d\n", __FUNCTION__, ret);
  16. }
  17. return ret;
  18. }
  19. /////////////////////////////////////////////////////////////////////////////
  20. int kspi_read_mode(struct file *pf, unsigned char *mode)
  21. {
  22. int ret;
  23. ret = kf_ioctl(pf, SPI_IOC_RD_MODE, (unsigned long)mode);
  24. if(ret < 0)
  25. {
  26. KALERT("%s: kf_ioctl failed: %d\n", __FUNCTION__, ret);
  27. }
  28. return ret;
  29. }
  30. /////////////////////////////////////////////////////////////////////////////
  31. int kspi_write_bits_per_word(struct file *pf, unsigned char bits)
  32. {
  33. int ret;
  34. ret = kf_ioctl(pf, SPI_IOC_WR_BITS_PER_WORD, (unsigned long)&bits);
  35. if(ret < 0)
  36. {
  37. KALERT("%s: kf_ioctl failed: %d\n", __FUNCTION__, ret);
  38. }
  39. return ret;
  40. }
  41. /////////////////////////////////////////////////////////////////////////////
  42. int kspi_read_bits_per_word(struct file *pf, unsigned char *bits)
  43. {
  44. int ret;
  45. ret = kf_ioctl(pf, SPI_IOC_RD_BITS_PER_WORD, (unsigned long)bits);
  46. if(ret < 0)
  47. {
  48. KALERT("%s: kf_ioctl failed: %d\n", __FUNCTION__, ret);
  49. }
  50. return ret;
  51. }
  52. /////////////////////////////////////////////////////////////////////////////
  53. int kspi_write_max_speed_hz(struct file *pf, unsigned int speed)
  54. {
  55. int ret;
  56. ret = kf_ioctl(pf, SPI_IOC_WR_MAX_SPEED_HZ, (unsigned long)&speed);
  57. if(ret < 0)
  58. {
  59. KALERT("%s: kf_ioctl failed: %d\n", __FUNCTION__, ret);
  60. }
  61. return ret;
  62. }
  63. /////////////////////////////////////////////////////////////////////////////
  64. int kspi_read_max_speed_hz(struct file *pf, unsigned int *speed)
  65. {
  66. int ret;
  67. ret = kf_ioctl(pf, SPI_IOC_RD_MAX_SPEED_HZ, (unsigned long)speed);
  68. if(ret < 0)
  69. {
  70. KALERT("%s: kf_ioctl failed: %d\n", __FUNCTION__, ret);
  71. }
  72. return ret;
  73. }
  74. /////////////////////////////////////////////////////////////////////////////
  75. /////////////////////////////////////////////////////////////////////////////
  76. /////////////////////////////////////////////////////////////////////////////
  77. int kspi_tx(struct file *pf, const void *pData, size_t nCbData)
  78. {
  79. int ret;
  80. struct spi_ioc_transfer tr =
  81. {
  82. .tx_buf = (unsigned long)pData,
  83. .rx_buf = 0,
  84. .len = nCbData,
  85. // .delay_usecs = 0,
  86. // .speed_hz = _SPI_SPEED_HZ,
  87. // .bits_per_word = _SPI_BITS_PER_WORD,
  88. };
  89. ret = kf_ioctl(pf, SPI_IOC_MESSAGE(1), (unsigned long)&tr);
  90. if(ret < 0)
  91. KALERT("%s failed: %d\n", __FUNCTION__, ret);
  92. return ret;
  93. }
  94. /////////////////////////////////////////////////////////////////////////////
  95. int kspi_rx(struct file *pf, void *pData, size_t nCbData)
  96. {
  97. int ret;
  98. struct spi_ioc_transfer tr =
  99. {
  100. .tx_buf = 0,
  101. .rx_buf = (unsigned long)pData,
  102. .len = nCbData,
  103. // .delay_usecs = 0,
  104. // .speed_hz = _SPI_SPEED_HZ,
  105. // .bits_per_word = _SPI_BITS_PER_WORD,
  106. };
  107. ret = kf_ioctl(pf, SPI_IOC_MESSAGE(1), (unsigned long)&tr);
  108. if(ret < 0)
  109. KALERT("%s failed: %d\n", __FUNCTION__, ret);
  110. return ret;
  111. }
  112. /////////////////////////////////////////////////////////////////////////////
  113. int kspi_tx_rx(struct file *pf, const void *pTx, void *pRx, size_t nCb)
  114. {
  115. int ret;
  116. struct spi_ioc_transfer tr =
  117. {
  118. .tx_buf = (unsigned long)pTx,
  119. .rx_buf = (unsigned long)pRx,
  120. .len = nCb,
  121. // .delay_usecs = 0,
  122. // .speed_hz = _SPI_SPEED_HZ,
  123. // .bits_per_word = _SPI_BITS_PER_WORD,
  124. };
  125. ret = kf_ioctl(pf, SPI_IOC_MESSAGE(1), (unsigned long)&tr);
  126. if(ret < 0)
  127. KALERT("%s failed: %d\n", __FUNCTION__, ret);
  128. return ret;
  129. }
  130. /////////////////////////////////////////////////////////////////////////////
  131. int kspi_rx_byte(struct file *pf, unsigned char *rx)
  132. {
  133. return kspi_rx(pf, rx, 1);
  134. }
  135. /////////////////////////////////////////////////////////////////////////////
  136. int kspi_tx_byte(struct file *pf, unsigned char tx)
  137. {
  138. return kspi_tx(pf, &tx, 1);
  139. }
  140. /////////////////////////////////////////////////////////////////////////////
  141. int kspi_tx_rx_byte(struct file *pf, unsigned char tx, unsigned char *rx)
  142. {
  143. return kspi_tx_rx(pf, &tx, rx, 1);
  144. }
  145. /////////////////////////////////////////////////////////////////////////////
  146. bool KSpiInit(struct file *pf)
  147. {
  148. bool bRet = false;
  149. uint8_t mode = 0;
  150. uint8_t bits = 0;
  151. uint32_t speed = 0;
  152. do
  153. {
  154. if(kspi_write_mode(pf, SPI_MODE_3) < 0)
  155. {
  156. KALERT("%s: kspi_write_mode failed!\n", __FUNCTION__);
  157. break;
  158. }
  159. if(kspi_read_mode(pf, &mode) < 0)
  160. {
  161. KALERT("%s: kspi_read_mode failed!\n", __FUNCTION__);
  162. break;
  163. }
  164. if(mode != SPI_MODE_3)
  165. {
  166. KALERT("%s: Invalid mode!\n", __FUNCTION__);
  167. break;
  168. }
  169. /////////////////////////////////////////////////////////////////
  170. if(kspi_write_bits_per_word(pf, _SPI_BITS_PER_WORD) < 0)
  171. {
  172. KALERT("%s: kspi_write_bits_per_word failed!\n", __FUNCTION__);
  173. break;
  174. }
  175. if(kspi_read_bits_per_word(pf, &bits) < 0)
  176. {
  177. KALERT("%s: kspi_read_bits_per_word failed!\n", __FUNCTION__);
  178. break;
  179. }
  180. if(bits != _SPI_BITS_PER_WORD)
  181. {
  182. KALERT("%s: Invalid bits per word!\n", __FUNCTION__);
  183. break;
  184. }
  185. /////////////////////////////////////////////////////////////////
  186. if(kspi_write_max_speed_hz(pf, _SPI_SPEED_HZ) < 0)
  187. {
  188. KALERT("%s: kspi_write_max_speed_hz failed!\n", __FUNCTION__);
  189. break;
  190. }
  191. if(kspi_read_max_speed_hz(pf, &speed) < 0)
  192. {
  193. KALERT("%s: kspi_read_max_speed_hz failed!\n", __FUNCTION__);
  194. break;
  195. }
  196. if(speed != _SPI_SPEED_HZ)
  197. {
  198. KALERT("%s: Invalid max. speed!\n", __FUNCTION__);
  199. break;
  200. }
  201. bRet = true;
  202. }
  203. while(false);
  204. return bRet;
  205. }
  206. void KSpiExit(void)
  207. {
  208. }