@@ -79,53 +79,33 @@ bool F12::attach(IOService *provider)
79
79
/*
80
80
* Figure out what data is contained in the data registers. HID devices
81
81
* may have registers defined, but their data is not reported in the
82
- * HID attention report. Registers which are not reported in the HID
83
- * attention report check to see if the device is receiving data from
84
- * HID attention reports .
82
+ * HID attention report. As we don't care about pen or acm data, we can do
83
+ * a simplified check for ACM data to get attention size and ignore the data
84
+ * offset .
85
85
*/
86
86
item = rmi_get_register_desc_item (&data_reg_desc, 0 );
87
87
if (item)
88
88
data_offset += item->reg_size ;
89
89
90
90
item = rmi_get_register_desc_item (&data_reg_desc, 1 );
91
91
if (!item) {
92
- return false ;
93
92
IOLogError (" F12 - No Data1 Reg!" );
93
+ return false ;
94
94
}
95
-
96
- data1 = item;
95
+
97
96
data1_offset = data_offset;
98
- data_offset += item->reg_size ;
99
- nbr_fingers = item->num_subpackets ;
100
- report_abs = 1 ;
101
97
attn_size += item->reg_size ;
102
-
103
- item = rmi_get_register_desc_item (&data_reg_desc, 2 );
104
- if (item)
105
- data_offset += item->reg_size ;
106
-
107
- item = rmi_get_register_desc_item (&data_reg_desc, 3 );
108
- if (item)
109
- data_offset += item->reg_size ;
110
-
111
- item = rmi_get_register_desc_item (&data_reg_desc, 4 );
112
- if (item)
113
- data_offset += item->reg_size ;
98
+ nbr_fingers = item->num_subpackets ;
114
99
115
100
item = rmi_get_register_desc_item (&data_reg_desc, 5 );
116
- if (item) {
117
- data5 = item;
118
- data5_offset = data_offset;
119
- data_offset += item->reg_size ;
101
+ if (item)
120
102
attn_size += item->reg_size ;
121
- }
122
103
123
- // Skip 6-15 as they do not increase attention size and only gives relative info
104
+ // Skip 6-15 as they do not increase attention size
124
105
125
106
setProperty (" Number of fingers" , nbr_fingers, 8 );
126
107
IOLogDebug (" F12 - Number of fingers %u" , nbr_fingers);
127
108
128
-
129
109
return true ;
130
110
}
131
111
@@ -267,22 +247,31 @@ int F12::rmi_f12_read_sensor_tuning()
267
247
return 0 ;
268
248
}
269
249
270
- void F12::attention ()
250
+ void F12::attention (AbsoluteTime time, UInt8 *data[], size_t *size )
271
251
{
272
- AbsoluteTime timestamp;
273
-
274
- if (!data1)
275
- return ;
276
-
277
- int retval = readBlock (getDataAddr (), data_pkt, pkt_size);
278
-
279
- if (retval < 0 ) {
280
- IOLogError (" F12 - Failed to read object data. Code: %d" , retval);
281
- return ;
252
+ RMI2DSensorReport report {};
253
+ size_t offset = data1_offset;
254
+
255
+ if (*data) {
256
+ if (*size < attn_size) {
257
+ IOLogError (" F12 attention larger than remaining data" );
258
+ return ;
259
+ }
260
+
261
+ memcpy (data_pkt, *data, attn_size);
262
+ (*data) += attn_size;
263
+ (*size) -= attn_size;
264
+ offset = 0 ;
265
+ } else {
266
+ IOReturn error = readBlock (getDataAddr (), data_pkt, pkt_size);
267
+
268
+ if (error < 0 ) {
269
+ IOLogError (" F12 Could not read attention data: %d" , error);
270
+ return ;
271
+ }
282
272
}
283
273
284
- clock_get_uptime (×tamp);
285
- if (shouldDiscardReport (timestamp))
274
+ if (shouldDiscardReport (time))
286
275
return ;
287
276
288
277
IOLogDebug (" F12 Packet" );
@@ -293,32 +282,29 @@ void F12::attention()
293
282
#endif // debug
294
283
295
284
int fingers = min (nbr_fingers, 5 );
296
- UInt8 *data = &data_pkt[data1_offset];
297
-
298
285
for (int i = 0 ; i < fingers; i++) {
299
- rmi_2d_sensor_abs_object *obj = &report.objs [i];
286
+ rmi_2d_sensor_abs_object &obj = report.objs [i];
287
+ UInt8 *fingerData = &data_pkt[offset + (i * F12_DATA1_BYTES_PER_OBJ)];
300
288
301
- switch (data [0 ]) {
289
+ switch (fingerData [0 ]) {
302
290
case RMI_F12_OBJECT_FINGER:
303
- obj-> type = RMI_2D_OBJECT_FINGER;
291
+ obj. type = RMI_2D_OBJECT_FINGER;
304
292
break ;
305
293
case RMI_F12_OBJECT_STYLUS:
306
- obj-> type = RMI_2D_OBJECT_STYLUS;
294
+ obj. type = RMI_2D_OBJECT_STYLUS;
307
295
break ;
308
296
default :
309
- obj-> type = RMI_2D_OBJECT_NONE;
297
+ obj. type = RMI_2D_OBJECT_NONE;
310
298
}
311
299
312
- obj->x = (data[2 ] << 8 ) | data[1 ];
313
- obj->y = (data[4 ] << 8 ) | data[3 ];
314
- obj->z = data[5 ];
315
- obj->wx = data[6 ];
316
- obj->wy = data[7 ];
317
-
318
- data += F12_DATA1_BYTES_PER_OBJ;
300
+ obj.x = (fingerData[2 ] << 8 ) | fingerData[1 ];
301
+ obj.y = (fingerData[4 ] << 8 ) | fingerData[3 ];
302
+ obj.z = fingerData[5 ];
303
+ obj.wx = fingerData[6 ];
304
+ obj.wy = fingerData[7 ];
319
305
}
320
306
321
- report.timestamp = timestamp ;
307
+ report.timestamp = time ;
322
308
report.fingers = fingers;
323
309
324
310
handleReport (&report);
0 commit comments