TI-J721E项目GPMC调试

说明:J721E这个芯片 TI官方是没有提供相关的配置支持的,芯片手册是有相关的gpmc的说明,故调试记录如下:

我们这个GPMC接口硬件上连接的是FPGA,作为大数据传输通信使用。

硬件原理图:

从硬件上使用了引脚复用的情况,故使用PinMux工具配置时特别注意

先给出完整设备树配置:

diff --git a/arch/arm64/boot/dts/ti/k3-j721e-common-proc-board.dts b/arch/arm64/boot/dts/ti/k3-j721e-common-proc-board.dts
index 36d245780..2a3fa1cb8 100644
--- a/arch/arm64/boot/dts/ti/k3-j721e-common-proc-board.dts
+++ b/arch/arm64/boot/dts/ti/k3-j721e-common-proc-board.dts
@@ -12,7 +12,7 @@
 
 / {
        compatible = "ti,j721e-sk", "ti,j721e";
        model = "Texas Instruments J721E Common";
 
        chosen {
                stdout-path = "serial2:115200n8";
@@ -418,7 +418,7 @@ J721E_IOPAD(0x20c, PIN_OUTPUT, 0) /* (W6) MCAN0_TX */
 
        main_mcan0_gpio_pins_default: main-mcan0-gpio-pins-default {
                pinctrl-single,pins = <
-                       J721E_IOPAD(0x108, PIN_INPUT, 7) /* (AD27) PRG0_PRU1_GPO2.GPIO0_65 */
+                       //J721E_IOPAD(0x108, PIN_INPUT, 7) /* (AD27) PRG0_PRU1_GPO2.GPIO0_65 */
                >;
        };
 
@@ -437,14 +437,14 @@ J721E_IOPAD(0x10c, PIN_INPUT, 7) /* (AC25) PRG0_PRU1_GPO3.GPIO0_66 */
 
        main_mcan9_pins_default: main-mcan9-pins-default {
                pinctrl-single,pins = <
-                       J721E_IOPAD(0xd0, PIN_INPUT, 6) /* (AC27) PRG0_PRU0_GPO8.MCAN9_RX */
-                       J721E_IOPAD(0xcc, PIN_OUTPUT, 6) /* (AC28) PRG0_PRU0_GPO7.MCAN9_TX */
+                       //J721E_IOPAD(0xd0, PIN_INPUT, 6) /* (AC27) PRG0_PRU0_GPO8.MCAN9_RX */
+                       //J721E_IOPAD(0xcc, PIN_OUTPUT, 6) /* (AC28) PRG0_PRU0_GPO7.MCAN9_TX */
                >;
        };
 
        main_mcan9_gpio_pins_default: main-mcan9-gpio-pins-default {
                pinctrl-single,pins = <
-                       J721E_IOPAD(0x110, PIN_INPUT, 7) /* (AD29) PRG0_PRU1_GPO4.GPIO0_67 */
+                       //J721E_IOPAD(0x110, PIN_INPUT, 7) /* (AD29) PRG0_PRU1_GPO4.GPIO0_67 */
                >;
        };
 
@@ -467,12 +467,12 @@ dss_vout0_pins_default: dss-vout0-pins-default {
                        //J721E_IOPAD(0x60, PIN_OUTPUT, 10) /* (AF23) PRG1_PRU1_GPO2.VOUT0_DATA2 */
                        //J721E_IOPAD(0x64, PIN_OUTPUT, 10) /* (AD23) PRG1_PRU1_GPO3.VOUT0_DATA3 */
                        //J721E_IOPAD(0x68, PIN_OUTPUT, 10) /* (AH24) PRG1_PRU1_GPO4.VOUT0_DATA4 */
-                       J721E_IOPAD(0x6c, PIN_OUTPUT, 10) /* (AG21) PRG1_PRU1_GPO5.VOUT0_DATA5 */
+                       //J721E_IOPAD(0x6c, PIN_OUTPUT, 10) /* (AG21) PRG1_PRU1_GPO5.VOUT0_DATA5 */
                        //J721E_IOPAD(0x70, PIN_OUTPUT, 10) /* (AE23) PRG1_PRU1_GPO6.VOUT0_DATA6 */
                        J721E_IOPAD(0x74, PIN_OUTPUT, 10) /* (AC21) PRG1_PRU1_GPO7.VOUT0_DATA7 */
                        J721E_IOPAD(0x78, PIN_OUTPUT, 10) /* (Y23) PRG1_PRU1_GPO8.VOUT0_DATA8 */
-                       J721E_IOPAD(0x7c, PIN_OUTPUT, 10) /* (AF21) PRG1_PRU1_GPO9.VOUT0_DATA9 */
-                       J721E_IOPAD(0x80, PIN_OUTPUT, 10) /* (AB23) PRG1_PRU1_GPO10.VOUT0_DATA10 */
+                       //J721E_IOPAD(0x7c, PIN_OUTPUT, 10) /* (AF21) PRG1_PRU1_GPO9.VOUT0_DATA9 */
+                       //J721E_IOPAD(0x80, PIN_OUTPUT, 10) /* (AB23) PRG1_PRU1_GPO10.VOUT0_DATA10 */
                        //J721E_IOPAD(0x84, PIN_OUTPUT, 10) /* (AJ25) PRG1_PRU1_GPO11.VOUT0_DATA11 */
                        //J721E_IOPAD(0x88, PIN_OUTPUT, 10) /* (AH25) PRG1_PRU1_GPO12.VOUT0_DATA12 */
                        //J721E_IOPAD(0x8c, PIN_OUTPUT, 10) /* (AG25) PRG1_PRU1_GPO13.VOUT0_DATA13 */
@@ -484,8 +484,8 @@ J721E_IOPAD(0x38, PIN_OUTPUT, 10) /* (AG24) PRG1_PRU0_GPO13.VOUT0_DATA18 */
                        J721E_IOPAD(0x3c, PIN_OUTPUT, 10) /* (AD24) PRG1_PRU0_GPO14.VOUT0_DATA19 */
                        J721E_IOPAD(0x40, PIN_OUTPUT, 10) /* (AC24) PRG1_PRU0_GPO15.VOUT0_DATA20 */
                        J721E_IOPAD(0x44, PIN_OUTPUT, 10) /* (AE24) PRG1_PRU0_GPO16.VOUT0_DATA21 */
-                       J721E_IOPAD(0x24, PIN_OUTPUT, 10) /* (AJ20) PRG1_PRU0_GPO8.VOUT0_DATA22 */
-                       J721E_IOPAD(0x28, PIN_OUTPUT, 10) /* (AG20) PRG1_PRU0_GPO9.VOUT0_DATA23 */
+                       //J721E_IOPAD(0x24, PIN_OUTPUT, 10) /* (AJ20) PRG1_PRU0_GPO8.VOUT0_DATA22 */
+                       //J721E_IOPAD(0x28, PIN_OUTPUT, 10) /* (AG20) PRG1_PRU0_GPO9.VOUT0_DATA23 */
                        J721E_IOPAD(0x9c, PIN_OUTPUT, 10) /* (AC22) PRG1_PRU1_GPO17.VOUT0_DE */
                        //J721E_IOPAD(0x98, PIN_OUTPUT, 10) /* (AJ26) PRG1_PRU1_GPO16.VOUT0_HSYNC */
                        J721E_IOPAD(0xa4, PIN_OUTPUT, 10) /* (AH22) PRG1_PRU1_GPO19.VOUT0_PCLK */
@@ -508,13 +508,13 @@ hdmi_pdn_pins_default: hdmi-pdn-pins-default {
        /* Reset for M.2 E Key slot on PCIe0  */
        ekey_reset_pins_default: ekey-reset-pns-pins-default {
                pinctrl-single,pins = <
-                       J721E_IOPAD(0x124, PIN_INPUT, 7) /* (Y24) PRG0_PRU1_GPO9.GPIO0_72 */
+                       //J721E_IOPAD(0x124, PIN_INPUT, 7) /* (Y24) PRG0_PRU1_GPO9.GPIO0_72 */
                >;
        };
 
        main_i2c5_pins_default: main-i2c5-pins-default {
                pinctrl-single,pins = <
-                       J721E_IOPAD(0x150, PIN_INPUT_PULLUP, 2) /* (Y26) PRG0_MDIO0_MDIO.I2C5_SCL */
+                       //J721E_IOPAD(0x150, PIN_INPUT_PULLUP, 2) /* (Y26) PRG0_MDIO0_MDIO.I2C5_SCL */
                        J721E_IOPAD(0x154, PIN_INPUT_PULLUP, 2) /* (AA27) PRG0_MDIO0_MDC.I2C5_SDA */
                >;
        };
@@ -522,28 +522,28 @@ J721E_IOPAD(0x154, PIN_INPUT_PULLUP, 2) /* (AA27) PRG0_MDIO0_MDC.I2C5_SDA */
        rpi_header_gpio0_pins_default: rpi-header-gpio0-pins-default {
                pinctrl-single,pins = <
                        J721E_IOPAD(0x01C, PIN_INPUT, 7) /* (AD22) PRG1_PRU0_GPO6.GPIO0_7 */
-                       J721E_IOPAD(0x120, PIN_INPUT, 7) /* (AA28) PRG0_PRU1_GPO8.GPIO0_71 */
-                       J721E_IOPAD(0x14C, PIN_INPUT, 7) /* (AA29) PRG0_PRU1_GPO19.GPIO0_82 */
+                       //J721E_IOPAD(0x120, PIN_INPUT, 7) /* (AA28) PRG0_PRU1_GPO8.GPIO0_71 */
+                       //J721E_IOPAD(0x14C, PIN_INPUT, 7) /* (AA29) PRG0_PRU1_GPO19.GPIO0_82 */
                        J721E_IOPAD(0x02C, PIN_INPUT, 7) /* (AD21) PRG1_PRU0_GPO10.GPIO0_11 */
-                       J721E_IOPAD(0x198, PIN_INPUT, 7) /* (V25) RGMII6_TD1.GPIO0_101 */
+                       //J721E_IOPAD(0x198, PIN_INPUT, 7) /* (V25) RGMII6_TD1.GPIO0_101 */
                        J721E_IOPAD(0x1B0, PIN_INPUT, 7) /* (W24) RGMII6_RD1.GPIO0_107 */
-                       J721E_IOPAD(0x1A0, PIN_INPUT, 7) /* (W29) RGMII6_TXC.GPIO0_103 */
+                       //J721E_IOPAD(0x1A0, PIN_INPUT, 7) /* (W29) RGMII6_TXC.GPIO0_103 */
                        J721E_IOPAD(0x008, PIN_INPUT, 7) /* (AG22) PRG1_PRU0_GPO1.GPIO0_2 */
                        //J721E_IOPAD(0x1D0, PIN_INPUT, 7) /* (AA3) SPI0_D1.GPIO0_115 */
-                       J721E_IOPAD(0x11C, PIN_INPUT, 7) /* (AA24) PRG0_PRU1_GPO7.GPIO0_70 */
-                       J721E_IOPAD(0x148, PIN_INPUT, 7) /* (AA26) PRG0_PRU1_GPO18.GPIO0_81 */
+                       //J721E_IOPAD(0x11C, PIN_INPUT, 7) /* (AA24) PRG0_PRU1_GPO7.GPIO0_70 */
+                       //J721E_IOPAD(0x148, PIN_INPUT, 7) /* (AA26) PRG0_PRU1_GPO18.GPIO0_81 */
                        J721E_IOPAD(0x004, PIN_INPUT, 7) /* (AC23) PRG1_PRU0_GPO0.GPIO0_1 */
                        J721E_IOPAD(0x014, PIN_INPUT, 7) /* (AH23) PRG1_PRU0_GPO4.GPIO0_5 */
                        J721E_IOPAD(0x020, PIN_INPUT, 7) /* (AE20) PRG1_PRU0_GPO7.GPIO0_8 */
-       };
-
-
        gpmc0: memory-controller@3b000000 {
                compatible = "ti,am64-gpmc";
                power-domains = <&k3_pds 80 TI_SCI_PD_EXCLUSIVE>;
diff --git a/arch/arm64/boot/dts/ti/k3-j721e-common-proc-board.dts b/arch/arm64/boot/dts/ti/k3-j721e-common-proc-board.dts
index 36d245780..2a3fa1cb8 100644
--- a/arch/arm64/boot/dts/ti/k3-j721e-common-proc-board.dts
+++ b/arch/arm64/boot/dts/ti/k3-j721e-common-proc-board.dts
@@ -12,7 +12,7 @@
 
 / {
        compatible = "ti,j721e-sk", "ti,j721e";
        model = "Texas Instruments J721E Common";
 
        chosen {
                stdout-path = "serial2:115200n8";
@@ -418,7 +418,7 @@ J721E_IOPAD(0x20c, PIN_OUTPUT, 0) /* (W6) MCAN0_TX */
 
        main_mcan0_gpio_pins_default: main-mcan0-gpio-pins-default {
                pinctrl-single,pins = <
-                       J721E_IOPAD(0x108, PIN_INPUT, 7) /* (AD27) PRG0_PRU1_GPO2.GPIO0_65 */
+                       //J721E_IOPAD(0x108, PIN_INPUT, 7) /* (AD27) PRG0_PRU1_GPO2.GPIO0_65 */
                >;
        };
 
@@ -437,14 +437,14 @@ J721E_IOPAD(0x10c, PIN_INPUT, 7) /* (AC25) PRG0_PRU1_GPO3.GPIO0_66 */
 
        main_mcan9_pins_default: main-mcan9-pins-default {
                pinctrl-single,pins = <
-                       J721E_IOPAD(0xd0, PIN_INPUT, 6) /* (AC27) PRG0_PRU0_GPO8.MCAN9_RX */
-                       J721E_IOPAD(0xcc, PIN_OUTPUT, 6) /* (AC28) PRG0_PRU0_GPO7.MCAN9_TX */
+                       //J721E_IOPAD(0xd0, PIN_INPUT, 6) /* (AC27) PRG0_PRU0_GPO8.MCAN9_RX */
+                       //J721E_IOPAD(0xcc, PIN_OUTPUT, 6) /* (AC28) PRG0_PRU0_GPO7.MCAN9_TX */
                >;
        };
 
        main_mcan9_gpio_pins_default: main-mcan9-gpio-pins-default {
                pinctrl-single,pins = <
-                       J721E_IOPAD(0x110, PIN_INPUT, 7) /* (AD29) PRG0_PRU1_GPO4.GPIO0_67 */
+                       //J721E_IOPAD(0x110, PIN_INPUT, 7) /* (AD29) PRG0_PRU1_GPO4.GPIO0_67 */
                >;
        };
 
@@ -467,12 +467,12 @@ dss_vout0_pins_default: dss-vout0-pins-default {
                        //J721E_IOPAD(0x60, PIN_OUTPUT, 10) /* (AF23) PRG1_PRU1_GPO2.VOUT0_DATA2 */
                        //J721E_IOPAD(0x64, PIN_OUTPUT, 10) /* (AD23) PRG1_PRU1_GPO3.VOUT0_DATA3 */
                        //J721E_IOPAD(0x68, PIN_OUTPUT, 10) /* (AH24) PRG1_PRU1_GPO4.VOUT0_DATA4 */
-                       J721E_IOPAD(0x6c, PIN_OUTPUT, 10) /* (AG21) PRG1_PRU1_GPO5.VOUT0_DATA5 */
+                       //J721E_IOPAD(0x6c, PIN_OUTPUT, 10) /* (AG21) PRG1_PRU1_GPO5.VOUT0_DATA5 */
                        //J721E_IOPAD(0x70, PIN_OUTPUT, 10) /* (AE23) PRG1_PRU1_GPO6.VOUT0_DATA6 */
                        J721E_IOPAD(0x74, PIN_OUTPUT, 10) /* (AC21) PRG1_PRU1_GPO7.VOUT0_DATA7 */
                        J721E_IOPAD(0x78, PIN_OUTPUT, 10) /* (Y23) PRG1_PRU1_GPO8.VOUT0_DATA8 */
-                       J721E_IOPAD(0x7c, PIN_OUTPUT, 10) /* (AF21) PRG1_PRU1_GPO9.VOUT0_DATA9 */
-                       J721E_IOPAD(0x80, PIN_OUTPUT, 10) /* (AB23) PRG1_PRU1_GPO10.VOUT0_DATA10 */
+                       //J721E_IOPAD(0x7c, PIN_OUTPUT, 10) /* (AF21) PRG1_PRU1_GPO9.VOUT0_DATA9 */
+                       //J721E_IOPAD(0x80, PIN_OUTPUT, 10) /* (AB23) PRG1_PRU1_GPO10.VOUT0_DATA10 */
                        //J721E_IOPAD(0x84, PIN_OUTPUT, 10) /* (AJ25) PRG1_PRU1_GPO11.VOUT0_DATA11 */
                        //J721E_IOPAD(0x88, PIN_OUTPUT, 10) /* (AH25) PRG1_PRU1_GPO12.VOUT0_DATA12 */
                        //J721E_IOPAD(0x8c, PIN_OUTPUT, 10) /* (AG25) PRG1_PRU1_GPO13.VOUT0_DATA13 */
@@ -484,8 +484,8 @@ J721E_IOPAD(0x38, PIN_OUTPUT, 10) /* (AG24) PRG1_PRU0_GPO13.VOUT0_DATA18 */
                        J721E_IOPAD(0x3c, PIN_OUTPUT, 10) /* (AD24) PRG1_PRU0_GPO14.VOUT0_DATA19 */
                        J721E_IOPAD(0x40, PIN_OUTPUT, 10) /* (AC24) PRG1_PRU0_GPO15.VOUT0_DATA20 */
                        J721E_IOPAD(0x44, PIN_OUTPUT, 10) /* (AE24) PRG1_PRU0_GPO16.VOUT0_DATA21 */
-                       J721E_IOPAD(0x24, PIN_OUTPUT, 10) /* (AJ20) PRG1_PRU0_GPO8.VOUT0_DATA22 */
-                       J721E_IOPAD(0x28, PIN_OUTPUT, 10) /* (AG20) PRG1_PRU0_GPO9.VOUT0_DATA23 */
+                       //J721E_IOPAD(0x24, PIN_OUTPUT, 10) /* (AJ20) PRG1_PRU0_GPO8.VOUT0_DATA22 */
+                       //J721E_IOPAD(0x28, PIN_OUTPUT, 10) /* (AG20) PRG1_PRU0_GPO9.VOUT0_DATA23 */
                        J721E_IOPAD(0x9c, PIN_OUTPUT, 10) /* (AC22) PRG1_PRU1_GPO17.VOUT0_DE */
                        //J721E_IOPAD(0x98, PIN_OUTPUT, 10) /* (AJ26) PRG1_PRU1_GPO16.VOUT0_HSYNC */
                        J721E_IOPAD(0xa4, PIN_OUTPUT, 10) /* (AH22) PRG1_PRU1_GPO19.VOUT0_PCLK */
@@ -508,13 +508,13 @@ hdmi_pdn_pins_default: hdmi-pdn-pins-default {
        /* Reset for M.2 E Key slot on PCIe0  */
        ekey_reset_pins_default: ekey-reset-pns-pins-default {
                pinctrl-single,pins = <
-                       J721E_IOPAD(0x124, PIN_INPUT, 7) /* (Y24) PRG0_PRU1_GPO9.GPIO0_72 */
+                       //J721E_IOPAD(0x124, PIN_INPUT, 7) /* (Y24) PRG0_PRU1_GPO9.GPIO0_72 */
                >;
        };
 
        main_i2c5_pins_default: main-i2c5-pins-default {
                pinctrl-single,pins = <
-                       J721E_IOPAD(0x150, PIN_INPUT_PULLUP, 2) /* (Y26) PRG0_MDIO0_MDIO.I2C5_SCL */
+                       //J721E_IOPAD(0x150, PIN_INPUT_PULLUP, 2) /* (Y26) PRG0_MDIO0_MDIO.I2C5_SCL */
                        J721E_IOPAD(0x154, PIN_INPUT_PULLUP, 2) /* (AA27) PRG0_MDIO0_MDC.I2C5_SDA */
                >;
        };
@@ -522,28 +522,28 @@ J721E_IOPAD(0x154, PIN_INPUT_PULLUP, 2) /* (AA27) PRG0_MDIO0_MDC.I2C5_SDA */
        rpi_header_gpio0_pins_default: rpi-header-gpio0-pins-default {
                pinctrl-single,pins = <
                        J721E_IOPAD(0x01C, PIN_INPUT, 7) /* (AD22) PRG1_PRU0_GPO6.GPIO0_7 */
-                       J721E_IOPAD(0x120, PIN_INPUT, 7) /* (AA28) PRG0_PRU1_GPO8.GPIO0_71 */
-                       J721E_IOPAD(0x14C, PIN_INPUT, 7) /* (AA29) PRG0_PRU1_GPO19.GPIO0_82 */
+                       //J721E_IOPAD(0x120, PIN_INPUT, 7) /* (AA28) PRG0_PRU1_GPO8.GPIO0_71 */
+                       //J721E_IOPAD(0x14C, PIN_INPUT, 7) /* (AA29) PRG0_PRU1_GPO19.GPIO0_82 */
                        J721E_IOPAD(0x02C, PIN_INPUT, 7) /* (AD21) PRG1_PRU0_GPO10.GPIO0_11 */
-                       J721E_IOPAD(0x198, PIN_INPUT, 7) /* (V25) RGMII6_TD1.GPIO0_101 */
+                       //J721E_IOPAD(0x198, PIN_INPUT, 7) /* (V25) RGMII6_TD1.GPIO0_101 */
                        J721E_IOPAD(0x1B0, PIN_INPUT, 7) /* (W24) RGMII6_RD1.GPIO0_107 */
-                       J721E_IOPAD(0x1A0, PIN_INPUT, 7) /* (W29) RGMII6_TXC.GPIO0_103 */
+                       //J721E_IOPAD(0x1A0, PIN_INPUT, 7) /* (W29) RGMII6_TXC.GPIO0_103 */
                        J721E_IOPAD(0x008, PIN_INPUT, 7) /* (AG22) PRG1_PRU0_GPO1.GPIO0_2 */
                        //J721E_IOPAD(0x1D0, PIN_INPUT, 7) /* (AA3) SPI0_D1.GPIO0_115 */
-                       J721E_IOPAD(0x11C, PIN_INPUT, 7) /* (AA24) PRG0_PRU1_GPO7.GPIO0_70 */
-                       J721E_IOPAD(0x148, PIN_INPUT, 7) /* (AA26) PRG0_PRU1_GPO18.GPIO0_81 */
+                       //J721E_IOPAD(0x11C, PIN_INPUT, 7) /* (AA24) PRG0_PRU1_GPO7.GPIO0_70 */
+                       //J721E_IOPAD(0x148, PIN_INPUT, 7) /* (AA26) PRG0_PRU1_GPO18.GPIO0_81 */
                        J721E_IOPAD(0x004, PIN_INPUT, 7) /* (AC23) PRG1_PRU0_GPO0.GPIO0_1 */
                        J721E_IOPAD(0x014, PIN_INPUT, 7) /* (AH23) PRG1_PRU0_GPO4.GPIO0_5 */
                        J721E_IOPAD(0x020, PIN_INPUT, 7) /* (AE20) PRG1_PRU0_GPO7.GPIO0_8 */
-                       J721E_IOPAD(0x19C, PIN_INPUT, 7) /* (W27) RGMII6_TD0.GPIO0_102 */
+                       //J721E_IOPAD(0x19C, PIN_INPUT, 7) /* (W27) RGMII6_TD0.GPIO0_102 */
                        J721E_IOPAD(0x1B4, PIN_INPUT, 7) /* (W25) RGMII6_RD0.GPIO0_108 */
-                       J721E_IOPAD(0x188, PIN_INPUT, 7) /* (Y28) RGMII6_TX_CTL.GPIO0_97 */
+                       //J721E_IOPAD(0x188, PIN_INPUT, 7) /* (Y28) RGMII6_TX_CTL.GPIO0_97 */
                        J721E_IOPAD(0x00C, PIN_INPUT, 7) /* (AF22) PRG1_PRU0_GPO2.GPIO0_3 */
                        J721E_IOPAD(0x010, PIN_INPUT, 7) /* (AJ23) PRG1_PRU0_GPO3.GPIO0_4 */
-                       J721E_IOPAD(0x178, PIN_INPUT, 7) /* (U27) RGMII5_RD3.GPIO0_93 */
-                       J721E_IOPAD(0x17C, PIN_INPUT, 7) /* (U24) RGMII5_RD2.GPIO0_94 */
-                       J721E_IOPAD(0x190, PIN_INPUT, 7) /* (W23) RGMII6_TD3.GPIO0_99 */
-                       J721E_IOPAD(0x18C, PIN_INPUT, 7) /* (V23) RGMII6_RX_CTL.GPIO0_98 */
+                       //J721E_IOPAD(0x178, PIN_INPUT, 7) /* (U27) RGMII5_RD3.GPIO0_93 */
+                       //J721E_IOPAD(0x17C, PIN_INPUT, 7) /* (U24) RGMII5_RD2.GPIO0_94 */
+                       //J721E_IOPAD(0x190, PIN_INPUT, 7) /* (W23) RGMII6_TD3.GPIO0_99 */
+                       //J721E_IOPAD(0x18C, PIN_INPUT, 7) /* (V23) RGMII6_RX_CTL.GPIO0_98 */
                >;
        };
 
@@ -593,6 +593,69 @@ J721E_IOPAD(0x98, PIN_OUTPUT, 8) /* (AJ26) PRG1_PRU1_GPO16.RGMII8_TXC */
                        J721E_IOPAD(0x94, PIN_OUTPUT, 8) /* (AJ27) PRG1_PRU1_GPO15.RGMII8_TX_CTL */
                >;
        };
+
+gpmc0_pins_default: gpmc0-default-pins {
+               pinctrl-single,pins = <
+                       J721E_IOPAD(0x158, PIN_OUTPUT, 8) /* (U23) RGMII5_TX_CTL.GPMC0_A1 */
+                       J721E_IOPAD(0x15c, PIN_OUTPUT, 8) /* (U26) RGMII5_RX_CTL.GPMC0_A2 */
+                       J721E_IOPAD(0x160, PIN_OUTPUT, 8) /* (V28) RGMII5_TD3.GPMC0_A3 */
+                       J721E_IOPAD(0x164, PIN_OUTPUT, 8) /* (V29) RGMII5_TD2.GPMC0_A4 */
+                       J721E_IOPAD(0x168, PIN_OUTPUT, 8) /* (V27) RGMII5_TD1.GPMC0_A5 */
+                       J721E_IOPAD(0x16c, PIN_OUTPUT, 8) /* (U28) RGMII5_TD0.GPMC0_A6 */
+                       J721E_IOPAD(0x170, PIN_OUTPUT, 8) /* (U29) RGMII5_TXC.GPMC0_A7 */
+                       J721E_IOPAD(0x174, PIN_OUTPUT, 8) /* (U25) RGMII5_RXC.GPMC0_A8 */
+                       J721E_IOPAD(0x178, PIN_OUTPUT, 8) /* (U27) RGMII5_RD3.GPMC0_A9 */
+                       J721E_IOPAD(0x17c, PIN_OUTPUT, 8) /* (U24) RGMII5_RD2.GPMC0_A10 */
+                       J721E_IOPAD(0x180, PIN_OUTPUT, 8) /* (R23) RGMII5_RD1.GPMC0_A11 */
+                       J721E_IOPAD(0x184, PIN_OUTPUT, 8) /* (T23) RGMII5_RD0.GPMC0_A12 */
+                       J721E_IOPAD(0x188, PIN_OUTPUT, 8) /* (Y28) RGMII6_TX_CTL.GPMC0_A13 */
+                       J721E_IOPAD(0x18c, PIN_OUTPUT, 8) /* (V23) RGMII6_RX_CTL.GPMC0_A14 */
+                       J721E_IOPAD(0x190, PIN_OUTPUT, 8) /* (W23) RGMII6_TD3.GPMC0_A15 */
+                       J721E_IOPAD(0x194, PIN_OUTPUT, 8) /* (W28) RGMII6_TD2.GPMC0_A16 */
+                       J721E_IOPAD(0x198, PIN_OUTPUT, 8) /* (V25) RGMII6_TD1.GPMC0_A17 */
+                       J721E_IOPAD(0x19c, PIN_OUTPUT, 8) /* (W27) RGMII6_TD0.GPMC0_A18 */
+                       J721E_IOPAD(0x1a0, PIN_OUTPUT, 8) /* (W29) RGMII6_TXC.GPMC0_A19 */
+                       J721E_IOPAD(0x1a4, PIN_OUTPUT, 8) /* (W26) RGMII6_RXC.GPMC0_A20 */
+                       J721E_IOPAD(0x1a8, PIN_OUTPUT, 8) /* (Y29) RGMII6_RD3.GPMC0_A21 */
+                       J721E_IOPAD(0x1ac, PIN_OUTPUT, 8) /* (Y27) RGMII6_RD2.GPMC0_A22 */
+                       J721E_IOPAD(0x108, PIN_OUTPUT, 8) /* (AD27) PRG0_PRU1_GPO2.GPMC0_A23 */
+                       J721E_IOPAD(0x110, PIN_OUTPUT, 8) /* (AD29) PRG0_PRU1_GPO4.GPMC0_A24 */
+                       J721E_IOPAD(0x118, PIN_OUTPUT, 8) /* (AC26) PRG0_PRU1_GPO6.GPMC0_A25 */
+                       J721E_IOPAD(0x12c, PIN_OUTPUT, 8) /* (AG26) PRG0_PRU1_GPO11.GPMC0_A26 */
+                       J721E_IOPAD(0x150, PIN_OUTPUT, 8) /* (Y26) PRG0_MDIO0_MDIO.GPMC0_A27 */
+                       J721E_IOPAD(0xc4, PIN_INPUT, 8) /* (AC29) PRG0_PRU0_GPO5.GPMC0_AD0 */
+                       J721E_IOPAD(0xcc, PIN_INPUT, 8) /* (AC28) PRG0_PRU0_GPO7.GPMC0_AD1 */
+                       J721E_IOPAD(0xd0, PIN_INPUT, 8) /* (AC27) PRG0_PRU0_GPO8.GPMC0_AD2 */
+                       J721E_IOPAD(0xd4, PIN_INPUT, 8) /* (AB26) PRG0_PRU0_GPO9.GPMC0_AD3 */
+                       J721E_IOPAD(0xd8, PIN_INPUT, 8) /* (AB25) PRG0_PRU0_GPO10.GPMC0_AD4 */
+                       J721E_IOPAD(0xf4, PIN_INPUT, 8) /* (AB24) PRG0_PRU0_GPO17.GPMC0_AD5 */
+                       J721E_IOPAD(0xf8, PIN_INPUT, 8) /* (AB29) PRG0_PRU0_GPO18.GPMC0_AD6 */
+                       J721E_IOPAD(0xfc, PIN_INPUT, 8) /* (AB28) PRG0_PRU0_GPO19.GPMC0_AD7 */
+                       J721E_IOPAD(0x114, PIN_INPUT, 8) /* (AB27) PRG0_PRU1_GPO5.GPMC0_AD8 */
+                       J721E_IOPAD(0x11c, PIN_INPUT, 8) /* (AA24) PRG0_PRU1_GPO7.GPMC0_AD9 */
+                       J721E_IOPAD(0x120, PIN_INPUT, 8) /* (AA28) PRG0_PRU1_GPO8.GPMC0_AD10 */
+                       J721E_IOPAD(0x124, PIN_INPUT, 8) /* (Y24) PRG0_PRU1_GPO9.GPMC0_AD11 */
+                       J721E_IOPAD(0x128, PIN_INPUT, 8) /* (AA25) PRG0_PRU1_GPO10.GPMC0_AD12 */
+                       J721E_IOPAD(0x144, PIN_INPUT, 8) /* (Y25) PRG0_PRU1_GPO17.GPMC0_AD13 */
+                       J721E_IOPAD(0x148, PIN_INPUT, 8) /* (AA26) PRG0_PRU1_GPO18.GPMC0_AD14 */
+                       J721E_IOPAD(0x14c, PIN_INPUT, 8) /* (AA29) PRG0_PRU1_GPO19.GPMC0_AD15 */
+                       J721E_IOPAD(0x8, PIN_INPUT, 8) /* (AG22) PRG1_PRU0_GPO1.GPMC0_WAIT0 */
+                       J721E_IOPAD(0xc, PIN_INPUT, 8) /* (AF22) PRG1_PRU0_GPO2.GPMC0_WAIT1 */
+                       J721E_IOPAD(0x4, PIN_OUTPUT, 8) /* (AC23) PRG1_PRU0_GPO0.GPMC0_BE1n */
+                       J721E_IOPAD(0x7c, PIN_OUTPUT, 8) /* (AF21) PRG1_PRU1_GPO9.GPMC0_CSn0 */
+                       J721E_IOPAD(0x78, PIN_OUTPUT, 8) /* (Y23) PRG1_PRU1_GPO8.GPMC0_CSn1 */
+                       J721E_IOPAD(0x80, PIN_OUTPUT, 8) /* (AB23) PRG1_PRU1_GPO10.GPMC0_CLKOUT */
+                       J721E_IOPAD(0x28, PIN_OUTPUT, 8) /* (AG20) PRG1_PRU0_GPO9.GPMC0_ADVn_ALE */
+                       J721E_IOPAD(0x24, PIN_OUTPUT, 8) /* (AJ20) PRG1_PRU0_GPO8.GPMC0_OEn_REn */
+                       J721E_IOPAD(0x18, PIN_OUTPUT, 8) /* (AD20) PRG1_PRU0_GPO5.GPMC0_WEn */
+                       J721E_IOPAD(0x2c, PIN_OUTPUT, 8) /* (AD21) PRG1_PRU0_GPO10.GPMC0_BE0n_CLE */
+                       J721E_IOPAD(0x6c, PIN_OUTPUT, 8) /* (AG21) PRG1_PRU1_GPO5.GPMC0_WPn */
+                       J721E_IOPAD(0x10, PIN_OUTPUT, 8) /* (AJ23) PRG1_PRU0_GPO3.GPMC0_DIR */
+               >;
+       };
+
+
+
 };
 
 &wkup_pmx0 {
@@ -1693,3 +1756,40 @@ eeprom@57 {
                reg = <0x57>;
        };
 };
+
+
+&gpmc0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&gpmc0_pins_default>;
+       ranges = <0x00 0x00 0x00 0x20000000 0x01000000>; /* CS0 space. Min partition = 16MB */
+
+
+    fpga1111@0,0 {
+        reg = <0 0 0x1000000>;
+               phy_base = <0x20000000>;
+               max_size = <0x01000000>;
+               status = "okay";
+               gpmc,device-width = <2>;
+               gpmc,sync-clk-ps = <0>;
+               gpmc,cs-on-ns = <0>;
+               gpmc,cs-rd-off-ns = <120>;
+               gpmc,cs-wr-off-ns = <120>;
+               gpmc,adv-on-ns = <12>;
+               gpmc,adv-rd-off-ns = <48>;
+               gpmc,adv-wr-off-ns = <48>;
+               gpmc,we-on-ns = <54>;
+               gpmc,we-off-ns = <110>;
+               gpmc,oe-on-ns = <54>;
+               gpmc,oe-off-ns = <110>;
+               gpmc,access-ns = <114>;
+               gpmc,rd-cycle-ns = <120>;
+               gpmc,wr-cycle-ns = <120>;
+               gpmc,bus-turnaround-ns = <0>;
+               gpmc,cycle2cycle-delay-ns = <50>;
+               gpmc,cycle2cycle-diffcsen;
+               gpmc,clk-activation-ns = <0>;
+               gpmc,wr-access-ns = <120>;
+               gpmc,wr-data-mux-bus-ns = <90>;
+
+       };
+};
diff --git a/arch/arm64/boot/dts/ti/k3-j721e-main.dtsi b/arch/arm64/boot/dts/ti/k3-j721e-main.dtsi
index 639fa31b5..bad226848 100644
--- a/arch/arm64/boot/dts/ti/k3-j721e-main.dtsi
+++ b/arch/arm64/boot/dts/ti/k3-j721e-main.dtsi
@@ -2809,13 +2809,24 @@ dphy1: phy@4590000 {
                power-domains = <&k3_pds 148 TI_SCI_PD_EXCLUSIVE>;
        };
 
+       gpmc0: memory-controller@5390000 {
+               compatible = "ti,am3352-gpmc";
+               ti,hwmods = "gpmc";
+               power-domains = <&k3_pds 80 TI_SCI_PD_EXCLUSIVE>;
+               clocks = <&k3_clks 80 0>;
+               clock-names = "fck";
+               reg = <0x00 0x05390000 0x00 0x400>,
+                     <0x00 0x20000000 0x00 0x8000000>;
+               reg-names = "cfg", "data";
+               interrupts = <GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>;
+               gpmc,num-cs = <4>;
+               gpmc,num-waitpins = <2>;
+               #address-cells = <2>;
+               #size-cells = <1>;
+               interrupt-controller;
+               #interrupt-cells = <2>;
+               gpio-controller;
+               #gpio-cells = <2>;
        };
 
 };
diff --git a/arch/arm64/boot/dts/ti/k3-j721e.dtsi b/arch/arm64/boot/dts/ti/k3-j721e.dtsi
index 36a650fe6..0928f0298 100644
--- a/arch/arm64/boot/dts/ti/k3-j721e.dtsi
+++ b/arch/arm64/boot/dts/ti/k3-j721e.dtsi
@@ -140,6 +140,8 @@ cbass_main: bus@100000 {
                         <0x00 0x6f000000 0x00 0x6f000000 0x00 0x00310000>, /* A72 PERIPHBASE */
                         <0x44 0x00000000 0x44 0x00000000 0x00 0x08000000>, /* PCIe2 DAT */
                         <0x44 0x10000000 0x44 0x10000000 0x00 0x08000000>, /* PCIe3 DAT */
+                        <0x00 0x05390000 0x00 0x05390000 0x00 0x00000400>, /* gpmc cfg */
+                    <0x00 0x20000000 0x00 0x20000000 0x00 0x08000000>, /* gpmc data */
                         <0x4d 0x80800000 0x4d 0x80800000 0x00 0x00800000>, /* C66_0 */
                         <0x4d 0x81800000 0x4d 0x81800000 0x00 0x00800000>, /* C66_1 */
                         <0x4e 0x20000000 0x4e 0x20000000 0x00 0x00080000>, /* GPU */

对于关键参数的设置说明:

设备树配置的:

reg = <0x00 0x05390000 0x00 0x400>, <0x00 0x20000000 0x00 0x8000000>; reg-names = "cfg", "data";

对应文档:

设备树配置:

clocks = <&k3_clks 115 0>; clock-names = "fck";

interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>;

power-domains = <&k3_pds 115 TI_SCI_PD_EXCLUSIVE>;

AM625: AM62x: u-boot: dts: how to calculate device id from power domain and clock - Processors forum - Processors - TI E2E support forums

对config1寄存器主要用于配置片寻的模式,比如数据突发模式,同步或者异步模式,地址和数据是16位还是8位模式等

ranges = <0 0 0x00 0x21000000 0x01000000>; /* CS0 space. Min partition = 16MB */

----------------------------------------------------------------------------------------------------------------------------

真正的难度在于如何调整好时序的问题,即如下设备的配置这部分:

+    fpga1@0,0 {
+        reg = <0 0 0x1000000>;
+               phy_base = <0x20000000>;
+               max_size = <0x01000000>;
+               status = "okay";
+               gpmc,device-width = <2>;
+               gpmc,sync-clk-ps = <0>;
+               gpmc,cs-on-ns = <0>;
+               gpmc,cs-rd-off-ns = <120>;
+               gpmc,cs-wr-off-ns = <120>;
+               gpmc,adv-on-ns = <12>;
+               gpmc,adv-rd-off-ns = <48>;
+               gpmc,adv-wr-off-ns = <48>;
+               gpmc,we-on-ns = <54>;
+               gpmc,we-off-ns = <110>;
+               gpmc,oe-on-ns = <54>;
+               gpmc,oe-off-ns = <110>;
+               gpmc,access-ns = <114>;
+               gpmc,rd-cycle-ns = <120>;
+               gpmc,wr-cycle-ns = <120>;
+               gpmc,bus-turnaround-ns = <0>;
+               gpmc,cycle2cycle-delay-ns = <50>;
+               gpmc,cycle2cycle-diffcsen;
+               gpmc,clk-activation-ns = <0>;
+               gpmc,wr-access-ns = <120>;
+               gpmc,wr-data-mux-bus-ns = <90>;
+
+       };
+};

读时序:

写时序:

解析:

必要的属性(Required properties):

    bank-width:   NOR Flash字节宽度。GPMC支持8位和16位设备,因此必须是1个或2个字节。
    compatible:  参见文档Documentation/devicetree/bindings/mtd/mtd-physmap.txt
    gpmc,cs-on-ns:  片选有效前的时间间隔 (从芯片手册的时序上看,CSONTIME是ADV拉高到CS拉低之间的时间段,是否应该理解成片选有效前的时间间隔)
    gpmc,cs-rd-off-ns:  读操作时,片选无效前的时间间隔
    gpmc,cs-wr-off-ns:  写操作时,片选无效前的时间间隔
    gpmc,oe-on-ns:  读使能有效前的时间间隔
    gpmc,oe-off-ns:  读使能无效前的时间间隔
    gpmc,we-on-ns: 写使能有效前的时间间隔
    gpmc,we-off-ns:  写使能无效前的时间间隔
    gpmc,access-ns:  从开始循环到第一个数据捕获(读访问)
    gpmc,rd-cycle-ns:  总的读操作循环时间
    gpmc,wr-cycle-ns:  总的写操作循环时间
    linux,mtd-name:  参见Documentation/devicetree/bindings/mtd/mtd-physmap.txt
    reg:  Chip-select, base address (relative to chip-select) and size of NOR flash. Note that base address will be typically 0
    as this is the start of the chip-select.
    可选的属性(Optional properties):
    gpmc,XXX   额外的GPMC时序和配置参数。参见Documentation/devicetree/bindings/memory-controllers/omap-gpmc.txt
    可选的分区表属性解析:
    #address-cells:  should be set to 1
    #size-cells:  should be set to 1

必要的属性:

    compatible:  
    reg:   寄存器空间的一个源指示符
    ti,hwmods:   应该设置为“tI,gpmc”直到DT发送结束
    #address-cells:   必须设置为 2 用以允许内存地址转换
    #size-cells:   必须设置为1用以允许内存映射
    gpmc,num-cs:   控制器支持的最大片选数
    gpmc,num-waitpins:   控制器支持的最大wait引脚数
    ranges:   每一个片选必须设置成能够反映内存布局的4个整型数值:
    0
    目前,从每一个片选寄存器 GPMC_CONFIG7(由引导加载程序设置)推导的计算值被用于物理地址的解码。由于这些值在以后会被改变,必须填充正确的值。
    interrupt-controller:   GPMC 驱动程序和中断控制器为实现NAND事件“fifoevent”和“termcount”在GPMC_WAIT引脚的上升/下降边沿触发添砖加瓦。
    中断号映射如下:
    0 – NAND_fifoevent
    1 - NAND_termcount
    2 - GPMC_WAIT0 pin edge
    3 - GPMC_WAIT1 pin edge, and so on.
    interrupt-cells:   必须设置为2
    gpio-controller:   GPMC驱动为GPMC WAIT引脚实现了一个GPIO控制器,该引脚可以被用作普通目的的输入。 0 映射到GPMC_WAIT0引脚。
    gpio-cells:   必须设置为2

必要的属性当使用NAND预读取dma时:

    dmas    GPMC NAND 预读取dma通道
    dma-names   必须设置为“rxtx”

子节点的时序属性。所有选项都是可选的并且默认是0.

    gpmc,sync-clk-ps:  同步模式下最小的时钟周期,单位皮秒ps

与GPMC_CONFIG2相关的片选信号时序(单位ns)

    gpmc,cs-on-ns:  Assertion time
    gpmc,cs-rd-off-ns:  Read deassertion time
    gpmc,cs-wr-off-ns:  Write deassertion time

与GPMC_CONFIG3相关的ADV信号时序(单位ns)

    gpmc,adv-on-ns:  Assertion time
    gpmc,adv-rd-off-ns:  Read deassertion time
    gpmc,adv-wr-off-ns:  Write deassertion time
    gpmc,adv-aad-mux-on-ns:  Assertion time for AAD
    gpmc,adv-aad-mux-rd-off-ns:  Read deassertion time for AAD
    gpmc,adv-aad-mux-wr-off-ns:  Write deassertion time for AAD

与GPMC_CONFIG4相关的WE信号时序(单位ns)

    gpmc,we-on-ns:  Assertion time
    gpmc,we-off-ns:  Deassertion time

与GPMC_CONFIG4相关的OE信号时序(单位ns)

    gpmc,oe-on-ns:  Assertion time
    gpmc,oe-off-ns:  Deassertion time
    gpmc,oe-aad-mux-on-ns:  Assertion time for AAD
    gpmc,oe-aad-mux-off-ns:  Deassertion time for AAD

与GPMC_CONFIG5相关的Access time 和cycle time时序(单位ns)

    gpmc,page-burst-access-ns:  Multiple access word delay
    gpmc,access-ns:  Start-cycle to first data valid delay
    gpmc,rd-cycle-ns:  Total read cycle time
    gpmc,wr-cycle-ns:  Total write cycle time
    gpmc,bus-turnaround-ns:  Turn-around time between successive accesses
    gpmc,cycle2cycle-delay-ns:  Delay between chip-select pulses
    gpmc,clk-activation-ns:  GPMC clock activation time
    gpmc,wait-monitoring-ns:  Start of wait monitoring with regard to valid data

布尔时序参数。如果属性有参数,则启用。如果省略属性,则禁用。

    gpmc,adv-extra-delay:  ADV signal is delayed by half GPMC clock
    gpmc,cs-extra-delay:  CS signal is delayed by half GPMC clock
    gpmc,cycle2cycle-diffcsen:  Add “cycle2cycle-delay” between successive
    accesses to a different CS
    gpmc,cycle2cycle-samecsen:  Add “cycle2cycle-delay” between successive
    accesses to the same CS
    gpmc,oe-extra-delay:  OE signal is delayed by half GPMC clock
    gpmc,we-extra-delay:  WE signal is delayed by half GPMC clock
    gpmc,time-para-granularity:  Multiply all access times by 2

7个配置寄存器的定义

1、配置设备类型                                                                                 GPMC_CONFIG1

2、配置访问时序,主要读写时序                                                        GPMC_CONFIG2~6

3、配置基地址、容量(即掩码地址)、使能CS信号                          GPMC_CONFIG7

逻辑分析仪:

测试验证:

烧录FPGA程序后,linux端进行测试:

1、对0x20002468读出来数据为0x55aa,然后可以自定义的读写。
2、对0x20004000连续写入几个值,然后从0x20004002再读出几个值,看是否写入和读出是一致的。
root@tda4vm-sk:~# devmem2 0x20004000 h 0x1111;
/dev/mem opened.
Memory mapped at address 0xffff970aa000.
Read at address  0x20004000 (0xffff970aa000): 0x0100
Write at address 0x20004000 (0xffff970aa000): 0x1111, readback 0x1111
root@tda4vm-sk:~# devmem2 0x20004000 h 0x1112;
/dev/mem opened.
Memory mapped at address 0xffffa9546000.
Read at address  0x20004000 (0xffffa9546000): 0x0100
Write at address 0x20004000 (0xffffa9546000): 0x1112, readback 0x1112
root@tda4vm-sk:~# devmem2 0x20004000 h 0x1113;
/dev/mem opened.
Memory mapped at address 0xffff9ac29000.
Read at address  0x20004000 (0xffff9ac29000): 0x0100
Write at address 0x20004000 (0xffff9ac29000): 0x1113, readback 0x1113
root@tda4vm-sk:~# devmem2 0x20004002 h;
/dev/mem opened.
Memory mapped at address 0xffffadbee000.
Read at address  0x20004002 (0xffffadbee002): 0x1111
root@tda4vm-sk:~# devmem2 0x20004002 h;
/dev/mem opened.
Memory mapped at address 0xffffb7ef7000.
Read at address  0x20004002 (0xffffb7ef7002): 0x1112
root@tda4vm-sk:~# devmem2 0x20004002 h;
/dev/mem opened.
Memory mapped at address 0xffff8e6f7000.
Read at address  0x20004002 (0xffff8e6f7002): 0x1113

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值