Paso 1: Modificar el Kernel
Las estructuras y líneas de código se muestra a continuación (puede también ser descargado de aquí):
LIST_HEAD(hidg_func_list) estática;
/ * hid descriptor para un teclado * /
Static struct hidg_func_descriptor pcduino_keyboard_date = {}
.Subclass = 0, / * no subclase * /
.Protocol = 1, / * teclado * /
.report_length = 8,
.report_desc_length = 63,
.report_desc = {}
0 × 05, 0 × 01, / * USAGE_PAGE (escritorio genérico) * /
0 × 09, 0 × 06, / * uso (teclado) * /
0xa1, 0 × 01, / * colección (aplicación) * /
0 × 05, 0 × 07, / * USAGE_PAGE (teclado) * /
0 × 19, 0xe0, / * USAGE_MINIMUM (teclado LeftControl) * /
0 × 29, 0xe7, / * USAGE_MAXIMUM (GUI de la derecha del teclado) * /
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, / * entrada (datos, Var, Abs) * /
0 × 95, 0 × 01, / * REPORT_COUNT (1) * /
0 × 75, 0 × 08, / * REPORT_SIZE (8) * /
0 × 81, 0 × 03, / * entrada (Cnst, Var, 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 (Bloq Num) * /
0 × 29, 0 × 05, / * USAGE_MAXIMUM (Kana) * /
0 × 91, 0 × 02, / * salida (datos, Var, Abs) * /
0 × 95, 0 × 01, / * REPORT_COUNT (1) * /
0 × 75, 0 × 03, / * REPORT_SIZE (3) * /
0 × 91, 0 × 03, / * salida (Cnst, Var, 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 (teclado) * /
0 × 19, 0 × 00, / * USAGE_MINIMUM (reservado) * /
0 × 29, 0 × 65, / * USAGE_MAXIMUM (aplicación de teclado) * /
0 × 81, 0 × 00, / * entrada (datos, Ary, Abs) * /
0XC0 / * END_COLLECTION * /
}
};
Static struct platform_device pcduino_hid_keyboard = {}
Name = "hidg",
.id = 0,
.num_resources = 0,
recursos = 0,
. dev.platform_data = pcduino_keyboard_date,
};
/ * hid descriptor para un ratón * /
Static struct hidg_func_descriptor pcduino_mouse_data = {}
.Subclass = 0, //No subclase
.Protocol = 2, //Mouse
.report_length = 4,
.report_desc_length = 52,
.report_desc = {}
0 × 05, 0 × 01, //Usage página (controles de escritorio genéricas)
0 × 09, 0 × 02, //Usage (ratón)
0xa1, 0 × 01, //Collction (aplicación)
0 × 09, 0 × 01, //Usage (puntero)
0xa1, 0 × 00, //Collction (físico)
0 × 05, 0 × 09, //Usage página (botón)
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 página (controles de escritorio genéricas)
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, colección //End
0xc0 //End colección
}
};
Static struct platform_device pcduino_hid_mouse = {}
Name = "hidg",
.ID = 1,
.num_resources = 0,
recursos = 0,
. dev.platform_data = pcduino_mouse_data,
};
Static int __init hidg_init(void)
{
int estado;
Estado = platform_device_register(pcduino_hid_keyboard);
Si (estado < 0) {}
han ("teclado hid reg fallo en");
platform_device_unregister(pcduino_hid_keyboard);
volver estado;
}
Estado = platform_device_register(pcduino_hid_mouse);
Si (estado < 0) {}
han ("ratón hid reg fallo en");
platform_device_unregister(pcduino_hid_mouse);
volver estado;
}
Estado = platform_driver_probe (hidg_plat_driver,
hidg_plat_driver_probe);
Si (estado < 0)
volver estado;
Estado = usb_composite_probe (hidg_driver, hid_bind);
Si (estado < 0)
platform_driver_unregister(hidg_plat_driver);
volver estado;
}
module_init(hidg_init);
Static 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);
}
Las estructuras deben añadirse. También tenemos que registrar las estructuras de las dos funciones. Por favor señalar según protocolo USB, cada dispositivo tiene un descriptor. Las dos estructuras son los descriptores de la HID ratón y teclado. En el siguiente paso, vamos a configurar el núcleo. También puede descargarse desde aquí. config_kernel
Controladores de dispositivos->
[*] Soporte USB — >
Soporte de Gadget USB — >
SoftWinner SUN4I regulador periférico del USB
< > Maniquí HCD (desarrollo)
Controladores de Gadget USB
Gadget de < > cero (desarrollo)
< > Audio Gadget (EXPERIMENTAL)
Gadget de Ethernet (con apoyo de CDC Ethernet)
[*] Soporte RNDIS
[] Soporte de modelo de emulación de Ethernet (EEM)
< > Soporte de modelo de Control de red (NCM)
< > Archivos de gadget (EXPERIMENTAL)
< > Función sistema de archivos (EXPERIMENTAL)
< > Almacenamiento de información basados en archivo Gadget (obsoleto)
Gadget de almacenamiento masivo < >
Gadget serial (con apoyo de CDC ACM y CDC OBEX)
Gadget de MIDI (EXPERIMENTAL)
Gadget de impresora
Dispositivo compuesto de < > CDC (Ethernet y ACM)
< > CDC dispositivo compuesto (ACM y almacenamiento masivo)
< > Multifunción compuesto Gadget (EXPERIMENTAL)
Adminículo ocultado
< > EHCI depurar el dispositivo Gadget
< > USB Webcam Gadget