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.

Reply via email to