平台:linux-2.6.35 imx53_loco
最近在弄mfgtool的时候发现一个很奇怪的问题。在自己编译的smd版本的内核中,spi-flash、nor-flash、nand-flash都需要支持。nor-flash和nand都能正常烧写,但是spi-flash却一直烧写不成功。示波器测量spi引脚一切正常,完全不知道哪里出错。后来追踪代码发现,mxc_m25p16.c的probe函数中得到的platform_data的值居然是错的,导致无法正确获取分区信息,而直接在mxc_m25p16中定义分区信息,虽然可以正确输出分区信息,但是仍然无法正常烧写。看来问题还是处在分区的platform_data上面。
在board文件中需要设置nor-flash和nand-flash的分区,struct flash_platform_data,但是这里有两个flash.h文件都有flash_platform_data结构体的定义,
一个是asm/mach/flash.h
struct flash_platform_data {
const char *map_name;
const char *name;
unsigned int width;
int (*init)(void);
void (*exit)(void);
void (*set_vpp)(int on);
void (*mmcontrol)(struct mtd_info *mtd, int sync_read);
struct mtd_partition *parts;
unsigned int nr_parts;
char *type;
};
另一个是linux/spi/flash.h
struct flash_platform_data {
char *name;
struct mtd_partition *parts;
unsigned int nr_parts;
char *type;
/* we'll likely add more ... use JEDEC IDs, etc */
};
而norflash和nand的分区定义如下:
static struct flash_platform_data mxc_nor_flash_pdata = {
.map_name = "cfi_probe",
.width = 4,
.parts = mxc_nor_partitions,
.nr_parts = ARRAY_SIZE(mxc_nor_partitions),
.init = nor_init,
};
static struct flash_platform_data mxc_nand_data = {
#ifdef CONFIG_MTD_PARTITIONS
.parts = nand_flash_partitions,
.nr_parts = ARRAY_SIZE(nand_flash_partitions),
#endif
.width = 1,
.init = nand_init,
};
使用的是asm/mach/flash.h
而spi-flash中的分区定义则是
static struct flash_platform_data mxc_spi_flash_data = {
.name = "m25p80",
.parts = mxc_dataflash_partitions,
.nr_parts = ARRAY_SIZE(mxc_dataflash_partitions),
.type = "m25p16",
};
这个定义显然也符合/linux/spi/flash.h中的定义,而mxc_m25p16中使用的flash_platform_data结构体居然就是/linux/spi/flash.h
都知道c语言的结构体取值是按照数据长度来的,显然在mxc_m25p16中在获取platform_data时使用的结构体长度和board文件中是不一样的,这就导致了分区信息获取失败,将mxc_m25p16中的头文件引用改成asm/mach/flash.h,重新编译,可以正常烧写了。困扰了我一个多月的问题,就因为一个头文件的引用搞定了,唉!