`
yzd
  • 浏览: 1819010 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

MTD源码分析(2)

 
阅读更多
<p><a name="_Toc7862290"><span lang="EN-US">mtdchar.c</span>
</a>
<span lang="EN-US"><br><br>
MTD</span>
<span style="">字符设备的文件</span>
</p>
<p class="MsoHeading7"><a name="_Toc7862291"><span lang="EN-US">notifier</span>
</a>
</p>
<p class="MsoNormal"><span lang="EN-US">MTD</span>
<span style="">字符设备的</span>
<span lang="EN-US">notifier</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">static struct mtd_notifier notifier = {<span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
add:<span> </span>
mtd_notify_add,</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
remove:<span> </span>
mtd_notify_remove,</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">};</span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862292"><span lang="EN-US">mtd_lseek</span>
</a>
</p>
<p class="MsoIndexHeading"><span style="">格式:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
static loff_t mtd_lseek (struct file *file, loff_t offset, int orig)</span>
</p>
<p class="MsoIndexHeading"><span style="">注释:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">功能:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">置</span>
<span lang="EN-US">MTD</span>
<span style="">字符设备的指针</span>
</p>
<p class="MsoIndexHeading"><span style="">说明:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">参数:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
file</span>
<span style="">:</span>
<span lang="EN-US">MTD</span>
<span style="">字符设备文件</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
offset</span>
<span style="">:偏移</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
orig</span>
<span style="">:设置方式</span>
</p>
<p class="MsoIndexHeading"><span style="">返回:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">成功:返回当前指针位置</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">设置方式无效:返回</span>
<span lang="EN-US">-EINVAL</span>
</p>
<p class="MsoIndexHeading"><span style="">调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoNormal"><strong><span style="">被调用:</span>
</strong>
</p>
<p class="MsoSalutation"><span lang="EN-US"><span> </span>
</span>
<span style="">注册进</span>
<span lang="EN-US">mtd_fops</span>
<span style="">结构</span>
</p>
<p class="MsoIndexHeading"><span style="">源代码:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">{</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
struct mtd_info *mtd=(struct mtd_info *)file-&gt;private_data;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
switch (orig) {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
case 0:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
/* SEEK_SET */</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
file-&gt;f_pos = offset;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
break;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
case 1:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
/* SEEK_CUR */</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
file-&gt;f_pos += offset;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
break;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
case 2:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
/* SEEK_END */</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
file-&gt;f_pos =mtd-&gt;size + offset;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
break;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
default:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return -EINVAL;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (file-&gt;f_pos &lt; 0)</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
file-&gt;f_pos = 0;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
else if (file-&gt;f_pos &gt;= mtd-&gt;size)</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
file-&gt;f_pos = mtd-&gt;size - 1;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return file-&gt;f_pos;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">}</span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862293"><span lang="EN-US">mtd_open</span>
</a>
</p>
<p class="MsoIndexHeading"><span style="">格式:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
static int mtd_open(struct inode *inode, struct file *file)</span>
</p>
<p class="MsoIndexHeading"><span style="">注释:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">功能:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">打开一个</span>
<span lang="EN-US">MTD</span>
<span style="">字符设备</span>
</p>
<p class="MsoIndexHeading"><span style="">说明:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
devnum=minor&gt;&gt;2</span>
<span style="">(参看</span>
<span lang="EN-US">Documentations/devices.txt</span>
<span style="">),</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">进行安全性检查,</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">调用</span>
<span lang="EN-US">get_mtd_device</span>
<span style="">获取</span>
<span lang="EN-US">MTD</span>
<span style="">设备,并将</span>
<span lang="EN-US">file-&gt;private_data</span>
<span style="">指向它</span>
</p>
<p class="MsoIndexHeading"><span style="">参数:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
inode</span>
<span style="">:</span>
<span lang="EN-US">FIXME</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
file</span>
<span style="">:是系统提供给</span>
<span lang="EN-US">MTD</span>
<span style="">字符设备用于传递参数的</span>
<span lang="EN-US">file</span>
<span style="">结构,此函数中它的</span>
<span lang="EN-US">private_data</span>
</p>
<p class="MsoNormal" style="margin-left: 21pt; text-indent: 21pt;"><span style="">成员被指向原始设备层的</span>
<span lang="EN-US">MTD</span>
<span style="">设备</span>
</p>
<p class="MsoIndexHeading"><span style="">返回:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">成功:返回</span>
<span lang="EN-US">0</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">失败:返回错误码</span>
</p>
<p class="MsoIndexHeading"><span style="">调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
get_mtd_device()</span>
<span style="">获得原始设备层的</span>
<span lang="EN-US">MTD</span>
<span style="">设备</span>
</p>
<p class="MsoIndexHeading"><span style="">被调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">注册进</span>
<span lang="EN-US">mtd_fops</span>
<span style="">结构</span>
</p>
<p class="MsoIndexHeading"><span style="">源代码:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">{</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
int minor = MINOR(inode-&gt;i_rdev);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
int devnum = minor &gt;&gt; 1;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
struct mtd_info *mtd;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
DEBUG(MTD_DEBUG_LEVEL0, "MTD_open/n");</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (devnum &gt;= MAX_MTD_DEVICES)</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return -ENODEV;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
/* You can't open the RO devices RW */</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if ((file-&gt;f_mode &amp; 2) &amp;&amp; (minor &amp; 1))</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return -EACCES;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
mtd = get_mtd_device(NULL, devnum);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (!mtd)</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return -ENODEV;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (MTD_ABSENT == mtd-&gt;type) {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
put_mtd_device(mtd);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return -ENODEV;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
file-&gt;private_data = mtd;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
/* You can't open it RW if it's not a writeable device */</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if ((file-&gt;f_mode &amp; 2) &amp;&amp; !(mtd-&gt;flags &amp; MTD_WRITEABLE)) {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
put_mtd_device(mtd);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return -EACCES;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return 0;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">} /* mtd_open */</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862294"><span lang="EN-US">mtd_close</span>
</a>
</p>
<p class="MsoIndexHeading"><span style="">格式:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
static int mtd_close(struct inode *inode, struct file *file)</span>
</p>
<p class="MsoIndexHeading"><span style="">注释:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">功能:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">关闭一个</span>
<span lang="EN-US">MTD</span>
<span style="">字符设备</span>
</p>
<p class="MsoIndexHeading"><span style="">说明:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">调用</span>
<span lang="EN-US">mtd_info-&gt;sync()</span>
<span style="">同步</span>
<span lang="EN-US">MTD</span>
<span style="">设备,</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">调用</span>
<span lang="EN-US">put_mtd_device()</span>
<span style="">返还</span>
<span lang="EN-US">MTD</span>
<span style="">设备</span>
</p>
<p class="MsoIndexHeading"><span style="">参数:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
inode</span>
<span style="">:</span>
<span lang="EN-US">FIXME</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
file</span>
<span style="">:无用</span>
</p>
<p class="MsoIndexHeading"><span style="">返回:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">返回</span>
<span lang="EN-US">0</span>
</p>
<p class="MsoIndexHeading"><span style="">调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
mtd_info-&gt;sync()</span>
<span style="">同步</span>
<span lang="EN-US">MTD</span>
<span style="">设备</span>
</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">put_mtd_device()</span>
<span style="">返还</span>
<span lang="EN-US">MTD</span>
<span style="">设备</span>
</p>
<p class="MsoIndexHeading"><span style="">被调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">被注册进</span>
<span lang="EN-US">mtd_fops</span>
<span style="">结构</span>
</p>
<p class="MsoIndexHeading"><span style="">源代码:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">{</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
struct mtd_info *mtd;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
DEBUG(MTD_DEBUG_LEVEL0, "MTD_close/n");</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
mtd = (struct mtd_info *)file-&gt;private_data;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (mtd-&gt;sync)</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
mtd-&gt;sync(mtd);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
put_mtd_device(mtd);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return 0;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">} /* mtd_close */</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862295"><span lang="EN-US">MAX_KMALLOC_SIZE</span>
</a>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">/* FIXME: This _really_ needs to die. In 2.5, we should lock the</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
userspace buffer down and use it directly with readv/writev.</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">*/</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">#define MAX_KMALLOC_SIZE 0x20000</span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862296"><span lang="EN-US">mtd_read</span>
</a>
</p>
<p class="MsoIndexHeading"><span style="">格式:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
static ssize_t mtd_read(struct file *file, char *buf, size_t count,loff_t *ppos)</span>
</p>
<p class="MsoIndexHeading"><span style="">注释:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">功能:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
MTD</span>
<span style="">字符设备的写操作</span>
</p>
<p class="MsoIndexHeading"><span style="">说明:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">当</span>
<span lang="EN-US">count&gt;0</span>
<span style="">时</span>
<span lang="EN-US">{</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">裁减本次操作大小</span>
<span lang="EN-US">len</span>
<span style="">至</span>
<span lang="EN-US">min(MAX_KMALLOC_SIZE,count)</span>
<span style="">,</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">申请一块大小为</span>
<span lang="EN-US">MAX_KMALLOC_SIZE</span>
<span style="">的内核空间</span>
<span lang="EN-US">kbuf</span>
<span style="">,</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">调用</span>
<span lang="EN-US">mtd_info-&gt;read</span>
<span style="">将</span>
<span lang="EN-US">MTD</span>
<span style="">设备中的数据读入</span>
<span lang="EN-US">kbuf</span>
<span style="">,</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">将</span>
<span lang="EN-US">kbuf</span>
<span style="">中的数据拷贝到用户空间</span>
<span lang="EN-US">buf</span>
<span style="">,</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
count</span>
<span style="">自减</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">释放</span>
<span lang="EN-US">kbuf</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoIndexHeading"><span style="">参数:</span>
</p>
<p class="MsoNormal" style="margin-left: 21pt;"><span lang="EN-US">file</span>
<span style="">:系统给</span>
<span lang="EN-US">MTD</span>
<span style="">字符设备驱动程序用于传递参数的</span>
<span lang="EN-US">file</span>
<span style="">结构,此函数通过</span>
<span lang="EN-US">file</span>
<span style="">得到下</span>
</p>
<p class="MsoNormal" style="margin-left: 42pt;"><span style="">层的</span>
<span lang="EN-US">MTD</span>
<span style="">设备</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
buf</span>
<span style="">:用户空间的指针,用于存放读取的数据</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
count</span>
<span style="">:被读数据的长度</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
ppos</span>
<span style="">:被读数据在</span>
<span lang="EN-US">MTD</span>
<span style="">设备中的位置</span>
</p>
<p class="MsoIndexHeading"><span style="">返回:</span>
</p>
<p class="MsoIndex1"><span lang="EN-US"><span> </span>
</span>
<span style="">成功:返回实际读取数据的长度</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">失败:返回错误码</span>
</p>
<p class="MsoIndexHeading"><span style="">调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
mtd_info-&gt;read()</span>
<span style="">用于从</span>
<span lang="EN-US">MTD</span>
<span style="">设备中读取数据</span>
</p>
<p class="MsoIndexHeading"><span style="">被调用:</span>
</p>
<p class="MsoIndex1"><span lang="EN-US"><span> </span>
</span>
<span style="">被注册进</span>
<span lang="EN-US">mtd_fops</span>
<span style="">结构</span>
</p>
<p class="MsoIndexHeading"><span style="">源代码:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">{</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
struct mtd_info *mtd = (struct mtd_info *)file-&gt;private_data;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
size_t retlen=0;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
size_t total_retlen=0;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
int ret=0;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
int len;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
char *kbuf;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
DEBUG(MTD_DEBUG_LEVEL0,"MTD_read/n");</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (*ppos + count &gt; mtd-&gt;size)</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
count = mtd-&gt;size - *ppos;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (!count)</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return 0;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
/* FIXME: Use kiovec in 2.5 to lock down the user's buffers</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span> </span>
and pass them directly to the MTD functions */</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
while (count) {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (count &gt; MAX_KMALLOC_SIZE) </span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
len = MAX_KMALLOC_SIZE;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
else</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
len = count;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
kbuf=kmalloc(len,GFP_KERNEL);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (!kbuf)</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return -ENOMEM;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
ret = MTD_READ(mtd, *ppos, len, &amp;retlen, kbuf);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (!ret) {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
*ppos += retlen;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (copy_to_user(buf, kbuf, retlen)) {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span> </span>
kfree(kbuf);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return -EFAULT;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
else</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
total_retlen += retlen;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
count -= retlen;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
buf += retlen;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
else {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
kfree(kbuf);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return ret;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
kfree(kbuf);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return total_retlen;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">} /* mtd_read */</span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862297"><span lang="EN-US">mtd_write</span>
</a>
</p>
<p class="MsoIndexHeading"><span style="">格式:</span>
</p>
<p class="MsoIndex1"><span style="color: blue;" lang="EN-US"><span> </span>
static ssize_t mtd_write(struct file *file, const char *buf, size_t count,loff_t *ppos)</span>
</p>
<p class="MsoIndexHeading"><span style="">注释:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">功能:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">对</span>
<span lang="EN-US">MTD</span>
<span style="">字符设备的写操作</span>
</p>
<p class="MsoIndexHeading"><span style="">说明:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">当</span>
<span lang="EN-US">count&gt;0</span>
<span style="">时</span>
<span lang="EN-US">{</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">裁减本次操作大小</span>
<span lang="EN-US">len</span>
<span style="">至</span>
<span lang="EN-US">min(MAX_KMALLOC_SIZE,count)</span>
<span style="">,</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">申请一块大小为</span>
<span lang="EN-US">MAX_KMALLOC_SIZE</span>
<span style="">的内核空间</span>
<span lang="EN-US">kbuf</span>
<span style="">,</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">将用户空间</span>
<span lang="EN-US">buf</span>
<span style="">中的数据拷贝到</span>
<span lang="EN-US">kbuf</span>
<span style="">,</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">调用</span>
<span lang="EN-US">mtd_info-&gt;write</span>
<span style="">将</span>
<span lang="EN-US">kbuf</span>
<span style="">中的数据读入</span>
<span lang="EN-US">MTD</span>
<span style="">设备,</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
count</span>
<span style="">自减</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">释放</span>
<span lang="EN-US">kbuf</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoIndexHeading"><span style="">参数:</span>
</p>
<p class="MsoNormal" style="margin-left: 21pt;"><span lang="EN-US">file</span>
<span style="">:系统给</span>
<span lang="EN-US">MTD</span>
<span style="">字符设备驱动程序用于传递参数的</span>
<span lang="EN-US">file</span>
<span style="">结构,此函数通过</span>
<span lang="EN-US">file</span>
<span style="">得到下</span>
</p>
<p class="MsoNormal" style="margin-left: 42pt;"><span style="">层的</span>
<span lang="EN-US">MTD</span>
<span style="">设备</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
buf</span>
<span style="">:用户空间的指针,用于存放将要写入的数据</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
count</span>
<span style="">:被写数据的长度</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
ppos</span>
<span style="">:数据被写入</span>
<span lang="EN-US">MTD</span>
<span style="">设备中的位置</span>
</p>
<p class="MsoIndexHeading"><span style="">返回:</span>
</p>
<p class="MsoIndex1"><span lang="EN-US"><span> </span>
</span>
<span style="">成功:返回实际读取数据的长度</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">失败:返回错误码</span>
</p>
<p class="MsoIndexHeading"><span style="">调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
mtd_info-&gt;write</span>
<span style="">用于写入</span>
<span lang="EN-US">MTD</span>
<span style="">设备</span>
</p>
<p class="MsoIndexHeading"><span style="">被调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">被注册进</span>
<span lang="EN-US">mtd_fops</span>
<span style="">结构</span>
</p>
<p class="MsoIndexHeading"><span style="">源代码:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">{</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
struct mtd_info *mtd = (struct mtd_info *)file-&gt;private_data;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
char *kbuf;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
size_t retlen;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
size_t total_retlen=0;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
int ret=0;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
int len;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
DEBUG(MTD_DEBUG_LEVEL0,"MTD_write/n");</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (*ppos == mtd-&gt;size)</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return -ENOSPC;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (*ppos + count &gt; mtd-&gt;size)</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
count = mtd-&gt;size - *ppos;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (!count)</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return 0;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
while (count) {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (count &gt; MAX_KMALLOC_SIZE) </span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
len = MAX_KMALLOC_SIZE;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
else</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
len = count;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
kbuf=kmalloc(len,GFP_KERNEL);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (!kbuf) {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
printk("kmalloc is null/n");</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return -ENOMEM;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (copy_from_user(kbuf, buf, len)) {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
kfree(kbuf);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return -EFAULT;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span> </span>
ret = (*(mtd-&gt;write))(mtd, *ppos, len, &amp;retlen, kbuf);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (!ret) {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
*ppos += retlen;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
total_retlen += retlen;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
count -= retlen;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
buf += retlen;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
else {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span> </span>
kfree(kbuf);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return ret;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
kfree(kbuf);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return total_retlen;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">} /* mtd_write */</span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862298"><span lang="EN-US">mtd_erase_callback</span>
</a>
</p>
<p class="MsoIndexHeading"><span style="">格式:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
static void mtd_erase_callback (struct erase_info *instr)</span>
</p>
<p class="MsoIndexHeading"><span style="">注释:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">功能:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">唤醒进程</span>
</p>
<p class="MsoIndexHeading"><span style="">说明:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">在擦除进行完后被调用</span>
</p>
<p class="MsoIndexHeading"><span style="">参数:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
instr</span>
<span style="">:进行的擦除的</span>
<span lang="EN-US">erase_info</span>
<span style="">结构</span>
</p>
<p class="MsoIndexHeading"><span style="">返回:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
wake_up()</span>
</p>
<p class="MsoIndexHeading"><span style="">被调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">在</span>
<span lang="EN-US">mtd_ioctl</span>
<span style="">中被赋给</span>
<span lang="EN-US">erase_info-&gt;callback</span>
</p>
<p class="MsoIndexHeading"><span style="">源代码:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">{</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
wake_up((wait_queue_head_t *)instr-&gt;priv);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">}</span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862299"><span lang="EN-US">mtd_ioctl</span>
</a>
</p>
<p class="MsoIndexHeading"><span style="">格式:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
static int mtd_ioctl(struct inode *inode, struct file *file, u_int cmd, u_long arg)</span>
</p>
<p class="MsoIndexHeading"><span style="">注释:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">功能:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
MTD</span>
<span style="">字符设备的</span>
<span lang="EN-US">IO</span>
<span style="">控制</span>
</p>
<p class="MsoIndexHeading"><span style="">说明:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">根据</span>
<span lang="EN-US">cmd</span>
<span style="">分别处理</span>
</p>
<p class="MsoIndexHeading"><span style="">参数:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
inode</span>
<span style="">:</span>
<span lang="EN-US">FIXME</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
file</span>
<span style="">:传递参数的结构</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
cmd</span>
<span style="">:</span>
<span lang="EN-US">IO</span>
<span style="">控制的命令</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
arg</span>
<span style="">:</span>
<span lang="EN-US">IO</span>
<span style="">控制的参数</span>
</p>
<p class="MsoIndexHeading"><span style="">返回:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">成功:返回</span>
<span lang="EN-US">0</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">失败:返回错误码</span>
</p>
<p class="MsoIndexHeading"><span style="">调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">被调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">注册进</span>
<span lang="EN-US">mtd_fops</span>
<span style="">结构</span>
</p>
<p class="MsoIndexHeading"><span style="">源代码:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">{</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
struct mtd_info *mtd = (struct mtd_info *)file-&gt;private_data;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
int ret = 0;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
u_long size;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
DEBUG(MTD_DEBUG_LEVEL0, "MTD_ioctl/n");</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
size = (cmd &amp; IOCSIZE_MASK) &gt;&gt; IOCSIZE_SHIFT;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (cmd &amp; IOC_IN) {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
ret = verify_area(VERIFY_READ, (char *)arg, size);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (ret) return ret;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (cmd &amp; IOC_OUT) {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
ret = verify_area(VERIFY_WRITE, (char *)arg, size);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (ret) return ret;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
switch (cmd) {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
case MEMGETREGIONCOUNT:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (copy_to_user((int *) arg, &amp;(mtd-&gt;numeraseregions), sizeof(int)))</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return -EFAULT;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
break;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
case MEMGETREGIONINFO:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
{</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
struct region_info_user ur;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (copy_from_user(<span> </span>
&amp;ur, </span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
(struct region_info_user *)arg, </span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
sizeof(struct region_info_user))) {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return -EFAULT;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (ur.regionindex &gt;= mtd-&gt;numeraseregions)</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return -EINVAL;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (copy_to_user((struct mtd_erase_region_info *) arg, </span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
&amp;(mtd-&gt;eraseregions[ur.regionindex]),</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
sizeof(struct mtd_erase_region_info)))</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return -EFAULT;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
break;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
case MEMGETINFO:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (copy_to_user((struct mtd_info *)arg, mtd,</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span></span>
sizeof(struct mtd_info_user)))</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return -EFAULT;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
break;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
case MEMERASE:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
{</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
struct erase_info *erase=kmalloc(sizeof(struct erase_info),GFP_KERNEL);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (!erase)</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
ret = -ENOMEM;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
else {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
wait_queue_head_t waitq;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
DECLARE_WAITQUEUE(wait, current);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
init_waitqueue_head(&amp;waitq);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
memset (erase,0,sizeof(struct erase_info));</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (copy_from_user(&amp;erase-&gt;addr, (u_long *)arg,</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span> </span>
2 * sizeof(u_long))) {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
kfree(erase);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return -EFAULT;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
erase-&gt;mtd = mtd;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
erase-&gt;callback = mtd_erase_callback;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
erase-&gt;priv = (unsigned long)&amp;waitq;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
/*</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span> </span>
FIXME: Allow INTERRUPTIBLE. Which means</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span> </span>
not having the wait_queue head on the stack.</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span> </span>
If the wq_head is on the stack, and we</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span> </span>
leave because we got interrupted, then the</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span> </span>
wq_head is no longer there when the</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span> </span>
callback routine tries to wake us up.</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
*/</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
ret = mtd-&gt;erase(mtd, erase);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (!ret) {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
set_current_state(TASK_UNINTERRUPTIBLE);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
add_wait_queue(&amp;waitq, &amp;wait);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (erase-&gt;state != MTD_ERASE_DONE &amp;&amp;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span> </span>
<span></span>
erase-&gt;state != MTD_ERASE_FAILED)</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
schedule();</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
remove_wait_queue(&amp;waitq, &amp;wait);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
set_current_state(TASK_RUNNING);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
ret = (erase-&gt;state == MTD_ERASE_FAILED)?-EIO:0;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
kfree(erase);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
break;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
case MEMWRITEOOB:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
{</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
struct mtd_oob_buf buf;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
void *databuf;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
ssize_t retlen;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (copy_from_user(&amp;buf, (struct mtd_oob_buf *)arg, sizeof(struct mtd_oob_buf)))</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return -EFAULT;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (buf.length &gt; 0x4096)</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return -EINVAL;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (!mtd-&gt;write_oob)</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
ret = -EOPNOTSUPP;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
else</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span> </span>
ret = verify_area(VERIFY_READ, (char *)buf.ptr, buf.length);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (ret)</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return ret;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
databuf = kmalloc(buf.length, GFP_KERNEL);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (!databuf)</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return -ENOMEM;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (copy_from_user(databuf, buf.ptr, buf.length)) {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
kfree(databuf);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return -EFAULT;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
ret = (mtd-&gt;write_oob)(mtd, buf.start, buf.length, &amp;retlen, databuf);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (copy_to_user((void *)arg + sizeof(u_int32_t), &amp;retlen, sizeof(u_int32_t)))</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
ret = -EFAULT;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
kfree(databuf);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
break;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
case MEMREADOOB:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
{</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
struct mtd_oob_buf buf;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
void *databuf;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
ssize_t retlen;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (copy_from_user(&amp;buf, (struct mtd_oob_buf *)arg, sizeof(struct mtd_oob_buf)))</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return -EFAULT;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (buf.length &gt; 0x4096)</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return -EINVAL;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (!mtd-&gt;read_oob)</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
ret = -EOPNOTSUPP;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
else</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
ret = verify_area(VERIFY_WRITE, (char *)buf.ptr, buf.length);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (ret)</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return ret;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
databuf = kmalloc(buf.length, GFP_KERNEL);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (!databuf)</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return -ENOMEM;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
ret = (mtd-&gt;read_oob)(mtd, buf.start, buf.length, &amp;retlen, databuf);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (copy_to_user((void *)arg + sizeof(u_int32_t), &amp;retlen, sizeof(u_int32_t)))</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
ret = -EFAULT;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
else if (retlen &amp;&amp; copy_to_user(buf.ptr, databuf, retlen))</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
ret = -EFAULT;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
kfree(databuf);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
break;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
case MEMLOCK:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
{</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
unsigned long adrs[2];</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (copy_from_user(adrs ,(void *)arg, 2* sizeof(unsigned long)))</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return -EFAULT;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (!mtd-&gt;lock)</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
ret = -EOPNOTSUPP;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
else</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
ret = mtd-&gt;lock(mtd, adrs[0], adrs[1]);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
break;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
case MEMUNLOCK:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
{</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
unsigned long adrs[2];</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (copy_from_user(adrs, (void *)arg, 2* sizeof(unsigned long)))</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return -EFAULT;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (!mtd-&gt;unlock)</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
ret = -EOPNOTSUPP;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
else</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
ret = mtd-&gt;unlock(mtd, adrs[0], adrs[1]);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
break;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
default:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
DEBUG(MTD_DEBUG_LEVEL0, "Invalid ioctl %x (MEMGETINFO = %x)/n", cmd, MEMGETINFO);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
ret = -ENOTTY;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return ret;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">} /* memory_ioctl */</span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862300"><span lang="EN-US">mtd_fops</span>
</a>
</p>
<p class="MsoNormal"><span lang="EN-US">MTD</span>
<span style="">字符设备的操作函数结构</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">static struct file_operations mtd_fops = {<span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
owner:<span> </span>
THIS_MODULE,</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
llseek:<span> </span>
mtd_lseek,<span> </span>
<span> </span>
/* lseek */</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
read:<span> </span>
mtd_read,<span> </span>
/* read */</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
write: <span> </span>
mtd_write, <span> </span>
/* write */</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
ioctl:<span> </span>
mtd_ioctl,<span> </span>
/* ioctl */</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
open:<span> </span>
mtd_open,<span> </span>
/* open */</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
release:<span> </span>
mtd_close,<span> </span>
/* release */</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">};</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862301"><span lang="EN-US">init_mtdchar</span>
</a>
</p>
<p class="MsoIndexHeading"><span style="">格式:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
static int __init init_mtdchar(void)</span>
</p>
<p class="MsoIndexHeading"><span style="">注释:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">功能:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">初始化一个</span>
<span lang="EN-US">MTD</span>
<span style="">字符设备(设备层)</span>
</p>
<p class="MsoIndexHeading"><span style="">说明:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">如果定义了</span>
<span lang="EN-US">CONFIG_DEVFS_FS{</span>
</p>
<p class="MsoNormal" style="margin-left: 21pt; text-indent: 21pt;"><span style="">调用</span>
<span lang="EN-US">devfs_register_chrdev()</span>
<span style="">注册</span>
<span lang="EN-US">MTD</span>
<span style="">字符设备</span>
</p>
<p class="MsoNormal" style="margin-left: 21pt; text-indent: 21pt;"><span style="">调用</span>
<span lang="EN-US">register_mtd_user()</span>
<span style="">将设备层</span>
<span lang="EN-US">MTD</span>
<span style="">字符设备的</span>
<span lang="EN-US">notifier</span>
<span style="">注册进原始设备层</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">否则调用</span>
<span lang="EN-US">register_chrdev()</span>
<span style="">注册</span>
<span lang="EN-US">MTD</span>
<span style="">字符设备</span>
</p>
<p class="MsoIndexHeading"><span style="">参数:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">返回:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">成功:返回</span>
<span lang="EN-US">0</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">注册失败:返回</span>
<span lang="EN-US">-EAGAIN</span>
</p>
<p class="MsoIndexHeading"><span style="">调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
devfs_register_chrdev()</span>
<span style="">或</span>
<span lang="EN-US">register_chrdev()</span>
<span style="">注册字符设备</span>
</p>
<p class="MsoIndexHeading"><span style="">被调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
__init</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
module_init</span>
</p>
<p class="MsoIndexHeading"><span style="">源代码:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">{</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">#ifdef CONFIG_DEVFS_FS</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (devfs_register_chrdev(MTD_CHAR_MAJOR, "mtd", &amp;mtd_fops))</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
{</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
printk(KERN_NOTICE "Can't allocate major number %d for Memory Technology Devices./n",</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span> </span>
MTD_CHAR_MAJOR);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return -EAGAIN;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
devfs_dir_handle = devfs_mk_dir(NULL, "mtd", NULL);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
register_mtd_user(&amp;notifier);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">#else</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (register_chrdev(MTD_CHAR_MAJOR, "mtd", &amp;mtd_fops))</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
{</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
printk(KERN_NOTICE "Can't allocate major number %d for Memory Technology Devices./n",</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span> </span>
MTD_CHAR_MAJOR);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return -EAGAIN;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">#endif</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return 0;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862302"><span lang="EN-US">cleanup_mtdchar</span>
</a>
</p>
<p class="MsoIndexHeading"><span style="">格式:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
static void __exit cleanup_mtdchar(void)</span>
</p>
<p class="MsoIndexHeading"><span style="">注释:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">功能:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">清除</span>
<span lang="EN-US">MTD</span>
<span style="">字符设备</span>
</p>
<p class="MsoIndexHeading"><span style="">说明:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">如果定义了</span>
<span lang="EN-US">CONFIG_DEVFS_FS{</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">调用</span>
<span lang="EN-US">unregister_mtd_user()</span>
<span style="">注销</span>
<span lang="EN-US">MTD</span>
<span style="">字符设备的</span>
<span lang="EN-US">notifier,</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">调用</span>
<span lang="EN-US">devfs_unregister_chrdev()</span>
<span style="">注销</span>
<span lang="EN-US">MTD</span>
<span style="">字符设备</span>
</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">}</span>
</p>
<p class="MsoNormal" style="margin-left: 21pt;"><span style="">否则调用</span>
<span lang="EN-US">unregister_chrdev()</span>
<span style="">注销</span>
<span lang="EN-US">MTD</span>
<span style="">字符设备</span>
</p>
<p class="MsoIndexHeading"><span style="">参数:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">返回:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
unregister_chrdev()</span>
<span style="">或</span>
<span lang="EN-US">devfs_unregister_chrdev()</span>
<span style="">注销字符设备</span>
</p>
<p class="MsoIndexHeading"><span style="">被调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
__exit</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
module_exit</span>
</p>
<p class="MsoIndexHeading"><span style="">源代码:</span>
</p>
<p class="MsoIndex1"><span style="color: blue;" lang="EN-US">{</span>
</p>
<p class="MsoIndex1"><span style="color: blue;" lang="EN-US">#ifdef CONFIG_DEVFS_FS</span>
</p>
<p class="MsoIndex1"><span style="color: blue;" lang="EN-US"><span> </span>
unregister_mtd_user(&amp;notifier);</span>
</p>
<p class="MsoIndex1"><span style="color: blue;" lang="EN-US"><span> </span>
devfs_unregister(devfs_dir_handle);</span>
</p>
<p class="MsoIndex1"><span style="color: blue;" lang="EN-US"><span> </span>
devfs_unregister_chrdev(MTD_CHAR_MAJOR, "mtd");</span>
</p>
<p class="MsoIndex1"><span style="color: blue;" lang="EN-US">#else</span>
</p>
<p class="MsoIndex1"><span style="color: blue;" lang="EN-US"><span> </span>
unregister_chrdev(MTD_CHAR_MAJOR, "mtd");</span>
</p>
<p class="MsoIndex1"><span style="color: blue;" lang="EN-US">#endif</span>
</p>
<p>
<span style="color: blue;" lang="EN-US">}<br><br></span>
</p>
<h3>
<a name="_Toc7862303"><span lang="EN-US">/drivers/mtd/chips</span>
</a>
<span><span style="">子目录</span>
</span>
</h3>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">/drivers/mtd/chips</span>
<span style="">下文件的主要功能是探测</span>
<span lang="EN-US">MTD</span>
<span style="">,该目录下文件是</span>
<span lang="EN-US">chipreg.c</span>
<span style="">、</span>
<span lang="EN-US">gen_probe.c</span>
<span style="">、</span>
<span lang="EN-US">cfi_probe.c</span>
<span style="">、</span>
<span lang="EN-US">jedec_probe.c</span>
<span style="">、</span>
<span lang="EN-US">cfi_cmdset_0001.c</span>
<span style="">、</span>
<span lang="EN-US">cfi_cmdset_0002.c</span>
<span style="">、</span>
<span lang="EN-US">map_rom.c</span>
<span style="">、</span>
<span lang="EN-US">map_ram.c</span>
<span style="">、</span>
<span lang="EN-US">map_absent.c</span>
<span style="">、</span>
<span lang="EN-US">amd_flash.c</span>
<span style="">、</span>
<span lang="EN-US">jedec.c</span>
<span style="">和</span>
<span lang="EN-US">sharp.c</span>
<span style="">,下面介绍每个文件的功能</span>
</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="">为了确定一个</span>
<span lang="EN-US">Flash</span>
<span style="">是否是一个</span>
<span lang="EN-US">CFI</span>
<span style="">使能的</span>
<span lang="EN-US">flash memory</span>
<span style="">器件,首先要往</span>
<span lang="EN-US">Flash</span>
<span style="">的地址</span>
<span lang="EN-US">0x55H</span>
<span style="">写入数据</span>
<span lang="EN-US">0x98H</span>
<span style="">,然后从</span>
<span lang="EN-US">Flash</span>
<span style="">的地址</span>
<span lang="EN-US">0x10H</span>
<span style="">处开始连续读取</span>
<span lang="EN-US">3</span>
<span style="">个存储单元中的内容,如果数据总线返回的</span>
<span lang="EN-US">3</span>
<span style="">个存储单元的字符分别为</span>
<span lang="EN-US">'Q','R'</span>
<span style="">和</span>
<span lang="EN-US">'Y'</span>
<span style="">,那么该器件是一个</span>
<span lang="EN-US">CFI</span>
<span style="">使能的</span>
<span lang="EN-US">Flash</span>
<span style="">。在识别</span>
<span lang="EN-US">Flash</span>
<span style="">为</span>
<span lang="EN-US">CFI</span>
<span style="">使能器件后,通过查询命令来读取</span>
<span lang="EN-US">CFI</span>
<span style="">查询结构,这些数据的地址和含义在</span>
<span lang="EN-US">cfi_ident.h</span>
<span style="">文件中。探测</span>
<span lang="EN-US">CFI</span>
<span style="">接口</span>
<span lang="EN-US">Flash</span>
<span style="">设备的程序在文件</span>
<strong><span lang="EN-US">cfi_probe.c</span>
</strong>
<span style="">中,这些设备的类型为“</span>
<span lang="EN-US">cfi_probe</span>
<span style="">”。</span>
</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="">也可以用</span>
<span lang="EN-US">JEDEC</span>
<span style="">(电子电器设备联合会)标准设备模仿</span>
<span lang="EN-US">CFI</span>
<span style="">接口,探测</span>
<span lang="EN-US">JEDEC</span>
<span style="">设备的程序在</span>
<strong><span lang="EN-US">jedec_probe.c</span>
</strong>
<span style="">中,</span>
<span lang="EN-US">JEDEC</span>
<span style="">设备的类型为“</span>
<span lang="EN-US">jedec_probe</span>
<span style="">”。</span>
</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">CFI</span>
<span style="">设备和</span>
<span lang="EN-US">JEDEC</span>
<span style="">设备都要用到</span>
<strong><span lang="EN-US">gen_probe.c</span>
</strong>
<span style="">文件。</span>
</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="">不同的制造商使用不同的命令集,目前</span>
<span lang="EN-US">Linux</span>
<span style="">的</span>
<span lang="EN-US">MTD</span>
<span style="">实现的命令集有</span>
<span lang="EN-US">AMD/Fujitsu</span>
<span style="">的标准命令集和</span>
<span lang="EN-US">Intel/Sharp</span>
<span style="">的扩展命令集(兼容</span>
<span lang="EN-US">Intel/Sharp</span>
<span style="">标准命令集)两个,这两个命令集分别在</span>
<strong><span lang="EN-US">cfi_cmdset_0002.c</span>
</strong>
<span style="">和</span>
<strong><span lang="EN-US">cfi_cmdset_0001.c</span>
</strong>
<span style="">中实现。</span>
</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="">此外还有一些非</span>
<span lang="EN-US">CFI</span>
<span style="">标准的</span>
<span lang="EN-US">Flash</span>
<span style="">,其中“</span>
<span lang="EN-US">jedec</span>
<span style="">”类型的</span>
<span lang="EN-US">Flash</span>
<span style="">的探测程序在</span>
<strong><span lang="EN-US">jedec.c</span>
</strong>
<span style="">中</span>
<span lang="EN-US">,</span>
<span style="">“</span>
<span lang="EN-US">sharp</span>
<span style="">”类型的</span>
<span lang="EN-US">Flash</span>
<span style="">的探测程序在</span>
<strong><span lang="EN-US">sharp.c</span>
</strong>
<span style="">中“</span>
<span lang="EN-US">amd_flash</span>
<span style="">”类型的</span>
<span lang="EN-US">Flash</span>
<span style="">的探测程序在</span>
<strong><span lang="EN-US">amd_flash.c</span>
</strong>
<span style="">中。</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">最后,还有一些非</span>
<span lang="EN-US">Flash</span>
<span style="">的</span>
<span lang="EN-US">MTD</span>
<span style="">,比如</span>
<span lang="EN-US">ROM</span>
<span style="">或</span>
<span lang="EN-US">absent</span>
<span style="">(无)设备。这些设备的探测程序在</span>
<strong><span lang="EN-US">map_rom.c</span>
</strong>
<span style="">、</span>
<strong><span lang="EN-US">map_ram.c</span>
</strong>
<span style="">和</span>
<strong><span lang="EN-US">map_absent.c</span>
</strong>
<span style="">中。</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">所有类型的芯片都通过</span>
<strong><span lang="EN-US">chipreg.c</span>
</strong>
<span style="">中的</span>
<span lang="EN-US">do_map_probe()</span>
<span style="">程序驱动</span>
</p>
<p class="MsoSalutation"><span lang="EN-US"></span>
</p>
<h5>
<a name="_Toc7862304"><span lang="EN-US">chipreg.c</span>
</a>
</h5>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="">关于</span>
<span lang="EN-US">MTD</span>
<span style="">芯片注册的文件,此文件中定义的</span>
<strong><span lang="EN-US">chip_drvs_list</span>
</strong>
<span style="">是所有芯片类型的驱动器链表,在</span>
<span lang="EN-US">/drivers/mtd/chips</span>
<span style="">子目录下的其他文件通过调用</span>
<strong><span lang="EN-US">register_mtd_chip_driver()</span>
</strong>
<span style="">和</span>
<strong><span lang="EN-US">unregister_mtd_chip_driver()</span>
</strong>
<span style="">向此链表中添加或去除</span>
<span lang="EN-US">MTD</span>
<span style="">芯片驱动器。</span>
</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="">在</span>
<span lang="EN-US">/drivers/mtd/map/</span>
<span style="">下的文件根据芯片类型调用</span>
<strong><span lang="EN-US">do_map_probe()</span>
</strong>
<span style="">,</span>
<span lang="EN-US">do_map_probe()</span>
<span style="">通过</span>
<strong><span lang="EN-US">get_mtd_chip_driver()</span>
</strong>
<span style="">获得符合指定</span>
<span lang="EN-US">name</span>
<span style="">的</span>
<span lang="EN-US">MTD</span>
<span style="">芯片驱动器,再调用获得的芯片驱动器的</span>
<span lang="EN-US">probe</span>
<span style="">程序。</span>
</p>
<p class="MsoHeading7"><a name="_Toc7862305"><span lang="EN-US">chip_drvs_list</span>
</a>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">static LIST_HEAD(chip_drvs_list);</span>
</p>
<p class="MsoNormal"><span lang="EN-US">MTD</span>
<span style="">芯片驱动器列表</span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862306"><span lang="EN-US">register_mtd_chip_driver</span>
</a>
</p>
<p class="MsoIndexHeading"><span style="">格式:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
void register_mtd_chip_driver(struct mtd_chip_driver *drv)</span>
</p>
<p class="MsoIndexHeading"><span style="">注释:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">功能:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">注册</span>
<span lang="EN-US">MTD</span>
<span style="">的芯片驱动器</span>
</p>
<p class="MsoIndexHeading"><span style="">说明:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">向</span>
<span lang="EN-US">chip_drvs_list</span>
<span style="">里添加</span>
<span lang="EN-US">mtd_chip_driver</span>
</p>
<p class="MsoNormal"><strong><span style="">参数:</span>
</strong>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
drv</span>
<span style="">:被注册的</span>
<span lang="EN-US">MTD</span>
<span style="">的芯片驱动器</span>
</p>
<p class="MsoIndexHeading"><span style="">返回:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
list_add()</span>
</p>
<p class="MsoIndexHeading"><span style="">被调用:</span>
</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="">各种芯片驱动的初始化程序</span>
</p>
<p class="MsoIndexHeading"><span style="">源代码:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">{</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
spin_lock(&amp;chip_drvs_lock);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
list_add(&amp;drv-&gt;list, &amp;chip_drvs_list);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
spin_unlock(&amp;chip_drvs_lock);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">}</span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862307"><span lang="EN-US">unregister_mtd_chip_driver</span>
</a>
</p>
<p class="MsoIndexHeading"><span style="">格式:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
void unregister_mtd_chip_driver(struct mtd_chip_driver *drv)</span>
</p>
<p class="MsoIndexHeading"><span style="">注释:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">功能:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">删除一个</span>
<span lang="EN-US">MTD</span>
<span style="">芯片的驱动器</span>
</p>
<p class="MsoIndexHeading"><span style="">说明:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">从</span>
<span lang="EN-US">chip_drvs_list</span>
<span style="">中删除一个</span>
<span lang="EN-US">mtd_chip_driver</span>
</p>
<p class="MsoIndexHeading"><span style="">参数:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
drv</span>
<span style="">:被删除的</span>
<span lang="EN-US">MTD</span>
<span style="">芯片的驱动器</span>
</p>
<p class="MsoIndexHeading"><span style="">返回:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
list_del()</span>
</p>
<p class="MsoIndexHeading"><span style="">被调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">各种芯片驱动的清除程序</span>
</p>
<p class="MsoIndexHeading"><span style="">源代码:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">{</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
spin_lock(&amp;chip_drvs_lock);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
list_del(&amp;drv-&gt;list);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
spin_unlock(&amp;chip_drvs_lock);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">}</span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862308"><span lang="EN-US">get_mtd_chip_driver</span>
</a>
</p>
<p class="MsoIndexHeading"><span style="">格式:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
static struct mtd_chip_driver *get_mtd_chip_driver (char *name)</span>
</p>
<p class="MsoIndexHeading"><span style="">注释:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">功能:</span>
</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="">获得指定名称的</span>
<span lang="EN-US">MTD</span>
<span style="">的芯片驱动器</span>
</p>
<p class="MsoIndexHeading"><span style="">说明:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">根据</span>
<span lang="EN-US">name</span>
<span style="">从</span>
<span lang="EN-US">chip_drvs_list</span>
<span style="">中获得一个</span>
<span lang="EN-US">mtd_chip_driver</span>
</p>
<p class="MsoIndexHeading"><span style="">参数:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
name</span>
<span style="">:该芯片驱动器的名称</span>
</p>
<p class="MsoIndexHeading"><span style="">返回:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">找到:返回该</span>
<span lang="EN-US">mtd_chip_driver</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">没找到:返回</span>
<span lang="EN-US">NULL</span>
</p>
<p class="MsoIndexHeading"><span style="">调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">被调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
do_map_probe</span>
</p>
<p class="MsoIndexHeading"><span style="">源代码:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">{</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
struct list_head *pos;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
struct mtd_chip_driver *ret = NULL, *this;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
spin_lock(&amp;chip_drvs_lock);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
list_for_each(pos, &amp;chip_drvs_list) {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
this = list_entry(pos, typeof(*this), list);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (!strcmp(this-&gt;name, name)) {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
ret = this;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
break;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (ret &amp;&amp; !try_inc_mod_count(ret-&gt;module)) {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
/* Eep. Failed. */</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
ret = NULL;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
spin_unlock(&amp;chip_drvs_lock);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return ret;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">}</span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862309"><span lang="EN-US">do_map_probe</span>
</a>
</p>
<p class="MsoIndexHeading"><span style="">格式:</span>
</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="color: blue;" lang="EN-US">struct mtd_info *do_map_probe(char *name, struct map_info *map)</span>
</p>
<p class="MsoIndexHeading"><span style="">注释:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">功能:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">根据</span>
<span lang="EN-US">name</span>
<span style="">和</span>
<span lang="EN-US">map</span>
<span style="">的信息探测</span>
<span lang="EN-US">MTD</span>
<span style="">并返回</span>
<span lang="EN-US">mtd_info</span>
<span style="">结构</span>
</p>
<p class="MsoIndexHeading"><span style="">说明:</span>
</p>
<p class="MsoNormal" style=""><span lang="EN-US">1.<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal;'> </span>
</span>
<span style="">根据</span>
<span lang="EN-US">name</span>
<span style="">获得</span>
<span lang="EN-US">mtd_chip_driver</span>
</p>
<p class="MsoNormal" style=""><span lang="EN-US">2.<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal;'> </span>
</span>
<span style="">调用</span>
<span lang="EN-US">mtd_chip_driver</span>
<span style="">中的</span>
<span lang="EN-US">probe</span>
<span style="">函数</span>
</p>
<p class="MsoIndexHeading"><span style="">参数:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
name</span>
<span style="">:</span>
<span lang="EN-US">MTD</span>
<span style="">芯片类型</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
map</span>
<span style="">:</span>
<span lang="EN-US">MTD</span>
<span style="">芯片信息</span>
</p>
<p class="MsoIndexHeading"><span style="">返回:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">成功:返回</span>
<span lang="EN-US">MTD</span>
<span style="">设备的结构</span>
<span lang="EN-US">mtd_info</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">失败:返回</span>
<span lang="EN-US">NULL</span>
</p>
<p class="MsoIndexHeading"><span style="">调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
get_mtd_chip_driver()</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
drv-&gt;probe()</span>
</p>
<p class="MsoIndexHeading"><span style="">被调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
/drivers/mtd/maps/</span>
<span style="">下的板子相关文件中的</span>
<span lang="EN-US">init_xxxx</span>
</p>
<p class="MsoIndexHeading"><span style="">源代码:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">{</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
struct mtd_chip_driver *drv;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
struct mtd_info *ret;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
drv = get_mtd_chip_driver(name);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (!drv &amp;&amp; !request_module(name))</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
drv = get_mtd_chip_driver(name);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (!drv)</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return NULL;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
ret = drv-&gt;probe(map);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">#ifdef CONFIG_MODULES</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
/* We decrease the use count here. It may have been a </span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span> </span>
probe-only module, which is no longer required from this</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span> </span>
point, having given us a handle on (and increased the use</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span> </span>
count of) the actual driver code.</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
*/</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if(drv-&gt;module)</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
__MOD_DEC_USE_COUNT(drv-&gt;module);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">#endif</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (ret)</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return ret;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return NULL;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">}</span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<h5>
<a name="_Toc7862310"><span lang="EN-US">cfi_probe.c</span>
</a>
</h5>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">“cfi_probe”</span>
<span style="">型芯片的探测程序,主要由</span>
<span lang="EN-US">cfi_chip_probe()</span>
<span style="">、</span>
<span lang="EN-US">cfi_probe()</span>
<span style="">、</span>
<span lang="EN-US">cfi_chip_setup()</span>
<span style="">、</span>
<span lang="EN-US">qry_present()</span>
<span style="">、</span>
<span lang="EN-US">cfi_probe_init()</span>
<span style="">和</span>
<span lang="EN-US">cfi_probe_exit()</span>
<span style="">这几个函数组成。</span>
</p>
<p class="MsoNormal" style="text-indent: 21pt;"><strong><span lang="EN-US">cfi_probe()</span>
</strong>
<span style="">是</span>
<span lang="EN-US">“cfi_probe”</span>
<span style="">类型芯片的探测程序,它调用通用探测程序</span>
<strong><span lang="EN-US">mtd_do_chip_probe()</span>
</strong>
<span style="">,并将</span>
<strong><span lang="EN-US">cfi_chip_probe</span>
</strong>
<span style="">作为参数传递给</span>
<span lang="EN-US">mtd_do_chip_probe()</span>
<span style="">,</span>
<span lang="EN-US">mtd_do_chip_probe()</span>
<span style="">将间接调用</span>
<span lang="EN-US">cfi_chip_probe</span>
<span style="">的成员函数</span>
<strong><span lang="EN-US">cfi_probe_chip()</span>
</strong>
<span style="">。</span>
<span lang="EN-US">cfi_probe()</span>
<span style="">注册在</span>
<span lang="EN-US">“cfi_probe”</span>
<span style="">芯片的驱动器</span>
<strong><span lang="EN-US">cfi_chipdrv</span>
</strong>
<span style="">中。</span>
</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">cfi_probe_chip()</span>
<span style="">将调用</span>
<strong><span lang="EN-US">qry_present()</span>
</strong>
<span style="">和</span>
<strong><span lang="EN-US">cfi_chip_setup()</span>
</strong>
<span style="">初始化</span>
<span lang="EN-US">cfi_private</span>
<span style="">结构,</span>
<span lang="EN-US">qry_presetn()</span>
<span style="">负责验证该</span>
<span lang="EN-US">MTD</span>
<span style="">设备支持</span>
<span lang="EN-US">CFI</span>
<span style="">接口,</span>
<span lang="EN-US">cfi_chip_setup()</span>
<span style="">则读出</span>
<span lang="EN-US">CFI</span>
<span style="">查询结构中的数据(见</span>
<span lang="EN-US">cfi.h</span>
<span style="">)</span>
</p>
<p class="MsoNormal" style="text-indent: 21pt;"><strong><span lang="EN-US">cfi_probe_init()</span>
</strong>
<span style="">和</span>
<strong><span lang="EN-US">cfi_probe_exit()</span>
</strong>
<span style="">是</span>
<span lang="EN-US">“cfi_prbe”</span>
<span style="">型芯片驱动器的注册程序和清除程序。</span>
</p>
<p class="MsoSalutation"><span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862311"><span lang="EN-US">cfi_chipdrv</span>
</a>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">static struct mtd_chip_driver cfi_chipdrv = {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
probe: cfi_probe,<span> </span>
</span>
<span style="">芯片的探测程序</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
name: "cfi_probe",<span> </span>
</span>
<span lang="EN-US"><span> </span>
</span>
<span style="">芯片名称</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
module: THIS_MODULE</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">};</span>
</p>
<p class="MsoNormal"><span lang="EN-US">“cfi_probe”</span>
<span style="">类型</span>
<span lang="EN-US">MTD</span>
<span style="">芯片的驱动器</span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862312"><span lang="EN-US">cfi_probe_init</span>
</a>
</p>
<p class="MsoIndexHeading"><span style="">格式:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
int __init cfi_probe_init(void)</span>
</p>
<p class="MsoIndexHeading"><span style="">注释:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">功能:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">初始化</span>
<span lang="EN-US">“cfi_probe”</span>
<span style="">类型的</span>
<span lang="EN-US">MTD</span>
<span style="">芯片</span>
</p>
<p class="MsoIndexHeading"><span style="">说明:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">调用</span>
<span lang="EN-US">register_mtd_chip_driver()</span>
<span style="">将</span>
<span lang="EN-US">cfi_chipdrv</span>
<span style="">加入</span>
<span lang="EN-US">MTD</span>
<span style="">驱动器列表</span>
<span lang="EN-US">chip_drvs_list</span>
</p>
<p class="MsoIndexHeading"><span style="">参数:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">返回:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
0</span>
</p>
<p class="MsoIndexHeading"><span style="">调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
register_mtd_chip_driver()</span>
</p>
<p class="MsoIndexHeading"><span style="">被调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
__init</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
module_init</span>
</p>
<p class="MsoIndexHeading"><span style="">源代码:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">{</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
register_mtd_chip_driver(&amp;cfi_chipdrv);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return 0;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">}</span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862313"><span lang="EN-US">cfi_probe_exit</span>
</a>
</p>
<p class="MsoIndexHeading"><span style="">格式:</span>
</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="color: blue;" lang="EN-US">static void __exit cfi_probe_exit(void)</span>
</p>
<p class="MsoIndexHeading"><span style="">注释:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">功能:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">清除</span>
<span lang="EN-US">“cfi_probe”MTD</span>
<span style="">芯片驱动</span>
</p>
<p class="MsoIndexHeading"><span style="">说明:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">调用</span>
<span lang="EN-US">unregister_mtd_chip_driver</span>
<span style="">从</span>
<span lang="EN-US">MTD</span>
<span style="">芯片驱动器列表</span>
<span lang="EN-US">chip_drvs_list</span>
<span style="">中删除</span>
<span lang="EN-US">cfi_chipdrv</span>
</p>
<p class="MsoIndexHeading"><span style="">参数:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">返回:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
unregister_mtd_chip_driver()</span>
</p>
<p class="MsoIndexHeading"><span style="">被调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
__exit</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
module_exit</span>
</p>
<p class="MsoIndexHeading"><span style="">源代码:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">{</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
unregister_mtd_chip_driver(&amp;cfi_chipdrv);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">}</span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862314"><span lang="EN-US">cfi_probe</span>
</a>
</p>
<p class="MsoIndexHeading"><span style="">格式:</span>
</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="color: blue;" lang="EN-US">struct mtd_info *cfi_probe(struct map_info *map)</span>
</p>
<p class="MsoIndexHeading"><span style="">注释:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">功能:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
“cfi_probe”</span>
<span style="">类型</span>
<span lang="EN-US">MTD</span>
<span style="">芯片的探测程序</span>
</p>
<p class="MsoIndexHeading"><span style="">说明:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">调用通用的探测程序</span>
<span lang="EN-US">mtd_do_chip_probe()</span>
<span style="">,并将</span>
<span lang="EN-US">cfi_chip_probe</span>
<span style="">作为参数传进去</span>
</p>
<p class="MsoIndexHeading"><span style="">参数:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
map</span>
<span style="">:芯片的相关信息</span>
</p>
<p class="MsoIndexHeading"><span style="">返回:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
MTD</span>
<span style="">设备信息结构</span>
<span lang="EN-US">mtd_info</span>
</p>
<p class="MsoIndexHeading"><span style="">调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
mtd_do_chip_probe</span>
</p>
<p class="MsoIndexHeading"><span style="">被调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">注册在</span>
<span lang="EN-US">cfi_chipdrv</span>
<span style="">中,根据芯片类型被</span>
<span lang="EN-US">do_map_probe()</span>
<span style="">调用</span>
</p>
<p class="MsoIndexHeading"><span style="">源代码:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">{</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
/*</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span></span>
* Just use the generic probe stuff to call our CFI-specific</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span></span>
* chip_probe routine in all the possible permutations, etc.</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span></span>
*/</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return mtd_do_chip_probe(map, &amp;cfi_chip_probe);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">}</span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862315"><span lang="EN-US">cfi_chip_probe</span>
</a>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">static struct chip_probe cfi_chip_probe = {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
name: "CFI",</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
probe_chip: cfi_probe_chip</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">};</span>
</p>
<p class="MsoNormal"><span lang="EN-US">cfi_probe</span>
<span style="">传递给通用探测程序</span>
<span lang="EN-US">mtd_do_chip_probe</span>
<span style="">的参数</span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862316"><span lang="EN-US">cfi_probe_chip</span>
</a>
</p>
<p class="MsoIndexHeading"><span style="">格式:</span>
</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="color: blue;" lang="EN-US">static int cfi_probe_chip(struct map_info *map, __u32 base,</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span> </span>
struct flchip *chips, struct cfi_private *cfi)</span>
</p>
<p class="MsoIndexHeading"><span style="">注释:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">功能:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
“cfi_probe”</span>
<span style="">类型</span>
<span lang="EN-US">MTD</span>
<span style="">芯片驱动程序</span>
</p>
<p class="MsoIndexHeading"><span style="">说明:</span>
</p>
<p class="MsoNormal" style=""><span lang="EN-US">1.<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal;'> </span>
</span>
<span style="">调用</span>
<span lang="EN-US">qry_present()</span>
<span style="">检查是否</span>
<span lang="EN-US">CFI</span>
<span style="">接口的</span>
<span lang="EN-US">MTD</span>
</p>
<p class="MsoNormal" style=""><span lang="EN-US">2.<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal;'> </span>
</span>
<span style="">如果</span>
<span lang="EN-US">cfi-&gt;numchips=0</span>
<span style="">,调用</span>
<span lang="EN-US">cfi_chip_setup()</span>
<span style="">设置;(搜索新芯片)</span>
</p>
<p class="MsoNormal" style=""><span lang="EN-US">3.<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal;'> </span>
</span>
<span style="">否则探测此芯片是否为原芯片的别名,如果不是,此芯片作为同类芯片加入</span>
</p>
<p class="MsoIndexHeading"><span style="">参数:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
FIXME</span>
</p>
<p class="MsoIndexHeading"><span style="">返回:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">成功:返回</span>
<span lang="EN-US">1</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">失败:返回</span>
<span lang="EN-US">0</span>
<span style="">或</span>
<span lang="EN-US">-1</span>
</p>
<p class="MsoIndexHeading"><span style="">调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
qry_present()</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
cfi_chip_setup()</span>
</p>
<p class="MsoIndexHeading"><span style="">被调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">注册在</span>
<span lang="EN-US">cfi_chip_probe</span>
<span style="">中</span>
</p>
<p class="MsoIndexHeading"><span style="">源代码:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">{</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
int i;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
cfi_send_gen_cmd(0xF0, 0, base, map, cfi, cfi-&gt;device_type, NULL);<span> </span>
</span>
<span lang="EN-US">//reset</span>
<span style="">,进入读模式</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
cfi_send_gen_cmd(0x98, 0x55, base, map, cfi, cfi-&gt;device_type, NULL);<span> </span>
</span>
<span lang="EN-US">//</span>
<span style="">发送查询命令</span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (!qry_present(map,base,cfi))<span> </span>
</span>
<span lang="EN-US">//</span>
<span style="">如果不存在</span>
<span lang="EN-US">QRY</span>
<span style="">,则不是</span>
<span lang="EN-US">CFI</span>
<span style="">接口</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return 0;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (!cfi-&gt;numchips) {</span>
<span lang="EN-US"><span> </span>
//</span>
<span style="">如果是</span>
<span lang="EN-US">MTD</span>
<span style="">原始设备中的第一块芯片</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
/* This is the first time we're called. Set up the CFI </span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span> </span>
stuff accordingly and return */</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return cfi_chip_setup(map, cfi);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
/* Check each previous chip to see if it's an alias */</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
for (i=0; i&lt;cfi-&gt;numchips; i++) {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
/* This chip should be in read mode if it's one</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span> </span>
<span> </span>
we've already touched. */</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (qry_present(map,chips[i].start,cfi)) {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
/* Eep. This chip also had the QRY marker. </span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span></span>
* Is it an alias for the new one? */</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
cfi_send_gen_cmd(0xF0, 0, chips[i].start, map, cfi, cfi-&gt;device_type, NULL);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
/* If the QRY marker goes away, it's an alias */</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (!qry_present(map, chips[i].start, cfi)) {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
printk(KERN_DEBUG "%s: Found an alias at 0x%x for the chip at 0x%lx/n",</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span> </span>
map-&gt;name, base, chips[i].start);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return 0;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
/* Yes, it's actually got QRY for data. Most </span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span></span>
* unfortunate. Stick the new chip in read mode</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span></span>
* too and if it's the same, assume it's an alias. */</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
/* FIXME: Use other modes to do a proper check */</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
cfi_send_gen_cmd(0xF0, 0, base, map, cfi, cfi-&gt;device_type, NULL);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (qry_present(map, base, cfi)) {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
printk(KERN_DEBUG "%s: Found an alias at 0x%x for the chip at 0x%lx/n",</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span> </span>
map-&gt;name, base, chips[i].start);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return 0;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
/* OK, if we got to here, then none of the previous chips appear to</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span> </span>
be aliases for the current one. */</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (cfi-&gt;numchips == MAX_CFI_CHIPS) {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
printk(KERN_WARNING"%s: Too many flash chips detected. Increase MAX_CFI_CHIPS from %d./n", map-&gt;name, MAX_CFI_CHIPS);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
/* Doesn't matter about resetting it to Read Mode - we're not going to talk to it anyway */</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return -1;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
chips[cfi-&gt;numchips].start = base;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
chips[cfi-&gt;numchips].state = FL_READY;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
cfi-&gt;numchips++;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
/* Put it back into Read Mode */</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
cfi_send_gen_cmd(0xF0, 0, base, map, cfi, cfi-&gt;device_type, NULL);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
printk(KERN_INFO "%s: Found %d x%d devices at 0x%x in %d-bit mode/n",</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span> </span>
map-&gt;name, cfi-&gt;interleave, cfi-&gt;device_type*8, base,</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span> </span>
map-&gt;buswidth*8);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return 1;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">}</span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862317"><span lang="EN-US">qry_present</span>
</a>
</p>
<p class="MsoIndexHeading"><span style="">格式:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
static inline int qry_present(struct map_info *map, __u32 base,</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
struct cfi_private *cfi)</span>
</p>
<p class="MsoIndexHeading"><span style="">注释:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">/* check for QRY, or search for jedec id.</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
in: interleave,type,mode</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
ret: table index, &lt;0 for error</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span></span>
*/</span>
<span lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoIndexHeading"><span style="">功能:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">检查</span>
<span lang="EN-US">QRY</span>
<span style="">,</span>
</p>
<p class="MsoIndexHeading"><span style="">说明:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">读出从</span>
<span lang="EN-US">0x10</span>
<span style="">开始的三个字节,如果为</span>
<span lang="EN-US">”QRY”</span>
<span style="">,则说明是</span>
<span lang="EN-US">CFI</span>
<span style="">接口的</span>
<span lang="EN-US">MTD</span>
</p>
<p class="MsoIndexHeading"><span style="">参数:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
map</span>
<span style="">:芯片信息</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
base</span>
<span style="">:基地址</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
cfi</span>
<span style="">:</span>
<span lang="EN-US">CFI</span>
<span style="">私有信息</span>
</p>
<p class="MsoIndexHeading"><span style="">返回:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">成功:返回</span>
<span lang="EN-US">1</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">失败:返回</span>
<span lang="EN-US">0</span>
</p>
<p class="MsoIndexHeading"><span style="">调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">被调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
cfi_probe_chip()</span>
</p>
<p class="MsoIndexHeading"><span style="">源代码:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">{</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
int osf = cfi-&gt;interleave * cfi-&gt;device_type;<span> </span>
// scale factor</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (cfi_read(map,base+osf*0x10)==cfi_build_cmd('Q',map,cfi) &amp;&amp;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span> </span>
cfi_read(map,base+osf*0x11)==cfi_build_cmd('R',map,cfi) &amp;&amp;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span> </span>
cfi_read(map,base+osf*0x12)==cfi_build_cmd('Y',map,cfi))</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return 1;<span> </span>
// ok !</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return 0; <span> </span>
// nothing found</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">}</span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862318"><span lang="EN-US">cfi_chip_setup</span>
</a>
</p>
<p class="MsoIndexHeading"><span style="">格式:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
static int cfi_chip_setup(struct map_info *map, </span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span> </span>
struct cfi_private *cfi)</span>
</p>
<p class="MsoIndexHeading"><span style="">注释:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">功能:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">设置</span>
<span lang="EN-US">cfi_private</span>
<span style="">结构变量</span>
<span lang="EN-US">cfi</span>
<span style="">的成员</span>
<span lang="EN-US">cfiq</span>
<span style="">(</span>
<span lang="EN-US">cfi_ident</span>
<span style="">结构)</span>
</p>
<p class="MsoIndexHeading"><span style="">说明:</span>
</p>
<p class="MsoNormal" style=""><span lang="EN-US">1.<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal;'> </span>
</span>
<span style="">读取器件可擦除块区域个数</span>
</p>
<p class="MsoNormal" style=""><span lang="EN-US">2.<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal;'> </span>
</span>
<span style="">分配并清零内存块</span>
</p>
<p class="MsoNormal" style=""><span lang="EN-US">3.<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal;'> </span>
</span>
<span style="">调用</span>
<span lang="EN-US">cfi_read_query()</span>
<span style="">读取</span>
<span lang="EN-US">CFI</span>
<span style="">数据结构</span>
<span lang="EN-US">cfi_ident</span>
</p>
<p class="MsoIndexHeading"><span style="">参数:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
map</span>
<span style="">:芯片信息</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
cfi</span>
<span style="">:被设置的</span>
<span lang="EN-US">cfi_private</span>
<span style="">结构</span>
</p>
<p class="MsoIndexHeading"><span style="">返回:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">成功:返回</span>
<span lang="EN-US">1</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">失败:返回</span>
<span lang="EN-US">0</span>
</p>
<p class="MsoIndexHeading"><span style="">调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">被调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
cfi_chip_probe()</span>
</p>
<p class="MsoIndexHeading"><span style="">源代码:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">{</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
int ofs_factor = cfi-&gt;interleave*cfi-&gt;device_type;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
__u32 base = 0;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
int num_erase_regions = cfi_read_query(map, base + (0x10 + 28)*ofs_factor);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
int i;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">#ifdef DEBUG_CFI</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
printk("Number of erase regions: %d/n", num_erase_regions);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">#endif</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (!num_erase_regions)</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return 0;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
cfi-&gt;cfiq = kmalloc(sizeof(struct cfi_ident) + num_erase_regions * 4, GFP_KERNEL);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (!cfi-&gt;cfiq) {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
printk(KERN_WARNING "%s: kmalloc failed for CFI ident structure/n", map-&gt;name);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return 0;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
memset(cfi-&gt;cfiq,0,sizeof(struct cfi_ident));<span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
cfi-&gt;cfi_mode = 1;<span> </span>
</span>
<span lang="EN-US">//JEDEC</span>
<span style="">仿真模式</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
cfi-&gt;fast_prog=1;<span> </span>
/* CFI supports fast programming */</span>
<span lang="EN-US">//CFI</span>
<span style="">支持</span>
<span lang="EN-US">Fast Program</span>
<span style="">模式</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
/* Read the CFI info structure */</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
for (i=0; i&lt;(sizeof(struct cfi_ident) + num_erase_regions * 4); i++) {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
((unsigned char *)cfi-&gt;cfiq)[i] = cfi_read_query(map,base + (0x10 + i)*ofs_factor);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
/* Do any necessary byteswapping */</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
cfi-&gt;cfiq-&gt;P_ID = le16_to_cpu(cfi-&gt;cfiq-&gt;P_ID);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
cfi-&gt;cfiq-&gt;P_ADR = le16_to_cpu(cfi-&gt;cfiq-&gt;P_ADR);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
cfi-&gt;cfiq-&gt;A_ID = le16_to_cpu(cfi-&gt;cfiq-&gt;A_ID);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
cfi-&gt;cfiq-&gt;A_ADR = le16_to_cpu(cfi-&gt;cfiq-&gt;A_ADR);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
cfi-&gt;cfiq-&gt;InterfaceDesc = le16_to_cpu(cfi-&gt;cfiq-&gt;InterfaceDesc);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
cfi-&gt;cfiq-&gt;MaxBufWriteSize = le16_to_cpu(cfi-&gt;cfiq-&gt;MaxBufWriteSize);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">#ifdef DEBUG_CFI</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
/* Dump the information therein */</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
print_cfi_ident(cfi-&gt;cfiq);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">#endif</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
for (i=0; i&lt;cfi-&gt;cfiq-&gt;NumEraseRegions; i++) {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
cfi-&gt;cfiq-&gt;EraseRegionInfo[i] = le32_to_cpu(cfi-&gt;cfiq-&gt;EraseRegionInfo[i]);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">#ifdef DEBUG_CFI<span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
printk("<span> </span>
Erase Region #%d: BlockSize 0x%4.4X bytes, %d blocks/n",</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span> </span>
i, (cfi-&gt;cfiq-&gt;EraseRegionInfo[i] &gt;&gt; &amp; ~0xff, </span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span> </span>
(cfi-&gt;cfiq-&gt;EraseRegionInfo[i] &amp; 0xffff) + 1);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">#endif</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
/* Put it back into Read Mode */</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
cfi_send_gen_cmd(0xF0, 0, base, map, cfi, cfi-&gt;device_type, NULL);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return 1;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">}</span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<h5>
<a name="_Toc7862319"><span lang="EN-US">jedec_probe.c</span>
</a>
</h5>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">“jedec_probe”</span>
<span style="">型芯片的探测程序,主要由</span>
<span lang="EN-US">jedec_probe()</span>
<span style="">、</span>
<span lang="EN-US">jedec_probe_chip()</span>
<span style="">、</span>
<span lang="EN-US">cfi_jedec_setup()</span>
<span style="">、</span>
<span lang="EN-US">jedec_probe_init()</span>
<span style="">和</span>
<span lang="EN-US">jedec_probe_exit()</span>
<span style="">这几个函数组成。</span>
</p>
<p class="MsoNormal" style="text-indent: 21pt;"><strong><span lang="EN-US">jedec_probe()</span>
</strong>
<span style="">是</span>
<span lang="EN-US">“jedec_probe”</span>
<span style="">类型芯片的探测程序,它调用通用探测程序</span>
<strong><span lang="EN-US">mtd_do_chip_probe()</span>
</strong>
<span style="">,并将</span>
<strong><span lang="EN-US">jedec_chip_probe</span>
</strong>
<span style="">作为参数传递给</span>
<span lang="EN-US">mtd_do_chip_probe()</span>
<span style="">,</span>
<span lang="EN-US">mtd_do_chip_probe()</span>
<span style="">将间接调用</span>
<span lang="EN-US">jedec_chip_probe</span>
<span style="">的成员函数</span>
<strong><span lang="EN-US">jedec_probe_chip()</span>
</strong>
<span style="">。</span>
<span lang="EN-US">jedec_probe()</span>
<span style="">注册在</span>
<span lang="EN-US">“jedec_probe”</span>
<span style="">芯片的驱动器</span>
<strong><span lang="EN-US">jedec_chipdrv</span>
</strong>
<span style="">中。</span>
</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">jedec_probe_chip()</span>
<span style="">调用</span>
<strong><span lang="EN-US">cfi_jedec_setup()</span>
</strong>
<span style="">初始化</span>
<span lang="EN-US">cfi_private</span>
<span style="">结构,</span>
<span lang="EN-US">cfi_jedec_setup()</span>
<span style="">根据</span>
</p>
<p class="MsoNormal" style="text-indent: 21pt;"><strong><span lang="EN-US">jedec_probe_init()</span>
</strong>
<span style="">和</span>
<strong><span lang="EN-US">jedec_probe_exit()</span>
</strong>
<span style="">是</span>
<span lang="EN-US">“cfi_prbe”</span>
<span style="">型芯片驱动器的注册程序和清除程序</span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862320"><span lang="EN-US">amd_flash_info</span>
</a>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">struct amd_flash_info {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
const __u16 mfr_id;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
const __u16 dev_id;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
const char *name;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
const int DevSize;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
const int InterfaceDesc;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
const int NumEraseRegions;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
const int CmdSet;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
const ulong regions[4];</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">};</span>
</p>
<p class="MsoNormal"><span lang="EN-US">AMD Flash</span>
<span style="">芯片的信息结构</span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862321"><span lang="EN-US">jedec_table</span>
</a>
</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="color: blue;" lang="EN-US">static const struct amd_flash_info jedec_table[] = {}</span>
</p>
<p class="MsoNormal"><span style="">包含各种</span>
<span lang="EN-US">jedec_probe</span>
<span style="">类型芯片信息的结构</span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862322"><span lang="EN-US">jedec_chipdrv</span>
</a>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">static struct mtd_chip_driver jedec_chipdrv = {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
probe: jedec_probe,<span> </span>
</span>
<span style="">芯片的探测程序</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
name: "jedec_probe",<span> </span>
</span>
<span style="">芯片名称</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
module: THIS_MODULE</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">};</span>
</p>
<p class="MsoNormal"><span lang="EN-US">“jedec_probe”</span>
<span style="">型芯片的驱动器</span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862323"><span lang="EN-US">jedec_probe_init</span>
</a>
</p>
<p class="MsoIndexHeading"><span style="">格式:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
int __init jedec_probe_init(void)</span>
</p>
<p class="MsoIndexHeading"><span style="">注释:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">功能:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">初始化</span>
<span lang="EN-US">“jedec_probe”</span>
<span style="">类型的</span>
<span lang="EN-US">MTD</span>
<span style="">芯片</span>
</p>
<p class="MsoIndexHeading"><span style="">说明:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">调用</span>
<span lang="EN-US">register_mtd_chip_driver()</span>
<span style="">将</span>
<span lang="EN-US">jedec_chipdrv</span>
<span style="">加入</span>
<span lang="EN-US">MTD</span>
<span style="">驱动器列表</span>
<span lang="EN-US">chip_drvs_list</span>
</p>
<p class="MsoIndexHeading"><span style="">参数:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">返回:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
0</span>
</p>
<p class="MsoIndexHeading"><span style="">调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
register_mtd_chip_driver()</span>
</p>
<p class="MsoIndexHeading"><span style="">被调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
__init</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
module_init</span>
</p>
<p class="MsoIndexHeading"><span style="">源代码:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">{</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
register_mtd_chip_driver(&amp;jedec_chipdrv);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return 0;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">}</span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862324"><span lang="EN-US">jedec_probe_exit</span>
</a>
</p>
<p class="MsoIndexHeading"><span style="">格式:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
static void __exit jedec_probe_exit(void)</span>
</p>
<p class="MsoIndexHeading"><span style="">注释:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">功能:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">清除</span>
<span lang="EN-US">“jedec_probe”MTD</span>
<span style="">芯片驱动</span>
</p>
<p class="MsoIndexHeading"><span style="">说明:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">调用</span>
<span lang="EN-US">unregister_mtd_chip_driver</span>
<span style="">从</span>
<span lang="EN-US">MTD</span>
<span style="">芯片驱动器列表</span>
<span lang="EN-US">chip_drvs_list</span>
<span style="">中删除</span>
<span lang="EN-US">jedec_chipdrv</span>
</p>
<p class="MsoIndexHeading"><span style="">参数:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">返回:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
unregister_chip_driver</span>
</p>
<p class="MsoIndexHeading"><span style="">被调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
__exit</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
module_exit</span>
</p>
<p class="MsoIndexHeading"><span style="">源代码:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">{</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
unregister_mtd_chip_driver(&amp;jedec_chipdrv);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">}</span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862325"><span lang="EN-US">jedec_probe</span>
</a>
</p>
<p class="MsoIndexHeading"><span style="">格式:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
struct mtd_info *jedec_probe(struct map_info *map)</span>
</p>
<p class="MsoIndexHeading"><span style="">注释:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">功能:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
“jedec_probe”</span>
<span style="">型</span>
<span lang="EN-US">MTD</span>
<span style="">芯片的探测程序</span>
</p>
<p class="MsoIndexHeading"><span style="">说明:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">调用通用探测程序</span>
<span lang="EN-US">mtd_do_chip_probe()</span>
<span style="">,并将</span>
<span lang="EN-US">jedec_chip_probe</span>
<span style="">作为参数传递给</span>
<span lang="EN-US">mtd_do_chp_probe()</span>
</p>
<p class="MsoIndexHeading"><span style="">参数:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
map</span>
<span style="">:芯片信息</span>
</p>
<p class="MsoIndexHeading"><span style="">返回:</span>
</p>
<p class="MsoIndex1"><span lang="EN-US"><span> </span>
MTD</span>
<span style="">设备信息结构</span>
<span lang="EN-US">mtd_info</span>
</p>
<p class="MsoIndexHeading"><span style="">调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
mtd_do_chip_probe()</span>
</p>
<p class="MsoIndexHeading"><span style="">被调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">注册在</span>
<span lang="EN-US">jedec_chipdrv</span>
<span style="">中,根据芯片类型被</span>
<span lang="EN-US">do_map_probe()</span>
<span style="">调用</span>
</p>
<p class="MsoIndexHeading"><span style="">源代码:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">{</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
/*</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span></span>
* Just use the generic probe stuff to call our CFI-specific</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span></span>
* chip_probe routine in all the possible permutations, etc.</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span></span>
*/</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return mtd_do_chip_probe(map, &amp;jedec_chip_probe);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">}</span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862326"><span lang="EN-US">jedec_probe_chip</span>
</a>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">static struct chip_probe jedec_chip_probe = {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
name: "JEDEC",</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
probe_chip: jedec_probe_chip</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">};</span>
</p>
<p class="MsoNormal"><span lang="EN-US">jedec_probe</span>
<span style="">传递给通用探测程序</span>
<span lang="EN-US">mtd_do_chip_probe</span>
<span style="">的参数</span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862327"><span lang="EN-US">jedec_probe_chip</span>
</a>
</p>
<p class="MsoIndexHeading"><span style="">格式:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
static int jedec_probe_chip(struct map_info *map, __u32 base,</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span> </span>
<span></span>
struct flchip *chips, struct cfi_private *cfi)</span>
</p>
<p class="MsoIndexHeading"><span style="">注释:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">功能:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
“jedec_probe”</span>
<span style="">类型</span>
<span lang="EN-US">MTD</span>
<span style="">芯片驱动程序</span>
</p>
<p class="MsoIndexHeading"><span style="">说明:</span>
<span style='font-family: "Times New Roman";' lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">主要工作是设置传进的</span>
<span lang="EN-US">cfi_private</span>
<span style="">型参数</span>
<span lang="EN-US">cfi</span>
<span style="">。</span>
</p>
<p class="MsoIndexHeading"><span style="">参数:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
FIXME</span>
</p>
<p class="MsoIndexHeading"><span style="">返回:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">成功:返回</span>
<span lang="EN-US">1</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">失败:返回</span>
<span lang="EN-US">0</span>
</p>
<p class="MsoIndexHeading"><span style="">调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
cfi_jedec_stup()</span>
</p>
<p class="MsoIndexHeading"><span style="">被调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">注册在</span>
<span lang="EN-US">jedec_chip_probe</span>
<span style="">中</span>
</p>
<p class="MsoIndexHeading"><span style="">源代码:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862328"><span lang="EN-US">cfi_jedec_setup</span>
</a>
</p>
<p class="MsoIndexHeading"><span style="">格式:</span>
</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="color: blue;" lang="EN-US">static int cfi_jedec_setup(struct cfi_private *p_cfi, int index)</span>
</p>
<p class="MsoIndexHeading"><span style="">注释:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">功能:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">根据</span>
<span lang="EN-US">index</span>
<span style="">从</span>
<span lang="EN-US">jedec_table</span>
<span style="">中选择对应的信息赋给</span>
<span lang="EN-US">p_cfi</span>
</p>
<p class="MsoIndexHeading"><span style="">说明:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">参数:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
p_cfi</span>
<span style="">:</span>
<span lang="EN-US">cfi_private</span>
<span style="">结构的</span>
<span lang="EN-US">CFI</span>
<span style="">私有信息</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
index</span>
<span style="">:芯片在</span>
<span lang="EN-US">jedec_table</span>
<span style="">中的索引</span>
</p>
<p class="MsoIndexHeading"><span style="">返回:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">成功:返回</span>
<span lang="EN-US">1</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">失败:返回</span>
<span lang="EN-US">0</span>
</p>
<p class="MsoIndexHeading"><span style="">调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">被调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
jedec_probe_chip()</span>
</p>
<p class="MsoIndexHeading"><span style="">源代码:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<h5>
<a name="_Toc7862329"><span lang="EN-US">gen_probe.c</span>
</a>
</h5>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="">通用芯片探测程序,由</span>
<span lang="EN-US">mtd_do_chip_probe()</span>
<span style="">、</span>
<span lang="EN-US">genprobe_ident_chips()</span>
<span style="">、</span>
<span lang="EN-US">genprobe_new_chip()</span>
<span style="">、</span>
<span lang="EN-US">check_cmd_set()</span>
<span style="">和</span>
<span lang="EN-US">cfi_cmdset_unknown()</span>
<span style="">组成</span>
</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">cfi_probe()</span>
<span style="">或</span>
<span lang="EN-US">jedec_probe()</span>
<span style="">调用</span>
<strong><span lang="EN-US">mtd_do_chip_probe()</span>
</strong>
<span style="">,</span>
<span lang="EN-US">mtd_do_chip_probe()</span>
<span style="">调用</span>
<strong><span lang="EN-US">genprobe_ident_chips()</span>
</strong>
<span style="">,</span>
<span lang="EN-US">genprobe_ident_chips()</span>
<span style="">调用</span>
<strong><span lang="EN-US">genprobe_new_chip()</span>
</strong>
<span style="">,</span>
<span lang="EN-US">genprobe_new_chip()</span>
<span style="">则调用</span>
<span lang="EN-US">mtd_do_chip_probe()</span>
<span style="">的参数</span>
<span lang="EN-US">chip_probe-&gt;probe_chip()</span>
<span style="">。</span>
</p>
<p class="MsoNormalIndent"><span lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862330"><span lang="EN-US">mtd_do_chip_probe</span>
</a>
</p>
<p class="MsoIndexHeading"><span style="">格式:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
struct mtd_info *mtd_do_chip_probe(struct map_info *map, struct chip_probe *cp)</span>
</p>
<p class="MsoIndexHeading"><span style="">注释:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">功能:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">根据</span>
<span lang="EN-US">MTD</span>
<span style="">芯片的信息</span>
<span lang="EN-US">map</span>
<span style="">和参数</span>
<span lang="EN-US">cp</span>
<span style="">返回</span>
<span lang="EN-US">MTD</span>
<span style="">设备</span>
<span lang="EN-US">mtd_info</span>
<span style="">结构</span>
</p>
<p class="MsoIndexHeading"><span style="">说明:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">获得</span>
<span lang="EN-US">cfi_private</span>
<span style="">结构</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">调用</span>
<span lang="EN-US">check_cmd_set()</span>
<span style="">返回</span>
<span lang="EN-US">mtd_info</span>
<span style="">结构</span>
</p>
<p class="MsoIndexHeading"><span style="">参数:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
map</span>
<span style="">:</span>
<span lang="EN-US">MTD</span>
<span style="">芯片信息</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
cp</span>
<span style="">:由</span>
<span lang="EN-US">cfi_probe()</span>
<span style="">或</span>
<span lang="EN-US">jedec_probe()</span>
<span style="">传进来的信息</span>
</p>
<p class="MsoIndexHeading"><span style="">返回:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
MTD</span>
<span style="">设备信息</span>
</p>
<p class="MsoIndexHeading"><span style="">调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
genprobe_ident_chips()</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
check_cmd_set()</span>
</p>
<p class="MsoIndexHeading"><span style="">被调用:</span>
<span style='font-family: "Times New Roman";' lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
cfi_probe()</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
jedec_probe()</span>
</p>
<p class="MsoIndexHeading"><span style="">源代码:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">{</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
struct mtd_info *mtd = NULL;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
struct cfi_private *cfi;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
/* First probe the map to see if we have CFI stuff there. */</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
cfi = genprobe_ident_chips(map, cp);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (!cfi)</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return NULL;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
map-&gt;fldrv_priv = cfi;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
/* OK we liked it. Now find a driver for the command set it talks */</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
mtd = check_cmd_set(map, 1); /* First the primary cmdset */</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (!mtd)</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
mtd = check_cmd_set(map, 0); /* Then the secondary */</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (mtd)</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return mtd;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
printk(KERN_WARNING"cfi_probe: No supported Vendor Command Set found/n");</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
kfree(cfi-&gt;cfiq);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
kfree(cfi);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
map-&gt;fldrv_priv = NULL;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return NULL;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">}</span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862331"><span lang="EN-US">genprobe_ident_chips</span>
</a>
</p>
<p class="MsoIndexHeading"><span style="">格式:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
struct cfi_private *genprobe_ident_chips(struct map_info *map, struct chip_probe *cp)</span>
</p>
<p class="MsoIndexHeading"><span style="">注释:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">功能:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">生成</span>
<span lang="EN-US">cfi_private</span>
<span style="">结构并返回</span>
</p>
<p class="MsoIndexHeading"><span style="">说明:</span>
</p>
<p class="MsoNormal" style=""><span lang="EN-US">1.<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal;'> </span>
</span>
<span style="">调用</span>
<span lang="EN-US">genprobe_new_chip</span>
<span style="">搜索第一块</span>
<span lang="EN-US">flash</span>
<span style="">芯片</span>
</p>
<p class="MsoNormal" style=""><span lang="EN-US">2.<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal;'> </span>
</span>
<span style="">设置</span>
<span lang="EN-US">cfi.chipshift</span>
<span style="">,并将</span>
<span lang="EN-US">cfi.numchips</span>
<span style="">设置为</span>
<span lang="EN-US">1</span>
</p>
<p class="MsoNormal" style=""><span lang="EN-US">3.<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal;'> </span>
</span>
<span style="">循环调用</span>
<span lang="EN-US">cp-&gt;probe_chip()</span>
<span style="">搜索所有的</span>
<span lang="EN-US">flash</span>
<span style="">芯片</span>
</p>
<p class="MsoIndexHeading"><span style="">参数:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
map</span>
<span style="">:芯片信息</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
cp</span>
<span style="">:</span>
<span lang="EN-US">chip_probe</span>
<span style="">结构参数</span>
</p>
<p class="MsoIndexHeading"><span style="">返回:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
cfi_private</span>
<span style="">结构</span>
</p>
<p class="MsoIndexHeading"><span style="">调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
genprobe_new_chip()</span>
</p>
<p class="MsoIndexHeading"><span style="">被调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
mtd_do_chip_probe()</span>
</p>
<p class="MsoIndexHeading"><span style="">源代码:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862332"><span lang="EN-US">genprobe_new_chip</span>
</a>
</p>
<p class="MsoIndexHeading"><span style="">格式:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
static int genprobe_new_chip(struct map_info *map, struct chip_probe *cp,</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span> </span>
struct cfi_private *cfi)</span>
</p>
<p class="MsoIndexHeading"><span style="">注释:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">功能:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">设置</span>
<span lang="EN-US">cfi</span>
</p>
<p class="MsoIndexHeading"><span style="">说明:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">调用</span>
<span lang="EN-US">cp-&gt;probe_chip()</span>
</p>
<p class="MsoIndexHeading"><span style="">参数:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
map</span>
<span style="">:芯片信息</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
cp</span>
<span style="">:</span>
<span lang="EN-US">chip_probe</span>
<span style="">结构参数</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
cfi</span>
<span style="">:被设置的</span>
<span lang="EN-US">cfi_private</span>
<span style="">结构</span>
</p>
<p class="MsoIndexHeading"><span style="">返回:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">成功:返回</span>
<span lang="EN-US">1</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">失败:返回</span>
<span lang="EN-US">0</span>
</p>
<p class="MsoIndexHeading"><span style="">调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
cfi-&gt; probe_chip()</span>
</p>
<p class="MsoIndexHeading"><span style="">被调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
genprobe_ident_chips()</span>
</p>
<p class="MsoIndexHeading"><span style="">源代码:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862333"><span lang="EN-US">check_cmd_set</span>
</a>
</p>
<p class="MsoIndexHeading"><span style="">格式:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
static struct mtd_info *check_cmd_set(struct map_info *map, int primary)</span>
</p>
<p class="MsoIndexHeading"><span style="">注释:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">功能:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">根据</span>
<span lang="EN-US">map_info</span>
<span style="">中的厂商信息调用不同的命令集</span>
</p>
<p class="MsoIndexHeading"><span style="">说明:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">根据厂商类型调用两个不同的命令集,</span>
<span lang="EN-US">cfi_cmdset_0001()</span>
<span style="">和</span>
<span lang="EN-US">cfi_cmdset_0002()</span>
<span style="">,如果符合的类型没有则调用</span>
<span lang="EN-US">cfi_cmdset_unkown</span>
</p>
<p class="MsoIndexHeading"><span style="">参数:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
map</span>
<span style="">:</span>
<span lang="EN-US">MTD</span>
<span style="">芯片信息</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
primary</span>
<span style="">:如果取</span>
<span lang="EN-US">1</span>
<span style="">,则芯片厂商信息为</span>
<span lang="EN-US">map</span>
<span style="">中的</span>
<span lang="EN-US">primary</span>
<span style="">,否则为</span>
<span lang="EN-US">auxillary</span>
</p>
<p class="MsoIndexHeading"><span style="">返回:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
MTD</span>
<span style="">设备信息</span>
<span lang="EN-US">mtd_info</span>
</p>
<p class="MsoIndexHeading"><span style="">调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
cfi_cmdset_0001()</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
cfi_cmdset_0002()</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
cfi_cmdset_unknown()</span>
</p>
<p class="MsoIndexHeading"><span style="">被调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
mtd_do_chip_probe()</span>
</p>
<p class="MsoIndexHeading"><span style="">源代码:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">{</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
struct cfi_private *cfi = map-&gt;fldrv_priv;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
__u16 type = primary?cfi-&gt;cfiq-&gt;P_ID:cfi-&gt;cfiq-&gt;A_ID;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (type == P_ID_NONE || type == P_ID_RESERVED)</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return NULL;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
switch(type){</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
/* Urgh. Ifdefs. The version with weak symbols was</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span></span>
* _much_ nicer. Shame it didn't seem to work on</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span></span>
* anything but x86, really.</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span></span>
* But we can't rely in inter_module_get() because</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span></span>
* that'd mean we depend on link order.</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span></span>
*/</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">#ifdef CONFIG_MTD_CFI_INTELEXT</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
case 0x0001:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
case 0x0003:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return cfi_cmdset_0001(map, primary);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">#endif</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">#ifdef CONFIG_MTD_CFI_AMDSTD</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
case 0x0002:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return cfi_cmdset_0002(map, primary);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">#endif</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return cfi_cmdset_unknown(map, primary);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">}</span>
</p>
<p class="MsoNormal"><span lang="EN-US"></span>
</p>
<p class="MsoHeading7"><a name="_Toc7862334"><span lang="EN-US">cfi_cmdset_unkown</span>
</a>
</p>
<p class="MsoIndexHeading"><span style="">格式:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
static inline struct mtd_info *cfi_cmdset_unknown(struct map_info *map, int primary)</span>
</p>
<p class="MsoIndexHeading"><span style="">注释:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">功能:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">调用未知类型的命令集</span>
</p>
<p class="MsoIndexHeading"><span style="">说明:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">如果存在返回</span>
<span lang="EN-US">mtd_info</span>
<span style="">,如果不存在返回</span>
<span lang="EN-US">NULL</span>
</p>
<p class="MsoIndexHeading"><span style="">参数:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
map</span>
<span style="">:</span>
<span lang="EN-US">MTD</span>
<span style="">芯片信息</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
primary</span>
<span style="">:</span>
<span lang="EN-US">FIXME</span>
</p>
<p class="MsoIndexHeading"><span style="">返回:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">存在命令集:返回</span>
<span lang="EN-US">mtd_info</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">否则:返回</span>
<span lang="EN-US">NULL</span>
</p>
<p class="MsoIndexHeading"><span style="">调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
</span>
<span style="">无</span>
</p>
<p class="MsoIndexHeading"><span style="">被调用:</span>
</p>
<p class="MsoNormal"><span lang="EN-US"><span> </span>
check_cmd_set()</span>
</p>
<p class="MsoIndexHeading"><span style="">源代码:</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">{</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
struct cfi_private *cfi = map-&gt;fldrv_priv;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
__u16 type = primary?cfi-&gt;cfiq-&gt;P_ID:cfi-&gt;cfiq-&gt;A_ID;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">#if defined(CONFIG_MODULES) &amp;&amp; defined(HAVE_INTER_MODULE)</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
char probename[32];</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
cfi_cmdset_fn_t *probe_function;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
sprintf(probename, "cfi_cmdset_%4.4X", type);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
probe_function = inter_module_get_request(probename, probename);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
if (probe_function) {</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
struct mtd_info *mtd;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
mtd = (*probe_function)(map, primary);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
/* If it was happy, it'll have increased its own use count */</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
inter_module_put(probename);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return mtd;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
}</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">#endif</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
printk(KERN_NOTICE "Support for command set %04X not present/n",</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
<span> </span>
type);</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"></span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US"><span> </span>
return NULL;</span>
</p>
<p class="MsoNormal"><span style="color: blue;" lang="EN-US">}</span>
</p>
分享到:
评论

相关推荐

    linux MTD源码分析

    用于实现嵌入式linux系统构建的MTD驱动部分,源代码分析,非常有意义的。

    linux MTD源码学习报告.doc

    linux MTD源码学习报告.doc mtd源代码分析

    Linux MTD源代码分析

    Linux MTD源代码分析 Linux MTD源代码分析

    linuxMTD源代码分析

    Jim Zeus经典的mtd源码分析,网页版看起来比较舒服:)

    雷达分析与设计MATLAB源码

    《雷达分析与设计》课本相关MATLAB仿真源码。 涵盖阵列信号处理、杂波处理、脉冲压缩、匹配滤波、MTD、等多种信号处理方法。资源众多

    雷达信号CFAR处理-MATLAB源码

    【资源内容】利用MATLAB软件分析了回波信号的脉压、MTD、CFAR(重点)处理内容。可以仿真任意多目标。另附PDF文件详细解释CFAR实现过程。 【适应对象】雷达专业、信号处理专业学生。 【算法说明】脉压部分采用FFT/...

    郭天祥ARM9视频教程(第13和20讲均可观看).docx

    2. MTD设备驱动分析 3. LCD驱动,音频驱动简介 4. 网络设备驱动分析 第九部分 QT图形界面开发 第二十一讲 QT及Qtopia介绍 1. 嵌入式GUI简介 2. Qt概述,Qt/X11的安装(Qt-4.5.3) 3. Qtopia概述 第二十二讲 Qt在ARM...

    Android技术内幕.系统卷(扫描版)

    1.1 深入认识android /2 1.1.1 android的系统构架 /2 1.1.2 android的初始化流程 /5 1.1.3 各个层次之间的相互关系 /8 1.1.4 android系统开发(移植)和应用开发 /11 1.2 获取和编译android的源码 /13 1.2.1 环境...

    Android技术内幕.系统卷 pdf

    1.1 深入认识android /2 1.1.1 android的系统构架 /2 1.1.2 android的初始化流程 /5 1.1.3 各个层次之间的相互关系 /8 1.1.4 android系统开发(移植)和应用开发 /11 1.2 获取和编译android的源码 /13 1.2.1 ...

    Android技术内幕.系统卷

    第5章全面地剖析了Android硬件设备驱动(显示、视频、音频、MTD、Event、蓝牙、WLAN等)的工作原理和实现,掌握这部分内容即可修改和编写基于Android的设备驱动程序;第6章深刻阐述了Android原生库的原理及实现,...

    Android技术内幕:系统卷.pdf 详细书签

    第5章全面地剖析了Android硬件设备驱动(显示、视频、音频、MTD、Event、蓝牙、WLAN等)的工作原理和实现,掌握这部分内容即可修改和编写基于Android的设备驱动程序;第6章深刻阐述了Android原生库的原理及实现,...

    Linux 2.6.24 内核注解

    增加了mtd层的注解,顺带引出了block文件夹中的注解 若代码和头文件中注解有不一致的,以头文件的注解为准, 因为都是一边看一边加注的,经常会出现第一次理解不对的情况,而后的修改,再追溯到最初的位置,工作量...

    脉冲多普勒雷达信号处理MATLAB源码

    仿真内容: 仿真脉冲多卜勒雷达的信号处理。设脉冲宽度为各学生学号末两位数,单位为μs,重复周期为200μs,雷达载频为10GHz,输入噪声为高斯白噪声。目标模拟分单目标和双目标...2021 11 12:脉压增益分析的BUG已修复

    LFM脉冲雷达信号处理流程仿真MATLAB源码

    仿真内容: 仿真线性调频脉冲雷达的信号处理。设线性调频带宽为各学生学号末两位数,单位为MHz,时宽为200μs,占空比10%,雷达载频为10GHz,输入噪声为高斯白噪声。...2021 11 12:脉压增益分析BUG已修复

    uboott移植实验手册及技术文档

    (2)进入 U-Boot源码目录 #cd u-boot-1.3.1 (3)创建自己的开发板: #cd board #cp smdk2410 fs2410 –a #cd fs2410 #mv smdk2410.c fs2410.c #vi Makefile (将 smdk2410修改为 fs2410) #cd ../../...

    LINUX系统开发技术详解---基于ARM

    ║2 嵌入式系统开发技术详解——基于ARM 3.1 Linux 常用工具.............................................................................................................. 28 3.1.1 Shell简介..................

Global site tag (gtag.js) - Google Analytics