Final code... All is right... But don't work...
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#define PIO_BASE 0xE0000000
#define MAP_SIZE 4096UL
#define MAP_MASK (MAP_SIZE-1)
volatile unsigned long *CPDATD; //PortD data register
volatile unsigned long *CPDIR2D; //PortD datadirection2 register
volatile unsigned long *CPODRD; //PortD OPENDRAIN register
volatile unsigned long *CPARD; //PortD Assigment register
volatile unsigned long *IMMR; //IMMR
int main (void)
{
void *pio, *virt_addr;
int fd;
if ((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) {
printf("Failed to open /dev/mem \n");
return -1;
}
pio = mmap(0, MAP_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, PIO_BASE & ~MAP_MASK);
virt_addr = pio;
IMMR = (volatile unsigned long *)pio;
CPARD = (volatile unsigned long *)(pio + ((PIO_BASE+0x145C) & MAP_MASK));
CPODRD = (volatile unsigned long *)(pio + ((PIO_BASE+0x1448) & MAP_MASK));
CPDATD = (volatile unsigned long *)(pio + ((PIO_BASE+0x144C) & MAP_MASK));
CPDIR2D = (volatile unsigned long *)(pio + ((PIO_BASE+0x1454) & MAP_MASK));
printf("IMMR = 0x%08x\n", *IMMR); // IMMRBAR(0xE0000000) to ensure that it is a right page of memory
*CPARD &= ~3UL; // Assigment on GPO16,17,18
printf("CPARD = 0x%08x\n", *CPARD); //echo CPARD
*CPODRD =0; //reset open-drain register
printf("CPODRD = 0x%08x\n", *CPODRD); //echo CPODRD
*CPDIR2D &= ~3UL; //set output
*CPDIR2D |= 5; //PD16 and PD17 as output
printf("CPDIR2D = 0x%08x\n", *CPDIR2D); //echo CPDIR2D
*CPDATD &= ~3UL; // turn ON Red LED (port D16) andYellow LED (port D17);
printf("CPDATD = 0x%08x\n", *CPDATD); //echo CPDATD
sleep(1); //1 second pause
if (munmap(pio, MAP_SIZE) == -1) {
printf("Memory unmap failed.\n");}
close(fd);
return 0;
}
------------------------------
At the output:
/mnt/nfs/gpio # ./a.out
IMMR = 0xe0000000
CPARD = 0x00000000
CPODRD = 0x00000000
CPDIR2D = 0x00000000
CPDATD = 0x00000000
---------------------------------
IMMR is right... But other register not changed
Why?