我的板卡是freescale的。目前遇到的问题是:uboot在nandflash的驱动中报错。错误为:fsl_elbc_nand: address did not match any chip selects
我发现错误代码在uboot的drivers/mtd/nand/fsl_elbc_nand.c中。代码为board_nand_init函数,函数如下:
int board_nand_init(struct nand_chip *nand)
{
struct fsl_elbc_mtd *priv;
uint32_t br = 0, or = 0;
if (!elbc_ctrl) {
printf("fsl_elbc_ctrl_init\n");
fsl_elbc_ctrl_init();
if (!elbc_ctrl)
return -1;
}
priv = kzalloc(sizeof(*priv), GFP_KERNEL);
if (!priv)
return -ENOMEM;
priv->ctrl = elbc_ctrl;
priv->vbase = nand->IO_ADDR_R;
/* Find which chip select it is connected to. It'd be nice
* if we could pass more than one datum to the NAND driver...
*/
for (priv->bank = 0; priv->bank < MAX_BANKS; priv->bank++) {
phys_addr_t base_addr = virt_to_phys(nand->IO_ADDR_R);
br = in_be32(&elbc_ctrl->regs->bank[priv->bank].br);
or = in_be32(&elbc_ctrl->regs->bank[priv->bank].or);
uint32_t tmpFcm = (br & BR_V) && (br & BR_MSEL);
uint32_t tmpAddr = br & or & BR_BA;
printf("in the for base_addr = %d br = %u or = %u tmpFcm = %u tmpAddr = %u\n",BR_PHYS_ADDR(base_addr),
br,or,tmpFcm,tmpAddr);
if ((br & BR_V) && (br & BR_MSEL) == BR_MS_FCM &&
(br & or & BR_BA) == BR_PHYS_ADDR(base_addr))
break;
}
if (priv->bank >= MAX_BANKS) {
printf("fsl_elbc_nand: address did not match any "
"chip selects\n");
printf("priv->bank=%d MAXBANKS = %d\n",priv->bank,int(MAX_BANKS));
return -ENODEV;
}
。。。。。。。。。。。。。。。
未贴完。打印出来的结果是:
in the for priv->bank = 0
in the for base_addr = ffa00000 br = ef001001 or = ff000ff7 tmpFcm = 0 tmpAddr = ef000000
in the for priv->bank = 1
in the for base_addr = ffa00000 br = 0 or = 0 tmpFcm = 0 tmpAddr = 0
in the for priv->bank = 2
in the for base_addr = ffa00000 br = 0 or = 0 tmpFcm = 0 tmpAddr = 0
in the for priv->bank = 3
in the for base_addr = ffa00000 br = c0001001 or = fc000c34 tmpFcm = 0 tmpAddr = c0000000
in the for priv->bank = 4
in the for base_addr = ffa00000 br = d0001001 or = fc000c30 tmpFcm = 0 tmpAddr = d0000000
in the for priv->bank = 5
in the for base_addr = ffa00000 br = 0 or = 0 tmpFcm = 0 tmpAddr = 0
in the for priv->bank = 6
in the for base_addr = ffa00000 br = 0 or = 0 tmpFcm = 0 tmpAddr = 0