Marvell-linux研究—如何超越硬件的鸿沟(讨论)
转载时请注明出处和作者联系方式:http://blog.csdn.net/absurd
作者联系方式:李先静 <xianjimli at hotmail dot com>
更新时间:2007-6-26
这篇BLOG本是计划外的,在这个系列开始的时候,虽然我认为硬件知识在开发驱动时有些帮助,但还不至于成为主要难点,所以并没有提及。事后一些热心网友为此提出异议,甚至讥笑我不懂硬件,这才引起我的反思。我承认我忽视了硬件知识在开发驱动中所起的重要作用,但是我仍然不明白,哪些硬件知识或者硬件特性,如此之难以至于成为开发驱动不可逾越的鸿沟?为此,希望大家交流一下,不管是新手还是高手都非常欢迎。
在前两篇BLOG中,还没有说到三句话,就被人鄙视不懂硬件,实在让我羞愧难当。好歹也学过四年的机械电子,如果软件对应的硬件是电子,电子对应的硬件无疑是机械,机械电子可以称得上硬件中的硬件了。现在大多数同学都在做模具,在机械设计和电路设计方面混得不错,纯粹靠写程序为生的,班上除了我之外可能没有第二个了。电路分析、模拟电路、数字电路、微机原理、信号处理、自动控制和机器人等课程,我每门考试都在前五名,现在提到戴维南等效定律,提到卡诺图化简,提到组合逻辑和时序逻辑,我仍然有较深的印象。在大学里电子制件时,我也是两个班第一个把收音机组装成功的。
现在做软件时,反而被人讥笑为硬件盲岂不冤哉,有人说花十年时间才学会写程序,难道为了做驱动程序,还得花时间十年去学硬件?呵,如果是那样,我还是不要再碰驱动好了。我承认我不会电路设计,因为我是个喜欢精确的人,当我发现复杂的电路不能用精确的公式描述时,让我非常难受,最终我彻底的放弃了硬件设计而转向软件开发,毕业后的这六七年时间里没有怎么碰过硬件,冷静下来一想,被人骂也是有道理的。
算了,我也不说驱动开发难或者不难了,那种口水仗吵得也没有什么意思。今天,我们讨论一下开发驱动到底需要哪些硬件知识,应该了解外设的那些硬件特性。我是门外汉,愿意洗耳恭听大家的高见,我相信这是一个本质性问题,讨论清楚后,可以让众多新手少走弯路,让所有后来者受益。
为了抛砖引玉,我先说说自己的一些想法,如果大家觉得不妥就只管批,而不必留情面。
正如一些朋友所说,在bootloader都起不来时,很难确定这是硬件的问题,还是软件的问题。这让人非常头痛,甚至是毫无头绪的,这时如果懂得硬件知识会有些帮助,可以借助万用表、示波器和逻辑分析器去定位硬件的错误,但那是不是有越俎代庖之嫌呢?如果是调试硬件问题,让硬件工程师学会使用JTAG调试工具(如intel的xdb),学会一些基本的汇编语言,以此去调试硬件,是不是更方便一些呢?
关于程序调试,非独驱动程序调试困难,上层软件调试也一样困难,在上百万行的代码中,查找一个随机出现的BUG,查找一个死锁问题,决不比调试bootloader更简单。很难去衡量调试的困难程度,它与调试者对系统的熟悉程度,调试经验,分析能力,甚至和运气都有关。我做过两年专职的调试工作,我承认那不是什么好玩工作,上次听说gigix三个月没有用过调试器了,真让人羡慕死了。
关于硬件特性,在datasheet里会有绝大部分的描述,反复阅读datasheet是值得的。在网上,有很多前人写的经验总结,平时应该多浏览一下,在要用到时再仔细阅读。还有一些是没有书面记录的,它们存在于高手的脑子里,多认识一些高手,多和他们交流。这些东西只是知与不知的问题,就像一层窗口纸,不知道时难度为100%,捅破了难度就变为0%了。
关于经验,我觉得做驱动开发经验非常重要,有的问题,如果有经验一眼就可以看出,可以省去不少调试时间。经验的积累,需要时间,与上层软件开发相比,这个过程更为痛苦。
手机的主要硬件有:CPU(AP)、内存、Flash(nand/nor) 、电源管理、LCD、触摸屏、背光、键盘、摄像头、充电器、USB外设、SD卡、马达、指示灯、MIC、Speaker、蓝牙、红外、WLAN(如wifi)和模组(GSM/CDMA),加上数字电视和GPS等可选组件,如果了解它们全部的特性,对于调试硬件问题,肯定大有帮助,那确实非常困难,估计很少有人能够做到,但那样真的有必要吗?如果没有必要,单从做驱动为目标来看,到底需要学习哪些硬件知识,了解哪些硬件特性呢?
没有调查就没有发言权,以上只是我的主观想法,希望大家指正。
~~end~~