Δημοσιεύτηκε: 06 Ιαν 2016, 21:52
Δεν ξέρω αν μας βοηθάει αλλά έκανα την εξής κίνηση: Το laptop χρησιμοποιεί το module acer_wmi και πιθανόν να βρίσκεται εκεί κώδικας για accelerometer της acer. Και από το /linux-4.3.3/drivers/platform/x86/ του πυρήνα linux πήρα τον κώδικα acer_wmi.c Ctrl + F ψάχνω για accelerometer και ιδού ένα μέρος
edit:
Ψάχνω και για αυτά που είπες πριν και απαντάω σε λίγο.
- Κώδικας: Επιλογή όλων
/*
* Accelerometer device
*/
static acpi_handle gsensor_handle;
static int acer_gsensor_init(void)
{
acpi_status status;
struct acpi_buffer output;
union acpi_object out_obj;
output.length = sizeof(out_obj);
output.pointer = &out_obj;
status = acpi_evaluate_object(gsensor_handle, "_INI", NULL, &output);
if (ACPI_FAILURE(status))
return -1;
return 0;
}
static int acer_gsensor_open(struct input_dev *input)
{
return acer_gsensor_init();
}
static int acer_gsensor_event(void)
{
acpi_status status;
struct acpi_buffer output;
union acpi_object out_obj[5];
if (!has_cap(ACER_CAP_ACCEL))
return -1;
output.length = sizeof(out_obj);
output.pointer = out_obj;
status = acpi_evaluate_object(gsensor_handle, "RDVL", NULL, &output);
if (ACPI_FAILURE(status))
return -1;
if (out_obj->package.count != 4)
return -1;
input_report_abs(acer_wmi_accel_dev, ABS_X,
(s16)out_obj->package.elements[0].integer.value);
input_report_abs(acer_wmi_accel_dev, ABS_Y,
(s16)out_obj->package.elements[1].integer.value);
input_report_abs(acer_wmi_accel_dev, ABS_Z,
(s16)out_obj->package.elements[2].integer.value);
input_sync(acer_wmi_accel_dev);
return 0;
}
- Κώδικας: Επιλογή όλων
{
int err;
err = acer_wmi_get_handle("SENR", "BST0001", &gsensor_handle);
if (err)
return err;
interface->capability |= ACER_CAP_ACCEL;
acer_wmi_accel_dev = input_allocate_device();
if (!acer_wmi_accel_dev)
return -ENOMEM;
acer_wmi_accel_dev->open = acer_gsensor_open;
acer_wmi_accel_dev->name = "Acer BMA150 accelerometer";
acer_wmi_accel_dev->phys = "wmi/input1";
acer_wmi_accel_dev->id.bustype = BUS_HOST;
acer_wmi_accel_dev->evbit[0] = BIT_MASK(EV_ABS);
input_set_abs_params(acer_wmi_accel_dev, ABS_X, -16384, 16384, 0, 0);
input_set_abs_params(acer_wmi_accel_dev, ABS_Y, -16384, 16384, 0, 0);
input_set_abs_params(acer_wmi_accel_dev, ABS_Z, -16384, 16384, 0, 0);
err = input_register_device(acer_wmi_accel_dev);
if (err)
goto err_free_dev;
return 0;
edit:
Ψάχνω και για αυτά που είπες πριν και απαντάω σε λίγο.