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.

[参考译文] Linux/AM5728:使用 Linux 在 AM572x IDK 上配置 GPMC 寄存器

Guru**** 2540720 points
Other Parts Discussed in Thread: AM5728

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/569856/linux-am5728-configure-gpmc-registers-on-am572x-idk-using-linux

器件型号:AM5728

工具/软件:Linux

我有一个有效的裸机 ARM A15代码、该代码将 GPMC 配置为 AM5728 IDK、以便与存储器地址0x01000000处的 Altera FGPA Cyclone5进行通信。
(使用 CS0 16位、异步、非多路复用地址和数据线路)-寄存器设置在末尾。

现在、我正在尝试从 Linux 配置 GPMC 寄存器。 但是、在尝试更改 DTS 文件后、我无法让 Linux 显示 GPMC 寄存器映射。


我使用的是具有 RT 内核4.4.3.2的最新处理器 SDK3.2、


我在启动时遇到以下 GPMC 探测器错误:

OMAP-GPMC 50000000。GPMC:找不到节点/pinmux_gpMC_pins 的 pctldev、延迟探针


我有几个问题

1.如何从 Linux 配置 GPMC 寄存器? 这应该在哪里进行? 在 Uboot、dtb 文件还是内核中?

2、如何映射 FPGA 的存储器地址0x01000000? 我是否需要保留 CMA 或 cmem 地址范围?

3.我需要编写内核模块还是可以使用 userspace 中的 mmap?

4.如果使用设备树设置,范围和寄存器值是多少?

  我是否需要为 CS0添加子节点... GPMC 寄存器时序或地址映射?


我已向 AM572x-idk.dts 器件树文件中添加了以下内容、但这似乎不起作用。
我缺少什么?

/{
GPMC_PINS:pinmux_GPMC_PINS{
pinctrl-single、pins =<
0xB4 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_cs0.cs0 0x4A00 34B4 *
0xC0 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_clk.clk 0x4A00 34C0 *
0xc4 (PIN_INPUT_PULLUP | MUX_MODE0)/* GPMC_advn_ALe.GPIO2_23、不用于 GPMC、用作测试的 GP 输入*/
0xC8 (PIN_OUTPUT PULLUP | MUX_MODE0)/* GPMC_oen_ren。oen_ren *
0xCC (PIN_OUTPLUG_PULLUP | MUX_MODE0)/* GPMC_WN.Wen*/
0xD0 (PIN_OUTPUT 上拉| MUX_MODE0)/* gpmc_ben0.ben0 0x4A00 34D0 */
0xD4 (PIN_OUTPUT 上拉| MUX_MODE0)/* gpmc_ben1.ben1 *
/* 0xD8 (PIN_INPUT_PULLUP | MUX_MODE14) GPMC_wait0.wait0 */

0x00 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_ad0.ad0 0x4A00 3400*/
0x04 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_ad1.ad1 */
0x08 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_ad2.ad2 */
0x0C (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_ad3.ad3 */
0x10 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_AD4.AD4 0x4A00 3410*/
0x14 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_ad5.ad5 */
0x18 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_AD6.AD6 */
0x1C (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_AD7.AD7 */
0x20 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_AD8.ad8 0x4A00 3420*/
0x24 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_ad9.ad9 */
0x28 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_ad10.ad10 */
0x2C (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_ad11.ad11 */
0x30 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_AD12.ad12 0x4A00 3430*/
0x34 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_ad13.ad13 *
0x38 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_ad14.ad14 */
0x3C (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_ad15.ad15 */

0x40 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_a0.a0 0x4A00 3440 A0不用于16位*/
0x44 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_A1.A1 */
0x48 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_A2.A2 */
0x4C (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_A3.A3 */
0x50 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_A4.A4 0x4A00 3450*/
0x54 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_A5.A5 */
0x58 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_A6.A6 */
0x5C (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_A7.A7 */
0x60 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_A8.A8 0x4A00 3460*/
0x64 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_A9.A9 *
0x68 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_A10.A10 */
0x6C (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_A11.A11 */
0x70 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_A12.A12 0x4A00 3470*/
>;
};
};

GPMC{
状态="正常";
pinctrl-names ="default";
pinctrl-0 =<&GPMC_PINs>;
REG =<0x50000000 0x1000000>;
/*Ranges =<0 0x08000000 0x1000000>; CS0:16MB、用于 NAND */
#address-cells =<2>;
大小单元格=<1>;

范围=<0 0x01000000 0x1000000>;
/*范围;*/
}; 








这些寄存器设置通过 helloworld ARM 应用程序工作。


WR_MEM_32 (0x4A0034B4、0x01000000);//CTRL_CORE_PAD_GPMC_CS0启用 cs0

WR_MEM_32 (0x50000060、0x01801003);//GPMC_CONFIG1_I_0异步 GPMC 3 = clk div 4

WR_MEM_32 (0x50000078、0x00000F41);//GPMC_CONFIG7_I_0映射到01000000

WR_MEM_32 (0x4A0034C0、0x01060000);//CTRL_CORE_PAD_GPMC_CLK
WR_MEM_32 (0x4A0034C8、0x01000000);//CTRL_CORE_PAD_GPMC_OEn
WR_MEM_32 (0x4A0034CC、0x01000000);//CTRL_CORE_PAD_GPMC_WEN
WR_MEM_32 (0x4A003400、0x01040000);//CTRL_CORE_PAD_GPMC_AD0
WR_MEM_32 (0x4A003404、0x01040000);//CTRL_CORE_PAD_GPMC_AD1
WR_MEM_32 (0x4A003408、0x01040000);//CTRL_CORE_PAD_GPMC_AD2
WR_MEM_32 (0x4A00340C、0x01040000);//CTRL_CORE_PAD_GPMC_AD3
WR_MEM_32 (0x4A003410、0x01040000);//CTRL_CORE_PAD_GPMC_AD4
WR_MEM_32 (0x4A003414、0x01040000);//CTRL_CORE_PAD_GPMC_AD5
WR_MEM_32 (0x4A003418、0x01040000);//CTRL_CORE_PAD_GPMC_AD6
WR_MEM_32 (0x4A00341C、0x01040000);//CTRL_CORE_PAD_GPMC_AD7
WR_MEM_32 (0x4A003420、0x01040000);//CTRL_CORE_PAD_GPMC_AD8
WR_MEM_32 (0x4A003424、0x01040000);//CTRL_CORE_PAD_GPMC_AD9
WR_MEM_32 (0x4A003428、0x01040000);//CTRL_CORE_PAD_GPMC_AD10
WR_MEM_32 (0x4A00342C、0x01040000);//CTRL_CORE_PAD_GPMC_AD11
WR_MEM_32 (0x4A003430、0x01040000);//CTRL_CORE_PAD_GPMC_AD12
WR_MEM_32 (0x4A003434、0x01040000);//CTRL_CORE_PAD_GPMC_AD13
WR_MEM_32 (0x4A003438、0x01040000);//CTRL_CORE_PAD_GPMC_AD14
WR_MEM_32 (0x4A00343C、0x01040000);//CTRL_CORE_PAD_GPMC_AD15

WR_MEM_32 (0x4A003440、0x01000000);//CTRL_CORE_PAD_GPMC_A0
WR_MEM_32 (0x4A003444、0x01000000);//CTRL_CORE_PAD_GPMC_A1
WR_MEM_32 (0x4A003448、0x01000000);//CTRL_CORE_PAD_GPMC_A2
WR_MEM_32 (0x4A00344C、0x01000000);//CTRL_CORE_PAD_GPMC_A3
WR_MEM_32 (0x4A003450、0x01000000);//CTRL_CORE_PAD_GPMC_A4
WR_MEM_32 (0x4A003454、0x01000000);//CTRL_CORE_PAD_GPMC_A5
WR_MEM_32 (0x4A003458、0x01000000);//CTRL_CORE_PAD_GPMC_A6
WR_MEM_32 (0x4A00345C、0x01000000);//CTRL_CORE_PAD_GPMC_A7
WR_MEM_32 (0x4A003460、0x01000000);//CTRL_CORE_PAD_GPMC_A8
WR_MEM_32 (0x4A003464、0x01000000);//CTRL_CORE_PAD_GPMC_A9
WR_MEM_32 (0x4A003468、0x01000000);//CTRL_CORE_PAD_GPMC_A10
WR_MEM_32 (0x4A00346C、0x01000000);//CTRL_CORE_PAD_GPMC_A11
WR_MEM_32 (0x4A003470、0x01000000);//CTRL_CORE_PAD_GPMC_A12

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

    您好!

    对于 GPMC 配置(pinmux 设置和存储器区域到器件的映射)、您可以从 arch/arm/dts/dra7xx-evm.dts 文件中获取参考。

    您可以使用 mmap 从用户空间驱动程序访问 GPMC 寄存器、或使用已集成的 devmem2工具。  


    最好的 Regads
    Yordan

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

    当我尝试使用 devmem2 0x50000000 w 访问 GPMC 寄存器地址时
    Linux 刚刚锁定、我必须重置电源。

    此外、如果我查看 GMPC CS0引脚的引脚多路复用设置、我在 DTS 中设置的任何内容都不会生效
    (获得0x0006000F 而不是预期的模式0)


    如何使用 devmem2启用对 GPMC 寄存器的访问? 如果器件未探测到、为什么在 IO 存储器中看不到 GPMC@50000000?

    如何在 DTS 中使用 pinctrl?


    devmem2 0x4A0034B4 w

    root@am57xx-EVM:~# devmem2 0x4A0034B4 w
    /dev/mem 已打开。
    映射到地址 bbb6fb8000的内存。
    在地址0x4A0034B4 (0xb6fb84b4)上读取:0x0006000F




    root@am57xx-EVM:~# cat /proc/iomem

    40300000-4037FFFF:40300000.ocmcram
    40800000-40847fff:l2ram
    40d01000-40d010ff:/ocp/mmu@40d01000
    40d02000-40d020ff:/ocp/mmu@40d02000
    41000000-41047fff:l2ram
    41501000-415010ff:/ocp/mmu@41501000
    41502000-415020ff:/ocp/mmu@41502000
    43300000-433ffff:EDMA3_cc
    44000000-44ffff:/OCP
    45000000-45000fff:/OCP
    48020000 - 4802001f:串行
    48032000-4803207f:/ocp/timer@48032000
    48034000-4803407f:/ocp/timer@48034000
    48036000-4803607f:/ocp/timer@48036000
    4803e000-4803e07f:/ocp/timer@4803e000
    480511000-480511ff:/ocp/gpio@48051000
    480530-480531ff:/ocp/gpio@48053000
    48055000-480551ff:/ocp/gpio@48055000
    48057000-480571ff:/ocp/gpio@48057000
    480590-480591ff:/ocp/gpio@48059000
    4805b000-4805b1ff:/ocp/gpio@4805b000
    4805d000-4805d1ff:/ocp/gpio@4805d000
    48070000-480700ff:/ocp/i2c@48070000
    48078000-48078fbf:/ocp/elm@48078000
    48086000-4808607f:/ocp/timer@48086000
    48088000-4808807f:/ocp/timer@48088000
    48090000-48091fff:/ocp/rng@48090000
    4809c000-4809c3ff:/ocp/mmc@4809c000
    480a5000-480a509f:/ocp/des@480a5000
    480b4000-480b43ff:/ocp/mmc@480b4000
    480b8100-480b82ff:/ocp/spi@480b8000
    4844a000-4844ad1b:/ocp/padconf@4844a000
    48484000-48484fff:/ocp/ethernet@48484000
    48485000-484850ff:/ocp/ethernet@48484000/MDIO@48485000
    48485200-48487fff:/ocp/ethernet@48484000
    4882000-4882007f:/ocp/timer@48820000
    48822000-4882207f:/ocp/timer@48822000
    48824000-4882407f:/ocp/timer@48824000
    48826000-4882607f:/ocp/timer@48826000
    48828000-4882807f:/ocp/timer@48828000
    4882a000-4882a07f:/ocp/timer@4882a000
    4882c000-4882c07f:/ocp/timer@4882c000
    4882e000-4882e07f:/ocp/timer@4882e000
    48838000-488380ff:/ocp/rtc@48838000
    4883c000-4883c1ff:/ocp/mailbox@4883c000
    4883e000-4883e1ff:/ocp/mailbox@4883e000
    48840000-488401ff:/ocp/mailbox@48840000
    48842000-488421ff:/ocp/mailbox@48842000
    48880000-4888FFFF:/ocp/omap_dwc3_1@48880000
    48890000-488997fff:/ocp/omap_dwc3_1@48880000/USB@48890000
    48890000-488997fff:/ocp/omap_dwc3_1@48880000/USB@48890000
    4889c100-488a6fff:/ocp/omap_dwc3_1@48880000/USB@48890000
    488c0000-488cFFFF:/ocp/omap_dwc3_2@488c0000
    488d0000-488d7fff:/ocp/omap_dwc3_2@488c0000/USB@488d0000
    488d0000-488d7fff:/ocp/omap_dwc3_2@488c0000/USB@488d0000
    488dc100-488e6fff:/ocp/omap_dwc3_2@488c0000/USB@488d0000
    48990000-48990113:VIP
    48995500-489955d7:parser0
    48995700-48995717:csc0
    48995800-4899587f:sc0
    48995a00-48995ad7:parser1.
    48995c00-48995c17:csc1
    48995d00-48995d7f:SC1.
    489d0700-489d077f:SC
    489d5700-489d5717:CSC
    4a0021e0-4a0021eb:/ocp/bandgap@4a0021e0
    4a00232c-4a002337:/ocp/bandgap@4a0021e0
    4a002380-4a0023ab:/ocp/bandgap@4a0021e0
    4a0023c0-4a0023fb:/ocp/bandgap@4a0021e0
    4a00246c-4a00246f:LDO 地址
    4a002470-4a002473:LDO-address
    4a002554-4a002557:gmii-SEL
    4a002564-4a00256b:/ocp/bandgap@4a0021e0
    4a002574-4a0025c3:/ocp/bandgap@4a0021e0
    4a002b78-4a002c73:/ocp/l4@4a000000/SCM@2000/dma-router@b78
    4a002c78-4a002cf3:/ocp/l4@4a000000/SCM@2000/dma-router@C78
    4a003400-4a003867:pinctrl-single
    4a056000-4a056fff:OMAP_DMA_SYSTEM.0
    4a056000-4a056fff:/ocp/dma-controller@4a056000
    4a080000-4a08001f:/ocp/ocp2scp@4a080000
    4a084000-4a0843ff:/ocp/ocp2scp@4a080000/phy@4a084000
    4a084c00-4a084c3f:pll_ctrl
    4a085000-4a0853ff:/ocp/ocp2scp@4a080000/phy@4a085000
    4a090000-4a09001f:/ocp/ocp2scp@4a090000
    4a096800-4a09683f:pll_ctrl
    4a140000-4a1410ff:/ocp/sata@4a141100
    4ae07ddc-4ae07ddf:setup-address
    4ae07de0-4ae07de3:control-address
    4ae07de4-4ae07de7:设置地址
    4ae07de8-4ae07deb:control-address
    4ae07e20-4ae07e23:控制地址
    4ae07e24-4ae07e27:控制地址
    4ae07e30-4ae07e33:设置地址
    4ae07e34-4ae07e37:设置地址
    4ae0c154-4ae0c157:ldo-address
    4ae0c158-4ae0c15b:ldo-address
    4ae10000-4ae101 ff:/ocp/gpio@4ae10000
    4ae14000-4ae1407f:/ocp/wdt@4ae14000
    4ae20000-4ae2007f:/ocp/timer@4ae20000
    4ae3c000-4ae3dfff:/ocp/can@481cc000
    4b101000-4b1012ff:/ocp/sham@53100000
    4b200000-4b201fff:dram0
    4b202000-4b203fff:dram1.
    4b210000-4b217fff:shrdram2.
    4b220000-4b221fff:intc
    4b222000-4b2223ff:控制
    4b222400-4b2224ff:调试
    4b224000-4b2243ff:控制
    4b224400-4b2244ff:调试
    4b226000-4b227fff:cfg
    4b22e000-4b22e31b:IEP
    4b232000-4b232057:MII_RT
    4b234000-4b236fff:IRAM
    4b238000-4b23afff:IRAM
    4b280000-4b281fff:dram0
    4b282000-4b283fff:dram1.
    4b290000-4b297fff:shrdram2.
    4b2a0000-4b2a1fff:intc
    4b2a2000-4b2a23ff:控制
    4b2a2400-4b2a24ff:调试
    4b2a4000-4b2a43ff:控制
    4b2a4400-4b2a44ff:调试
    4b2a6000-4b2a7fff:cfg
    4b2ae000-4b2ae31b:IEP
    4b2b2000-4b2b2057:MII_RT
    4b2b2400-4b2b248f:/ocp/pruss@4b280000/mdio@4b2b2400
    4b2b4000-4b2b6fff:IRAM
    4b2b8000-4b2障 板:IRAM
    4b300000-4b3000ff:QSPI_base
    4b500000-4b50009f:/ocp/aes@4b50000
    4b700000-4b70009f:/ocp/aes@4b700000
    5502000-5502FFFF:l2ram
    55082000-550820ff:/ocp/mmu@55082000
    58004054-58004057:pll1_clkctrl
    58004300-5800431f:pll1.
    58009054-58009057:pll2_clkctrl
    58009300-5800931f:pll2.
    58040000-580401ff:wp
    58040200-5804027f:PLL
    58040300-5804037f:phy
    58060000-58078fff:内核
    5882000-5882FFFF:l2ram
    58882000-588820ff:/ocp/mmu@58882000
    8000000000-9ffffffff:系统 RAM
    80008000-808e1033:内核代码
    8093c000-80a355ab:内核数据
    ac000000-ffcffff:系统 RAM

    root@am57xx-EVM:~# devmem2 0x50000000 w
    /dev/mem 已打开。
    映射到地址 bb6f02000的内存。
    (笑声)
    >>终端已锁定
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    是否可以添加您的引导日志? 通常、当您要访问 IP 寄存器时、需要首先启用功能时钟。

    还请记住、最新的 SDK 使用 u-boot 也会进行引脚多路复用、因此您可能会有其他器件使用的一些 GPMC 引脚。 检查内核 DTS 与 u-boot/arch/arm/dts/am572x-idk.dts 之间是否没有重复的引脚多路复用(这可能是控制台锁定的根本原因)。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    由于 GPMC Linux 驱动程序正在探测我没有的 Nand 芯片、我从 DTS 中删除了引脚多路复用器、然后释放 GPMC 存储器。

    我刚刚将 gmpc 状态更改为 OK、现在我在/proc/iomem 中看到了 GPMC@50000000

    GPMC{
    状态="正常";


    然后、我使用 devmem2等 mmap 设置 pinmux。

    需要一段时间才能知道如何以及在哪里初始化 GPMC 驱动程序。
    现在、我能够从 Linux 读取/写入 FPGA。

    接下来、我将尝试从 DSP 进行访问。

    谢谢