mmap



  • Hallo
    Ich habe ein MBX-Board (Motorola). Das Board hat drei LED's die ich zu testes halber ansteuern möchte. Ich habe ein kleines programm ich C, dass mir den zugriff auf ein register ermöglichen soll, von dem aus ich die LED's steuern kann. Leider klappt das aber nicht so ganz.
    Sieht vielleicht gerade jemand wo ich einen fehler mache?

    #include <unistd.h>
    #include <string.h>
    #include <sys/socket.h>
    #include <sys/time.h>
    #include <fcntl.h>
    #include <asm/system.h>
    #include <asm/io.h>
    #include <sys/mman.h>
    
    #define	 C_MEMSPACE	0xFA100000				  /* physical address */
    #define	 C_MEMSIZE	0x100					     /* count */
    #define	 C_PAGE		0x1000					 /* page size */
    
    int	       mem_fd;					/* handle to /dev/mem */
    unsigned char  *vMemory;			   /* array for memory-access */
    unsigned long  vFIFOMask;				  /* set by SET_TRACE */
    
    /* enables access to memory and I/O space */
    unsigned char fGetAccess( void )
    {
      /* accessing memory */
      mem_fd = open( "/dev/mem", O_RDWR );			     /* open /dev/mem */
      if( mem_fd < 0 )
        return( 0 );
      vMemory = (unsigned char *)malloc( C_MEMSIZE + (C_PAGE-1) );	  /* allocate */
      if( vMemory == NULL )
        return( 0 );
      if( (unsigned long)vMemory % C_PAGE )			 /* start on boundary */
        vMemory += C_PAGE - ((unsigned long)vMemory % C_PAGE );
      vMemory = (unsigned char *)mmap(	     /* map vMemory on physical space */
           (caddr_t)vMemory,
           C_MEMSIZE,
           PROT_READ | PROT_WRITE,
           MAP_SHARED | MAP_FIXED,
           mem_fd,
           C_MEMSPACE );
      if( (long)vMemory < 0 )
        return( 0 );
      return( 1 );							/* successful */
    }
    
    /* releases resources (notmally never called) */
    void fReleaseAccess( void )
    {
      close( mem_fd );
    }
    
    /* turn LED on, FIFO will not be resetted */
    void fLEDOn( void )
    {
      vMemory[0x00] = 0x00;
    }
    
    /* turn LED off, FIFO will not be resetted */
    void fLEDOff( void )
    {
      vMemory[0x01] = 0x0E;
    }
    
    void main( void )
    {
      fGetAccess();				   /* Enable access */
      fLEDOff();				   /* LED off shows ready */
      fReleaseAccess();
    }
    

    hier noch die spezifikationen vom Board

    Das MBX-Board verfügt über drei LED’s die von einem Register aus gesteuert werden können.
    Es gibt zwei verschieden Register auf dem Board. Das erste befindet sich an allen geraden Adressen von $FA100000- $FA1FFFFE. Das zweite an allen ungeraden Adressen von $FA100001- $FA1FFFFF. Die LED’s können mit Hilfe des zweiten Registers gesteuert werden.
    Das Register besitzt 7 nutzbare Datenbits, die nachfolgend beschrieben werden.
    Die ersten vier Bits im Kontrollregister (2) definieren die Spannung für die PCMCIA Karte ( für uns nicht von Bedeutung). Die Bits vier bis sechs sind die Kontrollstatus LED’s. Bit sieben setzt das PCI Interface zurück (falls es gesetzt ist).


Anmelden zum Antworten