This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] SK-AM69:MCU_SPI1上有多个 SPI EPPROM 从器件、但只探测了一个 MCU_SPI1_CS2从器件。

Guru**** 2393095 points
Other Parts Discussed in Thread: TDA4VM

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1490339/sk-am69-multiple-spi-epprom-slaves-on-mcu_spi1-but-only-one-mcu_spi1_cs2-slave-probed

器件型号:SK-AM69
Thread 中讨论的其他器件:TDA4VMAM69

工具/软件:

你(们)好

我尝试使用两个连接到 MCU_SPI1的 SPI 从器件(EEPROM)。

当我 modprobe "spi-nor"设备驱动程序时、仅探测一个 EEPROM。

root@am69-sk:~# modprobe spi-nor
[   41.251088] spi-nor spi0.2: n25q00a (131072 Kbytes)

我正在使用的设备树:

&wkup_pmx2 {
	bootph-all;
    fpga_card_spi_pins: fpga-card-spi-pins {
		bootph-all;
        pinctrl-single,pins = <
            J784S4_WKUP_IOPAD(0x058, PIN_INPUT, 0) /* (H38) WKUP_GPIO0_0.MCU_SPI1_CLK */	/* CARD_SPI_CLK */
            J784S4_WKUP_IOPAD(0x064, PIN_INPUT, 1) /* (J36) WKUP_GPIO0_3.MCU_SPI1_CS0 */	/* CARD_SPI_CS0 */
            J784S4_WKUP_IOPAD(0x094, PIN_INPUT, 1) /* (K37) WKUP_GPIO0_15.MCU_SPI1_CS2 */	/* CARD_SPI_CS1 */
            J784S4_WKUP_IOPAD(0x05c, PIN_INPUT, 0) /* (J34) WKUP_GPIO0_1.MCU_SPI1_D0 */	/* CARD_SPI_AP_OUT */
            J784S4_WKUP_IOPAD(0x060, PIN_INPUT, 0) /* (J35) WKUP_GPIO0_2.MCU_SPI1_D1 */	/* CARD_SPI_AP_IN */
        >;
    };
};
    
&mcu_spi1 {
	status = "okay";

	pinctrl-names = "default";
	pinctrl-0 = <&fpga_card_spi_pins>;

	ti,pindir-d0-out-d1-in;
	ti,spi-num-cs = <3>;

	spi-max-frequency = <50000000>;

	internal-connection-fixup;

	primary: primary@0 {
		compatible = "jedec,spi-nor";
		// compatible = "rohm,dh2228fv";
		reg = <0>; // CS_0
		spi-max-frequency = <1000000>;
		status = "okay";
		spi-cpha;
		spi-cpol;
	};

	secondary: secondary@2 {
		compatible = "jedec,spi-nor";
		// compatible = "rohm,dh2228fv";
		reg = <2>; // CS_2
		spi-max-frequency = <1000000>;
		status = "okay";
		spi-cpha;
		spi-cpol;
	};
};

由于我已通过 "Rohm、dh2228fv"驱动程序成功读取了我的所有 EEPROM ID、因此硬件不是问题。

谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:

    我已将其分配给 Linux SPI 专家。请给他一些时间回复。

    此致

    Tarun Mukesh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我忘记提及我添加了以下代码来设置 CTRL_MMR_SPI1。

    static int omap2_mcspi_probe(struct platform_device *pdev)
    	if (of_property_read_bool(node, "internal-connection-fixup")) {
    		ctrl_mmr_mcu_spi1_ctrl = ioremap(0x40f04060, 4);
    		writel_relaxed(1, ctrl_mmr_mcu_spi1_ctrl);
    	}
    ...

    这是提到的: https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1484800/sk-am69-mcu_spi1-failed-to-rx

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Mingsoo:

    用于 CS2的引脚多路复用 K37用于 MCU_UART0、该器件通常用于 UART 引导模式。

    1. 您能否检查是否在器件树中的其他位置对其进行引脚多路复用?
    2. 您能否使用 devmem2或 CCS 检查 padconfig 寄存器的内容? K37的寄存器应为 0x4301C0FC

    此致、

    Takuma

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Takuma:

    您能否检查是否在器件树中的其他位置对其进行引脚多路复用?

    是、 我 检查了 MCU_UART0本身不使用参考引脚(K37)。

    // mcu_uart0 device node from k3-am69-sk.dts
    &mcu_uart0 {
    	bootph-all;
    	status = "okay";
    	pinctrl-names = "default";
    	pinctrl-0 = <&mcu_uart0_pins_default>;
    };
    
    // which uses mcu_uart0_pins_default.
    mcu_uart0_pins_default: mcu-uart0-default-pins {
    	bootph-all;
    	pinctrl-single,pins = <
    		J784S4_WKUP_IOPAD(0x08c, PIN_INPUT, 0) /* (K38) WKUP_GPIO0_13.MCU_UART0_RXD */
    		J784S4_WKUP_IOPAD(0x088, PIN_OUTPUT, 0) /* (J37) WKUP_GPIO0_12.MCU_UART0_TXD */
    	>;
    };

    我在 k3-AM69-sk.dts 上搜索了 K37、现在只有一个器件节点我在使用。

    您能否使用 devmem2或 CCS 检查 padconfig 寄存器的内容? K37的寄存器应为 0x4301C0FC

    以下是 devmem2的结果:0x00050001。

    我在寄存器上检查了 J36、该寄存器应为0x4301C0CC。

    此外、我发现、当我启动 Linux 时、好像没有第一个 SPI 从节点。
    ( 也应该会 显示 FPGA-FLASH-primary@0、但只会显示 FPGA-FLASH-secondary@2。)

    问题可能是由器件树引起的?

    P.S.

    是否有有助于搜索寄存器地址的程序?
    我知道提供了.xlsx 文件和 TRM、但很难找到我需要的信息。

    此致、

    Minsoo

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、民洙、

    另外、我发现当我启动 Linux 时、它显示为没有第一个 SPI 从节点。

    很棒的景点 看起来第一个 CS 应该比第二个 CS 更受关注。

    是否有一个程序可帮助搜索寄存器地址?
    我知道为此提供了.xlsx 文件和 TRM、但很难找到我需要的信息。

    很遗憾、不会 目前、.xlsx 是寄存器的最佳位置。

    [引述 userid="607989" url="~/support/processors-group/processors/f/processors-forum/1490339/sk-am69-multiple-spi-epprom-slaves-on-mcu_spi1-but-only-one-mcu_spi1_cs2-slave-probed/5727523 #5727523"]

    我在寄存器上检查了 J36、该寄存器应为0x4301C0CC。

    [/报价]

    它应包含与 K37的 padconfig 寄存器相同的值、但看起来没有设置 RXACTIVE 位。 这不应该会导致问题、但它与器件树不匹配(为 PIN_INPUT 配置此引脚)这一事实是有关联的。

    • 如果尚未这样做、您能否检查器件树以查看是否有地方覆盖 J36?  
    • 作为一个实验、您是否可以尝试将 CS0引脚复用为0而不是1?
      • 类似这样:"J784S4_WKUP_IOPAD (0x064、PIN_INPUT、 0 )/*(J36) WKUP_GPIO0_3.MCU_SPI1_CS0 */"
      • 0和1都应用于芯片选择、但以防这导致问题

    此致、

    Takuma

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Takuma:

    如果尚未执行此操作、您能否检查器件树以查看是否有覆盖 J36的位置?  [/报价]

    我检查了它、没有重复的 pincontrol 节点。

    作为一个实验、您能尝试将 CS0引脚复用为0而不是1吗?
    • 类似这样:"J784S4_WKUP_IOPAD (0x064、PIN_INPUT、 0 )/*(J36) WKUP_GPIO0_3.MCU_SPI1_CS0 */"
    • 0和1都应用于芯片选择、但以防这导致问题
    [/报价]

    我在发布答案时、认为我在图像版本上犯了一个错误。
    (当我截取屏幕截图时、I 将 CS0多路复用为 PIN_OUT。 这就是 RXACTIVE 位为0的原因。)


    这是将 CS0设置为0和 PIN_INPUT 之后的寄存器值。

    此外、我尝试仅启用 CS0节点即可进行引导。

    &mcu_spi1 {
    	bootph-all;
    	status = "okay";
    
    	pinctrl-names = "default";
    	pinctrl-0 = <&ettifos_card_spi_pins>;
    
    	ti,pindir-d0-out-d1-in;
    	ti,spi-num-cs = <3>;
    
    	// dmas = <&mcu_udmap 0xf200>, <&mcu_udmap 0x7200>,
    	// 	<&mcu_udmap 0xf201>, <&mcu_udmap 0x7201>,
    	// 	<&mcu_udmap 0xf202>, <&mcu_udmap 0x7202>;
    
    	// dma-names = "tx0", "rx0",
    	// 	"tx1", "rx1",
    	// 	"tx2",	"rx2";
    
    	spi-max-frequency = <50000000>;
    
    	internal-connection-fixup;
    
    	fpga-flash-primary@0 {
    		compatible = "micron,n25q00a", "jedec,spi-nor";
    		// compatible = "rohm,dh2228fv";
    		reg = <0>; // CS_0
    		spi-max-frequency = <1000000>;
    		status = "okay";
    		spi-cpha;
    		spi-cpol;
    	};
    
        // all commendted out
    	// fpga-flash-secondary@2 {
    	// 	compatible = "micron,n25q00a", "jedec,spi-nor";
    	// 	// compatible = "rohm,dh2228fv";
    	// 	reg = <2>; // CS_2
    	// 	spi-max-frequency = <1000000>;
    	// 	status = "okay";
    	// 	spi-cpha;
    	// 	spi-cpol;
    	// };
    };

    但仍然无法探测 CS0上的从器件。

    此致、

    Minsoo

    [/quote]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、民洙、

    到目前为止、我没有看到任何看起来不合适的东西... 也就是说、如果第二个闪存正常工作、则第一个闪存也应正常工作、因为除了 reg 属性和引脚多路复用看起来都设置正确之外、设置应该相同。

    您能否共享完整的 dmesg 日志以查看它是否显示任何错误?

    此致、

    Takuma

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、民洙、

    [引述 userid="607989" url="~/support/processors-group/processors/f/processors-forum/1490339/sk-am69-multiple-spi-epprom-slaves-on-mcu_spi1-but-only-one-mcu_spi1_cs2-slave-probed/5741946 #5741946"]

    是否有类似的情况?

    [/报价]

    对于我注意到的最近一个问题、有一个 开发人员 已 将 main_spi3下的4xspidev 节点成功用于名为 TDA4VM: https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1488250/tda4vm-the-spi-pin-status-is-incorrect/5728398?tisearch=e2e-sitesearch&keymatch=%252525252520user%25252525253A572765#5728398的类似处理器

    TDA4VM 和 AM69应使用相同的 McSPI 驱动器、因为它们都使用相同的兼容字段。

    [引述 userid="607989" url="~/support/processors-group/processors/f/processors-forum/1490339/sk-am69-multiple-spi-epprom-slaves-on-mcu_spi1-but-only-one-mcu_spi1_cs2-slave-probed/5741946 #5741946"] 鉴于此、我是否可以启用调试选项并检查日志?
    [/报价]

    它会提供更多信息、因为它会启用驱动程序中的所有 dev_dbg()消息。 TI McSPI 驱动程序有一个它启用的额外日志、我认为 Micron 驱动程序可能还有几个日志。

    另外需要注意的是、我们能否仔细检查原理图、看看 CS0和 CS2线路之间是否有任何不同(它们是否正确布线、有上拉/下拉电阻器等)、还要检查两个闪存器件是否有任何不同之处(例如额外的使能引脚或多路复用器、或者电源的布线方式不同)?

    此致、

    Takuma

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Takuma、

    我解决了问题。
    在加载二进制文件时、u-boot 似乎会删除设备树节点。

    // file: board/ti/j784s4/evm.c
    
    static void __maybe_unused detect_enable_spinand(void *blob)
    {
    	if (IS_ENABLED(CONFIG_DM_GPIO) && IS_ENABLED(CONFIG_OF_LIBFDT)) {
    		struct gpio_desc desc = {0};
    		char *ospi_mux_sel_gpio = "6";
    		int nand_offset, nor_offset;
    
    		if (dm_gpio_lookup_name(ospi_mux_sel_gpio, &desc))
    			return;
    
    		if (dm_gpio_request(&desc, ospi_mux_sel_gpio))
    			return;
    
    		if (dm_gpio_set_dir_flags(&desc, GPIOD_IS_IN))
    			return;
    
    		nand_offset = fdt_node_offset_by_compatible(blob, -1, "spi-nand");
    		nor_offset = fdt_node_offset_by_compatible(blob,
    							   fdt_parent_offset(blob, nand_offset),
    							   "jedec,spi-nor");
    
    		if (dm_gpio_get_value(&desc)) {
    			fdt_status_okay(blob, nand_offset);
    			// fdt_del_node(blob, nor_offset); // this line causes the problem. it deletes the device tree node with compatible="jedec,spi-nor"
    		} else {
    			fdt_del_node(blob, nand_offset);
    		}
    	}
    }

    在我注释掉代码并启动后、便可以成功探测代码。

    此致、

    Minsoo

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、民洙、

    很高兴你能弄清楚,并感谢你发布的决议。

    这看起来是 U-Boot 中特定于 TI-EVM 的提交、因为该 EVM 同时具有 OSPI NAND 和 NOR 闪存、并有一个多路复用器可在两者之间进行选择: https://git.ti.com/cgit/ti-u-boot/ti-u-boot/commit/board/ti/j784s4/evm.c?h=ti-u-boot-2024.04&id=3d101d595800fae13affa082d13108f8a2f5abee

    此致、

    Takuma