tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Missile launchers vs uhid



[coming back to a thread of about a year ago because I just
got such a gadget between by fingers]

netbsd%precedence.co.uk@localhost said:
> They both claim the device directly and try to detach the kernel uhid
> driver before writing a very simple usb control message. This seems a
> lot  simpler than messing around with libusbhid, but I can't see how
> to achieve  it on NetBSD. 

I've just tried -- the kernel uhid driver is absolutely not
in the way of supporting this thing. All the detach or
quirk stuff is unnecessary, it just works.
I'll append a minimal proof-of concept program, the magic constants
are taken from the pymissile script.
uhid1 is the one with interface 1, see the kernel messages:

uhidev1 at uhub3 port 1 configuration 1 interface 0
uhidev1: vendor 0x1130 Tenx Nonstandard Devic, rev 1.10/1.00, addr 2, iclass 
3/0
uhid0 at uhidev1: input=0, output=64, feature=8
uhidev2 at uhub3 port 1 configuration 1 interface 1
uhidev2: vendor 0x1130 Tenx Nonstandard Devic, rev 1.10/1.00, addr 2, iclass 
3/0
uhid1 at uhidev2: input=0, output=8, feature=0

Appearently they did abuse a USB keyboard controller...

best regards
Matthias





-------------------------------------------------------------------
-------------------------------------------------------------------
Forschungszentrum Juelich GmbH
52425 Juelich

Sitz der Gesellschaft: Juelich
Eingetragen im Handelsregister des Amtsgerichts Dueren Nr. HR B 3498
Vorsitzende des Aufsichtsrats: MinDir'in Baerbel Brumme-Bothe
Geschaeftsfuehrung: Prof. Dr. Achim Bachem (Vorsitzender),
Dr. Ulrich Krafft (stellv. Vorsitzender), Dr. Sebastian M. Schmidt
-------------------------------------------------------------------
-------------------------------------------------------------------
#include <fcntl.h>
#include <dev/usb/usb.h>
#include <dev/usb/usbhid.h>
#include <string.h>
#include <err.h>

int fd;

void
s(const char *d)
{
        struct usb_ctl_report r;
        int res;

        r.ucr_report = UHID_OUTPUT_REPORT;
        memcpy(r.ucr_data, d, 8);

        res = ioctl(fd, USB_SET_REPORT, &r);
        if (res < 0)
                warn("ioctl");
}

const char init1[] = {85, 83, 66, 67,  0,  0,  4,  0};
const char init2[] = {85, 83, 66, 67,  0, 64,  2,  0};
const char left[] = {0,  1,  0,  0,  0,  0, 8, 8};
const char right[] = {0,  0,  1,  0,  0,  0, 8, 8};
const char up[] = {0,  0,  0,  1,  0,  0, 8, 8};
const char down[] = {0,  0,  0,  0,  1,  0, 8, 8};
const char stop[] = {0,  0,  0,  0,  0,  0,  8, 8};
const char fire[] = {0,  0,  0,  0,  0,  1, 8, 8};

int
main()
{

        fd = open("/dev/uhid1", O_RDWR, 0);
        if (fd < 0)
                err(1, "open");

        s(init1);
        s(init2);
        s(right);

        return 0;
}


Home | Main Index | Thread Index | Old Index