您的位置 首页 > 系统更新

linux驱动程序开发实例_linux驱动程序开发实例(第2版)

linux驱动程序开发实例_linux驱动程序开发实例(第2版)

       接下来,我将为大家解答有关linux驱动程序开发实例的问题,希望我的回答对大家有所帮助。现在,我们就开始探讨一下linux驱动程序开发实例的话题吧。

1.做linux嵌入式入门需要学什么

2.USB主机控制器规格及驱动结构?

3.电脑驱动程序的工作原理

4.嵌入式需要学习什么

5.很困惑,嵌入式,到底该怎么去学?

6.嵌入式底层软件开发的目录

linux驱动程序开发实例_linux驱动程序开发实例(第2版)

做linux嵌入式入门需要学什么

       嵌入式Linux开发往往是ARM+Linux路线,所以深入学习你可以尝试以下路线:

       (1) C语言是所有编程语言中的强者,单片机、DSP、类似ARM的种种芯片的编程都可以用C语言搞定),因此必须非常熟练的掌握。

       推荐书籍:谭浩强的C语言程序设计很不错,《The C Programming Language》 这本经典的教材是老外写的,也有中译版本。

       (2) 操作系统原理,是必需的,如果你是计算机专业毕业那也就无所谓了,如果是非计算机专业的就必须找一本比较浅显的计算机原理书籍看一看,把啥叫“进程”“线程”“系统调度”等等基本问题搞清楚。

       (3)Linux操作系统就是用C语言编写的,所以你也应该先学习下Linux方面的编程,只有你会应用了,才能近一步去了解其内核的精髓。

       推荐书籍:《UNIX环境高级编程》(第2版)

       (4) 了解ARM的架构,原理,以及其汇编指令,我们在嵌入式开发中,一般很少去写汇编,但是最起码的要求是能够看懂arm汇编。

       (5) 系统移植的时候,就需要你从最下层的bootloader开始,然后内核移植,文件系统移植等。而移植这部分对硬件的依赖是非常大的,其配置步骤也相对复杂,也没有太多详细资料。

       (6) 驱动开发

       linux驱动程序设计既是个极富有挑战性的领域,又是一个博大精深的内容。

       linux驱动程序设计本质是属于linux内核编程范畴的,因而是对linux内核和内核编程是有要求的。在学习前你要想了解linux内核的组成,因为每一部分要详细研究的话足够可以扩展成一本厚书。

       以上只不过是大概的框架,在实际的开发中还会涉及很多东西,比如:交叉编译、makefile、shell脚本等等,所以说学习嵌入式的周期较长,门槛较高,自学的话更是需要较强的学习能力和专业功底。只要能坚持下来一定会取得成功!

       华清远见的嵌入式专业教材比较专业,也很出名,高校图书馆以及外面书店都有卖,你可以去网上搜一下,买本看看,华清远见的网站和技术论坛上面也有很多嵌入式学习资料和入门视频教程都可以免费下载,而且更新的速度也很快,LZ没事可以去转转,相信对你会有帮助!

USB主机控制器规格及驱动结构?

       1.1 有哪些设备使用单片机或Linux

       所有的电子产品,所用技术都可以认为要么是单片机,要么是Linux;GUI方面主要是QT/Android,它们都是运行于Linux之上的。我们说的单片机不使用操作系统,但是使用单片机设备肯定远远超过Linux。很多人也是先学习单片机,从单片机进入电子工程师行业,日常生活中,有哪些产品使用单片机、Linux呢?下面举一些例子:

       我们设计一个产品时,是使用单片机还是Linux,取决于成本:硬件成本、软件成本、维护成本、升级成本。而不应该根据个人偏好来选择:我喜欢单片机,所以就排斥使用Linux;我喜欢Linux,就排斥使用单片机。为了有更多的选择,我们需要既懂单片机,又懂Linux。

1.2 在硬件操作上单片机和Linux是类似的

       以点灯为例,

       无论是单片机还是Linux,我们要做的事情都一样:

       看原理图,确定引脚是哪一个,确定它输出什么电平才可以

       看芯片手册,确定要怎么操作寄存器

       写程序

       但是,怎么编写程序,单片机和Linux有很大不同。

1.3 在单片机中点灯、使用LCD

       使用单片机开发程序时,我们一上来就写一个main函数,下面是一些简化的代码:

       LED程序里面的init_led、led_on、led_off函数是你一个人写的,爱取什么名就取什么名,爱怎么写就怎么写。

       LCD程序里的函数也是你写的,完全是自由发挥。

       很多单片机项目不是很复杂,2、3个人从上到下统统搞定,里面的函数大多时间是直接去读写寄存器。

       很多单片机项目严重依赖于硬件,换一个芯片后怎么办?重写一套代码呗。

       在单片机程序里,没有应用程序、驱动程序的概念,很可能一个人包揽了硬件设计、模块调试(或称之为驱动)、功能开发(或称之为应用)的全部活。

1.4 在Linux中点灯、使用LCD

       在Linux中,不允许应用开发人员直接去操作硬件,比如你想点个灯,不好意思,你无法直接访问寄存器;你需要通过驱动程序来访问寄存器。

       为什么?有几大原因:

       Linux系统中运行着众多程序,必须保证质量差的程序无法破坏系统:假设你写的程序比较烂,那我不能让你去随便访问寄存器,把系统搞崩溃了怎么办?你本意是去点灯,但是你看错了寄存器,你把电源关了怎么办?所以这些操作硬件的活,还是交给信得过的人来做吧:交给驱动工程师,他既懂硬件又懂软件。

       保证程序的可移植性:编写应用程序时,大家都使用统一的函数,以后换一个芯片时,应用程序不用变;只需要根据这个接口提供驱动程序就可以了。

       团队协作:使用Linux系统的项目一般比较大,术业有专攻,一个人不太可能从上到下都全部掌握。比如做人脸识别项目,有擅长做图像处理的,他可不管你要用多少种摄像头,有图像给他就可以。而多种摄像头的硬件操作方法各有不同,这些交给驱动程序工程师。

       所以,在Linux中应用程序和驱动程序是分开的。

       以LED、LCD程序为例,简化的代码如下

       请点击输入描述

       也许你已经大概猜出来了,应用程序怎么调用驱动程序?通过标准的接口:

       open:打开驱动程序。

       read/write:读、写数据。

       ioctl:传入各种参数,获得各种参数。

       mmap:内存映射,比如映射之后,应用程序可以直接读写LCD的显存。

       你看!从这些接口里,我们根本看不到寄存器的操作。底层的程序驱动会根据这些调用,去设置寄存器、操作硬件。

       所以,我高大上的应用工程师,干嘛苦哈哈地去看原理图、看在片手册、读写寄存器,搞不好还要去调试硬件BUG。这些脏活、累活就交给驱动工程师吧。客户的需求千变万化,我996时间都不够用了。

       我上懂软件、下懂硬件的驱动工程师,肯定不能把这么重要的活交给你去做了,把我的系统搞崩溃了怎么办。

       开玩笑、开玩笑、开玩笑的,有应用工程师、驱动工程师的优劣之分,大家都是为了做出产品。现在有一个趋势,一个任务从上到下你都需要懂,这就是所谓的全栈工程师。

       还是以LED为例,应用程序和驱动程序的协作如下图所示:

       在Linux中,“一切皆文件”,要访问某个硬件,也是要打开文件、读写文件。应用程序要根据标准的文件接口:open/read/write/ioctl/mmap等来访问驱动程序。

       既然如此,怎么写驱动程序呢?最简单的方法就是:APP要调用open来打开驱动程序,那驱动‘程序里就提供一个xxx_open函数来初始化硬件;APP要调用write来写数据,驱动程序里就提供一个xxx_write函数来接收数据并操作硬件。

       用xxx_open、xxx_write来构成一个驱动程序,这就是驱动框架。

       怎么实现这些xxx_open、xxx_write函数?我们要做的事情跟单片机是类似的,一样要去看电路图、看芯片手册,然后在这些函数里读写寄存器:这称为硬件操作。

       所以,Linux驱动程序= 驱动框架 + 硬件操作。

       有单片机基础的人,对硬件操作比较熟悉了,把重点放在驱动框架上就可以。

       高能预警:驱动框架可不简单,对于LED来说是简单,但是还有更复杂的驱动程序,它要考虑“通用”,这很要命。

第2章 嵌入式Linux快速入门

       这几天在群里跟学员聊天,有一位学员的学习方法很好:先观其广,再究其深。有时候要“不求甚解”,很多时候保持疑问先学下去,这些疑问就自然解决了。

       比如课程中涉及汇编知识,如果你要彻底弄清楚,你需要去学习《ARM架构与编程》;当你学完这本书,你的同学搞不好已经可以上手工作了。

2.1 短期的目标是什么

       我们先把学习目标定下来:快速了解嵌入式Linux开发的流程,知道要学什么,具备跟从业者交流的能力。

2.2 一个嵌入式Linux系统的组成

       下面我们用类比和逻辑推导出嵌入式Linux系统的组成,没错,“推导”。

       从上图可以知道:

       组成:嵌入式Linux系统= bootloader + linux内核 + 根文件系统(里面含有APP)。

       bootloader:它的目的是启动内核,去哪等读内核?读到哪里?去Flash等外设读内核,存到内存里去。所以需要有Flash里外设的驱动能力,为了调试方便还会有网络功能。所以,可以认为 booloader = 裸机集合,它就是一个复杂的单片机程序。

       Linux内核:Linux内核的最主要目的是去启动APP,APP保存在哪里?保存在“根文件系统”里。“根文件系统”又保存在哪里?在Flash、SD卡等设备里,甚至可能在网络上。所以Linux内核要有这些Flash、SD卡里设备的驱动能力。

       不仅如此,Linux内核还有进程调度能力、内存管理等功能。

       所以:Linux内核 = 驱动集合 + 进程调度 + 内存管理等。

2.3 要学习bootloader吗

       Bootloader有很多种,常用的叫u-boot。

       在实际工作中,对于u-boot基本上是修修改改,甚至不改。但是u-boot本身是很复杂的,比如为了便于调试,它支持网络功能;有些内核是保存在FAT32分区里,于是它要能解析FAT32分区,读FAT32分区的文件。

       花那么多精力去学习u-boot,但是工作中基本用不到,这对初学者很不友善。

       所以,对于初学者,我建议:理解u-boot的作用、会使用u-boot的命令,这就可以了。

       如果你的工作就是修改、完善bootloader,那么再去研究它吧。

2.4 要学习Linux内核、要学习驱动程序吗

       之前我们说过Linux内核 = 驱动集合 + 进程调度 + 内存管理等,如果要学习Linux内核,从驱动程序入手是一个好办法。

       但是人人都要学习Linux内核、人人都要学习Linux驱动吗?显然不是。

       作为初学者,懂几个简单的驱动程序,有利于工作交流;理解中断、进程、线程的概念,无论是对驱动开发、应用程序开发,都是很有好处的。

       所以对于初学者,建议前期只学习这几个驱动:LED、按键、中断。

       LED驱动程序:这是最简单的驱动程序。

       按键驱动程序:它也比较简单,从它引入“中断”。

       中断:从“中断”它可以引入:休眠-唤醒、进程/线程、POLL机制、异步通知等概念。这些概念无论是对驱动开发,还是对应用开发,都很重要。

       所以,对于初学者,我建议必须学习这几个驱动:LED、按键、中断。

       入门之后,如果你想从事内核开发、驱动开发,那么可以去钻研几个驱动程序(输入系统、I2C总线、SPI总线等),掌握若干个大型驱动程序后,你对内核的套路就有所了解了,再去研究其他部分(比如进程管理、文件系统)时你会发现套路是如此通用。

       摄像头(VL42)、声卡ALSA驱动是Linux中比较复杂的2类驱动,它们是很难的,如果工作与此相关再去研究。

2.5 要学习Linux应用程序吗?先学一些基础技能

       要学,即使以后你只想研究内核,一些基本的应用开发编写能力也是需要的:

       基本设备的访问,比如LCD、输入设备

       进程、线程、进程通信、线程同步与互斥

       休眠-唤醒、POLL机制、信号

       网络编程

       ①②③部分的知识,跟驱动有密切的关系,它们是相辅相承的。

       掌握了基本驱动开发能力、基本应用开发能力之后,在工作中你就可以跟别人友好沟通了,不至于一脸懵逼。

2.6 应用程序是怎么启动的?要了解一下根文件系统

       你辛辛苦苦写出了应用程序,怎么把它放到板子上,让它开机就自动启动?

       你写的程序,它依赖于哪些库,这些库放到板子上哪个目录?

       怎么做一个可升级的系统?即使升级中途断电了,也要保证程序至少还可以运行老的版本?

       这些都需要我们了解一下根文件系统。

       先了解一下init进程:它要读取配置文件,根据配置文件启动各个APP。

       了解了init进程,你就了解了根文件系统的组成,就可以随心所欲裁剪系统,为你的项目制作出最精简的系统。

第3章 学习方法3.1 先不要打破砂锅问到底

       嵌入式涉及的东西太多太杂了,如果心里没有主线,碰到什么都要去研究个透彻,最终反而忘记自己要学什么了。

       嵌入式涉及硬件知识、软件知识,软件里涉及汇编、ARM架构、C语言、Makefile、Shell;又分为bootloader、内核、驱动、基本的APP、GUI。

       比如我们会用到Makefile,了解它的基本规则,会用我们提供的Makefile就可以。

       不需要深入研究那些make函数,因为在工作中都有现成的Makefile给你使用,不需要自己去编写一套Makefile。何必花上好几天去深入研究它呢?

       比如我们会用到bootloader,难道又要花上几个月来深入研究u-boot吗?工作中基本不需要改u-boot,会用那几个命令就可以。

       甚至有些学员先去买本shell的书来学习shell命令,何必?我们在视频中用到什么命令,你不懂时再去百度一下这些命令就可以了。

       不要脱离初学者的主线:应用基础、驱动基础。有了这2个基础后,你想深入研究某部分时,再去花时间吧。

3.2 思路要清晰,不怕抄代码

       视频里的代码,请你一定要自己去写一次、写多次。为什么我现在写驱动那么熟?我2009年在华清远见上课时,

       每次上课我都要给学生写一次那些驱动,十几次下来闭着眼睛都知道内核的套路了。

       记不住那些函数?我也记不住,我都是去参考同类的驱动程序,这又不是闭卷考试。

       但是要理清楚思路,你写这个程序要完成什么功能、怎么实现这些功能?这个要弄清楚。

       有了思路后再写代码,不知道怎么写?没关系,看看视频,看看示例,然后关闭视频看看能否自己写出来。

3.3 对自己的方向很了解,我只能带你到这里了

       我的专长是操作系统,是快速地带领大家掌握一些项目开发的基础知识。

       如果你决定深入研究某方面时,我并不能带你多久。你要去看源码,去看这方面的专业书籍。

       比如想深入钻研内核的内存管理时,它有页表映射(你需要阅读ARM架构的手册)、SLAB分配器、vmalloc/malloc实现、mmap实现、缺页中断、父进程子进程之间的页面管理等等,内容非常多。有时候连书籍都没有,你需要直接啃代码。

       当你想从事某个行业时,就需要深入研究行业相关的知识。

       比如CAN总线,它可以写成一本书:CAN协议、CAN报文、Socket CAN、车身网络拓扑结构,CAN应用报文,CAN网络管理报文,CAN诊断报文。

       想做物联网网关,需要深入研究MQTT,MQTT协议相对简单,但是MQTT英文原版协议有130多页,中文版有近100页,是一本小书了。

       每个行业都有自己的业务逻辑,在掌握基本的编程能力之一,你需要结合具体的业务去深入学习。

电脑驱动程序的工作原理

       USB主机控制器有这些规格:OHCI (Open Host Controller Interface)、UHCI (Universal HostController Interface)、EHCI (Enhanced Host Controller Interface)和xHCI (eXtensible Host ControllerInterface)。OHCI驱动程序用来为非PC系统上以及带有SiS和ALi芯片组的PC主板上的USB芯片提供支持。UHCI驱动程序多用来为大多数其他PC主板(包括Intel和Via)上的USB芯片提供支持。EHCI由USB2.0规范所提出,它兼容于OHCI和UHCI。由于UHCI的硬件线路比OHCI简单,所以成本较低,但需要较复杂的驱动程序,CPU负荷稍重。xHCI,即可扩展的主机控制器接口是Intel公司开发的一个USB主机控制器接口,它目前主要是面向USB 3.0的,同时它也支持USB 2.0及以下的设备。

       1.主机控制器驱动

       在Linux内核中,用usb hed结构体描述USB主机控制器驱动,它包含USB主机控制器的“家务”信息、硬件资源、状态描述和用于操作主机控制器的hc_driver。

       2.EHCI主机控制器驱动

       EHCI HCD驱动属于HCD驱动的实例,它定义了一个ehci_hed结构体,通常作为代码清单16.6定义的usb_hed结构体的私有数据(hed_priv),这个结构体的定义位于rivers/usb/host/ehci.h中。

嵌入式需要学习什么

       资料来源: /view/1048.htm一、什么是驱动程序

       根据百度百科:驱动程序,英文名为“Device Driver”,全称为“设备驱动程序”, 是一种可以使计算机和设备通信的特殊程序,可以 说相当于硬件的接口,操作系统只有通过这个接口,才能控制硬件设备的工作,假如某设备的驱动程序未能正确安装,便不能正常工作。 因此,驱动程序被誉为“ 硬件的灵魂”、“硬件的主宰”、和“硬件和系统之间的桥梁”等。

       刚安装好的系统操作系统,很可能驱动程序安装得不完整。硬件越新,这种可能性越大。菜菜熊之前看到的“图标很大且颜色难看”就是没有安装好驱动的原因。

       在软件测试中:在自底向上测试中,要编写称为测试驱动的模块调用正在测试的模块。测试驱动模块以和将来真正模块同样的方式挂接,向处于测试的模块发送测试用例数据,接受返回结果,验证结果是否正确。

       二、驱动程序的作用

       随着电子技术的飞速发展,电脑硬件的性能越来越强大。驱动程序是直接工作在各种硬件设备上的软件,其“驱动”这个名称也十分形象的指明了它的功能。正是通过驱动程序,各种硬件设备才能正常运行,达到既定的工作效果。

       硬件如果缺少了驱动程序的“驱动”,那么本来性能非常强大的硬件就无法根据软件发出的指令进行工作,硬件就是空有一身本领都无从发挥,毫无用武 之地。这时候,电脑就正如古人所说的“万事俱备,只欠东风”,这“东风”的角色就落在了驱动程序身上。如此看来,驱动程序在电脑使用上还真起着举足轻重的 作用。

       从理论上讲,所有的硬件设备都需要安装相应的驱动程序才能正常工作。但像CPU、内存、主板、软驱、键盘、显示器等设备却并不需要安装驱动程序也可以正常工作,而显卡、声卡、网卡等却一定要安装驱动程序,否则便无法正常工作。这是为什么呢?

       这主要是由于这些硬件对于一台个人电脑来说是必需的,所以早期的设计人员将这些硬件列为BIOS能直接支持的硬件。换句话说,上述硬件安装后就 可以被BIOS和操作系统直接支持,不再需要安装驱动程序。从这个角度来说,BIOS也是一种驱动程序。但是对于其他的硬件,例如:网卡,声卡,显卡等等 却必须要安装驱动程序,不然这些硬件就无法正常工作。

       三、驱动程序的界定

       驱动程序可以界定为官方正式版、微软WHQL认证版、第三方驱动、发烧友修改版、Beta测试版。

       1、官方正式版

       官方正式版驱动是指按照芯片厂商的设计研发出来的,经过反复测试、修正,最终通过官方渠道发布出来的正式版驱动程序,又名公版驱动。通常官方正 式版的发布方式包括官方网站发布及硬件产品附带光盘这两种方式。稳定性、兼容性好是官方正式版驱动最大的亮点,同时也是区别于发烧友修改版与测试版的显著 特征。因此推荐普通用户使用官方正式版,而喜欢尝鲜、体现个性的玩家则推荐使用发烧友修改版及Beta测试版。

       2、微软WHQL认证版

       WHQL是Windows Hardware Quality Labs的缩写,是微软对各硬件厂商驱动的一个认证,是为了测试驱动程序与操作系统的相容性及稳定性而制定的。也就是说通过了WHQL认证的驱动程序与Windows系统基本上不存在兼容性的问题。

       3、第三方驱动

       第三方驱动一般是指硬件产品OEM厂商发布的基于官方驱动优化而成的驱动程序。第三方驱动拥有稳定性、兼容性好,基于官方正式版驱动优化并比官 方正式版拥有更加完善的功能和更加强劲的整体性能的特性。因此,对于品牌机用户来说,笔者推荐用户的首选驱动是第三方驱动,第二选才是官方正式版驱动;对 于组装机用户来说,第三方驱动的选择可能相对复杂一点,因此官方正式版驱动仍是首选。

       4、发烧友修改版

       发烧友令笔者首先就联想到了显卡,这是为什么呢?因为一直以来,发烧友很常都被用来形容游戏爱好者。笔者的这个想法也正好和发烧友修改版的诞生 典故相符的,因为发烧友修改版的驱动最先就是出现在显卡驱动上的,由于众多发烧友对游戏的狂热,对于显卡性能的期望也就是比较高的,这时候厂商所发布的显 卡驱动就往往都不能满足游戏爱好者的需求了,因此经修改过的以满足游戏爱好者更多的功能性要求的显卡驱动也就应运而生了。如今,发烧友修改版驱动又名改版 驱动,是指经修改过的驱动程序,而又不专指经修改过的驱动程序。

       5、Beta测试版

       测试版驱动是指处于测试阶段,还没有正式发布的驱动程序。这样的驱动往往具有稳定性不够、与系统的兼容性不够等bug。尝鲜和风险总是同时存在的,所以对于使用Beta测试版驱动的用户要做好出现故障的心理准备。

       四、驱动程序介绍

       驱动程序(Device Driver)全称为“设备驱动程序”,是一种可以使计算机和设备通信的特殊程序,可以说相当于硬件的接口,操作系统只能通过这个接口,才能控制硬件设备的工作,假如某设备的驱动程序未能正确安装,便不能正常工作。

       正因为这个原因,驱动程序在系统中的所占的地位十分重要,一般当操作系统安装完毕后,首要的便是安装硬件设备的驱动程序。不过,大多数情况下,我们并不需要安装所有硬件设备的驱动程序,例如硬盘、显示器、光驱、键盘、鼠标等就不需要安装驱动程序,而显卡、声卡、扫描仪、摄像头、Modem等就需要安装驱动程序。另外,不同版本的操作系统对硬件设备的支持也是不同的,一般情况下版本越高所支持的硬件设备也越多,例如笔者使用了Windows XP,装好系统后一个驱动程序也不用安装。

       设备驱动程序用来将硬件本身的功能告诉操作系统,完成硬件设备电子信号与操作系统及软件的高级编程语言之间的互相翻译。当操作系统需要使用某个硬件时,比如:让声卡播放音乐,它会先发送相应指令到声卡驱动程序,声卡驱动程序接收到后,马上将其翻译成声卡才能听懂的电子信号命令,从而让声卡播放音乐。

       所以简单的说,驱动程序提供了硬件到操作系统的一个接口以及协调二者之间的关系,而因为驱动程序有如此重要的作用,所以人们都称“驱动程序是硬件的灵魂”、“硬件的主宰”,同时驱动程序也被形象的称为“硬件和系统之间的桥梁”。

       驱动程序即添加到操作系统中的一小块代码,其中包含有关硬件设备的信息。有了此信息,计算机就可以与设备进行通信。驱动程序是硬件厂商根据操作系统编写的配置文件,可以说没有驱动程序,计算机中的硬件就无法工作。操作系统不同,硬件的驱动程序也不同,各个硬件厂商为了保证硬件的兼容性及增强硬件的功能会不断地升级驱动程序。如:Nvidia 显卡芯片公司平均每个月会升级显卡驱动程序2-3次。驱动程序是硬件的一部分,当你安装新硬件时,驱动程序是一项不可或缺的重要元件。凡是安装一个原本不属于你电脑中的硬件设备时,系统就会要求你安装驱动程序,将新的硬件与电脑系统连接起来。驱动程序扮演沟通的角色,把硬件的功能告诉电脑系统,并且也将系统的指令传达给硬件,让它开始工作。

       当你在安装新硬件时总会被要求放入“这种硬件的驱动程序”,很多人这时就开始头痛。不是找不到驱动程序的盘片,就是找不到文件的位置,或是根本不知道什么是驱动程序。比如安装打印机这类的硬件外设,并不是把连接线接上就算完成,如果你这时候开始使用,系统会告诉你,找不到驱动程序。怎么办呢?参照说明书也未必就能顺利安装。其实在安装方面还是有一定的惯例与通则可寻的,这些都可以帮你做到无障碍安装。

       在Windows系统中,需要安装主板、光驱、显卡、声卡等一套完整的驱动程序。如果你需要外接别的硬件设备,则还要安装相应的驱动程序,如:外接游戏硬件要安装手柄、方向盘、摇杆、跳舞毯等的驱动程序,外接打印机要安装打印机驱动程序,上网或接入局域网要安装网卡、Moden甚至ISDN、ADSL的驱动程序。说了这么多的驱动程序,你是否有一点头痛了。下面就介绍Windows系统中各种的不同硬件设备的驱动程序,希望能让你拨云见日。

       在Windows 9x下,驱动程序按照其提供的硬件支持可以分为:声卡驱动程序、显卡驱动程序、鼠标驱动程序、主板驱动程序、网络设备驱动程序、打印机驱动程序、扫描仪驱动程序等等。为什么没有CPU、内存驱动程序呢?因为CPU和内存无需驱动程序便可使用,不仅如此,绝大多数键盘、鼠标、硬盘、软驱、显示器和主板上的标准设备都可以用Windows自带的标准驱动程序来驱动,当然其它特定功能除外。如果你需要在Windows系统中的DOS模式下使用光驱,那么还需要在DOS模式下安装光驱驱动程序。多数显卡、声卡、网卡等内置扩展卡和打印机、扫描仪、外置Modem等外设都需要安装与设备型号相符的驱动程序,否则无法发挥其部分或全部功能。驱动程序一般可通过三种途径得到,一是购买的硬件附带有驱动程序;二是Windows系统自带有大量驱动程序;三是从Internet下载驱动程序。最后一种途径往往能够得到最新的驱动程序。

       供Windows 9x使用的驱动程序包通常由一些.vxd(或.386)、.drv、.sys、.dll或.exe等文件组成,在安装过程中,大部分文件都会被拷贝到“Windows\ System”目录下。

       五、驱动程序的开发

       驱动程序的开发工作是很具挑战性的,因为必须配合著硬件与软件上相当明确与高级的平台技术。由于大多数的驱动程序(device drivers)运行在内核模式(kernel mode),软件的错误经常造成系统严重的不稳定,例如蓝屏(blue screen),这跟过去的用户模式(user mode)下的程序设计(例如Delphi、VB、Java)有明显的差异性。

       Windows平台

       为了大量减轻驱动程序开发人员的负担,微软不断的改进驱动程序的开发软件与架构,从早期复杂深晦的VxD,到Windows XP上的Windows Driver Model(以下简称WDM)开发架构,如今Windows Driver Foundation(以下简称WDF)已成为新一代的Windows平台驱动程序发展架构,这个架构大量简化了驱动程序的开发流程,更符合面向对象的精神,此架构包含了UserMode Driver Framework 与 Kernel Mode DriverFramework两种开发模式。在开发Windows平台上的驱动程序之前,必须先安装DDK包,目前DDK最新版本为5600,同时支持WDM与WDF两种架构。

       Linux平台

       Linux作为UNIX的一个变种,继承了UNIX的设备管理方法,将所有的设备是具体的文件,通过文件系统层对设备进行访问。 这种设备管理方法可以很好地做到“设备无关性”,可以根据硬件外设的更新进行方便的扩展。

       Linux中的设备大致可以分为三类:字符设备,块设备,网络设备。

       字符设备没有缓冲区,以字节为单位顺序处理数据,不支持随机读写。常见的字符设备如普通打印机、系统的串口、终端显示器、嵌入式设备中的简单按键、手写板等。

       块设备是指在输入输出时数据处理以块为单位的设备,一般都采用缓冲技术,支持数据的随机读写。典型的块设备有硬盘、光驱等。

       字符设备和块设备面向的上一层是文件系统层。对用户来说,块设备和字符设备的访问接口都是一组基于文件的系统调用,如read, write等。

       网络设备与块设备和字符设备不同,网络设备面向的上一层是网络协议层。设备文件是一个唯一的名字(如eth0),在文件系统中不存在对应的节点项。内核和网络驱动程序之间的通信使用的是一套和数据包传输相关的函数,而不是read, write等。

       每一个设备都有一对主设备号、次设备号的参数作为唯一的标识。主设备号标识设备对应的驱动程序;次设备号用来区分具体驱动程序的实例。主设备号的获取可以通过动态分配或指定的方式。在嵌入式系统中外设较少,一般采用指定的方式。

       n [编辑本段]驱动程序的一般安装顺序  驱动程序安装的一般顺序:主板芯片组(Chipset)→显卡(VGA)→声卡(Audio)→网卡(LAN)→无线网卡(Wireless LAN)→红外线(IR)→触控板(Touchpad)→PCMCIA控制器(PCMCIA)→读卡器(Flash Media Reader)→调制解调器(Modem)→其它(如电视卡、CDMA上网适配器等等)。不按顺序安装很有可能导致某些软件安装失败。

       第一步,安装操作系统后,首先应该装上操作系统的Service Pack(SP)补丁。我们知道驱动程序直接面对的是操作系统与硬件,所以首先应该用SP补丁解决了操作系统的兼容性问题,这样才能尽量确保操作系统和驱动程序的无缝结合。

       第二步,安装主板驱动。主板驱动主要用来开启主板芯片组内置功能及特性,主板驱动里一般是主板识别和管理硬盘的IDE驱动程序或补丁,比如Intel芯片组的INF驱动和VIA的4in1补丁等。如果还包含有AGP补丁的话,一定要先安装完IDE驱动再安装AGP补丁,这一步很重要,也是很多造成系统不稳定的直接原因。

       第三步,安装DirectX驱动。这里一般推荐安装最新版本,目前DirectX的最新版本是DirectX 9.0C。可能有些用户会认为:“我的显卡并不支持DirectX 9,没有必要安装DirectX 9.0C”,其实这是个错误的认识,把DirectX等同为了Direct3D。DirectX是微软嵌在操作系统上的应用程序接口(API),DirectX由显示部分、声音部分、输入部分和网络部分四大部分组成,显示部分又分为Direct Draw(负责2D加速)和Direct 3D(负责3D加速),所以说Direct3D只是它其中的一小部分而已。而新版本的DirectX改善的不仅仅是显示部分,其声音部分(DirectSound)——带来更好的声效;输入部分(Direct Input)——支持更多的游戏输入设备,并对这些设备的识别与驱动上更加细致,充分发挥设备的最佳状态和全部功能;网络部分(DirectPlay)——增强计算机的网络连接,提供更多的连接方式。只不过是DirectX在显示部分的改进比较大,也更引人关注,才忽略了其他部分的功劳,所以安装新版本的DirectX的意义并不仅是在显示部分了。当然,有兼容性问题时另当别论。

       第四步,这时再安装显卡、声卡、网卡、调制解调器等插在主板上的板卡类驱动。

       第五步,最后就可以装打印机、扫描仪、读写机这些外设驱动。

       这样的安装顺序就能使系统文件合理搭配,协同工作,充分发挥系统的整体性能。

       另外,显示器、键盘和鼠标等设备也是有专门的驱动程序,特别是一些品牌比较好的产品。虽然不用安装它们也可以被系统正确识别并使用,但是安装上这些驱动程序后,能增加一些额外的功能并提高稳定性和性能 [编辑本段]Windows中的inf文件  Windows怎样知道安装的是什么设备,以及要拷贝哪些文件呢?答案在于.inf文件。.inf是从Windows 95时代开始引入的一种描述设备安装信息的文件,它用特定语法的文字来说明要安装的设备类型、生产厂商、型号、要拷贝的文件、拷贝到的目标路径,以及要添加到注册表中的信息。通过读取和解释这些文字,Windows便知道应该如何安装驱动程序。目前几乎所有硬件厂商提供的用于Windows 9x下的驱动程序都带有安装信息文件。事实上,.inf文件不仅可用于安装驱动程序,还能用来安装与硬件并没有什么关系的软件,例如Windows 98支持“Windows更新”功能,更新时下载的系统部件就是利用.inf文件来说明如何安装该部件的。

       在安装驱动程序时,Windows一般要把.inf文件拷贝一份到“Win-dows\Inf”或“Windows\Inf\Other”目录下,以备将来使用。Inf目录下除了有.inf文件外,还有两个特殊文件Drvdata.bin和Drvidx.bin,以及一些.pnf文件,它们都是Windows为了加快处理速度而自动生成的二进制文件。Drvdata.bin和Drvidx.bin记录了.inf文件描述的所有硬件设备,也许朋友们会有印象:当我们在安装某些设备时,经常会看到一个“创建驱动程序信息库”的窗口,此时Windows便正在生成这两个二进制文件。

       Windows 9x专门提供有“添加新硬件向导”(以下简称硬件向导)来帮助使用者安装硬件驱动程序,使用者的工作就是在必要时告诉硬件向导在哪儿可以找到与硬件型号相匹配的.inf文件,剩下的绝大部分安装工作都将由硬件安装向导自己完成。

       给硬件设备安装驱动程序对Windows 9x用户来说并不是一件陌生事,在安装或重装Windows时需要安装驱动程序,在购买了某些新硬件之后也需要安装驱动程序。如果驱动程序安装不正确,系统中某些硬件就可能无法正常使用。虽然Windows 9x支持即插即用,能够为用户减轻不少工作,但由于PC机的设备有非常多的品牌和型号,加上各种新产品不断问世,Windows不可能自动识别出所有设备,因此在安装很多设备时都需要人工干预。 资料来源: /view/1048.htm

很困惑,嵌入式,到底该怎么去学?

       嵌入式Linux操作系统学习规划\x0d\ARM+LINUX路线,主攻嵌入式Linux操作系统及其上应用软件开发目标: \x0d\(1) 掌握主流嵌入式微处理器的结构与原理(初步定为arm9) \x0d\(2) 必须掌握一个嵌入式操作系统 (初步定为uclinux或linux,版本待定) \x0d\(3) 必须熟悉嵌入式软件开发流程并至少做一个嵌入式软件项目。 \x0d\从事嵌入式软件开发的好处是: \x0d\(1)目前国内外这方面的人都很稀缺。这一领域入门门槛较高,所以非专业IT人员很难切入这一领域;另一方面,是因为这一领域较新,目前发展太快,大多数人无条件接触。 \x0d\(2)与企业计算等应用软件不同,嵌入式领域人才的工作强度通常低一些(但收入不低)。 \x0d\(3)哪天若想创业,搞自已的产品,嵌入式不像应用软件那样容易被盗版。硬件设计一般都是请其它公司给订做(这叫“贴牌”:OEM),都是通用的硬件,我们只管设计软件就变成自己的产品了。 \x0d\(4)兴趣所在,这是最主要的。 \x0d\从事嵌入式软件开发的缺点是: \x0d\(1)入门起点较高,所用到的技术往往都有一定难度,若软硬件基础不好,特别是操作系统级软件功底不深,则可能不适于此行。 \x0d\(2)这方面的企业数量要远少于企业计算类企业。 \x0d\(3)有少数公司经常要硕士以上的人搞嵌入式,主要是基于嵌入式的难度。但大多数公司也并无此要求,只要有经验即可。 \x0d\(4)平台依托强,换平台比较辛苦。 \x0d\兴趣的由来: \x0d\1、成功观念不同,不虚度此生,就是我的成功。 \x0d\2、喜欢思考,挑战逻辑思维。 \x0d\3、喜欢C \x0d\C是一种能发挥思维极限的语言。关于C的精神的一些方面可以被概述成短句如下: \x0d\相信程序员。 \x0d\不要阻止程序员做那些需要去做的。 \x0d\保持语言短小精干。 \x0d\一种方法做一个操作。 \x0d\使得它运行的够快,尽管它并不能保证将是可移植的。 \x0d\4、喜欢底层开发,讨厌vb类开发工具(并不是说vb不好)。 \x0d\5、发展前景好,适合创业,不想自己要死了的时候还是一个工程师。 \x0d\方法步骤: \x0d\1、基础知识: \x0d\目的:能看懂硬件工作原理,但重点在嵌入式软件,特别是操作系统级软件,那将是我的优势。 \x0d\科目:数字电路、计算机组成原理、嵌入式微处理器结构。 \x0d\汇编语言、C/C++、编译原理、离散数学。 \x0d\数据结构和算法、操作系统、软件工程、网络、数据库。 \x0d\方法:虽科目众多,但都是较简单的基础,且大部分已掌握。不一定全学,可根据需要选修。 \x0d\主攻书籍:the c++ programming language(一直没时间读)、数据结构-C2。 \x0d\\x0d\2、学习linux: \x0d\目的:深入掌握linux系统。 \x0d\ 方法:使用linux—〉linxu系统编程开发—〉驱动开发和分析linux内核。先看深,那主讲原理。看几遍后,看情景分析,对照深看,两本交叉,深是纲,情是目。剖析则是0.11版,适合学习。最后深入代码。 \x0d\主攻书籍:linux内核完全剖析、unix环境高级编程、深入理解linux内核、情景分析和源代。 \x0d\3、学习嵌入式linux: \x0d\目的:掌握嵌入式处理器其及系统。 \x0d\方法:(1)嵌入式微处理器结构与应用:直接arm原理及汇编即可,不要重复x86。 \x0d\ (2)嵌入式操作系统类:ucOS/II简单,开源,可供入门。而后深入研究uClinux。 \x0d\ (3)必须有块开发板(arm9以上),有条件可参加培训(进步快,能认识些朋友)。 \x0d\ 主攻书籍:毛德操的《嵌入式系统》及其他arm9手册与arm汇编指令等。 \x0d\\x0d\4、深入学习: \x0d\ A、数字图像压缩技术:主要是应掌握MPEG、mp3等编解码算法和技术。 \x0d\ B、通信协议及编程技术:TCP/IP协议、802.11,Bluetooth,GPRS、GSM、CDMA等。 \x0d\\x0d\2010-8-21 16:46 回复 \x0d\122.90.173.* 2楼\x0d\\x0d\ C、网络与信息安全技术:如加密技术,数字证书CA等。 \x0d\ D、DSP技术:Digital Signal Process,DSP处理器通过硬件实现数字信号处理算法。 \x0d\ 说明:太多细节未说明,可根据实际情况调整。重点在于1、3,不必完全按照顺序作。对于学习c++,理由是c++不只是一种语言,一种工具,她还是一种艺术,一种文化,一种哲学理念、但不是拿来炫耀得东西。对于linux内核,学习编程,读一些优秀代码也是有必要的。 \x0d\ 注意: 要学会举一反多,有强大的基础,很多东西简单看看就能会。想成为合格的程序员,前提是必须熟练至少一种编程语言,并具有良好的逻辑思维。一定要理论结合实践。 \x0d\ 不要一味钻研技术,虽然挤出时间是很难做到的,但还是要留点余地去完善其他的爱好,比如宇宙,素描、机械、管理,心理学、游戏、科幻**。还有一些不愿意做但必须要做的! \x0d\ 技术是通过编程编程在编程编出来的。永远不要梦想一步登天,不要做浮躁的人,不要觉得路途漫上。而是要编程编程在编程,完了在编程,在编程!等机会来了在创业(不要相信有奇迹发生,盲目创业很难成功,即便成功了发展空间也不一定很大)。 \x0d\\x0d\ 嵌入式书籍推荐 \x0d\ Linux基础 \x0d\ 1、《Linux与Unix Shell 编程指南》 \x0d\ C语言基础 \x0d\ 1、《C Primer Plus,5th Edition》美Stephen Prata着 \x0d\ 2、《The C Programming Language, 2nd Edition》美Brian W. Kernighan David M. Rithie(K & R)着 \x0d\ 3、《Advanced Programming in the UNIX Environment,2nd Edition》(APUE) \x0d\ 4、《嵌入式Linux应用程序开发详解》 \x0d\ Linux内核 \x0d\ 1、《深入理解Linux内核》(第三版) \x0d\ 2、《Linux内核源代码情景分析》毛德操 胡希明著 \x0d\ 研发方向 \x0d\ 1、《UNIX Network Programming》(UNP) \x0d\ 2、《TCP/IP详解》 \x0d\ 3、《Linux内核编程》 \x0d\ 4、《Linux设备驱动开发》(LDD) \x0d\ 5、《Linux高级程序设计》 杨宗德著\x0d\ 硬件基础 \x0d\ 1、《ARM体系结构与编程》杜春雷着 \x0d\ 2、S3C2410 Datasheet \x0d\ 英语基础 \x0d\ 1、《计算机与通信专业英语》 \x0d\ 系统教程 \x0d\ 1、《嵌入式系统——体系结构、编程与设计》 \x0d\ 2、《嵌入式系统——采用公开源代码和StrongARM/Xscale处理器》毛德操 胡希明着 \x0d\ 3、《Building Embedded Linux Systems》 \x0d\ 4、《嵌入式ARM系统原理与实例开发》 杨宗德著\x0d\ 理论基础 \x0d\ 1、《算法导论》 \x0d\ 2、《数据结构(C语言版)》 \x0d\ 3、《计算机组织与体系结构?性能分析》 \x0d\ 4、《深入理解计算机系统》美Randal E. Bryant David O''Hallaron着 \x0d\ 5、《操作系统:精髓与设计原理》 \x0d\ 6、《编译原理》 \x0d\ 7、《数据通信与计算机网络》 \x0d\ 8、《数据压缩原理与应用》 \x0d\\x0d\ C语言书籍推荐 \x0d\ 1. The C programming language 《C程序设计语言》 \x0d\ 2. Pointers on C 《C和指针》 \x0d\ 3. C traps and pitfalls 《C陷阱与缺陷》 \x0d\ 4. Expert C Lanuage 《专家C编程》 \x0d\ 5. Writing Clean Code -----Microsoft Techiniques for Developing Bug-free C Programs \x0d\ 《编程精粹--Microsoft 编写优质无错C程序秘诀》 \x0d\ 6. Programming Embedded Systems in C and C++ 《嵌入式系统编程》 \x0d\ 7.《C语言嵌入式系统编程修炼》 \x0d\ 8.《高质量C++/C编程指南》林锐 \x0d\ 尽可能多的编码,要学好C,不能只注重C本身。算法,架构方式等都很重要。 \x0d\\x0d\这里很多书其实是推荐而已,不必太在意,关键还是基础,才是重中之重!!!

嵌入式底层软件开发的目录

       嵌入式作为国内近几年比较火热的专业,也就是和前几年计算机专业一样。前些年计算机专业做为一个火热的专业各大高校一片热招,但由于学校师资有限、教材落后, 最后导致学生毕业后找不到工作。

        近几年嵌入式又是一片火热,各大高校纷纷热招,但是部分高校设备不够齐全、师资不够,在不久几年里嵌入式专业又将重蹈计算机覆辙。现在好多在校大学生和工作人员对于嵌入式专业十分感兴趣。下面我就个人经验来说一下嵌入式的学习方法,如有不到之处请高人指点。

        嵌入式的定义是以应用为中心,以计算机技术为基础,并且软硬件可定制,适用于各种应用场合,对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。它一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户的应用程序等四个部分组成,用于实现对其他设备的控制、监视或管理等功能。 嵌入式系统几乎包括了生活中的所有电器设备,如掌上 PDA 、移动计算设备、电视机顶盒、手机上网、数字电视、多媒体、汽车、微波炉、数字相机、家庭自动化系统、电梯、空调、安全系统、自动售货机、蜂窝式电话、消费电子设备、工业自动化仪表与医疗仪器等。

        嵌入式系统一般指非PC系统,它包括硬件和软件两部分。硬件包括处理器/微处理器、存储器及外设器件和I/O端口、图形控制器等。软件部分包括操作系统软件(OS)(要求实时和多任务操作)和应用程序编程。有时设计人员把这两种软件组合在一起。应用程序控制着系统的运作和行为;而操作系统控制着应用程序编程与硬件的交互作用。

        这时嵌入式就以计算机为基础从事相关设备的开发了,试问前些年没有做好计算机教学的学校,又何以从事嵌入式教学呢。

        对于在校大学生应该C语言基础知识,光是学习谭浩强的还不够,多看一些国外的经典书籍,如,这是每位学习程序设计的人员必备知识。由于嵌入式是软件和硬件相结合的产物,所以对于操作系统和微机原理的学习也是不可缺少的,但是现在各大高校只是停留在理论知识的讲解,并没有实际上的东西,这也就导致学生不能提高兴趣,只是用于对付考试,所以学好操作系统和微机原理应该理论实际相结合。还有数据结构这一门课程是不得不提的课程,国内出名的也就是清华大学的严蔚敏的那本书了。学好这些东西这也就是相当于武侠小说中的内功的修养。

        有了这些做为基础,去学习其他的一些东西就会很快的。

        嵌入式分为嵌入式软件开发和嵌入式硬件开发,嵌入式的软件开发在掌握了以上东西后要如鱼得水。

        下面就以万达嵌入式Linux培训的课程体系为例,个人感觉还是不错的。他是这样列的:

        Linux基础、Linux应用程序开发、嵌入式Linux网络程序开发、嵌入式图形界面与数据库开发、嵌入式linux开发环境搭建、S3C2440的内部结构功能简介、BootLoader分析和移植、Linux内核移植、uCOS II 源码分析和移植、根文件系统制作、BootLoader、内核综合解析、Linux系统调试、ADS仿真调试与S3C2440硬件接口操作、ARM11接口、Linux下字符设备驱动程序、Linux下块设备驱动程序、Linux下网络设备驱动程序、LCD设备驱动、Flash设备驱动、USB驱动开发等。

        要学习一个东西肯定要先学习他的操作,这就是linux基础,也就是常用的linux操作,这样的书籍太多了,找一些实用的来看就可以了。下来就是在我们先前学习的C语言的基础上学习linux上的程序开发,这门课程现在在好多学校都没有开设,对于程序开发者来说是一门很重要的课程,不过万达嵌入式是把网络程序开发和图形界面开发与数据库开发分开了,其实这些都属于linux上的应用程序开发,可能也是为了方便大家认识这一门课程吧,条理更加清楚了。这一内容是企业开发中应用最多的内容,也就是所谓的嵌入式应用层开发。有了深入的C语言基础这些内容都是很容易学会的。比较知名的书籍有已帮的的steves先生的《UNIX环境高级编程》可以说是UNIX编程“圣经,这本书一定要好好的拜读的。对于网络程序开发也是stevens先生的《UNIX网络编程》,如果你想深入的掌握的话可以看一下《TCP/IP协议三卷》。对于图形界面的开发大家可以看一下Jasmin Blanchette的《C++GUI Qt4编程(第2版)》。掌握这些基本上就可以从事应用层开发了。这些技术都是企业内部急用的内容。

        由于嵌入式的开发不是在我们平时用的x86平台上用的,所以我们需要把我们所写的程序放到相应的平台上去,这时就用到了嵌入式开发环境的搭建(见上面的课程体系),开发环境的搭建主要就是交叉编译开发环境的搭建,这个东西你可以去网上去下,也可以自己动手去做,但在实际当中用的时候需要你自己动手去搭建。建议你先自己使用,然后慢慢的学着去搭建。

        对于ARM9的操作,现在市场上主要是2410和2440,二个选择一个用就可以了,内容差不太多,认真的研究透一个就可以了,对于ARM11的6410的操作就先不要考虑了,在万达嵌入式的课程体系中也安装的也挺合理的,先是学习一下2410或2440再去学习6410,有了一定的基础后再去学习6410才有可能把它操作起来。对于接口的一些操作就是把ARM当做一个单片机来操作,这样的书籍可以去看一下周立功的书籍,它们对ARM说的挺多的,不过他们用不是三星的产品,但是懂了其中一个其它的操作起也就可以了。

        对于2440的操作会了以后就可以去学习BootLoader的学习了,在万达嵌入式里面说的是BootLoader的,这里只是说了一个总称,这里主要有u-boot,vivi,LILO等,如果你用的是ARM你可以先自己选择一个小的BootLoader,比如vivi来学习,学会这一个了你去操作其它的都是一样的了。

        对于操作系统的移植大体过程都是一样的,主要是让你做一个最小系统,方便以后驱动的学习。对于嵌入式系统移植的话这方面还真没有太多好的书籍,自己可以去网上搜一下。

        对于基础知识都打好以后就可以进攻驱动程序开发,这个东西是一个比较漫长的过程,一定要静下心来,慢慢的去阅读代码,慢慢的去学习。这样的东西大家可以看一下《Linux内核源码情景分析》、《深入理解Linux内核》等书籍。在万达嵌入式的课程体系里面他们说到了好多关于驱动开发中的实例,确实是这样子,驱动开发肯定要多接触一些典型的驱动程序开发的案例,大家可以慢慢的跟着课程体系里面的东西去学习。

        另外就是嵌入式的硬件的开发,主要就是所谓的FPGA、DSP、VHDL等。这些东西在大学里面基本上都会学到大家都可以去学习一下,自己试着做出来一些东西来。比如抄板子,一点一点的去划。

        好了对于嵌入式的学习在这里就说这些,如果有不正之处请大家指正。

arm嵌入式linux系统开发详解怎么样

       1 第1章 ARM汇编编程基础 9

       1.1 ARM CPU寄存器 9

       1.1.1 普通寄存器R0 – R15 10

       1.1.2 状态寄存器CPSR与SPSR 11

       1.1.3 流水线对PC值的影响 13

       1.2 基本寻址方式与基本指令 15

       1.2.1 最常见寻址方式精解 15

       1.2.2 最常见指令精解 16

       1.3 ARM汇编伪操作 18

       1.3.1 汇编伪操作在汇编程序中的使用范例 18

       1.3.2 最常见汇编伪操作精解 19

       1.3.3 汇编伪操作列表 21

       1.4 ADS开发环境的使用 23

       1.4.1 在ADS中进行裸机程序的编辑、编译、运行 24

       1.4.2 在AXD中进行裸机程序调试的方法与步骤 32

       1.5 RealView MDK开发环境的使用 40

       1.5.1 在MDK开发环境下编写裸机程序 40

       1.5.2 MDK调试裸机程序的方法与步骤 55

       1.6 其他常见寻址模式与常见指令 58

       1.6.1 其他常见寻址模式(基址寻址、多寄存器寻址、堆栈寻址、寄存器移位寻址、相对寻址) 58

       1.6.2 其他常见指令(访存指令、数据处理指令、乘法指令) 62

       2 第2章 ARM编程进阶 65

       2.1 ARM汇编伪指令 65

       2.1.1 精解ldr伪指令 65

       2.1.2 精解adr 67

       2.1.3 精解adrl伪指令 68

       2.1.4 nop伪指令 69

       2.2 ATPCS与混合编程 70

       2.2.1 ATPCS规则精解 70

       2.2.2 精解C和ARM汇编程序间的相互调用 74

       2.3 裸机硬件的控制方法与例程 76

       2.3.1 建立真实硬件的开发和调试环境 77

       2.3.2 软件控制(驱动)硬件的编程原理 90

       2.3.3 裸机硬件控制程序实例 91

       2.3.4 启动例程 96

       2.4 看门狗定时器(Watchdog) 102

       2.4.1 看门狗定时器的用途 103

       2.4.2 看门狗工作原理 104

       2.4.3 看门狗实验 106

       2.5 系统时钟 107

       2.5.1 系统工作时钟频率 107

       2.5.2 时钟驱动实验 112

       2.6 SDRAM内存 116

       2.6.1 S3C2440存储器地址段(Bank) 117

       2.6.2 SDRAM内存工作原理 119

       2.6.3 SDRAM的读操作 123

       2.6.4 SDRAM预充电操作 124

       2.6.5 SDRAM突发操作 124

       2.6.6 SDRAM写操作 125

       2.6.7 SDRAM的刷新 126

       2.6.8 内存驱动实验 130

       2.7 UART串口 134

       2.7.1 异步通信和同步通信 135

       2.7.2 数据的串行和并行通信方式 135

       2.7.3 数据通信传输模式 136

       2.7.4 S3C2440 UART控制器 137

       2.7.5 S3C2440 UART串口工作原理 138

       2.7.6 UART串口驱动实验 147

       3 第3章 ARM体系结构 151

       3.1 ARM处理器工作模式 151

       3.1.1 ARM处理器不同模式下寄存器 152

       3.1.2 ARM处理器模式切换(含MRS,MSR指令) 153

       3.2 ARM处理器异常处理 155

       3.2.1 异常分类 155

       3.2.2 异常发生的硬件操作 156

       3.2.3 异常返回地址 157

       3.2.4 异常向量表 158

       3.2.5 异常处理的返回 160

       3.3 S3C2440系统中断 161

       3.3.1 中断的产生-中断源 162

       3.3.2 中断优先级 164

       3.3.3 中断控制相关寄存器 166

       3.3.4 系统中断流程 169

       3.3.5 按键控制LED灯实验 171

       3.4 semihosting与硬件重定向 179

       3.4.1 semihosting半主机调试 179

       3.4.2 硬件重定向 184

       3.5 系统调用与软件中断SWI的实现 190

       3.5.1 系统调用 190

       3.5.2 软件中断 191

       3.5.3 软中断处理 192

       3.5.4 led系统调用实验 193

       3.6 进程切换的实现 199

       3.6.1 进程 199

       3.6.2 进程控制块PCB 200

       3.6.3 进程创建 201

       3.6.4 进程队列 201

       3.6.5 进程调度(schedule) 202

       3.6.6 上下文切换 205

       3.7 MMU与内存保护的实现 208

       3.7.1 存储管理单元MMU 209

       3.7.2 Cache 221

       3.7.3 CP15协处理器 223

       3.8 实战:小型多任务操作系统miniOS的实现 227

       3.8.1 miniOS代码分析 227

       3.8.2 miniOS应用程序接口 261

       3.8.3 miniOS应用程序系统调用接口 262

       4 第4章 嵌入式Linux软件开发环境搭建 265

       4.1 体验嵌入式linux系统 265

       4.2 Linux操作系统安装 266

       4.2.1 在Window上安装虚拟机 266

       4.2.2 在虚拟机上安装Linux操作系统ubuntu9.10 277

       4.3 在ubuntu9.10中安装基本的开发环境 280

       4.4 ubuntu9.10上网络服务的安装与配置 281

       4.4.1 设置vmware网络 282

       4.4.2 安装、配置和使用ftp服务 286

       4.4.3 安装、配置nfs服务 286

       5 第5章 建构bootloader 287

       5.1 准备工作 287

       5.1.1 嵌入式Linux系统概述 287

       5.1.2 构建交叉编译工具链 288

       5.1.3 bootloader概述 289

       5.2 深入剖析U-boot代码 293

       5.2.1 安装和使用源代码阅读工具Source Insight 293

       5.2.2 u-boot的编译初步 295

       5.2.3 分析u-boot的第1阶段代码(cpu/arm920t/start.S) 297

       5.2.4 分析u-boot的第2阶段代码 301

       5.2.5 继续移植、编译u-boot 303

       5.2.6 u-boot常用命令使用简介 307

       5.2.7 u-boot命令实现框架的分析 310

       5.2.8 u-boot引导Linux操作系统的过程分析 315

       5.2.9 让u-boot支持从usb slave接口获得数据 320

       6 第6章 建构嵌入式Linux内核 322

       6.1 Linux内核简介 322

       6.1.1 Linux内核版本历史 322

       6.1.2 内核源码目录结构 322

       6.1.3 Linux内核构造系统简介 323

       6.2 移植、裁减及配置Linux内核到s3c2440开发板 324

       6.2.1 体验Linux内核配置、编译与使用 324

       6.2.2 为S3C2440移植内核 327

       6.2.3 配置并裁减内核 328

       6.2.4 运行内核并验证内核被配置的功能 331

       6.3 内核Kconfig与Makefile文件分析 333

       6.3.1 内核构造系统简介 333

       6.3.2 Kconfig文件精解 333

       6.3.3 .config文件说明 335

       6.3.4 Makefile文件精解 335

       6.3.5 实战:修改Kconfig和Makefile,完成向内核中添加新的功能组件——网卡、声卡、LCD、触摸屏驱动 336

       7 第7章 建构嵌入式Linux文件系统 345

       7.1 嵌入式Linux文件系统简介 345

       7.1.1 嵌入式文件系统概述 345

       7.1.2 MTD设备与Flash文件系统简介 346

       7.1.3 嵌入式Linux系统中的tmpfs文件系统 347

       7.2 详解制作根文件系统 349

       7.2.1 FHS标准介绍 349

       7.2.2 编译/安装busybox,生成/bin、/sbin、/usr/bin、/usr/sbin目录 350

       7.2.3 利用交叉编译工具链,构建/lib目录 351

       7.2.4 手工构建/etc目录 353

       7.2.5 手工构建最简化的/dev目录 354

       7.2.6 使用启动脚本完成/proc、/sys、/dev、/tmp、/var等目录的完整构建 355

       7.2.7 制作根文件系统的jffs2映像文件 359

       7.3 建构嵌入式Linux应用程序系统 360

       7.3.1 辅助处理工具的移植 360

       7.3.2 mp3播放器 madplay的移植 363

       7.3.3 主要网络服务器的移植与使用 366

       7.3.4 数据库程序的移植与使用 371

       7.4 建构GUI系统 374

       7.4.1 移植tslib库 374

       7.4.2 移植qtopia 375

       8 第8章 Linux驱动程序开发基础 378

       8.1 Linux设备驱动程序简介 378

       8.1.1 设备驱动分类和内核模块 379

       8.1.2 设备文件和设备驱动 380

       8.1.3 内核模块的编译和使用 381

       8.2 字符设备驱动基本编程 388

       8.2.1 字符设备驱动体验 388

       8.2.2 实现字符设备驱动的工作 388

       8.3 驱动程序中的并发控制方法 401

       8.3.1 并发控制原理简介 401

       8.3.2 信号量的编程实战 402

       8.3.3 自旋锁的编程实战 404

       8.3.4 Linux内核提供的其他并发控制方法 408

       8.4 驱动程序中的阻塞与非阻塞编程 409

       8.4.1 体验阻塞I/O 409

       8.4.2 如何在驱动程序中实现阻塞I/O 411

       8.4.3 体验非阻塞I/O 413

       8.4.4 如何在驱动程序中实现非阻塞I/O 415

       8.5 字符设备驱动程序对一些高级特性的实现 416

       8.5.1 non-seekable的实现 416

       8.5.2 select的实现 417

       9 第9章 Linux字符设备驱动开发实战 422

       9.1 IO内存与硬件通信 422

       9.1.1 驱动中的内存分配 422

       9.1.2 使用 I/O 端口地址空间与硬件进行通信的内核API介绍 423

       9.1.3 使用 I/O 内存地址空间与硬件进行通信的内核API介绍 424

       9.1.4 通过I/O内存驱动硬件的实战——LED灯驱动 425

       9.1.5 驱动程序对ioctl的规范实现 433

       9.2 内核misc设备架构分析 435

       9.2.1 定义全局变量 435

       9.2.2 注册主设备号为10的misc设备 436

       9.2.3 导出内核API —— misc_register函数 437

       9.2.4 实施乾坤大挪移的misc设备open函数 438

       9.2.5 导出内核API —— misc_deregister函数 440

       9.3 watchdog驱动 441

       9.3.1 相关概念 441

       9.3.2 Watchdog硬件结构分析 443

       9.3.3 Watchdog驱动的初始化和卸载 443

       9.3.4 探测函数watchdog_probe的实现 444

       9.3.5 实现misc设备中对设备文件的操作 447

       9.3.6 Watchdog平台驱动的设备移除、挂起和恢复接口函数的实现 450

       9.3.7 测试watchdog驱动 451

       9.4 内核编码规范与风格 452

       9.4.1 缩进、长行、{}与空格的放 453

       9.4.2 变量和函数 453

       9.4.3 注释.macros和enums 454

       9.4.4 快乐使用内核提供的实现常用功能的宏 455

       10 第10章 Linux驱动中的中断编程 456

       10.1 驱动程序调测方法与技巧 456

       10.1.1 利用printk 456

       10.1.2 详解OOP消息 457

       10.1.3 利用strace 461

       10.1.4 利用内核内置的hacking选项 462

       10.1.5 其他调测方法简介 465

       10.2 驱动程序中的中断处理 466

       10.2.1 中断简述 466

       10.2.2 驱动程序中进行中断处理涉及到的最基本的内核API 466

       10.2.3 驱动程序进行中断处理的实例代码分析 467

       10.2.4 其他关于中断的内核API 469

       10.3 内核时间与内核定时器 470

       10.3.1 内核中如何记录时间 470

       10.3.2 内核定时器API 471

       10.3.3 内核定时器与内核时间的应用案例——按键消抖 471

       10.3.4 如何在内核中实现延时 474

       10.4 中断顶半部与底半部 474

       10.4.1 区分和使用中断顶半部与底半部的原因 474

       10.4.2 tasklet机制与编程实例 475

       10.4.3 workqueue机制与编程实例 478

       10.4.4 tasklet与workqueue的区别和不同应用环境总结 485

       10.5 Linux中断处理系统的架构与共享中断 486

       10.5.1 裸机程序中的中断编程与有操作系统下的中断编程的区别 486

       10.5.2 Linux中断处理系统的架构 487

       10.5.3 关于共享中断的说明 487

       10.5.4 共享中断实例 487

       11 第11章 Linux网络设备驱动开发实战 489

       11.1 网络设备驱动基础 489

       11.1.1 体验网卡驱动 489

       11.1.2 网卡驱动的基本知识——2个结构体和5个函数 489

       11.1.3 虚拟网卡snull驱动代码分析 494

       11.1.4 网卡驱动的编写主要内容总结 499

       11.2 网络设备驱动实例——cs8900 499

       11.2.1 虚拟网卡驱动与真实网卡驱动的主要区别 499

       11.2.2 真实网卡驱动的整体框架分析 500

       11.2.3 驱动中关于cs8900硬件操作的探讨 507

       12 第12章 其他重要设备驱动开发实战 519

       12.1 块设备驱动初步(以ramdisk为例) 519

       12.1.1 体验块设备驱动 519

       12.1.2 块设备驱动框架介绍 519

       12.1.3 块设备的简单读写实现代码分析 522

       12.1.4 块设备的高效读写实现代码分析 523

       12.1.5 块设备的其他操作接口fops 526

       12.2 LCD驱动 528

       12.2.1 LCD裸机驱动 528

       12.2.2 帧缓冲(FrameBuffer)设备驱动框架结构 536

       12.2.3 LCD驱动实例代码 542

       12.2.4 LCD驱动代码的主干结构的总结 555

       12.2.5 测试LCD驱动程序 556

       12.3 触摸屏驱动 556

       12.3.1 触摸屏裸机驱动 556

       12.3.2 Linux输入子系统 561

       12.3.3 Linux下触摸屏驱动的实现步骤 564

       12.3.4 测试触摸屏驱动程序 572

       12.4 USB驱动初步 572

       12.4.1 Linux下4种USB驱动简介与功能体验 572

       12.4.2 USB接口与规范 574

       12.4.3 USB设备驱动基本知识 575

       12.4.4 USB设备驱动实例 578

       嵌入式系统是目前最流行的计算机应用技术之一。《ARM嵌入式Linux系统开发详解》由浅入深地讲解基于ARM体系结构的嵌入式

       Linux系统开发,内容包括嵌入式系统的基本概念、应用领域等基础知识;ARM处理器的体系结构和功能特点;Linux系统内核结构和移植方法、

       Bootloader功能和移植;Linux应用程序开发,包括如何操作文件、管理内存、访问串口、多线程和多进程技术,并且剖析了应用程序的结构和工作

       流程;Linux系统设备驱动程序开发,包括如何编写内核模块、驱动程序分类和功能特点,并且给出了网络设备驱动、Flash设备驱动和USB设备驱动的

       实例分析。

       《ARM嵌入式Linux系统开发详解》附带1张DVD光盘,内容为专门为《ARM嵌入式Linux系统开发详解》录制的9小时视频、《ARM嵌入式Linux系统开发详解》涉及的源代码、Ubuntu安装光盘的镜像文件和另外赠送的35小时Linux专题学习视频。

       《ARM嵌入式Linux系统开发详解》适合广大从事嵌入式Linux系统开发人员、对嵌入式Linux系统开发有兴趣的计算机爱好者,以及大中专院校学生阅读。

       好了,今天关于“linux驱动程序开发实例”的话题就到这里了。希望大家能够通过我的讲解对“linux驱动程序开发实例”有更全面、深入的了解,并且能够在今后的生活中更好地运用所学知识。

热门文章