Resumen del uso de Spidev del controlador SPI general de Linux incorporado

Debido al interés, jugué con la placa de desarrollo imax6ul en mi tiempo libre. El kernel de Linux integra el controlador spidev y proporciona una API de espacio de usuario para dispositivos SPI. Admite interfaces de acceso de lectura y escritura para comunicación semidúplex e interfaces ioctl para comunicación dúplex completo y configuración de E/S. Cuando esté en uso, simplemente agregue el valor de atributo compatible del dispositivo esclavo SPI a la matriz spidev dt ids[] de la zona spidev, y el dispositivo esclavo SPI se puede crear como un dispositivo spidev. Si no desea escribir un controlador de dispositivo spi separado, basta con usar el controlador de dispositivo spidev general proporcionado por el kernel de Linux, que proporciona una operación de dispositivo de caracteres unificado, por lo que solo necesita leerlo, escribirlo y controlarlo en la capa de aplicación.

Introducción al controlador de Spidev

spidev es un controlador del kernel de Linux para comunicarse con dispositivos SPI (interfaz periférica en serie). SPI es un protocolo de comunicación en serie síncrono de dúplex completo que se usa comúnmente para interconectar microcontroladores y dispositivos externos. El controlador spidev permite que los programas del espacio de usuario se comuniquen con los dispositivos SPI a través de la interfaz de archivos del dispositivo Linux. Los usuarios pueden enviar y recibir datos SPI abriendo, leyendo y escribiendo archivos de dispositivos. El controlador spidev proporciona un conjunto de comandos ioctl para controlar los puertos IO y los parámetros SPI.

Al mismo tiempo, el kernel de Linux también integra la herramienta de prueba SPI spidev test, que se utiliza para probar y verificar la función dinámica de spidev en modo usuario.

La ubicación del código fuente del controlador del dispositivo Spidev es: linux-imx-4.1.15\drivers\spi\spidev.c

Diagrama del marco del conductor:

Además de usar el controlador spidev, por supuesto, también puede escribir su propio controlador SPI.

El uso del controlador spidev existente puede simplificar el proceso de desarrollo, ya que proporciona un conjunto de interfaces de espacio de usuario, que pueden usar directamente las funciones estándar de operación de archivos (como abrir, leer, escribir e ioctl) en la aplicación para operar el dispositivo SPI. Este método es adecuado para la mayoría de los escenarios de aplicación, especialmente para operaciones simples de dispositivos SPI, que pueden realizar funciones rápidamente.

Si usa el controlador SPI escrito por usted mismo, no es demasiado problemático. Debe implementar el subsistema SPI en el kernel, incluido el controlador del controlador SPI y el controlador del dispositivo SPI, y finalmente implementar una interfaz de operación del controlador de dispositivo de tipo carácter para Aplicaciones de capa superior Solo úsalo.

Pasos de uso de la capa de aplicación

Los pasos para usar el controlador spidev en la capa de aplicación de usuario son los siguientes:

1. Abra el archivo del dispositivo SPI: los usuarios pueden acceder al dispositivo SPI abriendo el archivo /dev/spidevX.Y, donde X es el número del controlador SPI e Y es el número del dispositivo SPI.

2. Configure los parámetros SPI: los usuarios pueden usar los comandos ioctl SPI_IOC_WR_MODE, SPI_IOC_WR_BITS_PER_WORD y SPI_IOC_WR_MAX_SPEED_HZ para establecer parámetros como el modo SPI, los bits de datos y la velocidad del reloj.

3. Enviar y recibir datos: los usuarios pueden usar llamadas del sistema de lectura y escritura para enviar y recibir datos SPI. Los datos escritos se transferirán al dispositivo SPI, mientras que los datos leídos del dispositivo se almacenarán en un búfer proporcionado por el usuario.

4. Cierre el archivo del dispositivo SPI: cuando ya no sea necesario comunicarse con el dispositivo SPI, el usuario debe cerrar el archivo del dispositivo SPI.

En resumen, el controlador spidev proporciona una forma sencilla y flexible de comunicarse con dispositivos SPI, lo que permite a los usuarios desarrollar y controlar fácilmente dispositivos SPI en sistemas Linux.

configuración del núcleo

Habilitar el controlador de modo de usuario de Spidev

En el archivo de configuración generado, puede ver que las siguientes configuraciones surtieron efecto. El mío está en el archivo de configuración del kernel de Linux de imx_v7_defconfig de la placa de desarrollo imx6ul.

CONFIG_SPI=y
CONFIG_SPI_GPIO=y
CONFIG_SPI_IMX=y
CONFIG_SPI_SPIDEV=y

Escribir árbol de dispositivos

&ecspi3 {
        fsl,spi-num-chipselects = <2>;/*cs管脚数配置*/
        cs-gpios = <0>,<&gpio1 20 GPIO_ACTIVE_LOW>;/*cs管脚配置*/
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_ecspi3>;
        status = "okay";/* status属性值为"okay" 表示该节点使能*/

	spidev: icm20608@0 {
	compatible = "alientek,icm20608";
        spi-max-frequency = <8000000>;
        reg = <0>;/*spi设备是没有设备地址的, 这里是指使用spi控制器的cs-gpios里的第几个片选io */
    };

	oled: oledsh1106@1 {
	compatible = "yang,oledsh1106";/*重要,会匹配spidev.c中指定的compatible*/
	spi-cpol;/*配置spi信号模式*/
	spi-cpha;
	spi-max-frequency = < 8000000 >;/* 指定spi设备的最大工作时钟 */
    reg = <1>;
    };
};

Nota anterior: si hay varios dispositivos esclavos montados bajo la interfaz spi, debe configurar fsl, spi-num-chipselects = <2>; el valor predeterminado es 1. Otra cosa a tener en cuenta es que la señal de selección del chip cs-gpios debe configurarse con el número correspondiente. Lo anterior es para configurar dos pines GPIO de selección de chip, el primero es predeterminado y el segundo está especificado. Si solo hay un dispositivo esclavo, puede configurar cs-gpio. Preste atención a la diferencia entre cs-gpio y cs-gpios, puede haber múltiples identificadores con s.

Si se ignora la configuración del recuento de pines CS, se producirá el siguiente error:

Necesita configurar fsl,spi-num-chipselects = <2>; 

Preste atención al atributo compatible anterior, en la nueva versión del kernel de Linux, puede escribir cualquier cadena, es mejor no escribir "spidev", la versión anterior debe escribirse como "spidev". La razón dada es: nunca se debe hacer referencia a spidev en DT sin una cadena compatible específica ,  es una implementación de Linux más que una descripción del hardware.

Además, hay algunas configuraciones adicionales, los siguientes son atributos personalizados, que se utilizan para especificar el método de temporización de trabajo y otras configuraciones de funciones. Si CPOL debe establecerse en 1, solo necesita agregar el atributo "spi-cpol" en el nodo del dispositivo spi; si CPOL se establece en 0, no puede escribir el atributo "spi-cpol".

buswidth = <8>; /* 传输以8位为单位 */
mode = <0>; /* 使用第几种工作时序(CPOL, CPHA) */
/*但在现用的内核源码里发现, spi设备的工作时序并不是用mode属性值来指定的*/
/* 如CPOL需要设1, 则只需在spi设备节点里加上"spi-cpol"属性即可; CPOL设0,则不写"spi-cpol"属性即可 */
/* CPHA设1时,则在设备节点里加上"spi-cpha"属性即可 */ 

configuración pinctrl

pinctrl_ecspi3: ecspi3grp {
                fsl,pins = <
                        MX6UL_PAD_UART2_RTS_B__ECSPI3_MISO        0x100b1  /* MISO*/
                        MX6UL_PAD_UART2_CTS_B__ECSPI3_MOSI        0x100b1  /* MOSI*/
                        MX6UL_PAD_UART2_RX_DATA__ECSPI3_SCLK      0x100b1  /* CLK*/
                        MX6UL_PAD_UART2_TX_DATA__GPIO1_IO20       0x100b0  /* CS*/
                    >;
            };

Compilar el kernel y el árbol de dispositivos

#加载环境
source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
#编译内核
make zImage -j16
#编译指定的设备树
make imx6ull-14x14-nand-4.3-480x272-c.dtb

Modificar el controlador de Spidev

El spidev.c predeterminado no coincide con el dispositivo que agregó, por lo que debe modificar el código de spidev.c para agregar coincidencias compatibles.

/* The main reason to have this class is to make mdev/udev create the
 * /dev/spidevB.C character device nodes exposing our userspace API.
 * It also simplifies memory management.
 */

static struct class *spidev_class;

//#ifdef CONFIG_OF
static const struct of_device_id spidev_dt_ids[] = {
	{ .compatible = "rohm,dh2228fv" },
  { .compatible = "yang,oledsh1106" },
	{},
};
MODULE_DEVICE_TABLE(of, spidev_dt_ids);
//#endif

Una vez que el núcleo se haya compilado correctamente, actualice los archivos del árbol del núcleo y del dispositivo. Después de iniciar el dispositivo, puede confirmar cuántos dispositivos spi ha enumerado spidev en /sys/class/spidev.

Vista de árbol de dispositivos

Compruebe si hay nodos recién agregados en el árbol de dispositivos:

Después de actualizar el árbol de dispositivos a la placa, verifique si se genera el nodo del dispositivo spi:

Herramientas de prueba de código abierto

El controlador spidev tiene herramientas de prueba listas para usar. Una de las herramientas de prueba más utilizadas es spi_test, que es una herramienta de prueba que viene con el controlador spidev y se puede usar para probar y depurar dispositivos SPI. spi_test puede establecer varios parámetros de dispositivos SPI a través de parámetros de línea de comandos, como archivos de dispositivo, velocidad de transmisión, orden de bytes, etc. Utilice spi_test para enviar y recibir datos SPI para verificar la funcionalidad y el rendimiento del controlador spidev.

En la ruta del código fuente linux-imx-4.1.15-2.1.0-v2.7\Documentation\spi, hay dos archivos de código fuente de las herramientas de prueba, los archivos spidev_fdx.c y spidev_test.c. Se puede compilar directamente en archivos ejecutables. Todas estas herramientas se implementan en función del controlador de dispositivo general spidev y los comandos ioctl correspondientes, que se pueden usar convenientemente para probar el controlador general spi.

método de compilación

#加载环境
source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
#编译
$(CC) spidev_fdx.c -o spidev_fdx
$(CC) spidev_test.c -o spidev_test

prueba de bucle invertido

Primero, cortocircuite las interfaces MISO y MOSI de la interfaz spi.

En segundo lugar, compile el código de prueba:

Documentación/spi/spidev_test.c

Por ejemplo, envíe la cadena "string_to_send" en /dev/spidev2.0 para mostrar los datos enviados y recibidos:

 ./spidev_test -D /dev/spidev2.0 -v -p string_to_send

Si desea enviar datos de 32 bits/16 bits, primero debe generar un archivo binario, como generar datos aleatorios de 32 bytes:

dd if=/dev/urandom of=test_data bs=16 count=2

Use hexdump para ver este archivo binario:

hexdump -v test_data -C

00000000 74 6a 59 3e 1e 81 73 fb 5a 3f 94 c7 d8 20 ca e9 |tjY>..sZ?... ..|

00000010 24 2e a5 68 75 ab f7 12 af e6 c1 3d e2 d8 9a ba |$..hu......=....|

00000020

enviar:

./spidev_test -D /dev/spidev2.0 -b 32 -v -i test_data

  

Finalmente, la salida es correcta si es igual a la entrada.

epílogo

En esta era de comida rápida, insista en ser usted mismo, disminuya la velocidad, reflexione con gran concentración, asómbrese y comprenda el conocimiento, solo entonces podrá llegar a las raíces, perforar el cielo hacia arriba y avanzar con el mundo. ¡en tu espalda!

otros recursos

El uso de spidev (API de modo de usuario SPI)

Uso de spidev para impulsar OLED basado en Linux - Tecnología integrada - Papel electrónico

La pantalla OLED de 0,96 pulgadas se trasplanta al sistema Linux equipado con mx6ull_AURORA1997's Blog-CSDN Blog

Desarrollo de controladores integrados de Linux: resuelva el problema de que no hay un archivo de dispositivo spi correspondiente en /sys/bus/spi/devices - Se busca programador

Desarrollo de controladores integrados de Linux: resuelva el problema de que no hay un archivo de dispositivo spi correspondiente en /sys/bus/spi/  devices Blog de spidev0_blog_xu - Blog de CSDN

Escribir controlador de dispositivo SPI_Cómo programar el programa spi_Blog de Hilbert(*^*)-Blog de CSDN

154 spidev: SPI "universal" driver_Tu placa echa humo Blog-CSDN Blog

Desarrollo del controlador i.MX6ULL | 14 - Lea el sensor ICM-20608 basado en el marco del controlador SPI de Linux_Blog técnico de MCUlover666_Blog de 51CTO

Aprendizaje del árbol de dispositivos (9) Proceso de registro de dispositivos SPI_spi_lsb_first_kunkliu's Blog-CSDN Blog

https://www.cnblogs.com/lknlfy/p/3265019.html

El dispositivo spi en el árbol de dispositivos y el flujo de procesamiento del kernel al nodo spi

Dos métodos de controlador SPI para Linux integrado_linux spidev_iot-lorawan's Blog-CSDN Blog

Supongo que te gusta

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