工具/软件: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