SPI 硬件测试(STM32MP157CAA)

问题描述 投票:0回答:1

我已经开始考虑编写一个测试程序/脚本来测试 SPI 总线接口之一(在当前的板上称为 SPI6)的功能。我试图在开始编写测试之前完成所有的跑腿工作。我也在等待硬件团队提供 SPI 从机硬件。与此同时,我在代码和互联网上进行了一些搜索。我已经找到了一些与此相关的信息。但是,我有一个疑问,我想请求您的帮助。

我查看了内核(下面是我们目前使用的STM内核):

# uname -a 
Linux buildroot 5.15.67 #1 SMP PREEMPT Tue Feb 6 16:12:01 GMT 2024 armv7l GNU/Linux

我可以看到以下内容:

# ls -la /sys/bus/spi/devices/spi0.
spi0.0/ spi0.1/ spi0.2/ spi0.3/ spi0.4/

# ls -la /sys/class/spi_master/spi
spi0/ spi1/

# ls -la /sys/class/spi_
spi_master/ spi_slave/

# ls -la /sys/class/spi_master/
total 0
drwxr-xr-x 2 root root 0 Feb 7 08:18 .
drwxr-xr-x 58 root root 0 Feb 7 08:18 ..
lrwxrwxrwx 1 root root 0 Feb 7 10:01 spi0 -> ../../devices/platform/soc/44004000.spi/spi_master/spi0
lrwxrwxrwx 1 root root 0 Feb 7 10:01 spi1 -> ../../devices/platform/soc/5c001000.spi/spi_master/spi1

# ls -la /sys/class/spi_slave/
total 0
drwxr-xr-x 2 root root 0 Feb 7 08:18 .
drwxr-xr-x 58 root root 0 Feb 7 08:18 ..

我检查了我们正在使用的 .config 文件,并且存在以下配置选项:

CONFIG_SPI=y
CONFIG_SPI_DEBUG=y
CONFIG_SPI_STM32=m
CONFIG_SPI_STM32_QSPI=y
CONFIG_SPI_SPIDEV=y
CONFIG_SPI_MASTER=y

我还可以看到以下模块:

# lsmod | grep -i spi
spi_stm32 24576 0 

但是,我希望在 /dev 下看到 spi 节点,但我看不到:

# ls -la /dev/spi*
ls: /dev/spi*: No such file or directory

我还没有任何从设备连接到总线。如果我在这里缺少什么,有人可以建议吗?如果需要的话,如果我错过了任何可能有助于理解问题的内容,请询问更多信息。

我正在从下面的 dts 文件中复制 SPI6(我感兴趣的 spi 接口)条目

&spi6{
        pinctrl-names = "default", "sleep";
        pinctrl-0 = <&spi6_pins_mx &spi6_pins_z_mx>;
        pinctrl-1 = <&spi6_sleep_pins_mx &spi6_sleep_pins_z_mx>;
        status = "okay";

        /* USER CODE BEGIN spi6 */
        /* USER CODE END spi6 */
};

        spi6_pins_mx: spi6_mx-0 {
                pins {
                        pinmux = <STM32_PINMUX('G', 14, AF5)>; /* SPI6_MOSI */
                        bias-disable;
                        drive-push-pull;
                        slew-rate = <1>;
                };
        };

        spi6_sleep_pins_mx: spi6_sleep_mx-0 {
                pins {
                        pinmux = <STM32_PINMUX('G', 14, ANALOG)>; /* SPI6_MOSI */
                };
        };

        spi6_pins_z_mx: spi6_mx-0 {
                pins {
                        pinmux = <STM32_PINMUX('Z', 0, AF8)>, /* SPI6_SCK */
                                         <STM32_PINMUX('Z', 1, AF8)>; /* SPI6_MISO */
                        bias-disable;
                        drive-push-pull;
                        slew-rate = <1>;
                };
        };

        spi6_sleep_pins_z_mx: spi6_sleep_mx-0 {
                pins {
                        pinmux = <STM32_PINMUX('Z', 0, ANALOG)>, /* SPI6_SCK */
                                         <STM32_PINMUX('Z', 1, ANALOG)>; /* SPI6_MISO */
                };
        };

我现在已在 u-boot 和内核 dts 文件的 spi6 条目中添加了以下子项,如下所示:

&spi6{
        pinctrl-names = "default", "sleep";
        pinctrl-0 = <&spi6_pins_mx &spi6_pins_z_mx>;
        pinctrl-1 = <&spi6_sleep_pins_mx &spi6_sleep_pins_z_mx>;
        status = "okay";

        /* USER CODE BEGIN spi6 */
        spidev@0{
            compatible = "st,stm32h7-spi";
            reg = <0>;
            spi-max-frequency = <1000000>;
        };
        /* USER CODE END spi6 */
};

现在我可以看到内核日志显示子进程已注册:

Feb  8 14:46:31 buildroot user.debug kernel: [    4.443136] spi_stm32 5c001000.spi: 8 x 8-bit fifo size
Feb  8 14:46:31 buildroot user.debug kernel: [    4.443179] spi_stm32 5c001000.spi: 16-bit maximum data frame
Feb  8 14:46:31 buildroot user.debug kernel: [    4.443921] spi_stm32 5c001000.spi: registered master spi1
Feb  8 14:46:31 buildroot user.debug kernel: [    4.444284] spi spi1.0: setup mode 0, 8 bits/w, 1000000 Hz max --> 0
Feb  8 14:46:31 buildroot user.debug kernel: [    4.450214] spi_stm32 5c001000.spi: registered child spi1.0
Feb  8 14:46:31 buildroot user.info kernel: [    4.450270] spi_stm32 5c001000.spi: driver initialized (master mode)

但是,当我检查 /dev/ 时,孩子没有出现在列表中:

# ls -la /dev/s
shm/    stderr  stdin   stdout

我不确定我在 dts 文件中添加的部分中的以下字符串:

compatible = "st,stm32h7-spi";

我从为 stm32mpu 所做的 grep 中复制了它,发现它用于 spi6。这有影响吗?

附加信息:CONFIG_SPI_SPIDEV 在内核配置中设置:

# cat /proc/config.gz | gunzip | grep CONFIG_SPI_SPIDEV
CONFIG_SPI_SPIDEV=y
spi
1个回答
0
投票

按照 @droptop 建议在 spi6 dts 条目下添加一个子节点,我最终可以使用 STM 链接中描述的以下条目来实现此功能:https://wiki.st.com/stm32mpu/wiki/如何使用 SPI_from_Linux_userland_with_spidev

kernel/stm32mp157c-ccb-mx.dts
&spi6{
        pinctrl-names = "default", "sleep";
        pinctrl-0 = <&spi6_pins_mx &spi6_pins_z_mx>;
        pinctrl-1 = <&spi6_sleep_pins_mx &spi6_sleep_pins_z_mx>;
        status = "okay";

        /* USER CODE BEGIN spi6 */
        spidev@0{
            compatible = "rohm,dh2228fv";
            reg = <0>;
            spi-max-frequency = <4000000>;
        };
        /* USER CODE END spi6 */
};

and also in 
CA7/DeviceTree/ccb/u-boot/stm32mp157c-ccb-mx.dts
&spi6{
        pinctrl-names = "default", "sleep";
        pinctrl-0 = <&spi6_pins_mx &spi6_pins_z_mx>;
        pinctrl-1 = <&spi6_sleep_pins_mx &spi6_sleep_pins_z_mx>;
        status = "okay";

        /* USER CODE BEGIN spi6 */
        spidev@0{
            compatible = "rohm,dh2228fv";
            reg = <0>;
            spi-max-frequency = <4000000>;
        };
        /* USER CODE END spi6 */
};

我的内核配置如下:

# cat /proc/config.gz | gunzip | grep  -w CONFIG_SPI
CONFIG_SPI=y
# cat /proc/config.gz | gunzip | grep  -w CONFIG_SPI_MASTER
CONFIG_SPI_MASTER=y
# cat /proc/config.gz | gunzip | grep  -w CONFIG_SPI_STM32
CONFIG_SPI_STM32=m
# cat /proc/config.gz | gunzip | grep  -w CONFIG_SPI_SPIDEV
CONFIG_SPI_SPIDEV=y
# cat /proc/config.gz | gunzip | grep  -w CONFIG_SPI_DEBUG
CONFIG_SPI_DEBUG=y

执行此操作后,我可以在 /dev 下看到 spi 子节点,如下所示:

# ls -la /dev/spidev1.0 
crw-rw----    1 root     root      153,   0 Feb  8 19:22 /dev/spidev1.0

为了检查这是否有效,我运行了 spidev_test,我可以看到这个:

# spidev_test -D /dev/spidev1.0 -v
spi mode: 0x0
bits per word: 8
max speed: 500000 Hz (500 KHz)
TX | FF FF FF FF FF FF 40 00 00 00 00 95 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0 0D  | ......@....�..................�.
RX | FF FF FF FF FF FF 40 00 00 00 00 95 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0 0D  | ......@....�..................�.

非常感谢@droptop引导我走向正确的方向。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.