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.

[参考译文] AM3354:GPMC:单个芯片选择上同一器件的多个实例

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1241868/am3354-gpmc-multiple-instances-of-same-device-on-a-single-chip-select

器件型号:AM3354

团队、您好!

我们有一个基于 AM3354、运行内核5.10的定制平台。 在 GPMC 总线上、我们在第一个芯片选择(CS0)上有一个 NAND 闪存、其运行正常。 在第二个芯片选择(CS1)上、我们有多个兼容 NS16550的外部 UART (XR16M752)实例。

GPMC 片选会启用所有外部 UART、然后应根据 GPMC_A3/4/5的值选择其中一个。 我在器件树中使用以下代码段仅启用了 UART 的第一个实例

ext_uart@1,0 {
		compatible = "ns16550a";
		reg = <1 0 0x01000000>;

		#address-cells = <1>;
		#size-cells = <1>;

		fifo-size = <64>;

		clock-frequency = <3686400>;

		bank-width = <1>;
		gpmc,device-width = <1>;	/* 8-bit data width */
		gpmc,cs-on-ns = <0>;		/* Assertion time */
		gpmc,cs-rd-off-ns = <20>;	/* Read deassertion time */
		gpmc,cs-wr-off-ns = <20>;	/* Write deassertion time */
		gpmc,sync-clk-ps = <20000>;
	};

捕获和存储数据。 在运行时、已成功探测器件、

[    2.320974] 9000000.ext_uart: ttyS1 at MMIO 0x9000000 (irq = 0, base_baud = 230400) is a 16550A

但是、当我尝试写入 ttyS1时,

# echo 1 >/dev/ttyS1

目标挂起。 我正在继续我的调查,但希望在这个过程的早期得到专家的意见。

我有以下初始问题

此致、

阿瓦伊斯

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

    您好、Awais:

    是否有可用的 GPMC 总线示例,该总线将在同一芯片选择上使用多个子设备?

    不在 SDK 中。 我也不知道有任何其他类似的参考设计。

    是否可以使用 GPMC_A3/4/5选择子设备?

    我认为理论上这是可能的、但取决于电路板设计、如何使用这些地址引脚控制子器件以及如何在您的定制 GPMC 驱动器中实现逻辑。

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

    事实证明、GPMC 似乎对其 CS 时序非常敏感。 在浏览了 UART 的数据表并对时序进行调整后、我能够做到这一点。 最后一个节点具有以下设置

            compatible = "ns16550a";
    		reg = <1 0 8>; /* CS1, device offset in CS mem, size of device mem */
    		
    		/* UART settings */
    		reg-shift = <0>;
    		reg-io-width = <1>;
    		fifo-size = <64>;
    		clock-frequency = <3686400>;
    
    		bank-width = <1>;
    
    		/* For the same CS, timing data is only required in the first node */
    		gpmc,mux-add-data = <0>;
    		gpmc,device-width = <1>;
    		gpmc,cycle2cycle-samecsen;
    		gpmc,cycle2cycle-diffcsen;
    		gpmc,cs-on-ns = <10>;
    		gpmc,cs-rd-off-ns = <10>;
    		gpmc,cs-wr-off-ns = <10>;
    		gpmc,oe-on-ns = <10>;
    		gpmc,oe-off-ns = <10>;
    		gpmc,we-on-ns = <10>;
    		gpmc,we-off-ns = <10>;
    		gpmc,rd-cycle-ns = <50>;
    		gpmc,wr-cycle-ns = <50>;
    		gpmc,access-ns = <40>;
    		gpmc,bus-turnaround-ns = <40>;
    		gpmc,cycle2cycle-delay-ns = <40>;

    GPMC 接口似乎非常灵活且易于使用(至少在 Linux BSP 上是如此)。 然而,我认为它没有充分的文件记录的任何地方如何总的流量(在原则上)在这里花了很多时间...

    此外、在 OMAP-GPMC.c 驱动程序中还有一个错误、根据我的理解、它无法正确处理 CS 命名。 然后尝试向上游提交补丁、我们可以看到。