bus.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #include "bus.h"
  2. #include "timer.h"
  3. #include "io.h"
  4. void file_produce(file_t* f, char x)
  5. {
  6. f->buffer[f->t]=x;
  7. f->t=(f->t+1)%1024;
  8. }
  9. char file_consume(file_t* f)
  10. {
  11. char x;
  12. while(f->t==f->q) micro_sleep(10);
  13. x=f->buffer[f->q];
  14. f->q=(f->q+1)%1024;
  15. return x;
  16. }
  17. int file_size(file_t* f)
  18. {
  19. return (f->t>=f->q)?f->t-f->q:1024-f->q+f->t;
  20. }
  21. void file_init(file_t* file)
  22. {
  23. file->t=file->q=0;
  24. }
  25. void bus_init_recv(bus_t* bus, int d, int clk, int ack)
  26. {
  27. bus->data=d;
  28. bus->clk=clk;
  29. bus->ack=ack;
  30. bus->ismaster=0;
  31. file_init(&bus->buffer);
  32. }
  33. void bus_init_send(bus_t* bus, int d, int clk, int ack)
  34. {
  35. bus->data=d;
  36. bus->clk=clk;
  37. bus->ack=ack;
  38. bus->ismaster=1;
  39. file_init(&bus->buffer);
  40. }
  41. void _bus_write(bus_t* bus, char x)
  42. {
  43. int i;
  44. if(!bus->ismaster) return;
  45. for(i=0; i<8; i++)
  46. {
  47. while(read_pin(bus->ack)) micro_sleep(10);
  48. write_pin(bus->data, (x&(1<<i))?1:0);
  49. write_pin(bus->clk, 1);
  50. while(!read_pin(bus->ack)) micro_sleep(10);
  51. write_pin(bus->clk, 0);
  52. }
  53. }
  54. char _bus_read(bus_t* bus)
  55. {
  56. int x=0, i, j=0;
  57. if(bus->ismaster) return -1;
  58. for(i=0; i<8; i++)
  59. {
  60. write_pin(bus->ack, 0);
  61. while(!read_pin(bus->clk)) micro_sleep(10);
  62. j=read_pin(bus->data);
  63. x+=j<<i;
  64. write_pin(bus->ack, 1);
  65. micro_sleep(50);
  66. write_pin(bus->ack, 0);
  67. }
  68. return x;
  69. }
  70. void* bus_send_thread(void* _bus)
  71. {
  72. bus_t* bus = (bus_t*)_bus;
  73. if(!bus->ismaster) return NULL;
  74. while(1)
  75. {
  76. while(!file_size(&bus->buffer)) micro_sleep(10);
  77. _bus_write(bus, file_consume(&bus->buffer));
  78. }
  79. return NULL;
  80. }
  81. void* bus_recv_thread(void* _bus)
  82. {
  83. bus_t* bus = (bus_t*)_bus;
  84. if(bus->ismaster) return NULL;
  85. while(1)
  86. {
  87. file_produce(&bus->buffer, _bus_read(bus));
  88. }
  89. return NULL;
  90. }
  91. void bus_write(bus_t* bus, const void* x, int length)
  92. {
  93. const uint8_t *iter=(const uint8_t*)x;
  94. int i;
  95. if(!bus->ismaster) return;
  96. for(i=0; i<length; i++)
  97. file_produce(&bus->buffer, iter[i]);
  98. }
  99. void bus_read(bus_t* bus, void* x, int length)
  100. {
  101. #ifdef __linux__
  102. #ifdef ARM
  103. uint8_t *iter=(uint8_t*)x;
  104. int i;
  105. if(bus->ismaster) return;
  106. for(i=0; i<length; i++)
  107. iter[i]=file_consume(&bus->buffer);
  108. #else
  109. static uint64_t old=0;
  110. int i;
  111. struct timeval tv;
  112. sleep(1);
  113. gettimeofday(&tv, NULL);
  114. *(uint32_t*)x=(tv.tv_sec-old)*1000000;
  115. old=tv.tv_sec;
  116. #endif
  117. #endif
  118. }
  119. void bus_write_sync(bus_t* bus, const void* x, int length)
  120. {
  121. const uint8_t *iter=(const uint8_t*)x;
  122. int i;
  123. if(!bus->ismaster) return;
  124. for(i=0; i<length; i++)
  125. _bus_write(bus, iter[i]);
  126. }