Download raw body.
Fix boot on HONOR MagicBook Art 14 Snapdragon
On Mon, 23 Dec 2024 17:14:57 +0100,
Marcus Glocker <marcus@nazgul.ch> wrote:
>
>
> ... one ask; Is it really required to add two quirks for that?
> The consequence of skipping the reset is that we are also skipping the
> power on, because it's contained in ihidev_reset().
>
> Would it also work for the device if we do the power on at the same
> place where we skip the reset, so before the I2C_HID_REPORT_DESCR
> command? See what I mean with the following diff.
>
Unfortently no, it read as (here with debug output):
ihidev1 at iic3 addr 0x5dihidev1: HID command I2C_HID_CMD_DESCR at 0x1
ihidev1: HID descriptor: 1e 00 00 01 df 02 02 00 03 00 2a 00 04 00 20 00 05 00 06 00 cc 35 04 01 01 01 00 00 00 00
ihidev1: resetting
ihidev1: HID command I2C_HID_CMD_SET_POWER(0)
ihidev1: HID command I2C_HID_REPORT_DESCR at 0x2 with size 735
ihidev1: HID report descriptor: 05 01 09 02 a1 01 85 01 09 01 a1 00 05 09 19 01 29 03 15 00 25 01 95 03 75 01 81 02 95 01 75 05 81 03 05 01 09 30 09 31 09 38 15 81 25 7f 75 08 95 03 81 06 c0 c0 05 0c 09 01 a1 01 85 08 19 00 2a ff 02 15 00 26 ff 7f 75 10 95 01 81 00 c0 05 0d 09 05 a1 01 85 04 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 09 4a 95 03 75 01 81 02 95 01 75 01 81 03 95 01 75 04 25 05 09 51 81 02 05 01 15 00 26 48 12 75 10 55 0e 65 13 09 30 35 00 46 fc 01 95 01 81 02 46 6c 01 26 30 0c 09 31 81 02 05 0d 09 30 75 10 26 ff 07 46 96 02 66 01 01 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 09 4a 95 03 75 01 81 02 95 01 75 01 81 03 95 01 75 04 25 05 09 51 81 02 05 01 15 00 26 48 12 75 10 55 0e 65 13 09 30 35 00 46 fc 01 95 01 81 02 46 6c 01 26 30 0c 09 31 81 02 05 0d 09 30 75 10 26 ff 07 46 96 02 66 01 01 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 09 4a 95 03 75 01 81 02 95 01 75 01 81 03 95 01 75 04 25 05 09 51 81 02 05 01 15 00 26 48 12 75 10 55 0e 65 13 09 30 35 00 46 fc 01 95 01 81 02 46 6c 01 26 30 0c 09 31 81 02 05 0d 09 30 75 10 26 ff 07 46 96 02 66 01 01 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 09 4a 95 03 75 01 81 02 95 01 75 01 81 03 95 01 75 04 25 05 09 51 81 02 05 01 15 00 26 48 12 75 10 55 0e 65 13 09 30 35 00 46 fc 01 95 01 81 02 46 6c 01 26 30 0c 09 31 81 02 05 0d 09 30 75 10 26 ff 07 46 96 02 66 01 01 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 09 4a 95 03 75 01 81 02 95 01 75 01 81 03 95 01 75 04 25 05 09 51 81 02 05 01 15 00 26 48 12 75 10 55 0e 65 13 09 30 35 00 46 fc 01 95 01 81 02 46 6c 01 26 30 0c 09 31 81 02 05 0d 09 30 75 10 26 ff 07 46 96 02 66 01 01 81 02 c0 05 0d 55 0c 66 01 10 47 ff ff 00 00 27 ff ff 00 00 75 10 95 01 09 56 81 02 09 54 25 7f 95 01 75 08 81 02 05 09 09 01 25 01 75 01 95 01 81 02 95 07 81 03 05 0d 85 02 09 55 09 59 75 04 95 02 25 0f b1 02 05 0d 85 07 09 60 75 01 95 01 15 00 25 01 b1 02 95 07 b1 03 85 06 06 00 ff 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 05 0d 09 0e a1 01 85 03 09 22 a1 02 09 52 15 00 25 0a 75 08 95 01 b1 02 c0 09 22 a1 00 85 05 09 57 09 58 75 01 95 02 25 01 b1 02 95 06 b1 03 c0 c0 06 00 ff 09 01 a1 01 85 0e 09 01 19 00 29 ff 15 00 25 ff 95 08 75 08 91 02 09 01 19 00 29 ff 15 00 25 ff 95 08 75 08 81 02 c0
gpio 896, vendor 0x35cc product 0x104, QTEC0002
ihidev1: 14 report ids
ihidev1: repid 1 size 4
ihidev1: repid 4 size 39
ihidev1: repid 8 size 2
ihidev1: repid 14 size 8
imt0 at ihidev1ihidev1: HID command I2C_HID_CMD_GET_REPORT 2 (type 3, len 1)
ihidev1: response size 65535 != expected length 4
ihidev1: response report id 255 != 2
ihidev1: failed fetching report
imt0: failed getting capability report
ims0 at ihidev1 reportid 1: 3 buttons, Z dir
wsmouse0 at ims0 mux 0
hid at ihidev1 reportid 5 not configured
hid at ihidev1 reportid 6 not configured
hid at ihidev1 reportid 7 not configured
icc1 at ihidev1 reportid 8: 768 usages, 20 keys, array
wskbd2 at icc1 mux 1
hid at ihidev1 reportid 14 not configured
ihidev1: HID command I2C_HID_CMD_SET_POWER(1)
qciic4 at acpi0 I2C9 addr 0xa80000/0x4000
and for refernce my last version of patch:
ihidev1 at iic3 addr 0x5dihidev1: HID command I2C_HID_CMD_DESCR at 0x1
ihidev1: HID descriptor: 1e 00 00 01 df 02 02 00 03 00 2a 00 04 00 20 00 05 00 06 00 cc 35 04 01 01 01 00 00 00 00
ihidev1: HID command I2C_HID_REPORT_DESCR at 0x2 with size 735
ihidev1: HID report descriptor: 05 01 09 02 a1 01 85 01 09 01 a1 00 05 09 19 01 29 03 15 00 25 01 95 03 75 01 81 02 95 01 75 05 81 03 05 01 09 30 09 31 09 38 15 81 25 7f 75 08 95 03 81 06 c0 c0 05 0c 09 01 a1 01 85 08 19 00 2a ff 02 15 00 26 ff 7f 75 10 95 01 81 00 c0 05 0d 09 05 a1 01 85 04 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 09 4a 95 03 75 01 81 02 95 01 75 01 81 03 95 01 75 04 25 05 09 51 81 02 05 01 15 00 26 48 12 75 10 55 0e 65 13 09 30 35 00 46 fc 01 95 01 81 02 46 6c 01 26 30 0c 09 31 81 02 05 0d 09 30 75 10 26 ff 07 46 96 02 66 01 01 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 09 4a 95 03 75 01 81 02 95 01 75 01 81 03 95 01 75 04 25 05 09 51 81 02 05 01 15 00 26 48 12 75 10 55 0e 65 13 09 30 35 00 46 fc 01 95 01 81 02 46 6c 01 26 30 0c 09 31 81 02 05 0d 09 30 75 10 26 ff 07 46 96 02 66 01 01 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 09 4a 95 03 75 01 81 02 95 01 75 01 81 03 95 01 75 04 25 05 09 51 81 02 05 01 15 00 26 48 12 75 10 55 0e 65 13 09 30 35 00 46 fc 01 95 01 81 02 46 6c 01 26 30 0c 09 31 81 02 05 0d 09 30 75 10 26 ff 07 46 96 02 66 01 01 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 09 4a 95 03 75 01 81 02 95 01 75 01 81 03 95 01 75 04 25 05 09 51 81 02 05 01 15 00 26 48 12 75 10 55 0e 65 13 09 30 35 00 46 fc 01 95 01 81 02 46 6c 01 26 30 0c 09 31 81 02 05 0d 09 30 75 10 26 ff 07 46 96 02 66 01 01 81 02 c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 09 4a 95 03 75 01 81 02 95 01 75 01 81 03 95 01 75 04 25 05 09 51 81 02 05 01 15 00 26 48 12 75 10 55 0e 65 13 09 30 35 00 46 fc 01 95 01 81 02 46 6c 01 26 30 0c 09 31 81 02 05 0d 09 30 75 10 26 ff 07 46 96 02 66 01 01 81 02 c0 05 0d 55 0c 66 01 10 47 ff ff 00 00 27 ff ff 00 00 75 10 95 01 09 56 81 02 09 54 25 7f 95 01 75 08 81 02 05 09 09 01 25 01 75 01 95 01 81 02 95 07 81 03 05 0d 85 02 09 55 09 59 75 04 95 02 25 0f b1 02 05 0d 85 07 09 60 75 01 95 01 15 00 25 01 b1 02 95 07 b1 03 85 06 06 00 ff 09 c5 15 00 26 ff 00 75 08 96 00 01 b1 02 c0 05 0d 09 0e a1 01 85 03 09 22 a1 02 09 52 15 00 25 0a 75 08 95 01 b1 02 c0 09 22 a1 00 85 05 09 57 09 58 75 01 95 02 25 01 b1 02 95 06 b1 03 c0 c0 06 00 ff 09 01 a1 01 85 0e 09 01 19 00 29 ff 15 00 25 ff 95 08 75 08 91 02 09 01 19 00 29 ff 15 00 25 ff 95 08 75 08 81 02 c0
ihidev1: resetting
ihidev1: HID command I2C_HID_CMD_SET_POWER(0)
gpio 896, vendor 0x35cc product 0x104, QTEC0002
ihidev1: 14 report ids
ihidev1: repid 1 size 4
ihidev1: repid 4 size 39
ihidev1: repid 8 size 2
ihidev1: repid 14 size 8
imt0 at ihidev1ihidev1: HID command I2C_HID_CMD_GET_REPORT 2 (type 3, len 1)
ihidev1: response: 04 00 02 15
ihidev1: HID command I2C_HID_CMD_SET_REPORT 3 (type 3, len 2): 03 00
: touchpad, 5 contacts
wsmouse0 at imt0 mux 0
ims0 at ihidev1 reportid 1: 3 buttons, Z dir
wsmouse1 at ims0 mux 0
hid at ihidev1 reportid 5 not configured
hid at ihidev1 reportid 6 not configured
hid at ihidev1 reportid 7 not configured
icc1 at ihidev1 reportid 8: 768 usages, 20 keys, array
wskbd2 at icc1 mux 1
hid at ihidev1 reportid 14 not configured
ihidev1: HID command I2C_HID_CMD_SET_POWER(1)
qciic4 at acpi0 I2C9 addr 0xa80000/0x4000
and without quirks, but with https://marc.info/?l=openbsd-tech&m=173496939319744&w=2:
iic3 at qciic3
ihidev1 at iic3 addr 0x5dihidev1: HID command I2C_HID_CMD_DESCR at 0x1
ihidev1: HID descriptor: 1e 00 00 01 df 02 02 00 03 00 2a 00 04 00 20 00 05 00 06 00 cc 35 04 01 01 01 00 00 00 00
ihidev1: resetting
ihidev1: HID command I2C_HID_CMD_SET_POWER(0)
ihidev1: HID command I2C_HID_CMD_RESET
ihidev1: HID command I2C_HID_REPORT_DESCR at 0x2 with size 735
ihidev1: HID report descriptor: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
gpio 896, vendor 0x35cc product 0x104, QTEC0002
qciic4 at acpi0 I2C9 addr 0xa80000/0x4000
>
> Index: sys/dev/i2c/ihidev.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/i2c/ihidev.c,v
> diff -u -p -u -p -r1.33 ihidev.c
> --- sys/dev/i2c/ihidev.c 18 Oct 2024 12:53:49 -0000 1.33
> +++ sys/dev/i2c/ihidev.c 23 Dec 2024 16:04:22 -0000
> @@ -61,6 +61,7 @@ static int I2C_HID_POWER_ON = 0x0;
> static int I2C_HID_POWER_OFF = 0x1;
>
> int ihidev_match(struct device *, void *, void *);
> +int ihidev_quirks(struct ihidev_softc *);
> void ihidev_attach(struct device *, struct device *, void *);
> int ihidev_detach(struct device *, int);
> int ihidev_activate(struct device *, int);
> @@ -75,6 +76,17 @@ int ihidev_maxrepid(void *buf, int len);
> int ihidev_print(void *aux, const char *pnp);
> int ihidev_submatch(struct device *parent, void *cf, void *aux);
>
> +#define IHIDEV_QUIRK_SKIP_RESET 0x1
> +
> +const struct ihidev_quirks {
> + uint16_t ihq_vid;
> + uint16_t ihq_pid;
> + int ihq_quirks;
> +} ihidev_devs[] = {
> + /* HONOR MagicBook Art 14 Touchpad (QTEC0002) */
> + { 0x35cc, 0x0104, IHIDEV_QUIRK_SKIP_RESET },
> +};
> +
> const struct cfattach ihidev_ca = {
> sizeof(struct ihidev_softc),
> ihidev_match,
> @@ -98,6 +110,25 @@ ihidev_match(struct device *parent, void
> return (0);
> }
>
> +int
> +ihidev_quirks(struct ihidev_softc *sc)
> +{
> + const struct ihidev_quirks *q;
> + uint16_t vid, pid;
> + int i, nent;
> +
> + nent = nitems(ihidev_devs);
> +
> + vid = letoh16(sc->hid_desc.wVendorID);
> + pid = letoh16(sc->hid_desc.wProductID);
> +
> + for (i = 0, q = ihidev_devs; i < nent; i++, q++)
> + if (vid == q->ihq_vid && pid == q->ihq_pid)
> + return (q->ihq_quirks);
> +
> + return (0);
> +}
> +
> void
> ihidev_attach(struct device *parent, struct device *self, void *aux)
> {
> @@ -572,6 +603,8 @@ ihidev_hid_desc_parse(struct ihidev_soft
> {
> int retries = 3;
>
> + sc->sc_quirks = ihidev_quirks(sc);
> +
> /* must be v01.00 */
> if (letoh16(sc->hid_desc.bcdVersion) != 0x0100) {
> printf("%s: bad HID descriptor bcdVersion (0x%x)\n",
> @@ -597,6 +630,12 @@ ihidev_hid_desc_parse(struct ihidev_soft
> return (1);
> }
>
> + if (sc->sc_quirks & IHIDEV_QUIRK_SKIP_RESET) {
> + if (ihidev_poweron(sc))
> + return (1);
> + goto skip_reset;
> + }
> +
> while (retries-- > 0) {
> if (ihidev_reset(sc)) {
> if (retries == 0)
> @@ -608,6 +647,7 @@ ihidev_hid_desc_parse(struct ihidev_soft
> break;
> }
>
> +skip_reset:
> sc->sc_reportlen = letoh16(sc->hid_desc.wReportDescLength);
> sc->sc_report = malloc(sc->sc_reportlen, M_DEVBUF, M_WAITOK | M_ZERO);
>
> Index: sys/dev/i2c/ihidev.h
> ===================================================================
> RCS file: /cvs/src/sys/dev/i2c/ihidev.h,v
> diff -u -p -u -p -r1.9 ihidev.h
> --- sys/dev/i2c/ihidev.h 3 Sep 2022 15:48:16 -0000 1.9
> +++ sys/dev/i2c/ihidev.h 23 Dec 2024 16:04:22 -0000
> @@ -93,6 +93,8 @@ struct ihidev_softc {
> int sc_fastpoll;
> struct timeout sc_timer;
> int sc_dying;
> +
> + int sc_quirks;
> };
>
> struct ihidev {
--
wbr, Kirill
Fix boot on HONOR MagicBook Art 14 Snapdragon