bootloader---23.u-boot-2010.06-rc1移植之3nand flash移植

原创 2016年08月30日 11:13:42
增加nand flash 特性

当可以正常启动serial可以显示之后,接下来移植nand flash
1. nand flash的初始化是在 arch/arm/lib/board.c中
  1. arch/arm/lib/board.
  2. start_armboot 
  3. {
  4.     #if defined(CONFIG_CMD_NAND)    
  5.     puts ("NAND: ");
  6.     nand_init();        /* go init the NAND */
  7.     #endif
  8. }
所以需要在include/configs/smdk2410.h中添加:  #define CONFIG_CMD_NAND   1

2.nand的初始化

  1. #ifndef CONFIG_SYS_NAND_BASE_LIST
  2. #define CONFIG_SYS_NAND_BASE_LIST { CONFIG_SYS_NAND_BASE }
  3. #endif
  4. static ulong base_address[CONFIG_SYS_MAX_NAND_DEVICE] = CONFIG_SYS_NAND_BASE_LIST;
  5. //base_address初始化为CONFIG_SYS_NAND_BASE
  6. 所以需要在include/configs/smdk2410.h中添加: #define CONFIG_SYS_NAND_BASE  0x4E000000
  7. void nand_init(void)
  8. {
  9.     int i;
  10.     unsigned int size = 0;
  11.     for (= 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++) 
  12.     { 
  13. //CONFIG_SYS_MAX_NAND_DEVICE=1所以只需要进行一次nand_init_chip
  14. //初始化nand的
  15.         nand_init_chip(&nand_info[i], &nand_chip[i], base_address[i]);
  16.         size += nand_info[i].size / 1024;
  17.         if (nand_curr_device == -1)
  18.             nand_curr_device = i;
  19.     }
  20.     printf("%u MiB\n", size / 1024);
  21. }



3. driver/mtd/nand/nand.c L42
  1. static void nand_init_chip(struct mtd_info *mtd, struct nand_chip *nand,
  2.              ulong base_addr)
  3. {
  4.     int maxchips = CONFIG_SYS_NAND_MAX_CHIPS;
  5.     int __attribute__((unused)) i = 0;

  6.     if (maxchips < 1)
  7.         maxchips = 1;
  8.     mtd->priv = nand; //以后要用到nand来控制底层寄存器,这儿先保存起nand来,这个非常重要

  9.     nand->IO_ADDR_R = nand->IO_ADDR_W = (void __iomem *)base_addr;//初始化读写指针为0x4E000000,以后真正读写时指针要改变
  10.     if (board_nand_init(nand) == 0) { //board_nand_init寄存器纸别的初始化
  11.         if (nand_scan(mtd, maxchips) == 0) { //
  12.             if (!mtd->name)
  13.                 mtd->name = (char *)default_nand_name;
  14.         } else
  15.             mtd->name = NULL;
  16.     } else {
  17.         mtd->name = NULL;
  18.         mtd->size = 0;
  19.     }

  20. }
4. drivers/mtd/nand/s3c2410_nand.c
  1. //
  2. int board_nand_init(struct nand_chip *nand)
  3. {
  4.     u_int32_t cfg;
  5.     u_int32_t cnt;
  6.     u_int8_t tacls, twrph0, twrph1;
  7.     struct s3c2440_nand *nand_reg = s3c2440_get_base_nand();

  8.     debugX(1, "board_nand_init()\n");

  9.     /* initialize hardware */
  10.     tacls = 0;
  11.     twrph0 = 4;
  12.     twrph1 = 2;

  13.     cfg |= S3C2440_NFCONF_TACLS(tacls);
  14.     cfg |= S3C2440_NFCONF_TWRPH0(twrph0);
  15.     cfg |= S3C2440_NFCONF_TWRPH1(twrph1);
  16.     writel(cfg, &nand_reg->NFCONF);

  17.     //NAND Flash control register
  18.     //bit6: Lock spare ECC
  19.     //bit4: Initialize ECC decoder/encoder
  20.     //bit1: enable chip_select
  21.     //bit0: nand_enable
  22.     cnt =(1<<6)| (1<<4)|(0<<1)|(1<<0);
  23.     writel(cnt, &nand_reg->NFCONT); //不仅需要配寄存器NFCONF,而且需要配寄存器NFCONT
      
      //以下初始化函数指针
  1.     /* initialize nand_chip data structure */
  2.     nand->IO_ADDR_R = nand->IO_ADDR_W = (void *)&nand_reg->NFDATA;

  3.     nand->select_chip = s3c2440_nand_select_chip;

  4.     /* hwcontrol always must be implemented */
  5.     nand->cmd_ctrl = s3c2440_hwcontrol;

  6.     nand->dev_ready = s3c2440_dev_ready;

  7.     nand->ecc.mode = NAND_ECC_SOFT; //进行软件的ECC校验

  8.     nand->options = 0; //BUS_WIDTH 8位

  9.     debugX(1, "end of nand_init\n");

  10.     return 0;
  11. }
这儿调用了s3c2440_get_base_nand,需要在include/asm/arch-s3c24x0/s3c2410.h中添加这个函数
  1. #define S3C24X0_NAND_BASE        0x4E000000
  2. static inline struct s3c2440_nand *s3c2440_get_base_nand(void)
  3. {
  4.     return (struct s3c2440_nand *)S3C24X0_NAND_BASE;
  5. }
同时S3C2440_NFCONF_TACLS等这几个宏跟手册上的位置不匹配,所以修改一下
  1. #define S3C2440_NFCONF_TACLS(x)  ((x)<<12)
  2. #define S3C2440_NFCONF_TWRPH0(x)  ((x)<<8)
  3. #define S3C2440_NFCONF_TWRPH1(x)  ((x)<<4)

  4. #define S3C2440_NFCONT_nCE      (1<<1)
  5. #define S3C2440_NFCONT_MODE_DISABLE     (0<<0)
  6. #define S3C2440_NFCONT_MODE_ENABLE     (1<<0)

  7. #define S3C2440_NFSTAT_READY      (1<<0)

  8. #define S3C2440_ADDR_NALE  0x0C
  9. #define S3C2440_ADDR_NCLE  0x08
5. driver/mtd/nand/nand_base.c L3061
  1. start_armboot-> nand_init->nand_init_chip
  2. int nand_scan(struct mtd_info *mtd, int maxchips)
  3. {
  4.     int ret;
  5.     ret = nand_scan_ident(mtd, maxchips);
  6.     if (!ret)
  7.         ret = nand_scan_tail(mtd);
  8.     return ret;
  9. }
6. driver/mtd/nand/nand_base.c    L2770
  1. start_armboot-> nand_init->nand_init_chip->nand_scan
  2. int nand_scan_ident(struct mtd_info *mtd, int maxchips)
  3. {
  4.     int i, busw, nand_maf_id;
  5.     struct nand_chip *chip = mtd->priv; //函数nand_init_chip中保存的nand_chip结构体
  6.     struct nand_flash_dev *type;

  7.     /* Get buswidth to select the correct functions */
  8.     busw = chip->options & NAND_BUSWIDTH_16;
  9.     /* Set the default functions */
  10.     nand_set_defaults(chip, busw); //对nand_chip结构体进一步初始化

  11.     /* Read the flash type */
  12.     type = nand_get_flash_type(mtd, chip, busw, &nand_maf_id);

  13.     if (IS_ERR(type)) {
  14. #ifndef CONFIG_SYS_NAND_QUIET_TEST
  15.         printk(KERN_WARNING "No NAND device found!!!\n");
  16. #endif
  17.         chip->select_chip(mtd, -1);
  18.         return PTR_ERR(type);
  19.     }

  20.     /* Check for a chip array */
  21.     for (= 1; i < maxchips; i++) {
  22.         chip->select_chip(mtd, i);
  23.         /* See comment in nand_get_flash_type for reset */
  24.         chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
  25.         /* Send the command for reading device ID */
  26.         chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
  27.         /* Read manufacturer and device IDs */
  28.         if (nand_maf_id != chip->read_byte(mtd) ||
  29.          type->id != chip->read_byte(mtd))
  30.             break;
  31.     }
  32. #ifdef DEBUG
  33.     if (> 1)
  34.         printk(KERN_INFO "%d NAND chips detected\n", i);
  35. #endif

  36.     /* Store the number of chips and calc total size for mtd */
  37.     chip->numchips = i;
  38.     mtd->size = i * chip->chipsize;

  39.     return 0;
  40. }
6. driver/mtd/nand/nand_base.c    L2555
  1. start_armboot-> nand_init->nand_init_chip->nand_scan-->nand_scan_ident
  2. //设置默认的函数指针
  3. static void nand_set_defaults(struct nand_chip *chip, int busw)
  4. {
  5.     /* check for proper chip_delay setup, set 20us if not */
  6.     if (!chip->chip_delay)
  7.         chip->chip_delay = 20; //设置延时=20

  8.     /* check, if a user supplied command function given */
  9.     if (chip->cmdfunc == NULL)
  10.         chip->cmdfunc = nand_command; //cmd_func=nand_command,以后就靠它发命令了

  11.     /* check, if a user supplied wait function given */
  12.     if (chip->waitfunc == NULL)
  13.         chip->waitfunc = nand_wait; //nand_wait

  14.     if (!chip->select_chip)
  15.         chip->select_chip = nand_select_chip; //不进入
  16.     if (!chip->read_byte)
  17.         chip->read_byte = busw ? nand_read_byte16 : nand_read_byte; //read_byte=nand_read_byte
  18.     if (!chip->read_word)
  19.         chip->read_word = nand_read_word; //read_word=nand_read_word
  20.     if (!chip->block_bad)
  21.         chip->block_bad = nand_block_bad;
  22.     if (!chip->block_markbad)
  23.         chip->block_markbad = nand_default_block_markbad;
  24.     if (!chip->write_buf)
  25.         chip->write_buf = busw ? nand_write_buf16 : nand_write_buf;
  26.     if (!chip->read_buf)
  27.         chip->read_buf = busw ? nand_read_buf16 : nand_read_buf;
  28.     if (!chip->verify_buf)
  29.         chip->verify_buf = busw ? nand_verify_buf16 : nand_verify_buf;
  30.     if (!chip->scan_bbt)
  31.         chip->scan_bbt = nand_default_bbt;

  32.     if (!chip->controller) {
  33.         chip->controller = &chip->hwcontrol;

  34.         /* XXX U-BOOT XXX */
  35. #if 0
  36.         spin_lock_init(&chip->controller->lock);
  37.         init_waitqueue_head(&chip->controller->wq);
  38. #endif
  39.     }

  40. }
7.  driver/mtd/nand/nand_base.c    L2603
  1. /*
  2.  * Get the flash and manufacturer id and lookup if the type is supported
  3.  */
  4. static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,                          struct nand_chip *chipint busw, int *maf_id)
  5. {
  6.     struct nand_flash_dev *type = NULL;
  7.     int i, dev_id, maf_idx;
  8.     int tmp_id, tmp_manf;
      //以下是读取设备ID的过程:参见K9F2G08U0B的datasheet
      //1. 发送命令0x90   2.发送地址0x00  3.读取第一个字节为manufacturer 第二个字节为DEV_ID  
  1.     /* Select the device: 设置NFCONT D1=0 */
  2.     chip->select_chip(mtd, 0);

  3.     /*
  4.      * Reset the chip, required by some chips (e.g. Micron MT29FxGxxxxx)
  5.      * after power-up
  6.      */
  7.     //调用nand_command-->s3c2440_hwcontrol向nandflash的NFCMMD寄存器发送0xFF(RESET指令)
  8.     chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);

  9.     /* Send the command for reading device ID */
  10.     //1. 发送命令0x90   2.发送地址0x00    
  11.     chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);

  12.     /* Read manufacturer and device IDs */
  13.     //返回的第一个字节为0xEC 第二个字节为0xDA
  14.     *maf_id = chip->read_byte(mtd);
  15.     dev_id = chip->read_byte(mtd);

  16.     /* Try again to make sure, as some systems the bus-hold or other
  17.      * interface concerns can cause random data which looks like a
  18.      * possibly credible NAND flash to appear. If the two results do
  19.      * not match, ignore the device completely.
  20.      */
  21.      //重新读取,验证第一次读取的结果是正确的
  22.     chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);

  23.     /* Read manufacturer and device IDs */

  24.     tmp_manf = chip->read_byte(mtd);
  25.     tmp_id = chip->read_byte(mtd);

  26.     if (tmp_manf != *maf_id || tmp_id != dev_id) {
  27.         printk(KERN_INFO "%s: second ID read did not match "
  28.          "%02x,%02x against %02x,%02x\n", __func__,
  29.          *maf_id, dev_id, tmp_manf, tmp_id);
  30.         return ERR_PTR(-ENODEV);
  31.     }
  32.     //从nand_flash_ids表中查找 id=0xDA的项
  33.     //   name                      id   pagesize chipsize erasesize options
  34.     //  {"NAND 256MiB 3,3V 8-bit", 0xDA, 0,        256,     0,       LP_OPTIONS},
  35.     /* Lookup the flash id */
  36.     for (= 0; nand_flash_ids[i].name != NULL; i++) {
  37.         if (dev_id == nand_flash_ids[i].id) {
  38.             type = &nand_flash_ids[i];
  39.             break;
  40.         }
  41.     }

  42.     if (!type)
  43.         return ERR_PTR(-ENODEV);

  44.     if (!mtd->name)
  45.         mtd->name = type->name;

  46.     //设定chipsize=256M=256<<20
  47.     chip->chipsize = (uint64_t)type->chipsize << 20;

  48.     /* Newer devices have all the information in additional id bytes */
  49.     if (!type->pagesize) {
  50. //根据K9F2G08U0B的datasheet P29
  51.         int extid;
  52.         /* The 3rd id byte holds MLC / multichip data */
  53.         chip->cellinfo = chip->read_byte(mtd); //cellinfo=0x10
  54.         /* The 4th id byte is the important one */
  55.         extid = chip->read_byte(mtd); //extid=0x95
  56.         /* Calc pagesize ,extid的D0-D1是pagesize*/
  57.         mtd->writesize = 1024 << (extid & 0x3);
  58.         extid >>= 2;
  59.         /* Calc oobsize  extid的D2位的单位是byte/512byte,所以求oob,需要乘pagesize/512 */
  60.         mtd->oobsize = (<< (extid & 0x01)) * (mtd->writesize >> 9);
  61.         extid >>= 2;
  62.         /* Calc blocksize. Blocksize is multiples of 64KiB, 求block_size, exit的D4-D5位是1的话对应128K的block_size*/
  63.         mtd->erasesize = (64 * 1024) << (extid & 0x03);
  64.         extid >>= 2;
  65.         /* Get buswidth information: extid的D6位是buswidth 0--8位的buswidth */
  66.         busw = (extid & 0x01) ? NAND_BUSWIDTH_16 : 0;

  67.     } else {
  68.         /*
  69.          * Old devices have chip data hardcoded in the device id table
  70.          */
  71.         mtd->erasesize = type->erasesize;
  72.         mtd->writesize = type->pagesize;
  73.         mtd->oobsize = mtd->writesize / 32;
  74.         busw = type->options & NAND_BUSWIDTH_16;
  75.     }

  76.     /* Try to identify manufacturer */
  77.     for (maf_idx = 0; nand_manuf_ids[maf_idx].id != 0x0; maf_idx++) {
  78.         if (nand_manuf_ids[maf_idx].id == *maf_id)
  79.             break;
  80.     }

  81.     /*
  82.      * Check, if buswidth is correct. Hardware drivers should set
  83.      * chip correct !
  84.      */
  85.     if (busw != (chip->options & NAND_BUSWIDTH_16)) {
  86.         printk(KERN_INFO "NAND device: Manufacturer ID:"
  87.          " 0x%02x, Chip ID: 0x%02x (%s %s)\n", *maf_id,
  88.          dev_id, nand_manuf_ids[maf_idx].name, mtd->name);
  89.         printk(KERN_WARNING "NAND bus width %d instead %d bit\n",
  90.          (chip->options & NAND_BUSWIDTH_16) ? 16 : 8,
  91.          busw ? 16 : 8);
  92.         return ERR_PTR(-EINVAL);
  93.     }

  94.     /* Calculate the address shift from the page size */
  95.     chip->page_shift = ffs(mtd->writesize) - 1;
  96.     /* Convert chipsize to number of pages per chip -1. */
  97.     chip->pagemask = (chip->chipsize >> chip->page_shift) - 1;

  98.     chip->bbt_erase_shift = chip->phys_erase_shift =
  99.         ffs(mtd->erasesize) - 1;
  100.     if (chip->chipsize & 0xffffffff)
  101.         chip->chip_shift = ffs((unsigned)chip->chipsize) - 1;
  102.     else
  103.         chip->chip_shift = ffs((unsigned)(chip->chipsize >> 32)) + 31;

  104.     /* Set the bad block position */
  105.     chip->badblockpos = mtd->writesize > 512 ?
  106.         NAND_LARGE_BADBLOCK_POS : NAND_SMALL_BADBLOCK_POS;

  107.     /* Get chip options, preserve non chip based options */
  108.     chip->options &= ~NAND_CHIPOPTIONS_MSK;
  109.     chip->options |= type->options & NAND_CHIPOPTIONS_MSK;

  110.     /*
  111.      * Set chip as a default. Board drivers can override it, if necessary
  112.      */
  113.     chip->options |= NAND_NO_AUTOINCR;

  114.     /* Check if chip is a not a samsung device. Do not clear the
  115.      * options for chips which are not having an extended id.
  116.      */
  117.     if (*maf_id != NAND_MFR_SAMSUNG && !type->pagesize)
  118.         chip->options &= ~NAND_SAMSUNG_LP_OPTIONS;

  119.     /* Check for AND chips with 4 page planes */
  120.     if (chip->options & NAND_4PAGE_ARRAY)
  121.         chip->erase_cmd = multi_erase_cmd;
  122.     else
  123.         chip->erase_cmd = single_erase_cmd;

  124.     /* Do not replace user supplied command function ! */
  125.     if (mtd->writesize > 512 && chip->cmdfunc == nand_command)
  126.         chip->cmdfunc = nand_command_lp;

  127.     MTDDEBUG (MTD_DEBUG_LEVEL0, "NAND device: Manufacturer ID:"
  128.      " 0x%02x, Chip ID: 0x%02x (%s %s)\n", *maf_id, dev_id,
  129.      nand_manuf_ids[maf_idx].name, type->name);

  130.     return type;
  131. }



2. 在include/configs/smdk2410.h中添加
#define CONFIG_CMD_NAND    1
#define CONFIG_SYS_MAX_NAND_DEVICE   1
#define CONFIG_SYS_NAND_BASE     0x4E000000

3.start_armboot--> nand_init 在driver/mtd/nand/nand.c中

nand_init-->nand_init_chip-->board_nand_init

4. board_nand_init函数在driver/mtd/nand/s3c2410_nand.c中
不过这需要在 include/configs/smdk2410.h中添加
#define CONFIG_NAND_S3C2410 1
5.删除多余的文件
root@ubuntu:~/u-boot-2010.06-rc1/drivers/mtd/nand# rm atmel_nand.c bfin_nand.c davinci_nand.c fsl_elbc_nand.c fsl_upm.c kb9202_nand.c kirkwood_nand.c kmeter1_nand.c mpc5121_nfc.c mxc_nand.c ndfc.c nomadik.c  s3c64xx.c spr_nand.c omap_gpmc.c nand_plat.c 
同时在driver/mtd/nand/Makefile中删除多余的东东,不删也没有关系。
root@ubuntu:~/uboot/u-boot-2010.06-rc1# vi drivers/mtd/nand/Makefile 
6. 这里候就可以编译通过了,不过打印的是
DRAM:  64 MiB
Flash: 512 KiB
NAND:  No NAND device found!!!
0 MiB
*** Warning - bad CRC, using default environment

7. 修改一下driver/mtd/nand/s3c2410_nand.c中的board_nand_init函数
a.将driver/mtd/nand/s3c2410_nand.c中所有的2410替换为2440
8. 在include/asm/arch-s3c24x0/s3c2410.h中添加
#define S3C24X0_NAND_BASE 0x4E000000

static inline struct s3c2440_nand *s3c2440_get_base_nand(void)
{
return (struct s3c2440_nand *)S3C24X0_NAND_BASE;
}
9. 在driver/mtd/nand/s3c2410_nand.c中
  1. int board_nand_init(struct nand_chip *nand)
  2. {
  3.     u_int32_t cfg;
  4.     u_int32_t cnt;
  5.     u_int8_t tacls, twrph0, twrph1;
  6.     struct s3c2440_nand *nand_reg = s3c2440_get_base_nand();

  7.     debugX(1, "board_nand_init()\n");

  8.     //writel(readl(&clk_power->CLKCON) | (<< 4), &clk_power->CLKCON);

  9.     /* initialize hardware */
  10.     tacls = 0;
  11.     twrph0 = 4;
  12.     twrph1 = 2;

  13.     cfg |= S3C2440_NFCONF_TACLS(tacls);
  14.     cfg |= S3C2440_NFCONF_TWRPH0(twrph0);
  15.     cfg |= S3C2440_NFCONF_TWRPH1(twrph1);
  16.     writel(cfg, &nand_reg->NFCONF);

  17.     //NAND Flash control register
  18.     //bit6: Lock spare ECC
  19.     //bit4: Initialize ECC decoder/encoder
  20.     //bit1: enable chip_select
  21.     //bit0: nand_enable
  22.     cnt =(1<<6)| (1<<4)|(0<<1)|(1<<0);
  23.     writel(cnt, &nand_reg->NFCONT);

  24.     /* initialize nand_chip data structure */
  25.     nand->IO_ADDR_R = nand->IO_ADDR_W = (void *)&nand_reg->NFDATA;

  26.     nand->select_chip = s3c2440_nand_select_chip;

  27.     /* hwcontrol always must be implemented */
  28.     nand->cmd_ctrl = s3c2440_hwcontrol;

  29.     nand->dev_ready = s3c2440_dev_ready;

  30.     nand->ecc.mode = NAND_ECC_SOFT;

  31.     nand->options = 0;

  32.     debugX(1, "end of nand_init\n");

  33.     return 0;
  34. }
版权声明:本文为博主原创文章,转载请注明出处。

相关文章推荐

U-boot移植 (v2012.04.1 S3C2440平台) (二) Nand flash 启动支持

5  NAND Flash 启动支持 对于老版的u-boot, 由于Nor flash支持读取代码执行,所以u-boot 默认是烧写进Nor flash启动的。想要在Nand flash中启动u...
  • novawl
  • novawl
  • 2012-08-16 22:22
  • 2972

u-boot移植总结(三)(转)S3C2440对Nand Flash操作和电路原理(基于K9F2G08U0A)

S3C2440对Nand Flash操作和电路原理(基于K9F2G08U0A) S3C2440内部集成了一个Nand flash控制器。S3C2440的Nand flash控制器包含了如下的特性...

u-boot在s3c2410开发板上移植(NAND Flash Boot)过程 2007-08-21 11:56:25

这篇文章对于我的U-Boot移植起了重要作用,阐述了U-Boot从NAND Flash启动需要做的修改,但是其做法并不是完全正确(只是个人意见)。在这里谢谢Bekars涡轮增压!! 这篇文章转载自...

U-boot 201103rc1在s3c2440上的移植

移植环境 主机:Oracl VM VirtualBox + RedHat9.0开发板:FL2440编译器:arm-linux-gcc-4.3.2u-boot:201103rc1 步骤 u-b...

u-boot-2010.06在unsp2440上的移植1

u-boot-2010.06在unsp2440上的移植1 一、 步骤说明: 进行u-boot的移植,我们分成以下几步完成: NorFlash启动 可以读写NAND FLASH...

06-S3C2440学习之移植2012u-boot到S3C2440(移植过程四)支持Nand Flash+支持DM9000网卡

移植 uboot到S3C2440(移植过程一)新建单板+修改时钟+SDRAM+UART过程中,为了避免当时编译出现的错误,我们屏蔽了 include/configs/smdk2440.h: //#de...

移植u-boot-2011.03到S3C2440(utu2440)的方法与步骤###8. u-boot引导启动nand flash中内核和根文件系统cramfs和用户文件系统yaffs2支持

作者:reille本博客网址:http://blog.csdn.net/reille/开发环境:主机:Window XP SP2;linux:VMware7.01+ubuntu9.10;目标板:扬创u...
  • reille
  • reille
  • 2011-07-09 21:59
  • 13352

u-boot-2010.06移植到TQ2440

  • 2010-06-09 09:18
  • 3.05MB
  • 下载

u-boot-2009.08在mini2440上的移植(三)---增加nand flash功能

u-boot-2009.08在mini2440上的移植(三)---增加nand flash功能   转载补充,谢谢分享:http://blog.163.com/liuqiang_mail@126/b...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)