Trying to read the badblock list / Using MTD devices

Visti Andresen talpa at galnet.dk
Sat Aug 4 13:45:52 CEST 2007


Hi I'm trying to create an application that reads Out Of Band information
from the flash chip.
The goal being to create an application that can display/backup the
badblock information from the flash.

I have had some problems reading correct CRC type values
(getting illegal values like -1)
Anso I didn't find any badblocks at all.

I then discovered that my problems ran deeper that fist expected.
If I open /dev/mtd0 and close it again the entire flash filesystem returns 
"Input/output error"
Took some time to discover this as I was scp'ing to /tmp and things inside the
disk cache can still be read/executed.

Below is a small test program that can cause the crash, I compile it using:
./build/tmp/cross/arm-linux/bin/gcc -Wall -o mtd_test mtd_test.c 

Any one know why I get the "Input/output error" after I have executed the 
program on the Neo?

Btw. the O_NONBLOCK option was something I picked up a some web page 
claiming that otherwise the result would not be as expected.
Removing it gives the same behaviour.

The output of the program is:
root at fic-gta01:~$ ./mtd_test 
Opened MTD device /dev/mtd0 OK
Closed MTD device /dev/mtd0 OK


=====

#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

char verbose_ = 1;

void test(char *mtdDevice);


int main()
{
  test("/dev/mtd0");
  return 0;
}

void test(char *mtdDevice)
{
  int device;
  
  device = open(mtdDevice, O_RDONLY|O_NONBLOCK);
  if (device < 0) {
		fprintf(stderr, "Unable to open MTD device %s: %s\n", mtdDevice, strerror(errno));
		return;
	}
  else {
    printf("Opened MTD device %s OK\n", mtdDevice);
  }
  

  if (0!=close(device)){
    printf("Failed to close MTD device %s: %s\n", mtdDevice, strerror(errno));
  }
  else {
    printf("Closed MTD device %s OK\n", mtdDevice);
  }
}



More information about the openmoko-devel mailing list