Hi there,

We are working on an embedded platform which has 256MB DDR and 64MB strataflash(TE28F64J3C-120) and  our databus is 32 bits. 

we have used the following MAP driver for our strata flash as the start of our work:

------------------------------------------ 

#include <linux/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <asm/io.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/map.h>
#include <linux/mtd/partitions.h>
#include <linux/delay.h>

struct map_info sdp_map =
{
    .name=       "SDP Flash",
    .size=       8 * 1024 * 1024, /* Overwritten by cfi_probe */
    .bankwidth=   2,
    .phys=NO_XIP   

    /*
        read:      sdp_read,
    write:     sdp_write,
    copy_from:  sdp_copy_from,
    */     
};

static struct mtd_partition sdp_flash_partition[] =
{
    /*
     * Flash map in the
     *    KERNEL AND BOOTLOADER AND ROOT : 20000000-24000000
    */
    {
    name:        "data",
        size:         0x800000,
        offset:         0x00000000
    },
};
static struct mtd_partition *sdp_partitions;
#define NB_OF(x)    (sizeof(x)/sizeof(x[0]))
static struct mtd_info    *mymtds;
static int __init sdp_init_mtd (void)
{
   
    int                     nb_parts;
    char                    *part_type = "static";
    int                     i;
    unsigned int            flash_addresses = 0x20000000;
 
    /* Determine flash partitioning */
    sdp_partitions = sdp_flash_partition;
    nb_parts = NB_OF(sdp_flash_partition);
    sdp_map.virt = ioremap (flash_addresses, sdp_map.size);
    mymtds = do_map_probe("cfi_probe", &sdp_map);
        if (!mymtds){
                iounmap ((void *) sdp_map.map_priv_1);
                return -ENXIO;
            }

        printk (KERN_NOTICE "SDP flash device: %08xMB at 0x%08x\n",
                (mymtds->size), flash_addresses);

        sdp_map.size = mymtds->size;
        mymtds->owner = THIS_MODULE;
        printk (KERN_NOTICE "Using %s partition definition\n", part_type);
        add_mtd_partitions (mymtds, sdp_partitions, nb_parts);
       return 0;
}

static void __exit sdp_cleanup_mtd(void)
{
    printk("sdp_cleanup_mtd\n");
    return;
}

module_init(sdp_init_mtd);
module_exit(sdp_cleanup_mtd);

-----------------------------------------------

But unfortunately we were not able to map upper than 8MB of flash , and we found that the problem was related the range of Virtual address mapping in kernel.  

So,

    1- What we can do now if we want to map all of flash?

    2- Does it relate to bankwidth parameter in map_info structure? ( if we set that to 1 ,4, and the system will hangup..So what is that parameter?is it related to flash itself or data bandwidth or number of flashes on the board?)

 

Any help will be greatly appretiated. 

 


_______________________________________________
Linuxppc-embedded mailing list
Linuxppc-embedded@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-embedded

Reply via email to