{Samsung K9F1208U0B,NAND_MFR_SAMSUNG, 0x76, 26, 0, 3, 0x4000, 0}的分析
发布一个patch,在附件中。该patch主要是针对Samsung flash芯片K9f1208U0B的体系结构信息进行设置。全部的修改该只有一行代码,但是分析工作是更加重要,以下的陈述针对flash芯片的移植工作的流程以及思考方向。
整个u-boot在arm体系环境下的引导过程是从lib_arm 目录下board.c void start_armboot (void)函数开始的。在其中第305行,见到如下函数的调用。
nand_init(); /* go init the NAND */ |
该函数的主要作用就是进行flash芯片的初始化工作。该函数位drivers/nand_legacy
/nand_legacy.c 文件的第99行。实现代码很简短如下所示:
void nand_init(void) { S3C2410_NAND * const nand = S3C2410_GetBase_NAND(); NF_Init(); printf ("%4lu MB/n", nand_probe((ulong)nand) >> 20); |
其中在nand_probe()函数内实现了对flash芯片的扫描过程,提到扫描的过程就不得不涉及到一个非常重要的结构体nand_chip,这个结构体定义在include/linux/mtd/nand_legacy.h中。该结构体包含了很多关于flash结构信息的变量,并且在drivers/nand_legacy/nand_legacy.c的第217行定义了如下的数组:
struct nand_chip nand_dev_desc[CFG_MAX_NAND_DEVICE] = {{0}}; |
每个flash device都占用一个该数组的节点。随后在nand_probe()中第622行调用的NanD_IdentChip()函数,会读取一个flash设备的ID信息,识别、并存放到nand_dev_desc[]中。NanD_IdentChip函数的原型如下:
static int NanD_IdentChip(struct nand_chip *nand, int floor, int chip) |
该函数的职责为通过与flash芯片通讯获得flash ID,并到已存在的一个flash硬件列表中去寻找ID所对应的芯片,并获得该芯片所对应的flash的体系结构信息。
以上指责包括两大重要操作:
(1)读取flash ID信息。
(2)查找硬件列表。
而通过(2)我们就可以直接的定位到移植点,并展开移植工作。
在读取ID结束后,该段代码程序会为两个变量进行赋值,一个是fmr,另一个则是id。经过一些基本判断工作后,将进入硬件列表的扫描过程中,代码如下:
for (i = 0; nand_flash_ids[i].name != NULL; i++) { if (mfr == nand_flash_ids[i].manufacture_id && id == nand_flash_ids[i].model_id) { #ifdef NAND_DEBUG printf("Flash chip found:/n/t Manufacturer ID: 0x%2.2X, " "Chip ID: 0x%2.2X (%s)/n", mfr, id, nand_flash_ids[i].name); #endif if (!nand->mfr) { nand->mfr = mfr; nand->id = id; |
......................... ......................... |
在扫描中,我发现它会去扫描一个结构体列表,并且比对mfr以及id的信息,这个结构体列表为nand_flash_dev结构体类型的nand_flash_ids[],声明在include/linux/mtd/nand_ids.h头文件中,打开该头文件,就可以看到这个结构体数组的信息:
static struct nand_flash_dev nand_flash_ids[] = { {"Toshiba TC5816BDC", NAND_MFR_TOSHIBA, 0x64, 21, 1, 2, 0x1000, 0}, {"Toshiba TC5832DC", NAND_MFR_TOSHIBA, 0x6b, 22, 0, 2, 0x2000, 0}, .......................... {"Samsung Unknow 64M", NAND_MFR_SAMSUNG, 0x76, 26, 0, 3, 0x4000, 0}, {"Samsung KM29W32000", NAND_MFR_SAMSUNG, 0xe3, 22, 0, 2, 0x2000, 0}, {"Samsung unknown 4Mb", NAND_MFR_SAMSUNG, 0xe5, 22, 0, 2, 0x2000, 0}, |
而其中Samsung Unknow 64M就是在我输入nand info时显示给我的终端信息的一部分。因此有了一种豁然开朗的感觉。之后的任务就是搞清楚nand_flash_dev结构体的结构类型,并根据Samsung的数据手册填写结构体信息就可以解决flash芯片的移植问题了。
该结构体定义在include/linux/mtd/nand_legacy.h中结构体如下:
struct nand_flash_dev { char * name; //完整的设备名称 int manufacture_id; // 表示生产商的编号 int model_id; //设备id号 int chipshift; //总共容纳地址的位数 char page256; //flash的页字节数是否为256 char pageadrlen; //地址需要多少字节数减一(行列地址总共) unsigned long erasesize; //擦写block的单位大小 int bus16; //是否为16位总线 }; |
根据以上的结构我在nand_flash_ids中填写上了一个信的体系结构信息:
{"Samsung K9F1208U0B",NAND_MFR_SAMSUNG, 0x76, 26, 0, 3, 0x4000, 0}, |
编译烧写后,运行nand info后出现的不再是Samsung unknow 64M,而是Samsung K9F1208U0B了。
到此为止,flash芯片的移植工作基本完成。
题外话:
nand info 命令就是通过访问nand_dev_desc[]数组来显示flash相关的信息的。代码在common/cmd_nand.c中第696行:
case 2: if (strcmp (argv[1], "info") == 0) { int i; putc ('/n'); for (i = 0; i < CFG_MAX_NAND_DEVICE; ++i) { |
转载:http://blogold.chinaunix.net/u1/51351/showart_408277.html
{Samsung K9F1208U0B,NAND_MFR_SAMSUNG, 0x76, 26, 0, 3, 0x4000, 0}的分析相关推荐
- android sdk版本8.0,把targetSdkVersion设置为26(Android 8.0)需要注意的地方
前言 由于项目要上应用宝,必须设置targetSdk>=26,所以把以前项目的targetSdk=22的改成了26,要开始处理Android 6.0的动态权限,7.0的FileProvider, ...
- 用矩阵内积的办法构造迭代次数受控的神经网络1:0.6:0.1=4:3:2
每个神经网络对应每个收敛标准δ都有一个特征的迭代次数n,因此可以用迭代次数曲线n(δ)来评价网络性能. 一个二分类网络,分类两个对象A和B,B中有K张图片,B的第i张图片被取样的概率为pi,B中第i张 ...
- 用矩阵点积的办法构造神经网络的迭代次数1:0.6:0.1=1:1:1
每个神经网络对应每个收敛标准δ都有一个特征的迭代次数n,因此可以用迭代次数曲线n(δ)来评价网络性能. 一个二分类网络分类两个对象A和B,B中有K张图片,B的第i张图片被取样的概率为pi,B中第i张图 ...
- android 7.0 更新apk,Android更新apk兼容7.0和8.0
/** * 判断版本 */ private void checkVersionUpdate(final Context mContext, final File file) { if (Build.V ...
- IE6.0、IE7.0 、FireFox 在样式中的不同写法.doc
IE6.0.IE7.0 .FireFox 在样式中的不同写法 2009年3月26日 15:44:27 发布:hugo 或许你一直在抱怨为什么要专门为IE和FF写不同的CSS,为什么IE这样让人头疼,然 ...
- JRE和JDK 1.3、1.4、1.5(5.0)、6.0 各版本下载地址大全(J2SDK,JavaSE JavaEE)
本文转载(http://hi.baidu.com/y66901356/blog/item/7d32bf0abf7d7c3ab0351d39.html) 本人绝对支持原创!!! Java SE Deve ...
- 基于【CentOS-7+ Ambari 2.7.0 + HDP 3.0】搭建HAWQ数据仓库02 ——使用ambari-server安装HDP...
本文记录使用ambari-server安装HDP的过程,对比于使用cloudera-manager安装CDH,不得不说ambari的易用性差的比较多~_~,需要用户介入的过程较多,或者说可定制性更高. ...
- 训练caffe:registry.count(type) == 0 (1 vs. 0) Solver type Nesterov already registered
命令:./continue-train.sh 内容:../../caffe-master/build/tools/caffe train -gpu=$1 -solver=solver.prototxt ...
- 基于Android6.0~9.0的适配
前言 大家还记得Android 6.0权限适配的泪水吗?而现在谷歌已经出了Android P的稳定版,而且谷歌粑粑,为了大家能给辛苦熬夜加班,特地的和个大市场合作,要强制推出9.0的适配,而近期在下不 ...
最新文章
- Java集合容器全面分析
- 外包女程序员-----励志段子 留着 等没事的时候看看
- SAP Analytics Cloud里Exception Aggregation Type的设置
- LeetCode 47. 全排列 II(回溯+搜索剪枝)
- Android 轮播图从 0 到 1
- poj1062 昂贵的聘礼
- 「硬见小百科」30个EMC标准电路分享
- “封号斗罗” 程序员修炼之道:通向务实的最高境界
- Python报错:Statements must be separated by newlines or semicolons
- 数据结构简单模拟银行排队系统
- 分享Photoshop脚本代码_压缩,图片置灰,切图导出等
- DockerHub上最受欢迎的151个官方镜像,相传掌握第17个可以主宰宇宙!
- Andoid扫码枪监听
- 一款很小巧的桌面窗口隐藏工具
- 关于Python可视化Dash工具
- Java爬虫——人人网模拟登录
- Nagios配合飞信发短信
- Intel主板芯片组发展历史
- 《MATLAB语音信号分析与合成(第二版)》:第8章 基音周期的估算方法
- 学习PrintWriter类
热门文章
- supervisor看守进程
- RISCV - 2 “Zicsr“, CSR Instructions
- 爬取评分网站上面的商家信息
- DataTable用法详解
- 嵌入式系统原理及应用《基于ARM Cortex-M3 内核的STM32F103系列微控制器》思维导图
- lammps已跑完,不想重跑,如何补充新的计算?
- netsh命令恢复网络_Netsh命令-修改网络IP设置
- BaiduMap---百度地图官方Demo之图层展示(展示普通图,卫星图,交通流量图及百度城市热力图)
- android SDK模拟器环境搭建
- uCOS-II的任务介绍