[ELDK] mmap: first byte always wrong

Alberto Caballero alberto.kavan at gmail.com
Thu Nov 25 23:35:19 CET 2010


Hi all,

I am developing over an EP440xS board. I have stored a valid U-Boot image
into the board Flash. Kernel and Ramdisk image is stored at 0xFF000000
address and the test data image at 0xFD000000 address.

Once the Linux is started, I run my program that tries to copy the image
from Flash into a Linux file. As first step, I try to read the image magic
number, but I always get the first byte wrong, usually set to 0xFF. The rest
of the magic number bytes are correct, as the rest of the image header
bytes.

Instead of getting 0x27 0x05 0x19 0x56 I am getting 0xFF 0x05 0x19 0x56.

Any ideas of what's going on? Any suggestion?

Best regards,

Alberto

This is an extract of the code I am using:


---------------------------------------------------------------- Cut
----------------------------------------------
#define SIZE            0x00100000  // 1MB size
#define IH_MAGIC        0x27051956    /* Image Magic Number        */
#define IH_NMLEN        32    /* Image Name Length        */

volatile unsigned char *base;
int fdMem;
void *where;

typedef struct image_header {
    unsigned int    ih_magic;    /* Image Header Magic Number    */
    unsigned int    ih_hcrc;    /* Image Header CRC Checksum    */
    unsigned int    ih_time;    /* Image Creation Timestamp    */
    unsigned int    ih_size;    /* Image Data Size        */
    unsigned int    ih_load;    /* Data     Load  Address        */
    unsigned int    ih_ep;        /* Entry Point Address        */
    unsigned int    ih_dcrc;    /* Image Data CRC Checksum    */
    unsigned char    ih_os;        /* Operating System        */
    unsigned char    ih_arch;    /* CPU architecture        */
    unsigned char    ih_type;    /* Image Type            */
    unsigned char    ih_comp;    /* Compression Type        */
    unsigned char    ih_name[IH_NMLEN];    /* Image Name        */
} image_header_t;

int ReadMem(int address)
{
    int ret = 0;

    // Open memory device
    fdMem=open("/dev/mem",O_RDWR);

    // Check device opened
    if (fdMem < 0)
    {
        ret = -1;
    }
    else
    {
        // Map memory
        where=mmap(0,SIZE,PROT_READ|PROT_WRITE,MAP_SHARED,fdMem,address);
        if (where == (void *)0xffffffff)
        {
            close(fdMem);
            ret = -1;
        }
        else
        {
            base=(void *)where;
        }
    }

    return ret;
}

int GetFileFromMem(int addr, char* path)
{
    int             index;
    int             ret = 0;
    int             fdFile;
    image_header_t  header;

    // Read memory
    ret = ReadMem(addr);

    if (ret != -1)
    {
        memcpy((void*)&header, (void*)base, sizeof(image_header_t));

        // Check header magic number
        if (ntohl(header.ih_magic) != IH_MAGIC)
        {
            printf("ERROR: Magic [%d - %d]\n",header.ih_magic, IH_MAGIC);
            ret = -1;
        }
        else
        {
            printf("Image data size: %d\n", header.ih_size);

            // Open output file
            fdFile = open(path, O_RDWR | O_CREAT);
            index = header.ih_size;

            // Write output file
            write(fdFile, (void*)(base+sizeof(image_header_t)),
header.ih_size);

            // Close output file
            close(fdFile);
        }
    }

    return ret;
}
---------------------------------------------------------------- Cut
----------------------------------------------


More information about the eldk mailing list