master/slave.c
changeset 182 8c0bc99229a9
parent 175 2e4b18203ade
child 183 8ae1e011e96c
equal deleted inserted replaced
181:3e9155836bc7 182:8c0bc99229a9
    22 int ec_slave_fetch_strings(ec_slave_t *, const uint8_t *);
    22 int ec_slave_fetch_strings(ec_slave_t *, const uint8_t *);
    23 int ec_slave_fetch_general(ec_slave_t *, const uint8_t *);
    23 int ec_slave_fetch_general(ec_slave_t *, const uint8_t *);
    24 int ec_slave_fetch_sync(ec_slave_t *, const uint8_t *, size_t);
    24 int ec_slave_fetch_sync(ec_slave_t *, const uint8_t *, size_t);
    25 int ec_slave_fetch_pdo(ec_slave_t *, const uint8_t *, size_t, ec_pdo_type_t);
    25 int ec_slave_fetch_pdo(ec_slave_t *, const uint8_t *, size_t, ec_pdo_type_t);
    26 int ec_slave_locate_string(ec_slave_t *, unsigned int, char **);
    26 int ec_slave_locate_string(ec_slave_t *, unsigned int, char **);
       
    27 ssize_t ec_show_slave_attribute(struct kobject *, struct attribute *, char *);
       
    28 
       
    29 /*****************************************************************************/
       
    30 
       
    31 static struct attribute attr_ring_position = {
       
    32     .name = "ring_position",
       
    33     .owner = THIS_MODULE,
       
    34     .mode = S_IRUGO
       
    35 };
       
    36 
       
    37 static struct attribute *def_attrs[] = {
       
    38     &attr_ring_position,
       
    39     NULL,
       
    40 };
       
    41 
       
    42 static struct sysfs_ops sysfs_ops = {
       
    43     .show = &ec_show_slave_attribute,
       
    44     .store = NULL
       
    45 };
       
    46 
       
    47 static struct kobj_type ktype_ec_slave = {
       
    48     .release = ec_slave_clear,
       
    49     .sysfs_ops = &sysfs_ops,
       
    50     .default_attrs = def_attrs
       
    51 };
    27 
    52 
    28 /*****************************************************************************/
    53 /*****************************************************************************/
    29 
    54 
    30 const ec_code_msg_t al_status_messages[];
    55 const ec_code_msg_t al_status_messages[];
    31 
    56 
    33 
    58 
    34 /**
    59 /**
    35    EtherCAT-Slave-Konstruktor.
    60    EtherCAT-Slave-Konstruktor.
    36 */
    61 */
    37 
    62 
    38 void ec_slave_init(ec_slave_t *slave, /**< EtherCAT-Slave */
    63 int ec_slave_init(ec_slave_t *slave, /**< EtherCAT-Slave */
    39                    ec_master_t *master /**< EtherCAT-Master */
    64                   ec_master_t *master, /**< EtherCAT-Master */
    40                    )
    65                   uint16_t ring_position, /**< Ringposition */
       
    66                   uint16_t station_address /**< Programmierte Adresse */
       
    67                   )
    41 {
    68 {
    42     unsigned int i;
    69     unsigned int i;
    43 
    70 
       
    71     slave->ring_position = ring_position;
       
    72     slave->station_address = station_address;
       
    73 
       
    74     // Init kobject and add it to the hierarchy
       
    75     memset(&slave->kobj, 0x00, sizeof(struct kobject));
       
    76     kobject_init(&slave->kobj);
       
    77     slave->kobj.ktype = &ktype_ec_slave;
       
    78     slave->kobj.parent = &master->kobj;
       
    79     if (kobject_set_name(&slave->kobj, "slave%03i", slave->ring_position)) {
       
    80         EC_ERR("Failed to set kobject name.\n");
       
    81         kobject_put(&slave->kobj);
       
    82         return -1;
       
    83     }
       
    84 
    44     slave->master = master;
    85     slave->master = master;
       
    86     slave->buscoupler_index = 0;
       
    87     slave->index_after_buscoupler = 0xFFFF;
    45     slave->base_type = 0;
    88     slave->base_type = 0;
    46     slave->base_revision = 0;
    89     slave->base_revision = 0;
    47     slave->base_build = 0;
    90     slave->base_build = 0;
    48     slave->base_fmmu_count = 0;
    91     slave->base_fmmu_count = 0;
    49     slave->base_sync_count = 0;
    92     slave->base_sync_count = 0;
    50     slave->ring_position = 0;
       
    51     slave->station_address = 0;
       
    52     slave->sii_alias = 0;
    93     slave->sii_alias = 0;
    53     slave->sii_vendor_id = 0;
    94     slave->sii_vendor_id = 0;
    54     slave->sii_product_code = 0;
    95     slave->sii_product_code = 0;
    55     slave->sii_revision_number = 0;
    96     slave->sii_revision_number = 0;
    56     slave->sii_serial_number = 0;
    97     slave->sii_serial_number = 0;
    76     for (i = 0; i < 2; i++) {
   117     for (i = 0; i < 2; i++) {
    77         slave->dl_status_link[i] = 0;
   118         slave->dl_status_link[i] = 0;
    78         slave->dl_status_loop[i] = 0;
   119         slave->dl_status_loop[i] = 0;
    79         slave->dl_status_comm[i] = 0;
   120         slave->dl_status_comm[i] = 0;
    80     }
   121     }
       
   122 
       
   123     return 0;
    81 }
   124 }
    82 
   125 
    83 /*****************************************************************************/
   126 /*****************************************************************************/
    84 
   127 
    85 /**
   128 /**
    86    EtherCAT-Slave-Destruktor.
   129    EtherCAT-Slave-Destruktor.
    87 */
   130 */
    88 
   131 
    89 void ec_slave_clear(ec_slave_t *slave /**< EtherCAT-Slave */)
   132 void ec_slave_clear(struct kobject *kobj /**< KObject des Slaves */)
    90 {
   133 {
       
   134     ec_slave_t *slave;
    91     ec_eeprom_string_t *string, *next_str;
   135     ec_eeprom_string_t *string, *next_str;
    92     ec_eeprom_sync_t *sync, *next_sync;
   136     ec_eeprom_sync_t *sync, *next_sync;
    93     ec_eeprom_pdo_t *pdo, *next_pdo;
   137     ec_eeprom_pdo_t *pdo, *next_pdo;
    94     ec_eeprom_pdo_entry_t *entry, *next_ent;
   138     ec_eeprom_pdo_entry_t *entry, *next_ent;
    95     ec_sdo_t *sdo, *next_sdo;
   139     ec_sdo_t *sdo, *next_sdo;
    96     ec_sdo_entry_t *en, *next_en;
   140     ec_sdo_entry_t *en, *next_en;
       
   141 
       
   142     slave = container_of(kobj, ec_slave_t, kobj);
    97 
   143 
    98     // Alle Strings freigeben
   144     // Alle Strings freigeben
    99     list_for_each_entry_safe(string, next_str, &slave->eeprom_strings, list) {
   145     list_for_each_entry_safe(string, next_str, &slave->eeprom_strings, list) {
   100         list_del(&string->list);
   146         list_del(&string->list);
   101         kfree(string);
   147         kfree(string);
  1141     return ec_slave_sii_write16(slave, 0x0004, alias);
  1187     return ec_slave_sii_write16(slave, 0x0004, alias);
  1142 }
  1188 }
  1143 
  1189 
  1144 /*****************************************************************************/
  1190 /*****************************************************************************/
  1145 
  1191 
       
  1192 /**
       
  1193    Formatiert Attribut-Daten für lesenden Zugriff im SysFS
       
  1194 
       
  1195    \return Anzahl Bytes im Speicher
       
  1196 */
       
  1197 
       
  1198 ssize_t ec_show_slave_attribute(struct kobject *kobj, /**< KObject */
       
  1199                                 struct attribute *attr, /**< Attribut */
       
  1200                                 char *buffer /**< Speicher für die Daten */
       
  1201                                 )
       
  1202 {
       
  1203     ec_slave_t *slave = container_of(kobj, ec_slave_t, kobj);
       
  1204 
       
  1205     if (attr == &attr_ring_position) {
       
  1206         return sprintf(buffer, "%i\n", slave->ring_position);
       
  1207     }
       
  1208 
       
  1209     return 0;
       
  1210 }
       
  1211 
       
  1212 /*****************************************************************************/
       
  1213 
  1146 const ec_code_msg_t al_status_messages[] = {
  1214 const ec_code_msg_t al_status_messages[] = {
  1147     {0x0001, "Unspecified error"},
  1215     {0x0001, "Unspecified error"},
  1148     {0x0011, "Invalud requested state change"},
  1216     {0x0011, "Invalud requested state change"},
  1149     {0x0012, "Unknown requested state"},
  1217     {0x0012, "Unknown requested state"},
  1150     {0x0013, "Bootstrap not supported"},
  1218     {0x0013, "Bootstrap not supported"},