IgH EtherCAT Master  1.5.2
sdo_request.c
Go to the documentation of this file.
1 /******************************************************************************
2  *
3  * $Id$
4  *
5  * Copyright (C) 2006-2008 Florian Pose, Ingenieurgemeinschaft IgH
6  *
7  * This file is part of the IgH EtherCAT Master.
8  *
9  * The IgH EtherCAT Master is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License version 2, as
11  * published by the Free Software Foundation.
12  *
13  * The IgH EtherCAT Master is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
16  * Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License along
19  * with the IgH EtherCAT Master; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21  *
22  * ---
23  *
24  * The license mentioned above concerns the source code only. Using the
25  * EtherCAT technology and brand is only permitted in compliance with the
26  * industrial property and similar rights of Beckhoff Automation GmbH.
27  *
28  *****************************************************************************/
29 
34 /*****************************************************************************/
35 
36 #include <linux/module.h>
37 #include <linux/jiffies.h>
38 #include <linux/slab.h>
39 
40 #include "sdo_request.h"
41 
42 /*****************************************************************************/
43 
46 #define EC_SDO_REQUEST_RESPONSE_TIMEOUT 1000
47 
48 /*****************************************************************************/
49 
51 
52 /*****************************************************************************/
53 
57  ec_sdo_request_t *req
58  )
59 {
60  req->complete_access = 0;
61  req->data = NULL;
62  req->mem_size = 0;
63  req->data_size = 0;
64  req->dir = EC_DIR_INVALID;
65  req->issue_timeout = 0; // no timeout
67  req->state = EC_INT_REQUEST_INIT;
68  req->errno = 0;
69  req->abort_code = 0x00000000;
70 }
71 
72 /*****************************************************************************/
73 
77  ec_sdo_request_t *req
78  )
79 {
81 }
82 
83 /*****************************************************************************/
84 
92  ec_sdo_request_t *req,
93  const ec_sdo_request_t *other
94  )
95 {
96  req->complete_access = other->complete_access;
97  req->index = other->index;
98  req->subindex = other->subindex;
99  return ec_sdo_request_copy_data(req, other->data, other->data_size);
100 }
101 
102 /*****************************************************************************/
103 
107  ec_sdo_request_t *req
108  )
109 {
110  if (req->data) {
111  kfree(req->data);
112  req->data = NULL;
113  }
114 
115  req->mem_size = 0;
116  req->data_size = 0;
117 }
118 
119 /*****************************************************************************/
120 
128  ec_sdo_request_t *req,
129  size_t size
130  )
131 {
132  if (size <= req->mem_size)
133  return 0;
134 
136 
137  if (!(req->data = (uint8_t *) kmalloc(size, GFP_KERNEL))) {
138  EC_ERR("Failed to allocate %zu bytes of SDO memory.\n", size);
139  return -ENOMEM;
140  }
141 
142  req->mem_size = size;
143  req->data_size = 0;
144  return 0;
145 }
146 
147 /*****************************************************************************/
148 
157  ec_sdo_request_t *req,
158  const uint8_t *source,
159  size_t size
160  )
161 {
162  int ret = ec_sdo_request_alloc(req, size);
163  if (ret < 0)
164  return ret;
165 
166  memcpy(req->data, source, size);
167  req->data_size = size;
168  return 0;
169 }
170 
171 /*****************************************************************************/
172 
178 {
179  return req->issue_timeout
180  && jiffies - req->jiffies_start > HZ * req->issue_timeout / 1000;
181 }
182 
183 /*****************************************************************************
184  * Application interface.
185  ****************************************************************************/
186 
187 void ecrt_sdo_request_index(ec_sdo_request_t *req, uint16_t index,
188  uint8_t subindex)
189 {
190  req->index = index;
191  req->subindex = subindex;
192  req->complete_access = 0;
193 }
194 
196 {
197  req->index = index;
198  req->subindex = 0;
199  req->complete_access = 1;
200 }
201 
202 /*****************************************************************************/
203 
204 void ecrt_sdo_request_timeout(ec_sdo_request_t *req, uint32_t timeout)
205 {
206  req->issue_timeout = timeout;
207 }
208 
209 /*****************************************************************************/
210 
212 {
213  return req->data;
214 }
215 
216 /*****************************************************************************/
217 
219 {
220  return req->data_size;
221 }
222 
223 /*****************************************************************************/
224 
226 {
228 }
229 
230 /*****************************************************************************/
231 
233 {
234  req->dir = EC_DIR_INPUT;
235  req->state = EC_INT_REQUEST_QUEUED;
236  req->errno = 0;
237  req->abort_code = 0x00000000;
238  req->jiffies_start = jiffies;
239 }
240 
241 /*****************************************************************************/
242 
244 {
245  req->dir = EC_DIR_OUTPUT;
246  req->state = EC_INT_REQUEST_QUEUED;
247  req->errno = 0;
248  req->abort_code = 0x00000000;
249  req->jiffies_start = jiffies;
250 }
251 
252 /*****************************************************************************/
253 
255 {
256  if (size > req->mem_size) {
257  EC_ERR("Request to write %zu bytes to SDO of size %zu.\n", size, req->mem_size);
258  req->state = EC_INT_REQUEST_FAILURE;
259  return;
260  }
261  req->data_size = size;
262  req->dir = EC_DIR_OUTPUT;
263  req->state = EC_INT_REQUEST_QUEUED;
264  req->errno = 0;
265  req->abort_code = 0x00000000;
266  req->jiffies_start = jiffies;
267 }
268 
269 /*****************************************************************************/
270 
273 EXPORT_SYMBOL(ecrt_sdo_request_index);
274 EXPORT_SYMBOL(ecrt_sdo_request_index_complete);
275 EXPORT_SYMBOL(ecrt_sdo_request_timeout);
276 EXPORT_SYMBOL(ecrt_sdo_request_data);
277 EXPORT_SYMBOL(ecrt_sdo_request_data_size);
278 EXPORT_SYMBOL(ecrt_sdo_request_state);
279 EXPORT_SYMBOL(ecrt_sdo_request_read);
280 EXPORT_SYMBOL(ecrt_sdo_request_write);
281 
284 /*****************************************************************************/
void ecrt_sdo_request_index_complete(ec_sdo_request_t *req, uint16_t index)
Set the SDO index and prepare for complete-access.
Definition: sdo_request.c:195
CANopen SDO request.
Definition: sdo_request.h:48
ec_internal_request_state_t state
SDO request state.
Definition: sdo_request.h:63
uint32_t response_timeout
Maximum time in ms, the transfer is retried, if the slave does not respond.
Definition: sdo_request.h:58
size_t mem_size
Size of SDO data memory.
Definition: sdo_request.h:53
uint16_t index
SDO index.
Definition: sdo_request.h:50
uint32_t abort_code
SDO request abort code.
Definition: sdo_request.h:68
void ec_sdo_request_clear_data(ec_sdo_request_t *)
SDO request destructor.
Definition: sdo_request.c:106
int ec_sdo_request_timed_out(const ec_sdo_request_t *req)
Checks, if the timeout was exceeded.
Definition: sdo_request.c:177
uint8_t * data
Pointer to SDO data.
Definition: sdo_request.h:52
void ecrt_sdo_request_timeout(ec_sdo_request_t *req, uint32_t timeout)
Set the timeout for an SDO request.
Definition: sdo_request.c:204
uint8_t * ecrt_sdo_request_data(ec_sdo_request_t *req)
Access to the SDO request&#39;s data.
Definition: sdo_request.c:211
ec_direction_t dir
Direction.
Definition: sdo_request.h:60
void ecrt_sdo_request_read(ec_sdo_request_t *req)
Schedule an SDO read operation.
Definition: sdo_request.c:232
void ec_sdo_request_clear(ec_sdo_request_t *req)
SDO request destructor.
Definition: sdo_request.c:76
int ec_sdo_request_copy_data(ec_sdo_request_t *req, const uint8_t *source, size_t size)
Copies SDO data from an external source.
Definition: sdo_request.c:156
void ecrt_sdo_request_write_with_size(ec_sdo_request_t *req, size_t size)
Schedule an SDO write operation.
Definition: sdo_request.c:254
EtherCAT CANopen SDO request structure.
int ec_sdo_request_copy(ec_sdo_request_t *req, const ec_sdo_request_t *other)
Copy another SDO request.
Definition: sdo_request.c:91
int errno
Error number.
Definition: sdo_request.h:67
#define EC_SDO_REQUEST_RESPONSE_TIMEOUT
Default timeout in ms to wait for SDO transfer responses.
Definition: sdo_request.c:46
Values read by the master.
Definition: ecrt.h:439
ec_request_state_t ecrt_sdo_request_state(const ec_sdo_request_t *req)
Get the current state of the SDO request.
Definition: sdo_request.c:225
uint8_t subindex
SDO subindex.
Definition: sdo_request.h:51
size_t data_size
Size of SDO data.
Definition: sdo_request.h:54
size_t ecrt_sdo_request_data_size(const ec_sdo_request_t *req)
Returns the current SDO data size.
Definition: sdo_request.c:218
Invalid direction.
Definition: ecrt.h:437
void ec_sdo_request_init(ec_sdo_request_t *req)
SDO request constructor.
Definition: sdo_request.c:56
#define EC_ERR(fmt, args...)
Convenience macro for printing EtherCAT-specific errors to syslog.
Definition: globals.h:262
ec_request_state_t
Request state.
Definition: ecrt.h:537
int ec_sdo_request_alloc(ec_sdo_request_t *req, size_t size)
Pre-allocates the data memory.
Definition: sdo_request.c:127
Values written by the master.
Definition: ecrt.h:438
const ec_request_state_t ec_request_state_translation_table[]
Global request state type translation table.
Definition: module.c:665
uint32_t issue_timeout
Maximum time in ms, the processing of the request may take.
Definition: sdo_request.h:56
void ecrt_sdo_request_write(ec_sdo_request_t *req)
Schedule an SDO write operation.
Definition: sdo_request.c:243
unsigned long jiffies_start
Jiffies, when the request was issued.
Definition: sdo_request.h:64
uint8_t complete_access
SDO shall be transferred completely.
Definition: sdo_request.h:55
void ecrt_sdo_request_index(ec_sdo_request_t *req, uint16_t index, uint8_t subindex)
Set the SDO index and subindex and prepare for non-complete-access.
Definition: sdo_request.c:187