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"}, |