当前位置:文档之家› 嵌入式Linux下PCIE数据采集卡驱动开发

嵌入式Linux下PCIE数据采集卡驱动开发

嵌入式Linux下PCIE数据采集卡驱动开发
嵌入式Linux下PCIE数据采集卡驱动开发

电子科技大学

UNIVERSITY OF ELECTRONIC SCIENCE AND TECHNOLOGY OF CHINA 硕士学位论文

MASTER THESIS

论文题目嵌入式Linux下PCIE数据采集卡驱动开发

学科专业测试计量技术及仪器

学号201021070218

作者姓名周小波

指导教师谢永乐教授

分类号密级

UDC注1

学位论文

嵌入式Linux下PCIE数据采集卡驱动开发

(题名和副题名)

周小波

(作者姓名)

指导教师谢永乐教授

电子科技大学成都

(姓名、职称、单位名称)

申请学位级别硕士学科专业测试计量技术及仪器

提交论文日2013.5.20 论文答辩日期2013.5.30

学位授予单位和日期电子科技大学2013年6 月日答辩委员会主席

评阅人

注1:注明《国际十进分类法UDC》的类号。

DRIVER DEVELOPMENT OF PCIE DATA ACQUISITION CARD IN EMBEDDED LINUX

A Thesis Submitted to

University of Electronic Science and Technology of China

Major: Measuring&Testing Technology and Instruments Author: Xiaobo Zhou

Advisor: Prof. Yongle Xie

School: School of Automation Engineering

独创性声明

本人声明所呈交的学位论文是本人在导师指导下进行的研究工作及取得的研究成果。据我所知,除了文中特别加以标注和致谢的地方外,论文中不包含其他人已经发表或撰写过的研究成果,也不包含为获得电子科技大学或其它教育机构的学位或证书而使用过的材料。与我一同工作的同志对本研究所做的任何贡献均已在论文中作了明确的说明并表示谢意。

作者签名:日期:年月日

论文使用授权

本学位论文作者完全了解电子科技大学有关保留、使用学位论文的规定,有权保留并向国家有关部门或机构送交论文的复印件和磁盘,允许论文被查阅和借阅。本人授权电子科技大学可以将学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存、汇编学位论文。

(保密的学位论文在解密后应遵守此规定)

作者签名:导师签名:

日期:年月日

摘要

摘要

随着信息技术的不断发展,高端嵌入式系统的需求持续加大。Linux的巨大优势使得它在嵌入式领域备受关注。本论文以高速数据采集嵌入式系统研发为背景,采用飞思卡尔MPC85xx处理器,对PCIE数据采集卡的驱动开发进行了讨论。

首先,本文讲解了嵌入式数据采集系统的发展现状和需求,并结合需求给出了一款高速数据采集嵌入式系统的方案,并对该方案的各个部件的选取和方案的实施做了简要的讲解。

其次,论文讲解了飞思卡尔公司的MPC85XX主控制器的性能参数,同时采用高速采集系统的硬件总体搭建与各个模块分别设计相结合的方法,介绍了高速数据采集系统的硬件结构;同时结合项目讲解了嵌入式Linux开发环境的建立。

第三,我们选取U-Boot作为引导程序,对其功能做、结构和编译过程做了详尽的分析;根据主控制器硬件搭载情况,给出了U-Boot的配置、移植方法。

第四,我们在对Linux内核介绍的基础上,对嵌入式操作系统进行了比较,并深入分析了Linux内核源码结构,结合系统硬件配备情况对Linux内核的配置及其移植方法做了介绍;本文还对Linux根文件系统及其构建做了剖析。

第五,论述并分析了Linux驱动程序的开发技术,深入剖析了字符设备驱动程序的基本结构,并对PCIE高速数据采集卡驱动程序的设计做了详尽的论述。并给出了linux操作系统的调试方法,并对驱动程序的调试、动静态加载以及测试方法做了详述,并给出其最终的测试结果。

本论文介绍的数据采集系统采用的是4个链路,它的理论速度可以达到10Gbps,由于PCI Express的链路可以是8、16甚至是32个,如果增加PCI Express 的链路,将达到更高的数据传输速率。MPC85XX控制器具有千兆以太网和SATA 硬盘接口,这可将采集到的数据以千兆以太网转发或直接存在大容量硬盘,以提高信息的采集量。

关键词:嵌入式系统、Linux内核、PCI Express、驱动程序、DMA

I

ABSTRACT

ABSTRACT

With the continuous development of information technology,demands for high-end embedded systems continue to increase.Linux makes itself be the focus of attention in the embedded domain owing to its enormous superiority.Taking research and development of data gathering system as the background and using MPC85xx to be processor,this thesis discusses the driver development of PCIE data acquisition card. Firstly,this article explains present development situation and the demand of the embedded data acquisition https://www.doczj.com/doc/4773647.html,bined with demand,this thesis has given a solution of high speed data acquisition embedded system,and made the brief explanation to selection of each part of this solution and its specific implementation. Secondly,The paper explains the MPC8536RDK and its performance parameters.we introduce the hardware structure of high speed data acquisition embedded system combined with overall design of data acquisition system hardware structure and its each module.This article explains how to set up the embedded Linux development environment based on the project.

Thirdly,we select U-Boot as the booting procedure and explain its function,and make detail analysis of its structure and compilation process.According to hardware of the host controller,we present the configuration and porting method of U-Boot.

Fourth,we compare the embedded operating system on the basis of introducing Linux kernel,and analyse Linux kernel source code structure.According to hardware of system,we present the configuration and porting method of linux kernel.This paper also analyse Linux root file system and its construction.

Fifth,this article discusses and analyses development techniques of Linux driver,and analyses the basic structure of a character device driver in detail.Moreover,this article elaborates PCIE card driver.At last,we give debugging,loading and testing method of the Linux and driver,and its final test results.

Key words: Embedded system,Linux Kernel,PCI Express,Driver Program,DMA

II I

目录

第一章绪论 (1)

1.1 课题研究背景 (1)

1.2 课题研究意义 (2)

1.3 课题工作 (3)

第二章数据采集卡驱动开发总体方案 (5)

2.1 高速采集系统总体方案介绍 (5)

2.2 方案中各部件选取 (6)

2.3 数据采集卡驱动的开发流程 (8)

2.4 本章小结 (10)

第三章系统硬件及Linux开发环境的搭建 (11)

3.1 系统硬件 (11)

3.1.1 系统硬件总体结构 (11)

3.1.2 嵌入式控制器及其功能 (11)

3.1.3 PCIE高速数据采集卡 (13)

3.2 嵌入式Linux开发环境的建立 (13)

3.2.1 LTIB开发工具 (13)

3.2.2 开发环境建立 (14)

3.3 本章小结 (16)

第四章Linux系统移植 (17)

4.1 U-Boot移植 (17)

4.1.1 U-Boot简介 (17)

4.1.2 U-Boot移植要点 (17)

4.1.3 系统嵌入式控制器的U-Boot移植 (19)

4.2 Linux内核移植 (20)

4.2.1 Linux概述 (20)

4.2.2 Linux内核移植 (21)

4.3 构建Linux根文件系统 (24)

4.3.1 Linux根文件系统 (24)

4.3.2 根文件系统制作 (25)

4.4 本章小结 (29)

第五章Linux驱动程序 (30)

5.1 设备驱动概述 (30)

5.1.1 Linux设备的种类和特点 (30)

5.1.2 Linux设备驱动与计算机软硬件系统的关系 (31)

5.2字符设备驱动 (32)

5.3 Linux设备驱动的阻塞 (33)

III I

5.4 中断 (34)

5.4.1 Linux中断处理架构 (34)

5.4.2 Linux中断编程 (34)

5.5 本章小结 (35)

第六章PCIE高速数据采集卡驱动程序开发 (36)

6.1 PCI EXPRESS的配置空间 (36)

6.2 PCI EXPRESS的接口功能寄存器 (37)

6.3 PCIE高速数据采集卡驱动程序开发 (38)

6.3.1 驱动模块加载 (39)

6.3.2 pci_driver结构注册 (40)

6.3.3 PCIE驱动支持的硬件设备 (40)

6.3.4 probe成员函数 (41)

6.3.5 DMA操作 (45)

6.3.6 中断处理 (46)

6.3.7 文件操作 (48)

6.3.8 remove函数 (49)

6.3.9 模块卸载 (50)

6.4 本章小结 (50)

第七章系统各部分调试、加载与测试 (51)

7.1 Linux系统和驱动的调试 (51)

7.2 PCIE驱动程序的加载 (53)

7.3 PCIE驱动程序的测试 (55)

7.3.1 功能测试 (55)

7.3.2 PCIE采集卡配置寄存器空间测试 (56)

7.3.3 PCIE采集卡传输速度 (57)

7.4 本章小结 (58)

第八章结束语 (59)

致谢 (61)

参考文献 (62)

IV IV

第一章绪论

第一章绪论

1.1 课题研究背景

需求可以推动发展,当今社会人们对信息的渴求,对智能系统的期望,对网络的依赖,使得嵌入式获得了飞速发展的动力源泉。从1990年代开始,嵌入式经历了由初生到起步直到现在的飞速发展时期,已经在工业、消费等各个领域得到应用和发展。

由于嵌入式计算机主要用于专门领域,它的硬件的配置各不相同,不像通用计算机那样搭载的外设及其接口相差无几,它是根据不同的需求来订制。嵌入式系统的特点在于在系统中嵌入了处理器,专门针对特定的需求而设计、从本质属性来讲它又是一个计算机系统。就是系统的应用软件和系统的硬件融为一体。嵌入式系统与通用计算机上的系统不同,同时它在一定范围又具有较大的通用性,因此它又和那些为专门需求而设计的嵌入式系统又有所差别。嵌入式系统的功能比较少,相对来说比较简单,因此大小和成本受到了限制。

嵌入式系统由硬件、板级支撑包和软件构成[1]。

一个嵌入式硬件系统至少需要一个嵌入式处理器,这是嵌入式系统的心脏;能够对数据进行存取的存储器,例如作为内存的SDRAM、安装文件系统的FLAS H等等;还有相应的接口,如串口、网口、USB口等等;再添加系统供电的电源系统、时钟系统和数据存取的存储器既可以得到一个嵌入式控制板。

板级支撑包(BSP)处于系统的硬件和软件的中间,起到隔离软硬件的作用,同时又起到一个软硬件的桥梁的作用,当上层开发人员进行软件开发的时候,不用关心硬件的具体细节,只需要根据板级支撑包呈现的接口来编程即可。板级支撑包主要是做一些对硬件进行初始化及其配置、以及数据的输入、出等相应工作。

嵌入式软件部分则包含给用户管理软硬件资源的操作系统、进行文件管理的文件系统、给用户呈现图形的图形界面、以及提供网络的网络系统通等。有很多如Linux、Vxworks、Wince、Uc/OS-II

等系统都属于嵌入式操作系统。Linux操作系统因其成本低、可裁剪、占用资源少、移植性强等特点,在嵌入开发领域得到巨大的发展和应用。

1

电子科技大学硕士学位论文

嵌入式行业发展近几年,产品日臻完善,并在全世界各行业得到广泛应用。嵌入式的发展带动相关行产业链的发展,它的研发、生产已经带动了我国信息技术产业的业绩的持续增长,已经成为我国国民经济发展的重要推动力量。

现代人类对智能家电的需求,是嵌入式能够一展身手,同时推动了自身的大步前进。现代的智能网络电视、物联网、数码相机、3G/4G智能手机、智能洗衣机、汽车电子、智能游戏机等等,都是嵌入式领域的具体体现。据预测,随着网络技术的飞速发张和以ARM为代表的低价处理器的出现和持续更新,嵌入式将如影随形伴随在大众的身边。

随着需求的不断增大,我国嵌入式软件行业的发展越来越快,它的速度已然超越了全球嵌入式软件及中国软件业的发展,它在中国软件行业中已经占据重要位置。按照中国软件业的比重来划分,嵌入式软件的占比在中国软件业中超过的30%。中国嵌入式软件的发展之所以这么强劲和快速,主要跟良好的环境、政府加大支持、旺盛的需求等有关。

1.2 课题研究意义

数据采集系统是一个用来将模拟信号转换成数字信号并发送到相应的信号处理系统的典型嵌入式系统。在早期的开发阶段,基于微控制器单元的数据采集系统一度广泛应用。然而数字技术发展迅速,系统中信号的带宽和动态范围的不断增大,不仅对AD的采样率和带宽的要求变高,而且对采集到的信号的传输途中的各个功能部件的要求愈来愈高,如数据处理速度、内存资源等方面不在满足需求。

目前国内对高速数据采集系统的研发还处于初级阶段,因此对高速数据采集系统提出了需求。在高速信号经过模拟通道的调理,通过采集卡转换为数字信号并经由相应的传输途径传入控制器中,再根据处理需要将数据通过网络发送到相应处理端做处理或者通过高速高容量存储设备存储起来。高速信号通过这些设备就要求采集卡采集速度块、与主控制器的数据传输能力强,主控制器功能强大,操作系统的稳定性高、处理能力强。

基于上述需求,本文搭建了一种高速数据采集的软硬件系统。在这个系统中使用Freescale的MPC85xx作为主控制器,通过PCIE接口将FPGA作为主控制器的数据采集卡连接到主控制器上,搭建起高速数据采集嵌入式系统的硬件平台。并在主控制器上安装Linux操作系统,编写PCIE数据采集卡驱动程序,以实现高速

2 2

第一章绪论

数据采集。本课题目的在于研发一套性能优良、功能强大的高速数据采集系统。所以,该系统具有较为强大的实用价值。

数据由采集系统的硬件端到用户,用户可以通过这些采集到的数据做相应的处理工作。传输的过程中,用到了资源丰富、功能强大的嵌入式控制器,嵌入式控制器上需要安装操作系统来管理控制器上的资源。Linux内核是一个资源管理器,管理进程、内存和硬件设备,它的开源、免费、稳定、高效等优点使得它在嵌入式操作系统中经常被用到。基于这些优点,本课题在采集系统的嵌入式控制器上移植了Linux操作系统。

采集卡是数据采集的核心部分,它采集到的数据必须通过相应外围接口传输到控制器的Linux内核空间中才能被用户使用。而操作系统要识别采集卡并接受来自它的数据,应当编写采集卡的Linux驱动程序,在驱动程序中实现系统对采集卡初始化、提供设备与用户程序的接口、实现与控制器的数据交互。

1.3 课题工作

课题在已搭建的硬件平台基础上,按照控制器的硬件配备情况,配置并移植U-Boot、Linux操作系统,以及安装根文件系统,并设计了能够进行主总线DMA 传输的PCIE高速数据采集驱动程序。

本课题的主要工作如下:

(1)嵌入式数据采集系统的发展和需求分析

本文首先从嵌入式数据采集系统的发展现状出发,分析了高速数据采集系统研发的必要性和实用性。

(2)PCIE数据采集系统总体方案的搭建

文章对根据需求建立了一种高速数据采集系统方案,并对各功能部件的选取作了说明。还简单讲解了数据采集卡驱动的开发流程。

(3)系统硬件机卡发环境介绍

(4)Linux系统移植

Linux系统移植包括U-boot移植、内核移植及根文件系统制作。U-Boot是Linu x的启动引导程序,在系统移植之前,先行移植U-Boot。本文在对Bootloader的简介的基础上,详细的介绍了U-Boot的结构及其启动过程,并对U-Boot的移植做了深入剖析。安装了Linux操作系统,本文简单介绍了Linux及其优缺点,然后详细的阐述了Linux内核源码结构及其启动过程,并给出了Linux内核移植的具体方法

3

电子科技大学硕士学位论文

和步骤;本文还对Linux文件系统做了概述,在此基础上,对Linux根文件系统制作的方法做了介绍。

(5)Linux驱动程序的研究

本文在对Linux驱动程序及其分类做了概述的基础上,对字符设备驱动程序的基本结构做了详解,并对字符设备驱动中的注册、文件操作、阻塞、中断等做了详细的说明。

(6)PCIE高速数据采集卡驱动开发

为PCIE高速数据采集卡开发了驱动程序,并对其调试及对设计的预期功能和性能进行测试。

4 4

第二章 数据采集卡驱动开发总体方案

5

第二章 数据采集卡驱动开发总体方案

系统的设计方案是基于实际需求中提出的要求、指标来建立。应用中对系统功能、性能的要求成为系统设计的目标。用到的开发手段,应当是现阶段常被用到的或者已经具有一定的成熟度,并受到广泛的认可。从而以简化开发流程,节约时间,降低开发成本。

2.1 高速采集系统总体方案介绍

我们搭建起了一种高速数据采集嵌入式系统的方案。如图2.1所示,我们看到,高速数据采集系统由硬件层、系统层和应用层构成。其中,硬件包含主控制器和数据采集卡;系统层包含嵌入式Linux 操作系统和PCIE 数据采集卡驱动程序。P CIE 数据采集卡通过PCIE 接口连接到嵌入式控制器上,嵌入式控制安装Linux 操作系统并编写PCIE 采集卡驱动程序。系统工作的流程:信号经由模拟前端的电路调理后输入到数据采集卡的缓冲区中,在嵌入式控制器的控制下,通过驱动程序初始化采集卡并实现传输操作,将采集卡上的数据传输到Linux 操作系统内核,通过驱动程序的文件操作接口将数据由内核空间传输到用户以便使用。 嵌入式linux 系统

PCIE 采集卡驱动

应用层

MPC85xx 控制器

PCIE 数据采集卡

硬件层

信号

系统层

图2.1 高速数据采集嵌入式系统的方案

电子科技大学硕士学位论文

2.2 方案中各部件选取

高速数据采集系统方案的选择是基于它的数据传输速度快、传输数据量大的特性。这对系统的软硬件架构提出了要求:主控制器的功能强大、要求总线传输速度快、操作系统运行稳定可靠等等。

(1)控制器选取

嵌入式硬件控制器的种类繁多,它不仅体系结构众多,如主流的x86、ARM 、PowerPC等,而且很多生产厂商提供相同的体系结构的处理器,供开发人员选择的余地很大。在众多体系结构中,PowerPC芯片性能出色、技术先进,一般运用于通信、工业控制、网络存储等领域。在PowerPC芯片上一般都集成了PCIE、DDR、SATA控制器、千兆以太网等控制器。而在Freescale的MPC85xx控制器中,集成了一个具有显像、网络以及通信应用所需要的的系统逻辑的PowerPC?处理器核心。正是由于MPC85xx的上述有很好的契合了高速数据采集系统控制器的要求,因此我们选择它作为主控。

(2)采集卡与主控制器互联方式的选取

在本采集系统中,总线担当了采集卡与主控制器的通道,它是硬件设备之间的传输数据通路,总线的带宽、速度等因素对一个系统的性能影响巨大。即便是PowerPC的通信处理能力再强、内存的处理速度再高,如果作为运输通路的总线负载能力弱,同样会使数据交流缓慢,而起不到作用。因此有人将总线誉为计算机系的中枢。高速数据采集系统的数吉赫兹的采样率的特性决定总线的带宽高、抗干扰能力强,经过比较我们认为PCI Express是合适的。

在谈我们谈到PCI Express之前,我们就不得不提到PCI (Peripheral Component Interconnect)总线。PCI总线在1992年发布,因其结构简单、成本低、设计简单等众多优点,在过去的几十年中取得了巨大的成功,在并行总线中,在今天看来还具有很高的先进性,但是现在看来他有很多地方显得力不从心。

如表2.1所示,32位PCI总线能够提供峰值带宽从133MB/s到2131MB/s[2],但是随着需要传输处理的数据量越来越大,加之速度不断提高的传输方式如光纤、万兆以太网的发展,显然它是不够的。

PCI总线虽然在并行总线中优势巨大,但是它却无法跨越并行总线的固有缺陷:可互联的设备相对不多、比较难于扩展、并行总线的个信号线之间的干扰相对较大以致使之无法正常工作;连接的设备过多将会导致带宽的急剧变小而导致速度下降。考虑到价格因素和使线间的干扰达到较低的水平,可以采用降带宽或

6 6

第二章数据采集卡驱动开发总体方案

者地址、数据总线分时段分别使用的方式来解决,但是这样又会出现新问题:带宽利用率低。高速串行总线的提出,为解决并行总线固有的缺陷找到了出路,其中最出色之一的是PCI Express。

表2.1 PCI总线的时钟频率与带宽

总线类型时钟频率(MHz)峰值带宽(MB/s)

PCI 32/64位33/66 133/266

PCI 32/64位66/132 266/532

PCI-X 32/64位66/132 266/532

PCI-X 32/64位133/266 533/1066

PCI-X 32/64位266/532 1066/2132

PCI-X 32/64位533/1066 2131/4262

由于并行总线同时传输一个字,在并行总线上的信号的传输时间和到达时刻不同,这将导致时序偏差。串行总线不会出现时序偏差,因为在每个通道的每个方向上,只有一个差分信号。一个通道由两个差分信号对组成:一个接受数据,一个传输数据,每一个通道由四线组成。相较下来,PCI总线的速度仅为一半。每一个通道都可以进行全双工字节流传输,在每个方向上在一个链路的两个设备之间传输8位字节格式的数据包。两个设备之间的PCIe链路可以是1到32个通道的任何一个。在多通道链路中,数据包通过这些通道传输,而且它的数据吞吐量跟整体带宽向适应。PCIe标准定义了插槽和连接器的多链路宽度:x1,x4,x8,x1 6,x32。这就使得PCIe可以同时应用于那些对价格敏感而对高吞吐量不做要求和对性能苛刻诸如3D图形显示、10GB以太网和光纤通信等领域。

PCIe的频率为2.5Ghz,单通道的PCIe可以提供全双工500MBps的带宽,如果采用双通道x2,其带宽可以达到1个Ghz[3],而PCIe总线提供了x4、x8、x12、x16、x32模式。由此推之,可知它可以提供比PCI高得多、范围广得多的带宽。下表2.2为PCIe的不同链路时的带宽。

表2.2 PCI Express链路与带宽

PCI Express链路数X1 X2 X4 X8 X12 X16 X32

传输带宽(Gb/s) 5.0 10.0 20.0 40.0 60.0 80.0 160.0

有效带宽(Gb/s) 4.0 8.0 16.0 32.0 48.0 64.0 128.0

(3)嵌入式操作系统选取

Linux的开发现在已经成为免费、自由源码软件合作最流行的例子:基本的源

7

电子科技大学硕士学位论文

8 8

码可以被遵循GNU GPL 的任何人以商业或非商业目的使用、修改和发布。Linux 内核是一个资源管理器,管理进程、内存和硬件设备,决定系统的性能和稳定性。在众多操作系统中我们之所以选择Linux 及其2.6版本的内核,是它本身具有诸多与我们开发目标板相符合的优点,给我们的开发带来了极大的方便,同时2.6版本内核的性能在原来基础上具有重大提升。

2.3 数据采集卡驱动的开发流程

嵌入式Linux 驱动的开发不仅仅是开发某一设备的驱动代码,因为驱动程序本身就属于开发操作系统的一部分。而且,一般嵌入式控制器的操作系统都需要根据控制器的情况来移植。因此,数据采集卡的驱动开发流程如下图2.2所示,一共应当完成四项工作即:主机上建立交叉编译环境、Linux 操作系统移植、采集卡驱动的开发、测试驱动。 主机嵌入式开发环境搭建

Linux

系统移植PCIE 驱动程序开发

测试

U-boot 移植

内核移植

根文件系统制作

图2.2 驱动开发的流程

1、主机上建立叉编译环境

硬件部分已经调试无误后,应当在主控制器中安装嵌入式Linux 操作系统来管

第二章数据采集卡驱动开发总体方案

理资源。由于目标板一开始只是一个没有操作系统的电路板,因此不能用它来编译能够在自身上运行的操作系统和应用程序,加之目标板的专用性,它编译程序很慢。因此,一般都事先在主机上安装交叉编译环境,也就是在主机上编译的程序可以在控制器上运行。

交叉开发环境的建立主要包括了交叉工具链、glibc、各种服务和中断控制台minicon等。在本文中使用了集成的开发工具——LTIB工具。该工具由Freescale 公司提供,这个工具提供了交叉工具链、glibc、eglibc等工具,并具有U-Boot、内核镜像和文件系统的构建功能。在主机环境中,还应当安装能够实现主机与目标控制器的数据传输与共享的服务,如TFTP、NFS服务等。

2、Linux系统移植

由于嵌入式控制器的专用性和根据不同需求而设计的特点,应该按照硬件的配置情况来编译、安装的操作系统。Linux系统的移植包括三个部分:(1)系统引导程序的移植

U-Boot是Linux系统中一种功能强大、使用最多的内核引导程序,它将为内系统内核的启动设置软硬件环境、建立内存映射图,并将内核加载到内存中指定的地址,以使内核启动。

(2)Linux内核的移植

U-Boot启动之后加载内核到内存中,是内核镜像从静态存储中拷贝到内存中解压执行。内核应该根据硬件控制器的配置情况做相应的添加代码、配置选择。

(3)根文件系统制作。

根文件系统是嵌入式系统的重要部分,内核启动时将首先挂载根文件系统。它包括Linux内核的配置文件,启动系统的文件和脚本,以及应用程序及其需要的库文件。根文件系统采用Busybox工具制作。

3、PCIE数据采集卡驱动的开发

数据采集卡在有数据到来时,处理器才接受、并处理该数据;当采集卡处于空闲状态,没有数据提供给系统时,CPU应当执行其它任务。对于数据采集卡来说,这就要求CPU应当按照采集卡的需求作出响应。而这种机制比较合理的方式就是中断的方式:当采集卡有数据提交给系统时,采集卡产生中断,打断CPU的当前工作,是它处理这些数据。

在PCIE数据采集系统中,数据传输的速度快、数据量大的两大特点,要求采用一种即高效又不需要长期占有CPU的传输方式,无疑DMA(直接内存访问)的方式是最合理的。DMA的传输方式在提高了系统数据的吞吐能力,又避免了CPU

9

电子科技大学硕士学位论文

被长时间占用而导致的大量系统开销。

综合以上两点,PCIE数据采集卡驱动的核心工作——数据的传输采用DMA 和中断配合的方式来实现,这是编程中的重点。

4、驱动的测试

PCIE驱动的安装调试完成之后,应对其功能和性能指标测试,以检验其能否满足设计要求。PCIE驱动的功能和性能指标由测试程序完成。

2.4 本章小结

文章对根据需求建立了一种高速数据采集系统方案,并对各功能部件的选取作了说明。还简单讲解了数据采集卡驱动的开发总体流程。

10 10

第三章 系统硬件及Linux 开发环境的搭建

11

第三章 系统硬件及Linux 开发环境的搭建

本论文所讲述的高速数据采集嵌入式系统主要功能是进行数据采集,支持PC IE 总线等。根据项目我们选择了powerpc 体系结构的MPC85xx 系列处理器作为主控。

硬件以MPC85xx 处理器为核心,嵌入式系统内核版本为支持飞思卡尔某板的Linux-2.6.32-rc5,以通用引导程序u-boot 作为系统的bootloader 。采用交叉编译的方式编译内核、u-boot 以及驱动程序,交叉编译的主机环境是ubuntu11.04,开发工具是飞思卡尔的MPC85xx-ltib 。

本章介绍了系统硬件的基本情况和交叉编译环境的搭建。

3.1 系统硬件

3.1.1 系统硬件总体结构

高速数据采集嵌入式系统总体设计框图如图3.1所示,它由对输入信号进行调理的模拟前端、对数据进行采集和传输的PCIE 高速数据采集卡以及对数据进行接受和处理的嵌入式控制器三个部分组成。这里主要对PCIE 高速数据采集卡和嵌入式控制器进行简要说明。 FPGA DDR Ⅱ

PCIE 接口ADC MPC

85xx

模拟前端PCIE 高速数据采集卡

网络

大容

量硬盘

图3.1 高速数据采集系统硬件框架

3.1.2 嵌入式控制器及其功能

本论文所述的嵌入式主控制器是基于飞思卡尔的MPC8536E

电子科技大学硕士学位论文

12 12PowerQUICC 控制器。MPC8536E 集成了一个具有显像、连络以及通信应用所需要的的系统逻辑的PowerPC?处理器核心,MPC8536E 使用e500内核和高速互连技术,以平衡处理器与I/O 系统的吞吐量性能。它的CPU 频率为1GHZ ,内存大小为512MB 。E500核心实现增强的BookE 指令集体系结构,并提供了前所未有的硬件和软件调试支持。它具有如下特征:一个32位高性能BookE 增强型e500v2核,而且还具有36位物理寻址的能力;一个具有ECC 能力的512K 字节的L2高速缓存,能X OR 加速的SEC (Integrated security engine );先进的电源管理控制器,动态的功耗管理方式使功耗降低;三个USB2.0主、设备双角色控制器;两个具有TCP/IP 加速和归类能力的10/100/1000兆增强型三速以太网控制器,并具有通过SerDes 接口支持串行GMII 接口和对IEEE Std.1588TM 精确时间协议的硬件支持;三个使用SerDes 接口的PCI

Express?控制器;两个串行ATA 接口;DDR2/DDR3

SDRAM 内存控制器,它提供了对主存的存取并支持最大32GB 的主存;可编程中断控制器(PIC ),支持OpenPIC 体系的逻辑可编程结构,支持外部、信息、内部中断和全局高分辨率时钟;增强型串行外设接口(eSPI );四通道DMA 控制器;两个I2C 控制器;双通用异步接收器/发送器(DUART );增强型本地总线控制器(eLBC );16个可独立配置的通用I/O 信号;低成本PCB 封装引脚[4]。

控制器的功能主要是初始化并识别采集卡,获取采集卡上的资源,控制采集卡上DDR 的数据和控制器上内核空间内的数据进行交换,并可以将该数据与应用程序进行交换。采集到数据可以在控制器的控制下,由用户程序通过千兆网络接口传输到远端或者将数据通过SATA 接口传输到大容量硬盘中。这些数据是原始的数据,可以对这些数据作相应处理和分析。该控制器搭建起来的硬件结构图如图

3.2所示。 USB Host

USB

Device SATA SEC PCIe x4PCIe x2

100/1000

Ethernet

100/1000Ethernet Power Regulator DDR-2/

SDRAM

NAND Flash SD Card

MPC8536E PWR_EN

VDD

2

X64Local

Bus

图3.2 MPC85xx 主控制器框图

嵌入式Linux应用软件开发流程

从软件工程的角度来说,嵌入式应用软件也有一定的生命周期,如要进行需求分析、系统设计、代码编写、调试和维护等工作,软件工程的许多理论对它也是适用的。 但和其他通用软件相比,它的开发有许多独特之处: ·在需求分析时,必须考虑硬件性能的影响,具体功能必须考虑由何种硬件实现。 ·在系统设计阶段,重点考虑的是任务的划分及其接口,而不是模块的划分。模块划分则放在了任务的设计阶段。 ·在调试时采用交叉调试方式。 ·软件调试完毕固化到嵌入式系统中后,它的后期维护工作较少。 下面主要介绍分析和设计阶段的步骤与原则: 1、需求分析 对需求加以分析产生需求说明,需求说明过程给出系统功能需求,它包括:·系统所有实现的功能 ·系统的输入、输出 ·系统的外部接口需求(如用户界面) ·它的性能以及诸如文件/数据库安全等其他要求 在实时系统中,常用状态变迁图来描述系统。在设计状态图时,应对系统运行过程进行详细考虑,尽量在状态图中列出所有系统状态,包括许多用户无需知道的内部状态,对许多异常也应有相应处理。 此外,应清楚地说明人机接口,即操作员与系统间地相互作用。对于比较复杂地系统,形成一本操作手册是必要的,为用户提供使用该系统的操作步骤。为使系统说明更清楚,可以将状态变迁图与操作手册脚本结合起来。

在对需求进行分析,了解系统所要实现的功能的基础上,系统开发选用何种硬件、软件平台就可以确定了。 对于硬件平台,要考虑的是微处理器的处理速度、内存空间的大小、外部扩展设备是否满足功能要求等。如微处理器对外部事件的响应速度是否满足系统的实时性要求,它的稳定性如何,内存空间是否满足操作系统及应用软件的运行要求,对于要求网络功能的系统,是否扩展有以太网接口等。 对于软件平台而言,操作系统是否支持实时性及支持的程度、对多任务的管理能力是否支持前面选中的微处理器、网络功能是否满足系统要求以及开发环境是否完善等都是必须考虑的。 当然,不管选用何种软硬件平台,成本因素都是要考虑的,嵌入式Linux 正是在这方面具有突出的优势。 2、任务和模块划分 在进行需求分析和明确系统功能后,就可以对系统进行任务划分。任务是代码运行的一个映象,是无限循环的一段代码。从系统的角度来看,任务是嵌入式系统中竞争系统资源的最小运行单元,任务可以使用或等待CPU、I/O设备和内存空间等系统资源。 在设计一个较为复杂的多任务应用系统时,进行合理的任务划分对系统的运行效率、实时性和吞吐量影响都极大。任务分解过细会不断地在各任务之间切换,而任务之间的通信量也会很大,这样将会大大地增加系统的开销,影响系统的效率。而任务分解过粗、不够彻底又会造成原本可以并行的操作只能按顺序串行执行,从而影响系统的吞吐量。为了达到系统效率和吞吐量之间的平衡折中,在划分任务时应在数据流图的基础上,遵循下列步骤和原则:

CAN总线在嵌入式Linux下驱动程序的实现

CAN总线在嵌入式Linux下驱动程序的实现 时间:2009-11-05 09:41:22 来源:微计算机信息作者:黄捷峰蔡启仲郭毅锋田小刚 1 引言 基于嵌入式系统设计的工业控制装置,在工业控制现场受到各种干扰,如电磁、粉尘、天气等对系统的正常运行造成很大的影响。在工业控制现场各个设备之间要经常交换、传输数据,需要一种抗干扰性强、稳定、传输速率快的现场总线进行通信。文章采用CAN总线,基于嵌入式系统32位的S3C44B0X微处理器,通过其SPI接口,MCP2510 CAN控制器扩展CAN总线;将嵌入式操作系统嵌入到S3C44B0X微处理器中,能实现多任务、友好图形用户界面;针对S3C44B0X微处理器没有内存管理单元MMU,采用uClinux嵌入式操作系统。这样在嵌入式系统中扩展CAN设备关键技术就是CAN设备在嵌入式操作系统下驱动程序的实现。文章重点解决了CAN总线在嵌入式操作系统下驱动程序实现的问题。对于用户来说,CAN设备在嵌入式操作系统驱动的实现为用户屏蔽了硬件的细节,用户不用关心硬件就可以编出自己的用户程序。实验结果表明驱动程序的正确性,能提高整个系统的抗干扰能力,稳定性好,最大传输速率达到1Mb/s;硬件的错误检定特性也增强了CAN的抗电磁干扰能力。 2 系统硬件设计 系统采用S3C44B0X微处理器,需要扩展CAN控制器。常用的CAN控制器有SJA1000和MCP2510,这两种芯片都支持CAN2.0B标准。SJA1000采用的总线是地址线和数据线复用的方式,但是嵌入式处理器外部总线大多是地址线和数据线分开的结构,这样每次对SJA1000操作时需要先后写入地址和数据2次数据,而且SJA1000使用5V逻辑电平。所以应用MCP2510控制器进行扩展,收发器采用82C250。MCP2510控制器特点:1.支持标准格式和扩展格式的CAN数据帧结构(CAN2.0B);2.0~8字节的有效数据长度,支持远程帧;3.最大1Mb/s的可编程波特率;4.2个支持过滤器的接受缓冲区,3个发送缓冲区; 5.SPI高速串行总线,最大5MHz; 6.3~5.5V宽电压范围供电。MCP2510工作电压为3.3V,能够直接与S3C44B0X微处理器I/O口相连。为了进一步提高系统抗干扰性,可在CAN控制器和收发器之间加一个光隔6N137。其结构原理框图如图1: 图1.S3C44B0X扩展CAN结构框图图2.字符设备注册表 3 CAN设备驱动程序的设计 Linux把设备看成特殊的文件进行管理,添加一种设备,首先要注册该设备,增加它的驱动。设备驱动程序是操作系统内核与设备硬件之间的接口,并为应用程序屏蔽了硬件细节。在linux中用户进程不能直接对物理设备进行操作,必须通过系统调用向内核提出请求,

Linux设备驱动程序举例

Linux设备驱动程序设计实例2007-03-03 23:09 Linux系统中,设备驱动程序是操作系统内核的重要组成部分,在与硬件设备之间 建立了标准的抽象接口。通过这个接口,用户可以像处理普通文件一样,对硬件设 备进行打开(open)、关闭(close)、读写(read/write)等操作。通过分析和设计设 备驱动程序,可以深入理解Linux系统和进行系统开发。本文通过一个简单的例子 来说明设备驱动程序的设计。 1、程序清单 //MyDev.c 2000年2月7日编写 #ifndef __KERNEL__ #define __KERNEL__//按内核模块编译 #endif #ifndef MODULE #define MODULE//设备驱动程序模块编译 #endif #define DEVICE_NAME "MyDev" #define OPENSPK 1 #define CLOSESPK 2 //必要的头文件 #include //同kernel.h,最基本的内核模块头文件 #include //同module.h,最基本的内核模块头文件 #include //这里包含了进行正确性检查的宏 #include //文件系统所必需的头文件 #include //这里包含了内核空间与用户空间进行数据交换时的函数宏 #include //I/O访问 int my_major=0; //主设备号 static int Device_Open=0; static char Message[]="This is from device driver"; char *Message_Ptr; int my_open(struct inode *inode, struct file *file) {//每当应用程序用open打开设备时,此函数被调用 printk ("\ndevice_open(%p,%p)\n", inode, file); if (Device_Open) return -EBUSY;//同时只能由一个应用程序打开 Device_Open++; MOD_INC_USE_COUNT;//设备打开期间禁止卸载 return 0; } static void my_release(struct inode *inode, struct file *file)

linux驱动开发的经典书籍

linux驱动开发的经典书籍 结构、操作系统、体系结构、编译原理、计算机网络你全修过 我想大概可以分为4个阶段,水平从低到高 从安装使用=>linux常用命令=>linux系统编程=>内核开发阅读内核源码 其中学习linux常用命令时就要学会自己编译内核,优化系统,调整参数 安装和常用命令书太多了,找本稍微详细点的就ok,其间需要学会正则表达式 系统编程推荐《高级unix环境编程》,黑话叫APUE 还有《unix网络编程》 这时候大概还需要看资料理解elf文件格式,连接器和加载器,cmu的一本教材中文名为《深入理解计算机系统》比较好 内核开发阅读内核源码阶段,从写驱动入手逐渐深入linux内核开发 参考书如下《linux device drivers》,黑话叫ldd 《linux kernel development》,黑话叫lkd 《understading the linux kernel》,黑话叫utlk 《linux源码情景分析》 这四本书为搞内核的必读书籍 最后,第三阶段和第四阶段最重动手,空言无益,光看书也不罩,不动手那些东西理解不了 学习linux/unix编程方法的建议 建议学习路径: 首先先学学编辑器,vim, emacs什么的都行。 然后学make file文件,只要知道一点就行,这样就可以准备编程序了。 然后看看《C程序设计语言》K&R,这样呢,基本上就可以进行一般的编程了,顺便找本数据结构的书来看。 如果想学习UNIX/LINUX的编程,《APUE》绝对经典的教材,加深一下功底,学习《UNP》的第二卷。这样基本上系统方面的就可以掌握了。 然后再看Douglus E. Comer的《用TCP/IP进行网际互连》第一卷,学习一下网络的知识,再看《UNP》的第一卷,不仅学习网络编程,而且对系统编程的一些常用的技巧就很熟悉了,如果继续网络编程,建议看《TCP/IP进行网际互连》的第三卷,里面有很多关于应用

linux驱动程序的编写

linux驱动程序的编写 一、实验目的 1.掌握linux驱动程序的编写方法 2.掌握驱动程序动态模块的调试方法 3.掌握驱动程序填加到内核的方法 二、实验内容 1. 学习linux驱动程序的编写流程 2. 学习驱动程序动态模块的调试方法 3. 学习驱动程序填加到内核的流程 三、实验设备 PentiumII以上的PC机,LINUX操作系统,EL-ARM860实验箱 四、linux的驱动程序的编写 嵌入式应用对成本和实时性比较敏感,而对linux的应用主要体现在对硬件的驱动程序的编写和上层应用程序的开发上。 嵌入式linux驱动程序的基本结构和标准Linux的结构基本一致,也支持模块化模式,所以,大部分驱动程序编成模块化形式,而且,要求可以在不同的体系结构上安装。linux是可以支持模块化模式的,但由于嵌入式应用是针对具体的应用,所以,一般不采用该模式,而是把驱动程序直接编译进内核之中。但是这种模式是调试驱动模块的极佳方法。 系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作。同时,设备驱动程序是内核的一部分,它完成以下的功能:对设备初始化和释放;把数据从内核传送到硬件和从硬件读取数据;读取应用程序传送给设备文件的数据和回送应用程序请求的数据;检测和处理设备出现的错误。在linux操作系统下有字符设备和块设备,网络设备三类主要的设备文件类型。 字符设备和块设备的主要区别是:在对字符设备发出读写请求时,实际的硬件I/O一般就紧接着发生了;块设备利用一块系统内存作为缓冲区,当用户进程对设备请求满足用户要求时,就返回请求的数据。块设备是主要针对磁盘等慢速设备设计的,以免耗费过多的CPU时间来等待。 1 字符设备驱动结构 Linux字符设备驱动的关键数据结构是cdev和file_operations结构体。

《Linux设备驱动开发详解:基于最新的Linux 4.0内核》19. Linux电源管理系统架构和驱动

以下电子书来源于宋宝华《Linux设备驱动开发详解:基于最新的Linux 4.0内核》第19章《Linux电源管理系统架构和驱动》 本章导读 Linux在消费电子领域的应用已经铺天盖地,而对于消费电子产品而言,省电是一个重要的议题。 本章将介绍Linux设备树(Device Tree)的起源、结构和因为设备树而引起的驱动和BSP 变更。 19.1节阐述了Linux电源管理的总体架构。 19.2~19.8节分别论述了CPUFreq、CPUIdle、CPU热插拔以及底层的基础设施Regulator、OPP以及电源管理的调试工具PowerTop。 19.9节讲解了系统Suspend to RAM的过程以及设备驱动如何提供对Suspend to RAM的支持。 19.10节讲解了设备驱动的Runtime suspend。 本章是相对《Linux设备驱动开发详解(第2版)》全新的一章内容,也是Linux设备驱动工程师必备的知识体系。

第十九章Linux电源管理系统架构和驱动 1.Linux电源管理全局架构 Linux电源管理非常复杂,牵扯到系统级的待机、频率电压变换、系统空闲时的处理以及每个设备驱动对于系统待机的支持和每个设备的运行时电源管理,可以说和系统中的每个设备驱动都息息相关。 对于消费电子产品来说,电源管理相当重要。因此,这部分工作往往在开发周期中占据相当大的比重,图19.1呈现了Linux内核电源管理的整体架构。大体可以归纳为如下几类: 1.CPU在运行时根据系统负载进行动态电压和频率变换的CPUFreq 2.CPU在系统空闲时根据空闲的情况进行低功耗模式的CPUIdle 3.多核系统下CPU的热插拔支持 4.系统和设备对于延迟的特别需求而提出申请的PM QoS,它会作用于CPUIdle的具体 策略 5.设备驱动针对系统Suspend to RAM/Disk的一系列入口函数 6.SoC进入suspend状态、SDRAM自刷新的入口 7.设备的runtime(运行时)动态电源管理,根据使用情况动态开关设备 8.底层的时钟、稳压器、频率/电压表(OPP模块完成)支撑,各驱动子系统都可能用 到 图19.1 Linux电源管理系统架构 2.CPUFreq驱动 CPUFreq子系统位于drivers/cpufreq目录,负责进行运行过程中CPU频率和电压的动态

Linux驱动工程师成长之路

本人此刻还不是什么驱动工程师,连入门都谈不上,但我坚信在未来的3-5年我肯定能成为我想像中的人,因为我马上就要进入这一行工作了。写下这个日志来记录我是怎么最后成为我想像中的人才的,呵呵。 《Linux驱动工程师》这个东西是我在大二的时候看到有一篇讲如何学习嵌入式的,点击这里下载PDF,里面讲到嵌入式分为四层:硬件,驱动,系统,应用程序;还说linux驱动最难然后工资也最高就冲着他这句话我就决定我大学毕业的时候要去做这个linux驱动工程师,随后我就先后买了51单片机,ARM7,ARM9还有一大堆的视频教程准备来进行学习。我还跟我旁边那个哈工大哥们说:“我们学校像我这样的人很少,你们学校呢?”他说:“太少了,不过我们学校都是做这种板子卖的人比较多!”。行,你们牛!即使是买了这些东西,从大二到现在都快毕业了但感觉还是没有入门。回想一下我都学过什么啊:1:自己在ARM9上写bootloader(主要锻炼了三方面的知识:C语言应该写了有近万行的代码,ARM9的外设的基本操作方法如UART,LCD,TOUCH,SD,USB,ETHERNET...,makefile);2:移植和学习linux驱动。下面我说一下我学习Linux驱动的一个思路这也是我在面试的时候自我介绍中最重要的部分;1:硬件知识学习Linux驱动首先得了解这个驱动对应的硬件的一些基本原理和操作方法比如LCD你得了解它的场同步,行同步,像素时钟,一个像素的表示模式,还有就是这个LCD是怎么把图像显示在屏幕上的。如果是USB,SD卡就得了解相关协议。可以通过spec(协议)、datasheet来了解,这就是传说中的Linux驱动开发三件宝之二,还有一个就是linux相关源码。2:了解linux驱动框架linux下的每一类驱动差不多都是一个比较完善的子系统,比如FLASH的驱动它就属于MTD子系统从上到下分为四层:设备节点层,设备层,原始设备层,最下面的与具体硬件相关的硬件驱动层,通常要我们自己来实现就是最下面这个与具体硬件相关那部分代码。3:了解这个驱动的数据流。这个过程与第二个过程紧密相关,如果了解了驱动的框架差不多这个过程也算了解了。比如flash.在/dev/目录下有对应flash的字符设备文件和块设备文件,用户对这些文件进行读、写、ioctl操作,其间通过层层的函数调用最终将调用到最下面的硬件驱动层对硬件进行操作。了解这个过程我相信在调试驱动的时候是很有帮助。3:分析与硬件相关通常需要我们实现的那部分源代码。4:三板子上将驱动调试出来。每次调试都会出问题,但我买的板子提供的资料比较全调试过程中遇到的问题都比较浅显,即使是浅显的问题也要把它记录下来。(这个是我上次在华为面试的时候,那个人问我你调试驱动遇到过什么问题吗?你是如何解决的。当时我学习还没有到调试驱动这一步,所以那次面试也惨败收场)。 好像说了这么多,还没有进入正题《工作的选择》。在年前去了龙芯,实习2.8K,转正3.5k,环境还是不错,经理很好,头儿也很帅都是中科院的硕士。不过去了两周我就没去了身边的人都不太理解,我也一度有过后悔的时候,从龙芯出来应该是1月6号,也就是从那个时候开始我就没有再找工作,转而学习linux驱动。一直到上周日。上周日的晚上我就开始投简历一开始要找linux驱动,在智联里面输入linux驱动出来500来个职位,点开一看没有一个自己符合要求的,差不多都要3-5年经验本科,有时候好不容易有个实习的关键字在里面,一看要求硕士,严重打击了我的信心,哎不管了随便投,最后又投了一下嵌入式关键字的职位。最后就瞎申请,看看职位要求差不多就申请。周一来了,这周一共来了6个面试,创下了我求职以来的历史新高。周一下午面了一家感觉还不错不过到现在也没有给我一个通知,估计当时我要了4500把他给要跑了,这家是做测量的不是Linux驱动,差不多是把ARM当单片机用。周二上午一家也是要招linux驱动面了估计不到二分钟,他

从零开始搭建Linux驱动开发环境

参考: 韦东山视频第10课第一节内核启动流程分析之编译体验 第11课第三节构建根文件系统之busybox 第11课第四节构建根文件系统之构建根文件系统韦东山书籍《嵌入式linux应用开发完全手册》 其他《linux设备驱动程序》第三版 平台: JZ2440、mini2440或TQ2440 交叉网线和miniUSB PC机(windows系统和Vmware下的ubuntu12.04) 一、交叉编译环境的选型 具体的安装交叉编译工具,网上很多资料都有,我的那篇《arm-linux- gcc交叉环境相关知识》也有介绍,这里我只是想提示大家:构建跟文件系统中所用到的lib库一定要是本系统Ubuntu中的交叉编译环境arm-linux- gcc中的。即如果电脑ubuntu中的交叉编译环境为arm-linux-

二、主机、开发板和虚拟机要三者互通 w IP v2.0》一文中有详细的操作步骤,不再赘述。 linux 2.6.22.6_jz2440.patch组合而来,具体操作: 1. 解压缩内核和其补丁包 tar xjvf linux-2.6.22.6.tar.bz2 # 解压内核 tar xjvf linux-2.6.22.6_jz2440.tar.bz2 # 解压补丁

cd linux_2.6.22.6 patch –p1 < ../linux-2.6.22.6_jz2440.patch 3. 配置 在内核目录下执行make 2410_defconfig生成配置菜单,至于怎么配置,《嵌入式linux应用开发完全手册》有详细介绍。 4. 生成uImage make uImage 四、移植busybox 在我们的根文件系统中的/bin和/sbin目录下有各种命令的应用程序,而这些程序在嵌入式系统中都是通过busybox来构建的,每一个命令实际上都是一个指向bu sybox的链接,busybox通过传入的参数来决定进行何种命令操作。 1)配置busybox 解压busybox-1.7.0,然后进入该目录,使用make menuconfig进行配置。这里我们这配置两项 一是在编译选项选择动态库编译,当然你也可以选择静态,不过那样构建的根文件系统会比动态编译的的大。 ->Busybox Settings ->Build Options

编写嵌入式Linux设备驱动程序的实例教程

编写嵌入式Linux设备驱动程序的实例教程 一、Linux device driver 的概念 系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作。设备驱动程序是内核的一部分,它完成以下的功能: 1、对设备初始化和释放; 2、把数据从内核传送到硬件和从硬件读取数据; 3、读取应用程序传送给设备文件的数据和回送应用程序请求的数据; 4、检测和处理设备出现的错误。 在linux操作系统下有三类主要的设备文件类型,一是字符设备,二是块设备,三是网络设备。字符设备和块设备的主要区别是:在对字符设备发出读/写请求时,实际的硬件I/O一般就紧接着发生了,块设备则不然,它利用一块系统内存作缓冲区,当用户进程对设备请求能满足用户的要求,就返回请求的数据,如

果不能,就调用请求函数来进行实际的I/O操作。块设备是主要针对磁盘等慢速设备设计的,以免耗费过多的CPU时间来等待。 已经提到,用户进程是通过设备文件来与实际的硬件打交道。每个设备文件都都有其文件属性(c/b),表示是字符设备还是块设备?另外每个文件都有两个设备号,第一个是主设备号,标识驱动程序,第二个是从设备号,标识使用同一个设备驱动程序的不同的硬件设备,比如有两个软盘,就可以用从设备号来区分他们。设备文件的的主设备号必须与设备驱动程序在登记时申请的主设备号一致,否则用户进程将无法访问到驱动程序。 最后必须提到的是,在用户进程调用驱动程序时,系统进入核心态,这时不再是抢先式调度。也就是说,系统必须在你的驱动程序的子函数返回后才能进行其他的工作。如果你的驱动程序陷入死循环,不幸的是你只有重新启动机器了,然后就是漫长的fsck。 二、实例剖析 我们来写一个最简单的字符设备驱动程序。虽然它什么也不做,但是通过它可以了解Linux的设备驱动程序的工作原理。把

嵌入式Linux内核驱动开发学习路线图

【原创】嵌入式Linux内核驱动开发学习路线图 -------作者:尚观嵌入式 为什么选择学习嵌入式? 嵌入式系统无疑是当前最热门最有发展前途的IT应用领域之一,同时也是当今IT 领域仅存的几个金领职位之一。当前的中国IT人才面临严重的“后继乏人”,而且这种缺口由于培训缺乏、教育模式等原因造成的,而缺口最大的,就是高级IT人才。如果你从事的IT培训不专业,面对竞争越来越激烈的职场,基本找不到工作。据专家预测,嵌入式每年人才缺口在30万左右。 嵌入式行业平均薪资分布 嵌入式职业发展讲解视频 视频中主要讲解什么样的人适合从事嵌入式行业、嵌入式行业从业人员需要具备哪些基本素质、嵌入式行业的特点以及嵌入式行业的现状与发展。 嵌入式研发方向职业生涯讲解视频(1)嵌入式研发方向职业生涯 讲解视频(2) 嵌入式研发方向职业生涯讲解视频(3) 嵌入式研发方向职业生涯讲解视频(4)嵌入式研发方向职业生涯讲解视频(5) ARM+Linux嵌入式底层内核驱动方向学习总体路线图

基础学习Ⅰ---Linux入门 目前嵌入式主要开发环境有Linux、Wince等;Linux因其开源、开发操作便利而被广泛采用。而Linux操作系统也只是一个简单的操作系统,简单的使用对于嵌入式开发人员来说价值并不很高,真正有价值的是掌握Linux的基本服务和Linux的设计理念、思想,这对于嵌入式开发人员的长期发展是很极其重要的。Linux 系统有很多发行版,RedHat、Ubuntu、Fedora等。作为嵌入式开发人员,我们没有必要把精力放到使用哪个Linux发行版上,而是尽快把Linux系统尽快安装好。如果打算坚持长期学习,那么建议您把自己的电脑做成双系统,而不要在虚拟机上安装。 Ubuntu系统下载地址:https://www.doczj.com/doc/4773647.html,/?a=index&m=index&c=iframe&url=http%3A%2F%2Fwww.ubuntu.or https://www.doczj.com/doc/4773647.html,%2Fdesktop%2Fget-ubuntu%2Fdownload%2F A)经典书籍推荐:

嵌入式Linux驱动程序开发要点(20210201123523)

嵌入式Linux驱动程序开发要点 在Linux操作系统下有3类主要的设备文件类型:块设备、字符设备和网络设备。这种分类方法可以将控制输入/输出设备的驱动程序与其他操作系统软件分离开来。|字符设备与块设备的主要区别是:在对字符设备发出读/写请求时,实际的硬件 I/O 一般紧接着发生。块设备则不然,它利用一块系统内存作为缓冲区,若用户进程对设备的请求能满足用户的要求,就返回请求的数据;否则,就调用请求函数来 进行实际的I/O操作。块设备主要是针对磁盘等慢速设备设计的,以免耗费过多的CPU时间用来等待。网络设备可以通过BSD套接口访问数据。 每个设备文件都有其文件属性(c/b),表示是字符设备还是块设备。另外每个文件都有2个设备号,第一个是主设备号,标识驱动程序;第二个是从设备号,标识使用同一个设备驱动程序的、不同的硬件设备。设备文件的主设备号必须与设备驱动程序在登记时申请的主设备号一致,否则用户进程将无法访问驱动程序。 系统调用时操作系统内核与应用程序之间的接口,设备驱动程序是操作系统内核 与机器硬件之间的接口。设备驱动程序是内核的一部分,它完成以下功能: ?对设备初始化和释放 ?把数据从内核传送到硬件和从硬件读取数据 ?读取应用程序传送给设备文件的数据和回送应用程序请求的数据 ?佥测和处理设备出现的错误 MTD(Memory Tech no logy Device )设备是闪存芯片、小型闪存卡、记忆棒之类的设备,它们在嵌入式设备中的使用正在不断增加。MTD驱动程序是在Linux下专门为嵌入式环境开发的新的一类驱动程序。相对于常规块设备驱动程序,使用MTD驱动程序的 优点在于他们能更好的支持、管理给予闪存设备,有基于扇区的擦除和读/写操作的 更好的接口。 驱动程序结构 Linux的设备驱动程序可以分为3个主要组成部分: 1. 自动配置和初始化子程序,负责监测所要驱动的硬件设备是否存在和能否正常工作。如果该设备正常,则对这个设备及其相关的设备驱动程序需要的软件状态进行初始化。这部分驱动程序仅在初始化时被调用一次。 2. 服务于I/O请求的子程序,又称为驱动程序的上半部分。调用这部分程序是由于系统调用的结果。这部分程序在执行时,系统仍认为是与进行调用的进程属于同个进程,只是由用户态变成了核心态,具有进行此系统调用的用户程序的运行环境,因而可以在其中调用sleep()等与进行运行环境有关的函数。 3. 中断服务子程序,又称为驱动程序的下半部分。在Linux系统中,并不是直接从 中断向量表中调用设备驱动程序的中断服务子程序,而是由Linux系统来接 收硬件中断,再由系统调用中断服务子程序。中断可以在任何一个进程运行时产 生,因而在中断服务程序被调用时,不能依赖于任何进程的状态,也就不能调用任何

《基于Linux的驱动开发》PDF课件

远见品质
Linux内核与C代码
v Linux内核庞大,结构复杂
? 对Linux 2.4内核的统计:1万个文件,4百万行代码 ? 对Linux 2.6内核的统计:1.5万个文件,6百万行代码
v Linux内核的主体使用GNU C,在ANSI C
上进行了扩充
? Linux内核必须由gcc编译编译 ? gcc和Linux内核版本并行发展,对于版本的依赖性强 ? Linux 2.6内核建议使用gcc 3.3以上版本,C99编程风格
v 内核代码中使用的一些编程技巧,在通常
的应用程序中很少遇到
v 学好Linux、首先要学好C语言
《基于Linux的驱动开发》PDF课件

远见品质
linux 2.4 的内核目录结构
/arch /arch /drivers /drivers /kernel /kernel /lib /lib /boot /boot
/arm /arm
/alpha /alpha
/m68k /m68k /kernel /kernel /lib /mm /lib /mm
/mach-s3c2410 /mach-s3c2410
/Documentation /Documentation /ipc /ipc /fs /fs Linux2.4.x Linux2.4.x /include /include /mm /mm /init /init /net /net /scripts /scripts /asm-arm /asm-arm /arch-s3c2410 /arch-s3c2410 /linux /linux /proc-armv /proc-armv /net /net
《基于Linux的驱动开发》PDF课件

嵌入式Linux驱动开发基础总结(上篇)

嵌入式Linux驱动开发基础总结(上篇) 1, linux驱动一般分为3大类: *字符设备*块设备*网络设备 2, 开发环境构建: *交叉工具链构建*NFS和tftp服务器安装 3, 驱动开发中设计到的硬件: *数字电路知识*ARM硬件知识*熟练使用万用表和示波器*看懂芯片手册和原理图 4, linux内核源代码目录结构: *arch/: arch子目录包括了所有和体系结构相关的核心代码。它的每一个子目录都代表一种支持的体系结构,例如i386就是关于intel cpu及与之相兼容体系结构的子目录。*block/: 部分块设备驱动程序;*crypto: 常用加密和散列算法(如AES、SHA等),还有一些压缩和CRC校验算法;*documentation/: 文档目录,没有内核代码,只是一套有用的文档;*drivers/: 放置系统所有的设备驱动程序;每种驱动程序又各占用一个子目录:如,/block 下为块设备驱动程序,比如ide(ide.c)。如果你希望查看所有可能包含文件系统的设备是如何初始化的,你可以看drivers/block/genhd.c中的device_setup()。*fs/: 所有的文件系统代码和各种类型的文件操作代码,它的每一个子目录支持一个文件系统, 例如fat和ext2;*include/: include子目录包括编译核心所需要的大部分头文件。与平台无关的头文件在include/linux子目录下,与intel cpu相关的头文件在include/asm-i386子目录下,而include/scsi目录则是有关scsi设备的头文件目录;*init/: 这个目录包含核心的初始化代码(注:不是系统的引导代码),包含两个文件main.c和Version.c,这是研究核心如何工作的好的起点之一;*ipc/: 这个目录包含核心的进程间通讯的代码;*kernel/: 主要的核心代码,此目录下的文件实现了大多数linux系统的内核函数,其中最重要的文件当属sched.c;同样,和体系结构相关的代码在arch/i386/kernel下;*lib/: 放置核心的库代码;*mm/:这个目录包括所有独立于cpu 体系结构的内存管理代码,如页式存储

如何实现Linux设备驱动模型

文库资料?2017 Guangzhou ZHIYUAN Electronics Stock Co., Ltd. 如何实现Linux 设备驱动模型 设备驱动模型,对系统的所有设备和驱动进行了抽象,形成了复杂的设备树型结构,采用面向对象的方法,抽象出了device 设备、driver 驱动、bus 总线和class 类等概念,所有已经注册的设备和驱动都挂在总线上,总线来完成设备和驱动之间的匹配。总线、设备、驱动以及类之间的关系错综复杂,在Linux 内核中通过kobject 、kset 和subsys 来进行管理,驱动编写可以忽略这些管理机制的具体实现。 设备驱动模型的内部结构还在不停的发生改变,如device 、driver 、bus 等数据结构在不同版本都有差异,但是基于设备驱动模型编程的结构基本还是统一的。 Linux 设备驱动模型是Linux 驱动编程的高级内容,这一节只对device 、driver 等这些基本概念作介绍,便于阅读和理解内核中的代码。实际上,具体驱动也不会孤立的使用这些概念,这些概念都融合在更高层的驱动子系统中。对于大多数读者可以忽略这一节内容。 1.1.1 设备 在Linux 设备驱动模型中,底层用device 结构来描述所管理的设备。device 结构在文件中定义,如程序清单错误!文档中没有指定样式的文字。.1所示。 程序清单错误!文档中没有指定样式的文字。.1 device 数据结构定义 struct device { struct device *parent; /* 父设备 */ struct device_private *p; /* 设备的私有数据 */ struct kobject kobj; /* 设备的kobject 对象 */ const char *init_name; /*设备的初始名字 */ struct device_type *type; /* 设备类型 */ struct mutex mutex; /*同步驱动的互斥信号量 */ struct bus_type *bus; /*设备所在的总线类型 */ struct device_driver *driver; /*管理该设备的驱动程序 */ void *platform_data; /*平台相关的数据 */ struct dev_pm_info power; /* 电源管理 */ #ifdef CONFIG_NUMA int numa_node; /*设备接近的非一致性存储结构 */ #endif u64 *dma_mask; /* DMA 掩码 */ u64 coherent_dma_mask; /*设备一致性的DMA 掩码 */ struct device_dma_parameters *dma_parms; /* DMA 参数 */ struct list_head dma_pools; /* DMA 缓冲池 */ struct dma_coherent_mem *dma_mem; /* DMA 一致性内存 */ /*体系结构相关的附加项*/ struct dev_archdata archdata; /* 体系结构相关的数据 */ #ifdef CONFIG_OF

Linux驱动开发人员所需要做的工作

Linux驱动开发人员所需要做的工作 Boot Loader 当CPU一上电,此时CPU必须从NOR Flash或者NAND Flash中取指令,直接从 NAND Flash取指令的AP为支持Nand 启动。 Nand boot ,其实原理就是AP 内部的ROM里有一小段代码,包括NAND Flash驱动,它启动从Nand Flash中读取一段(比如4KB)到内部的SRAM中, 然后跳转到SRAM起始位置,执行SRAM中的代码。SRAM中的代码中包括初始化SDRAM,Nand Flash driver等,它的第一件事情就是初始化SDRAM, 然后把Nand Flash中的更多的东西(整个boot loader)搬到SDRAM中,然后执行uboot NOR boot : 代码就在NOR Flash中,直接执行,初始化CPU ,SDRAM 等,把整个uboot 搬到SDRAM中,然后执行uboot,在uboot中把kernel从 NAND Flash中读出。 对于常用的cpu , u boot 都支持,这块不需要改什么 对于u boot不支持的cpu , 需要写汇编,初始化cpu ,SDRAM ,NAND Flash驱动,NOR Flash驱动(setenv命令需要)等 在boot loader 中,还需要UART驱动,以支持打印信息。 另外要加上LCD 驱动,以支持splash ,否则在uboot阶段,没有任何显示。 正常启动 uboot,以引导linux 这些就够了。 但是对于一个产品: 它在研发阶段,uboot 必须支持TFTP , 需要网卡驱动(在boot loader中) 必须支持通过uboot下载,对于串口下载到内存,uboot本身支持,loadb,loady 等命令,但因为速度慢,所以 一般要uboot支持USB下载,可基于DFU的基础上改成bulk 传输。 同时对于生产ATE,把它放在uboot阶段对生产比较好,否则要等到整个系统起来,kernel+小测试文件系统也要10多妙。 这样的话,在ATE中需要加上 memory test ,LCD test, 声卡测试,需要加上I2C驱动,key test,RTC test,。

【免费下载】linux驱动开发的经典书籍

Linux 驱动开发的经典书籍 Linux 驱动学习的最大困惑在于书籍的缺乏,市面上最常见的书为 《linux_device_driver 3rd Edition 》,这是一本很经典的书,无奈Linux 的东东还是过于庞大,这本侧重于实战的书籍也只能停留在基本的接口介绍上,更深入的东东只能靠我们自己摸索了。但万事总有一个开头,没有对Linux 驱动整体框架的把握是很难做一个优秀的驱动开发者的。除了这本Jonathan Corbet, Greg Kroah-Hartman, Alessandro Rubini 合著的经典大作外,另一本理论实践并重的书就是《Linux Kernel Development,2nd Edition 》有著名的内核专家Robert Love 所著,通过Robert Love 的娓娓道来,相信你会感到自己功力的不断提升,但学习驱动,最本质的东西还是操作系统的一些基本的理论了,《Understanding The Linux Kernel, 3rd ed 2005》更加关注这一点,作为一个注重理论的经典之作,则是Linux 驱动研发人员内功的根基。但很遗憾的是,以上几本书都更侧重于编程者内功的修养,对于初学者而言,往往有过于深奥之感,关乎国内的书,也似乎只懂得copy 些代码做些粗浅的讲解,花拳绣腿的态势又过于明显。 成为一名精通 Linux 程序设计的高级程序员一直是不少朋友孜孜以求的目标。根据中华英才网统计数据,北京地区 Linux 程序员月薪平均为 Windows 程序员的 1.8 倍、Java 程序员的 2.6 倍, Linux 程序员年终奖金平均为 Windows 程序员的 2.9 倍。同时数据显示,随着工作经验的增长, Linux 程序员与 Windows 程序员的收入差距还有扩大的趋势。Denis 认为,要学好 Linux 环境下的编程,关键是要看对、选对、学会正确的书籍。可以说,如果你选对了 Linux 编程的经典书籍,配合你在程序设计工作中的刻苦钻研,成为一名精通 Linux 程序设计的高级程序员并非一件可望不可及的事情。但如果各位程序员朋友没有选对正确的书籍,则你的职业生涯之路就可能面临坎坷。今天,水煮鱼向各位朋友推荐的这些书,有的是资深老前辈们当初向水煮鱼的推荐,还有的是 IBM 的内部培训指定参考书,它们都很值得各位朋友抽空认真一读。 为什么要学习 Linux 环境下的编程 Linux 是一个开放、灵活、跨平台的操作系统,上至庞大的数据中心,下至可放于掌心中的嵌入式设备,无处没有 Linux 的身影。更为重要的是, Linux 是一个与 Unix 既一脉相承又与时俱进的系统。可以说,上世纪70年代学习的 Unix 知识和技巧,在今天仍然大有用武之地,这与 Windows 平台的开发形成了鲜明的对比。程序员不用担心今天微软出一个 .net ,明天又出一个 F#,使得自己过去学习的成果付之东流。 上个星期,水煮鱼与一位 Linux 项目经理聊天过程中,这位 Linux 项目经理告诉水煮鱼,他们项目的利润非常高,急需具备一定 Linux 编程知识的程序员。他说:“其实我们对程序员的编程技巧要求也并非很高,这是可以在工作中培训和提高的,关键是很多程序员连基本的 Linux 编程思想都不了解,我怎么聘用他们呢?我们去大学招聘的时候,给本科应届生开出 8000 元的月薪,但是就是很难招到人。我拿一些经典书籍中一些经典例子来考他们,他们基本上都是一问三不知。其实,如果他们能回答上一半的问题,我还是很愿意考虑是否聘用他们的。而对于项目相关部分的专业知识,我们有专业的内部培训,并不担心这个问题,关键是看应聘者是否具备 Linux 编程的基本思想。” 水煮鱼认为,这位项目经理朋友提到的问题还是很有代表性的。其实很多程序员朋友,只要能掌握这些书中的基础知识,是很容易脱颖而出的。事实上,项目经理他们也都很忙,并没有空去自己设计高难度的面试题目,而是直接采用经典书籍中的经典例子。 、管路敷设技术通过管线敷设技术,不仅可以解决吊顶层配置不规范问题,而且可保障各类管路习题到位。在管路敷设过程中,要加强看护关于管路高中资料试卷连接管口处理高中资料试卷弯扁度固定盒位置保护层防腐跨接地线弯曲半径标高等,要求技术交底。管线敷设技术中包含线槽、管架等多项方式,为解决高中语文电气课件中管壁薄、接口不严等问题,合理利用管线敷设技术。线缆敷设原则:在分线盒处,当不同电压回路交叉时,应采用金属隔板进行隔开处理;同一线槽内,强电回路须同时切断习题电源,线缆敷设完毕,要进行检查和检测处理。、电气课件中调试对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料试卷相互作用与相互关系,根据生产工艺高中资料试卷要求,对电气设备进行空载与带负荷下高中资料试卷调控试验;对设备进行调整使其在正常工况下与过度工作下都可以正常工作;对于继电保护进行整核对定值,审核与校对图纸,编写复杂设备与装置高中资料试卷调试方案,编写重要设备高中资料试卷试验方案以及系统启动方案;对整套启动过程中高中资料试卷电气设备进行调试工作并且进行过关运行高中资料试卷技术指导。对于调试过程中高中资料试卷技术问题,作为调试人员,需要在事前掌握图纸资料、设备制造厂家出具高中资料试卷试验报告与相关技术资料,并且了解现场设备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。 、电气设备调试高中资料试卷技术电力保护装置调试技术,电力保护高中资料试卷配置技术是指机组在进行继电保护高中资料试卷总体配置时,需要在最大限度内来确保机组高中资料试卷安全,并且尽可能地缩小故障高中资料试卷破坏范围,或者对某些异常高中资料试卷工况进行自动处理,尤其要避免错误高中资料试卷保护装置动作,并且拒绝动作,来避免不必要高中资料试卷突然停机。因此,电力高中资料试卷保护装置调试技术,要求电力保护装置做到准确灵活。对于差动保护装置高中资料试卷调试技术是指发电机一变压器组在发生内部故障时,需要进行外部电源高中资料试卷切除从而采用高中资料试卷主要保护装置。

相关主题
文本预览
相关文档 最新文档