Använda pcDuino som en mus när dess anslutna till en dator via USB OTG- (1 / 4 steg)
Steg 1: Ändra Kernel
Strukturer och rader kod visas nedan (det kan också laddas ner från här):
statiska LIST_HEAD(hidg_func_list);
/ * gömde beskrivningen av ett tangentbord * /
statiska struct hidg_func_descriptor pcduino_keyboard_date = {
.subclass = 0, / * ingen underklass * /
.Protocol = 1 / * tangentbordet * /
.report_length = 8,
.report_desc_length = 63,
.report_desc = {
0 × 05, 0 × 01, / * USAGE_PAGE (generiska skrivbordet) * /
0 × 09, 0 × 06, / * användning (tangentbord) * /
0xa1, 0 × 01, / * samling (ansökan) * /
0 × 05, 0 × 07, / * USAGE_PAGE (Keyboard) * /
0 × 19, 0xe0, / * USAGE_MINIMUM (tangentbord LeftControl) * /
0 × 29, 0xe7, / * USAGE_MAXIMUM (tangentbord höger GUI) * /
0 × 15, 0 × 00, / * LOGICAL_MINIMUM (0) * /
0 × 25, 0 × 01, / * LOGICAL_MAXIMUM (1) * /
0 × 75, 0 × 01, / * REPORT_SIZE (1) * /
0 × 95, 0 × 08, / * REPORT_COUNT (8) * /
0 × 81, 0 × 02, / * INPUT (Data, Varians, Abs) * /
0 × 95, 0 × 01, / * REPORT_COUNT (1) * /
0 × 75, 0 × 08, / * REPORT_SIZE (8) * /
0 × 81, 0 × 03, / * INPUT (Cnst, Varians, Abs) * /
0 × 95, 0 × 05, / * REPORT_COUNT (5) * /
0 × 75, 0 × 01, / * REPORT_SIZE (1) * /
0 × 05, 0 × 08, / * USAGE_PAGE (LED) * /
0 × 19, 0 × 01, / * USAGE_MINIMUM (Num Lock) * /
0 × 29, 0 × 05, / * USAGE_MAXIMUM (Kana) * /
0 × 91, 0 × 02, / * OUTPUT (Data, Varians, Abs) * /
0 × 95, 0 × 01, / * REPORT_COUNT (1) * /
0 × 75, 0 × 03, / * REPORT_SIZE (3) * /
0 × 91, 0 × 03, / * OUTPUT (Cnst, Varians, Abs) * /
0 × 95, 0 × 06, / * REPORT_COUNT (6) * /
0 × 75, 0 × 08, / * REPORT_SIZE (8) * /
0 × 15, 0 × 00, / * LOGICAL_MINIMUM (0) * /
0 × 25, 0 × 65, / * LOGICAL_MAXIMUM (101) * /
0 × 05, 0 × 07, / * USAGE_PAGE (Keyboard) * /
0 × 19, 0 × 00, / * USAGE_MINIMUM (reserverad) * /
0 × 29, 0 × 65, / * USAGE_MAXIMUM (tangentbord) * /
0 × 81, 0 × 00, / * INPUT (Data, Ary, Abs) * /
0XC0 / * END_COLLECTION * /
}
};
statiska struct platform_device pcduino_hid_keyboard = {
.name = "hidg",
.ID = 0,
.num_resources = 0,
.Resource = 0,
. dev.platform_data = pcduino_keyboard_date,
};
/ * gömde beskrivningen av en mus * /
statiska struct hidg_func_descriptor pcduino_mouse_data = {
.subclass = 0, //No underklass
.Protocol = 2, //Mouse
.report_length = 4,
.report_desc_length = 52,
.report_desc = {
0 × 05, 0 × 01, //Usage sida (generiska Desktop kontroller)
0 × 09, 0 × 02, //Usage (mus)
0xa1, 0 × 01, //Collction (ansökan)
0 × 09, 0 × 01, //Usage (pekare)
0xa1, 0 × 00, //Collction (fysiska)
0 × 05, 0 × 09, //Usage sida (knapp)
0 × 19, 0 × 01, //Usage Minimum(1)
0 × 29, 0 × 05, //Usage Maximum(5)
0 × 15, 0 × 00, //Logical Minimum(1)
0 × 25, 0 × 01, //Logical Maximum(1)
0 × 95, 0 × 05, //Report Count(5)
0 × 75, 0 × 01, //Report Size(1)
0 × 81, 0 × 02, //Input(Data,Variable,Absolute,BitField)
0 × 95, 0 × 01, //Report Count(1)
0 × 75, 0 × 03, //Report Size(3)
0 × 81, 0 × 01, //Input(Constant,Array,Absolute,BitField)
0 × 05, 0 × 01, //Usage sida (generiska Desktop kontroller)
0 × 09, 0 × 30, //Usage(x)
0 × 09, 0 × 31, //Usage(y)
0 × 09, 0 × 38, //Usage(Wheel)
0 × 15, 0 × 81, //Logical Minimum(-127)
0 × 25, 0x7F, //Logical Maximum(127)
0 × 75, 0 × 08, //Report Size(8)
0 × 95, 0 × 03, //Report Count(3)
0 × 81, 0 × 06, //Input(Data,Variable,Relative,BitField)
0xC0, //End samling
0xC0 //End samling
}
};
statiska struct platform_device pcduino_hid_mouse = {
.name = "hidg",
.ID = 1,
.num_resources = 0,
.Resource = 0,
. dev.platform_data = pcduino_mouse_data,
};
statisk int __init hidg_init(void)
{
int status;
status = platform_device_register(pcduino_hid_keyboard);
om (status < 0) {
printk ("hid tangentbord reg failed\n");
platform_device_unregister(pcduino_hid_keyboard);
returstatus;
}
status = platform_device_register(pcduino_hid_mouse);
om (status < 0) {
printk ("hid mus reg failed\n");
platform_device_unregister(pcduino_hid_mouse);
returstatus;
}
status = platform_driver_probe (hidg_plat_driver,
hidg_plat_driver_probe);
om (status < 0)
returstatus;
status = usb_composite_probe (hidg_driver, hid_bind);
om (status < 0)
platform_driver_unregister(hidg_plat_driver);
returstatus;
}
module_init(hidg_init);
statisk void __exit hidg_cleanup(void)
{
platform_driver_unregister(hidg_plat_driver);
platform_device_unregister(pcduino_hid_keyboard);
platform_device_unregister(pcduino_hid_mouse);
usb_composite_unregister(hidg_driver);
}
Strukturer måste läggas. Vi måste också att registrera strukturerna som de två funktionerna. Vänligen notera USB-protokoll, varje enhet har en deskriptor. De två strukturerna är beskrivningar av HID mus och tangentbord. I nästa steg ska vi konfigurera kärnan. Det kan också laddas ner från här. config_kernel
Drivrutiner->
[*] Stöd för USB->
USB-anordning stöd — >
SoftWinner SUN4I USB-perifer styrenhet
< > Dummy HCD (utveckling)
USB-anordning drivrutiner
< > Gadget noll (utveckling)
< > Audio anordning (experimentell)
Ethernet-Gadget (med CDC Ethernet stöd)
[*] RNDIS stöd
[] Ethernet emulering modell (EEM) stöd
< > Nätverk kontroll modellen (NCM) stöd
< > Gadget Filesystem (experimentell)
< > Funktion Filesystem (experimentell)
< > Fil-backed lagring anordning (AVSKRIVEN)
< > Massa lagring anordning
Seriella Gadget (med CDC ACM och CDC OBEX stöd)
MIDI-Gadget (experimentell)
Skrivaren Gadget
< > CDC sammansatt enhet (Ethernet och ACM)
< > CDC sammansatt enhet (ACM och massa lagring)
< > Multifunktions sammansatta Gadget (experimentell)
HID Gadget
< > EHCI Felsök enheten Gadget
< > USB-webbkamera Gadget