94 /** \endcond */ |
94 /** \endcond */ |
95 |
95 |
96 /*****************************************************************************/ |
96 /*****************************************************************************/ |
97 |
97 |
98 /** |
98 /** |
99 SDO constructor. |
99 Sdo constructor. |
100 */ |
100 */ |
101 |
101 |
102 int ec_sdo_init(ec_sdo_t *sdo, /**< SDO */ |
102 int ec_sdo_init(ec_sdo_t *sdo, /**< Sdo */ |
103 uint16_t index, /**< SDO index */ |
103 uint16_t index, /**< Sdo index */ |
104 ec_slave_t *slave /**< parent slave */ |
104 ec_slave_t *slave /**< parent slave */ |
105 ) |
105 ) |
106 { |
106 { |
107 sdo->slave = slave; |
107 sdo->slave = slave; |
108 sdo->index = index; |
108 sdo->index = index; |
120 EC_ERR("Failed to set kobj name.\n"); |
120 EC_ERR("Failed to set kobj name.\n"); |
121 kobject_put(&sdo->kobj); |
121 kobject_put(&sdo->kobj); |
122 return -1; |
122 return -1; |
123 } |
123 } |
124 if (kobject_add(&sdo->kobj)) { |
124 if (kobject_add(&sdo->kobj)) { |
125 EC_ERR("Failed to add SDO kobject.\n"); |
125 EC_ERR("Failed to add Sdo kobject.\n"); |
126 kobject_put(&sdo->kobj); |
126 kobject_put(&sdo->kobj); |
127 return -1; |
127 return -1; |
128 } |
128 } |
129 |
129 |
130 return 0; |
130 return 0; |
131 } |
131 } |
132 |
132 |
133 /*****************************************************************************/ |
133 /*****************************************************************************/ |
134 |
134 |
135 /** |
135 /** |
136 SDO destructor. |
136 Sdo destructor. |
137 Clears and frees an SDO object. |
137 Clears and frees an Sdo object. |
138 */ |
138 */ |
139 |
139 |
140 void ec_sdo_destroy(ec_sdo_t *sdo /**< SDO */) |
140 void ec_sdo_destroy(ec_sdo_t *sdo /**< Sdo */) |
141 { |
141 { |
142 ec_sdo_entry_t *entry, *next; |
142 ec_sdo_entry_t *entry, *next; |
143 |
143 |
144 // free all entries |
144 // free all entries |
145 list_for_each_entry_safe(entry, next, &sdo->entries, list) { |
145 list_for_each_entry_safe(entry, next, &sdo->entries, list) { |
153 } |
153 } |
154 |
154 |
155 /*****************************************************************************/ |
155 /*****************************************************************************/ |
156 |
156 |
157 /** |
157 /** |
158 Clear and free SDO. |
158 Clear and free Sdo. |
159 This method is called by the kobject, |
159 This method is called by the kobject, |
160 once there are no more references to it. |
160 once there are no more references to it. |
161 */ |
161 */ |
162 |
162 |
163 void ec_sdo_clear(struct kobject *kobj /**< SDO's kobject */) |
163 void ec_sdo_clear(struct kobject *kobj /**< Sdo's kobject */) |
164 { |
164 { |
165 ec_sdo_t *sdo = container_of(kobj, ec_sdo_t, kobj); |
165 ec_sdo_t *sdo = container_of(kobj, ec_sdo_t, kobj); |
166 |
166 |
167 if (sdo->name) kfree(sdo->name); |
167 if (sdo->name) kfree(sdo->name); |
168 |
168 |
170 } |
170 } |
171 |
171 |
172 /*****************************************************************************/ |
172 /*****************************************************************************/ |
173 |
173 |
174 /** |
174 /** |
175 * Get and SDO entry from an SDO via its subindex. |
175 * Get and Sdo entry from an Sdo via its subindex. |
176 * \return pointer to SDO entry, or NULL. |
176 * \return pointer to Sdo entry, or NULL. |
177 */ |
177 */ |
178 |
178 |
179 ec_sdo_entry_t *ec_sdo_get_entry( |
179 ec_sdo_entry_t *ec_sdo_get_entry( |
180 ec_sdo_t *sdo, /**< SDO */ |
180 ec_sdo_t *sdo, /**< Sdo */ |
181 uint8_t subindex /**< entry subindex */ |
181 uint8_t subindex /**< entry subindex */ |
182 ) |
182 ) |
183 { |
183 { |
184 ec_sdo_entry_t *entry; |
184 ec_sdo_entry_t *entry; |
185 |
185 |
192 } |
192 } |
193 |
193 |
194 /*****************************************************************************/ |
194 /*****************************************************************************/ |
195 |
195 |
196 /** |
196 /** |
197 * Print SDO information to a buffer. |
197 * Print Sdo information to a buffer. |
198 * /return size of bytes written to buffer. |
198 * /return size of bytes written to buffer. |
199 */ |
199 */ |
200 |
200 |
201 ssize_t ec_sdo_info(ec_sdo_t *sdo, /**< SDO */ |
201 ssize_t ec_sdo_info(ec_sdo_t *sdo, /**< Sdo */ |
202 char *buffer /**< target buffer */ |
202 char *buffer /**< target buffer */ |
203 ) |
203 ) |
204 { |
204 { |
205 off_t off = 0; |
205 off_t off = 0; |
206 |
206 |
212 } |
212 } |
213 |
213 |
214 /*****************************************************************************/ |
214 /*****************************************************************************/ |
215 |
215 |
216 /** |
216 /** |
217 * Show an SDO as Sysfs attribute. |
217 * Show an Sdo as Sysfs attribute. |
218 * /return size of bytes written to buffer. |
218 * /return size of bytes written to buffer. |
219 */ |
219 */ |
220 |
220 |
221 ssize_t ec_show_sdo_attribute(struct kobject *kobj, /**< kobject */ |
221 ssize_t ec_show_sdo_attribute(struct kobject *kobj, /**< kobject */ |
222 struct attribute *attr, |
222 struct attribute *attr, |
233 } |
233 } |
234 |
234 |
235 /*****************************************************************************/ |
235 /*****************************************************************************/ |
236 |
236 |
237 /** |
237 /** |
238 SDO entry constructor. |
238 Sdo entry constructor. |
239 */ |
239 */ |
240 |
240 |
241 int ec_sdo_entry_init(ec_sdo_entry_t *entry, /**< SDO entry */ |
241 int ec_sdo_entry_init(ec_sdo_entry_t *entry, /**< Sdo entry */ |
242 uint8_t subindex, /**< SDO entry subindex */ |
242 uint8_t subindex, /**< Sdo entry subindex */ |
243 ec_sdo_t *sdo /**< parent SDO */ |
243 ec_sdo_t *sdo /**< parent Sdo */ |
244 ) |
244 ) |
245 { |
245 { |
246 entry->sdo = sdo; |
246 entry->sdo = sdo; |
247 entry->subindex = subindex; |
247 entry->subindex = subindex; |
248 entry->data_type = 0x0000; |
248 entry->data_type = 0x0000; |
269 } |
269 } |
270 |
270 |
271 /*****************************************************************************/ |
271 /*****************************************************************************/ |
272 |
272 |
273 /** |
273 /** |
274 SDO entry destructor. |
274 Sdo entry destructor. |
275 Clears and frees an SDO entry object. |
275 Clears and frees an Sdo entry object. |
276 */ |
276 */ |
277 |
277 |
278 void ec_sdo_entry_destroy(ec_sdo_entry_t *entry /**< SDO entry */) |
278 void ec_sdo_entry_destroy(ec_sdo_entry_t *entry /**< Sdo entry */) |
279 { |
279 { |
280 // destroy self |
280 // destroy self |
281 kobject_del(&entry->kobj); |
281 kobject_del(&entry->kobj); |
282 kobject_put(&entry->kobj); |
282 kobject_put(&entry->kobj); |
283 } |
283 } |
284 |
284 |
285 /*****************************************************************************/ |
285 /*****************************************************************************/ |
286 |
286 |
287 /** |
287 /** |
288 Clear and free SDO entry. |
288 Clear and free Sdo entry. |
289 This method is called by the kobject, |
289 This method is called by the kobject, |
290 once there are no more references to it. |
290 once there are no more references to it. |
291 */ |
291 */ |
292 |
292 |
293 void ec_sdo_entry_clear(struct kobject *kobj /**< SDO entry's kobject */) |
293 void ec_sdo_entry_clear(struct kobject *kobj /**< Sdo entry's kobject */) |
294 { |
294 { |
295 ec_sdo_entry_t *entry = container_of(kobj, ec_sdo_entry_t, kobj); |
295 ec_sdo_entry_t *entry = container_of(kobj, ec_sdo_entry_t, kobj); |
296 |
296 |
297 if (entry->description) kfree(entry->description); |
297 if (entry->description) kfree(entry->description); |
298 |
298 |
300 } |
300 } |
301 |
301 |
302 /*****************************************************************************/ |
302 /*****************************************************************************/ |
303 |
303 |
304 /** |
304 /** |
305 * Print SDO entry information to a buffer. |
305 * Print Sdo entry information to a buffer. |
306 * \return number of bytes written. |
306 * \return number of bytes written. |
307 */ |
307 */ |
308 |
308 |
309 ssize_t ec_sdo_entry_info(ec_sdo_entry_t *entry, /**< SDO entry */ |
309 ssize_t ec_sdo_entry_info(ec_sdo_entry_t *entry, /**< Sdo entry */ |
310 char *buffer /**< target buffer */ |
310 char *buffer /**< target buffer */ |
311 ) |
311 ) |
312 { |
312 { |
313 off_t off = 0; |
313 off_t off = 0; |
314 |
314 |
326 /** |
326 /** |
327 * Format entry data based on the CANopen data type and print it to a buffer. |
327 * Format entry data based on the CANopen data type and print it to a buffer. |
328 * \return number of bytes written. |
328 * \return number of bytes written. |
329 */ |
329 */ |
330 |
330 |
331 ssize_t ec_sdo_entry_format_data(ec_sdo_entry_t *entry, /**< SDO entry */ |
331 ssize_t ec_sdo_entry_format_data(ec_sdo_entry_t *entry, /**< Sdo entry */ |
332 ec_sdo_request_t *request, /**< SDO request */ |
332 ec_sdo_request_t *request, /**< Sdo request */ |
333 char *buffer /**< target buffer */ |
333 char *buffer /**< target buffer */ |
334 ) |
334 ) |
335 { |
335 { |
336 off_t off = 0; |
336 off_t off = 0; |
337 unsigned int i; |
337 unsigned int i; |
400 } |
400 } |
401 |
401 |
402 /*****************************************************************************/ |
402 /*****************************************************************************/ |
403 |
403 |
404 /** |
404 /** |
405 * Start SDO entry reading. |
405 * Start Sdo entry reading. |
406 * This function blocks, until reading is finished, and is interruptible as |
406 * This function blocks, until reading is finished, and is interruptible as |
407 * long as the master state machine has not begun with reading. |
407 * long as the master state machine has not begun with reading. |
408 * \return number of bytes written to buffer, or error code. |
408 * \return number of bytes written to buffer, or error code. |
409 */ |
409 */ |
410 |
410 |
411 ssize_t ec_sdo_entry_read_value(ec_sdo_entry_t *entry, /**< SDO entry */ |
411 ssize_t ec_sdo_entry_read_value(ec_sdo_entry_t *entry, /**< Sdo entry */ |
412 char *buffer /**< target buffer */ |
412 char *buffer /**< target buffer */ |
413 ) |
413 ) |
414 { |
414 { |
415 ec_master_t *master = entry->sdo->slave->master; |
415 ec_master_t *master = entry->sdo->slave->master; |
416 off_t off = 0; |
416 off_t off = 0; |
450 } |
450 } |
451 |
451 |
452 /*****************************************************************************/ |
452 /*****************************************************************************/ |
453 |
453 |
454 /** |
454 /** |
455 * Show an SDO entry as Sysfs attribute. |
455 * Show an Sdo entry as Sysfs attribute. |
456 * /return size of bytes written to buffer. |
456 * /return size of bytes written to buffer. |
457 */ |
457 */ |
458 |
458 |
459 ssize_t ec_show_sdo_entry_attribute(struct kobject *kobj, /**< kobject */ |
459 ssize_t ec_show_sdo_entry_attribute(struct kobject *kobj, /**< kobject */ |
460 struct attribute *attr, |
460 struct attribute *attr, |
490 } |
490 } |
491 |
491 |
492 /*****************************************************************************/ |
492 /*****************************************************************************/ |
493 |
493 |
494 /** |
494 /** |
495 SDO request destructor. |
495 Sdo request destructor. |
496 */ |
496 */ |
497 |
497 |
498 void ec_sdo_request_clear(ec_sdo_request_t *req /**< SDO request */) |
498 void ec_sdo_request_clear(ec_sdo_request_t *req /**< Sdo request */) |
499 { |
499 { |
500 if (req->data) kfree(req->data); |
500 if (req->data) kfree(req->data); |
501 } |
501 } |
502 |
502 |
503 /*****************************************************************************/ |
503 /*****************************************************************************/ |