S3C2440 访问IDE硬盘,为何读回的数据都是0?

韦东山
深圳百问网科技有限公司企业官方账号
2007-10-19 12:33:02
平台:S32440,linux 2.6.22,
硬盘连线:
CPU的 nGCS1/nGCS2 - 硬盘CS0/CS1
CPU的 Addr3~1 - 硬盘DA2~0


在linux内核中调试硬盘未成功,转到U-Boot下使一个个地操作寄存器。
发现如下问题:
1. 设置硬盘的跳线,作为从盘
2. 直接读取硬盘的Device/Head寄存器(linux中称为IDE_SELECT_REG),值为0x68
3. 往硬盘的Device/Head寄存器中写入0xa0,再回读,值为0x68
4. 往硬盘的Device/Head寄存器中写入0xb0,再回读,值为0x00
这证明硬盘是可以被选中的,但是为什么它的值为0?正确的应该是0xb0。

我又做了一个实验:
1. 设置硬盘的跳线,作为主盘
2. 直接读取硬盘的Device/Head寄存器,值为0x00
3. 往硬盘的Device/Head寄存器中写入0xa0,再回读,值为0x00
4. 往硬盘的Device/Head寄存器中写入0xb0,再回读,值为0x00

我每根信号线都量过了,连接没问题。
请问,为什么读回的值是0呢?
我只有一个万用表,不能进行太复杂的测试。
...全文
280 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangling21908 2007-10-24
  • 打赏
  • 举报
回复
应该是硬件问题!
tb01412 2007-10-24
  • 打赏
  • 举报
回复
据LZ描述,估计是硬件上问题吧,也就是说从硬件上不支持这种大硬盘,可能大容量硬盘采用了一些其它的技术,而你的板子上没有相应的处理,你试一试相同牌子厂商最近生产的低容量硬盘(这种方式来排除是不是因为新技术的运用而导致不支持),你再试一试其它牌子的大容量硬盘(排除偶然因素)

最后你可以从这些硬盘的各种技术参数入手来进行问题定位.一般说来,硬盘的兼容性很好,因为其规格主要受ATA66/100/133等限制,其它方面都差不了多少,还有就是你要在内核硬盘驱动中找到你用大容量硬盘时,是在什么地方出现不能识别(用printk来输出信息看什么地方出现了问题),这样或许更容易定位问题
hefuhua 2007-10-23
  • 打赏
  • 举报
回复
没弄过这些..你上面的问题好像ATA100只是40g跟80g的区别..如果再试1个40g的也可以的话,还是怀疑接线问题,猜测40脚40芯的线刚刚够40g的数据访问..而80脚40芯的线是通过总线切换访问高40g的..

40脚40芯这些都不懂..帮不到你..
韦东山 2007-10-23
  • 打赏
  • 举报
回复
IDE接口有40根引脚,
所谓40脚80芯是指为了防止电磁干扰,增加了40根地线,实际上有效连接的还是40根线,它跟容量没关系。

跳线只是用来确定硬盘是主还是从,即是/dev/hda还是/dev/hdb,跟这没关系。

  • 打赏
  • 举报
回复
跳线???
韦东山 2007-10-22
  • 打赏
  • 举报
回复
我的内核是2.6.22.6,很高的版本了。
台式机是可以识别出这些硬盘的,PC linux多做了什么事?或者说BIOS有什么特殊的呢?
一度怀疑过是电磁干扰问题:这些不能识别的硬盘属于ATA100,规范上说要用40脚80芯的连线,
可是我用的是40脚40芯的线。于是我把总线频率降到25MHz,还是不行。但是,有一个也是ATA100
的硬盘,容量为40G,它是可以识别的。
另外,我接上光驱,可以识别。
没思路了。
hefuhua 2007-10-21
  • 打赏
  • 举报
回复
"日立120G的就不行,80G的三星3.5英寸的也"
去他网站上看看有没有linux驱动的支持,另外就是换高版本的内核,如现在的2.6.22.x的版本试试
韦东山 2007-10-20
  • 打赏
  • 举报
回复
有个怪现象,对于一些老硬盘,比如271M、40G的,可以说别;
但是对于日立120G的就不行,80G的三星3.5英寸的也无法识别。
请问可能原因是什么?
我说的说别是:识别出硬盘的型号。
hefuhua 2007-10-19
  • 打赏
  • 举报
回复
在内核中确定你的硬盘的型号和厂家是对应的或者兼容的..

4,465

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧