第1章 关于本教程
本书主要是针对从事嵌入式软件开发人员编写的,而嵌入式开发主要有两个方向,一个是从事嵌入式设备上应用程序的开发;另一个是驱动程序的开发,本书的方向更加侧重于驱动程序的开发。当然,本书对于从事应用程序的开发人员也是不错的参考,通过它可以很好地了解一个嵌入式设备是如何协调各种硬件一起工作的,对更好地进行应用层的开发是很有意义的。在一个具体的嵌入式产品中,上层软件主要是指具体的应用类程序,如可以在某一特定的硬件平台上开发一个游戏、开发一台照相机、开发一台录像机、开发一款E-mail收发程序等,这些具体的应用都非常直观地展现给了用户。而驱动程序的开发主要是针对硬件层面的设备进行软件开发,具体而言就是,为某一具体的硬件编写驱动程序,让这些硬件外设可以在特定的硬件平台上正确、稳定地工作,如使用手机上的照相机、LCD显示屏、键盘以及MP3、MP4多媒体功能,要使这些设备工作,就需要先给照相机(Camera Sensor)、LCD、多媒体等这些硬件编写驱动程序,让它们工作起来,然后结合上层的相关应用程序才组成了一个完整的应用程序。
本教程的潜在读者对象是谁?本教程主要是针对想从事嵌入式设备的驱动开发人员的。而具体到什么是驱动开发,简单意义上就是给某个设备编写驱动程序,并使之融合到整个系统中来。希望读完本书能让您对于嵌入式开发有一个全新的认识。
下面我们以一部手机为例来看一下驱动开发的工作内容是什么。我们知道一部手机包括很多的元器件,如屏幕(LCD)、按键、触摸屏、耳机、收音机、照相机、录像机、录音机、T卡、麦克风(microphone)等。这些都是可以直观看到和触摸到的,而在手机的内部还有ARM CPU、Memory(内存系统)、Flash(NAND Flash 或者Nor Flash存储系统),电源管理单元,处理射频、音频的DSP、USB、串口等。所有这些元件依靠印刷电路板(PCB)连接起来,然后通过一款巨大的软件工程把这些设备组织并管理起来,最后就变成了使用的手机了。所以说,软件是灵魂,硬件是躯体,两者缺一不可。
设备驱动开发的工作就是为这些设备编写程序,让这些设备准确地工作,并融入到手机系统中来,例如LCD,就要为不同厂商的LCD编写适合某个手机开发平台的驱动程序,这样不同的LCD才能工作在不同的平台上,其他设备类似,但是驱动的工作并不局限于此。对于整个系统架构理解最深的也是驱动开发人员,只有对整个系统有透彻的、完整的理解才能开发出一个健全、健壮的系统。
本教程主要内容包括手机驱动开发设计中用到的常用外设的驱动程序的开发,包括如何写这些驱动程序,如何去调试这些设备,出了问题如何进行跟踪定位。我们知道驱动程序的调试不仅仅是软件方面的,同时也会涉及硬件方面的内容,这就要求我们具有一定的硬件知识,最少也能读懂硬件原理图,能够根据原理图编写程序,能够拿起万用表、示波器这些常用硬件信号电性能测量设备进行硬件的调试。往往一个设备的成功运行都是建立在反复的测试和测量的基础上完成的,特别是设备间联调的时候,例如,手机系统要外加一个蓝牙、一个WIFI、一个CMMB数字电视等。这个时候就需要我们和供应商的FAE(Field Application Engineer现场支持工程师)进行联调,这种联调工作是对我们嵌入式知识体系的一个综合考量,而往往这个时候板子还没有做好,只能通过飞线进行调试,所以调试环境恶劣,那么如何开始进行调试呢?这个疑问我们会在后面针对每一类设备进行详细讲解。
1.1 本书内容的组织
本书从嵌入式开发入门的角度进行阐述,首先假设读者具有一定的C语言基础,一些嵌入式方面的知识。在第1章对什么是驱动开发进行了阐述,读者可以对驱动开发有一个基本的概念上的认识。第2章讲述了什么是嵌入式开发以及学习嵌入式开发需要掌握的基本知识及要求。第3章建立自己的Windows系统下的交叉编译环境,让读者可以在Windows下进行交叉编译。第4章阐述该交叉编译环境的工作原理及使用方法。第5章和第6章主要阐述ARM CPU的工作机制以及从开发者的角度是如何看待CPU的。第7章使用很小的篇幅阐述了ARM的汇编知识,达到认识基本ARM指令即可的要求。第8章阐述ARM的体系结构及各种关于ARM CPU使用的相关知识。第9章阐述硬件通信信号和时序的概念,让读者了解硬件是如何通过信号进行通信的。第10章阐述GPIO的配置及使用。第11章阐述ARM CPU中断配置及其使用。第12章阐述如何让LCD工作起来。第13章阐述NAND Flash的使用,其中包括了16bit和8bit Flash的使用。第14章结合时序图阐述了IIC接口的原理及使用。第15章也是结合时序图阐述了SPI接口的原理及使用。第16章阐述了EBI总线的使用。第17章阐述了LAUTERBACH公司的TRACE32的使用。第18章通过举例阐述了如何读懂硬件原理图。通过这些章节可以让读者了解一个完整的嵌入式系统开发需要具备的各个知识点,可以沿着这些知识点进行更深入的学习相关开发技术。