spi-flash移植问题

平台: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,重新编译,可以正常烧写了。困扰了我一个多月的问题,就因为一个头文件的引用搞定了,唉!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值