Accessing flash directly from User Space
Jonathan.Haws at sdl.usu.edu
Wed Oct 28 09:35:33 EST 2009
> > Okay, I now have access to the flash memory, however when I write
> to it the writes do not take. I have tried calling msync() on the
> mapping to no avail. I have opened the fd with O_SYNC, but cannot
> get things to work right.
> > Here are the calls:
> > int fd = open("/dev/mem", O_SYNC | O_RDWR);
> > uint16_t * flash = (uint16_t *)mmap(NULL, NOR_FLASH_SIZE,
> > (PROT_READ | PROT_WRITE), MAP_PRIVATE, fd,
> > NOR_FLASH_BASE_ADRS);
> > When I do flash = 0x1234, and then check the value, they do not
> > flash = 0x1234;
> > msync(flash, NOR_FLASH_SIZE, MS_SYNC | MS_INVALIDATE);
> > printf("flash = %#04x\n", flash);
> > That prints flash = 0x7f45. I have verified that I am reading
> the correct values. I can display the flash contents in U-Boot and
> 7f45 is what is in the first 16 bits of flash.
> > Why can I not write to flash? What am I doing wrong?
> Flash does not work that way -- you must send it commands to erase a
> block, and then further commands to program new data.
I realize that. I have a driver written that does exactly that. However, I need to be able to write to certain registers to setup the erasure. The driver works perfectly in VxWorks, now I am porting it to Linux.
> It sounds like what you really want is the /dev/mtd or /dev/mtdblock
> interface, not raw access to the flash chip.
As mentioned in my initial post, I need to use my custom driver to maintain the interface to the application that uses the flash for data storage.
I had thought about using MTD, but decided against it because with previous benchmarking that we did with MTD and our custom driver, we found that our custom driver was about 10x faster.
More information about the Linuxppc-dev