none
ARM扩展问题 RRS feed

  • 问题

  • 我想用ARM的外部总线RDATA[15:0]和RADDR[25:0]扩展FPGA,在有操作系统的情况下,应该如何操作呢?是否还要写一个针对FPGA的驱动?我看了芯片手册,ARM共有6个SROM扩展区域,片选为nRCS[5:0],这些区域正处于WinCE的低2GB的用户区,若用这些区域中的一个扩展FPGA,在有操作系统情况下,这个区域是否会与操作系统的进程空间相冲突?应如何处理?
    望各位大哥指教。

    2008年5月13日 14:23

答案

  • 呵呵,这个问题好“硬”。

    您在处理器手册上看到的低2GB其实是物理内存,跟WinCE的低2GB没关系。Win CE的低2GB是虚拟内存。

    具体这2GB映射到哪里去了,要看oemaddresstable中内存的虚实映射关系。

    2008年5月21日 11:27
    版主

全部回复

  • 呵呵,这个问题好“硬”。

    您在处理器手册上看到的低2GB其实是物理内存,跟WinCE的低2GB没关系。Win CE的低2GB是虚拟内存。

    具体这2GB映射到哪里去了,要看oemaddresstable中内存的虚实映射关系。

    2008年5月21日 11:27
    版主
  • 我用的是S3C2440,写成流式驱动程序,把物理内存0X10000000映射虚拟内存为0XA4000080,编译后下载驱动到平台,读数据不准确,没法写数据,但我用裸机测试过(ADS1.2软件),FPGA的接口是OK的,只是没有用映射虚拟内存的方法,相关的程序如下,请各位老师帮帮忙忙除一下错,

    #define PC104bus2  (*(volatile unsigned *)0x10000082)
    #define PC104bus4  (*(volatile unsigned *)0x10000084)
    #define PC104bus6  (*(volatile unsigned *)0x10000086)
    #define PC104bus8  (*(volatile unsigned *)0x10000088)
    #define PC104_BASE      0xA4000080 

    typedef struct {
        unsigned int PC104bus2;
        unsigned int PC104bus4;
        unsigned int PC104bus6;
        unsigned int PC104bus8;
    }PC104reg;

    volatile PC104reg   *s2440PC104 = (PC104reg *)PC104_BASE;

     // PC104bus Virtual alloc    
    s2440PC104 = (volatile PC104reg *) VirtualAlloc(0,sizeof(PC104reg),MEM_RESERVE, PAGE_NOACCESS);
     if(s2440PC104 == NULL)
     {
         RETAILMSG(1,(TEXT("For s2440PC104: VirtualAlloc faiLED!\r\n")));
      }
      if(!VirtualCopy((PVOID)s2440PC104,(PVOID)(PC104_BASE),sizeof(PC104reg),PAGE_READWRITE | PAGE_NOCACHE ))
     {
       RETAILMSG(1,(TEXT("For s2440PC104: VirtualCopy faiLED!\r\n")));
     }
     
     s2440MEM->rBWSCON = (s2440MEM->rBWSCON & ~(0xf<<8))|(0x1<<8);
     s2440MEM->rBANKCON2 = 0x54a0;

    DWORD LED_Write(DWORD hOpenContext,LPVOID pSourceBytes,DWORD NumberOfBytes)
    { unsigned int *pReadBuffer;
        pReadBuffer = (unsigned int *)MapPtrToProcess((LPVOID)pSourceBytes,GetCallerProcess());
     if(NumberOfBytes == 2)
        {
          s2440PC104->PC104bus2 = *pReadBuffer;
        }
    }

    DWORD LED_Read(DWORD hOpenContext,LPVOID pBuffer, DWORD Count)
    { unsigned int *pReadBuffer;
        unsigned int adcvalue;
        pReadBuffer = (unsigned int *)MapPtrToProcess(pBuffer,GetCallerProcess());
        *pReadBuffer = s2440PC104->PC104bus8;
    }

    谢谢了!
    2009年9月21日 19:06