equal
deleted
inserted
replaced
46 |
46 |
47 /** VoE mailbox type. |
47 /** VoE mailbox type. |
48 */ |
48 */ |
49 #define EC_MBOX_TYPE_VOE 0xff |
49 #define EC_MBOX_TYPE_VOE 0xff |
50 |
50 |
|
51 /** VoE header size. |
|
52 */ |
|
53 #define EC_VOE_HEADER_SIZE 6 |
|
54 |
51 /** VoE response timeout in [ms]. |
55 /** VoE response timeout in [ms]. |
52 */ |
56 */ |
53 #define EC_VOE_RESPONSE_TIMEOUT 500 |
57 #define EC_VOE_RESPONSE_TIMEOUT 500 |
54 |
58 |
55 /*****************************************************************************/ |
59 /*****************************************************************************/ |
75 ec_slave_config_t *sc, /**< Parent slave configuration. */ |
79 ec_slave_config_t *sc, /**< Parent slave configuration. */ |
76 size_t size /**< Size of memory to reserve. */ |
80 size_t size /**< Size of memory to reserve. */ |
77 ) |
81 ) |
78 { |
82 { |
79 voe->config = sc; |
83 voe->config = sc; |
|
84 voe->vendor_id = 0x00000000; |
|
85 voe->vendor_type = 0x0000; |
80 voe->data_size = 0; |
86 voe->data_size = 0; |
81 voe->dir = EC_DIR_INVALID; |
87 voe->dir = EC_DIR_INVALID; |
82 voe->state = ec_voe_handler_state_error; |
88 voe->state = ec_voe_handler_state_error; |
83 voe->request_state = EC_INT_REQUEST_INIT; |
89 voe->request_state = EC_INT_REQUEST_INIT; |
84 |
90 |
85 ec_datagram_init(&voe->datagram); |
91 ec_datagram_init(&voe->datagram); |
86 if (ec_datagram_prealloc(&voe->datagram, size + 6)) |
92 if (ec_datagram_prealloc(&voe->datagram, |
|
93 size + EC_MBOX_HEADER_SIZE + EC_VOE_HEADER_SIZE)) |
87 return -1; |
94 return -1; |
88 |
95 |
89 return 0; |
96 return 0; |
90 } |
97 } |
91 |
98 |
102 |
109 |
103 /***************************************************************************** |
110 /***************************************************************************** |
104 * Application interface. |
111 * Application interface. |
105 ****************************************************************************/ |
112 ****************************************************************************/ |
106 |
113 |
|
114 void ecrt_voe_handler_header(ec_voe_handler_t *voe, uint32_t vendor_id, |
|
115 uint16_t vendor_type) |
|
116 { |
|
117 voe->vendor_id = vendor_id; |
|
118 voe->vendor_type = vendor_type; |
|
119 } |
|
120 |
|
121 /*****************************************************************************/ |
|
122 |
107 uint8_t *ecrt_voe_handler_data(ec_voe_handler_t *voe) |
123 uint8_t *ecrt_voe_handler_data(ec_voe_handler_t *voe) |
108 { |
124 { |
109 return voe->datagram.data + 6; |
125 return voe->datagram.data + EC_MBOX_HEADER_SIZE + EC_VOE_HEADER_SIZE; |
110 } |
126 } |
111 |
127 |
112 /*****************************************************************************/ |
128 /*****************************************************************************/ |
113 |
129 |
114 size_t ecrt_voe_handler_data_size(const ec_voe_handler_t *voe) |
130 size_t ecrt_voe_handler_data_size(const ec_voe_handler_t *voe) |
128 /*****************************************************************************/ |
144 /*****************************************************************************/ |
129 |
145 |
130 void ecrt_voe_handler_write(ec_voe_handler_t *voe, size_t size) |
146 void ecrt_voe_handler_write(ec_voe_handler_t *voe, size_t size) |
131 { |
147 { |
132 voe->dir = EC_DIR_OUTPUT; |
148 voe->dir = EC_DIR_OUTPUT; |
133 voe->datagram.data_size = size + 6; |
149 voe->data_size = size; |
134 voe->state = ec_voe_handler_state_write_start; |
150 voe->state = ec_voe_handler_state_write_start; |
135 voe->request_state = EC_INT_REQUEST_QUEUED; |
151 voe->request_state = EC_INT_REQUEST_QUEUED; |
136 } |
152 } |
137 |
153 |
138 /*****************************************************************************/ |
154 /*****************************************************************************/ |
172 voe->request_state = EC_INT_REQUEST_FAILURE; |
188 voe->request_state = EC_INT_REQUEST_FAILURE; |
173 return; |
189 return; |
174 } |
190 } |
175 |
191 |
176 if (!(data = ec_slave_mbox_prepare_send(slave, &voe->datagram, |
192 if (!(data = ec_slave_mbox_prepare_send(slave, &voe->datagram, |
177 EC_MBOX_TYPE_VOE, voe->data_size))) { |
193 EC_MBOX_TYPE_VOE, EC_VOE_HEADER_SIZE + voe->data_size))) { |
178 voe->state = ec_voe_handler_state_error; |
194 voe->state = ec_voe_handler_state_error; |
179 voe->request_state = EC_INT_REQUEST_FAILURE; |
195 voe->request_state = EC_INT_REQUEST_FAILURE; |
180 return; |
196 return; |
181 } |
197 } |
|
198 |
|
199 EC_WRITE_U32(data, voe->vendor_id); |
|
200 EC_WRITE_U16(data + 4, voe->vendor_type); |
182 |
201 |
183 voe->retries = EC_FSM_RETRIES; |
202 voe->retries = EC_FSM_RETRIES; |
184 voe->jiffies_start = jiffies; |
203 voe->jiffies_start = jiffies; |
185 voe->state = ec_voe_handler_state_write_response; |
204 voe->state = ec_voe_handler_state_write_response; |
186 } |
205 } |
351 EC_WARN("Received mailbox protocol 0x%02X as response.\n", mbox_prot); |
370 EC_WARN("Received mailbox protocol 0x%02X as response.\n", mbox_prot); |
352 ec_print_data(data, rec_size); |
371 ec_print_data(data, rec_size); |
353 return; |
372 return; |
354 } |
373 } |
355 |
374 |
|
375 if (rec_size < EC_VOE_HEADER_SIZE) { |
|
376 voe->state = ec_voe_handler_state_error; |
|
377 voe->request_state = EC_INT_REQUEST_FAILURE; |
|
378 EC_ERR("Received VoE header is incomplete (%u bytes)!\n", rec_size); |
|
379 return; |
|
380 } |
|
381 |
356 if (master->debug_level) { |
382 if (master->debug_level) { |
357 EC_DBG("VoE data:\n"); |
383 EC_DBG("VoE data:\n"); |
358 ec_print_data(data, rec_size); |
384 ec_print_data(data, rec_size); |
359 } |
385 } |
360 |
386 |
361 voe->data_size = rec_size; |
387 voe->data_size = rec_size - EC_VOE_HEADER_SIZE; |
362 voe->request_state = EC_INT_REQUEST_SUCCESS; |
388 voe->request_state = EC_INT_REQUEST_SUCCESS; |
363 voe->state = ec_voe_handler_state_end; // success |
389 voe->state = ec_voe_handler_state_end; // success |
364 } |
390 } |
365 |
391 |
366 /*****************************************************************************/ |
392 /*****************************************************************************/ |
377 |
403 |
378 /*****************************************************************************/ |
404 /*****************************************************************************/ |
379 |
405 |
380 /** \cond */ |
406 /** \cond */ |
381 |
407 |
|
408 EXPORT_SYMBOL(ecrt_voe_handler_header); |
382 EXPORT_SYMBOL(ecrt_voe_handler_data); |
409 EXPORT_SYMBOL(ecrt_voe_handler_data); |
383 EXPORT_SYMBOL(ecrt_voe_handler_data_size); |
410 EXPORT_SYMBOL(ecrt_voe_handler_data_size); |
384 EXPORT_SYMBOL(ecrt_voe_handler_read); |
411 EXPORT_SYMBOL(ecrt_voe_handler_read); |
385 EXPORT_SYMBOL(ecrt_voe_handler_write); |
412 EXPORT_SYMBOL(ecrt_voe_handler_write); |
386 EXPORT_SYMBOL(ecrt_voe_handler_execute); |
413 EXPORT_SYMBOL(ecrt_voe_handler_execute); |