Forum: Mikrocontroller und Digitale Elektronik mmap


von stefan (Gast)


Lesenswert?

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).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.