bus.c 2.7 KB

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