Hello, Dan!

> That should work, I do this quite regularly.  What actually fails,
> the mmap() or your access to the mapped region?

mmap fails with EINVAL.

> There is what I do:
>
>       mem_addr = (u_char *)mmap(NULL, FLASH_MEM_SIZE,
>                       (PROT_READ | PROT_WRITE), MAP_SHARED,
>                       mem_fd, FLASH_MEM_ADDR);

I know that program. FLASH_MEM_SIZE is a small number used only in the
first mmap() to determine the size of the flash. If you make it so big
that (int)(FLASH_MEM_ADDR+FLASH_MEM_SIZE)==0 then mmap() fails.

The test program below works on LinuxPPC (2.2.14 with tweaks for G3) but
fails on RPX/Lite (MontaVista kernel):

mmap at 0xffc00000, size 0x400000 failed: Invalid argument

Regards,
Pavel Roskin

=================================
#include <sys/types.h>
#include <sys/mman.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#define FLASH_MEM_ADDR  ((uint)0xffc00000)
#define FLASH_MEM_SIZE  ((uint)0x00400000)
int
main(void)
{
        int     mem_fd, i;
        uint    mfg, dev;
        void* mem_addr = NULL;

        if ((mem_fd = open("/dev/mem", O_RDWR)) < 0) {
                perror("cannot open /dev/mem");
                exit(1);
        }

        mem_addr = (u_int *)mmap(NULL, FLASH_MEM_SIZE,
                                (PROT_READ | PROT_WRITE), MAP_SHARED,
                                mem_fd, FLASH_MEM_ADDR);

        if ((int)mem_addr < 0) {
                fprintf(stderr, "mmap at 0x%x, size 0x%x failed: %s\n",
                        FLASH_MEM_ADDR, FLASH_MEM_SIZE, strerror(errno));
                exit(1);
        }
}
=================================


** Sent via the linuxppc-embedded mail list. See http://lists.linuxppc.org/



Reply via email to