drivers/hid/hid-lg3ff.c
Source file repositories/reference/linux-study-clean/drivers/hid/hid-lg3ff.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/hid/hid-lg3ff.c- Extension
.c- Size
- 3853 bytes
- Lines
- 148
- Domain
- Driver Families
- Bucket
- drivers/hid
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/input.hlinux/hid.hhid-lg.h
Detected Declarations
function Copyrightfunction hid_lg3ff_set_autocenterfunction lg3ff_init
Annotated Snippet
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Force feedback support for Logitech Flight System G940
*
* Copyright (c) 2009 Gary Stein <LordCnidarian@gmail.com>
*/
/*
*/
#include <linux/input.h>
#include <linux/hid.h>
#include "hid-lg.h"
/*
* G940 Theory of Operation (from experimentation)
*
* There are 63 fields (only 3 of them currently used)
* 0 - seems to be command field
* 1 - 30 deal with the x axis
* 31 -60 deal with the y axis
*
* Field 1 is x axis constant force
* Field 31 is y axis constant force
*
* other interesting fields 1,2,3,4 on x axis
* (same for 31,32,33,34 on y axis)
*
* 0 0 127 127 makes the joystick autocenter hard
*
* 127 0 127 127 makes the joystick loose on the right,
* but stops all movemnt left
*
* -127 0 -127 -127 makes the joystick loose on the left,
* but stops all movement right
*
* 0 0 -127 -127 makes the joystick rattle very hard
*
* I'm sure these are effects that I don't know enough about them
*/
static int hid_lg3ff_play(struct input_dev *dev, void *data,
struct ff_effect *effect)
{
struct hid_device *hid = input_get_drvdata(dev);
struct list_head *report_list = &hid->report_enum[HID_OUTPUT_REPORT].report_list;
struct hid_report *report = list_entry(report_list->next, struct hid_report, list);
int x, y;
/*
* Available values in the field should always be 63, but we only use up to
* 35. Instead, clear the entire area, however big it is.
*/
memset(report->field[0]->value, 0,
sizeof(__s32) * report->field[0]->report_count);
switch (effect->type) {
case FF_CONSTANT:
/*
* Already clamped in ff_memless
* 0 is center (different then other logitech)
*/
x = effect->u.ramp.start_level;
y = effect->u.ramp.end_level;
/* send command byte */
report->field[0]->value[0] = 0x51;
/*
* Sign backwards from other Force3d pro
* which get recast here in two's complement 8 bits
*/
report->field[0]->value[1] = (unsigned char)(-x);
report->field[0]->value[31] = (unsigned char)(-y);
hid_hw_request(hid, report, HID_REQ_SET_REPORT);
break;
}
return 0;
}
static void hid_lg3ff_set_autocenter(struct input_dev *dev, u16 magnitude)
{
struct hid_device *hid = input_get_drvdata(dev);
struct list_head *report_list = &hid->report_enum[HID_OUTPUT_REPORT].report_list;
struct hid_report *report = list_entry(report_list->next, struct hid_report, list);
/*
* Auto Centering probed from device
Annotation
- Immediate include surface: `linux/input.h`, `linux/hid.h`, `hid-lg.h`.
- Detected declarations: `function Copyright`, `function hid_lg3ff_set_autocenter`, `function lg3ff_init`.
- Atlas domain: Driver Families / drivers/hid.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.