sump.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. #include <furi.h>
  2. #include "sump.h"
  3. void sump_handle_query(Sump* sump) {
  4. sump->tx_data(sump->tx_data_ctx, (uint8_t*)"1ALS", 4);
  5. }
  6. void sump_handle_get_metadata(Sump* sump) {
  7. uint8_t buf[128];
  8. size_t pos = 0;
  9. const char* name = "Flipper LogicAnalyzer v1.0 (g3gg0.de)";
  10. const char* fpga = "(none)";
  11. const char* firmware = "v1.0";
  12. const uint8_t probes = 8;
  13. uint32_t max_sample_rate = 10000000;
  14. uint32_t max_sample_mem = MAX_SAMPLE_MEM;
  15. /* 0x01 device name (e.g. "Openbench Logic Sniffer v1.0", "Bus Pirate v3b" */
  16. buf[pos++] = 0x01;
  17. strcpy((char*)&buf[pos], name);
  18. pos += strlen(name) + 1;
  19. /* 0x02 Version of the FPGA firmware */
  20. buf[pos++] = 0x02;
  21. strcpy((char*)&buf[pos], fpga);
  22. pos += strlen(fpga) + 1;
  23. /* 0x03 Ancillary version (PIC firmware) */
  24. buf[pos++] = 0x03;
  25. strcpy((char*)&buf[pos], firmware);
  26. pos += strlen(firmware) + 1;
  27. /* 0x40 Number of usable probes (short) */
  28. buf[pos++] = 0x40;
  29. buf[pos++] = probes;
  30. /* 0x41 Protocol version (short) */
  31. buf[pos++] = 0x41;
  32. buf[pos++] = 0x02;
  33. /* 0x21 Amount of sample memory available (bytes) */
  34. buf[pos++] = 0x21;
  35. buf[pos++] = (max_sample_mem >> 24) & 0xFF;
  36. buf[pos++] = (max_sample_mem >> 16) & 0xFF;
  37. buf[pos++] = (max_sample_mem >> 8) & 0xFF;
  38. buf[pos++] = (max_sample_mem >> 0) & 0xFF;
  39. /* 0x23 Maximum sample rate (hz) */
  40. buf[pos++] = 0x23;
  41. buf[pos++] = (max_sample_rate >> 24) & 0xFF;
  42. buf[pos++] = (max_sample_rate >> 16) & 0xFF;
  43. buf[pos++] = (max_sample_rate >> 8) & 0xFF;
  44. buf[pos++] = (max_sample_rate >> 0) & 0xFF;
  45. /* 0x00 not used, key means end of metadata*/
  46. buf[pos++] = 0x00;
  47. sump->tx_data(sump->tx_data_ctx, buf, pos);
  48. }
  49. uint32_t get_word(uint8_t* data) {
  50. return (data[3] << 24) | (data[2] << 16) | (data[1] << 8) | (data[0] << 0);
  51. }
  52. size_t sump_handle(Sump* sump, uint8_t* data, size_t length) {
  53. size_t pos = 0;
  54. while(pos < length) {
  55. uint8_t command = data[pos];
  56. uint32_t extra = 0;
  57. if(command & 0x80) {
  58. if(length - pos < 5) {
  59. return pos;
  60. }
  61. pos++;
  62. extra = get_word(&data[pos]);
  63. pos += 4;
  64. } else {
  65. pos++;
  66. }
  67. switch(command) {
  68. case SUMP_CMD_RESET:
  69. sump->armed = false;
  70. break;
  71. case SUMP_CMD_ARM:
  72. sump->armed = true;
  73. break;
  74. case SUMP_CMD_QUERY_ID:
  75. sump_handle_query(sump);
  76. break;
  77. case SUMP_CMD_SELF_TEST:
  78. break;
  79. case SUMP_CMD_GET_METADATA:
  80. sump_handle_get_metadata(sump);
  81. break;
  82. case SUMP_CMD_FINISH_NOW:
  83. sump->armed = false;
  84. break;
  85. case SUMP_CMD_XON:
  86. break;
  87. case SUMP_CMD_XOFF:
  88. break;
  89. case SUMP_CMD_SET_READ_DELAY_COUNT:
  90. sump->read_count = 4 * ((extra >> 16) + 1);
  91. sump->delay_count = 4 * ((extra & 0xFFFF) + 1);
  92. break;
  93. case SUMP_CMD_SET_FLAGS:
  94. sump->flags = (extra >> 24);
  95. break;
  96. case SUMP_CMD_SET_DIVIDER:
  97. sump->divider = extra;
  98. break;
  99. case SUMP_CMD_TRIGGER_MASK:
  100. sump->trig_mask = extra;
  101. break;
  102. case SUMP_CMD_TRIGGER_VALUES:
  103. sump->trig_values = extra;
  104. break;
  105. case SUMP_CMD_TRIGGER_CONFIG:
  106. sump->trig_delay = (extra >> 16);
  107. sump->trig_config = (extra & 0xFFFF);
  108. break;
  109. default:
  110. break;
  111. }
  112. }
  113. return pos;
  114. }
  115. Sump* sump_alloc() {
  116. Sump* sump = malloc(sizeof(Sump));
  117. return sump;
  118. }
  119. void sump_free(Sump* sump) {
  120. free(sump);
  121. }