Thank you Guiseppe. I had tried an failed in the past to use mmap, but I see your solution to the error I had before is to mmap starting at the base address of the PWM peripheral instead of just at eQEP with (target&~MAP_MASK). Since ~MAP_MASK is 0xFFFFFFFFF000, the mmap starts at address 0x48300000 instead of 0x48300180 (for eqep0). Then you seem to be getting back to the base eQEP position register by adding target&MAP_MASK (0x180) back onto the virt_addr. Why the mmap function call fails without using the MAP_MASK is not entirely clear to me, but I won't worry about it.
While my mmap errors are gone, I'm still only ever reading 0x83 when accessing the position value pointed to by virt-addr. If I try to access other parts of the eqep module I only get 0. For example the eqep hardware revision code which is at offset 0x5C according to the AM335xx reference manual returns 0 but should contain a value. My test code is below. Any thoughts? Thank you all, Strawson #include <stdio.h> #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> #include <sys/mman.h> #define MAP_SIZE 4096UL #define MAP_MASK (MAP_SIZE - 1) #define EQEP0_BASE 0x48300180 #define EQEP1_BASE 0x48302180 #define EQEP2_BASE 0x48304180 int main(){ int fd; volatile unsigned long *virt_addr; volatile unsigned long *map_base; unsigned long read_result; int i; for(i=0;i<10000;i++){ unsigned long target=EQEP2_BASE; //O_SYNC makes the memory uncacheable if ((fd = open("/dev/mem", O_RDWR | O_SYNC))==-1) { printf("Could not open memory\n"); return 0; } //printf("opened /dev/mem \n"); //EQEP0_BASE&~MAP_MASK truncates the last 12 bits of the target address map_base=(ulong*)mmap(0, 4096, PROT_READ|PROT_WRITE,MAP_SHARED,fd, target&~MAP_MASK); if(map_base == (void *) -1) { printf("Unable to mmap eqep\n"); exit(-1); } //add the last 12 bits (0x180 for eqep) back onto to the address //also add 0x5C to offset to hardware revision code virt_addr = map_base + (target & MAP_MASK)+0x5C; read_result = *((unsigned long *) virt_addr); printf("\rValue at addr: 0x%lX (%p): 0x%lX ", map_base, virt_addr, read_result); close(fd); usleep(10000); } close(fd); return 0; } -- For more options, visit http://beagleboard.org/discuss --- You received this message because you are subscribed to the Google Groups "BeagleBoard" group. To unsubscribe from this group and stop receiving emails from it, send an email to beagleboard+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.