工具/软件:
您好:
我尝试获取在 Linux 下运行的 AM6442 的 SPI1 模块。 虽然我在第一个信道 RESP 方面似乎很成功。 与 SPI1_CS0 关联的通道 0、使通道 1 与 SPI1_CS1 关联时也存在一些问题。
到目前为止、我做了什么:
我确实遵循了官方文档所说的内容: https://software-dl.ti.com/processor-sdk-linux/esd/AM64X/11_00_09_04/exports/docs/linux/Foundational_Components /内核/ Kernel_Drivers / SPI.html
但是,我发现现实中的情况有些不同。
首先、我扩展了 Linux 器件树文件 board-support/ti-linux-kernel-6.12.17+git-ti/arch/arm64/boot/dts/ti/k3-am642-evm.dts 的 main_pmx0-section 、如下所示:
SPI1_PINS_s0:SPI1_PINS_s0{
pinctrl-single、pins =<
AM64X_IOPAD (0x021c、PIN_OUTPUT、0)/* SPI1_CS0 */
AM64X_IOPAD (0x0220、PIN_OUTPUT、0)/* SPI1_CS1 *
AM64X_IOPAD (0x0224、PIN_OUTPUT、0)/* SPI1_CLK *
AM64X_IOPAD (0x0228、PIN_OUTPUT、0)/* SPI1_MOSI */
AM64X_IOPAD (0x022c、PIN_INPUT_PULLDOWN、0)/* SPI1_MISO */
>;
};
这是为了定义直接的 PAD 函数、该函数也适用于通道 0。 这应该没问题。
接下来、我在器件树文件的末尾附加了以下块:
&MAIN_SPI1{
状态=“正常“;
pinctrl-names =“default";“;
pinctrl-0 =<&SPI1_pins_s0>;
TI、pindir-d0-out-D1-in;
spidev@0{
SPI-max-frequency =<24000000>;
reg =<0>;
compatible =“Rohm、dh2228fv“;
数据大小=<8>;
};
Spidev@1{
SPI-max-frequency =<24000000>;
reg =<1>;
compatible =“Rohm、dh2228fv“;
数据大小=<8>;
};
};
我的理解是、这定义了两个 spidev 通道 0 和 1。 这里分配给 reg 的值与相应的信道编号匹配似乎很重要。
使用 make linux-dtbs 构建新的设备树 是完美无瑕的。 相应地安装相应的.dtb 文件并引导系统后、有一个新的器件文件/dev/spidev2.0 可用。 实际上、应该也 可以在/dev/spidev2.1 上获取。 但事实并非如此。
当我扫描 dmesg 以查找与 SPI 相关的条目时、我找到这些条目:
[ 21.390687] SPI_MASTER SPI2:SPI_DEVICE 寄存器错误/bus@f4000/SPI@20110000/spidev@1
[ 21.484859] SPI_MASTER SPI2:无法为/bus@f4000/SPI@20110000/spidev@1 创建 SPI 器件
因此、显然在使第二个通道正常工作时存在一些问题。
问题是这是 spidev 驱动程序中的一些错误还是某些不受支持的功能、还是我在这里做了什么?
除此之外、我可以说、通过内核源代码 (tools/spidev_test.c) 中的 spidev 测试程序处理通道 0 就像处理通道 0 一样。
谢谢、
Mario