master/canopen.c
changeset 814 a51f857b1b2d
parent 758 8fa6f825eb7d
child 831 ded9519c8d6e
equal deleted inserted replaced
813:bfc3f1ab52de 814:a51f857b1b2d
    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,
   474 }
   474 }
   475 
   475 
   476 /*****************************************************************************/
   476 /*****************************************************************************/
   477 
   477 
   478 /**
   478 /**
   479    SDO request constructor.
   479    Sdo request constructor.
   480 */
   480 */
   481 
   481 
   482 void ec_sdo_request_init_read(ec_sdo_request_t *req, /**< SDO request */
   482 void ec_sdo_request_init_read(ec_sdo_request_t *req, /**< Sdo request */
   483                               ec_sdo_entry_t *entry /**< SDO entry */
   483                               ec_sdo_entry_t *entry /**< Sdo entry */
   484                               )
   484                               )
   485 {
   485 {
   486     req->entry = entry;
   486     req->entry = entry;
   487     req->data = NULL;
   487     req->data = NULL;
   488     req->size = 0;
   488     req->size = 0;
   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 /*****************************************************************************/