Lines Matching +full:data +full:- +full:sheet

9  * SPDX-License-Identifier: GPL-2.0-or-later
13 * The I2C address associated with this device is set on the command-line when
16 * Get and set functions for 'mag-x', 'mag-y' and 'mag-z' assume that
78 * in units "lsb per Gauss" (see data sheet table 3). There is no documented
89 int gm = extract32(s->crb, 5, 3); in lsm303dlhc_mag_get_x()
92 int64_t value = muldiv64(s->x, 100000, xy_gain[gm]); in lsm303dlhc_mag_get_x()
100 int gm = extract32(s->crb, 5, 3); in lsm303dlhc_mag_get_y()
103 int64_t value = muldiv64(s->y, 100000, xy_gain[gm]); in lsm303dlhc_mag_get_y()
111 int gm = extract32(s->crb, 5, 3); in lsm303dlhc_mag_get_z()
114 int64_t value = muldiv64(s->z, 100000, z_gain[gm]); in lsm303dlhc_mag_get_z()
124 int gm = extract32(s->crb, 5, 3); in lsm303dlhc_mag_set_x()
132 /* Make sure we are within a 12-bit limit. */ in lsm303dlhc_mag_set_x()
133 if (reg > 2047 || reg < -2048) { in lsm303dlhc_mag_set_x()
138 s->x = (int16_t)reg; in lsm303dlhc_mag_set_x()
147 int gm = extract32(s->crb, 5, 3); in lsm303dlhc_mag_set_y()
155 /* Make sure we are within a 12-bit limit. */ in lsm303dlhc_mag_set_y()
156 if (reg > 2047 || reg < -2048) { in lsm303dlhc_mag_set_y()
161 s->y = (int16_t)reg; in lsm303dlhc_mag_set_y()
170 int gm = extract32(s->crb, 5, 3); in lsm303dlhc_mag_set_z()
178 /* Make sure we are within a 12-bit limit. */ in lsm303dlhc_mag_set_z()
179 if (reg > 2047 || reg < -2048) { in lsm303dlhc_mag_set_z()
184 s->z = (int16_t)reg; in lsm303dlhc_mag_set_z()
198 value = s->temperature * 125; in lsm303dlhc_mag_get_temperature()
220 if (value > 2047 || value < -2048) { in lsm303dlhc_mag_set_temperature()
225 s->temperature = (int16_t)value; in lsm303dlhc_mag_set_temperature()
237 s->sr = 0x3; in lsm303dlhc_mag_read()
241 * that 'mag-x', 'mag-y', 'mag-z' and 'temperature' can continue to be in lsm303dlhc_mag_read()
244 s->x_lock = s->x; in lsm303dlhc_mag_read()
245 s->z_lock = s->z; in lsm303dlhc_mag_read()
246 s->y_lock = s->y; in lsm303dlhc_mag_read()
247 s->temperature_lock = s->temperature; in lsm303dlhc_mag_read()
259 s->sr = 0x1; in lsm303dlhc_mag_finish()
267 switch (s->pointer) { in lsm303dlhc_mag_write()
269 s->cra = s->buf; in lsm303dlhc_mag_write()
273 if (s->buf >> 5 == 0) { in lsm303dlhc_mag_write()
274 s->buf = 1 << 5; in lsm303dlhc_mag_write()
276 s->crb = s->buf; in lsm303dlhc_mag_write()
279 s->mr = s->buf; in lsm303dlhc_mag_write()
282 s->sr = s->buf; in lsm303dlhc_mag_write()
285 s->ira = s->buf; in lsm303dlhc_mag_write()
288 s->irb = s->buf; in lsm303dlhc_mag_write()
291 s->irc = s->buf; in lsm303dlhc_mag_write()
294 qemu_log_mask(LOG_GUEST_ERROR, "reg is read-only: 0x%02X", s->buf); in lsm303dlhc_mag_write()
300 * Low-level master-to-slave transaction handler.
302 static int lsm303dlhc_mag_send(I2CSlave *i2c, uint8_t data) in lsm303dlhc_mag_send() argument
306 if (s->len == 0) { in lsm303dlhc_mag_send()
308 s->pointer = data; in lsm303dlhc_mag_send()
309 s->len++; in lsm303dlhc_mag_send()
310 } else if (s->len == 1) { in lsm303dlhc_mag_send()
312 s->buf = data; in lsm303dlhc_mag_send()
322 * Low-level slave-to-master transaction handler (read attempts).
329 switch (s->pointer) { in lsm303dlhc_mag_recv()
331 resp = s->cra; in lsm303dlhc_mag_recv()
334 resp = s->crb; in lsm303dlhc_mag_recv()
337 resp = s->mr; in lsm303dlhc_mag_recv()
340 resp = (uint8_t)(s->x_lock >> 8); in lsm303dlhc_mag_recv()
343 resp = (uint8_t)(s->x_lock); in lsm303dlhc_mag_recv()
346 resp = (uint8_t)(s->z_lock >> 8); in lsm303dlhc_mag_recv()
349 resp = (uint8_t)(s->z_lock); in lsm303dlhc_mag_recv()
352 resp = (uint8_t)(s->y_lock >> 8); in lsm303dlhc_mag_recv()
355 resp = (uint8_t)(s->y_lock); in lsm303dlhc_mag_recv()
358 resp = s->sr; in lsm303dlhc_mag_recv()
361 resp = s->ira; in lsm303dlhc_mag_recv()
364 resp = s->irb; in lsm303dlhc_mag_recv()
367 resp = s->irc; in lsm303dlhc_mag_recv()
371 if (s->cra & 0x80) { in lsm303dlhc_mag_recv()
372 resp = (uint8_t)(s->temperature_lock >> 8); in lsm303dlhc_mag_recv()
378 if (s->cra & 0x80) { in lsm303dlhc_mag_recv()
379 resp = (uint8_t)(s->temperature_lock & 0xff); in lsm303dlhc_mag_recv()
390 * The address pointer on the LSM303DLHC auto-increments whenever a byte in lsm303dlhc_mag_recv()
393 * The auto-increment process has the following logic: in lsm303dlhc_mag_recv()
395 * - if (s->pointer == 8) then s->pointer = 3 in lsm303dlhc_mag_recv()
396 * - else: if (s->pointer == 12) then s->pointer = 0 in lsm303dlhc_mag_recv()
397 * - else: s->pointer += 1 in lsm303dlhc_mag_recv()
401 if (s->pointer == LSM303DLHC_MAG_REG_OUT_Y_L) { in lsm303dlhc_mag_recv()
402 s->pointer = LSM303DLHC_MAG_REG_OUT_X_H; in lsm303dlhc_mag_recv()
403 } else if (s->pointer == LSM303DLHC_MAG_REG_IRC) { in lsm303dlhc_mag_recv()
404 s->pointer = LSM303DLHC_MAG_REG_CRA; in lsm303dlhc_mag_recv()
406 s->pointer++; in lsm303dlhc_mag_recv()
431 return -1; in lsm303dlhc_mag_event()
434 s->len = 0; in lsm303dlhc_mag_event()
439 * Device data description using VMSTATE macros.
471 * Put the device into post-reset default state.
476 s->len = 0; in lsm303dlhc_mag_default_cfg()
477 s->pointer = 0; /* Current register. */ in lsm303dlhc_mag_default_cfg()
478 s->buf = 0; /* Shared buffer. */ in lsm303dlhc_mag_default_cfg()
479 s->cra = 0x10; /* Temp Enabled = 0, Data Rate = 15.0 Hz. */ in lsm303dlhc_mag_default_cfg()
480 s->crb = 0x20; /* Gain = +/- 1.3 Gauss. */ in lsm303dlhc_mag_default_cfg()
481 s->mr = 0x3; /* Operating Mode = Sleep. */ in lsm303dlhc_mag_default_cfg()
482 s->x = 0; in lsm303dlhc_mag_default_cfg()
483 s->z = 0; in lsm303dlhc_mag_default_cfg()
484 s->y = 0; in lsm303dlhc_mag_default_cfg()
485 s->x_lock = 0; in lsm303dlhc_mag_default_cfg()
486 s->z_lock = 0; in lsm303dlhc_mag_default_cfg()
487 s->y_lock = 0; in lsm303dlhc_mag_default_cfg()
488 s->sr = 0x1; /* DRDY = 1. */ in lsm303dlhc_mag_default_cfg()
489 s->ira = 0x48; in lsm303dlhc_mag_default_cfg()
490 s->irb = 0x34; in lsm303dlhc_mag_default_cfg()
491 s->irc = 0x33; in lsm303dlhc_mag_default_cfg()
492 s->temperature = 0; /* Default to 0 degrees C (0/8 lsb = 0 C). */ in lsm303dlhc_mag_default_cfg()
493 s->temperature_lock = 0; in lsm303dlhc_mag_default_cfg()
513 object_property_add(obj, "mag-x", "int", in lsm303dlhc_mag_initfn()
517 object_property_add(obj, "mag-y", "int", in lsm303dlhc_mag_initfn()
521 object_property_add(obj, "mag-z", "int", in lsm303dlhc_mag_initfn()
533 static void lsm303dlhc_mag_class_init(ObjectClass *klass, const void *data) in lsm303dlhc_mag_class_init() argument
539 dc->vmsd = &vmstate_lsm303dlhc_mag; in lsm303dlhc_mag_class_init()
540 k->event = lsm303dlhc_mag_event; in lsm303dlhc_mag_class_init()
541 k->recv = lsm303dlhc_mag_recv; in lsm303dlhc_mag_class_init()
542 k->send = lsm303dlhc_mag_send; in lsm303dlhc_mag_class_init()