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.

[参考译文] AM5749:AM5749定制板上用于连接 FPGA 的 GPMC 设置不正确。

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1164211/am5749-gpmc-setting-for-connect-fpga-is-not-correct-on-am5749-custom-board

器件型号:AM5749

您好

使用 DTS 文件说明设置 GPMC 时遇到问题。

我正在使用 SDK-Linux-am57xx-EVM-08_02_01_00和 SD 卡引导。

我修改 dra7.dtsi 和 am574x-idk.dts 文件、如下所示。

=== dra7.dtsi ===

/* OCP2SCP1 */
对于 DWC3_3和 DWC3_4、/* IRQ 需要 IRQ 交叉开关*/
GPMC:GPMC@50000000{
兼容="ti、am3352-gpmC";
ti、hwmds ="gpmC";
REG =<0x50000000 0x37c>;/*器件 IO 寄存器*/
中断= ;
DMA =<&EDMA_Xbar 4 0>;
dma-names ="rxtx";
GPMC、num-cs =<8>;
GPMC、num-waitpins =<2>;
#address-cells =<2>;
大小单元格=<1>;
中断控制器;
#interrupt-cells =<2>;
GPIO 控制器;
#GPIO-cells =<2>;
状态="正常";       //<=此处已更改
};

==== am574x-idk.dts ===

GPMC{
状态="正常";
//reg =<0 0x50000000 0 0x37c>;// 64位器件 IO 寄存器
//compatible ="ti、am5532-gpMC";
//ti、hwmod ="gpmC";
TI、无空闲启动;
pinctrl-names ="default";
pinctrl-0 =<&ADRs_GPMC_DEFAULT>;
//中断控制器;
//GPIO 控制器;

#address-cell =<2>;
size-cell =<1>;
范围=<0 0x01000000 0x01000000>;//最小 GPMC 分区= 64MB
//3 0 0x20000000 0x10000000>;//最小 GPMC 分区= 64MB

fpgacs0@0、0{
//status ="确定";
REG =<0 0x01000000 0x04000000>;

组宽度=<2>;
//中断父级= ;
//中断=<0>;

GPMC、同步读取;
GPMC、同步写入;
GPMC、器件宽度=<2>;// 16位
GPMC、mux-add-data =<1>;// 1:AAD、2:AD
GPMC、突发长度=<16>;// 16字

};

};

&dra7_PMX_CORE{
idk_led_rgb0b_default:idk_led_rgb0b_default{
pinctrl-single、pins =<
DRA7XX_CORE_IOPAD (0x3714、PIN_OUTPUT | MUX_MODE14)// GPIO1_4
>;
};

ADRs_GPMC_DEFAULT:ADRs_GPMC_DEFAULT{
pinctrl-single、pins =<
DRA7XX_CORE_IOPAD (0x3400、PIN_INPUT | MUX_MODE0)// GPMC_AD0
DRA7XX_CORE_IOPAD (0x3404、PIN_INPUT | MUX_MODE0)// GPMC_AD1
DRA7XX_CORE_IOPAD (0x3408、PIN_INPUT | MUX_MODE0)// GPMC_AD2
DRA7XX_CORE_IOPAD (0x340c、PIN_INPUT | MUX_MODE0)// GPMC_AD3
DRA7XX_CORE_IOPAD (0x3410、PIN_INPUT | MUX_MODE0)// GPMC_AD4

(笑声)

};

};

修改后、我使用"make linux-dtbs"命令进行编译并成功编译。

我使用 sudo 权限将文件 am574x-idk.dTB 复制到 SD 卡(/media/someone/rootfs/boot)、文件时间也随之改变。

但 GPMC 的 Booting 消息看起来不起作用

==== 正在引导消息====

[5.586914]正在注册 SWP/SWPB 仿真处理程序
[5.592041] OMAP_VOLTGE_LARD_INIT:未添加电压驱动器支持
[5.598419] TI OMAP4+器件的电源管理。
[5.603637]正在加载已编译的 X.509证书
[5.628051] DMM 4e000000.DMM:使用中的勘误表 i878的权变措施
[5.635375] DMM 4e000000.DMM:已初始化所有 PAT 条目
[5.642059][DRM]为次要0上的 omapdrm.0初始化了 omapdrm 1.0.0 20110917
[5.649505] OMAP-GPMC 50000000。GPMC:GPMC 版本6.0
[5.654663] GPMC_mem_init:禁用映射在0x0-0x1000000的 CS 0
[5.661071] OMAP-GPMC 50000000。GPMC:无法将 GPMC CS 0重新映射到0x0000000002000000
[5.668579] OMAP-GPMC 50000000。GPMC:无法探测 DT 子'fpgacs0':-22
[5.675964] V3_3D:由 smps9提供
[5.680053] VTT_FIXED:由 V3_3D 供电
[5.685089]已注册 OMAP-iommu 40d01000.MMU:40d01000.MMU
[5.692474]已注册 OMAP-iommu 40d02000.MMU:40d02000.MMU
[5.698669]平台40800000。dsp:添加到 iommu 组0
[5.705169]已注册 OMAP-IMU 588820.MMU:588820.MMU

启动后、命令"cat /proc/iomem "会打印如下所示。

===========================

root@am57xx-EVM:~# cat /proc/iomem
40300000-4037FFFF:40300000。ocmcram ocmcram@40300000
40d01000-40d010ff:40d01000.MMU MMU@0
40d02000-40d020ff:40d020.MMU MMU@0
41501000-415010ff:41501000.MMU MMU@0
41502000-415020ff:415020.MMU MMU@0
43300000-433ffff:43300000。DMA EDMA3_cc

4ae0c154-4ae0c157:4ae07de4.reguler-abb-GPU ldo-address
4ae0c158-4ae0c15b:4ae07ddc.reguler-abb-MPU ldo-address
4ae10000-4ae101ff:4ae1000.GPIO@0
4ae20000-4ae2007f:4ae2000.timer timer@0
4b300000-4b3000ff:4b300000.SPI QSPI_base
50000000-5000037b:50000000。GPMC GPMC@50000000
55082000-550820ff:550820.MMU MMU@0
58000000-5800007f:580000.DSS DSS
58001000-58001fff:58001000.dispc dispc@0
58004054-58004057:580000.dss pll1_clkctrl
58004300-5800431f:580000.DSS pll1.
58009054-58009057:580000.dss pll2_clkctrl
58009300-5800931f:580000.DSS pll2.
58882000-588820ff:588820.MMU MMU@0
8000000000-afcffff:系统 RAM
80008000-80ffff:内核代码
81200000-812fc00f:内核数据
b0000000-ffff:系统 RAM


root@am57xx-EVM:~# devmem2 0x01000000 h

/dev/mem 已打开。[75.796722]-------- [在此处剪切]-----
[75.802673]警告:CPU:0 PID:218、位于 drivers/bus/omap_l3_oc.c:141 L3_interrupt_handler + 0x294/0x38c
[75.812042] 44000000.OCP:L3自定义错误:主 MPU 目标 GPMC (读取):在功能访问期间以用户模式访问数据
[75.823120]链接的模块:Sch FQ_codel cryptodev (O)
[75.828491] CPU:0 PID:218 Comm:devmem2被污染:G O 5.10.100-g7a7a3af903 #1
[75.837066]硬件名称:通用 DRA74X (平展器件树)
[75.843200][ ](展开回扫)从[ ](show_stack+0x10/0x14)

总线错误(转储内核)
root@am57xx-EVM:~# devmem2 0x50000000 h
/dev/mem 已打开。
映射到地址 bb6f4d000的内存。
在地址0x50000000 (0xb6f4d000)处读取:0x0060
root@am57xx-EVM:~# devmem2 0x50000000 w
/dev/mem 已打开。
映射到地址 bb6f2c000的内存。
在地址0x50000000 (bb6f2c000)处读取:0x00000060
root@am57xx-EVM:~# devmem2 0x50000300 w
/dev/mem 已打开。
映射到地址 bb6f40000的内存。
在地址0x50000300 (bb6f40300):0x00000000处读取
root@am57xx-EVM:~#

========================================================================================

我想使用 devmem2命令访问 GPMC 地址范围(0x00000000 ~ 0x3fff_FFFF)。

我想使用 DTS 设置解决此问题。 有可能吗?

您能否提供一些建议或了解相关主题?

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

    我按如下所示更改了 DTS 和内核:OMAP-GPMC.c。

    === DTS ===


    GPMC{
    状态="正常";
    TI、无空闲启动;
    pinctrl-names ="default";
    pinctrl-0 =<&ADRs_GPMC_DEFAULT>;

    范围=<0 0x00000000 0x10000000>;//最小 GPMC 分区= 64MB

    fpgacs0@0{
    REG =<0 0x00100000 0x01000000>;
    组宽度=<2>;

    === OMAP-GPMC.c ==

    静态 int GPMC_cs_remap (int cs、u32 base)

    内转台;
    u32 old_base、大小;

    if (cs >= GPMC_cs_num){
    PR_ERR ("%s":请求的芯片选择被禁用\n"、__func__);
    return -ENODEV;

    /*
    *确保忽略 GPMC 分区的任何设备偏移量
    *已分配给芯片选择并且新的基极确认
    将*更改为 GPMC 16MB 最小粒度。
    *
    Base &=~(SZ_16M - 1);

    // 2022.10.24,ckyu
    GPMC_cs_get_memconf (cs、&old_base、&size);
    if (base == old_base)

    PR_ERR ("%s":old_base=0x%08x、base=0x%08x、size=0x%08x\n"、__func__、old_base、 基座、尺寸);
    返回0;

    RET = GPMC_cs_delete_mem (cs);
    如果(RET < 0)

    PR_ERR ("%s:rtn-path 1\n"、__func__);
    回程;

    RET = GPMC_cs_insert_mem (cs、base、size);
    如果(RET < 0)

    PR_ERR ("%s:rtn-path 2\n"、__func__);
    回程;

    RET = GPMC_cs_set_memconf (cs、base、size);

    回程;

    之后、编译内核并将 am574x-idk.dTB 和 zImage 复制到 SD 卡上的/media/someone/rootfs/boot。

    下面是我认为的相关引导消息。

    ===引导消息(相关)===

    [5.643524] DMM 4e000000.DMM:已初始化所有 PAT 条目
    [5.650207][DRM]为次要0上的 omapdrm.0初始化 omapdrm 1.0.0 20110917
    [5.657592] OMAP-GPMC 50000000。GPMC:num_res=2、res_name=GPMC@50000000、start=0x50000000
    [5.665740] OMAP-GPMC 50000000。GPMC:GPMC_BASE=750d175a
    [5.671081] OMAP-GPMC 50000000。GPMC:GPMC clk_rate = 266000000
    [5.676971] OMAP-GPMC 50000000。GPMC:GPMC 版本6.0
    [5.682128] GPMC_cs_get_memconf:cs=0、base=0x00000000、size=0x01000000
    [5.688781] GPMC_mem_init:禁用映射在0x0-0x1000000、cs_num=8的 CS 0
    [5.695983] GPMC_cs_request:cs=0、* base=0x01000000、size=0x01000000、rtn=0
    [5.703033] GPMC_cs_get_memconf:Cs=0、base=0x01000000、size=0x01000000
    [5.709656] GPMC_cs_remap:rtn-path 2.
    [5.713378] OMAP-GPMC 50000000。GPMC:无法将 GPMC CS 0重新映射到0x0000000000100000
    [5.720886] OMAP-GPMC 50000000。GPMC:GPMC CS 0启动不能小于0x1000000
    [5.728698] OMAP-GPMC 50000000。GPMC:无法探测 DT 子'fpgacs0':-16
    [5.736053] V3_3D:由 smps9提供
    [5.740173] VTT_FIXED:由 V3_3D 供电
    [5.745178] OMAP-IMU 40d01000.MMU:已注册40d01000.MMU
    [5.752563]已注册 OMAP-iommu 40d02000.MMU:40d02000.MMU
    [5.758789]平台40800000。dsp:添加到 iommu 组0
    [5.765258] OMAP-IMU 588820.MMU:588820.MMU 已注册

    启动时、相关 GPMC 端口状态更改为某个状态(低电平->高电平或低电平)。

    但 GPMC 设置不 正确。

    在 DTS 中、CS_0 "reg =<0 0x00100000 0x01000000>;" 设置似乎未被引导消息采用。

    我是不是被误解了?

    谢谢。