| miklos_akos (statz) | ![]() #5, Főfasz (1047) |
4661 | #5ab5 | ^ | Idézet | Wed, 31 Dec 2025 00:34:53 +01 |
| 185.187.*.* |
|
*.75.187.185.dialin.segfault.club |
Igen, de ugye a kodot is ehhez kell igazitani, jobb esetben max lassabban fut le, rosszabb esetben szetveri a teljes buszt (ha ez esetlegesen opcio I2C buszon).
Van az irqreturn_t tipusu nvt_ts_irq fuggveny, ami igy hirtelenjeben kiugrik es kezd barmit is az IRQ-val:
static irqreturn_t nvt_ts_irq(int irq, void *dev_id)
{
struct nvt_ts_data *data = dev_id;
struct device *dev = &data->client->dev;
int i, error, slot, x, y;
bool active;
u8 *touch;
if (!data->input)
return IRQ_HANDLED;
error = nvt_ts_read_data(data->client, NVT_TS_TOUCH_START, data->buf,
data->max_touches * NVT_TS_TOUCH_SIZE);
if (error)
return IRQ_HANDLED;
for (i = 0; i < data->max_touches; i++) {
touch = &data->buf[i * NVT_TS_TOUCH_SIZE];
if (touch[0] == NVT_TS_TOUCH_INVALID)
continue;
slot = touch[0] >> NVT_TS_TOUCH_SLOT_SHIFT;
if (slot < 1 || slot > data->max_touches) {
dev_dbg(dev, "slot %d out of range, ignoring\n", slot);
continue;
}
switch (touch[0] & NVT_TS_TOUCH_TYPE_MASK) {
case NVT_TS_TOUCH_NEW:
case NVT_TS_TOUCH_UPDATE:
active = true;
break;
case NVT_TS_TOUCH_RELEASE:
active = false;
break;
default:
dev_warn(dev, "slot %d unknown state %d\n", slot, touch[0] & 7);
continue;
}
slot--;
x = (touch[1] << 4) | (touch[3] >> 4);
y = (touch[2] << 4) | (touch[3] & 0x0f);
input_mt_slot(data->input, slot);
input_mt_report_slot_state(data->input, MT_TOOL_FINGER, active);
touchscreen_report_pos(data->input, &data->prop, x, y, true);
}
input_mt_sync_frame(data->input);
input_sync(data->input);
return IRQ_HANDLED;
}
Illetve ez a struct definialja a kulonbozo IRQ-kat:
static const int nvt_ts_irq_type[4] = {
IRQF_TRIGGER_RISING,
IRQF_TRIGGER_FALLING,
IRQF_TRIGGER_LOW,
IRQF_TRIGGER_HIGH
};
Meg ez is hasznalja az IRQ-kat: nvt_ts_initial_power_on_and_register_inputdev:
error = devm_request_threaded_irq(dev, data->client->irq, NULL,
nvt_ts_irq,
IRQF_ONESHOT | IRQF_NO_AUTOEN |
nvt_ts_irq_type[irq_type],
data->client->name, data);
if (error) {
dev_err(dev, "failed to request irq: %d\n", error);
return error;
}
Mint mondtam en sik hulye vagyok ehhez, szimplan csak nyomkodom a cuccot, dobalom a szart es ami a falon marad az a "jo megoldas". |