soft_tws.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. /*
  2. * (C) Copyright 2009
  3. * Detlev Zundel, DENX Software Engineering, dzu@denx.de.
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. #define TWS_IMPLEMENTATION
  8. #include <common.h>
  9. /*=====================================================================*/
  10. /* Public Functions */
  11. /*=====================================================================*/
  12. /*-----------------------------------------------------------------------
  13. * Read bits
  14. */
  15. int tws_read(uchar *buffer, int len)
  16. {
  17. int rem = len;
  18. uchar accu, shift;
  19. debug("tws_read: buffer %p len %d\n", buffer, len);
  20. /* Configure the data pin for input */
  21. tws_data_config_output(0);
  22. /* Disable WR, i.e. setup a read */
  23. tws_wr(0);
  24. udelay(1);
  25. /* Rise CE */
  26. tws_ce(1);
  27. udelay(1);
  28. for (; rem > 0; ) {
  29. for (shift = 0, accu = 0;
  30. (rem > 0) && (shift < 8);
  31. rem--, shift++) {
  32. tws_clk(1);
  33. udelay(10);
  34. accu |= (tws_data_read() << shift); /* LSB first */
  35. tws_clk(0);
  36. udelay(10);
  37. }
  38. *buffer++ = accu;
  39. }
  40. /* Lower CE */
  41. tws_ce(0);
  42. return len - rem;
  43. }
  44. /*-----------------------------------------------------------------------
  45. * Write bits
  46. */
  47. int tws_write(uchar *buffer, int len)
  48. {
  49. int rem = len;
  50. uchar accu, shift;
  51. debug("tws_write: buffer %p len %d\n", buffer, len);
  52. /* Configure the data pin for output */
  53. tws_data_config_output(1);
  54. /* Enable WR, i.e. setup a write */
  55. tws_wr(1);
  56. udelay(1);
  57. /* Rise CE */
  58. tws_ce(1);
  59. udelay(1);
  60. for (; rem > 0; ) {
  61. for (shift = 0, accu = *buffer++;
  62. (rem > 0) && (shift < 8);
  63. rem--, shift++) {
  64. tws_data(accu & 0x01); /* LSB first */
  65. tws_clk(1);
  66. udelay(10);
  67. tws_clk(0);
  68. udelay(10);
  69. accu >>= 1;
  70. }
  71. }
  72. /* Lower CE */
  73. tws_ce(0);
  74. return len - rem;
  75. }