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