* Vendor-defined request 0x00 sends struct bsb_stats in little endian.
*
* 0x01 = bulk endpoint
- * Used for sending frames to BSB.
+ * Used for sending frames to BSB. Accepts BSB frames. CRC will be calculated
+ * automatically.
*
* 0x82 = interrupt endpoint
- * Used for receiving frames from BSB.
- * Also transmits 1-byte status reports on frames sent on endpoint 0x01.
+ * 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
P(tx_rejects) \
P(tx_timeouts) \
P(tx_collisions) \
- P(tx_ok)
-
- 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;
+ P(tx_reply_timeouts) \
+ P(tx_ok_no_reply) \
+ P(tx_ok_replied)
struct bsb_stats {
#define P(x) u32 x;
* 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,
};