This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于3359的u-boot移植问题

Other Parts Discussed in Thread: AM3359

调试AM3359 NANDFLASH时,在drivers/mtd/nand/nand_base.c文件中,
函数static const struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,
        struct nand_chip *chip,
        int busw,
        int *maf_id, int *dev_id,
        const struct nand_flash_dev *type)
{
 int ret, maf_idx;
 int tmp_id, tmp_manf;
 /* Select the device */
 chip->select_chip(mtd, 0);
 /*
  * Reset the chip, required by some chips (e.g. Micron MT29FxGxxxxx)
  * after power-up
  */
 chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
 /* Send the command for reading device ID */
 chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
 /* Read manufacturer and device IDs */
 *maf_id = chip->read_byte(mtd);
 *dev_id = chip->read_byte(mtd);
 /* Try again to make sure, as some systems the bus-hold or other
  * interface concerns can cause random data which looks like a
  * possibly credible NAND flash to appear. If the two results do
  * not match, ignore the device completely.
  */
 
 chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
 /* Read manufacturer and device IDs */
 tmp_manf = chip->read_byte(mtd);
 tmp_id = chip->read_byte(mtd);
 if (tmp_manf != *maf_id || tmp_id != *dev_id) {
  printk(KERN_INFO "%s: second ID read did not match "
         "%02x,%02x against %02x,%02x\n", __func__,
         *maf_id, *dev_id, tmp_manf, tmp_id);
  return ERR_PTR(-ENODEV);
 }
 if (!type)
  type = nand_flash_ids;
 for (; type->name != NULL; type++)
  if (*dev_id == type->id)
   break;
 if (!type->name) {
  /* supress warning if there is no nand */
  if (*maf_id != 0x00 && *maf_id != 0xff &&
      *dev_id  != 0x00 && *dev_id  != 0xff)
   printk(KERN_INFO "%s: unknown NAND device: "
    "Manufacturer ID: 0x%02x, Chip ID: 0x%02x\n",
    __func__, *maf_id, *dev_id);
  return ERR_PTR(-ENODEV);
 }
 if (!mtd->name)
  mtd->name = type->name;
 chip->chipsize = (uint64_t)type->chipsize << 20;
 chip->onfi_version = 0;
 ret = nand_flash_detect_onfi(mtd, chip, &busw);
 if (!ret)
  nand_flash_detect_non_onfi(mtd, chip, type, &busw);
 /* Get chip options, preserve non chip based options */
 chip->options &= ~NAND_CHIPOPTIONS_MSK;
 chip->options |= type->options & NAND_CHIPOPTIONS_MSK;
 /*
  * Set chip as a default. Board drivers can override it, if necessary
  */
 chip->options |= NAND_NO_AUTOINCR;
 /* Try to identify manufacturer */
 for (maf_idx = 0; nand_manuf_ids[maf_idx].id != 0x0; maf_idx++) {
  if (nand_manuf_ids[maf_idx].id == *maf_id)
   break;
 }
 /*
  * Check, if buswidth is correct. Hardware drivers should set
  * chip correct !
  */
 if (busw != (chip->options & NAND_BUSWIDTH_16)) {
  printk(KERN_INFO "NAND device: Manufacturer ID:"
         " 0x%02x, Chip ID: 0x%02x (%s %s)\n", *maf_id,
         *dev_id, nand_manuf_ids[maf_idx].name, mtd->name);
  printk(KERN_WARNING "NAND bus width %d instead %d bit\n",
         (chip->options & NAND_BUSWIDTH_16) ? 16 : 8,
         busw ? 16 : 8);
  return ERR_PTR(-EINVAL);
 }
 /* Calculate the address shift from the page size */
 chip->page_shift = ffs(mtd->writesize) - 1;
 /* Convert chipsize to number of pages per chip -1. */
 chip->pagemask = (chip->chipsize >> chip->page_shift) - 1;
 chip->bbt_erase_shift = chip->phys_erase_shift =
  ffs(mtd->erasesize) - 1;
 if (chip->chipsize & 0xffffffff)
  chip->chip_shift = ffs((unsigned)chip->chipsize) - 1;
 else
  chip->chip_shift = ffs((unsigned)(chip->chipsize >> 32)) + 31;
 /* Set the bad block position */
 chip->badblockpos = mtd->writesize > 512 ?
  NAND_LARGE_BADBLOCK_POS : NAND_SMALL_BADBLOCK_POS;
 /* Check if chip is a not a samsung device. Do not clear the
  * options for chips which are not having an extended id.
  */
 if (*maf_id != NAND_MFR_SAMSUNG && !type->pagesize)
  chip->options &= ~NAND_SAMSUNG_LP_OPTIONS;
 /* Check for AND chips with 4 page planes */
 if (chip->options & NAND_4PAGE_ARRAY)
  chip->erase_cmd = multi_erase_cmd;
 else
  chip->erase_cmd = single_erase_cmd;
 /* Do not replace user supplied command function ! */
 if (mtd->writesize > 512 && chip->cmdfunc == nand_command)
  chip->cmdfunc = nand_command_lp;
 MTDDEBUG (MTD_DEBUG_LEVEL0, "NAND device: Manufacturer ID:"
    " 0x%02x, Chip ID: 0x%02x (%s %s)\n", *maf_id, *dev_id,
    nand_manuf_ids[maf_idx].name, type->name);
 return type;
}
里,程序停在for (; type->name != NULL; type++)
  if (*dev_id == type->id)
   break;
中,后printk关于type的值,发现并不是所传参数NULLtype值已发生改变,因此程序停在上面的for循环中,请问出现此问题的原因是什么?