天嵌 ARM开发社区

 找回密码
 注册
查看: 3110|回复: 0

AM335x(TQ335x)学习笔记——UBOOT分析(nand部分)

[复制链接]
freewing 发表于 2015-9-22 11:46:51 | 显示全部楼层 |阅读模式
  1. board_init_r() arch\arm\lib\board.c
复制代码
  base_addr是nand控制器寄存器的起始地址,定义如下
  1. #define NAND_BASE (0x04000000) include\configs\tq3358.h
复制代码

  设置nand_chip结构体,提供底层造成函数。
  1. nand->IO_ADDR_R = (void __iomem *)&gpmc_cfg->cs[cs].nand_dat;
复制代码

  gpmc_cdg->cs[cs]应该是nand控制器寄存器地址,nand_dat应该是数据寄存器,
  nand_cmd是命令寄存器。
  1. nand->cmd_ctrl = ti81xx_nand_hwcontrol;
  2.   ti81xx_nand_hwcontrol() driver\mn\nand\ti81xx_nand.c
复制代码

  实现nandflash 发地址,发命令,片选操作
  1. nand->dev_ready = ti81xx_spl_dev_ready; driver\mn\nand\ti81xx_nand.c
复制代码

  实现nandflash忙状态判断
  1. nand_scan () driver\mn\nand\nand_base.c
复制代码

  nand_set_defaults() 为nand_chips提供默认的底层函数
  if (!chip->select_chip) 提供默认的片选函数
  chip->select_chip = nand_select_chip;
  if (chip->cmdfunc == NULL) 提供默认的发命令函数
  chip->cmdfunc = nand_command;
  nand_command有4个参数,mtd_info,命令,列地址,行地址
  因此他可以发命令和地址,他的内部实际是调用nand->cmd_ctrl
  即ti81xx_nand_hwcontrol()
  nand_get_flash_type() 获取nandflash的信息。
  chip->select_chip(mtd, 0); 选中芯片
  chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1); 发复位命令
  chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1); 读ID命令
  1. *maf_id = chip->read_byte(mtd); 读厂家ID
  2. *dev_id = chip->read_byte(mtd); 读芯片ID
  3. for (; type->name != NULL; type++)
  4. if (*dev_id == type->id)
  5. break;
复制代码

  去nand_flash_ids(driver/mtd/nand/nand_ids.c)
  这个数组里找到对应的芯片信息。
  1. chip->chipsize = (uint64_t)type->chipsize << 20;
复制代码

  将芯片容量左移20位后放到chip->chipsize中。
  1. add_mtd_device()
复制代码

  将构造好的mtd_info结构体添加到链表中。
  实际真正需要自己实现的函数是
  1. select_chip
  2. dev_ready
  3. cmd_ctrl
复制代码

  读写之前给IO_ADDR_R何IO_ADDR_W赋值
  1. gpmc_cfg->cs[cs].nand_cmd
  2. gpmc_cfg->cs[cs].nand_adr
  3. gpmc_cfg->cs[cs].nand_dat
复制代码

  分区部分
  1. mtdparts_init common/cmd_mtdparts.c
  2. parse_mtdids
  3. mtd_device_validate
  4. get_mtd_info
  5. get_mtd_device_nm drivers/mtd/mtdcore.c
复制代码
  1. static int parse_mtdids(const char *const ids)
复制代码

  构造mtdids结构体,并添加到链表中,其中包含flash的大小
  1. int mtd_device_validate(u8 type, u8 num, u32 *size)
  2. if (get_mtd_info(type, num, &mtd))
  3. return 1;
  4. *size = mtd->size;
复制代码

  得到mtd_info和flash的大小,size是u32类型的,因此将无法存储4G的nand尺寸,4G是2的32次方。
  1. static int get_mtd_info(u8 type, u8 num, struct mtd_info **mtd)
  2. *mtd = get_mtd_device_nm(mtd_dev);
复制代码

  得到mtd_info
  1. struct mtd_info *get_mtd_device_nm(const char *name)
  2. for (i = 0; i < MAX_MTD_DEVICES; i++) {
  3. if (mtd_table[i] && !strcmp(name, mtd_table[i]->name)) {
  4. mtd = mtd_table[i];
  5. break;
  6. }
  7. }
复制代码

  到mtd_info数组中查找mtd_info


  主要改了uboot的几个地方来支持4G nand
  1. nand_flash_ids结构体数组增加4g nand的id号。
  2. 修改页尺寸,块尺寸,OOB尺寸
  3. 修改分区大小,分区大小必须是块尺寸的倍数
  4. 将涉及到存储nand大小的变量都修改为unsigned long long,因为4G是2的32次方,unsigned int放不下。



  TQ335X+7寸屏套装:http://www.embedsky.com/index.php?s=/Product/show/id/49.html



您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-25 04:58 , Processed in 1.046875 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表