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:GPMC 上的 FPGA 访问

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/643157/linux-am5728-fpga-access-on-gpmc

器件型号:AM5728

工具/软件:Linux

您好!

我尝试在16位多路复用模式下将 FPGA 连接到 CS0上的 GPMC、我对 DTS 进行了以下更改

     GPMC_PINS_DEFAULT{
   pinctrl-single、pins =<
      0x000 0x30   //* GPMC_ad0.gpMC_ad0 MODE0 |输入|上拉*/
      0x004 0x30   //* GPMC_ad1.GPMC_ad1 MODE0 |输入|上拉*/
      0x008 0x30   //* GPMC_ad2.GPMC_ad2 MODE0 |输入|上拉*/
      0x00C 0x30   //* GPMC_ad3.GPMC_ad3 MODE0 |输入|上拉*/
      0x010 0x30   //* GPMC_AD4.GPMC_AD4 MODE0 |输入|上拉*/
      0x014 0x30   //* GPMC_ad5.GPMC_ad5 MODE0 |输入|上拉*/
      0x018 0x30   //* GPMC_ad6.GPMC_ad6 MODE0 |输入|上拉*/
      0x01C 0x30   // GPMC_AD7.GPMC_AD7 MODE0 |输入|上拉*/
      0x020 0x30   //* GPMC_ad8.gpMC_ad8 MODE0 |输入|上拉*/
      0x024 0x30   //* GPMC_ad9.gpMC_ad9 MODE0 |输入|上拉*/
      0x028 0x30   //* GPMC_ad10.gpMC_ad10 MODE0 |输入|上拉*/
      0x02C 0x30   // GPMC_ad11.GPMC_ad11 MODE0 |输入|上拉*/
      0x030 0x30   //* GPMC_ad12.GPMC_ad12 MODE0 |输入|上拉*/
      0x034 0x30   //* GPMC_ad13.GPMC_ad13 MODE0 |输入|上拉*/
      0x038 0x30   //* GPMC_ad14.GPMC_ad14 MODE0 |输入|上拉*/
      0x03C 0x30   //* GPMC_AD15.GPMC_AD15 MODE0 |输入|上拉*
      0x0B4 0x08   /* GPMC_cscn0.GPMC_cscn0 MODE0 |输出*/
      0x0C0 0x28   // GPMC_clk.GPMC_clk MODE0 |输入*/
      0x0C4 0x08   //* GPMC_advn_ale.GPMC_advn_ale MODE0 |输出*/
      0x0C8 0x08   //* GPMC_oen_ren。GPMC_oen_ren MODE0 |输出*/
      0x0CC 0x08   //* GPMC_wen.GPMC_wen MODE0 |输出*/
      0x0D0 0x08   //* GPMC_BEN0_cle。GPMC_BEN0_cle MODE0 |输出*/
      0x0D4 0x08   /* GPMC_BEN1_cle。GPMC_BEN1_cle MODE0 |输出*/
      0x0D8 0x30   /* GPMC_wait0.GPMC_wait0 MODE0 |输入|上拉*/
   >;
};

GPMC@50000000{
   兼容="ti、am3352-gpmC";
   ti、hwmds ="gpmC";
   REG =<0x50000000 0x37c>;
   中断=<0x0 0xF 0x4>;
   DMA =<b2 0x4 0x0>;
   dma-names ="rxtx";
   GPMC、num-cs =<0x8>;
   GPMC、num-waitpins =<0x2>;
   #address-cells =<0x2>;
   大小单元格=<0x1>;
   中断控制器;
   #interrupt-cells =<0x2>;
   GPIO 控制器;
   #GPIO-cells =<0x2>;
   状态="正常";
   pinctrl-names ="default";
   pinctrl-0 =<&GPMC_PINS_DEFAULT>;
  范围=<0 0x08000000 0x10000000>;
   FPGA{
     REG =<0 0x01000000>;
      组宽度=<2>;
   
      GPMC、mux-add-data =<2>;
      GPMC、SYNC-clk-ps =<0>;
      GPMC、cs-on-ns =<0>;
      GPMC、cs-rd-Off-ns =<44>;
      GPMC、cs-wr-off-ns =<44>;
      GPMC、Adv-on-ns =<6>;
      GPMC、Ad-rd -关闭-ns =<34>;
      GPMC、AdV-wr-off-ns =<44>;
      GPMC、WE-OFF-ns =<40>;
      GPMC、OE-OFF-ns =<54>;
      GPMC、ACCESS ns =<64>;
      GPMC、第周期-ns =<82>;
      GPMC、功率周期-ns =<82>;
      GPMC、wr 访问-ns =<40>;
      GPMC、wr-data-mux-bus-ns =<0>;

      #address-cells =<1>;
      大小单元格=<1>;
   };
};

现在、当我使用以下代码从 userspace 访问 By 映射时(我获得转储[1]):

#include
#include
#include
#include
#include
#include

int main (int argc、char** argv)

   int fd = open ("/dev/mem、O_RDWR | O_sync);//O_sync 使存储器不可高速缓存

#if 1.
   volatile uint8_t * extmem;

   extmem =(uint8_t *) mmap (NULL、0x10000000、PROT_READ|PROT_WRITE、MAP_SHARED、FD、0x10000000);
   volatile uint32_t * P32 =(uint32_t *)&extmem[0x1000020];
   *P32 = 0xdeadf牛肉;
   uint32_t val =* p32;
   *P32 = 0xCAFEBABE;
   uint32_t val2 =* p32;
   printf ("val=%#x\n"、val);
   printf ("val=%#x\n"、val2);
 
   //printf ("size=%d\n"、sizeof (buffer));
   //memcpy (extmem、buffer、sizeof (buffer)-1);

#endif
   返回(0);

我是否在这里遗漏了我需要做的事情?

dmesg 输出

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

[0.412145]   OMAP-GPMC 50000000。GPMC:找不到节点/ocp/l4@4a000000 / SCM@2000/pinmux@1400/GPMC_PINS_DEFAULT 的 pctldev、延迟探针
[2.293608]   OMAP-GPMC 500000.GPMC:GPMC 版本6.0
[2.298811]   GPMC_mem_init:禁用映射在0x0-0x1000000的 CS 0
[2.305044]   gpiochip_add:在器件:OMAP-GPMC 上注册了 GPIO 510至511

[1] 内核转储

[11.893705]  ------ [在此处剪切]-----
[11.898364]  警告:CPU:0 PID:498 at drivers/bus/omap_l3_oc.c:147 l3_interrupt_handler+0x25c/0x368 ()
[11.907886]  44000000.OCP:L3自定义错误:主 MPU 目标 GPMC (空闲):在功能访问期间以用户模式访问数据
[11.918974]  链接到以下模块:
[11.922052]  CPU:0 PID:498通信:A.out 未被污染4.4.4.32-00004-gd9240c6-DISAID #76
[11.929740]  硬件名称:通用 DRA74X (平展器件树)
[11.935857]  背迹:
[11.938330][   ](dump_backtrace)从[ ](show_stack+0x18/0x1c)
[11.945930]   r7:c03125c8 r6:20070193 r5:00000000 r4:c0b185f4
[11.951655]  [ ](show_stack)从[ ](dump_stack+0x8c/0xa0)
[11.958914][   ](dump_stack)从[ ](warn_slESpath_common+0x88/b8)
[11.967037]   r7:c03125c8 r6:00000093 r5:00000009 r4:ecc37df0
[11.972762]  [ ](warn_slowpath_common)、来自[ ](WARN_RASPH_FMt+0x38/0x40)
[11.981495]   R8:00000017 r7:c09eaab0 R6:00000000 R5:c09eab70 R4:c09eac14
[11.988271]  [ ](warn_slowpath_fmt)、来自[ ](L3_INTERRUPT_Handler+0x25c/0x368)
[11.997179]   r3:eea11b40 r2:c09eac14
[12.000782]   R4:80080003
[12.003339]  [ ](L3_interrupt_handler)、来自[ ](handle_irq_event_perpu+b0x4/0x160)
[12.012683]   R10:c0b4524a R9:eea0f840 R8:00000017 r7:00000000 R6:00000000 R5:ee0f8a0
[12.020587]   R4:eea2a040
[12.023140]  [ ](handle_irq_event_perpu)、来自[ ](handle_IRQ_EVENT_+0x40/0x64)
[12.032046]   R10:b6fb5000 R9:00000000 R8:ee808000 r7:00000000 R6:c0af24c4 R5:ee0f8a0
[12.039949]   R4:eea0f840
[12.042504]  [ ](handle_irq_event)从[ ](handle_fasteoi_IRQ+0xc0/0x194)
[12.051062]   r7:00000000 R6:c0af24c4 r5:eea0f8a0 r4:ee0f840
[12.056781]  [ ](handle_fasteoi_IRQ)、来自[ ](generic_handle_IRQ+0x2C/0x3c)
[12.065426]   r7:00000000 R6:00000000 R5:00000017 R4:c0ae6424
[12.071146][   ](generic_handle_IRQ)、来自[ ](_handle_domain_IRQ+0x64/bb)
[12.079884]  [ ](_handle_domain_IRQ)、来自[ ](GIC_Handle_IRQ+0x40/0x7c)
[12.088267]   R9:00000000 R8:fa213000 r7:fa212000 r6:ecc37fb0 r5:fa21200c r4:c0aec8b8
[12.096083]  [ ](GIC_Handle_IRQ)、来自[ ](_IRQ_USR+0x48/0x60)
[12.103597]  异常堆栈(0xecc37fb0至0xecc37ff8)
[12.108670]  7fa0:                                    a6e49000 10000000 a7e49020 cafebabe.
[12.116883]  7fc0:00010548 00000000 00010354 00000000 00000000 00000000 b6fb5000 bea09bbc
[12.125096]  7fe0:00000000 bea09b90 000104cc 0001050c 80070010 ffff
[12.131735]   R9:00000000 R8:30c5387d r7:30c5387d R6:ffFFFF R5:80070010 R4:0001050c
[12.139554]  --[结束线迹 ce705d0da4493420 ]--
[12.145663]  未处理故障:异步外部中止(0x1211)、0x00000000
[12.147481]  未处理故障:异步外部中止(0x1211)、地址为0x00000000
[12.147485]  PgD = ed884540
[12.147495]  [00000000]* PgD=ad91c003、* PMD=ad8d2003、* Pte=00000000
[12.169250]  PgD = ed9907c0
[12.171965]  [00000000]* PgD=ad840003,* PMD=fd0a3003
[12.176919]  ------ [在此处剪切]-----
[12.181564]  警告:CPU:0 PID:344 at drivers/bus/omap_l3_oc.c:147 l3_interrupt_handler+0x25c/0x368 ()
[12.191084]  44000000.OCP:L3自定义错误:主 MPU 目标 GPMC (读取):在功能访问期间以用户模式访问数据
[12.202171]  模块链接在:
[12.205245]  CPU:0 PID:344 Comm:klogd 被污染:G       W      4.4.3.32-00004-gd9240c6-脏#76
[12.214153]  硬件名称:通用 DRA74X (平展器件树)
[12.220269]  回溯:
[12.222739][   ](dump_backtrace)从[ ](show_stack+0x18/0x1c)
[12.230338]   r7:c03125c8 r6:200c0193 r5:00000000 r4:c0b185f4
[12.236062][   ](show_stack)从[ ](dump_stack+0x8c/0xa0)
[12.243320][   ](dump_stack)从[ ](warn_slESpath_common+0x88/b8)
[12.251442]   r7:c03125c8 r6:00000093 r5:00000009 r4:ed969c68
[12.257162]  [ ](warn_slowpath_common)、来自[ ](WARN_RASPH_FMt+0x38/0x40)
[12.265895]   R8:00000017 r7:c09eaab0 R6:00000002 R5:c09eab70 R4:c09eac14
[12.272670]  [ ](warn_slowpath_fmt)、来自[ ](L3_INTERRUPT_Handler+0x25c/0x368)
[12.281578]   r3:ea11b40 r2:c09eac14
[12.285180]   R4:80080003
[12.287736]  [ ](L3_interrupt_handler)、来自[ ](handle_irq_event_perpu+b0x4/0x160)
[12.297080]   R10:c0b4524a R9:eea0f840 R8:00000017 r7:00000000 R6:00000000 R5:ee0f8a0
[12.304981]   R4:eea2a040
[12.307535]  [ ](handle_irq_event_perpu)、来自[ ](handle_IRQ_EVENT_+0x40/0x64)
[12.316442]   R10:00000000 R9:ed968000 R8:ee808000 r7:00000000 R6:c0af24c4 R5:ee0f8a0
[12.324343]   R4:eea0f840
[12.326898]  [ ](handle_irq_event)从[ ](handle_fasteoi_IRQ+0xc0/0x194)
[12.335458]   r7:00000000 r6:c0af24c4 r5:eea0f8a0 r4:ee0f840
[12.341176]  [ ](handle_fasteoi_IRQ)、来自[ ](generic_handle_IRQ+0x2C/0x3c)
[12.349822]   r7:00000000 R6:ed969f40 R5:00000017 R4:c0ae6424
[12.3555543]  [ ](generic_handle_IRQ)、来自[ ](_handle_domain_IRQ+0x64/bb)
[12.364280]  [ ](_handle_domain_IRQ)、来自[ ](GIC_Handle_IRQ+0x40/0x7c)
[12.372663]   R9:ed968000 R8:fa213000 r7:fa212000 r6:ed969e28 r5:fa21200c r4:c0aec8b8
[12.380481][   ](GIC_Handle_IRQ)、来自[ ](_IRQ_Svc+0x40/0x74)
[12.387996]  异常堆栈(0xed969e28至0xed969e70)
[12.393069]  9e20:                  00000000 c0b492c0 00000000 00000202 00000012
[12.401282]  9e40:ed968000 00000000 ee808000 ed968000 00000000 ed969ed4 ed969ed8 ed969e78
[12.409494]  9e60:c003759c c0037108 600c0113 ffffff
[12.414564]   R9:ed968000 R8:ee808000 r7:ed969e5c R6:ffff R5:600c0113 R4:c0037108
[12.422384][   ](__do_softirq)、从[ ](IRQ_EXIT+bc/0x11c)
[12.429721]   R10:00000000 R9:ed968000 R8:ee808000 r7:00000000 R6:00000000 R5:00000012
[12.437627]   R4:ffe000
[12.440180]  [ ](IRQ_EXIT)从[ ](_handle_domain_IRQ+0x68/bb)
[12.448040]   R5:00000012 R4:c0ae6424
[12.451648]  [ ](_handle_domain_IRQ)、来自[ ](GIC_Handle_IRQ+0x40/0x7c)
[12.460033]   R9:ed968000 R8:fa213000 r7:fa212000 r6:ed969f40 r5:fa21200c r4:c0aec8b8
[12.467854]  [ ](GIC_Handle_IRQ)、来自[ ](_IRQ_Svc+0x40/0x74)
[12.475367]  异常堆栈(0xed969f40至0xed969f88)
[12.480440]  9f40:ed969fb0 00000001 00000000 600c0010 ed968000 00000000 ed969fb0 30c5387d
[12.488652]  9f60:00000000 ed968000 00000000 ed969fansce969fb0 ed969f90 c000fec c0012cf8
[12.496863]  9f80:600c0113 ffffff
[12.500363]   R9:ed968000 R8:00000000 r7:ed969f74 R6:ffffff R5:600c0113 R4:c0012cf8
[12.508186]  [ ](Do_Work_Pending)、来自[ ](SLOW_work 挂起+ 0xc/0x20)
[12.516395]   r7:30c5387d R6:ffff R5:600c0010 R4:b6e8873c
[12.522108]  --[末端迹线 ce705d0da4493421 ]--

谢谢、

Mike

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    软件团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Mike:

    您使用的是哪个版本的 Processor SDK? GPMC_PINS_DEFAULT 配置操作似乎不正确。

    此致、
    Kemal

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

    感谢您的回复。

    我们将使用03.02.00版本。

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

    我已经交叉检查了 GPMC 的 pinmux,但找不到任何明显的东西,您能告诉我什么是不正确的。

    此外,我还想检查我是否做了正确的事情,方法是从用户空间访问内存(volatile uint32_t * P32 =(uint32_t *)&extmem[0x1000020];),并使用上面的配置?

    注意:我选择了地址0x1000020、因为内核日志显示"GPMC_mem_init:禁用映射地址0x0-0x1000000"

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

    它肯定与地址不匹配、但我们必须找到它的位置。 另请检查 此主题。

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

    我查看了这些链接、现在我尝试了 devmem2 0x08000000、它获取我的结果0x0、但我看不到 GPMC_clk 引脚上的时钟。 我是否遗漏了什么?

    谢谢、
    Mike
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否仍有此问题? 由于某种原因、GPMC 功能时钟可能未打开。 您能否使用 devmem2转储0x4a008728并在此处发布?