]> mj.ucw.cz Git - home-hw.git/blobdiff - bsb/firmware/interface.h
Merge branch 'master' of ssh://git.ucw.cz/home/mj/GIT/home-hw
[home-hw.git] / bsb / firmware / interface.h
index 84595c29d0e8d9502fb4b5678d5f67be4936b187..6be9f8a1ff06c9da39c8b02dd8d18db133b5b253 100644 (file)
@@ -8,31 +8,61 @@
 #define BSB_USB_PRODUCT 0x0003
 #define BSB_USB_VERSION 0x0100
 
+/*
+ *     Endpoints:
+ *
+ *     0x00 = control endpoint
+ *             Vendor-defined request 0x00 sends struct bsb_stats in little endian.
+ *
+ *     0x01 = bulk endpoint
+ *             Used for sending frames to BSB. Accepts BSB frames. Sender address and CRC
+ *             will be recalculated.
+ *
+ *     0x82 = interrupt endpoint
+ *             Used for receiving frames from BSB and status reports on sent frames.
+ *             The first byte is a status byte (TX_RESULT_xxx), the rest is a frame.
+ *             If status == TX_RESULT_NONE, the frame is a received frame.
+ *             If status == TX_RESULT_OK, the frame is a received reply to the sent frame.
+ *             Otherwise, the status indicates transmit error and the frame is empty.
+ */
+
 // Status sent on the interrupt endpoint
+#define BSB_TX_RESULTS \
+       P(NONE) \
+       P(OK) \
+       P(OVERRUN) \
+       P(MALFORMED) \
+       P(FORBIDDEN) \
+       P(TIMEOUT) \
+       P(TOO_MANY_RETRIES)
+
 enum bsb_tx_result {
-       TX_RESULT_NONE,
-       TX_RESULT_OK,
-       TX_RESULT_OVERRUN,
-       TX_RESULT_MALFORMED,
-       TX_RESULT_FORBIDDEN,
-       TX_RESULT_TIMEOUT,
-       TX_RESULT_TOO_MANY_RETRIES,
+#define P(x) TX_RESULT_##x,
+       BSB_TX_RESULTS
+#undef P
 };
 
-// Sent via USB in little-endian format
+// Statistics sent on the control endpoint
+#define BSB_STATS \
+       P(rx_noise) \
+       P(rx_errors) \
+       P(rx_invalid) \
+       P(rx_overruns) \
+       P(rx_timeouts) \
+       P(rx_bad_crc) \
+       P(rx_ok) \
+       P(tx_overruns) \
+       P(tx_rejects) \
+       P(tx_timeouts) \
+       P(tx_collisions) \
+       P(tx_reply_timeouts) \
+       P(tx_ok_no_reply) \
+       P(tx_ok_replied)
+
 struct bsb_stats {
-       u32 rx_noise;
-       u32 rx_errors;
-       u32 rx_invalid;
-       u32 rx_overruns;
-       u32 rx_timeouts;
-       u32 rx_bad_crc;
-       u32 rx_ok;
-       u32 tx_overruns;
-       u32 tx_rejects;
-       u32 tx_timeouts;
-       u32 tx_collisions;
-       u32 tx_ok;
+#define P(x) u32 x;
+       BSB_STATS
+#undef P
 };
 
 /*
@@ -47,12 +77,21 @@ struct bsb_stats {
  *             16-bit CRC
  */
 
+// Positions of fields in a frame
+enum bsb_frame {
+       BF_SOF,
+       BF_SRC,
+       BF_DEST,
+       BF_LEN,
+       BF_OP,
+};
+
 enum bsb_address {
        BSB_ADDR_BOILER = 0,
        BSB_ADDR_EXT_BOARD = 3,
        BSB_ADDR_ROOM1 = 6,
        BSB_ADDR_ROOM2 = 7,
-       BSB_ADDR_GATEWAY = 0x42,
+       BSB_ADDR_GATEWAY = 0x42,        // That's us
        BSB_ADDR_BROADCAST = 0x7f,
 };