Desarrollo del controlador iMX6ULL | Deje que la placa de desarrollo imx6ull sea compatible con la interfaz usb del controlador de juego FC

Hay una placa de desarrollo de Linux inactiva iMX6ULL que se ha estado comiendo cenizas, y no la uso para hacer algo, siempre me da pena. Juguémoslo en el tiempo libre, es mejor que cepillar un sonido determinado. Compre un controlador de juegos con una interfaz USB de Duoduo, deje que la placa de desarrollo lo admita y luego podrá continuar jugando juegos clásicos de la infancia en él.

 Estoy usando la placa de desarrollo I.MX6U-ALPHA de átomo puntual, y los recursos de la placa son muy ricos. Planee participar en una serie de cosas divertidas para hacer en él. Incluyendo el desarrollo de controladores y aplicaciones de Linux, finalmente puede aplicar lo que ha aprendido, aprender jugando y el interés es el mejor maestro.

 Déjame mostrarte cómo se ve así el gamepad FC que compré. Es ordinario, pero barato, y todavía tiene un sabor clásico.

Proceso de portabilidad del controlador

Determinar el tipo de dispositivo

Para que la placa sea compatible con el controlador de juego FC de esta interfaz USB, primero debe saber qué protocolo de interfaz utiliza el controlador. Conéctalo a la computadora win10 y míralo, es un dispositivo tipo HID con interfaz de protocolo USB. USB-HID es la abreviatura de Universal Serial Bus-Human Interface Device. Por su nombre, se puede entender que los dispositivos HID son dispositivos que interactúan directamente con los humanos, como teclados, ratones y joysticks.

Los puertos de hardware USB están unificados, pero los dispositivos USB son diversos y el host USB distingue diferentes dispositivos USB según las descripciones de los dispositivos USB. Cada dispositivo USB tiene su propio descriptor. Cuando se inserta el dispositivo USB, el host enviará un comando al esclavo, y el esclavo devolverá información específica del descriptor después de recibir el comando. El host identifica la información relevante del dispositivo esclavo analizando el descriptor recibido.Este proceso es el proceso de enumeración (enumeración) del dispositivo.

Obtenga información de USB VID y PID

Después de conectar mi controlador FC a la computadora, se reconoce el dispositivo usb-hid. Puede ver su información de vid y pid directamente en el administrador de dispositivos de la computadora. Esta información es muy útil y se utilizará para el trasplante de controladores posterior.

已启动设备 HID\VID_0810&PID_0001\6&1eff4ed2&0&0000。

驱动程序名称: input.inf

Encuentre el código fuente del kernel de Linux y bloquee los controladores relacionados

En la ruta linux/drivers/hid/ del código fuente del kernel de Linux, hay códigos fuente de controladores relacionados con HID. Abra el archivo hid-core.c (compatible con HID para Linux) y verifique si el archivo fuente contiene la información VID y PID del dispositivo USB. De lo contrario, agregue información de VID y PID a hid_have_special_driver. Algunas definiciones de macros en esto se pueden ver en el archivo hid-ids.h.

La dirección de github del código fuente de Torvalds Linux:

GitHub - torvalds/linux: árbol de fuentes del kernel de Linux

/*
 * A list of devices for which there is a specialized driver on HID bus.
 *
 * Please note that for multitouch devices (driven by hid-multitouch driver),
 * there is a proper autodetection and autoloading in place (based on presence
 * of HID_DG_CONTACTID), so those devices don't need to be added to this list,
 * as we are doing the right thing in hid_scan_usage().
 *
 * Autodetection for (USB) HID sensor hubs exists too. If a collection of type
 * physical is found inside a usage page of type sensor, hid-sensor-hub will be
 * used as a driver. See hid_scan_report().
 */
static const struct hid_device_id hid_have_special_driver[] = {
	{ HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU) },
	{ HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_X5_005D) },
	{ HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_RP_649) },
	{ HID_USB_DEVICE(USB_VENDOR_ID_ACRUX, 0x0802) },
	{ HID_USB_DEVICE(USB_VENDOR_ID_ACRUX, 0xf705) },
    
//......

}

Encuentre controladores de gamepad que se aproximen a hid

Abra las opciones de configuración del kernel para ver a través de make menuconfig.

 Encontré un controlador de juego DragonRise Inc. Aunque no estoy seguro de que sea una combinación perfecta para mi controlador FC, al menos por el nombre, este es un dispositivo oculto para un controlador de juego.

 Si hay un archivo de opciones de configuración del kernel predeterminado, también puede agregar interruptores de opción directamente:

CONFIG_HID_DRAGONRISE=y

El archivo fuente del controlador relacionado con esto es linux/drivers/hid/hid-dr.c. Abra este archivo y agregue la información VID y PID de mi dispositivo USB.

static const struct hid_device_id dr_devices[] = {
        { HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, 0x0006),  },
        { HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, 0x0011),  },
        { HID_USB_DEVICE(0x0810, 0x0001),  },
        { }
};

Compilar el controlador del núcleo

#使用Yocto SDK里的GCC 5.3.0交叉编译器编译出厂Linux源码,可不用指定ARCH等,直接执行Make
source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
#编译前先清除
make distclean
#配置defconfig文件
make imx_v7_defconfig -j 16
#开始编译zImage
make zImage -j 16

Después de eso, actualice el kernel en la placa y reinicie el dispositivo. Conecte el gamepad USB, ingrese dmesg para ver la información de registro del kernel y vea si se reconoce el nodo del dispositivo.

dmesg

Ver dispositivos de entrada, obtener información de eventos de entrada

directorio /dev/entrada/

Todos los eventos en el directorio /dev/input/ se generan llamando a input_register_device(struct input_dev *dev) en el controlador. Los archivos en mi directorio /dev/input/ son los siguientes:

$ ls /dev/input/
by-id  by-path  event0  event1  event2  event3 

Cada evento representa un evento. Entonces, ¿cómo saber a qué dispositivo corresponde cada evento? Se puede ver con la ayuda de /proc/bus .

/proc/bus/entrada/dispositivos

/proc/bus/input/devices almacena la información relevante del dispositivo correspondiente al evento. Lo que veo en mi tablero es lo siguiente:

$ cat /proc/bus/input/devices

Se puede ver que el contenido detrás de la línea "H:" de cada elemento es el evento correspondiente. 

Leer /dev/input/eventx directamente

Use cat para ver el contenido del evento de entrada, opere el dispositivo de entrada correspondiente y el evento informará el contenido. La interpretación como una cadena dará como resultado caracteres ilegibles. Entonces puede usar hexdump para leer datos hexadecimales.

Prueba leer demostración

El kernel de Linux usa la estructura input_event para describir todos los eventos de entrada.

/*
 * The event structure itself
 */

struct input_event {
	struct timeval time;
	__u16 type;
	__u16 code;
	__s32 value;
};

Para verificar si el gamepad usb está funcionando y obtener su valor de clave correspondiente, escriba una pequeña prueba de demostración para leerlo.

#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h> 


#define _EV_KEY         0x01    /* button pressed/released */
#define _EV_ABS         0x03    
#define _EV_MSC         0x04   

int main() {
    printf("hello,usb hid joystick key test\n");
    int fd = open("/dev/input/event3", O_RDONLY);
    struct input_event e;
    while(1) {
        read(fd, &e, sizeof(e));
        switch(e.type) {
            case _EV_KEY:
                printf("type: %d, code: %d,value: %d, time: %d\n", e.type, e.code,e.value, e.time);
                break;
            case _EV_ABS:
                printf("type: %d, code: %d,value: %d, time: %d\n", e.type, e.code,e.value, e.time);
                break;
            case _EV_MSC:
            printf("type: %d, code: %d,value: %d, time: %d\n", e.type, e.code,e.value, e.time);
            break;
            default:
                if(e.type != 0){
                printf("type:%d, code: %d,value: %d, time: %d\n",e.type, e.code,e.value, e.time);
                }
        }
    }
    close(fd);
    return 0;
}

herramienta de prueba evtest

Al desarrollar controladores de subsistemas de entrada, la herramienta evtest se usa a menudo para realizar pruebas. evtest es una herramienta para imprimir eventos del kernel evdev. Lee e imprime directamente eventos con valores y nombres de símbolos descritos por el dispositivo desde el dispositivo del kernel. Se puede usar para depurar dispositivos de entrada como el mouse, el teclado y el panel táctil. Normalmente se utiliza para depurar problemas con dispositivos de entrada.

En los datos de salida, "tipo" es el tipo de entrada, que puede ser "EV KEY", "EV SW", "EV SND", "EV LED" o un valor; "valor" puede ser decimal o hexadecimal, o Is el nombre constante de la consulta kev/switch/sound/LED.

Descargue e instale la herramienta evtest

Dirección de descarga: Índice de /debian/pool/main/e/evtest/ | Estación espejo de código abierto del Instituto de Tecnología de Nanyang | Espejo de código abierto del Instituto de Tecnología de Nanyang

instalación de compilación cruzada

#解压缩
$ tar   -xjvf   evtest_1.33.orig.tar.bz2
$ cd evtest-1.33/

#加载环境
source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi

#生成makefile,指定交叉编译
.confiqure --host=arm-linux

#编译
make

La herramienta evtest utiliza

 Ejecuta el ejemplo

time: La hora en que se generó el evento.

type: tipo de evento, los comunes son: EV_KEY (teclado), EV_REL (coordenadas relativas), EV_ABS (coordenadas absolutas), definido en [input-event-codes.h] (https://github.com/torvalds/linux /blob/master/include/uapi/linux/input-event-codes.h#LC35) o input.h.

code: El código del evento, que describe con más detalle el evento, como: el valor de la tecla ( KEY_NUMLOCK、KEY_ESC、KEY_1、KEY_A) del evento del teclado.

value: El valor del evento, una descripción más específica del evento, como: botón按下/抬起。

La siguiente es la información de retroalimentación de cada tecla capturada usando la herramienta devtest (presione arriba, abajo, izquierda, derecha, seleccione, inicie, etc. una vez cada una):

El valor clave en el mango se determina

El identificador FC generalmente contiene las siguientes claves. Izquierda, derecha, arriba, abajo, iniciar, seleccionar, A, B, X, Y.

     /**
     * FC手柄 bit 键位对应关系 真实手柄中有一个定时器,处理 连A  连B
     * 0  1   2       3       4    5      6     7
     * A  B   Select  Start  Up   Down   Left  Right
     */

Si el gamepad FC con la interfaz USB que compró es del juego DragonRise Inc., se estima que no necesita probar el valor clave anterior y puede usarlo directamente después de habilitarlo. Pero el que compré casualmente necesita ser probado y emparejado antes de que pueda usarse.

 Después de las pruebas anteriores, la relación correspondiente entre clave y valor finalmente se determina de la siguiente manera:

botón del mando leer valor clave
tecla de flecha izquierda arriba tipo: 3, código: 1, valor: 0
tipo: 3, código: 1, valor: 127
tecla de flecha izquierda hacia abajo tipo: 3, código: 1, valor: 255
tipo: 3, código: 1, valor: 127
tecla de flecha izquierda izquierda tipo: 3, código: 0, valor: 0
tipo: 3, código: 0, valor: 127
tecla de flecha izquierda derecha tipo: 3, código: 0, valor: 255
tipo: 3, código: 0, valor: 127
tecla SELECCIONAR tipo: 1, código: 296, valor: 1
tipo: 1, código: 296, valor: 0
Botón de inicio tipo: 1, código: 297, valor: 1
tipo: 1, código: 297, valor: 0
tecla numérica derecha 1 tipo: 1, código: 288, valor: 1
tipo: 1, código: 288, valor: 0
tecla numérica derecha 2 tipo: 1, código: 289, valor: 1
tipo: 1, código: 289, valor: 0
tecla numérica derecha 3 tipo: 1, código: 290, valor: 1
tipo: 1, código: 290, valor: 0
tecla numérica derecha 4 tipo: 1, código: 291, valor: 1
tipo: 1, código: 291, valor: 0

Al final, probé el control y no hay ningún problema, ¡y es muy suave! Puedes jugar felizmente, trae un banco de energía, esta es mi consola de juegos móvil, ¡admite juegos clásicos divertidos ilimitados! La migración del emulador Nes se anunciará una por una más adelante, bienvenido a prestar atención a la colección. 

otros recursos

Blog del maestro de iluminación USB HID_Soc-blog CSDN

Para que V3S no coma cenizas, transfiera juegos de NES / Allwinner SOC / WhyCan Forum (Wow cool developer community)

V3S portó el simulador de juegos nes (con colección de juegos)_v3s compiló el juego simulator_qq_46604211's blog-CSDN blog

Método detallado para ver dispositivos de entrada y obtener eventos de entrada en Linux - comando evtest - Se busca programador

Notas nueve del estudio de desarrollo de controladores de Linux: explicación detallada del proceso menuconfig

Developer Search-Beta-Make Technology Search más fácil
y eficiente
 

USB_HID Basics_usbhid_jansert's Blog-CSDN Blog

Reproduzca la serie USB HID: utilice el lenguaje C y libusb para desarrollar USB HID en el blog de Linux_whstudio123-CSDN Blog

Desarrollo del controlador i.MX6ULL | 20 - subsistema de entrada de Linux_marco del controlador de entrada imx6ull_blog de Mculover666-blog de CSDN

GitHub - torvalds/linux: árbol de fuentes del kernel de Linux

Embedded Linux: V3s portando juegos de NES, sonido, gamepad_Quanzhi v3s portando el blog de nes_liefyuan-CSDN Blog

Supongo que te gusta

Origin blog.csdn.net/qq8864/article/details/132063201
Recomendado
Clasificación