code_fodder
code_fodder

Reputation: 16321

How can I determine what MTD flash device is installed (e.g. get the ID or serial number)?

Using uClinux we have one of two flash devices installed, a 1GB flash or a 2GB flash.

The only way I can think of solving this is to somehow get the device ID - which is down the in the device driver code, for me that is in:

drivers/mtd/devices/m25p80.c

I have been using the command mtdinfo (which comes from mtdutils binaries, derived from mtdinfo.c/h). There is various information stored in here about the flash partitions including flash type 'nor' eraseblock size '65536', etc. But nothing that I can identify the chip with.

Its not very clear to me how I can get information from "driver-land" into "user-land". I am looking at trying to extend the mtdinfo command to print more information but there are many layers...

What is the best way to achieve this?

Upvotes: 3

Views: 7991

Answers (1)

code_fodder
code_fodder

Reputation: 16321

At the moment, I have found no easy way to do this without code changes. However I have found an easy code change (probably a bit of a hack) that allows me to get the information I need:

In the relevant file (in my case drivers/mtd/devices/m25p80.c) you can call one of the following:

dev_err("...");
dev_alert("...");
dev_warn("...");
dev_notice("...");
_dev_info("...");

Which are defined in include/Linux/device.h, so they are part of the Linux driver interface so you can use them from any driver.

I found that the dev_err() and devalert() both get printed out "on screen" during run time. However all of these device messages can be found in /var/log/messages. Since I added messages in the format: dev_notice("JEDEC id %06x\n", jedecid);, I could find the device ID with the following command:

cat /var/log/messages | grep -i jedec

Obviously using dev_err() ordev_alert() is not quite right! - but dev_notice() or even _dev_info() seem more appropriate.

Not yet marking this as the answer since it requires code changes - still hoping for a better solution if anyone knows of one...

Update

Although the above "solution" works, its a bit crappy - certainly will do the job and good enough for mucking around. But I decided that if I am making code changes I may as well do it properly. So I have now implemented changes to add an interface in sysfs such that you can get the flash id with the following command:

cat /sys/class/m25p80/m25p80_dev0/device_id

The main function calls required for this are (in this order):

alloc_chrdev_region(...)
class_create(...)
device_create(...)
sysfs_create_group(...)

This should give enough of a hint for anyone wanting to do the same, though I can expand on that answer if anyone wants it.

Upvotes: 1

Related Questions