www.05112.com/Pwww.05112.com 6:genprobe_new_chip()枚举各种不同的芯片位宽和背靠背数量,结合配置设定依次调用步骤3的cfi_probe_chip(),注意cfi->device_type=bankwidth/nr_chips,bankwidth是总线位宽,device_type是芯片位宽。这里我们只需要注意有限复杂情况即可,所谓有限复杂指的是编译时确定的复杂连接。这样,cfi_probe_chip()只有第1次调用才成功,如果考虑32位宽的FLASH插在16bit总线上的情况,那第2次调用成功。
www.05112.comPwww.05112.comwww.05112.com/Pwww.05112.com
www.05112.comPwww.05112.com 7:cfi_probe_chip(),由于步骤6的原因,函数就在cfi_chip_setup()直接返回,后面的代码就不用考虑了。www.05112.com/Pwww.05112.com
www.05112.comPwww.05112.com 8:cfi_chip_setup()读取CFI信息,可以留意下Linux是怎么实现要点4的。www.05112.com/Pwww.05112.com
www.05112.comPwww.05112.com 9:回到步骤4的check_cmd_set()阶段,进入cfi_cmdset_0001()函数,先调用read_pri_intelext()读取Intel的扩展信息,然后调用cfi_intelext_setup()初始化自身结构。www.05112.com/Pwww.05112.com
www.05112.comPwww.05112.com 10:read_pri_intelext()函数,可以留意下怎么读取变长结构的技巧www.05112.com/Awww.05112.com,也就是www.05112.comneed_morewww.05112.com的用法。这里说明下一些变量的含义,例如对于StrataFlash 128Mb Bottom类型的的FLASH芯片,块结构是4*32KB+127*128KB=16MB,一共16个分区,每个分区1MB。nb_parts=2。www.05112.com/Pwww.05112.com
www.05112.comPwww.05112.com 第1部分www.05112.com/Pwww.05112.com
www.05112.comPwww.05112.com NumIdentPartitions=1 // 有1个重复的分区www.05112.com/Pwww.05112.com
www.05112.comPwww.05112.com NumBlockTypes=2 // 分区内有2种不同的Block类型www.05112.com/Pwww.05112.com
www.05112.comPwww.05112.com 第1类型www.05112.com/Pwww.05112.com
www.05112.comPwww.05112.com NumIdentBlocks=3 // 有4个Block(3+1)www.05112.com/Pwww.05112.com
www.05112.comPwww.05112.com BlockSize=0x80 // 32KB(0x80*256)www.05112.com/Pwww.05112.com
www.05112.comPwww.05112.com 第2类型www.05112.com/Pwww.05112.com
www.05112.comPwww.05112.com NumIdentBlocks=6 // 有7个Block(6+1)www.05112.com/Pwww.05112.com
www.05112.comPwww.05112.com BlockSize=0x200 // 128KB(0x200*256)www.05112.com/Pwww.05112.com
www.05112.comPwww.05112.com 第2部分www.05112.com/Pwww.05112.com
www.05112.comPwww.05112.com NumIdentPartitions=15// 有15个重复的分区www.05112.comBRwww.05112.com NumBlockTypes=1 // 分区内有1种Block类型www.05112.com/Pwww.05112.com
www.05112.comPwww.05112.com 第1类型www.05112.com/Pwww.05112.com
www.05112.comPwww.05112.com NumIdentBlocks=7 // 有8个Block(7+1)www.05112.com/Pwww.05112.com
www.05112.comPwww.05112.com BlockSize=0x200 // 128KB(0x200*256)www.05112.com/Pwww.05112.com
www.05112.comPwww.05112.com 11:cfi_intelext_setup()函数首先根据CFI建立mtd_erase_region_info信息,然后调用cfi_intelext_partition_fixup()来支持分区。www.05112.com/Pwww.05112.com
www.05112.comPwww.05112.com 12:cfi_intelext_partition_fixup()用来建立虚拟Chip,每个分区对应1个Chip,不过并没有完全根据CFI扩展信息来建立,而是假定每个分区的大小都一致。cfi->chipshift调整为partshift,各个虚拟chip->start调整为各分区的基址。将来访问FLASH的入口函数cfi_varsize_frob()就根据ofs得到chipnum(chipnum=ofs>>cfi->chipshift),这也是为什么要假定分区一致的原因。www.05112.com/Pwww.05112.com
www.05112.comPwww.05112.com www.05112.com/Pwww.05112.com
上一页 [1] [2]