XCORE SDK
XCORE Software Development Kit
control_host_support.h
1 // Copyright 2016-2021 XMOS LIMITED.
2 // This Software is subject to the terms of the XMOS Public Licence: Version 1.
3 #ifndef __control_host_support_h__
4 #define __control_host_support_h__
5 
6 #include <stdint.h>
7 #include <stddef.h>
8 #include <string.h>
9 #include <assert.h>
10 #include "device_control_shared.h"
11 
12 #if USE_XSCOPE
13 static inline size_t
14 control_xscope_create_upload_buffer(uint32_t buffer[XSCOPE_UPLOAD_MAX_WORDS],
15  control_cmd_t cmd, control_resid_t resid,
16  const uint8_t *payload, unsigned payload_len)
17 {
18  const size_t header_size = sizeof(struct control_xscope_response);
19  struct control_xscope_packet *p;
20 
21  p = (struct control_xscope_packet*)buffer;
22 
23  p->resid = resid;
24  p->cmd = cmd;
25 
26  assert(payload_len <= XSCOPE_DATA_MAX_BYTES && "payload length can't be represented as a uint8_t");
27  p->payload_len = (uint8_t)payload_len;
28 
29  if (!IS_CONTROL_CMD_READ(cmd) && payload != NULL) {
30  if (payload_len + header_size <= XSCOPE_UPLOAD_MAX_WORDS * sizeof(uint32_t)) {
31  memcpy((uint8_t*)buffer + header_size, payload, payload_len);
32  }
33  return header_size + payload_len;
34  }
35  else {
36  return header_size;
37  }
38 }
39 #endif
40 
41 #if USE_USB
42 #define USB_TRANSACTION_MAX_BYTES 64
43 static inline void
44 control_usb_fill_header(uint16_t *windex, uint16_t *wvalue, uint16_t *wlength,
45  control_resid_t resid, control_cmd_t cmd, unsigned payload_len)
46 {
47  *windex = resid;
48  *wvalue = cmd;
49 
50  assert(payload_len < (1<<16) && "payload length can't be represented as a uint16_t");
51  *wlength = (uint16_t)payload_len;
52 }
53 #endif
54 
55 #if USE_SPI
56 static inline size_t
57 control_build_spi_data(uint8_t data[SPI_TRANSACTION_MAX_BYTES],
58  control_resid_t resid, control_cmd_t cmd,
59  const uint8_t payload[], unsigned payload_len)
60 {
61  data[0] = resid;
62  data[1] = cmd;
63  data[2] = (uint8_t) payload_len;
64 
65  for(unsigned i=0; i<5; ++i)
66  data[3+i] = 0;
67 
68  if (IS_CONTROL_CMD_READ(cmd)) return 8;
69 
70  for(unsigned i=0; i<payload_len; ++i)
71  data[3 + i] = payload[i];
72 
73  return 3 + payload_len;
74 }
75 #endif
76 
77 #if USE_I2C
78 #define I2C_TRANSACTION_MAX_BYTES 256
79 #define I2C_DATA_MAX_BYTES (I2C_TRANSACTION_MAX_BYTES - 3)
80 static inline size_t
81 control_build_i2c_data(uint8_t data[I2C_TRANSACTION_MAX_BYTES],
82  control_resid_t resid, control_cmd_t cmd,
83  const uint8_t payload[], unsigned payload_len)
84 {
85  unsigned i;
86 
87  data[0] = resid;
88  data[1] = cmd;
89  data[2] = (uint8_t)payload_len;
90 
91  if (IS_CONTROL_CMD_READ(cmd)) {
92  return 3;
93  }
94  else {
95  for (i = 0; i < payload_len; i++) {
96  data[3 + i] = payload[i];
97  }
98  return 3 + payload_len;
99  }
100 }
101 #endif
102 
103 #endif // __control_host_support_h__
uint8_t control_resid_t
Definition: device_control_shared.h:27
#define IS_CONTROL_CMD_READ(c)
Definition: device_control_shared.h:62