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/AM3354:GPMC 访问 UHPI 时出现分段故障

Guru**** 2542610 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/604903/linux-am3354-segmentation-fault-when-gpmc-accesses-uhpi

器件型号:AM3354

工具/软件:Linux

大家好、

我正在尝试设置 AM335x:GPMC (主机)和 TMS320C6746:UHPI (从器件、异步读取/写入)之间的通信。  AM3354上安装了 Linux 3.8.13。 在 UHPI 驱动程序中、我在 模块初始 化函数中执行了以下操作:

1)调用  GPMC_cs_request()以请求芯片选择(CS = 2)。 返回物理地址。

2)调用 request_mem_region()以请求资源,返回非 NULL。 不确定是否有必要这样做,因为 GPMC_cs_request()已经完成了 alloc_resources()函数,但我还是这么做了。

3)调用  ioremap(),将物理地址映射到虚拟地址。  请求的存储器大小为0x40。 返回虚拟地址(非静态)。

4) 4)读取和写入所有相关的 HPI 寄存器(在系统启动时、在内核空间中)。

实际上、上述所有内容都是成功的、我能够打印出物理地址和虚拟地址。  物理地址= 0x01000000、 虚拟地址= 0xe0898000。

电路板引导完成后、我尝试从用户空间访问 UHPI。 应用程序是  uhpi_burg_test,它调用  ioctl  操作,它调用 驱动程序中定义的 uhpi_ioctl(),但出现错误:

[1234.363885]未处理故障: 在0xe0898030上的非线性蚀刻(0x1008)上的外部中止
[1234.371899]内部错误:1008 [#4] Thumb2
[1234.376542]中链接的模块:
[1234.379742] CPU:0被污染:G D (3.8.13 #22)
[1234.385490] PC 位于 uhpi_ioctl+0x110/0x274
[1234.389869] LR 位于 do_vfs_ioctl+0x61/0x3f4
[1234.394329] PC:[ ] LR:[ ] PSR:20000033
[1234.394329] sp:df10de50 IP:50c5387d FP:e0898000
[1234.406318] R10:30003bfe R9:df10de50 R8:beea5b84
[1234.411774] r7:df10ded8 r6:0000001f r5:e0898034 r4:e0898030
[1234.418591] r3:df10de54 r2:00000020 r1:e0898008 r0:dd3aec80
[1234.425409]标志:模式 SVC_32 ISA Thumb 段用户的 FIQ 上的 nzCv IRQ
[1234.433042]控制:50c5387d 表:9d10c019 DAC:00000015
[1234.439042]处理 uhpi_burst_test (pid:347、栈限制= 0xdf10c238)
[1234.446039]堆栈:(0xdf10de50至0xdf10e000)
[1234.450591] de40:df10c000 c04e18f9 df5685c8 c0274fe1
[1234.459137] de60:000000a7 df10dfb0 00000001 c04e18b1 df10dfb0 c04e32a1 c04eb0 c04ebb0 c04ebeb0
[1234.467683] de80:dd078580 df10de98 c08d4f68 df5685c8 00000200 00000000 c08d4f68 df048040
[1234.476228] deA0:c08a14dc ffffff 00000000 c04e3507 00000000 a0000093 00000001 df10df08
[1234.484773] dec0:df10c000 c04e3527 00000001 c04e18bf dd078580 c004a409 dd078580 df10ed8
[1234.493317] dee0:a0000093 de968120 dd3aec80 00005452 00000003 dd3aec80 00000003 df3ec608
[1234.501859] df00:beea5b84 c0102b75 65581405 0000011f dd0de015 c000eba5 65c6033f 0000011f
[1234.510402] df20:df3ec608 00000101 00000001 dd3aec88 dd078580 df667600 00000003 df667624
[1234.518945] df40:dd3aec80 dd3aec88 df3ec608 00000020 00000001 c00f354b c089d434 00000000
[1234.527488] df60:beea5b84 8004f02a 00000000 dd3aec80 00000003 00000000 beea5c24 c0102f43
[1234.536030] df80:df10dfb0 00000000 beea5c24 beea5c38 00000000 00008390 00000036 c000c48
[1234.544574] dfa0:df10c000 c000c841 beea5c38 00000000 00000003 8004f02a beea5b84 beea5b84
[1234.553116] dfc0:beea5c38 00000000 00008390 00000036 00000000 00000000 b6f2f000 beea5c24
[1234.561659] dfe0:00010858 beea5b7c 00008640 b6e8efdc 80000010 00000003 00000000 00000000
[1234.570208]代码:1e56 b172 f109 0304 (8822) f823
[1234.575214]--[结束线迹92d675da0a3e0dc3 ]--
[1234.58494]发布了 UHPI 器件。

分割故障

这实际上不应该发生、因为虚拟内存 [0xe0898000、0xe0898040) 是通过  ioremap()获得的、并且我在启动时已成功访问 UHPI 器件(即在内核空间中)。 但是、在用户空间中出现问题。

是否有任何可能会引起这个 bizzare 分段故障? 例如、器件树、时钟或寄存器配置不正确等 我现在完全不知道。 感谢您的评论和建议。

谢谢、

Charlie

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

    我看到您正在尝试写入起始地址为0xe0898030 (虚拟地址)的存储器空间、并且您已映射到0xe0898040。 是否确定导线操作不会与未映射的地址空间重叠(在0xe0898040之后)? 您要写入多少个字节?

    在您的用户应用程序中、您可以映射大于0x40的地址空间吗?

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

    Yordan、您好!


    UHPI 器件的运行方式与 NAND 闪存的运行方式不同。 仅使用4条地址线。 (在本例中、使用 GPMC A2至 A5。 这就是为什么0x40足以支持 UHPI 的原因)。 我曾尝试申请0x400、但分割故障从未消失。 我非常确定、UHPI 器件只需要0x40。  


    我甚至尝试打印通过在__arm_ioremap_pfn_caller ()中添加跟踪来注册的每个设备的虚拟地址之后。 虚拟地址之间似乎没有重叠。 实际上、在 UHPI 器件的注册之后、FPGA 器件的注册紧随其后。 FPGA 器件也由 GPMC 驱动、但使用不同的芯片选择空间。 (在本例中、FPGA 使用 CS = 1、UHPI 使用 CS = 2)。 分配给 FPGA 的虚拟空间从0xe089A000开始、该值远离 UHPI 边界。


    我通过禁用 FPGA 器件(即在 CS = 1时保持 CSVALID 位为低电平)部分解决了这个问题、但 FPGA 的 GPMC CS 空间和虚拟地址空间仍然存在。 因此、每当我需要 FPGA 器件时、我都必须手动设置 CSVALID 位、并为 UHPI 禁用 CSVALID 位。 我想这不是最终的解决方案。

    Charlie