365
Beijing Universal Pioneering Technology Co.,LTD. 第第第LINUX第第第第第第.............................................3 1.1第第第LINUX第第..................................................3 1.2 第第第LINUX第第第第第第.............................................5 1.3 第第第LINUX第第第第..............................................11 1.4 第第第LINUX第第第第第第第...........................................12 第第第 第第第第......................................................24 2.1 第第LINUX第第第第...............................................24 2.2 第第第第第第第第第................................................28 2.3 第第第第第第第第.................................................40 2.4 A/D第第第第..................................................51 2.5 D/A第第第第..................................................62 2.6 CAN第第第第第第................................................70 2.7第第第第第WEB第第第第第.............................................83 2.8 RS-485第第第第...............................................97 2.9第第第第第第...................................................107 2.10 8第第第第第第第第第第第第.........................................118 2.11 第第第第..................................................125 第第第 第第第第第第第第第第...............................................140 3.1 第第第第第QT第第第第第第...........................................140 3.2 QT DESIGNER第第第QT/E第第第第第...................................147 3.3 第第第第QTOPIA第第第第...........................................154 3.4 QTOPIA2.1.1第S2410第第第第第第..................................159 第第第 第第第第第第第 第第 ...............................................164 4.1 LINUX第第第第第第第第第...........................................164 4.2 第第第第第第第.................................................198 第第第 第第第第第第...................................................213 5.1第第第第第第第第第 第第第第第第第第 ........................................213 5.2第第第第第第第第 第第第第第 ...........................................237 5.3 IC第第第第第..............................................260 261 5.4 PS2第第第第第第第第..........................................281 282 5.5 SD第第第第第..............................................295 296 5.6 IDE_第第第第第第...........................................321 322 5.7第第第第第第第第第.............................................333 334 5.8第第第第第第第...............................................349 350 TEL010-82110740 82110741 82110742 82110743 FAX 828 1 http://w w w.up-tech.com 博博博博 UP-TECH

博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

  • Upload
    others

  • View
    22

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

第一章 嵌入式LINUX 开发基础知识............................................................................... 3

1.1 嵌入式LINUX 简介................................................................................. 31.2 嵌入式LINUX 开发平台简介.................................................................... 51.3 嵌入式LINUX 开发流程....................................................................... 111.4 嵌入式LINUX 开发环境的建立.............................................................. 12第二章 基础实验.................................................................................................................. 24

2.1 熟悉LINUX 开发环境........................................................................... 242.2 多线程应用程序设计........................................................................... 282.3 串行端口程序设计.............................................................................. 402.4 A/D 接口实验.................................................................................... 512.5 D/A 接口实验.................................................................................... 622.6 CAN 总线通讯实验........................................................................... 702.7 简单嵌入式WEB 服务器实验.............................................................. 832.8 RS-485 通讯实验.............................................................................. 972.9 直流电机实验.................................................................................... 1072.10 8 字数码管和点阵数码管实验........................................................... 1182.11 中断实验....................................................................................... 125第三章 图形界面应用程序设计....................................................................................... 140

3.1 安装与建立QT 桌面运行环境.............................................................. 1403.2 QT DESIGNER简介及QT/E 的交叉编译.................................................. 1473.3 建立本机QTOPIA 虚拟平台................................................................. 1543.4 QTOPIA2.1.1 在S2410 平台上的移植.................................................. 159第四章 内核与根文件系统实验....................................................................................... 164

4.1 LINUX 内核移植与编译实验................................................................. 1644.2 根文件系统实验................................................................................. 198第五章 驱动模块实验...................................................................................................... 213

5.1 内核驱动设计入门-模块方式驱动实验.................................................. 2135.2 内核驱动设计实验-触摸屏驱动........................................................... 2375.3 IC卡读写实验.............................................................................. 260 261 5.4 PS2键盘鼠标驱动实验................................................................. 281 282 5.5 SD 卡使用实验........................................................................... 295 296 5.6 IDE_ 硬盘读写实验.................................................................... 321 322 5.7 音频驱动及应用实验.................................................................... 333 334 5.8 双网卡演示实验........................................................................... 349 350

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

1

http://www.up-tech.com博创科技(UP-TECH)

Page 2: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

第六章 无线通讯实验.................................................................................................. 353354

6.1 GPS 通讯实验........................................................................... 353 354 6.2 GPRS 通讯实验........................................................................... 360 361 6.3 红外通讯实验.............................................................................. 366 367 6.4 蓝牙无线通讯实验....................................................................... 378 379 第七章 附录.................................................................................................................. 391392

7.1 常用LINUX 命令的使用.............................................................. 391 392 7.2 VI简介....................................................................................... 397 398

第一章 嵌入式Linux 开发基础知识

随着后PC 时代的到来,嵌入式系统技术已经成为了一个万众瞩目的焦点。目前已广

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

2

http://www.up-tech.com博创科技(UP-TECH)

Page 3: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

泛应用于信息家电、数据网络、工业控制、医疗卫生、航空航天等众多领域。巨大的市场潜力,无穷的商机,吸引了各路英豪纷踵沓来。

硬件方面,各大电子厂商相继推出了自己的专用嵌入式芯片,漫天而至的是mp3 ,PDA,无线上网装置,让人们充分感受到了这股强劲之势;软件方面,在Vxworks 、pSOS 、Neculeus 和Windows CE 等嵌入式操作系统引领下,也出现了空前繁荣的局面,但这些专用操作系统都是商业化产品,其高昂的价格使许多面向低端产品的小公司望而却步,并且其源代码的封闭性也大大限制了开发者的积极性。

近两年在我国登陆并蓬勃发展的Linux ,也已广泛应用于各类计算应用,不仅包括IBM的微型Linux 腕表、手持设备(PDA 和蜂窝电话) 、因特网装置、客户机、防火墙、工业机器人和电话基础设施设备,甚至还包括了基于集群的超级计算机。Linux 在高端服务器的优越表现及其天生具有的突出特点,就注定它必将在低端嵌入式系统中再次给人们以惊喜,而基于嵌入式Linux 操作系统的应用,必定给我们未来的工作和生活带来翻天覆地的变化。1.1 嵌入式Linux 简介

Linux 正在嵌入式开发领域稳步发展。Linux 使用 GPL,所有对特定开发板、PDA 、掌上机、可携带设备等使用嵌入式Linux 感兴趣的人都可以从因特网上免费下载其内核和应用程序,并开始移植和开发。许多 Linux 改良品种迎合了嵌入式市场,它们包括 RTLinux(实时 Linux )、uclinux (用于非 MMU 设备的 Linux )、Montavista Linux (用于 ARM 、MIPS 、PPC 的 Linux 分发版)、ARM-Linux (ARM 上的 Linux )和其它 Linux 系统。嵌入式Linux 的发展比较迅速。NEC 、索尼已经在销售个人视频录像机等基于Linux 的消费类电子产品,摩托罗拉则计划在其未来的大多数手机上使用Linux ,IBM 也制定了在手持机上运行Linux 的计划。

数年来,“Linux 标准库”组织一直在从事对在服务器上运行的Linux 进行标准化的工作,现在,嵌入式计算领域也开始了这一工作。嵌入式Linux 标准吸引了“Linux 标准库”以及Unix 组织中有益的元素。嵌入式系统中使用 Linux 的优点和缺点虽然大多数 Linux 系统运行在 PC 平台上,但Linux 也是嵌入式系统的可靠

主力。Linux 的安装和管理比 UNIX 更加简单灵活,这对于那些 UNIX 专家们来说又是一个优点,因为 Linux 中有许多命令和编程接口同传统的 UNIX 一样。但是对于习惯于WINDOWS 操作系统的人来说, 需要记忆大量的命令行参数却是一个缺点。随着LINUX 社团的不断努力,linux 的人机界面开发环境正在不断完善。典型的Linux 系统经过打包,在拥有硬盘和大容量内存的 PC 机上运行,嵌入式系

统不需要这么高的配置。一个功能完备的 Linux 内核要求大约 1 MB 内存。而 Linux 微内核只占用其中很小一部分内存,包括虚拟内存和所有核心的操作系统功能在

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

3

http://www.up-tech.com博创科技(UP-TECH)

Page 4: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

内,只需占用系统约100 K 内存。只要有 500 K 的内存,一个有网络栈和基本实用程序的完全的 Linux 系统就可以在一台 8 位总线(SX )的 Intel 386 微处理器上运行的很好了。由于内存要求常常是需要的应用所决定的,比如 Web 服务器或者 SNMP 代理,Linux 系统甚至可以仅使用 256 KB ROM 和 512 KB RAM 进行工作。因此它是一个瞄准嵌入式市场的轻量级操作系统。与传统的实时操作系统相比(RTOS ),采用象嵌入式 Linux 这样的开放源码的

操作系统的另外一个好处是 Linux 开发团体看来会比 RTOS 的供应商更快地支持新的 IP 协议和其它协议。例如,用于 Linux 的设备驱动程序要比用于商业操作系统的设备驱动程序多,如网络接口卡(NIC)驱动程序以及并口和串口驱动程序。

核心 Linux 操作系统本身的微内核体系结构相当简单。网络和文件系统以模块形式置于微内核的上层。驱动程序和其它部件可在运行时作为可加载模块编译到或者是添加到内核。这为构造定制的可嵌入系统提供了高度模块化的构件方法。而在典型情况下该系统需结合定制的驱动程序和应用程序以提供附加功能。

嵌入式系统也常常要求通用的功能,为了避免重复劳动,这些功能的实现运用了许多现成的程序和驱动程序,它们可以用于公共外设和应用。Linux 可以在外设范围广泛的多数微处理器上运行,并早已经有了现成的应用库。

Linux 用于嵌入式的因特网设备也是很合适的,原因是它支持多处理器系统,该特性使 Linux 具有了伸缩性。因而设计人员可以选择在双处理器系统上运行实时应用,提高整体的处理能力。例如,您可以在一个处理器运行 GUI ,同时在另一个处理器上运行 Linux 系统。

在嵌入式系统上运行 Linux 的一个缺点是 Linux 体系提供实时性能需要添加实时软件模块。而这些模块运行的内核空间正是操作系统实现调度策略、硬件中断异常和执行程序的部分。由于这些实时软件模块是在内核空间运行的,因此代码错误可能会破坏操作系统从而影响整个系统的可靠性,这对于实时应用将是一个非常严重的弱点。已经有许多嵌入式 Linux 系统的示例;可以有把握地说,某种形式的 Linux 能在几乎任一台执行代码的计算机上运行。

1.2 嵌入式Linux 开发平台简介

Linux 价格低廉、功能强大,可以运行在X86,Alpha,Sparc,MIPS,PPC,MOTOROLA ,NEC ,ARM 等硬件平台上,而且开放源代码,可以定制。我们所介绍的硬件平台是基于ARM 体系结构,由北京博创兴业科技有限公司开发的UP-CUP 3000 平台、UP-CUP 2410-S 平台系列以及UP-CUP P270A 平台系列实验仪器。UP-CUP 3000 平台的CPU 为ARM7TDMI 内核的三星S3C44B0X01 芯片,由于没有MMU (内存管理单元)只能运行uClinux ,UP-CUP 2410-S 平台系列的CPU 为ARM920T 内核的三星S3C2410 芯片,由于有MMU 可以运行标准的ARM-LINUX 内核。UP-CUP P270 平台系列实验仪器为Intel XSCALE

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

4

http://www.up-tech.com博创科技(UP-TECH)

Page 5: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

ARM10 系列CPU 。通过这些硬件平台,我们可以学习嵌入式LINUX 中的针对有MMU 和无MMU 的不同开发过程。UP-CUP 3000 平台和UP-CUP P270 平台系列产品及其相关资料可以访问博创公司的网站www.up-tech.com 获得。本书以S3C2410 系列中的UP-CUP S2410 经典平台为例,详细介绍嵌入式 Linux 的开发过程。

一、UP-CUP S2410 经典平台介绍

硬件配置 ( 本实验指导书是对S2410 的说明)

UP-CUP S2410 经典平台的硬件配置如表1.2.1 所示,实物如图1.2.1 所示:配置名称 型号 说明CPU ARM920T结构芯片三星S3C2410X 工作频率203MHzFLASH SAMSUNG K9F1208 64M NANDSDRAM HY57V561620AT -H 32M×2=64MEtherNet 网卡 DM9000AE 10/100M 自适应LCD LQ080V3DG01 8 寸16bit TFT触摸屏 SX-080-W4R-FB FM7843 驱动USB 接口 4 个HOST /1 个DEVICE 由 AT43301 构成 USB

HUBUART/IrDA 2 个RS232 ,1 个RS485 ,1 个IrDA AD 由S3C2410 芯片引出 3 个电位器控制输入AUDIO IIS 总线,UDA1341 芯片 44.1KHz 音频扩展卡插槽 168Pin EXPORT 总线直接扩展GPS_GPRS 扩展板

SIMCOM SIM300 GPRS 模块,Trimble’S GPS

支持双道语音通信IDE/CF 卡插座 笔记本硬盘,CF 卡 PS2 PC 键盘和鼠标 由ATMEGA8单片机控

制IC卡座 AT24CXX 系列 由ATMEGA8 单片机控

制LED 8x8 矩阵LED及2 个LED数码管 由总线控制VGA Vga 输出中断键 1 个 ENT控制LED 由3 个IO 口控制DC 电机 由PWM 控制 闭环测速功能CAN BUS 由 MCP2510 和TJA1050构成Double DA MAX504 一个10位DAC 端口

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

5

http://www.up-tech.com博创科技(UP-TECH)

Page 6: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

调试接口 板载JTAG ,直接支持下载与仿真 25 针表1.2.1 UP-CUP S2410 经典平台的硬件配置

图1.2.1 UP-CUP S2410 经典平台

二、S3C2410 芯片介绍

S3C2410X 芯片集成了大量的功能单元,包括:1 . 内部1.8V ,存储器3.3V ,外部IO 3.3V ,16KB 数据CACH ,16KB 指令CACH ,MMU ;2 . 内置外部存储器控制器(SDRAM 控制和芯片选择逻辑);3 . LCD 控制器(最高4K 色 STN和256K 彩色TFT),一个LCD 专用DMA ;4 . 4 路带外部请求线的DMA ;5 . 三个通用异步串行端口(IrDA1.0, 16-Byte Tx FIFO, and 16-Byte Rx FIFO ),2通道SPI ;6 . 一个多主IIC 总线,一个IIS 总线控制器;7 . SD 主接口版本1.0 和多媒体卡协议版本2.11 兼容;8 . 2 个USB HOST ,一个USB DEVICE (VER1.1 );9 . 4 个PWM 定时器和一个内部定时器;10 .看门狗定时器;

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

6

http://www.up-tech.com博创科技(UP-TECH)

Page 7: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

11 .117个通用IO ;12 .24 个外部中断;13 .电源控制模式:标准、慢速、休眠、掉电;14 .8 通道10 位ADC 和触摸屏接口;15 .带日历功能的实时时钟;16 .芯片内置PLL ;17 .设计用于手持设备和通用嵌入式系统;18 .16 /32 位RISC 体系结构,使用ARM920T CPU 核的强大指令集;19 .ARM 带MMU 的先进的体系结构支持WINCE 、EPOC32、LINUX ;20 .指令缓存(cache)、数据缓存、写缓冲和物理地址TAG RAM ,减小了对主存储器带宽和性能的影响;21 .ARM920T CPU 核支持 ARM 调试的体系结构;22 .内部先进的位控制器总线(AMBA2.0, AHB/APB) .

其结构图如图1.2.2 所示:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

7

http://www.up-tech.com博创科技(UP-TECH)

Page 8: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图1.2.2 S3C2410X芯片

三、系统管理

1 . 小端/大端支持;2 . 地址空间:每个BANK128MB (全部1G 字节);3 . 每个BANK 可编程为8/16/32位数据总线;4 . bank 0 到bank 6 为固定起始地址;5 . bank 7 可编程BANK起始地址和大小;6 . 一共8 个存储器BANK ;

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

8

http://www.up-tech.com博创科技(UP-TECH)

Page 9: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

7 . 6 个存储器BANK 用于ROM, SRAM 和其他;8 . 2 个存储器BANK 用于ROM, SRAM 和同步DRAM;9 . 每个存储器BANK 可编程存取周期;10 .支持等待信号用以扩展总线周期;11 .支持SDRAM 掉电模式下的自刷新;12 .支持不同类型的ROM 用于启动NOR/NAND Flash, EEPROM 和其他。

四、芯片封装

272-FBGA封装图如图1.2.3 所示:

图1.2.3 272-FBGA 封装

1.3 嵌入式Linux 开发流程

嵌入式linux 开发,根据应用需求的不同有不同的配置开发方法,但是一般都要经过以下过程:建立开发环境。操作系统一般使用REDHAT -LINUX ,版本7 到9 都可以,选择定制

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

9

http://www.up-tech.com博创科技(UP-TECH)

Page 10: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

安装或全部安装,通过网络下载相应的GCC 交叉编译器进行安装(比如arm-linux-gcc 、arm-uclibc-gcc ),或者安装产品厂家提供的交叉编译器。配置开发主机。配置MINICOM ,一般参数为波特率115200 ,数据位8 位,停止位1 ,无奇偶校验,软硬件控制流设为无。在WINDOWS 下的超级终端的配置也是这样。MINICOM 软件的作用是作为调试嵌入式开发板信息输出的监视器和键盘输入的工具;配置网络,主要是配置NFS网络文件系统,需要关闭防火墙,简化嵌入式网络调试环境设置过程。建立引导装载程序BOOTLOADER,从网络上下载一些公开源代码的BOOTLOADER,如U-BOOT、BLOB 、VIVI、LILO 、ARM-BOOT 、RED-BOOT 等,根据自己具体芯片进行移植修改。有些芯片没有内置引导装载程序,比如三星的ARM7、ARM9系列芯片,这样就需要编写烧写开发板上flash 的烧写程序,网络上有免费下载的WINDOWS 下通过JTAG 并口简易仿真器烧写ARM 外围flash 芯片的程序。也有LINUX 下公开源代码的J-FLASH程序。如果不能烧写自己的开发板,就需要根据自己的具体电路进行源代码修改。这是让系统可以正常运行的第一步。如果你购买了厂家的仿真器当然比较容易烧写flash 了,但是其中的核心技术是无法了解的。这对于需要迅速开发应用的人来说可以极大地提高开发速度。下载别人已经移植好的LINUX 操作系统,如UCLINUX 、ARM-LINUX 、PPC-LINUX等,如果有专门针对你所使用的CPU 移植好的LINUX 操作系统那是再好不过,下载后再添加自己的特定硬件的驱动程序,进行调试修改,对于带MMU 的CPU 可以使用模块方式调试驱动,对于UCLINUX 这样的系统好像只能编译进内核进行调试。建立根文件系统,从www.busybox.net 下载使用BUSYBOX 软件进行功能裁减,产生一个最基本的根文件系统,再根据自己的应用需要添加其他的程序。默认的启动脚本一般都不会符合应用的需要,所以就要修改根文件系统中的启动脚本,它的存放位置位于/etc目录下,包括:/etc/init.d/rc.S、/etc/profile 、/etc/.profile 等,自动挂装文件系统的配置文件/etc/fstab ,具体情况会随系统不同而不同。根文件系统在嵌入式系统中一般设为只读,需要使用mkcramfs 、genromfs 等工具产生烧写映象文件。建立应用程序的flash 磁盘分区,一般使用JFFS2 或YAFFS文件系统,这需要在内核中提供这些文件系统的驱动,有的系统使用一个线性flash (NOR 型)512K -32M ,有的系统使用非线性flash (NAND型)8 -512M ,有的两个同时使用,需要根据应用规划flash 的分区方案。开发应用程序,可以下载到根文件系统中,也可以放入YAFFS、JFFS2 文件系统中,有的应用程序不使用根文件系统,而是直接将应用程序和内核设计在一起,这有点类似于UCOS-II 的方式。烧写内核、根文件系统、应用程序。发布产品。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

10

http://www.up-tech.com博创科技(UP-TECH)

Page 11: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

1.4 嵌入式Linux 开发环境的建立

嵌入式LINUX 开发环境有几个方案:1 、基于PC 机WINDOWS 操作系统下的CYGWIN ;2 、在WINDOWS 下安装虚拟机后,再在虚拟机中安装LINXUX 操作系统;3 、直接安装LINUX 操作系统。基于WINDOWS 的环境要么有兼容性问题,要么速度有影响,所以我推荐大家使用纯LINUX 操作系统开发环境。我们实际的开发环境为REDHAT9 ,它已经支持中文,并且包含了绝大部分的开发工具,不用担心装了LINUX 就不能使用WINDOWS 的问题。一般的情况都是用户已经有了WINDOWS 操作系统,再安装LINUX ,LINUX 会自动安装一个叫作GRUB的启动引导软件,可以选择引导多个操作系统。

一、预备知识

绝大多数Linux 软件开发都是以native 方式进行的,即本机(HOST)开发、调试,本机运行的方式。这种方式通常不适合于嵌入式系统的软件开发,因为对于嵌入式系统的开发,没有足够的资源在本机(即板子上系统)运行开发工具和调试工具。通常的嵌入式系统的软件开发采用一种交叉编译调试的方式。交叉编译调试环境建立在宿主机(即一台PC 机)上,对应的开发板叫做目标板。运行Linux 的PC 【宿主机】开发时使用宿主机上的交叉编译、汇编及连接工具形成可执行的二进制代码(这种可执行代码并不能在宿主机上执行,而只能在目标板上执行),然后把可执行文件下载到目标机上运行。调试时的方法很多,可以使用串口,以太网口等,具体使用哪种调试方法可以根据目标机处理器提供的支持作出选择。宿主机和目标板的处理器一般不相同,宿主机为Intel 处理器,而目标板如UP-CUP S2410 经典平台开发板为三星S3c2410.GNU 编译器提供这样的功能,在编译器编译时可以选择开发所需的宿主机和目标机从而建立开发环境。所以在进行嵌入式开发前第一步的工作就是要安装一台装有指定操作系统的PC 机作宿主开发机,对于嵌入式LINUX ,宿主机上的操作系统一般要求为REDHAT LINUX 。嵌入式开发通常要求宿主机配置有网络,支持NFS(为交叉开发时mount 所用)。然后要在宿主机上建立交叉编译调试的开发环境。环境的建立需要许多的软件模块协同工作,这将是一个比较繁杂的工作,但现在已通过博创嵌入式教学套件中光盘的安装而自动完成了。

二、对开发PC 机的性能要求

由于Redhat9.0 安装后占用空间约为2.4G -5G 之间,还要安装ARM-LINUX 开发软件,因此对开发计算机的硬盘空间要求较大。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

11

http://www.up-tech.com博创科技(UP-TECH)

Page 12: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

硬件要求:CPU :高于奔腾500M ,推荐高于赛扬1.7G ;内存:大于128M ,推荐256M ;硬盘:大于10G ,推荐高于40G 。

三、开发工具软件的安装与配置

1 .REDHAT LINUX 9.0 的安装在一台PC 上安装RedHat LINUX9.0 ,选择Custom 定制安装,在选择软件Package 时最好将所有包都安装,需要空间约2.7G ,如果选择最后一项:everything ,即完全安装,将安装3 张光盘的全部软件,需要磁盘空间大约5G 。因此建议提前为REDHAT LINUX 的安装预留大约5 -15G 的空间,具体视用户的硬盘空间大小来确定,在安装完Redhat 后还要安装Linux 的编译器和开发库以及ARM-Linux 的所有源代码,这些包安装后的总共需要空间大约为800M 。2 .开发工具软件的安装将博创兴业科技有限公司提供的附带开发工具光盘插入CDROM ,然后执行以下命令:

mount /dev/cdrom /mnt

若系统不识别/dev/cdrom 的话,可以用如下命令,假设CDROM 为从盘,即为/dev/hdb ,则:

mount –t iso9660 /dev/hdb /mnt

如果使用linux 虚拟机以上两步我们就不必做了,参考linux 虚拟机使用说明里的Samba 服务器的的配置

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

12

http://www.up-tech.com博创科技(UP-TECH)

Page 13: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

安装脚本程序将自动建立/arm2410cl 目录,并将所有开发软件包安装到/arm2410cl 目

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

13

http://www.up-tech.com博创科技(UP-TECH)

Page 14: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

录下,同时自动配置编译环境,建立合适的符号连接。注意:安装完成后看一下主编译器Armv4l-unknown-linux-gcc 是否在 /opt/host/armv4l/bin/ , 如 果 不 是 这 个 路 径 , 请 使 用 vi 修 改 /root/.bash_profile 文 件 中 PATH 变 量 为PATH=$PATH:$HOME/bin:/opt/host/armv4l/bin/ , 存 盘 后 执 行 : source /root/.bash_profile ,则以后armv4l-unknown-linux-gcc 会自动搜索到,可以在终端上输入armv ,然后按tab 键,会自动显示armv4l-unknown-linux-

3 .开发环境配置配置网络,包括配置IP地址、NFS服务、防火墙。网络配置主要是要安装好以太网卡,对于一般常见的RTL8139 网卡,REDHAT9.0 可以自动识别并自动安装好,完全不要用户参与,因此建议使用该网卡。然后配置宿主机IP为192.168.0.121 。如果是在有多台计算机使用的局域网环境使用此开发设备,IP地址可以根据具体情况设置。如图1.4.1 所示:

图1.4.1 网络配置双击设备eth0 的蓝色区域,进入以太网设置界面,如图1.4.2 ,1.4.3 所示:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

14

http://www.up-tech.com博创科技(UP-TECH)

Page 15: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图1.4.2 以太网常规设置界面

图1.4.3 以太网路由设置界面

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

15

http://www.up-tech.com博创科技(UP-TECH)

Page 16: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

对于REDHAT9.0 ,它默认的是打开了防火墙,因此对于外来的IP 访问它全部拒绝,这样其它网络设备根本无法访问它,即无法用NFS mount 它,许多网络功能都将无法使用。因此网络安装完毕后,应立即关闭防火墙。操作如下:点击红帽子开始菜单,选择安全级别设置,选中无防火墙。如图1.4.4 所示:

图1.4.4 安全级别设置在系统设置菜单中选择服务器设置菜单,再选中服务菜单,将iptables服务的勾去掉, 并确保nfs 选项选中。配置NFS:点击主菜单运行系统设置-> 服务器设置->NFS 服务器(英文为:SETUP->SYSTEM SERVICE->NFS ),点击增加出现如下在界面,在目录(Drictory) :中填入需要共享的路径,在主机(Hosts) :中填入允许进行连接的主机IP地址。并选择允许客户对共享目录的操作为只读(Read -only )或读写(Read/write) 。如图1.4.5 所示:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

16

http://www.up-tech.com博创科技(UP-TECH)

Page 17: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图1.4.5 NFS 基本设置图1.4.6 是对客户端存取服务器的一些其他设置,一般不需要设置,取默认值。

图1.4.6 NFS 用户访问设置当将远程根用户当作本地根用户时, 对于操作比较方便, 但是安全性较差。最后退出时则

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

17

http://www.up-tech.com博创科技(UP-TECH)

Page 18: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

完成NFS 配置。配置好后,界面应显示如图1.4.7 所示:

图1.4.7 远程根用户当作本地根用户

图1.4.8配置好的NFS我们也可以手工编写/etc/exports文件,其格式如下:共享目录 可以连接的主机(读写权限,其他参数)

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

18

http://www.up-tech.com博创科技(UP-TECH)

Page 19: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

例如:/arm2410cl 192.168.0.*(rw,sync)

表示将本机的/arm2410cl 目录共享给ip地址为192.168.0.1 -192.168.0.254 的所有计算机,可以读取和写入。配置完成后,可用如下办法简单测试一下NFS 是否配置好了:在宿主机上自己mount 自己,看是否成功就可以判断NFS 是否配好了。例如在宿主机/ 目录下执行:

mount 192.168.0.10:/arm2410cl /mnt

其中192.168.0.10 应为主机的IP地址。然后到/mnt/ 目录下看是否可以列出/arm2410cl 目录下的所有文件和目录,可以则说明mount 成功,NFS 配置成功。4 .配置MINICOM: 1 .在linux 操作系统Xwindow界面下建立终端(在桌面上点击右键——> 新建终端), 在终端的命令行提示符后输入minicom ,回车,你就会看到minicom 的启动画面(见图1.4.9)。若没有启动Xwindow则在命令行提示符后直接输入minicom 即可。

图1.4.9 minicom启动画面2 .minicom 启动后,先按Ctrl +A 键,再按Z 键(注意不是连续按,Ctrl+A松开后才按Z ),进入主配置界面(见图1.4.10 )。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

19

http://www.up-tech.com博创科技(UP-TECH)

Page 20: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图1.4.10 主配置界面按“O” 进入配置界面,如图1.4.11 配置界面

图1.4.11 配置界面按上下键选择Serial port setup ,进入端口设置界面,这里有几个重要选项改为如下值(见图1.4.12 ):

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

20

http://www.up-tech.com博创科技(UP-TECH)

Page 21: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

(在Change which setting 后按哪个字母就进入哪项的配置,如按A进行端口号配置。)A————Serial Device :/dev/ttyS0 (端口号使用串口1 )E————BPS/par/bits :/115200 8N1 (波特率)

F ,E 硬件流,软件流都改为NO ,若要使用PC 机的串口2 来接板子的串口1 做监控,改为:/dev/ttyS1 即可。3.选好后按ESC键退出到图1.4.11 所示画面,选择Save setup as df1保存退出,以后只要启动minicom 就是该配置,无需再做改动。4.配置完成后,用串口线连接好pc机和2410经典版平台, 启动2410经典版平台,即可在minicom 上看到启动信息,并可以执行操作控制。

图1.4.12 端口设置界面

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

21

http://www.up-tech.com博创科技(UP-TECH)

Page 22: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

Linux 开发软件的安装目录结构表格1.4.1 均以/arm2410cl 目录为起点:

表1.4.1 /arm2410cl 下的文件说明目录名 说明busybox-1.00-pre10 Busybox-1.00 源代码doc arm2410-S linux 使用说明书Qt Qt 应用程序和库的源代码insight-6.0 Linux 下源代码查看器root 2410-S 平台根文件系统kernel-2410classic 2410-CL 平台linux 内核源代码demos 所有实验演示程序img vivi 系统引导程序

zImage ARMLINUX-2.4 内核压缩映象文件root.cramfs 根文件系统映象文件 yaffs.tar.bz2 demos 演示程序的压缩文件

exp 实验例程源码sh mount-dos.sh linux 下挂装windows 的分区示例脚本

linux 下挂装windows 的分区示例脚本。mnt_udisk.sh MOUNT U 盘mkroot.sh 制作根文件系统的脚本

编译器安装路径说明如表1.4.2 所示:表1.4.2 编译器安装路径说明

编译器 安装目录 说明arm-elf-gcc-2.95.3 /opt/host/armv4l 应用开发库和头文件Armv4l-unknown-linux-gcc /opt/host/armv4l/bin 主编译器上述诸多程序的源代码都在光盘中提供.在安装完成LINUX 后,就是对LINUX 的网络环境的配置,最主要是配置NFS服务器。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

22

http://www.up-tech.com博创科技(UP-TECH)

Page 23: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

第二章 基础实验

2.1 熟悉Linux 开发环境

一、实验目的

熟悉Linux 开发环境,学会基于S3C2410 的Linux 开发环境的配置和使用。使用Linux的armv4l-unknown-linux-gcc 编译,使用基于NFS方式的下载调试,了解嵌入式开发的基本过程。

二、实验内容

本次实验使用Redhat Linux 9.0 操作系统环境, 安装ARM-Linux 的开发库及编译器。创建一个新目录,并在其中编写hello.c 和Makefile 文件。学习在Linux 下的编程和编译过程,以及ARM 开发板的使用和开发环境的设置。下载已经编译好的文件到目标开发板上运行。

三、预备知识

C 语言的基础知识、程序调试的基础知识和方法,Linux 的基本操作。

四、实验设备及工具(包括软件调试工具)

硬件:UP-CUP S2410 经典平台、PC 机Pentium 500 以上, 硬盘10G 以上。软件:PC 机操作系统REDHAT LINUX 9.0 +MINICOM +ARM-LINUX 开发环境

五、实验步骤

1 、建立工作目录[root@zxt smile]# mkdir hello[root@zxt smile]# cd hello

2 、编写程序源代码

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

23

http://www.up-tech.com博创科技(UP-TECH)

Page 24: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

在Linux 下的文本编辑器有许多,常用的是vim 和Xwindow 界面下的gedit 等,我们在开发过程中推荐使用vim ,用户需要学习vim 的操作方法,请参考相关书籍中的关于vim的操作指南。 Kdevelope 、anjuta 软件的界面与vc6.0 类似,使用它们对于熟悉windows 环境下开发的用户更容易上手。实际的hello.c 源代码较简单,如下:#include <stdio.h>main(){

printf(“hello world \n”);}

我们可以是用下面的命令来编写hello.c 的源代码,进入hello 目录使用vi命令来编辑代码:

[root@zxt hello]# vi hello.c

按“i”或者“a” 进入编辑模式,将上面的代码录入进去,完成后按Esc键进入命令状态,再用命令“:wq”保存并退出。这样我们便在当前目录下建立了一个名为hello.c 的文件。3 、编写Makefile要使上面的hello.c 程序能够运行,我们必须要编写一个Makefile 文件,Makefile 文件定义了一系列的规则,它指明了哪些文件需要编译,哪些文件需要先编译,哪些文件需要重新编译等等更为复杂的命令。使用它带来的好处就是自动编译,你只需要敲一个“make” 命令整个工程就可以实现自动编译,当然我们本次实验只有一个文件,它还不能体现出使用Makefile 的优越性,但当工程比较大文件比较多时,不使用Makefile 几乎是不可能的。下面我们介绍本次实验用到的Makefile 文件。

CC= armv4l-unknown-linux-gccEXEC = helloOBJS = hello.o CFLAGS += LDFLAGS+= –static

all: $(EXEC)$(EXEC): $(OBJS)

$(CC) $(LDFLAGS) -o $@ $(OBJS)

clean:-rm -f $(EXEC) *.elf *.gdb *.o

下面我们来简单介绍这个Makefile 文件的几个主要部分: CC 指明编译器

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

24

http://www.up-tech.com博创科技(UP-TECH)

Page 25: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

EXEC 表示编译后生成的执行文件名称 OBJS 目标文件列表 CFLAGS 编译参数 LDFLAGS 连接参数 all: 编译主入口 clean : 清除编译结果

注意:“$(CC) $(LDFLAGS) -o $@ $(OBJS)”和“-rm -f $(EXEC) *.elf *.gdb *.o” 前空白由一个Tab 制表符生成,不能单纯由空格来代替。与上面编写hello.c 的过程类似,用vi来创建一个Makefile 文件并将代码录入其中

[root@zxt hello]# vi Makefile

4 、编译应用程序在上面的步骤完成后,我们就可以在hello 目录下运行“make” 来编译我们的程序了。如果进行了修改,重新编译则运行:

[root@zxt hello]# make clean[root@zxt hello]# make

注意:编译、修改程序都是在宿主机(本地PC 机)上进行,不能在MINICOM下进行。5 、下载调试在宿主PC 计算机上启动NFS服务,并设置好共享的目录,具体配置请参照前面第一章第四节中关于嵌入式Linux 环境开发环境的建立。在建立好NFS共享目录以后,我们就可以进入MINICOM 中建立开发板与宿主PC 机之间的通讯了。

[root@zxt hello]# minicom[/mnt/yaffs] mount -t nfs -o nolock 192.168.0.56:/arm2410cl /host

注意: IP地址需要根据宿主PC 机的实际情况修改成功挂接宿主机的arm2410cl 目录后,在开发板上进入/host 目录便相应进入宿主机的/arm2410cl 目录,我们已经给出了编辑好的hello.c 和Makefile 文件,它们在/arm2410cl/exp/basic/01_hello 目录下。用户可以直接在宿主PC 上编译生成可执行文件,并通过上面的命令挂载到开发板上,运行程序察看结果。如果不想使用我们提供的源码的话,可以再建立一个NFS共享文件夹。如/root/share ,我们把我们自己编译生成的可执行文件复制到该文件夹下,并通过MINICOM 挂载到开发板上。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

25

http://www.up-tech.com博创科技(UP-TECH)

Page 26: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

[root@zxt hello]# cp hello /root/share[root@zxt hello]# minicom[/mnt/yaffs] mount -t nfs -o nolock 192.168.0.56:/root/share /host

再进入/host 目录运行刚刚编译好的hello 程序,查看运行结果。[/mnt/yaffs] cd /host[/host] ./hellohello world

下载调试方法,在之后的实验中如没有明显说明,请使用这种方法,不再赘述注意:开发板挂接宿主计算机目录只需要挂接一次便可,只要开发板没有重起,就可以一直保持连接。这样可以反复修改、编译、调试,不需要下载到开发板。

六、思考题

1 .Makefile 是如何工作的?其中的宏定义分别是什么意思?

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

26

http://www.up-tech.com博创科技(UP-TECH)

Page 27: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

2.2 多线程应用程序设计

一、实验目的

了解多线程程序设计的基本原理。 学习pthread库函数的使用。

二、实验内容

读懂pthread.c 的源代码,熟悉几个重要的PTHREAD库函数的使用。掌握共享锁和信号量的使用方法。进入/arm2410cl/exp/basic/02_pthread 目录,运行make 产生pthread程序,使用NFS方式连接开发主机进行运行实验。

三、预备知识

有C 语言基础 掌握在Linux 下常用编辑器的使用 掌握Makefile 的编写和使用 掌握Linux 下的程序编译与交叉编译过程

四、实验设备及工具

硬件:UP-CUP S2410 经典平台,PC 机Pentium 500 以上, 硬盘40G 以上, 内存大于128M 。软件:PC 机操作系统REDHAT LINUX 9.0 +MINICOM + ARM-LINUX 开发环境

五、实验原理及代码分析

1 .多线程程序的优缺点  多线程程序作为一种多任务、并发的工作方式,有以下的优点:1) 提高应用程序响应。这对图形界面的程序尤其有意义,当一个操作耗时很长时,整个

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

27

http://www.up-tech.com博创科技(UP-TECH)

Page 28: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操作,而使用多线程技术,将耗时长的操作(time consuming )置于一个新的线程,可以避免这种尴尬的情况。2) 使多CPU 系统更加有效。操作系统会保证当线程数不大于CPU 数目时,不同的线程运行于不同的CPU 上。3) 改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。LIBC 中的pthread库提供了大量的API 函数,为用户编写应用程序提供支持。2 .实验源代码与结构流程图本实验为著名的生产者-消费者问题模型的实现,主程序中分别启动生产者线程和消费者线程。生产者线程不断顺序地将0 到1000 的数字写入共享的循环缓冲区,同时消费者线程不断地从共享的循环缓冲区读取数据。流程图如图2.2.1 所示:

图2.2.1生产者- 消费者实验源代码结构流程图本实验具体代码如下:

/************************************************ * The classic producer-consumer example. * Illustrates mutexes and conditions. * by Zou jian guo <[email protected]> * 2003-12-22

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

28

http://www.up-tech.com博创科技(UP-TECH)

Page 29: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

*************************************************/#include <stdio.h>#include <stdlib.h>#include <time.h>#include "pthread.h"#define BUFFER_SIZE 16/* 设置一个整数的圆形缓冲区 */struct prodcons { int buffer[BUFFER_SIZE]; /* 缓冲区数组 */ pthread_mutex_t lock; /* 互斥锁 */ int readpos, writepos; /* 读写的位置*/ pthread_cond_t notempty; /* 缓冲区非空信号 */ pthread_cond_t notfull; /* 缓冲区非满信号 */};/*--------------------------------------------------------*//*初始化缓冲区*/void init(struct prodcons * b){ pthread_mutex_init(&b->lock, NULL); pthread_cond_init(&b->notempty, NULL); pthread_cond_init(&b->notfull, NULL); b->readpos = 0; b->writepos = 0;}/*--------------------------------------------------------*//* 向缓冲区中写入一个整数*/void put(struct prodcons * b, int data){

pthread_mutex_lock(&b->lock);

/* 等待缓冲区非满*/ while ((b->writepos + 1) % BUFFER_SIZE == b->readpos) {

printf("wait for not full\n"); pthread_cond_wait(&b->notfull, &b->lock); } /* 写数据并且指针前移*/ b->buffer[b->writepos] = data; b->writepos++;

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

29

http://www.up-tech.com博创科技(UP-TECH)

Page 30: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

if (b->writepos >= BUFFER_SIZE) b->writepos = 0; /* 设置缓冲区非空信号*/ pthread_cond_signal(&b->notempty);

pthread_mutex_unlock(&b->lock);}/*--------------------------------------------------------*//* 从缓冲区中读出一个整数 */int get(struct prodcons * b){ int data;

pthread_mutex_lock(&b->lock);

/* 等待缓冲区非空*/ while (b->writepos == b->readpos) { printf("wait for not empty\n");

pthread_cond_wait(&b->notempty, &b->lock); } /* 读数据并且指针前移 */ data = b->buffer[b->readpos]; b->readpos++; if (b->readpos >= BUFFER_SIZE) b->readpos = 0; /* 设置缓冲区非满信号*/ pthread_cond_signal(&b->notfull);

pthread_mutex_unlock(&b->lock); return data;}/*--------------------------------------------------------*/#define OVER (-1)struct prodcons buffer;/*--------------------------------------------------------*/void * producer(void * data){ int n; for (n = 0; n < 1000; n++) { printf(" put-->%d\n", n); put(&buffer, n);

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

30

http://www.up-tech.com博创科技(UP-TECH)

Page 31: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

} put(&buffer, OVER); printf("producer stopped!\n"); return NULL;}/*--------------------------------------------------------*/void * consumer(void * data){ int d; while (1) { d = get(&buffer); if (d == OVER ) break; printf(" %d-->get\n", d); } printf("consumer stopped!\n"); return NULL;}/*--------------------------------------------------------*/int main(void){ pthread_t th_a, th_b; void * retval; init(&buffer); pthread_create(&th_a, NULL, producer, 0); pthread_create(&th_b, NULL, consumer, 0); /* 等待生产者和消费者结束 */ pthread_join(th_a, &retval); pthread_join(th_b, &retval); return 0;}

3 .主要函数分析:下面我们来看一下,生产者写入缓冲区和消费者从缓冲区读数的具体流程,生产者首先要获得互斥锁,并且判断写指针+1 后是否等于读指针,如果相等则进入等待状态,等候条件变量notfull ;如果不等则向缓冲区中写一个整数,并且设置条件变量为notempty ,最后释放互斥锁。消费者线程与生产者线程类似,这里就不再过多介绍了。流程图如下:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

31

http://www.up-tech.com博创科技(UP-TECH)

Page 32: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

s

图2.2.2 生产消费流程图 生产者写入共享的循环缓冲区函数PUT

void put(struct prodcons * b, int data){

pthread_mutex_lock(&b->lock); // 获取互斥锁while ((b->writepos + 1) % BUFFER_SIZE == b->readpos) {

// 如果读写位置相同pthread_cond_wait(&b->notfull, &b->lock);

// 等待状态变量b->notfull ,不满则跳出阻塞 } b->buffer[b->writepos] = data; // 写入数据 b->writepos++; if (b->writepos >= BUFFER_SIZE) b->writepos = 0; pthread_cond_signal(&b->notempty); // 设置状态变量

pthread_mutex_unlock(&b->lock); //释放互斥锁}

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

32

http://www.up-tech.com博创科技(UP-TECH)

Page 33: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

消费者读取共享的循环缓冲区函数GET

int get(struct prodcons * b){ int data;

pthread_mutex_lock(&b->lock); // 获取互斥锁 while (b->writepos == b->readpos) { // 如果读写位置相同

pthread_cond_wait(&b->notempty, &b->lock);// 等待状态变量b->notempty ,不空则跳出阻塞。否则无数据可读。 } data = b->buffer[b->readpos]; //读取数据 b->readpos++; if (b->readpos >= BUFFER_SIZE) b->readpos = 0; pthread_cond_signal(&b->notfull); //设置状态变量 pthread_mutex_unlock(&b->lock); // 释放互斥锁 return data;}

4 .主要的多线程API 在本程序的代码中大量的使用了线程函数,如pthread_cond_signal 、pthread_mutex_init 、pthread_mutex_lock 等等,这些函数的作用是什么,在哪里定义的,我们将在下面的内容中为大家做一个简单的介绍,并且为其中比较重要的函数做一些详细的说明。

线程创建函数:int pthread_create (pthread_t * thread_id, __const pthread_attr_t * __attr,

void *(*__start_routine) (void *),void *__restrict __arg)

获得父进程ID :pthread_t pthread_self (void)

测试两个线程号是否相同:int pthread_equal (pthread_t __thread1, pthread_t __thread2)

线程退出:void pthread_exit (void *__retval)

等待指定的线程结束:int pthread_join (pthread_t __th, void **__thread_return)

互斥量初始化:pthread_mutex_init (pthread_mutex_t *,__const pthread_mutexattr_t *)

销毁互斥量:int pthread_mutex_destroy (pthread_mutex_t *__mutex)

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

33

http://www.up-tech.com博创科技(UP-TECH)

Page 34: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

再试一次获得对互斥量的锁定(非阻塞):int pthread_mutex_trylock (pthread_mutex_t *__mutex)

锁定互斥量(阻塞):int pthread_mutex_lock (pthread_mutex_t *__mutex)

解锁互斥量:int pthread_mutex_unlock (pthread_mutex_t *__mutex)

条件变量初始化:int pthread_cond_init (pthread_cond_t *__restrict __cond,__const pthread_condattr_t *__restrict __cond_attr)

销毁条件变量COND :int pthread_cond_destroy (pthread_cond_t *__cond)

唤醒线程等待条件变量:int pthread_cond_signal (pthread_cond_t *__cond)

等待条件变量(阻塞):int pthread_cond_wait (pthread_cond_t *__restrict __cond, pthread_mutex_t *__restrict

__mutex)

在指定的时间到达前等待条件变量:int pthread_cond_timedwait (pthread_cond_t *__restrict __cond,pthread_mutex_t *__restrict __mutex, __const struct timespec *__restrict __abstime)

PTHREAD库中还有大量的API 函数,用户可以参考其他相关书籍。下面我们对几个比较重要的函数做一下详细的说明:pthread_create 线程创建函数

int pthread_create (pthread_t * thread_id,__const pthread_attr_t * __attr, void *(*__start_routine) (void *),void *__restrict __arg)

线程创建函数第一个参数为指向线程标识符的指针,第二个参数用来设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数。这里,我们的函数thread 不需要参数,所以最后一个参数设为空指针。第二个参数我们也设为空指针,这样将生成默认属性的线程。当创建线程成功时,函数返回0 ,若不为0 则说明创建线程失败,常见的错误返回代码为EAGAIN 和EINVAL 。前者表示系统限制创建新的线程,例如线程数目过多了;后者表示第二个参数代表的线程属性值非法。创建线程成功后,新创建的线程则运行参数三和参数四确定的函数,原来的线程则继续运行下一行代码。

pthread_join 函数 用来等待一个线程的结束。函数原型为:int pthread_join (pthread_t __th, void **__thread_return)

第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。

pthread_exit函数

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

34

http://www.up-tech.com博创科技(UP-TECH)

Page 35: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

一个线程的结束有两种途径,一种是象我们上面的例子一样,函数结束了,调用它的线程也就结束了;另一种方式是通过函数pthread_exit 来实现。它的函数原型为:

void pthread_exit (void *__retval)

唯一的参数是函数的返回代码,只要pthread_join 中的第二个参数thread_return 不是NULL ,这个值将被传递给thread_return 。最后要说明的是,一个线程不能被多个线程等待,否则第一个接收到信号的线程成功返回,其余调用pthread_join 的线程则返回错误代码ESRCH 。下面我们来介绍有关条件变量的内容。使用互斥锁来可实现线程间数据的共享和通信,互斥锁一个明显的缺点是它只有两种状态:锁定和非锁定。而条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,它常和互斥锁一起使用。使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化。一旦其它的某个线程改变了条件变量,它将通知相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程。这些线程将重新锁定互斥锁并重新测试条件是否满足。一般说来,条件变量被用来进行线线程间的同步。

pthread_cond_init 函数条件变量的结构为pthread_cond_t ,函数pthread_cond_init()被用来初始化一个条件变量。它的原型为:

int pthread_cond_init (pthread_cond_t * cond, __const pthread_condattr_t * cond_attr)

其中cond 是一个指向结构pthread_cond_t 的指针,cond_attr 是一个指向结构pthread_condattr_t 的指针。结构pthread_condattr_t 是条件变量的属性结构,和互斥锁一样我们可以用它来设置条件变量是进程内可用还是进程间可用,默认值是PTHREAD_ PROCESS_PRIVATE ,即此条件变量被同一进程内的各个线程使用。注意初始化条件变量只有未被使用时才能重新初始化或被释放。释放一个条件变量的函数为pthread_cond_ destroy (pthread_cond_t cond )。 

pthread_cond_wait 函数 使线程阻塞在一个条件变量上。它的函数原型为:extern int pthread_cond_wait (pthread_cond_t *__restrict__cond, pthread_mutex_t

*__restrict __mutex)

  线程解开 mutex 指向 的锁并被条件 变量 cond 阻塞。 线程可 以被函数pthread_cond_signal 和函数pthread_cond_broadcast唤醒,但是要注意的是,条件变量只是起阻塞和唤醒线程的作用,具体的判断条件还需用户给出,例如一个变量是否为0 等等,这一点我们从后面的例子中可以看到。线程被唤醒后,它将重新检查判断条件是否满足,如果还不满足,一般说来线程应该仍阻塞在这里,被等待被下一次唤醒。这个过程一般用while 语句实现。

pthread_cond_timedwait函数 另一个用来阻塞线程的函数是pthread_cond_timedwait (),它的原型为:

extern int pthread_cond_timedwait __P ((pthread_cond_t *__cond,    pthread_mutex_t *__mutex, __const struct timespec

*__abstime))

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

35

http://www.up-tech.com博创科技(UP-TECH)

Page 36: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

它比函数pthread_cond_wait ()多了一个时间参数,经历abstime 段时间后,即使条件变量不满足,阻塞也被解除。

pthread_cond_signal 函数 它的函数原型为:extern int pthread_cond_signal (pthread_cond_t *__cond)

它用来释放被阻塞在条件变量cond 上的一个线程。多个线程阻塞在此条件变量上时,哪一个线程被唤醒是由线程的调度策略所决定的。要注意的是,必须用保护条件变量的互斥锁来保护这个函数,否则条件满足信号又可能在测试条件和调用pthread_cond_wait 函数之间被发出,从而造成无限制的等待。

六、实验步骤

1 、阅读源代及编译应用程序进入/arm2410cl/exp/basic/02_pthread 目录,使用vi编辑器或其他编辑器阅读理解源代码。运行make 产生pthread可执行文件。

2 、下载和调试切换到minicom 终端窗口,使用NFS mount 开发主机的/arm2410cl 到/host目录。

[/mnt/yaffs]mount -t nfs -o nolock 192.168.0.56:/arm2410cl /host/

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

36

http://www.up-tech.com博创科技(UP-TECH)

Page 37: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

[/mnt/yaffs]cd /host/exp/basic/02_pthread/ [/host/exp/basic/02_pthread]./pthread

进入/host/exp/basic/pthread 目录,运行pthread,观察运行结果的正确性。运行程序最后一部分结果如下:

wait for not empty put-->994 put-->995 put-->996 put-->997 put-->998 put-->999producer stopped! 993-->get 994-->get 995-->get 996-->get 997-->get 998-->get 999-->getconsumer stopped![/host/exp/basic/02_pthread]

七、思考题

1 .加入一个新的线程用于处理键盘的输入,并在按键为ESC时终止所有线程。2 .线程的优先级的控制。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

37

http://www.up-tech.com博创科技(UP-TECH)

Page 38: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

2.3 串行端口程序设计

一、实验目的

了解在linux 环境下串行程序设计的基本方法。 掌握终端的主要属性及设置方法,熟悉终端I /O 函数的使用。 学习使用多线程来完成串口的收发处理。

二、实验内容

读懂程序源代码, 学习终端I /O函数的使用方法,学习将多线程编程应用到串口的接收和发送程序设计中。

三、预备知识

有C 语言基础。 掌握在Linux 下常用编辑器的使用。 掌握Makefile 的编写和使用。 掌握Linux 下的程序编译与交叉编译过程

四、实验设备及工具

硬件:UP-CUP S2410 经典平台、PC 机Pentium 500 以上, 硬盘10G 以上。软件:PC 机操作系统REDHAT LINUX 9.0 +MINICOM +ARM-LINUX 开发环境

五、实验原理

异步串行I /O 方式是将传输数据的每个字符一位接一位( 例如先低位、后高位) 地传送。数据的各不同位可以分时使用同一传输通道,因此串行I /O 可以减少信号连线,最少用一对线即可进行。接收方对于同一根线上一连串的数字信号,首先要分割成位,再按位组成字符。为了恢复发送的信息,双方必须协调工作。在微型计算机中大量使用异步串行I/O 方式,双方使用各自的时钟信号,而且允许时钟频率有一定误差,因此实现较容易。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

38

http://www.up-tech.com博创科技(UP-TECH)

Page 39: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

但是由于每个字符都要独立确定起始和结束( 即每个字符都要重新同步) ,字符和字符间还可能有长度不定的空闲时间,因此效率较低。

图2.3.1串行通信字符格式图2.3.1 给出异步串行通信中一个字符的传送格式。开始前,线路处于空闲状态,送出连续“1” 。传送开始时首先发一个“0”作为起始位,然后出现在通信线上的是字符的二进制编码数据。每个字符的数据位长可以约定为5 位、6 位、7 位或8 位,一般采用ASCII 编码。后面是奇偶校验位,根据约定,用奇偶校验位将所传字符中为“1” 的位数凑成奇数个或偶数个。也可以约定不要奇偶校验,这样就取消奇偶校验位。最后是表示停止位的“1” 信号,这个停止位可以约定持续1 位、1.5 位或2 位的时间宽度。至此一个字符传送完毕,线路又进入空闲,持续为“1” 。经过一段随机的时间后,下一个字符开始传送才又发出起始位。每一个数据位的宽度等于传送波特率的倒数。微机异步串行通信中,常用的波特率为50 ,95 ,110,150,300,600,1200 ,2400 ,4800 ,9600 等。接收方按约定的格式接收数据,并进行检查,可以查出以下三种错误: 奇偶错:在约定奇偶检查的情况下,接收到的字符奇偶状态和约定不符。 帧格式错:一个字符从起始位到停止位的总位数不对。 溢出错:若先接收的字符尚未被微机读取,后面的字符又传送过来,则产生溢出错。每一种错误都会给出相应的出错信息,提示用户处理。一般串口调试都使用空的

MODEM连接电缆,其连接方式如下:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

39

http://www.up-tech.com博创科技(UP-TECH)

Page 40: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图2.3.2实用RS-232C通讯连线

六、程序分析

Linux 操作系统从一开始就对串行口提供了很好的支持,为进行串行通讯提供了大量的函数,我们的实验主要是为掌握在Linux 中进行串行通讯编程的基本方法。本实验的程序流程图如下:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

40

http://www.up-tech.com博创科技(UP-TECH)

Page 41: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图2.3.3串口通讯实验流程图本实验的代码如下:

#include <termios.h>#include <stdio.h>#include <unistd.h>#include <fcntl.h>#include <sys/signal.h>#include <pthread.h>

#define BAUDRATE B115200#define COM1 "/dev/ttyS0"#define COM2 "/dev/ttyS1"#define ENDMINITERM 27 /* ESC to quit miniterm */#define FALSE 0#define TRUE 1

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

41

http://www.up-tech.com博创科技(UP-TECH)

Page 42: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

volatile int STOP=FALSE;volatile int fd;

void child_handler(int s){ printf("stop!!!\n"); STOP=TRUE;}/*--------------------------------------------------------*/void* keyboard(void * data){ int c;

for (;;){c=getchar();

if( c== ENDMINITERM){ STOP=TRUE; break ; }

} return NULL;}/*--------------------------------------------------------*//* modem input handler */void* receive(void * data){

int c; printf("read modem\n"); while (STOP==FALSE) { read(fd,&c,1); /* com port */ write(1,&c,1); /* stdout */ } printf("exit from reading modem\n"); return NULL; }/*--------------------------------------------------------*/void* send(void * data)

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

42

http://www.up-tech.com博创科技(UP-TECH)

Page 43: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

{ int c='0'; printf("send data\n"); while (STOP==FALSE) /* modem input handler */ { c++; c %= 255; write(fd,&c,1); /* stdout */ usleep(100000); } return NULL; }/*--------------------------------------------------------*/int main(int argc,char** argv){

struct termios oldtio,newtio,oldstdtio,newstdtio;struct sigaction sa;int ok;

pthread_t th_a, th_b, th_c; void * retval;

if( argc > 1) fd = open(COM2, O_RDWR ); else fd = open(COM1, O_RDWR ); //| O_NOCTTY |O_NONBLOCK);

if (fd <0) { error(COM1); exit(-1); } tcgetattr(0,&oldstdtio); tcgetattr(fd,&oldtio); /* save current modem settings */ tcgetattr(fd,&newstdtio); /* get working stdtio */

newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD; /*ctrol flag*/

newtio.c_iflag = IGNPAR; /*input flag*/newtio.c_oflag = 0; /*output flag*/

newtio.c_lflag = 0; newtio.c_cc[VMIN]=1;

newtio.c_cc[VTIME]=0;

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

43

http://www.up-tech.com博创科技(UP-TECH)

Page 44: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

/* now clean the modem line and activate the settings for modem */ tcflush(fd, TCIFLUSH);

tcsetattr(fd,TCSANOW,&newtio); /*set attrib*/ sa.sa_handler = child_handler; sa.sa_flags = 0; sigaction(SIGCHLD,&sa,NULL); /* handle dying child */ pthread_create(&th_a, NULL, keyboard, 0); pthread_create(&th_b, NULL, receive, 0); pthread_create(&th_c, NULL, send, 0); pthread_join(th_a, &retval); pthread_join(th_b, &retval); pthread_join(th_c, &retval); tcsetattr(fd,TCSANOW,&oldtio); /* restore old modem setings */ tcsetattr(0,TCSANOW,&oldstdtio); /* restore old tty setings */ close(fd); exit(0); }

下面我们对这个程序的主要部分做一下简单的分析 头文件#include <stdio.h> /*标准输入输出定义*/#include <stdlib.h> /*标准函数库定义*/#include <unistd.h> /*linux 标准函数定义*/#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> /* 文件控制定义*/#include <termios.h> /*PPSIX 终端控制定义*/#include <errno.h> /*错误号定义*/#include <pthread.h> /* 线程库定义*/

打开串口在Linux 下串口文件位于/dev 下,一般在老版本的内核中串口一为/dev/ttyS0 ,串口二为 /dev/ttyS1 , 在我们的开发板中串口设备位于/dev/tts/ 下,因为开发板中没有ttyS0 这个设备,所以我们要建立一个连接,方法如下:

[/mnt/yaffs] cd /dev[/dev] ln –sf /dev/tts/0 ttyS0

打开串口是通过标准的文件打开函数来实现的int fd;fd = open( "/dev/ttyS0", O_RDWR); /* 以读写方式打开串口*/if (-1 == fd){ /* 不能打开串口一*/

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

44

http://www.up-tech.com博创科技(UP-TECH)

Page 45: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

perror(" 提示错误!");}

串口设置最基本的设置串口包括波特率设置,效验位和停止位设置。串口的设置主要是设置 struct termios 结构体的各成员值,关于该结构体的定义可以查看/arm2410cl/kernel/linux-2.4.18-2410cl/include/asm/termios.h 文件。

struct termio{unsigned short c_iflag; /* 输入模式标志 */

unsigned short c_oflag; /* 输出模式标志 */unsigned short c_cflag; /* 控制模式标志 */unsigned short c_lflag; /* local mode flags */unsigned char c_line; /* line discipline */unsigned char c_cc[NCC]; /* control characters */

};

设置这个结构体很复杂,可以参考man 手册或者由赵克佳、沈志宇编写的《UNIX 程序编写教程》,我这里就只考虑常见的一些设置: 波特率设置:下面是修改波特率的代码:

struct termios Opt;tcgetattr(fd, &Opt);cfsetispeed(&Opt,B19200); /* 设置为19200Bps*/cfsetospeed(&Opt,B19200);tcsetattr(fd,TCANOW,&Opt);

校验位和停止位的设置:无效验 8 位

Option.c_cflag &= ~PARENB;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= ~CSIZE;Option.c_cflag |= ~CS8;

奇效验(Odd) 7位Option.c_cflag |= ~PARENB;Option.c_cflag &= ~PARODD;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= ~CSIZE;Option.c_cflag |= ~CS7;

偶效验(Even) 7 位

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

45

http://www.up-tech.com博创科技(UP-TECH)

Page 46: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

Option.c_cflag &= ~PARENB;Option.c_cflag |= ~PARODD;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= ~CSIZE;Option.c_cflag |= ~CS7;

Space 效验 7 位 Option.c_cflag &= ~PARENB;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= &~CSIZE;Option.c_cflag |= CS8;

设置停止位:1 位:

options.c_cflag &= ~CSTOPB;

2 位:options.c_cflag |= CSTOPB;

注意:如果不是开发终端之类的,只是串口传输数据,而不需要串口来处理,那么使用原始模式(Raw Mode) 方式来通讯,设置方式如下:

options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /*Input*/options.c_oflag &= ~OPOST; /*Output*/

读写串口设置好串口之后,读写串口就很容易了,把串口当作文件读写就可以了。 发送数据:

char buffer[1024];int Length=1024;int nByte;nByte = write(fd, buffer ,Length)

读取串口数据:使用文件操作read 函数读取,如果设置为原始模式(Raw Mode)传输数据,那么read函数返回的字符数是实际串口收到的字符数。可以使用操作文件的函数来实现异步读取,如fcntl ,或者select等来操作。

char buff[1024];int Len =1024;int readByte = read(fd, buff, Len);

关闭串口关闭串口就是关闭文件。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

46

http://www.up-tech.com博创科技(UP-TECH)

Page 47: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

close(fd);

七、实验步骤

1 、阅读理解源码进入/arm2410cl/exp/\basic/\03_tty目录,使用vi编辑器或其他编辑器阅读理解源代码。2 、编译应用程序运行make 产生term 可执行文件

[root@zxt root]# cd /arm2410cl/exp/basic/03_tty/[root@zxt 03_tty]# makearmv4l-unknown-linux-gcc -c -o term.o term.carmv4l-unknown-linux-gcc -o ../bin/term term.o -lpthreadarmv4l-unknown-linux-gcc -o term term.o -lpthread[root@zxt 03_tty]# lsMakefile Makefile.bak term term.c term.o tty.c

3 、下载调试切换到minicom 终端窗口,使用NFS mount 开发主机的/arm2410cl 到/host 目录。进入/host/exp\/basic\/03_tty 目录,运行term ,观察运行结果的正确性。

[root@zxt root]# minicom[/mnt/yaffs] mount -t nfs -o nolock 192.168.0.56:/arm2410cl /host[/mnt/yaffs]cd /host/exp/basic/03_tty/[/host/exp/basic/03_tty]./termread modem send data 123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWX

注意:如果在执行./term 时出现下面的错误,可以通过我们前文提到的方法建立一个连接来解决。

/dev/ttyS0: No such file or directory解决方法:

[/mnt/yaffs] cd /dev[/dev] ln –sf /dev/tts/0 ttyS0 (注意首字母是l, 不是数字

1 )

由于内核已经将串口1 作为终端控制台,所以可以看到term 发出的数据,却无法看到开发主机发来的数据,可以使用另外一台主机连接串口2 进行收发测试;这时要修改一下执行命令,在term 后要加任意参数(下面以 ./term www 为例)

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

47

http://www.up-tech.com博创科技(UP-TECH)

Page 48: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

Ctrl+c 或者ESC 可使程序强行退出。注意:如果我们需要使用串口1 通讯,比如做Zigbee或微型打印机实验时,需要加载串口1 的驱动,这个在光盘里做了补充,请到实验补充里面找一下驱动程序s3c2410-tty.o 。insmod s3c2410-tty.o 就可以了。如果在执行./term www 时出现下面的错误,可以通过我们前文提到的方法建立两个连接来解决;

/dev/ttyS0: No such file or directory解决方法:

[/mnt/yaffs] cd /dev[/dev] ln –sf /dev/tts/0 ttyS0 (注意首字母是l, 不是数字

1 )[/dev] ln –sf /dev/tts/1 ttyS1 (注意首字母( 红色的) 是l,

不是数字1; 而后面的两个蓝色的都是1 ,2 ,3 的1 )

八、思考题

1 .编写一个简单的文件收发程序完成串口文件下载。2 .终端对特殊字符的处理。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

48

http://www.up-tech.com博创科技(UP-TECH)

Page 49: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

2.4 A/D 接口实验

一、实验目的

了解在linux 环境下对S3C2410 芯片的8 通道10 位A/D 的操作与控制。

二、实验内容

学习A/D接口原理,了解实现A/D 系统对于系统的软件和硬件要求。阅读ARM 芯片文档,掌握ARM 的A/D 相关寄存器的功能,熟悉ARM 系统硬件的A/D 相关接口。利用外部模拟信号编程实现ARM 循环采集全部前4 路通道,并且在超级终端上显示。

三、预备知识

有C 语言基础。 掌握在Linux 下常用编辑器的使用。 掌握Makefile 的编写和使用。 掌握Linux 下的程序编译与交叉编译过程。

四、实验设备及工具

硬件:UP-CUP S2410 经典平台、PC 机Pentium 500 以上, 硬盘10G 以上。软件:PC 机操作系统REDHAT LINUX 9.0 +MINICOM +ARM-LINUX 开发环境

五、实验原理

1 、A/D转换器A/D 转换器是模拟信号源和CPU 之间联系的接口,它的任务是将连续变化的模拟信号转换为数字信号,以便计算机和数字系统进行处理、存储、控制和显示。在工业控制和数据采集及许多其他领域中,A/D 转换是不可缺少的。A/D 转换器有以下类型:逐位比较型、积分型、计数型、并行比较型、电压-频率型,主要应根据使用场合的具体要求,按照转换速度、精度、价格、功能以及接口条件等因素来

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

49

http://www.up-tech.com博创科技(UP-TECH)

Page 50: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

决定选择何种类型。常用的有以下两种: 双积分型的A/D转换器

双积分式也称二重积分式,其实质是测量和比较两个积分的时间,一个是对模拟输入电压积分的时间T0,此时间往往是固定的;另一个是以充电后的电压为初值,对参考电源Vref 反向积分,积分电容被放电至零所需的时间T1。模拟输入电压Vi与参考电压VRef 之比,等于上述两个时间之比。由于VRef 、T0固定,而放电时间T1可以测出,因而可计算出模拟输入电压的大小(VRef 与Vi符号相反) 。由于T0、VRef 为已知的固定常数,因此反向积分时间T1与输入模拟电压Vi在T0时间内的平均值成正比。输入电压Vi愈高,VA 愈大,T1就愈长。在T1开始时刻,控制逻辑同时打开计数器的控制门开始计数,直到积分器恢复到零电平时,计数停止。则计数器所计出的数字即正比于输入电压Vi在T0时间内的平均值,于是完成了一次A/D 转换。由于双积分型A/D 转换是测量输入电压Vi在T0时间内的平均值,所以对常态干扰( 串摸干扰) 有很强的抑制作用,尤其对正负波形对称的干扰信号,抑制效果更好。双积分型的A/D 转换器电路简单,抗干扰能力强,精度高,这是突出的优点。但转换速度比较慢,常用的A/D 转换芯片的转换时间为毫秒级。例如12 位的积分型A/D 芯片ADCETl2BC ,其转换时间为lms 。因此适用于模拟信号变化缓慢,采样速率要求较低,而对精度要求较高,或现场干扰较严重的场合。例如在数字电压表中常被采用。

逐次逼近型的A/D转换器逐次逼近型( 也称逐位比较式) 的A/D 转换器,应用比积分型更为广泛,其原理框图如图2.4.1 所示,主要由逐次逼近寄存器SAR 、D/A 转换器、比较器以及时序和控制逻辑等部分组成。它的实质是逐次把设定的SAR 寄存器中的数字量经D/A 转换后得到电压Vc与待转换模拟电压V 。进行比较。比较时,先从SAR 的最高位开始,逐次确定各位的数码应是“1” 还是“0” ,其工作过程如下:转换前,先将SAR 寄存器各位清零。转换开始时,控制逻辑电路先设定SAR 寄存器的最高位为“1” ,其余位为“0” ,此试探值经D/A 转换成电压Vc ,然后将Vc 与模拟输入电压Vx 比较。如果Vx≥Vc ,说明SAR 最高位的“1” 应予保留;如果Vx<Vc ,说明SAR 该位应予清零。然后再对SAR 寄存器的次高位置“1” ,依上述方法进行D/A 转换和比较。如此重复上述过程,直至确定SAR 寄存器的最低位为止。过程结束后,状态线改变状态,表明已完成一次转换。最后,逐次逼近寄存器SAR 中的内容就是与输入模拟量V 相对应的二进制数字量。显然A/D 转换器的位数N决定于SAR 的位数和D/A 的位数。图2.4.1(b)表示四位A/D 转换器的逐次逼近过程。转换结果能否准确逼近模拟信号,主要取决于SAR 和D/A 的位数。位数越多,越能准确逼近模拟量,但转换所需的时间也越长。

逐次逼近式的A/D 转换器的主要特点是:转换速度较快,在1—100/μs 以内,分辨率可以达18 位,特别适用于工业控制系统。转换时间固定,不随输入信号的变化而变化。抗干扰能力相对积分型的差。例如,对模拟输入信号采样过程中,若在采样时刻有一个干扰脉冲迭加在模拟信号上,则采样时,包括干扰信号在内,都被采样和转换为数字量,这就会造成较大的误差,所以有必要采取适当

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

50

http://www.up-tech.com博创科技(UP-TECH)

Page 51: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

的滤波措施。

图2.4.1逐次逼近式A/D 转换器2 、A/D转换的重要指标 分辨率(Resolution)分辨率反映A/D 转换器对输入微小变化响应的能力,通常用数字输出最低位(LSB) 所对应的模拟输入的电平值表示。n 位A/D能反应1/2n满量程的模拟输入电平。由于分辨率直接与转换器的位数有关,所以一般也可简单地用数字量的位数来表示分辨率,即n 位二进制数,最低位所具有的权值,就是它的分辨率。值得注意的是,分辨率与精度是两个不同的概念,不要把两者相混淆。即使分辨率很高,也可能由于温度漂移、线性度等原因,而使其精度不够高。 精度(Accuracy)精度有绝对精度(Absolute Accuracy) 和相对精度(Relative Accuracy) 两种表示方法。

绝对误差:在一个转换器中,对应于一个数字量的实际模拟输入电压和理想的模拟输入电压之差并非是一个常数。我们把它们之间的差的最大值,定义为“绝对误差”。通常以数字量的最小有效位(LSB) 的分数值来表示绝对误差,例如: 1LSB 等。绝对误差包括量化误差和其它所有误差。

相对误差是指整个转换范围内,任一数字量所对应的模拟输入量的实际值与理论值之差,用模拟电压满量程的百分比表示。例如,满量程为10V,10 位A/D 芯片,若其绝对精度为 1/2LSB ,则其最小有效位的量化单位:9.77mV,其绝对精度为=4.88mV,其相对精度为0.048% 。

转换时间(Conversion Time)转换时间是指完成一次A/D 转换所需的时间,即由发出启动转换命令信号到转换结束信号开始有效的时间间隔。转换时间的倒数称为转换速率。例如AD570 的转换时间为25us ,其转换速率为40KHz 。

电源灵敏度(power supply sensitivity)

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

51

http://www.up-tech.com博创科技(UP-TECH)

Page 52: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

电源灵敏度是指A/D 转换芯片的供电电源的电压发生变化时,产生的转换误差。一般用电源电压变化1 %时相当的模拟量变化的百分数来表示。

量程量程是指所能转换的模拟输入电压范围,分单极性、双极性两种类型。例如,单极性 量程为0 ~+5V ,0 ~+10V ,0 ~+20V ;双极性 量程为-5~+5V ,-10 ~+10V 。

输出逻辑电平多数A/D 转换器的输出逻辑电平与TTL 电平兼容。在考虑数字量输出与微处理的数据总线接口时,应注意是否要三态逻辑输出,是否要对数据进行锁存等。

工作温度范围由于温度会对比较器、运算放大器、电阻网络等产生影响,故只在一定的温度范围内才能保证额定精度指标。一般A/D 转换器的工作温度范围为(0~700C),军用品的工作温度范围为(-55~+1250C ) ARM 自带的十位A/D转换器ARM S3C2410 芯片自带一个8路10 位A/D 转换器,并且支持触摸屏功能。ARM2410 开发板只用作3 路A/D 转换器,其最大转换率为500K ,非线性度为正负1.5位,其转换时间可以通过下式计算:如果系统时钟为50MHz ,比例值为49 ,则为A/D 转换器频率=50 MHz/(49+1) = 1 MHz转换时间=1/(1 MHz / 5cycles) = 1/200 kHz (相当于5us)= 5 us

表2.4.1采样控制寄存器的设置寄存器 地址 读/ 写 描述 复位值ADCCON 0x58000000 R/W ADC 控制寄存

器 0x3FC4

表2.4.2采样控制寄存器的位描述ADCCON 位 描述

初始设置

ECFLG [15] End of conversion flag (read only). 0 = A/D conversion in process 1 = End of A/D conversion

0

PRSCEN [14] A/D converter prescaler enable. 0 = Disable 1 = Enable

0

PRSCVL [13:6]

A/D converter prescaler value. Data value: 1 ~ 255 Note that division factor is (N+1) when the prescaler value is N.

0xFF

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

52

http://www.up-tech.com博创科技(UP-TECH)

Page 53: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

SEL_MUX [5:3]

Analog input channel select. 000 = AIN 0 001 = AIN 1 010 = AIN 2 011 = AIN 3 100 = AIN 4 101 = AIN 5 110 = AIN 6 111 = AIN 7 (XP)

0

STDBM [2] Standby mode select. 0 = Normal operation mode 1 = Standby mode

1

READ_START

[1] A/D conversion start by read. 0 = Disable start by read operation 1 = Enable start by read operation

0

ENABLE_START

[0]

A/D conversion starts by setting this bit. If READ_START is enabled, this value is not valid. 0 = No operation 1 = A/D conversion starts and this bit is cleared after the start-up.

0

该寄存器的0 位是转换使能位,写1 表示转换开始。1 位是读操作使能转换,写1表示转换在读操作时开始。3 、4 、5 位是通道号。[13:6] 位为AD 转换比例因子。14 位为比例因子有效位,15 位为转换标志位(只读)。

表2.4.3A/D 转换结果数据寄存器的设置寄存器 地址 读/ 写 描述 复位值

ADCDAT0 0x5800000C R ADC 转换数据寄存器

-

ADCDAT0 :转换结果数据寄存器。该寄存器的十位表示转换后的结果,全为1 时为满量程3.3 伏。 A/D转换器在扩展板的连接A/D 转换器在扩展板的接法如图2.4.2 所示,前三路通过电位器接到3.3v 电源上。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

53

http://www.up-tech.com博创科技(UP-TECH)

Page 54: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图2.4.2 A/D转换器在扩展板上的接法

六、程序分析(关键代码分析)

ad 驱动对用户来说只是下面的一个文件结构。在用户程序里只需要用到open 、 read 、 write 、 release 等内核函数即可。本实验采用的是模块方式加载,可以在实验箱的/mnt/yaffs/ad/ 中找到AD 的驱动程序。

static struct file_operations s3c2410_fops = {owner: THIS_MODULE,open: s3c2410_adc_open,read: s3c2410_adc_read,write: s3c2410_adc_write,release: s3c2410_adc_release,

};

下面我们对驱动部分重要函数进行说明。ad 驱动在内核里的代码我们放到了本次实验的src 文件下,s3c2410.h_chip.h里为arm2410 头文件s3c2410.h 初始化ADC 的部分。所有代码也可以到内核里面去阅读。关于驱动知识的基本介绍请见第4 章第一小节,本节只作为应用实验的简单例子。

static int s3c2410_adc_open(struct inode *inode, struct file *file){

init_MUTEX(&adcdev.lock);init_waitqueue_head(&(adcdev.wait));adcdev.channel=0;adcdev.prescale=0xff;

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

54

http://www.up-tech.com博创科技(UP-TECH)

Page 55: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

MOD_INC_USE_COUNT;DPRINTK( "adc opened\n");return 0;

} //AD 通道和比例因子初始化static ssize_t s3c2410_adc_write(struct file *file, const char *buffer, size_t count, loff_t *

ppos){

int data;if(count!=sizeof(data)){

//error input data sizeDPRINTK("the size of input data must be %d\n", sizeof(data));return 0;

}copy_from_user(&data, buffer, count);adcdev.channel=ADC_WRITE_GETCH(data);adcdev.prescale=ADC_WRITE_GETPRE(data);DPRINTK("set adc channel=%d, prescale=0x%x\n", adcdev.channel, adcdev.prescale);return count;

} //告诉内核驱动读哪一个通道的数据和设置比例因子#define START_ADC_AIN(ch, prescale) \

do{ \ADCCON = PRESCALE_EN | PRSCVL(prescale) | ADC_INPUT((ch)) ; \ADCCON |= ADC_START; \

}while(0)//PRESCALE_EN 左移14使位比例因子有效;PRSCVL左移6 位设置比例因子;//ADC_INPUT 左移3 位选择通道;//ADCCON |= ADC_START; ADCCON 0 为置1 ,准备采集数据static ssize_t s3c2410_adc_read(struct file *filp, char *buffer, size_t count, loff_t *ppos){

int ret = 0;if (down_interruptible(&adcdev.lock))

return -ERESTARTSYS;START_ADC_AIN(adcdev.channel, adcdev.prescale);interruptible_sleep_on(&adcdev.wait);ret = ADCDAT0;

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

55

http://www.up-tech.com博创科技(UP-TECH)

Page 56: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

ret &= 0x3ff; //把数据寄存器内容放入变量retDPRINTK("AIN[%d] = 0x%04x, %d\n", adcdev.channel, ret, ADCCON & 0x80 ?

1:0);copy_to_user(buffer, (char *)&ret, sizeof(ret));

// 把ret 变量的内容传给用户缓冲区

up(&adcdev.lock);return sizeof(ret);

} //由内核采集通道数据后把数据放回用户区main.c 的代码如下:

/************************************************\* by threewater<[email protected]> ** 2004.06.18 *\***********************************************/#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/ioctl.h>#include <pthread.h>#include <fcntl.h>#include "s3c2410-adc.h"#define ADC_DEV "/dev/adc/0raw"static int adc_fd = -1;static int init_ADdevice(void){ if((adc_fd=open(ADC_DEV, O_RDWR))<0){ printf("Error opening %s adc device\n", ADC_DEV); return -1; }}static int GetADresult(int channel){ int PRESCALE=0XFF; int data=ADC_WRITE(channel, PRESCALE); write(adc_fd, &data, sizeof(data)); read(adc_fd, &data, sizeof(data)); return data;

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

56

http://www.up-tech.com博创科技(UP-TECH)

Page 57: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

}static int stop=0;static void* comMonitor(void* data){ getchar(); stop=1; return NULL;}int main(void){ int i; float d; pthread_t th_com; void * retval; //set s3c44b0 AD register and start AD if(init_ADdevice()<0) return -1; /* Create the threads */ pthread_create(&th_com, NULL, comMonitor, 0); printf("\nPress Enter key exit!\n"); while( stop==0 ){ for(i=0; i<=2; i++){// 采样0~2 路A/D值 d=((float)GetADresult(i)*3.3)/1024.0; printf("a%d=%8.4f\t",i,d); } usleep(1); printf("\r"); } /* Wait until producer and consumer finish. */ pthread_join(th_com, &retval); printf("\n"); return 0;}

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

57

http://www.up-tech.com博创科技(UP-TECH)

Page 58: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

七、实验步骤

1 、阅读理解源码进入/arm2410cl/exp/basic/04_ad 目录,使用vi编辑器或其他编辑器阅读理解源代码。2 、编译应用程序运行make 产生ad 可执行文件

[root@zxt /]# cd /arm2410cl/exp/basic/04_ad/[root@zxt 04_ad]# makearmv4l-unknown-linux-gcc -c -o main.o main.carmv4l-unknown-linux-gcc -o ../bin/ad main.o -lpthreadarmv4l-unknown-linux-gcc -o ad main.o -lpthread[root@zxt 04_ad]# lsad hardware.h main.o Makefile.bak s3c2410-adc.hbin main.c Makefile readme.txt src// 执行make clean 清除原有编译文件[root@zxt 04_ad]# make clean // 执行make 编译生成可执行文件[root@zxt 04_ad]# make

3 、下载调试换到minicom 终端窗口,使用NFS mount 开发主机的/arm2410cl 到/host 目录。

[root@zxt root]# minicom[/mnt/yaffs] mount -t nfs -o nolock 192.168.0.56:/arm2410cl /host[/mnt/yaffs]insmod ad/s3c2410-adc.o[/mnt/yaffs]cd /host/exp/basic/04_ad/[/host/exp/basic/04_ad]./ad

Press Enter key exit!a0= 0.0032 a1= 3.2968 a2= 3.2968

我们可以通过调节开发板上的三个黄色的电位器,来查看a0 、a1 、a2 的变化。

八、思考题

1. 逐次逼近型的A/D 转换器原理是什么?2 . A/D 转换的重要指标包括哪些?3 . ARM 的A/D功能的相关寄存器有哪几个,对应的地址是什么?4 . 如何启动ARM 开始转换A/D ,有几种方式?转换开始时ARM 是如何知道转换哪路通道的?如何判断转换结束?

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

58

http://www.up-tech.com博创科技(UP-TECH)

Page 59: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

2.5 D/A 接口实验

一、实验目的

学习D/A 转换原理 掌握MAX504 D/A 转换芯片的使用方法 掌握不带有D/A 的CPU扩展D/A功能的主要方法 了解D/A驱动程序加入内核的方法

二、实验内容

学习D/A接口原理,了解实现D/A 系统对于系统的软件和硬件要求。阅读MAX504 芯片文档,掌握其使用方法。

三、预备知识

有C 语言基础 掌握在Linux 下常用编辑器的使用 掌握Makefile 的编写和使用 掌握Linux 下的程序编译与交叉编译过程

四、实验设备及工具

硬件:UP-CUP S2410 经典平台、PC 机Pentium 500 以上, 硬盘10G 以上。软件:PC 机操作系统REDHAT LINUX 9.0 +MINICOM +ARM-LINUX 开发环境

五、实验原理

1 、D/A转换器D/A 转换器的内部电路构成无太大差异,一般按输出是电流还是电压、能否作乘法运算等进行分类。大多数D/A 转换器由电阻阵列和n 个电流开关( 或电压开关) 构成。按数字输入值切换开关,产生比例于输入的电流( 或电压) 。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

59

http://www.up-tech.com博创科技(UP-TECH)

Page 60: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

电压输出型(如TLC5620)  电压输出型D/A 转换器虽有直接从电阻阵列输出电压的,但一般采用内置输出放大器以低阻抗输出。直接输出电压的器件仅用于高阻抗负载,由于无输出放大器部分的延迟,故常作为高速D/A 转换器使用。

电流输出型( 如THS5661A)

电流输出型D/A 转换器很少直接利用电流输出,大多外接电流—电压转换电路得到电压输出,后者有两种方法:一是只在输出引脚上接负载电阻而进行电流—电压转换,二是外接运算放大器。用负载电阻进行电流—电压转换的方法,虽可在电流输出引脚上出现电压,但必须在规定的输出电压范围内使用,而且由于输出阻抗高,所以一般外接运算放大器使用。此外,大部分CMOS DA 转换器当输出电压不为零时不能正确动作,所以必须外接运算放大器。当外接运算放大器进行电流电压转换时,则电路构成基本上与内置放大器的电压输出型相同,这时由于在D/A 转换器的电流建立时间上加入了运算放入器的延迟,使响应变慢。此外,这种电路中运算放大器因输出引脚的内部电容而容易起振,有时必须作相位补偿。

乘算型(如AD7533 )D/A 转换器中有使用恒定基准电压的,也有在基准电压输入上加交流信号的,后者由于能得到数字输入和基准电压输入相乘的结果而输出,因而称为乘算型D/A 转换器。乘算型D/A 转换器一般不仅可以进行乘法运算,而且可以作为使输入信号数字化地衰减的衰减器及对输入信号进行调制的调制器使用。

一位D/A转换器  一位D/A 转换器与前述转换方式全然不同,它将数字值转换为脉冲宽度调制或频率调制的输出,然后用数字滤波器作平均化而得到一般的电压输出( 又称位流方式) ,用于音频等场合。2 、D/A转换器的主要技术指标

分辩率(Resolution) 指最小模拟输出量(对应数字量仅最低位为“1” )与最大量(对应数字量所有有效位为“1” )之比。

建立时间(Setting Time) 是将一个数字量转换为稳定模拟信号所需的时间,也可以认为是转换时间。D/A 中常用建立时间来描述其速度,而不是A/D 中常用的转换速率。一般地,电流输出D/A建立时间较短,电压输出D/A则较长。其他指标还有线性度(Linearity) ,转换精度,温度系数/ 漂移。3 、MAX504 10 位D/A转换器的特点

由单个5V 电源供电电压输出缓冲内部2.048V参考电压

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

60

http://www.up-tech.com博创科技(UP-TECH)

Page 61: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

INL= LSB(MAX )电压不随温度变化可变的输出范围:0V~VDD,VSS~VDD上电复位串行输出

其各个管脚的功能如表2.5.1 所示:表2.5.1管脚定义

管脚 名称 功能1

BIPOFF

Bipolar offset/gain resistor

2 DIN Serial data input 3 CLR Clear. Asynchronously sets DAC register to all 0s. 4 SCLK Serial clock input

5 CS Chip select, active low

6DOU

TSerial data output for daisy-chaining

7DGN

DDigital ground

8AGN

DAnalog ground

9REFI

NReference input

10REFOUT

Reference output, 2.048V. Connect to VDD if not used.

11 VSS Negative power supply

12VOU

TDAC output

13 VDD Positive power supply

14 RFB Feedback resistor

4 、MAX504在开发板上的连接MAX504 在开发板中的连接如图2.5.1 所示:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

61

http://www.up-tech.com博创科技(UP-TECH)

Page 62: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图2.5.1 Max504 的连接上图中,RFB连接VOUT 、BIPOFF 连接AGND,使得输出电压范围为0~2VREFIN ,即0~4.069V 。时钟和输入、输出信号分别与同步串口的时钟、发送和接收端相连。可以通过WriteSDIO(data) 函数(Uhal.h )向MAX504 发送数据。发送数据时要注意,MAX504 可接受12 位的数据,但低两位不起作用。WriteSDIO(data) 函数一次只能发送8 位的数据,所以发送数据时应先将数据左移两位,然后先发送高八位,再发送低八位数据。CLR和CS 分别由MAX504_CLEAR() 和MAX504_ENABLE() 、MAX504_DISABLE() 函数(Max504.c)控制。

六、程序分析

程序流程图如图2.5.2 :

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

62

http://www.up-tech.com博创科技(UP-TECH)

Page 63: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图2.5.2实验程序流程图具体程序代码da_main.c 如下:

/************************************************* by zou jian guo<[email protected]>* 2004.9.27 14:30** the driver is s3c2410_da_max504.c in drivers/char*************************************************/#include <stdio.h>#include <fcntl.h>#include <string.h>#include <sys/ioctl.h>#define DA0_IOCTRL_WRITE 0x10#define DA1_IOCTRL_WRITE 0x11#define DA_IOCTRL_CLR 0x12#define Max504_FULL 4.096fstatic int da_fd = -1;char *DA_DEV="/dev/exio/0raw";void Delay(int t){ int i; for(;t>0;t--)

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

63

http://www.up-tech.com博创科技(UP-TECH)

Page 64: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

for(i=0;i<400;i++);}/************************************************************/int main(int argc, char **argv){ float v; unsigned int value;// char *da_dev;// unsigned int da_num=0; if(argc < 3){ printf("\n"); printf("Error parameter\n"); printf("Input as:\n"); printf("[~]./ad_main da_id num\n"); printf(" da_id: select between 0 and 1\n"); printf(" num: range 0.0 ~ 4.096\n"); printf("\n"); return 1; } sscanf(argv[2], "%f",&v); if(v<0 || v>Max504_FULL){ printf("DA out must between: 0 to %f\n", Max504_FULL); return 1; } value=(unsigned int)((v*1024.0f)/Max504_FULL); if((da_fd=open(DA_DEV, O_WRONLY))<0){ printf("Error opening /dev/exio/0raw device\n"); return 1; } if(strcmp(argv[1],"0") == 0){ ioctl(da_fd, DA_IOCTRL_CLR, 0); //clear da. ioctl(da_fd, DA0_IOCTRL_WRITE, &value); }else if (strcmp(argv[1],"1") == 0){ ioctl(da_fd, DA_IOCTRL_CLR, 1); //clear da. ioctl(da_fd, DA1_IOCTRL_WRITE, &value); } #if 0 ioctl(da_fd, DA_IOCTRL_CLR, 0); //clear da.

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

64

http://www.up-tech.com博创科技(UP-TECH)

Page 65: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

for(;;) { ioctl(da_fd, DA0_IOCTRL_WRITE, &value); Delay(500); } #endif close(da_fd); printf("Current Voltage is %f v\n", v); return 0;}

七、实验步骤

1 、阅读理解源码进入/arm2410cl/exp/basic/05_da 目录,使用vi编辑器或其他编辑器阅读理解源代码2 、编译应用程序运行make 产生da 可执行文件da_main

[root@zxt /]# cd /arm2410cl/exp/basic/05_da/[root@zxt 05_da]# makearmv4l-unknown-linux-gcc -c -o da_main.o da_main.carmv4l-unknown-linux-gcc da_main.o -o da_main[root@zxt 05_da]# lsda_main da_main.c da_main.o doc drivers Makefile s3c44b0-spi.h

3 、下载调试切换到minicom 终端窗口,使用NFS mount 开发主机的/arm2410cl 到/host 目录,然后进入/host/exp/05_da/drivers 目录,用insmod s3c2410-exio.o 命令插入D/A驱动,并用 lsmod 命令查看是否已经插入。

[/mnt/yaffs]cd /host/exp/basic/05_da/[/host/exp/basic/05_da]cd drivers/[/host/exp/basic/05_da/drivers]insmod s3c2410-exio.oUsing s3c2410-exio.o[/host/exp/basic/05_da/drivers]lsmodModule Size Used by Not taintedS 3c2410- exio 2384 0 (unused) // 只需关注这个一行即可i2c-tops2 14104 0 (unused)

注意:卸载模块可以使用rmmod 命令,以本实验为例,卸载方法如下:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

65

http://www.up-tech.com博创科技(UP-TECH)

Page 66: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

[/host/exp/basic/05_da]rmmod s3c2410-exio

进入/host/exp/basic/05_da目录,运行./da_main,观察运行结果的正确性。在输入 ./da_main 后会出现下面的提示信息。

[/host/exp/basic/05_da]./da_main

Error parameterInput as:[~]./ad_main da_id num da_id: select between 0 and 1 num: range 0.0 ~ 4.096

这是由于我们没有指定参数造成的,它的格式为 ./da_main [da 的id号] [ 数字] ,同时还需要在0.0~4.096V之间来选择一个输出电压。下面的例子是用了开发板上的DA并且输出1V 的电压,我们可以使用万用表对其进行测量。

[/host/exp/basic/05_da]./da_main 1Current Voltage is 1.000000 v

八、思考题

1 .D/A 转换器的分类。2 .D/A 转换器的主要技术指标。3 .MAX504 的特点及使用方法。

2.6 CAN 总线通讯实验

一、实验目的

掌握CAN 总线通讯原理。 学习MCP2510 的CAN 总线通讯的驱动开发。 掌握Linux 系统中断在CAN 总线通讯程序中使用。

二、实验内容

学习CAN 总线通讯原理,了解CAN 总线的结构,阅读CAN 控制器MCP2510 的芯片文档,掌握MCP2510 的相关寄存器的功能和使用方法。编程实现两台CAN 总线控制器

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

66

http://www.up-tech.com博创科技(UP-TECH)

Page 67: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

之间的通讯。ARM 接收到CAN 总线的数据后会在于终端显示,同时使用CAN 控制器发送的数据也会在终端反显。MCP2510 设置成自回环的模式,CAN 总线数据自发自收。

三、预备知识

有C 语言基础 了解CAN 总线 了解Linux 驱动的基本流程

四、实验设备及工具

硬件:UP-CUP S2410 经典平台、PC 机Pentium 500 以上, 硬盘10G 以上。软件:PC 机操作系统REDHAT LINUX 9.0 +MINICOM +ARM-LINUX 开发环境

五、实验原理

1 、CAN 总线概述CAN 全称为Controller Area Network ,即控制器局域网,是国际上应用最广泛的现场总线之一。最初CAN 总线被设计作为汽车环境中的微控制器通讯,在车载各电子控制装置ECU 之间交换信息,形成汽车电子控制网络。比如,发动机管理系统、变速箱控制器、仪表装备、电子主干系统中均嵌入CAN 控制装置。一个由CAN 总线构成的单一网络中,理论上可以挂接无数个节点。但是,实际应用中节点数目受网络硬件的电气特性所限制。例如,当使用Philips P82C250 作为CAN 收发器时,同一网络中允许挂接110个节点。CAN 可提供高达1Mbit/s 的数据传输速率,这使实时控制变得非常容易。另外,硬件的错误检定特性也增强了CAN 的抗电磁干扰能力。CAN 的主要优点包括:

低成本极高的总线利用率很远的数据传输距离( 长达10 公里)高速的数据传输速率(高达1Mbit/s )可根据报文的ID 决定接收或屏蔽该报文可靠的错误处理和检错机制

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

67

http://www.up-tech.com博创科技(UP-TECH)

Page 68: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

发送的信息遭到破坏后可自动重发节点在错误严重的情况下具有自动退出总线的功能报文不包含源地址或目标地址仅用标志符来指示功能信息优先级信

2 、CAN 总线的电气特征CAN 能够使用多种物理介质进行传输,例如:双绞线、光纤等。最常用的就是双绞线。信号使用差分电压传送,两条信号线被称为CAN_H 和CAN_L ,静态时均是2.5V 左右,此时状态表示为逻辑1 也可以叫做“隐性”。用CAN_H 比CAN_L 高表示逻辑0 ,称为“显性”。此时,通常电压值为CAN_H=3.5V 和CAN_L=1.5V 。当“显性”位和“隐性”位同时发送的时候,最后总线数值将为“显性”。这种特性,为CAN 总线的总裁奠定了基础。CAN 总线的一个位时间可以分成四个部分:同步段,传播段,相位段1 和相位段2 ,每段的时间份额的数目都是可以通过CAN 总线控制器(比如MCP2510)编程控制的,而时间份额的大小tq 由系统时钟tsys 和波特率预分频值BRP决定:tq=BRP/tsys 。如图2.6.1 所示:

图2.6.1 CAN 总线的一个位时间上述四个部分的设定和CAN 总线的同步、仲裁等信息有关,请读者参考CAN 总线方面的相关资料。3 、CAN 总线的MAC 帧结构如图2.6.2 所示,CAN 总线的帧数据有两种格式:标准格式和扩展格式。在MCP2510中,同时支持下面两种CAN 总线的帧格式。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

68

http://www.up-tech.com博创科技(UP-TECH)

Page 69: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图2.6.2 CAN 总线的帧数据4 、UP-CUP S2410 经典平台上的CAN 总线控制器MCP2510UP-CUP S2410 经典平台上采用MicroChip公司的MCP2510 CAN 总线控制器。其特点如下:

◆ 支持标准格式和扩展格式的CAN 数据帧结构◆ 0-8 字节的有效数据长度,支持远程帧◆ 最大1Mbps 的可编程波特率◆ 两个支持过滤器(Fliter 、Mask )的接收缓冲区,三个发送缓冲区◆ 支持回环(Loop Back )模式◆ SPI 高速串行总线,最大5MHz (4.5V供电)◆ 3V 到5.5V供电

UP-CUP S2410 经典平台上采用使用RJ11 标准接口作为CAN 总线接口,接口如图2.6.3 所示:

图2.6.3 CAN 总线接口与MCP2510 芯片系统中,S3C2410 通过SPI 同步串行接口和MCP2510 相连。MCP2510 的片选信号,通过接在S3C2410 的Bank5 上的锁存器(74HC753 )来控制。可以定义如下宏,来实现对Bank5 上的锁存器的操作。

#define EXIOADDR (*(volatile unsigned short*)0xa000000) //bank5extern unsigned short int EXIOReg;#define SETEXIOBIT(bit) do{EXIOReg|=bit;XIOADDR=EXIOReg;}while(0)#define CLREXIOBIT(bit) do{EXIOReg&=(~bit);EXIOADDR=EXIOReg;}while(0)

通过定义如下宏实现MCP2510 的片选:#define MCP2510_Enable() do{CLREXIOBIT(MCP2510_CS);}while(0)#define MCP2510_Disable() do{SETEXIOBIT(MCP2510_CS);}while(0)S3C2410 带有高速SPI 接口,可以直接和MCP2510 通讯。通过如下两个函数:SendSIOData(data) // 向同步串口发送数据(Uhal.h )ReadSIOData () // 从同步串口读取数据(Uhal.h )

5 、MCP2510 的控制字

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

69

http://www.up-tech.com博创科技(UP-TECH)

Page 70: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

如表2.6.1 所示,MCP2510 的控制包括了6 种命令:表2.6.1 MCP2510 中的命令

命令 格式 定义复位 1100 0000 设置内部寄存器为默认值,并设置MCP2510 到配置状态读取 0000 0011 从选定的寄存器的地址开始读取数据写入 0000 0010 向选定的寄存器的地址开始写入数据

发送请求 1000 0nnn 设置一个或者多个发送请求位,发送缓冲区中的数据读取状态 1010 0000 轮流检测发送或者接收的状态修改位 0000 0101 按位修改寄存器

各种命令的时序分别如图2.6.4 ,2.6.5 ,2.6.6 ,2.6.7 ,2.6.8 所示:

图2.6.4读取命令

图2.6.5 单字节写入命令

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

70

http://www.up-tech.com博创科技(UP-TECH)

Page 71: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图2.6.6发送请求命令

图2.6.7修改位命令

图2.6.8 状态读取命令6 、波特率的设置通过设置MCP2510 中的CNF1 、CNF2 、CNF3 三个寄存器,实现不同时钟下,CAN总线通讯的波特率的设置。在UP-CUP S2410 经典平台中,MCP2510 的输入时钟为16MHz 。可以按照如表2.6.2 所示方式定义CAN 总线通讯的波特率。

表2.6.2 MCP2510 的波特率设置CAN 波

特率 同步段 传输段 相位1

相位2

CNF1

CNF2

CNF3

125Kpbs 1 7 4 40x03

0x9E 0x03

250Kpbs 1 7 4 40x01

0x9E 0x03

500Kpbs 1 7 4 4 0x0 0x9E 0x03

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

71

http://www.up-tech.com博创科技(UP-TECH)

Page 72: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

0

1Mbps 1 3 2 20x00

0x9E 0x03

7 、接收过滤器的设置在MCP2510 中有两个Mask 过滤器,6 个Filter 过滤器。可以控制CAN 节点收到指定的一个(或者一组)ID 的数据。Mask 和Filter 来控制是否接收数据,遵循如表2.6.3所示的规律:

表2.6.3 Mask 和Filter 的控制规律Mask Filter 发送方的

ID 是否接收数据0 x x 是1 0 0 是1 0 1 否1 1 0 否1 1 1 是

8 、MCP2510 的初始化MCP2510 的初始化如下步骤:

1. 软件复位,进入配置模式2. 设置CAN 总线波特率3. 关闭中断4. 设置ID 过滤器5. 切换MCP2510 到正常状态(Normal )6. 清空接受和发送缓冲区7. 开启接收缓冲区,开启中断(可选)

9 、MCP2510 发送和接收数据MCP2510 中有3 个发送缓冲区,可以循环使用。也可以只使用一个发送缓冲区,但是,必须保证在发送的时候,前一次的数据已经发送结束。MCP2510 中有2 个接收缓冲区,可以循环使用。数据的发送和接收均可使用查询或者中断模式,这里,为编程简单,收发数据都采用查询模式。通过状态读取命令(Read Status Instruction)来判断是否接收到(或者发送出)数据。注 意 :关于MCP2510 的寄存 器 ,操作 方 式等的详细情 况 请 参 考 MCP2510 的datasheet 。

六、程序分析

本实验的代码如下:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

72

http://www.up-tech.com博创科技(UP-TECH)

Page 73: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

头文件UP-CAN.h#ifndef __UP_CAN_H__#define __UP_CAN_H__

#define UPCAN_IOCTRL_SETBAND 0x1 //set can bus band rate#define UPCAN_IOCTRL_SETID 0x2 //set can frame id data#define UPCAN_IOCTRL_SETLPBK 0x3 //set can device in loop back mode or

normal mode#define UPCAN_IOCTRL_SETFILTER 0x4 //set a filter for can device#define UPCAN_IOCTRL_PRINTRIGISTER 0x5 // print register information of spi

and portE#define UPCAN_EXCAN (1<<31) //extern can flagtypedef enum{ BandRate_125kbps=1, BandRate_250kbps=2, BandRate_500kbps=3, BandRate_1Mbps=4}CanBandRate;typedef struct { unsigned int id; //CAN 总线ID unsigned char data[8]; //CAN 总线数据 unsigned char dlc; // 数据长度 int IsExt; // 是否扩展总线 int rxRTR; // 是否扩展远程帧}CanData, *PCanData;/*********************************************************************\ CAN 设备设置接收过滤器结构体 参数: IdMask ,Mask IdFilter,Filter 是否接收数据按如下规律: Mask Filter RevID Receive 0 x x yes 1 0 0 yes 1 0 1 no 1 1 0 no 1 1 1 yes\*********************************************************************/typedef struct{

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

73

http://www.up-tech.com博创科技(UP-TECH)

Page 74: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

unsigned int Mask; unsigned int Filter; int IsExt; // 是否扩展ID}CanFilter,*PCanFilter;main.c:/************************************************\* by threewater<[email protected]> ** 2003.12.18 *\***********************************************/#include <stdio.h>#include <unistd.h>#include <fcntl.h>#include <time.h>//#include <sys/types.h>//#include <sys/ipc.h>#include <sys/ioctl.h>#include <pthread.h>//#include "hardware.h"#include "up-can.h"#define CAN_DEV "/dev/can/0"static int can_fd = -1;#define DEBUG#ifdef DEBUG#define DPRINTF(x...) printf("Debug:"##x)#else#define DPRINTF(x...)#endifstatic void* canRev(void* t){ CanData data; int i; DPRINTF("can recieve thread begin.\n"); for(;;){ read(can_fd, &data, sizeof(CanData)); for(i=0;i<data.dlc;i++) putchar(data.data[i]); fflush(stdout); }

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

74

http://www.up-tech.com博创科技(UP-TECH)

Page 75: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

return NULL;}#define MAX_CANDATALEN 8static void CanSendString(char *pstr){ CanData data; int len=strlen(pstr); memset(&data,0,sizeof(CanData)); data.id=0x123; data.dlc=8; for(;len>MAX_CANDATALEN;len-=MAX_CANDATALEN){ memcpy(data.data, pstr, 8); //write(can_fd, pstr, MAX_CANDATALEN); write(can_fd, &data, sizeof(data)); pstr+=8; } data.dlc=len; memcpy(data.data, pstr, len); //write(can_fd, pstr, len); write(can_fd, &data, sizeof(CanData));}int main(int argc, char** argv){ int i; pthread_t th_can; static char str[256]; static const char quitcmd[]="\\q!"; void * retval; int id=0x123; char usrname[100]={0,}; if((can_fd=open(CAN_DEV, O_RDWR))<0){ printf("Error opening %s can device\n", CAN_DEV); return 1; } ioctl(can_fd, UPCAN_IOCTRL_PRINTRIGISTER, 1); ioctl(can_fd, UPCAN_IOCTRL_SETID, id);#ifdef DEBUG ioctl(can_fd, UPCAN_IOCTRL_SETLPBK, 1);

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

75

http://www.up-tech.com博创科技(UP-TECH)

Page 76: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

#endif /* Create the threads */ pthread_create(&th_can, NULL, canRev, 0); printf("\nPress \"%s\" to quit!\n", quitcmd); printf("\nPress Enter to send!\n"); if(argc==2){ //Send user name sprintf(usrname, "%s: ", argv[1]); } for(;;){ int len; scanf("%s", str); if(strcmp(quitcmd, str)==0){ break; } if(argc==2) //Send user name CanSendString(usrname); len=strlen(str); str[len]='\n'; str[len+1]=0; CanSendString(str); } /* Wait until producer and consumer finish. */ //pthread_join(th_com, &retval); printf("\n"); close(can_fd); return 0;}

七、实验步骤

本实验中,CAN 总线以模块的形式编译在内核源码中。进行CAN 总线实验的步骤是:1 、编译CAN 总线模块

[root@zxt /]# cd /arm2410cl/kernel/linux-2.4.18-2410cl/[root@zxt linux-2.4.18-2410cl]# make menuconfig

进入Main Menu / Character devices 菜单,选择CAN BUS 为模块加载:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

76

http://www.up-tech.com博创科技(UP-TECH)

Page 77: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

编译内核模块:make depmakemake modules

编译结果为:/arm2410cl/kernel/linux-2.4.18-2410cl/drivers/char/s3c2410-can-mcp2510.o

注意:我们已经在/arm2410cl/exp/basic/06_can/driver/ 下,放置了编译后的驱动模块,为了使理解和使用起来比较简便,我们把上面的s3c2410-can-mcp2510.o 改名为can.o 放置在该目录下,您可以直接使用该驱动模块。2 、编译应用程序

[root@zxt /]# cd /arm2410cl/exp/basic/06_can/[root@zxt 06_can]# makearmv4l-unknown-linux-gcc -c -o main.o main.carmv4l-unknown-linux-gcc -o canchat main.o -lpthread[root@zxt 06_can]# lscanchat driver hardware.h main.c main.o Makefile up-can.h

3 、下载调试切换到minicom 终端窗口,使用NFS mount 开发主机的/arm2410cl 到/host目录, 然后

插入CAN 驱动模块。[/mnt/yaffs]mount -t nfs -o nolock 192.168.0.56:/arm2410cl /host[/mnt/yaffs]cd /host/exp/basic/06_can/driver/

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

77

http://www.up-tech.com博创科技(UP-TECH)

Page 78: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

[/host/exp/basic/06_can/driver]insmod can.oUsing can.oWarning: loading can will taint the kernel: no license See htsp://www.tux.org3lkml/#export-tacnted for inform2ation ab4out s10-mcp2510 initialized

运行应用程序 canchat 产看结果:[/host/exp/basic/06_can]./canchatDebug:can recieve thread begin.

Press "\q!" to quit!

Press Enter to send!asdfasdfasdfasfasfasdfasdfasdfasdfasfasfasdf

由于我们设置的CAN 总线模块为自回环方式,所以我们在终端上输入任意一串字符,都会通过CAN 总线在终端上收到同样的字符串。

八、思考题

1 .CAN 总线通讯最少需要几根线?如果多个节点应该如何连接?2 .为什么CAN 总线的可靠性高,传输数率却可以速度比串口快(可达到1Mbps )?3 .如果要在现有的系统上构建复杂的CAN 总线通信协议需要进行怎样的扩展?

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

78

http://www.up-tech.com博创科技(UP-TECH)

Page 79: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

2.7 简单嵌入式WEB 服务器实验

一、实验目的

掌握在ARM 开发板实现一个简单WEB 服务器的过程。 学习在ARM 开发板上的SOCKET网络编程。 学习Linux 下的signal() 函数的使用。

二、实验内容

学习使用socket 进行通讯编程的过程,了解一个实际的网络通讯应用程序整体设计,阅读HTTP 协议的相关内容,学习几个重要的网络函数的使用方法。读懂HTTPD.C 源代码。在此基础上增加一些其他功能。在PC 计算机上使用浏览器测试嵌入式WEB 服务器的功能。

三、预备知识

C 语言的基础知识、程序调试的基础知识和方法,Linux 环境下常用命令和Vi编辑器的操作。

HTTP1.0协议的基本知识。 SOCKET编程的几个基本函数的使用方法。

四、实验设备及工具

硬件:UP-CUP S2410 经典平台、PC 机Pentium 500 以上, 硬盘10G 以上。软件:PC 机操作系统REDHAT LINUX 9.0 +MINICOM +ARM-LINUX 开发环境

五、实验原理

1 、软件需求说明如图2.7.1 所示:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

79

http://www.up-tech.com博创科技(UP-TECH)

Page 80: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

获取指定文件

获取HTML类型文件

获取纯文本文件

获取J PG图像文件

获取服务器当前目录文件列表

获取GI F图像文件

客户

解析用户请求

图2.7.1 软件需求2 、功能需求详细说明

获取服务器当前目录文件列表将服务器当前目录下所有文件的信息发送给客户端,信息包括:文件名、大小、日期。

获取指定文件将客户请求的文件发送给客户。

获取HTML 类型文件将客户请求的HTML 类型文件发送给客户。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

80

http://www.up-tech.com博创科技(UP-TECH)

Page 81: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

获取纯文本文件将客户请求的纯文本发送给客户。

获取JPG 图像文件将客户请求的JPG 图像文件发送给客户。

获取GIF 图像文件将客户请求的GIF 图像文件发送给客户。

解析用户请求分析客户的请求,将请求信息解析为几个变量,包括:请求的命令、请求的文件名、请求的文件类型。 3 、数据流图(DFD )如图2.7.2 所示:

客户请求获取服务器资源

解析客户请求字符串

发送HTTP协议头

发送资源数据

侦听客户请求

客户计算机

读取客户请求资源

图2.7.2 数据流图4 、数据需求回应HTTP 协议数据头格式要求,如表2.7.1 所示:

表2.7.1 HTTP协议数据头格式

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

81

http://www.up-tech.com博创科技(UP-TECH)

Page 82: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

行号

字段 内容举例1 状态行 HTTP/1.0 200 OK

2 文件类型 Content-type: text/html

3 服务器信息 Server: ARMLinux-httpd 0.2.4

4 是否过期 Expires: 0

5 、系统结构图如图2.7.3 所示:

主程序MAI N1、环境设置2、建立侦听SOCKET及客户连接处理调用主循环

客户连接处理

解析客户请求HTTP协议头

发送HTTP协议数据头

发送GI F文件

发送文本文件

发送J PG文件

发送HTML文件

发送当前目录信息

图2.7.3 系统结构图6 、整体结构图说明主程序:建立TCP 类型SOCKET 在80 端口进行监听连接请求。接收到连接请求,将请求传送给连接处理模块处理。并继续进行监听。7 、连接处理模块如图2.7.4 所示:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

82

http://www.up-tech.com博创科技(UP-TECH)

Page 83: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

客户请求获取服务器资源

解析客户请求字符串

发送HTTP协议头

发送资源数据

侦听客户请求

客户计算机

读取客户请求资源

图2.7.4 连接处理模块8 、功能分配

发送当前目录文件列表信息将服务器当前目录下所有文件的信息发送给客户端,信息包括:文件名、大小、日期。

发送HTML 类型文件将客户请求的HTML 类型文件发送给客户。

发送纯文本文件将客户请求的纯文本发送给客户。

发送JPG 图像文件将客户请求的JPG 图像文件发送给客户。

发送GIF 图像文件将客户请求的GIF 图像文件发送给客户。

解析客户请求HTTP 协议头分析客户的请求,包括:

1. 空格处理2. 解析客户请求命令3. 解析客户请求的资源名4. 解析客户请求的资源类型。

客户连接处理解析Referrer 和content_length 字段值并调用客户请求解析函数。

发送HTTP 协议数据头

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

83

http://www.up-tech.com博创科技(UP-TECH)

Page 84: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

根据发送文件类型发送相应的HTTP 协议头信息。9 、接口设计客户连接处理函数名:int HandleConnect(int fd)参数:客户连接文件描述字10、解析客户请求函数名:int ParseReq(FILE *f, char *r)参数:参数1 :文件流FILE 结构指针,用于表示客户连接的文件流指针。

参数2 :字符串指针,待解析的字符串。11、发送HTTP协议数据头函数名:int PrintHeader(FILE *f, int content_type)参数:参数1 :文件流FILE 结构指针,用于表示客户连接的文件流指针。用于写入HTTP 协议数据头信息。

参数2 :信息类型,用于确定发送的HTTP 协议数据头信息。12、发送当前目录文件列表信息函数名:int DoDir(FILE *f, char *name)参数:参数1 :文件流FILE 结构指针,用于表示客户连接的文件流指针。用于写入目录文件信息数据。

参数2 :目录名,表示客户请求的目录信息。13、发送HTML 文件内容函数名:int DoHTML(FILE *f, char *name)参数:参数1 :文件流FILE 结构指针,用于表示客户连接的文件流指针。用于写入文件信息数据。

参数2 :客户请求的文件名。14、发送纯文本(TXT )文件内容函数名:int DoText(FILE *f, char *name)参数:参数1 :文件流FILE 结构指针,用于表示客户连接的文件流指针。用于写入文件信息数据。

参数2 :客户请求的文件名。15、发送JPEG 图像文件内容函数名:int DoJpeg(FILE *f, char *name)参数:参数1 :文件流FILE 结构指针,用于表示客户连接的文件流指针。用于写入文件信息数据。参数2 :客户请求的文件名。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

84

http://www.up-tech.com博创科技(UP-TECH)

Page 85: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

16、发送GIF 图像文件内容函数名:int DoGif(FILE *f, char *name)参数:参数1 :文件流FILE 结构指针,用于表示客户连接的文件流指针。用于写入文件信息数据。

参数2 :客户请求的文件名。

六、程序分析

1 、主程序设计1 )功能说明系统的总入口,也是系统的主要控制函数。分别完成如下功能:

建立环境设置。 设置信号处理方式。 建立侦听TCP流方式SOCKET并绑定80端口。 建立连接侦听及客户连接处理调用主循环。

2 )算法流程图算法流程图如图2.7.5 所示:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

85

http://www.up-tech.com博创科技(UP-TECH)

Page 86: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

设置信号处理句柄

进入根目录

命令行处理

建立TCP流SOCKET

绑定监听端口

设置允许客户连接数量

侦听客户连接请求

客户连接请求处理

图2.7.5 算法流程图3 )命令行输入处理用户在命令行输入参数 -i , 则将客户输入文件描述字设为0 ,即标准输入。用于在本机进行测试。其他输入全部忽略。2 、客户连接处理模块设计1 )功能说明用于初步处理客户的连接请求,并将请求信息传递给客户请求解析函数处理。2 )算法具体算法如图2.7.6 所示:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

86

http://www.up-tech.com博创科技(UP-TECH)

Page 87: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

打开文件描述字,并建立文件描述符

读取连接信息

获取Reff erer字段信息赋值给Reff erer全局变量

获取content_l ength字段信息

调用客户请求解析模块

关闭文件流

图2.7.6 算法流程图3 、客户请求解析处理模块设计1 )功能说明用于解析客户的请求,并根据请求信息调用相应的函数进行请求处理。2 )算法算法流程图如图2.7.7 所示:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

87

http://www.up-tech.com博创科技(UP-TECH)

Page 88: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

对客户的请求字符串进行空格处理

发送当前目录的I NDEX. HTML文件

请求目录下的i ndex. html是否存在? 发送当前目录

信息是否请求目录? [ 是 ]

是J PG或J PEG文件

判断客户请求文件类型

[ 否 ]

是GI F图像文件

是HTML文件

是纯文本文件

发送协议头:Content- type: i mage/ j peg

请求资源是否存在?

[ 是 ]

回应请求资源不存在。

[ 否 ]

发送协议头:Content- type: i mage/ gi f

发送协议头:Content - type: text / html

发送协议头:Content- type: text / pl ai n

发送文件数据

[ 是 ]

[ 否 ]

图2.7.7 算法流程图4 、发送HTTP协议数据头模块设计1 )功能说明根据参数的不同,发送不同的HTTP 协议头信息。2 )算法

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

88

http://www.up-tech.com博创科技(UP-TECH)

Page 89: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

函数定义为:int PrintHeader(FILE *f, int content_type) 发送请求成功信息:HTTP/1.0 200 OK 。 根据文档类型发送相应的信息:fprintf() ,函数中的第一个参数f 为客户连接文件流句柄。

switch (content_type) { case 't': fprintf(f,"Content-type: text/plain\n"); break; case 'g': fprintf(f,"Content-type: image/gif\n"); break; case 'j': fprintf(f,"Content-type: image/jpeg\n"); break; case 'h': fprintf(f,"Content-type: text/html\n"); break; }

发送服务器信息: fprintf(f,"Server: AMRLinux-httpd 0.2.4\n");

发送文件过期为永不过期:fprintf(f,"Expires: 0\n");

七、实验步骤

1 、阅读理解源码进入/arm2410cl/exp/basic/07_httpd 目录,使用vi编辑器或其他编辑器阅读理解源代码2 、编译应用程序运行make 产生可执行文件httpd

[root@zxt /]# cd /arm2410cl/exp/basic/07_httpd/[root@zxt 07_httpd]# makearmv4l-unknown-linux-gcc -DHTTPD_DOCUMENT_ROOT=\"/mnt/yaffs\" -c -o httpd.o

httpd.carmv4l-unknown-linux-gcc -DHTTPD_DOCUMENT_ROOT=\"/mnt/yaffs\" -c -o copy.c armv4l-unknown-linux-gcc -o ../bin/httpd httpd.o copy.o -lpthread

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

89

http://www.up-tech.com博创科技(UP-TECH)

Page 90: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

armv4l-unknown-linux-gcc -o httpd httpd.o copy.o -lpthread[root@zxt 07_httpd]# lscopy.c doc httpd httpd.o Makefilecopy.o Google httpd.c index.html Makefile.bak

3 、下载调试使用NFS服务方式将HTTPD 下载到开发板上,并拷贝测试用的网页进行调试,本例中用的是index测试网页。

[/mnt/yaffs]cd /host/exp/basic/07_httpd/[/host/exp/basic/07_httpd]./httpdstarting httpd...press q to quit.wait for connection.

4 、本机测试在台式机的浏览器中输入http ://192.168.0.111(111为UP-AMR2410-SUP-CUPS2410 实验板的IP地址),观察在客户机的浏览器中的连接请求结果(如图2.7.8 )和在开发板上的服务器的打印信息。

图2.7.8 IE 显示结果

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

90

http://www.up-tech.com博创科技(UP-TECH)

Page 91: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

注意:开发板的IP地址可以同过ifconfig 命令来查看

八、思考题

1 . 在理解源代码思想的基础上扩展一个监视功能,用于在浏览器端监视开发板上的采集数据。可以使用仿真模拟采集数据,使在客户端的浏览器中的显示数据不断变化。2 . 自定义一些功能,使用网络TCP协议实现。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

91

http://www.up-tech.com博创科技(UP-TECH)

Page 92: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

2.8 RS-485 通讯实验

一、实验目的

学习RS485通信原理 掌握MAX485 芯片的使用方法 掌握ARM 的串行口工作原理

二、实验内容

学习RS485 通信原理,阅读MAX485 芯片文档,掌握其使用方法,熟练ARM 系统硬件的UART 使用方法,编程实现RS485 通信的基本收发功能,利用示波器观测MAX485 芯片的输入和输出波形,将两个平台连接起来利用PC 键盘发送数据,超级终端观察收到的数据。

三、预备知识

有C 语言基础 掌握在Linux 下常用编辑器的使用 ARM 应用程序的框架结构

四、实验设备及工具

硬件:UP-CUP S2410 经典平台、PC 机Pentium 500 以上, 硬盘10G 以上。软件:PC 机操作系统REDHAT LINUX 9.0 +MINICOM +ARM-LINUX 开发环境

五、实验原理

1 、串行接口标准RS-485 是串行数据接口标准,最初是由电子工业协会(EIA )制订并发布的.  RS-485标准只对接口的电气特性做出规定,而不涉及接插件、电缆或协议,在此基础上用户可以建立自己的高层通信协议。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

92

http://www.up-tech.com博创科技(UP-TECH)

Page 93: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

平衡传输 RS-485 数据信号采用差分传输方式,也称作平衡传输,它使用一对双绞线,将其中一线定义为A ,另一线定义为B  。 通常情况下,发送驱动器A 、B 之间的正电平在+2 ~+6V ,是一个逻辑状态,负电平在-2~6V ,是另一个逻辑状态。另有一个信号地C ,在RS-485 中还有一“使能”端, “使能”端是用于控制发送驱动器与传输线的切断与连接。当“使能”端起作用时,发送驱动器处于高阻状态,称作“第三态”,即它是有别于逻辑“1” 与“0” 的第三态。

RS-485 电气规定 RS-485 采用平衡传输方式, 需要在传输线上接终接电阻。可以采用二线与四线方式,二线制可实现真正的多点双向通信。而采用四线连接时,只能实现点对多的通信,即只能有一个主(Master )设备,其余为从设备, 无论四线还是二线连接方式总线上可多接到32 个设备。RS-485 的共模输出电压是是-7V 至+12V 之间, 其最大传输距离约为1219 米,最大传输速率为10Mb/s 。平衡双绞线的长度与传输速率成反比,在100kb/s速率以下,才可能使用规定最长的电缆长度。只有在很短的距离下才能获得最高速率传输。一般100米长双绞线最大传输速率仅为1Mb/s.2 、通信方式RS-485 接口可连接成半双工和全双工两种通信方式,如图2.8.1 ,2.8.2 所示。半双工通信的芯片有SN75176 、SN75276 、SN75LBC184 、MAX485 、MAX 1487 、MAX3082 、MAX1483 等;全双工通信的芯片有SN75179 、SN75180 、MAX488~MAX491 、MAX1482 等。

图2.8.1半双工通信电路

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

93

http://www.up-tech.com博创科技(UP-TECH)

Page 94: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图2.8.2全双工通信电路本实验采用的是MAX485 的半双工通信方式。3 、本实验RS-485 原理图

RO1

RE2

DE3

DI4 GND 5

A 6B 7

VCC 8U1102

MAX485CSA

C1107104

GND

VCC

RS485D+RS485D-

GNDRS485TXD

RS485RXD

GPH1

R1113100K

GND

R111210K

R11165.1K

GND

1

2

3

4

5

JP1102

TXD2-Sel

1

2

3

4

5

JP1103

RXD2-Sel

RS485TXD RS485RXD

EXTXD2 EXRXD2

TXD2 RXD2

TXD2

IrDATXD IrDARXD

RXD2

JP11042/JP1103UART2-SELECT1-2 RS4852-3 EXPORT4-5 IrDA

图2.8.3 RS-485 原理图其中TXD2 和RXD2 为S3C2410X UART 的第二个通道的发送和接收端,GPH1 为1 时是发送使能,GPH1 为0 时是接收使能.MAX485 芯片的管脚功能如表2.8.1 :

表2.8.1管脚定义PIN NAM FUNCTION

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

94

http://www.up-tech.com博创科技(UP-TECH)

Page 95: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

E MAX485

DIP/SO

µMAX

1 3 RO Receiver Output: If A > B by 200mV, RO will be high; If A < B by 200mV, RO will be low.

2 4

Receiver Output Enable. RO is enabled when is low; RO is high impedance when is high.

3 5 DE

Driver Output Enable. The driver outputs, Y and Z, are enabled by bringing DE high. They are high impedance when DE is low. If the driver outputs are enabled, the parts function as line drivers. While they are high impedance, they function as line receivers if

is low.

4 6 DI Driver Input. A low on DI forces output Y low and output Z high. Similarly, a high on DI forces output Y high and output Z low.

5 7 GND Ground

— — Y Noninverting Driver Output

— — Z Inverting Driver Output

6 8 A Noninverting Receiver Input and Noninverting Driver Output

— — A Noninverting Receiver Input

7 1 B Inverting Receiver Input and Inverting Driver Output

— — B Inverting Receiver Input

8 2 VCC Positive Supply: 4.75V ≤ VCC ≤ 5.25V

— — N.C. No Connect—not internally connected

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

95

http://www.up-tech.com博创科技(UP-TECH)

Page 96: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

六、程序分析

本实验文件485-test.c 源代码如下:/* 485-test.c, need insmod s3c2410-485.o first. author: wb <[email protected]> date: 2005-6-13 21:05*/#include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <pthread.h>//#include <sys/mman.h>#include <termios.h>#define _485_IOCTRL_RE2DE (0x10) //send or receive#define _485_RE 0 //receive#define _485_DE 1 //send//#define BAUDRATE B115200#define COM2 "/dev/tts/2"#define DEV485 "/dev/485/0raw"static int get_baudrate(int argc,char** argv);static void help_menu(){ printf("\n"); printf("DESCRIPTION\n"); printf(" S3c2410 485 uart test program. \n"); printf(" arg0: 485-test \n"); printf(" arg1: baudrate, default for input 115200 \n"); printf(" arg2: select 485 mode: \n"); printf(" rev: receive data. \n"); printf(" send: send data, access data from console. \n"); printf("OPTIONS\n"); printf(" -h or --help: this menu\n"); printf("\n");}int main(int argc, char **argv){ int fd485, fdcom2;

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

96

http://www.up-tech.com博创科技(UP-TECH)

Page 97: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

struct termios oldtio,newtio,oldstdtio,newstdtio; char buf[1024]={0}, c='\n', *d; int baud; if((argc > 3 ) ||(argc == 1)){ help_menu(); exit(0); } fd485 = open(DEV485,O_RDWR); if(fd485 < 0){ printf("####s3c2410 485 device open fail####\n"); return (-1); } fdcom2 = open(COM2, O_RDWR ); if (fdcom2 <0) { perror(COM2); exit(-1); } if((baud=get_baudrate(argc, argv)) == -1) { printf("####s3c2410 485 device baudrate set failed####\n"); } tcgetattr(0,&oldstdtio); tcgetattr(fdcom2,&oldtio); /* save current modem settings */ tcgetattr(fdcom2,&newstdtio); /* get working stdtio */ newtio.c_cflag = baud | CRTSCTS | CS8 | CLOCAL | CREAD; /*ctrolflag*/ newtio.c_iflag = IGNPAR; /*input flag*/ newtio.c_oflag &= ~(ICANON | ECHO | ECHOE | ISIG); /*output flag*/ newtio.c_lflag &= ~OPOST; newtio.c_cc[VMIN]=1; newtio.c_cc[VTIME]=0; /* now clean the modem line and activate the settings for modem*/ tcflush(fdcom2, TCIFLUSH); tcsetattr(fdcom2,TCSANOW,&newtio);/*set attrib */ if(strncmp(argv[2],"send")==0) { ioctl(fd485, _485_IOCTRL_RE2DE, _485_DE ); //set 485 mode: send

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

97

http://www.up-tech.com博创科技(UP-TECH)

Page 98: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

printf("####s3c2410 485 device ready to send####\n"); #if 1 { int i; for(i='0'; i<='z'; i++) { printf("%c", i); fflush(stdout); write(fdcom2,&i,1); usleep(10000); if (i == 'z') i = '0'-1; } } #endif #if 0 while(1) { gets(buf); d = buf; while(*d != '\0') { write(fdcom2, d, 1); usleep(100); d++; } write(fdcom2, &c, 1); } #endif } else if (strncmp(argv[2],"rev")==0) { ioctl(fd485, _485_IOCTRL_RE2DE, _485_RE ); //set 485 mode: rev printf("####s3c2410 485 device receiving ####\n"); do { read(fdcom2,&c,1); /* com port */ printf("%c", c); fflush(stdout); }while (c != '\0'); } close(fdcom2); close(fd485);

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

98

http://www.up-tech.com博创科技(UP-TECH)

Page 99: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

return 0;}static int get_baudrate(int argc,char** argv){ int v=atoi(argv[1]); switch(v){ case 4800: return B4800; case 9600: return B9600; case 19200: return B19200; case 38400: return B38400; case 57600: return B57600; case 115200: return B115200; default: return -1; }}

七、实验步骤

本实验中,RS-485 以模块的形式编译在内核源码中。进行实验的步骤是:1 、编译RS-485 模块

[root@zxt /]# cd /arm2410cl/kernel/linux-2.4.18-2410cl/[root@zxt kernel-2410classic]# make menuconfig

进入Main Menu / Character devices 菜单,选择485 为模块加载:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

99

http://www.up-tech.com博创科技(UP-TECH)

Page 100: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图2.8.4 Character devices 菜单编译内核模块:

make depmakemake modules

编译结果为:/arm2410cl/kernel/linux-2.4.18-2410cl/drivers/char/s3c2410-485.o

注意:如果在前面的实验中已经编译过了内核,上面的步骤可以省略,我们可以直接使用编译结果中指出的RS-485 驱动模块。2 、编译应用程序

[root@zxt /]# cd /arm2410cl/exp/basic/08_485/[root@zxt 08_485]# make[root@zxt 08_485]# ls485.IAB 485.IMB 485.PFI 485.PR 485.PS 485-test.c 485.WK3 module485.IAD 485.IMD 485.PO 485.PRI 485-test 485-test.o Makefile

3 、下载调试切换到minicom 终端窗口,使用NFS mount 开发主机的/arm2410cl 到/host目录, 然后

插入RS-485 的驱动模块。开发板挂载完nfs 共享目录之后,这里演示的是在 /host/demos/485 下的编译好的程序和驱动模块,这里的驱动模块是为了使用方便从 /host/kernel/linux-2.4.18-2410cl/drivers/char/ 下复制过来的。进入到开发板的 [/host/exp/basic/08_485目录下:加载驱动程序 s3c2410-485.o 执行测试程序485-test 查看结果

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

100

http://www.up-tech.com博创科技(UP-TECH)

Page 101: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

[/host/exp/basic/08_485]ls 485-test.c Makefile drivers [/host/exp/basic/08_485]insmod /host/exp/basic/08_485/drivers/s3c2410-485.o Using /host/exp/basic/08_485/drivers/s3c2410-485.o [/host/exp/basic/08_485]./485-test DESCRIPTION S3c2410 485 uart test program. arg0: 485-test arg1: baudrate, default for input 115200 arg2: select 485 mode: rev: receive data. send: send data, access data from console. OPTIONS -h or --help: this menu [/host/exp/basic/08_485] 115200 send -sh: 115200: not found [/host/exp/basic/08_485]./485-test 115200 send ####s3c2410 485 device ready to send#### 0123456789:;<=>?

@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_

[/host/exp/basic/08_485]

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

101

http://www.up-tech.com博创科技(UP-TECH)

Page 102: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图2.8.5 演示内容本实验的程序能实现两台设备之间的通讯,运行./485-test 我们会看到上图的一个提示,我们要选择传输的波特率和模式(发送还是接收)。执行上图中的命令,程序会自动的向另一台设备发送字符串。

八、思考题

1 .RS-485 通信特点。2 .建立自己的高层通信协议, 完成设备间的多机通信。

2.9 直流电机实验

一、实验目的

熟悉ARM 本身自带的PWM ,掌握相应寄存器的配置。 Linux 下编程实现ARM 系统的PWM 输出,从而控制直流电机。 了解直流电机的工作原理,学会用软件的方法实现步进电机的脉冲分配。 掌握带有PWM 的CPU编程实现其相应功能的主要方法。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

102

http://www.up-tech.com博创科技(UP-TECH)

Page 103: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

二、实验内容

学习直流电机的工作原理,了解实现电机转动对于系统的软件和硬件要求。学习ARM PWM 的生成方法。使用Redhat Linux 9.0 操作系统环境及ARM 编译器,编译直流电机的驱动模块和应用程序。运行程序,实现直流电机的调速转动。

三、预备知识

C 语言的基础知识、程序调试的基础知识和方法,Linux 的基本操作。Linux 关于module的必要知识。

四、实验设备及工具

硬件:UP-CUP S2410 经典平台、PC 机Pentium 500 以上,硬盘10G 以上软件:PC 机操作系统REDHAT LINUX 9.0+MINICOM +ARM LINUX 开发环境

五、实验原理

1 、直流电动机的PWM 电路原理晶体管的导通时间也被称为导通角а ,若改变调制晶体管的开与关的时间,也就是说通过改变导通角а 的大小,如图2.9.1所示,来改变加在负载上的平均电压的大小,以实现对电动机的变速控制,称为脉宽调制 (PWM) 变速控制。在PWM 变速控制中,系统采用直流电源,放大器的频率是固定,变速控制通过调节脉宽来实现。构成PWM 的功率转换电路或者采用"H" 桥式驱动,或者采用 "T" 式驱动。由于"T" 式电路要求双电源供电,而且功率晶体管承受的反向电压为电源电压的两倍。因此只适用于小功率低电压的电动机系统。而"H" 桥式驱动电路只需一个电源,功率晶体管的耐压相对要求也低些,所以应用得较广泛,尤其用在耐高压的电动机系统中。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

103

http://www.up-tech.com博创科技(UP-TECH)

Page 104: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图2.9.1 脉宽调制 (PWM) 变速原理2 、直流电动机的PWM 等效电路如图2.9.2 a 所示:是一个直流电动机的PWM 控制电路的等效电路。在这个等效电路中,传送到负载 ( 电动机) 上的功率值决定于开关频率、导通角度及负载电感的大小。开关频率的大小主要和所用功率器件的种类有关,对于双极结型晶体管(GTR) ,一般为lkHz至5kHz ,小功率时(100W ,5A 以下) 可以取高些,这决定于晶体管的特性。对于绝缘栅双极晶体管(IGBT),一般为5kHz 至l2kHz ;对于场效应晶体管(MOSFET) ,频率可高达2OkHz 。另外,开关频率还和电动机电感有关,电感小的应该取得高些。

图2.9.2 (a) 等效电路 图2.9.2 (b) PWM 电路中电流和电压波讨论

当接通电源时,电动机两端加上电压UP ,电动机储能,电流增加,当电源中断时,电枢电感所储的能量通过续流二极管VD 继续流动,而储藏的能量呈下降的趋势。除功率值以外,电枢电流的脉动量也与电动机的转速无关,仅与开关周期、正向导通时间及电机的电磁时间常数有关。3 、直流电动机PWM 电路举例图2.9.3 为直流电动机PWM 电路的一个例子。它属于"H" 桥式双极模式PWM 电路。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

104

http://www.up-tech.com博创科技(UP-TECH)

Page 105: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图2.9.3 直流电动机PWM 电路举例电路主要由四部分组成,即三角波形成电路、脉宽调制电路、信号延迟及信号分配电路和功率电路。电路中各点波形如图2.9.4 所示。其中信号延迟电路是为了防止" 共态直通" 而设置的。一般延迟时间调整在(10~30)ps 之内,根据晶体管特性而定。其原理简单叙述如下:功率电路主要由四个功率晶体管和四个续流二极管组成。四个功率晶体管分为两组,V1 与V4 、V2 与V3 分别为一组,同一组的晶体管同时导通,同时关断。基极的驱动信号Ub1 = Ub2 ,Ub3=Ub4 。其工作过程为:· 在t1’—t2 期间, Ub1> 0 与Ub4 > 0 ,V1 与V4 导通,V2 与V3 截止,电枢电流沿回路l 流通。· 在t2— T+ t1’ 期间,Ub1< 0 与Ub4 < 0 ,V1 与V4 截止,Ub2 > 0 与U b 3> 0 但此时由于电枢电感储藏着能量,将维持电流在原来的方向上流动,此时电流沿回路2 流通;经过跨接于V2 与V3 上的续流二极管VD4、VD5。受二极管正向压降的限制,V2 与V3 不能导通。·T+ t1’ 之后,重复前面的过程。· 反向运转时,具有相似的过程。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

105

http://www.up-tech.com博创科技(UP-TECH)

Page 106: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图2.9.4 PWM电路中各点波形4 、开发平台中直流电机驱动的实现开发板中的直流电机的驱动部分如图2.9.3 所示;由于S3C2410 芯片自带定时器,所以控制部分省去了三角波产生电路、脉冲调制电路和PWM 信号延迟及信号分配电路,取而代之的是S3C2410 芯片的定时器0 、1 组成的双极性PWM 发生器。PWM 发生器用到的寄存器主要有以下几个:

TCFG0 定时器配置寄存器0

表2.9.1 TCFG0 寄存器寄存器 地址

读/写

描述 复位值

TCFG0 0x51000000 R/W

Configures the two 8-bit prescalers 0x00000000

TCFG0 位 描述 初始状态

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

106

http://www.up-tech.com博创科技(UP-TECH)

Page 107: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

Reserved [31:24] 0x00 Dead zone length

[23:16] These 8 bits determine the dead zone length. The 1 unit time of the dead zone length is equal to that of timer 0.

0x00

Prescaler 1 [15:8] These 8 bits determine prescaler value for Timer 2, 3 and 4.

0x00

Prescaler 0 [7:0] These 8 bits determine prescaler value for Timer 0 and 1.

0x00

参考:Dead zone length=0 ;prescaler value =2 。 TCFG1 定时器配置寄存器1

表2.9.2 TCFG1 寄存器寄存器 地址

读/写

描述 复位值

TCFG1 0x51000004

R/W 5-MUX & DMA mode selecton register 0x00000000

TCFG1 位 描述 初 始 状态

Reserved [31:24]

00000000

DMA mode [23:20]

Select DMA request channel

0000

0000 = No select (all interrupt)

0001 = Timer0

0010 = Timer1 0011 = Timer2 0100 = Timer3 0101 = Timer4 0110 = Reserved

MUX 4 [19:16]

Select MUX input for PWM Timer4. 0000

0000 = 1/2 0001 = 1/4 0010 = 1/8 0011 = 1/16 01xx = External TCLK1

MUX 3 [15:12]

Select MUX input for PWM Timer3. 0000

0000 = 1/2 0001 = 1/4 0010 = 1/8 0011 = 1/16 01xx = External TCLK1

MUX 2 [11:8] Select MUX input for PWM Timer2. 0000 0000 = 1/2 0001 = 1/4 0010 = 1/8

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

107

http://www.up-tech.com博创科技(UP-TECH)

Page 108: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

0011 = 1/16 01xx = External TCLK1 MUX 1 [7:4] Select MUX input for PWM Timer1. 0000

0000 = 1/2 0001 = 1/4 0010 = 1/8 0011 = 1/16 01xx = External TCLK0

MUX 0 [3:0] Select MUX input for PWM Timer0. 0000 0000 = 1/2 0001 = 1/4 0010 = 1/8 0011 = 1/16 01xx = External TCLK0

时钟输入频率=PCLK/(prescaler value+1)/ (divider value) 。prescaler value 有TCFG0 决定;divider value 由TCFG1 决定。参考:无DMA 模式,divider value =2 。本系统中PCLK =50.7MHz

TCON 定时器控制寄存器表2.9.3 TCON 寄存器

寄存器 地址 读/ 写 描述 复位值

TCON 0x51000008

R/W Timer control register 0x00000000

TCON 位 描述 初始状态 Timer 4 auto reload on/off

[22]

Determine auto reload on/off for Timer 4. 0 = One-shot 1 = Interval mode (auto reload)

0

Timer 4 manual update [21]

Determine the manual update for Timer 4. 0 = No operation 1 = Update TCNTB4

0

Timer 4 start/stop [20]

Determine start/stop for Timer 4. 0 = Stop 1 = Start for Timer 4

0

Timer 3 auto reload on/off

[19]

Determine auto reload on/off for Timer 3. 0 = One-shot 1 = Interval mode (auto reload)

0

Timer 3 output inverter on/off

[18]

Determine output inverter on/off for Timer 3. 0 = Inverter off 1 = Inverter on for TOUT3

0

Timer 3 manual update [17]

Determine manual update for Timer 3. 0 = No operation 1 = Update TCNTB3 & TCMPB3

0

Timer 3 start/stop [16]

Determine start/stop for Timer 3. 0 = Stop 1 = Start for Timer 3

0

Timer 2 auto reload on/off

[15]

Determine auto reload on/off for Timer 2. 0 = One-shot 1 = Interval mode (auto reload)

0

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

108

http://www.up-tech.com博创科技(UP-TECH)

Page 109: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

Timer 2 output inverter on/off

[14]

Determine output inverter on/off for Timer 2. 0 = Inverter off 1 = Inverter on for TOUT2

0

Timer 2 manual update [13]

Determine the manual update for Timer 2. 0 = No operation 1 = Update TCNTB2 & TCMPB2

0

Timer 2 start/stop [12]

Determine start/stop for Timer 2. 0 = Stop 1 = Start for Timer 2

0

Timer 1 auto reload on/off

[11]

Determine the auto reload on/off for Timer1. 0 = One-shot 1 = Interval mode (auto reload)

0

Timer 1 output inverter on/off

[10]

Determine the output inverter on/off for Timer1. 0 = Inverter off 1 = Inverter on for TOUT1

0

Timer 1 manual update [9] Determine the manual update for Timer 1. 0 = No operation 1 = Update TCNTB1 & TCMPB1

0

Timer 1 start/stop [8] Determine start/stop for Timer 1. 0 = Stop 1 = Start for Timer 1

0

TCON Bit Description

Initial state

Reserved [7:5]

Reserved

Dead zone enable [4] Determine the dead zone operation. 0 = Disable 1 = Enable

0

Timer 0 auto reload on/off

[3] Determine auto reload on/off for Timer 0. 0 = One-shot 1 = Interval mode(auto reload)

0

Timer 0 output inverter on/off

[2] Determine the output inverter on/off for Timer 0. 0 = Inverter off 1 = Inverter on for TOUT0

0

Timer 0 manual update (note)

[1] Determine the manual update for Timer 0. 0 = No operation 1 = Update TCNTB0 & TCMPB0

0

Timer 0 start/stop [0] Determine start/stop for Timer 0. 0 = Stop 1 = Start for Timer 0

0

参考:dead zone operation enable ;Inverter offTCNTB0& TCMPB0 定时器计数缓冲区寄存器和比较缓冲区寄存器

表2.9.4 TCNTB0& TCMPB0

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

109

http://www.up-tech.com博创科技(UP-TECH)

Page 110: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

寄存器 地址 读/

写 描述 复位值

TCNTB0 0x5100000C

R/W Timer 0 count buffer register 0x00000000

TCMPB0 0x51000010

R/W Timer 0 compare buffer register 0x00000000

TCMPB0 位 描述 初始状态 Timer 0 compare buffer register

[15:0] Set compare buffer value for Timer 0

0x00000000

TCNTB0 位 描述 初始状态Timer 0 count buffer register

[15:0] Set count buffer value for Timer 0 0x00000000

TCNTB0决定了脉冲的频率,TCMPB0 决定了正脉冲的宽度。当TCMPB0 =TCNTB0/2时,正负脉冲宽度相同;当TCMPB0 由0 变到TCNTB0时,负脉冲宽度不断增加。参考:脉冲频率为1Hz。TCNTO0 定时器观察寄存器

表2.9.5 TCNTO0

寄存器 地址 读/写 描述 复位值

TCNTO0 0x51000014 R Timer 0 count observation register 0x00000000

TCNTO0 位 描述 复位值Timer 0 observation register

[15:0] Set count observation value for Timer 0

0x00000000

六、程序分析

Linux 下的直流电机程序包括模块驱动程序和应用程序两部分。Module 驱动程序实现了以下方法:

static struct file_operations s3c2410_dcm_fops = {owner: THIS_MODULE,

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

110

http://www.up-tech.com博创科技(UP-TECH)

Page 111: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

open: s3c2410_dcm_open,ioctl: s3c2410_dcm_ioctl,release: s3c2410_dcm_release,

};

开启设备时,配置IO 口为定时器工作方式:({ GPBCON &=~ 0xf; GPBCON |= 0xa; })

配置定时器的各控制寄存器:({ TCFG0 &= ~(0x00ff0000); \

TCFG0 |= (DCM_TCFG0); \ TCFG1 &= ~(0xf); \ TCNTB0 = DCM_TCNTB0; /* less than 10ms */ \ TCMPB0 = DCM_TCNTB0/2; \ TCON &=~(0xf); \ TCON |= (0x2); \ TCON &=~(0xf); \ TCON |= (0x19); })

在s3c2410_dcm_ioctl 中提供调速功能接口:case DCM_IOCTRL_SETPWM:

return dcm_setpwm((int)arg);

应用程序dcm_main.c中调用:ioctl(dcm_fd, DCM_IOCTRL_SETPWM, (setpwm * factor));

实现直流电机速度的调整。

七、实验步骤

1 、编译直流电机模块cd /arm2410cl/kernel/linux-2.4.18-2410cl/ cd /arm2410cl/kernel-2410classic make menuconfig

进入Main Menu / Character devices 菜单,选择DC MOTOR 为模块加载:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

111

http://www.up-tech.com博创科技(UP-TECH)

Page 112: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

编译内核模块:make depmakemake modules

直流电机模块的编译结果为:/arm2410cl/kernel/linux-2.4.18-2410cl/drivers/char/s3c2410-dc-motor.o

2 、编译应用程序cd /arm2410cl/exp/basic/09_dcmotor/make

生成dcm_main3 、运行程序在超级终端中,通过加载NFS运行编译结果(注意:首先要设定/arm2410cl 为NFS共享目录):

mount –t nfs –o nolock 192.168.0.xxx56:/arm2410cl /hostinsmod /host/exp/basic/09_dcmotor/driver/ dc-motor.ocd /host/exp/basic/09_dcmotor/./dcm_main

程序运行结果:直流电机变速转动。........setpwm = -265setpwm = -266setpwm = -267setpwm = -268

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

112

http://www.up-tech.com博创科技(UP-TECH)

Page 113: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

setpwm = -269setpwm = -270setpwm = -271setpwm = -272setpwm = -273......setpwm = 290setpwm = 291setpwm = 292setpwm = 293setpwm = 294setpwm = 295setpwm = 296setpwm = 297setpwm = 298......

屏幕显示转速。

八、思考题

1 .简述PWM 的基本原理,思考其基本参数的变化对电机转动的影响。2 .尝试使用实验箱上的电位器旋钮控制直流电机的转向和转速。

2.10 8字数码管和点阵数码管实验

一、实验目的

学习LED的相关知识 掌握74HC273芯片的工作原理 了解SPI 接口的相关知识

二、实验内容

学习LED相关知识,了解74HC273芯片对LED点亮的工作机制,熟练阅读74HC273芯

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

113

http://www.up-tech.com博创科技(UP-TECH)

Page 114: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

片资料,掌握对它的使用。

三、预备知识

有C 语言基础 掌握在Linux 下常用编辑器的使用 掌握Makefile 的编写和使用 掌握Linux 下的程序编译与交叉编译过程需要部分数字电路的知识

四、实验设备及工具

硬件:UP-CUP S2410 经典平台、PC 机Pentium 500 以上, 硬盘10G 以上。软件:PC 机操作系统REDHAT LINUX 9.0 +MINICOM +ARM-LINUX 开发环境

五、实验原理

1 、LED 知识D/A 转换器的内部电路构成无太大差异,一般按输出是电流还是电压、能否作乘法运

算等进行分类。大多数D/A 转换器由电阻阵列和n 个电流开关( 或电压开关) 构成。按数字输入值切换开关,产生比例于输入的电流( 或电压) 。

1.什么是LED?   在某些半导体材料的PN 结中,注入的少数载流子与多数载流子复合时会 把多余的

能量以光的形式释放出来,从而把电能直接转换为光能。PN 结加反 向电压,少数载流子难以注入,故不发光。这种利用注入式电致发光原理制 作的二极管叫发光二极管,通称LED。   LED的发光颜色和发光效率与制作LED的材料和工艺有关,目前广泛使用 的有红、绿、蓝三种。由于LED工作电压低(仅1.5-3V ),能主动发光且有 一定亮度,亮度又能用电压(或电流)调节,本身又耐冲击、抗振动、寿命 长(10 万小时),所以在大型的显示设备中,目前尚无其他的显示方式与 LED显示方式匹敌。 把红色和绿色的LED放在一起作为一个像素制作的显示屏叫双基色屏或 伪彩色屏;把红、绿、蓝三种LED管放在一起作为一个像素的显示屏叫三基 色屏或全彩屏。制作室内LED屏的像素尺寸一般是2-10 毫米,常常采用把几 种能产生不同基色的LED管芯封装成一体,室外LED屏的像素尺寸多为12-26 毫米,每个像素由若干个各种单色LED组成,常见的成品称像素筒或像素模 块。   LED显示屏如果想要显示图象,则需要构成像素的每个LED的发光亮度都 必须能调节,其调节的精细程度就是显示屏的灰度等级。灰度等级越

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

114

http://www.up-tech.com博创科技(UP-TECH)

Page 115: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

高,显 示的图像就越细腻,色彩也越丰富,相应的显示控制系统也越复杂。在当前 的技术水平下,256级灰度的图像,颜色过渡已十分柔和,图像还原效果比 较令人满意。 资料显示,LED光源比白炽灯节电87% 、比荧光灯节电50% ,而寿命比白 炽灯长20~30 倍、比荧光灯长10 倍。LED光源因具有节能、环保、长寿命、安 全、响应快、体积小、色彩丰富、可控等系列独特优点,被认为是节电降能 耗的最佳实现途径。 2 、LED 数码管电路图

其中各个引脚的功能在下面都有描述。3 、74HC273在开发板上的连接74HC273 在8 字数码管中开发板中的连接如图2.5.1 所示:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

115

http://www.up-tech.com博创科技(UP-TECH)

Page 116: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

开发板设置2 个数码管,由74HC273 控制。74HC273是同步串行转并行的锁存器,在此通过SPI 总线和CPU 连接,锁存数据后驱动数码管发光。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

116

http://www.up-tech.com博创科技(UP-TECH)

Page 117: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

上面一副图的最左边接的是下面图的最右边。

六、程序分析

重要代码片断分析如下:unsigned char

LEDCODE[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};/

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

117

http://www.up-tech.com博创科技(UP-TECH)

Page 118: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

/ 这个是10 个数字的编码// 在这里主要是用到编码的过程假设a 是8 字型数码管的最上一横,以顺时针以次列出b,c,d,e,f.中间那一横为

g ,如果要显示为0 的话,由于在开发板中的连接是共阳极( 请参考我们的电路图) ,所以只需要满足a,b,c,d,e,f 为0 即可,而g 为1 ,因为两个数码管的中间是个点号,我们用h 表示,并且总是让它置为1 。因为我们在开发板的连接上可以看到a 对应d0,b 对应d1 ,..........h 对应d7 ,所以当想显示为0 的时候,那么应该是11000000。转化成为16 进制的数据,也就成了0Xc0.对应我们在LEDCODE 【10 】数组中的第一位。其他的每一位值,大家可以根据上面的方法依次类推。

在for循环中我们写了如下语句。LEDWORD=(LEDCODE[i]<<8)|LEDCODE[9-i];

那是因为LEDWORD 是一个16 位的数。我们是需要将两个8 字数码管同时显示,所以将LEDCODE[i]左移8 位,然后再加上个位使得十位和个位同时显示。

至于显示点阵数码管还是显示8 字数码管,主要是通过IOCTL函数中的命令来实现的,也就是在代码中出现的

ioctl(fd,0x12,LEDWORD);ioctl(fd,0x11,LEDWORD);

下面分析这个IOCTL函数的原型static int s3c2410_led_ioctl (struct inode *inode, struct

file *filp, unsigned int cmd, unsigned int arg){

//printk("DOT buffer is %x\n" ,arg ); switch(cmd){

case LED_TUBE_IOCTRL:// 如果是0x11 命令,那么点亮8 字数码管 return *(volatile unsigned short

*)s3c2410_led_tube_base=arg;

case LED_DIG_IOCTRL://如果是0x12 命令 ,那么点亮点阵数码管 return *(volatile unsigned short

*)s3c2410_led_dig_base=arg;

default : return printk("your command is not exist"); }

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

118

http://www.up-tech.com博创科技(UP-TECH)

Page 119: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

return 0;}

其中宏定义#define LED_TUBE_IOCTRL 0x11 #define LED_DIG_IOCTRL 0x12

由于在s3c2410_led_init 函数中s3c2410_led_tube_base = (unsigned int)

ioremap(LED_TUBE_PHY_START, 0x01);//IO映射s3c2410_led_dig_base = (unsigned int)

ioremap(LED_DIG_PHY_START, 0x01);//将物理地址转换成为虚拟地址由于我们操作的是虚拟地址,而不是物理地址,所以需要将物理地址转换成为物理地

址。物理地址在开发板的电路图中有表明很清楚。在驱动中我们也有定义#define LED_TUBE_PHY_START 0x08000100#define LED_DIG_PHY_START 0x08000102

所以上面IOCTL函数的功能就是当下达不同的命令时,也就是让不同的数码管显示其信息。

在应用程序中我们还用到了一些延迟的函数 ,如jmdelay(1000); 等。主要是给一些停顿,让人的视觉能够清晰的识别数码管中的数字。

七、实验步骤

1 、阅读理解源码进入/arm2410cl/exp/basic/10_led 目录,使用vi编辑器或其他编辑器阅读理解源代码2 、编译应用程序运行make 产生test_led可执行文件test_led

[root@BC exp/basic]# cd /arm2410cl/exp/basic/10_ledcd 10_led [root@BC 10_led]# makearmv4l-unknown-linux-gcc -c -I.. -Wall -O -D__KERNEL__ -

DMODULE -I/home/kernel/linux-2.4.18-2410cl/include s3c2410-led.c -o s3c2410-led.o

armv4l-unknown-linux-gcc -I.. -Wall -O -D__KERNEL__ -DMODULE -I/home/kernel/linux-2.4.18-2410cl/include -c -o test_led.o test_led.c

[root@BC 2410-Classics LED]# lsMakefile readme s3c2410-led.c s3c2410-led.o test_led

test_led.c test_led.o

3 、下载调试切换到minicom 终端窗口,使用NFS mount 开发主机的/arm2410cl 到/host 目录,

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

119

http://www.up-tech.com博创科技(UP-TECH)

Page 120: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

然后进入/host/exp/basic/10_led 目录,用insmod s3c2410-led.o(s3c2410-led.o 是一个已经编译好的驱动程序,可以使用10_led 目录下的驱动或者是开发板/mnt/yaffs/tube_test/ 目录下的驱动) 命令插入led 驱动,并用 lsmod 命令查看是否已经插入。

[/mnt/yaffs]mount -t nfs -o nolock 192.168.0.18956:/arm2410cl /host

[/host/exp/basic]cd 10_led/ [/host/exp/10_led]lsMakefile readme s3c2410-led.c s3c2410-led.o test_led

test_led.c test_led.o [/host/exp/10_led]insmod /host/exp/basic/10_led/s3c2410-

led.oUsing s3c2410-led.o0-numeric tube : Dprintk device opens3c2410-hc273 initializedUsing exio.o[/host/exp/10_led]lsmodModule Size Used by Tainted: P s3c2410-led 2048 0 (unused)[/host/exp/10_led]./test_led

即可以看到8 字数码管和点阵数码管工作。

八、思考题

1 .LED是如何正常工作的。2 .HC273 的特点及使用方法。

2.11 中断实验

一、实验目的

学习中断的相关知识 学习驱动的编写

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

120

http://www.up-tech.com博创科技(UP-TECH)

Page 121: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

二、实验内容

掌握中断的知识,学习在linux 下写针对S3C2410 的驱动程序。(此部分需要同学在做完前面的大部分实验的基础上,至少需要对驱动程序有个大概的认识。)

三、预备知识

有C 语言基础 有操作系统相关知识 掌握Linux 下的程序编译与交叉编译过程

四、实验设备及工具

硬件:UP-CUP 2410-S 平台经典嵌入式实验平台、PC 机Pentium 500 以上, 硬盘10G 以上。软件:PC 机操作系统REDHAT LINUX 9.0 +MINICOM +ARM-LINUX 开发环境

五、实验原理

S3C2410 中断处理ARM920T 的异常向量表有两种存放方式,一种是低端存放(从0x00000000 处开始存放),另一种是高端存放(从0xfff000000 处开始存放)。ARM920T能处理有8 个异常,他们分别是:Reset ,Undefined instruction ,Software Interrupt ,Abort (prefetch),Abort (data) ,Reserved ,IRQ ,FIQ下面是某个采用低端模式的系统源码片段:/*****************************************************************************_start:b        Handle_Resetb        HandleUndefb        HandleSWIb        HandlePrefetchAbortb        HandleDataAbortb        HandleNotUsed

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

121

http://www.up-tech.com博创科技(UP-TECH)

Page 122: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

b        HandleIRQb        HandleFIQ…..…..other codes…...*****************************************************************************/上面这部分片段一般出现在一个名叫“head.s” 的汇编文件的里,“b        Handle_Reset” 这条语句就是系统上电之后运行的第一条语句。也就是说这部分代码的二进制码必须位于内存的最开始部分(这正是低端存放模式),因为上电后CPU 会从SDRAM 的0x00000000 处取第一条指令并执行。Address                Instruct0x00000000:                 b        Handle_Reset0x00000004:                 b        HandleUndef0x00000008:                 b        HandleSWI0x0000000C:                 b        HandlePrefetchAbort0x00000010:                 b        HandleDataAbort0x00000014:                 b        HandleNotUsed0x00000018:                 b        HandleIRQ0x0000001C:                 b        HandleFIQ上面是该程序段在系统上电后加载到内存后的分布情况,我们可以看到每条指令占用了4个字节。上电后,PC 指针会跳转到Handle_Reset处开始运行。以后系统每当有异常出现,则CPU 会根据异常号,从内存的0x00000000 处开始查表做相应的处理,比如系统触发了一个IRQ异常,IRQ 为第6 号异常,则CPU 将把PC 指向0x00000018 地址(4*6=24=0x00000018 )处运行,该地址的指令是跳转到“中断异常服务例程”(HandleIRQ )处运行。以上就是对异常向量表的一个简单介绍。现在可以进入“中断异常处理”,s3c2410 的中断分快中断(FIQ) 和普通中断(IRQ), 讨论的重点是普通中断(IRQ)。s3c2410 的中断异常处理模块总共由以下寄存器构成SRCPND(SOURCE PENDING REGISTER)INTMOD(INTERRUPT MODE REGISTER)INTMSK(INTERRUPT MASK REGISTER)PRIORITY( PRIORITY REGISTER)INTPND(INTERRUPT PENDING REGISTER)

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

122

http://www.up-tech.com博创科技(UP-TECH)

Page 123: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

INTOFFSET(INTERRUPT OFFSET REGISTER)SUBSRCPND (INTERRUPT SUB SOURCE PENDING)INTSUBMSK  (INTERRUPT SUB MASK REGISTER )下面讲解每个寄存器在一个中断处理流程中所扮演的角色SRCPND/ SUBSRCPND 这两个寄存器在功能上是相同的,它们是中断源引脚寄存器,在一个中断异常处理流程中,中断信号传进中断异常处理模块后首先遇到的就是SRCPND/ SUBSRCPND, 这两个寄存器的作用是用于标示出哪个中断请求被触发。SRCPND 的有效位为32,SUBSRCPND 的有效位为11,它们中的每一位分别代表一个中断源。SRCPND为主中断源引脚寄存器,SUBSRCPND 为副中断源引脚寄存器。这里列举出SRCPND 的各个位信息:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

123

http://www.up-tech.com博创科技(UP-TECH)

Page 124: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

每个位的初始值皆为0 。假设现在系统触发了TIMER0 中断,则第10bit 将被置1 ,代 表 TIMER0 中断被触发 ,该中断请求即将被处理(若该中断没有被屏蔽的 话)。SUBSRCPND情况与SRCPND 相同,这里就不多讲了。INTMOD寄存器有效位为32位,每一位与SRCPND 中各位相对应,它的作用是指定该位相应的中断源处理模式(IRQ 还是FIQ )。若某位为0 ,则该位相对应的中断按IRQ模式处理,为1 则以FIQ 模式进行处理,该寄存器初始化值为0x00000000, 即所有中断皆以IRQ模式进行处理。(详细请参考s3c2410 操作手册)。

INTMSK/ INTSUBMSK 寄存器为中断屏蔽寄存器 ,INTMSK 为主中断屏蔽寄存器,INTSUBMSK 为副中断屏蔽寄存器。INTMSK 有效位为32,INTSUBMSK 有效位为11,这两个寄存器各个位与SRCPND 和SUBSRCPND 分别对应。它们的作用是决定该位相应的中断请求是否被处理。若某位被设置为1 ,则该位相对应的中断产生后将被忽略(CPU不处理该中断请求),设置为0 则对其进行处理。这两个寄存器初始化后的值是0xFFFFFFFF和0x7FF ,既默认情况下所有的中断都是被屏蔽的。 到 目 前 为 止 我 们 总 共 讲 解 了SRCPND ,INTMOD,INTMSK ,SUBSRCPND ,INTSUBMSK五个寄存器,在继续讲解PRIORITY 寄存器之前我们先来看一张图。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

124

http://www.up-tech.com博创科技(UP-TECH)

Page 125: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

先弄清楚一点,现在要讨论的是一个中断优先级的判断问题。为什么会有中断有先级的问题呢?我们知道CPU某个时刻只能对一个中断源进行中断处理,如果现在有3 个中断同时发生了,那CPU要按什么顺序处理这个3 个中断呢?这正是引入优先级判断的原因所在,通过优先级判断,CPU可以按某种顺序逐个处理中断请求。3sc2410 的优先级判断分为两级。如上图所示,SRCPND寄存器对应的32个中断源总共被分为6 个组,每个组由一个

ARBITER (0~5 )寄存器对其进行管理。中断必须先由所属组的ARBITER (0~5 )进行第一次优先级判断(第一级判断)后再发往ARBITER6进行最终的判断(第二级判断)。ARBITER (0~5 )这六个组的优先级已经固定,我们无法改变,也就是说由ARBITER0控制的该组中断优先级最高(该组产生的中断进行第一级判断后永远会以REQ0 向ARBITER6传递过去)其次是ARBITER1, ARBITER2, ARBITER4, ARBITER4, ARBITER5.我们能够控制的是某个组里面各个中断的优先级顺序。怎么控制?通过PRIORITY 寄存器进行控制。以下是PRIORITY 寄存器各个位的参数表

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

125

http://www.up-tech.com博创科技(UP-TECH)

Page 126: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

从 表 上 我 们 可 以知道PRIORITY 寄存器 内部各 个位被分 为 两种类 型 , 一种是ARB_MODE, 另 一 种 为 ARB_SEL, ARB_MODE 类 型 有 5 组 对 应ARBITER (2~6 ),ARB_SEL 类型有7 组对应ARBITER (0~6 )。现在我将以ARBITER2 为例,讲解中断组与PRIORITY 寄存器中ARB_SEL, ARB_MODE 之间的相互关系。 首先我 们看到 ARBITER2 寄存器管理的该组中断里包 括 了 6 个 中断, 分别是INT_TIMER0 ,INT_TIMER1 ,INT_TIMER2 ,INT_TIMER3 ,INT_TIMER4 ,INT_UART2 , 她 们 的 默 认 中 断 请 求 号 分 别 为REQ0 ,REQ1 ,REQ2 ,REQ3 ,REQ4 ,REQ5 。我们先看PRIORITY 寄存器中的ARB_SEL2 ,该参数由两个位组成,初始值为00。从该表可以看出00定义了一个顺序 0-1-2-3-4-5 ,这个顺序就是这组中断组的优先级排列,这个顺序指明了以中断请求号为0 ( REQ0 ) 的 INT_TIMER0 具 有 最 高 的 中 断 优 先 级 , 其 次 是INT_TIMER1 ,INT_TIMER2… 。假设现在ARB_SEL2 的值被我们设置为01。则一个新的优先级次序将被使用,01对应的优先级次序为0-2-3-4-1-5 ,从中可以看出优先级最高和最

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

126

http://www.up-tech.com博创科技(UP-TECH)

Page 127: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

低的中断请求和之前没有变化,但本来处于第2 优先级的INT_TIMER1 中断现在变成了第5 优先级。从ARB_SEL2被设置为00,01,10,11 各个值所出现的情况我们可以看出,除最高和最低的优先级不变以外,其他各个中断的优先级其实是在做一个旋转排列(rotate )。为了达到对各个中断平等对待这一目标,我们可以让优先级次序在每个中断请求被处理完之后自动进行一次旋转,如何自动让它旋转呢?我们可以通过ARB_MODE2达到这个目的,该参数只有1 个 bit ,置1 代表开启对应中断组的优先级次序旋转,0 则为关闭。事实上当该位置为1 之后,每处里完某个组的一个中断后,该组的ARB_SEL 便递增在1 (达到11后恢复为00)。现在我们另ARB_MODE2=1 ,ARB_SEL2=00 则当前ARBITER2 的优先级顺序为0-1-2-3-4-5 ,假设现在该组的1 号中断请求INT_TIMER1 和2 号中断请求INT_TIMER2被同时触发,CPU根据优先级判断后决定先把INT_TIMER1 中断向ARBITER6 进行发送(在ARBITER6做第最终优先级判断),接着再向ARBITER6 发送INT_TIMER2 中断。请注意,在INT_TIMER1被处理完毕后,该组中段的优先级次序被自动做了一次旋转,旋转后ARBITER2 的优先级顺序变为0-2-3-4-1-5 。假设之后某个时刻该组的INT_TIMER1 和INT_TIMER2 又被同时触发 ,则此时 CPU 优先处理的会是 INT_TIMER2 。若我 们另ARB_MODE2=0 ,则改组的中断优先级次序在任何情况下都不做任何改变,除非我们人为地重新设置了ARB_SEL2 的值。INTPND 寄存器

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

127

http://www.up-tech.com博创科技(UP-TECH)

Page 128: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

INTPND 寄存器与SRCPND长得一模一样,但他们在中断异常处理中却扮演着不同的角色,如果说SRCPND 是中断信号进入中断处理模块后所经过的第一个场所的话,那么INTPND 则是中断信号在中断处理模块里经历的最后一个寄存器。它的每个位对应一个中断请求,若该位被置1 ,则表示相应的中断请求被触发,描述到这里你可能会发现它不仅和SRCPND长得一模一样,就连功能都一样,其实不然,他们在功能上有着重大的区别。SRCPND 是中断源引脚寄存器,某个位被置1 表示相应的中断被触发,但我们知道在同一时刻内系统可以触发若干个中断,只要中断被触发了,SRCPND 的相应位便被置1 ,也就是说SRCPND 在同一时刻可以有若干位同时被置1 ,然而INTPND 则不同,他在某一时刻只能有1 个位被置1 ,INTPND 某个位被置1 (该位对应的中断在所有已触发的中断里具有最高优先级且该中断没有被屏蔽),则表示CPU即将或已经在对该位相应的中断进行处理。于是我们可以有一个总结:SRCPND说明了有什么中断被触发了,INTPND 说明了CPU即将或已经在对某一个中断进行处理。每当某一个中断被处理完之后,我们必须手动地把SRCPND/SUBSRCPND , INTPND

三个寄存器中与该中断相应的位由1 设置为0 ,刚才我说INTPND 的操作很特别,它的特别之处就在于对当我们要把该寄存器中某个值为1 的位设置为0 时,我们不是往该位置0 ,而是往该位置1 。假设SRCPND=0x00000003 ,INTPND=0x00000001, 该值说明当前0 号中断和1 号中断被触发,但当前正在被处理的是0 号中断,处理完毕后我们应该这样设置INTPND 和SRCPND :SRCPND=0x00000002             // 位0 被置为0INTPND =0x00000001             // 位0 被置为0 (方法是往该位写入1 )INTOFFSET 寄存器的功能则很简单,它的作用只是用于表明哪个中断正在被处理。下面是该寄存器各位详细功能列表

若当前INT_TIMER0被触发了,则该寄存器的值为10,以此类推。现在我把整个中断流程用一个图加以说明

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

128

http://www.up-tech.com博创科技(UP-TECH)

Page 129: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

以上这个图清楚地说明了一个中断异常处理流程。下面用INT_TIMER0, INT_TIMER2 和INT_UART0 三个中断完整地介绍一次中断异常处理。首先我们得做几个假设:假设1 :这三个中断的屏蔽被取消。假设2 :PRIORITY 寄存器中ARB_MODE2,ARB_MODE5皆为0 ,既不进行优先级的自动旋转排序,任何时候           ARBITER2 ,ARBITER5 控制的中断组优先级次序分别为0-1-2-3-4-5 和1-2-3-4。假设3 :这三个中断皆为IRQ 类型。假设4 :这三个中断同时被触发。INT_TIMER0, INT_TIMER2 和INT_UART0 三个中断被同时触发,此时三个中断信号流向SRCPND寄存器,使该寄存器中的第10位,12位,28位被置为1 ,中断信号继续向前流经INTMASK 寄存器,这三个中断都没有被屏蔽,于是信号进一步流经INTMODE 寄存器,这三个中断皆为IRQ 类型,故中断信号继续向前流向PRIORITY 寄存器,经过优先级判断,INT_TIMER0 中断信号使INTPND 寄存器的第10位置1 (INT_TIMER0 优先级最高),此时INTOFFSET 寄存器的值为10,CPU转向相应的中断服务例程进行处理。处理完毕后,我们的程序将INTPND 和SRCPND 的第10置为0 ,至此INT_TIMER0 中断处理完毕。此时SRCPND 的第12位,28位仍为1 (这两个中断请求未被处理),故他们会继续被CPU已刚才描述的方式进行处理。

六、程序分析

具体程序代码s3c2410-int.c重要代码说明如下:#define DEVICE_NAME "s3c2410 int"#define s3c2410_IRQ3IRQ5 IRQ_EINT3EINT5 //IRQ_EINT3 EINT5 // 定义为中断

35 请参考硬件设计文档或者硬件原理图

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

129

http://www.up-tech.com博创科技(UP-TECH)

Page 130: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

// 下面的引脚可以 参考芯片手册#define GPIO_key_int01 (GPIO_MODE_IN | GPIO_PULLUP_DIS | GPIO_F3) //GPIO_F3 为GPF3 ,设置为1 表示为中断3

// 两位代表一个引脚,一个数据位对应一个输出引脚 // 用GPC5 来控制LED0,GPC6 来控制LED1,GPC7 来控制LED2#define led01_enable() \

({ GPCCON &=~ 0xc00; \ // 将控制字段的 第11位置为1 表示output 模式

GPCCON |= 0x400; \GPCDAT&=~ 0x20; \GPCDAT |= 0x0; \

})

#define led01_disable() \({ GPCDAT&=~ 0x20; \ //使得GPCDAT的输出位置高,使得片选无效GPCDAT |= 0x20; \

})

#define led02_enable() \ ({ GPCCON &=~ 0x3000; \ // 使得GPC6 置为1 ,表示为output 模式 GPCCON |= 0x1000; \ GPCDAT&=~ 0x40; \ // 输出低电平,使得片选选通 GPCDAT |= 0x0; \ })

#define led02_disable() \ ({ GPCDAT&=~ 0x40; \ //此位设置为高,片选无效 GPCDAT |= 0x40; \ })

#define led03_enable() \ ({ GPCCON &=~ 0xc000; \ // 使得GPC7 置为低,表示GPC7 为output 模式 GPCCON |= 0x4000; \ GPCDAT&=~ 0x80; \ GPCDAT |= 0x0; \ })

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

130

http://www.up-tech.com博创科技(UP-TECH)

Page 131: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

#define led03_disable() \ ({ GPCDAT&=~ 0x80; \ // 使得GPC7 置为高,LED3 无效 GPCDAT |= 0x80; \ })

static void s3c2410_IRQ3IRQ5_fun(int irq, void *dev_id, struct pt_regs *reg){

unsigned char byte; int i =0 ; DPRINTK("enter interrupt 3 !\n"); for (i=0;i<2;i++) { led01_enable();// 此时 LED1 有效,如果此时外部有 操 作写入 数 据 到

GPCDATA ,那么将会输出 mdelay(800);

led01_disable();//l 拉高,置为无效。 mdelay(800);

led02_enable();// 此时 LED2 有效,如果此时外部有 操 作写入 数 据 到GPCDATA ,那么将会输出

mdelay(800); led02_disable();//l 拉高,置为无效。 mdelay(800); led03_enable();// 此时 LED3 有效,如果此时外部有 操 作写入 数 据 到

GPCDATA ,那么将会输出 mdelay(800); led03_disable();

}}

static int __init s3c2410_interrupt_init(void){

int i, ret;int flags;

//set_gpio_ctrl(GPIO_MCP2510_CS);//printGPE();

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

131

http://www.up-tech.com博创科技(UP-TECH)

Page 132: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

//printSPI();//printRegisters();

set_gpio_ctrl(GPIO_key_int01);// 先设置GPIO 口。 led01_disable();// 先将LED置为无效状态。 led02_disable(); led03_disable(); for (i=0;i<2;i++) { led01_enable(); led02_enable(); led03_enable(); // printk(DEVICE_NAME"GPCCON:%x\t GPCDAT:%x\t\n", GPCCON, GPCDAT ); mdelay(500); led01_disable(); led02_disable(); led03_disable(); // printk (DEVICE_NAME"GPCCON:%x\t GPCDAT:%x\t\n",GPCCON, GPCDAT ); mdelay(500); }

local_irq_save(flags);

//init_MCP2510(BandRate_250kbps);/* Register IRQ handlers */

// 其他略去的代码请参考实验源代码。由于本次实验没有编译运行的程序,主要是在让同学掌握在S3C2410 中的中断和服务程序的相关知识以及学习驱动入门。

七、实验步骤

1 、阅读理解源码

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

132

http://www.up-tech.com博创科技(UP-TECH)

Page 133: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

进入/arm2410cl/exp/basic/11_init 目录,使用vi编辑器或其他编辑器阅读理解源代码// 需要注意的是,可能要注意修改Makefile 中KERNELDIR 目录的值。2 、编译应用程序运行make 产生int-driver 可执行文件int-driver

[root@BC basic]# cd 10_init/ [root@BC 10_init]# makearmv4l-unknown-linux-gcc -c -I.. -Wall -O -D__KERNEL__ -DMODULE

-I/home/kernel/linux-2.4.18-2410cl/include s3c2410-int.c -o s3c2410-int.os3c2410-int.c: In function `s3c2410_IRQ3IRQ5_fun':s3c2410-int.c:83: warning: unused variable `byte's3c2410-int.c: In function `s3c2410_interrupt_init':s3c2410-int.c:190: warning: implicit declaration of function `set_external_irq'[root@BC 10_init]# ls

3 、下载调试切换到minicom 终端窗口,使用NFS mount 开发主机的/arm2410cl 到/host 目录,然后进入/host/exp/basic/ 10_int 目录,用insmod int-driver.o 命令插入s3c2410-int驱动,并用 lsmod 命令查看是否已经插入。

[/mnt/yaffs]mount -t nfs -o nolock 192.168.0.18956:/arm2410cl /host[/host/exp/basic]cd 10_int/ [/host/exp/10_init]lsMakefile s3c2410-int.c s3c2410-int.o[/host/exp/10_init ]insmod s3c2410-int.o[/host/exp/10_init]lsmodModule Size Used by Tainted: P s3c2410-int 2048 0 (unused)// 发现驱动已经成功加载

八、思考题

1 . S3C2410 中断机制的工作原理2 . 自己模拟一下某个中断发生后中断服务程序是如何调用的。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

133

http://www.up-tech.com博创科技(UP-TECH)

Page 134: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

第三章 图形界面应用程序设计

3.1 安装与建立Qt 桌面运行环境

一、实验目的

1. 了解在Linux 下安装Qt 以及Qt/Embedded的基本步骤;2. 学会在Qt/E 平台下使用Virtual framebuffer显示程序结果;

二、实验内容

1. 在Linux 下编译和使用Qt/E 平台;2. 在Qt/E 平台下编译和运行一个程序使用Virtual framebuffer显示运行结果;

三、预备知识

1. 熟悉使用C++ 语言程序设计;2. 掌握Linux 下常用编辑器的使用;3. 掌握Linux 下程序编译;4. 熟悉Qt 程序设计;

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

134

http://www.up-tech.com博创科技(UP-TECH)

Page 135: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

四、实验室设备和工具

硬件:PC 机Pentumn500 以上, 硬盘10G 以上。软件:PC 机操作系统REDHAT LINUX 9.0 +MINICOM + ARM-LINUX 开发环

境 tmake-1.13.tar.gz qt-embedded-2.3.10-free.tar.gz qt-x11-2.3.2 .tar.gz

五、实验步骤

在Trolltech 公司的网站上可以下载该公司所提供的Qt/Embedded的免费版本, 在安装产品光盘以后,本次实验目录下已有要下载的文件,在/arm2410cl/gui/Qt/src下。在做实验前把本次实验用到的三个文件拷贝到/root/2410clQt 目录下。

[root@BC root]#cd /root/[root@BC root]#mkdir 2410clQt[root@BC root]#cd /arm2410cl/gui/Qt/src[root@BC src]#cp -arf tmake-1.13.tar.gz qt-embedded-2.3.10-free.tar.gz qt-x11-

2.3.2.tar.gz /root/2410clQt安装编译器arm-linux-gcc-3.4.1 :[root@BC src]#cd /arm2410cl/gui/Qt/tools[root@BC tools]#tar xjvf arm-linux-gcc-3.4.1.tar.bz2 -C ./[root@BC tools]#vi /root/.bash_profile // 打开文件将该文件 中 的 PATH 变量改为 PATH=$PATH:$HOME/bin:/arm2410cl/gui/Qt/tools

/usr/local/arm/3.4.1/bin/ ,存盘后退出。[root@BC tools]# source /root/.bash_profile如果安装正确的话,在任意路径下输入ar 后按Tab 键即可列出编译器文件。Qt/Embedded平台的搭建需要以下几步:第一步,解压安装包并设置环境变量1 .安装Tmake

cd ~/2410clQttar –xzf tmake-1.13.tar.gzexport TMAKEDIR=$PWD/tmake-1.13

2 .安装Qt 2.3.2cd ~/2410clQttar –xzf qt-x11-2.3.2.tar.gzexport QT2DIR=$PWD/qt-2.3.2

3 .安装Qt/Embeddedcd ~/2410clQt

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

135

http://www.up-tech.com博创科技(UP-TECH)

Page 136: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

tar –xzf qt-embedded-2.3.10-free.tar.gzexport QTEDIR=$PWD/qt-2.3.10环境变量的设置是非常重要的,它关系到能否正确的安装及编译这些安装包,下面介

绍一下这些环境变量: TMAKEDIR : 指向用于编译Qt/Embedded 的Tmake 工具QT2DIR : 指向qt-2.3.2 的文件夹QTEDIR : 指向qt-2.3.10 的文件夹第二步,编译Qt/Embedded。1 . Build Qt2.3.2

cd $QT2DIRexport TMAKEPATH=$TMAKEDIR/lib/linux-g++export QTDIR=$QT2DIRexport PATH=$QTDIR/bin:$PATHexport LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH./configure -no-xft // 出现选项时都输入yesmakecp –arf bin/uic $QTEDIR/bin/./configure 是对Qt进行配置,它包括很多选项,例如可以通过添加“ -no-opengl”等,

如果想要进一步了解可以通过键入 ./configure --help来获得更多的帮助信息。编译完成后需要将生成的bin/uic 复制到$QTEDIR 下新创建的目录bin 中,因为在随后编译Qt/Embedded 的时候会用到这个工具。

2. Build Qvfbexport TMAKEPATH=$TMAKEDIR/lib/linux-g++export QTDIR=$QT2DIRexport PATH=$QTDIR/bin:$PATHexport LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATHcd $QTEDIR/tools/qvfb/root/2410clQt/tmake-1.13/bin/tmake -o Makefile qvfb.promakemv qvfb $QTEDIR/bin/

这一步build qvfb 并建立了从Qt/Embedded 2.3.10 到Qt 2.3.2 的静态库的链接。其中qvfb 工具用来生成Virtual framebuffer ,这是一个非常有用的工具,它可以模拟在开发板上的显示情况,如果在Virtual framebuffer 中运行没有问题的话,可以直接通过交叉编译在开发板上运行。

3. Build Qt/Embeddedcd $QTEDIRexport TMAKEPATH=$TMAKEDIR/lib/qws/linux-x86-g++export QTDIR=$QTEDIR

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

136

http://www.up-tech.com博创科技(UP-TECH)

Page 137: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

export PATH=$QTDIR/bin:$PATHexport LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH./configure -no-xft -qvfb -depths 4,8,16,32 yes5make在配置./configure 中-qvfb 用来支持Virtual framebuffer ,-depths 4,8,16,32支持4 位,

8 位,16位,32位的显示深度,此外还可以添加如-syestem-jpeg 和-gif 来提供对jpeg 和gif 的支持。配置系统同时还支持对特定平台系统选项的添加,但一般来讲,凡是支持framebuffer 的Linux 系统都可以使用“linux-generic-g++”平台。详细的配置信息可以通过运行./configure --help命令来查看。

第四步,查看运行结果,如果上面各步都能够成功的编译通过,下面就可以通过运行Qt/Embedded 自带的demo 来查看运行结果。

●在Virtual framebuffer 上运行:export QTDIR=$QTEDIRexport PATH=$QTEDIR/bin:$PATHexport LD_LIBRARY_PATH=$QTEDIR/lib:$QT2DIR/lib:$LD_LIBRARY_PATHcd $QTEDIR/examples/launcherqvfb -width 640 -height 480 &sleep 10./launcher -qws

运行结果如下:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

137

http://www.up-tech.com博创科技(UP-TECH)

Page 138: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图3.1-1 Qt/Embedded Demo程序将上面的步骤完成后,我们就已经建立好了在本机上开发Qt应用程序的环境,下面

我们通过编写一个“Hello Embedded” 的程序来了解Qt程序设计。[root@BC qt-2.3.10]# cd /root/2410clQt/[root@BC 2410clQt]# mkdir exp[root@BC 2410clQt]# cd exp[root@BC exp]# vi hello.cpp

使用VI 编写文件hello.cpp ,程序代码如下://hello.cpp

#include <qapplication.h> #include <qlabel.h> int main(int argc, char **argv) { QApplication app (argc, argv); QLabel *hello = new QLabel("Hello Qt/Embedded!", 0); app.setMainWidget(hello); hello->show(); return app.exec(); }

现在开始逐行讲解一下每一句是什么意思,掌握了这些以后可以帮助我们更加了解Qt的程序设计。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

138

http://www.up-tech.com博创科技(UP-TECH)

Page 139: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

第1 行和第2 行包含了两个头文件,这两个头文件中包含了 QApplication 和 QLabel类的定义。

第5 行创建了一个QApplication 对象,用于管理整个程序的资源,它需要2 个参数,因为Qt本身需要一些命令行的参数。

第6 行创建了一个用来显示Hello Qt/Embedded! 的部件。在Qt中,部件是一个可视化用户接口,按钮、菜单、滚动条都是部件的实例。部件可以包含其它部件,例如,一个应用程序窗口通常是一个包含QMenuBar 、QToolBar、QStatusBar 和其它部件的一个部件。在QLabel函数中的参数0 表示,这是一个窗口而不是嵌入到其它窗口中的部件。

第7 行设置hello部件为程序的主部件,当用户关闭主部件后,应用程序将会被关闭。如果没有主部件的话,即使用户关闭了窗口程序也会在后台继续运行。第8 行使hello部件可视,一般来说部件被创建后都是被隐藏的,因此可以在显示前根

据需要来订制部件,这样的好处是可以避免部件创建所造成的闪烁。第9 行把程序的控制权交还给Qt,这时候程序进入就绪模式,可是随时被用户行为

激活,例如点击鼠标、敲击键盘等。下面我们要让我们的程序跑起来,首先要让它能够在Virtual framebuffer 中显示出来,

然后再通过交叉编译在开发板上运行。 要在本机的Virtual framebuffer 中显示结果,下面几步是必须的:

1 .生成工程文件(.pro )每一个Qt程序都对应着一个工程文件,因为 tmake 工具要借此工程生成相应的

Makefile 文件。生成工程文件需要使用progen 工具,它的位置在$TMAKEDIR/bin 下,使用progen 生成工程文件的方法如下:

$TMAKEDIR/bin/progen –t app.t –o hello.pro生成的这个hello.pro 工程文件是可以被修改的,可以编辑里面的头文件、源文件等内

容。2 .生成Makefile 文件

Qt提供了生成Makefile 文件的工具tmake ,这极大地方便了应用程序的开发,节省了大量的时间,而且还可根据不同平台的需要生成适合于不同平台的Makefile 文件。

在使用tmake 工具前,必须查看相应的环境变量是否正确,由于我们要编译在本机上运行的Qt程序,所以指定的编译器应该为“linux-x86-g++” ,在命令行中输入下面的命令来检查环境变量是否正确:

echo $TMAKEPATH 查看返回的结果的结尾字符是否是“……/qws/linux-x86-g++” ,如果不是的话需要在命令行中重新设置TMAKEPATH

export TMAKEPATH=/tmake 的安装路径(如$TMAKEDIR)/lib/qws/linux-x86-g++ 此外还要使QTDIR 指向Qt/Embedded 的安装路径,如:export QTDIR=$QTEDIR 或者直接指定路径export QTDIR=……/qt-2.3.10完成了上面的环境变量的设置,并用echo命令检查无误以后,就可以使用tmake 工

具来生成我们需要的Makefile 文件,在命令行中输入如下命令:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

139

http://www.up-tech.com博创科技(UP-TECH)

Page 140: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

$TMAKEDIR/bin/tmake –o Makefile hello.pro完成上面的步骤以后就可以在当前的目录中生成一个Makefile 文件,关于Makefile

文件的功能和结构这里就不再做过多的介绍了,可以参考前面的章节来了解Makefile 。最后在命令行中输入 “make” 命令就可以对整个程序进行编译链接了,最终生成

了一个二进制的可执行文件hello。用Virtual framebuffer显示效果如下:

图3.1-2 Hello Embedded我们可以通过对QLabel *hello = new QLabel("Hello Qt/Embedded!", 0) 这句进行修改,

使我们的程序显示起来更为美观,修改如下:QLabel *hello=new QLabel("<h2><fontcolor=blue>Hello"

"<i>Qt/Embedded!</i> </font> </h2>", 0);修改后显示效果如图所示:

图3.1-3 修改后Hello Embedded

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

140

http://www.up-tech.com博创科技(UP-TECH)

Page 141: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

3.2 Qt Designer 简介及Qt/E 的交叉编译

一、实验目的

1. 了解Qt Designer的使用方法以及Qt/Embedded交叉编译的基本步骤;2. 学会在使用Qt Designer编写程序,交叉编译,在开发板上运行;

二、实验内容

1. 在Linux 下使用Qt Designer;2. 在Qt Designer下编写程序,完成交叉编译并在开发板上运行;

三、预备知识

1. 熟悉使用C++ 语言程序设计;2. 掌握Linux 下常用编辑器的使用;3. 掌握Linux 下程序编译;4. 熟悉Qt 程序设计;

四、实验室设备和工具

硬件:PC 机Pentumn500 以上, 硬盘10G 以上。软件:PC 机操作系统REDHAT LINUX 9.0 +MINICOM + ARM-LINUX 开发环

五、实验步骤

Qt提供了非常强大的GUI编辑工具— Qt Designer ,它的操作界面类似于Windows下的Visual Studio ,而且它还提供了相当多的部件资源。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

141

http://www.up-tech.com博创科技(UP-TECH)

Page 142: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图3.2-1 Qt Designer 丰富的部件资源下面我们来介绍一下Qt Designer 的开发环境以及使用Qt Designer 的开发过程,下面

所示的图3-5 为我们使用的Qt/X11 2.3.2 中自带的v 1.1版的Qt Designer 。

图3.2-2 Qt Designer v 1.1无论我们是采用Qt Designer 还是纯手工编写代码都需要经过下面的几个步骤:●创建和初始化子部件●设置子部件的布局●设置Tab 键的次序●建立信号与插槽的连接下面我们透过一个简单的例子,来熟悉一下Qt Designer 。我们编写的窗体主要包括

下 面几个部件 : 一 个 CheckBox , 一 个 PushButton , 一 个 Silder , 一 个 dial , 一 个LCDNumber ,一个ProgressBar ;要实现的功能是点击PushButton 会选中CheckBox ;拖动Silder 同时,Dial 、LCDNumber 和ProgressBar会随其发生变化。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

142

http://www.up-tech.com博创科技(UP-TECH)

Page 143: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图3.2-3 布置部件在布置部件时,我们可以不必要非常准确的放好每个部件的位置,因为Qt Designer

自带的lay out功能回自动帮我们实现。将全部部件都选中,使用Layout|in a Gird 网格布局。

图3.2-4 使用Layout布局管理后将部件布置好后,就可以根据我们的需要来建立连接,Qt开创性的使用了信号与插槽

机制,与传统的回调函数方式不同,它是一种灵活、类型安全、快速、完全面向对象的C++ 机制。

使用传统的回调函数机制来关联某段代码和和一个按键,需要有一个指向函数的指针,并且将这个指针地址传给按钮。当这个按钮被按下,这个函数就会被执行。以前的工具包不能保证函数被执行时所传递的类型是正确的,这使得进程很容易崩溃。另一个问题是,这种回调方法紧紧得绑定了GUI得基本功能元素,使得很难进行独立的分类开发。Qt的信号与插槽机制则不同,Qt部件(Widgets )事件发生时发出信号,如一个按钮被点击时会发 出 一 个“ clicked” 信号。程序员可 以选择建立一 个函数(称为插槽)并调用connect ()函数来将这个信号与插槽连接起来。用户在编程时可以将两个对象捆绑在一起而不需要知道每个对象的各自的信息,而且可以自己创建信号与插槽,发射自己的信号等等。

有关信号与插槽的具体内容请参考其它书籍,这里就不再过多介绍了。建立连接要用到connect Singal/Solts (F3 )按钮 ,点击后只要用鼠标连接两个

部件就可以建立它们之间的连接。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

143

http://www.up-tech.com博创科技(UP-TECH)

Page 144: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图3.2-5 建立两个部件的连接连接建立以后会自动出现编辑连接(Edit Connection )的对话框:

图3.2-6 编辑连接对话框依次建立各个部件之间的连接后,可以通过点击Edit|Connections 来查看各个部件的连

接情况,还可以通过点击Edit 菜单来对连接进行修改。

图3.2-7 连接关系图Qt取消了传统的“编译、连接和运行”的方式,直接提供了Preview 功能,而且支

持不同平台的不同风格,比如常见的Windows风格、Motif 风格等。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

144

http://www.up-tech.com博创科技(UP-TECH)

Page 145: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图3.2-8 Qt 的预览风格选择

图3.2-9 Qt Designer 的不同风格将以上步骤做完后,我们就可以把我们设计的窗体保存起来,Qt会将我们的窗体信

息保存成一个.ui 文件,使用Qt提供的uic 工具可以方便的通过这个文件来生成.h文件和.cpp 文件,假设我们将上面的窗体保存为win.ui ,则具体操作如下:

uic –o win.h win.uiuic –o win.cpp -impl win.h win.ui完成了这两个命令后,我们会发现在我们的当前目录中会有win.h 与win.cpp 两个

文件,只有这两个文件程序还是不能运行的,我们还需要再创建一个main.cpp 文件,我们

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

145

http://www.up-tech.com博创科技(UP-TECH)

Page 146: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

使用vi编辑器手工编写这个文件。vi main.cpp

具体代码如下:#include "win.h"#include <qapplication.h>

int main(int argc,char **argv){

QApplication a(argc,argv); Form1 form ; form.setCaption("Form"); a.setMainWidget(&win); form.show(); return a.exec();

}要将我们写好的程序发布到开发板上,我们需要对Qt/Embedded 重新编译,与前面

在宿主机上编译类似,步骤如下:1 . Build Qt/Embedded

cd $QTEDIRexport TMAKEPATH=$TMAKEDIR/lib/qws/linux-arm-g++export QTDIR=$QTEDIRexport PATH=$QTDIR/bin:$PATHexport LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH./configure -xplatform linux-arm-g++ -no-xft -no-qvfb -depths 4,8,16,32 make

这步完成后,我们会在$QTEDIR/lib/ 目录下面看到libqte.so libqte.so.2 libqte.so.2.3 libqte.so.2.3.10 这四个文件,我们可以使用file 命令来查看这个库文件是否是我们需要的在开发板上跑的库。

file libqte.so.2.3.10libqte.so.2.3.10: ELF 32-bit LSB shared object, ARM, version 1 (ARM), not stripped

有了这个库以后我们就可以把它拷贝到我们的开发板中相应的库目录下面,这里我们选择了开发板上的/usr/lib 目录,将$QTEDIR/lib/ 下的libqte.so*复制到/usr/lib 目录下。首先要建立宿主机和开发板的通讯,假设本机的ip 地址为192.168.0.56 并且/root/share 为共享文件夹。

mount –t nfs –o nolock 192.168.0.56:/root/share /host // 在开发板端 将文件复制到开发板上

cp –arf /$QTEDIR/lib libqte.so* /root/share // 在PC 端cp –arf /mnt/nfs/libqte.so* /usr/lib // 在开发板端

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

146

http://www.up-tech.com博创科技(UP-TECH)

Page 147: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

复制时可能提示没有空间,在yaffs下删除一些无关程序以获取空间。2 . 修改tmake 配置文件

vi $ TMAKEDIR/lib/qws/linux-arm-g++/tmake.conf将其中“TMAKE_LINK= arm-linux-gcc”

“TMAKE_LINK_SHLIB= arm-linux-gcc”修改为:“TMAKE_LINK= arm-linux-g++”

“TMAKE_LINK_SHLIB= arm-linux-g++”3 . 生成可执行文件

这里我 们采用 了 Qt/Embedded 自 带 的 一 个 demo , 它 在 $QTEDIR/examples/progressbar 目 录 下 , 这 个 目 录 包 括 下 面 几 个 文 件 :main.cpp 、 Makefile.in 、 progressbar.h 、 Makefile 、progressbar.cpp 、progressbar.pro ,如果已经有了progressbar 的执行文件,可以使用make clean 删除。

在这里已经有了工程文件progressbar.pro ,这个是Qt已经配置好的,一般情况下我们自己编写程序事需要progen 工具来生成这个文件的,以这个程序为例

$TMAKEDIR/bin/progen –t app.t –o progressbar.pro在使用tmake 工具生成makefile 文件之前,我们要确保tamke 工具的路径是正确的,

可以采用echo名来来查看echo $TMAKEPATH查看返回的结果的结尾字符是否是“……/qws/linux-arm-g++” ,如果不是的话需要在

命令行中重新设置TMAKEPATHexport TMAKEPATH=/tmake 的安装路径(如$TMAKEDIR)/lib/qws/linux-arm-g++ 此外还要使QTDIR 指向Qt/Embedded 的安装路径,如:export QTDIR=$QTEDIR 或者直接指定路径export QTDIR=……/qt-2.3.10完成了上面的环境变量的设置,并用echo命令检查无误以后,就可以使用tmake 工

具来生成我们需要的makefile 文件,在命令行中输入如下命令:$TMAKEDIR/bin/tmake –o makefile progressbar.promake如果没出现错误的话就可以在当前目录下找到progressbar 这个可执行文件,将该程序

复制到/root/share 下,然后在开发板端进行如下操作:[/mnt/yaffs]#mount –t nfs 192.168.0.56:/root/share /host[/mnt/yaffs]#cd /host[/host]#export QTDIR=/usr[/host]#cd /usr/lib[/mnt/yaffs/lib]#mkdir fonts将pc 端$QTEDIR/lib/fonts 下的所有文件复制到开发板/mnt/yaffs/lib/fonts 下。cd /host./progressbar -qws

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

147

http://www.up-tech.com博创科技(UP-TECH)

Page 148: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图3.2-10 在Qtopia 下运行的progressbar 程序

3.3 建立本机Qtopia虚拟平台

一、实验目的

1. 了解在Linux 下安装Qtopia 的基本步骤;2. 学会在Qtopia 平台发布应用程序;

二、实验内容

1. 在Linux 下编译和使用Qtopia 平台;2. 在Qtopia 平台上发布一个简单程序;

三、预备知识

1. 熟悉使用C++ 语言程序设计;2. 掌握Linux 下常用编辑器的使用;3. 掌握Linux 下程序编译;4. 熟悉Qt 程序设计;

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

148

http://www.up-tech.com博创科技(UP-TECH)

Page 149: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

四、实验室设备和工具

1. 硬件:PC 端主机,UP-CUP S2410 经典平台目标板; 2. 软件:Redhat Linux9.0 for PC + minicom  + Embeded Linux

for 2410 tmake-1.13.tar.gz qtopia-free-source-2.1.1.tar.gzqt-embedded-2.3.10.tar.gz qt-x11-2.3.2 .tar.gz

五、实验步骤

Qtopia 是TrollTech 公司为采用嵌入式Linux 系统的消费电子设备而开发的综合应用平台,它是基于Qt/Embedded的。使用Qt/Embedded 不仅可以开发Qtopia 也可以用来开发面向Qtopia 的第三方软件。它包括三个版本:Qtopia 手机版Qtopia PDA版和Qtopia消费电子产品平台。 将本次实验所需的四个文件拷贝到/root/2410clQt 目录下,我们以下的实验都是在这个目录下进行的。宿主机上建立虚拟的Qtopia环境需要以下几个步骤:1 . 解压缩安装文件:前面已经解压出来的文件不可在这里直接使用,须重新解压

① 解压缩qtopia :tar xzf qtopia-free-source-2.1.1.tar.gz

export QPEDIR=$PWD/qtopia-free-2.1.1② 解压缩tmake :tar xzf tmake-1.13.tar.gzexport TMAKEDIR=$PWD/tmake-1.13③ 解压缩Qt/X11 :tar xzf qt-x11-2.3.2.tar.gzexport QT2DIR=$PWD/qt-2.3.2④ 解压缩Qt/Embedded :tar xzf qt-embedded-2.3.10-free.tar.gzexport QTEDIR=$PWD/qt-2.3.10

2 . Build Qt/X11 :cd $QT2DIRexport TMAKEPATH=$TMAKEDIR/lib/linux-g++export QTDIR=$QT2DIR

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

149

http://www.up-tech.com博创科技(UP-TECH)

Page 150: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

export PATH=$QTDIR/bin:$PATHexport LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH./configure -no-xft // 出现选项选yesmakecp bin/uic $QTEDIR/bin/

3 . Build Qvfb :export TMAKEPATH=$TMAKEDIR/lib/linux-g++export QTDIR=$QT2DIRexport PATH=$QTDIR/bin:$PATH:$TMAKEDIR/binexport LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATHcd $QTEDIR/tools/qvfbtmake -o Makefile qvfb.promakemv qvfb $QTEDIR/bin/

4 .Build libqte :cd $QTEDIRexport TMAKEPATH=$TMAKEDIR/lib/qws/linux-x86-g++export QTDIR=$QTEDIRexport PATH=$QTDIR/bin:$PATHexport LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATHcp -f $QPEDIR/src/qt/qconfig-qpe.h src/tools/./configure -system-jpeg -no-xft -qconfig qpe -qvfb -depths 4,8,16,32 make sub-src

5 .Build Qtopia :cd $QPEDIRexport QTDIR=$QTEDIRexport PATH=$QPEDIR/bin:$PATH./configure make和前面编译Qt/Embedded的基本步骤一样,还可以参考“./configure --help” ,

来进行选择。若 编译时出错提示缺少uuid 库,可将src/e2fsprogs-libs-1.37.tar.gz解压,在其中找到缺少的库文件并拷贝到/usr/lib 中。

为了保证qvfb 能够正确显示qtopia 的结果,我们必须保证环境变量设置正确,我们可以通过“env” 命令来检查下面的环境变量,也可以用下面的方法来检查。

echo $QPEDIR/root/2410clQt/qtopia-free-2.1.1/echo $QTDIR/root/2410clQt/qt-2.3.10

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

150

http://www.up-tech.com博创科技(UP-TECH)

Page 151: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

echo $LD_LIBRARY_PATH/root/2410clQt/qtopia-free-2.1.1/lib:/root/2410clQt/qt-2.3.10/lib:/root/

2410clQt/qt-2.3.2/lib:echo $PATH/root/2410clQt/qt-2.3.10/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/

local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin出现上面的结果就可以正常的显示Virtual framebuffer ,我们可以通过下面的命令在

Virtual framebuffer 中实现Qtopia 。cd $QPEDIR/binqvfb &sleep 10./qpe.sh

图3.3-2 Virtual framebuffer 下的QtopiaQtopia 还为我们在Qtopia平台上发布自己的应用程序提供了一个比较简便的方法,要

想把我们的应用程序发布到Qtopia平台上,我们需要三个文件:一个执行文件、一个启动器文件、一个图标文件。执行文件也就是我们前面讲到的编译链接后生成的可执行文件,我们可以根据我们的需要编译链接生成到底是宿主机上运行的程序还是开发板上运行的程序。图标文件就是一个.png文件,我们制作自己的22×22 大小的图标文件。启动器文件是 一 个 .desktop 文件 , 我 们 可 以 用 vim 手 工编写自 己 的启动器文件 , 以 上 一节progressbar为例,我们创建一个名为progressbar.desktop 的启动器文件,具体内容

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

151

http://www.up-tech.com博创科技(UP-TECH)

Page 152: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

如下:[Desktop Entry]comment=A progressbar ProgramExec=progressbarIcon=progressbarType=ApplicationName=UP-TECH以上内容都做好后,我们需要把我们的三个文件分别复制到相应的目录中.将图标文件progressbar.png 复制到/root/qtopia/qtopia-free-2.1.1/pics将执行文件progressbar 复制到/root/qtopia/qtopia-free-2.1.1/bin将progressbar.desktop复制到/root/qtopia/qtopia-free-2.1.1/apps/Applications将上诉文件分别复制好以后就可以再次启动Qtopia ,我们就可以看到我们自己发布的

程序了。

图3.3-3 发布程序到Qtopia

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

152

http://www.up-tech.com博创科技(UP-TECH)

Page 153: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

3.4 Qtopia2.1.1 在S2410 平台上的移植

一、实验目的

将qtopia 移植到2410-CL 板所使用的linux-2.4.3 上;了解如何在pc 机(x86) 上如何为xscale(arm)编译、移植应用程序。

二、实验内容

了解Qtopia 在2410-CL 上的移植过程。交叉编译Qtopia 所需要的资源文件和环境,交叉编译Qtopia 源代码。下载生成的Qtopia 系统到开发板。

三、预备知识

1 . 有C 语言基础。2 . 会使用LINUX 下常用的编辑器。3 . 掌握Makefile 的编写和使用。4 . 了解Linux 下的编译程序与交叉编译的过程。

四、实验设备及工具

硬件:UP-CUP S2410 经典平台嵌入式开发板、PC 机Pentumn500 以上, 硬盘10G 以上

软件:PC 机操作系统REDHAT LINUX 9.0 +MINICOM + ARM-LINUX 开发环境

五、实验原理

Qtopia概述Qtopia 是Trolltech 面向嵌入式Linux 的综合应用平台。Qtopia 包含完整的应用层、

灵活的用户界面、窗口操作系统、应用程序启动程序以及开发框架。Qtopia 的组件:表3.4 -1

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

153

http://www.up-tech.com博创科技(UP-TECH)

Page 154: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

窗 口 操 作系统 游戏和多媒体 工作辅助应用程序同步框架 PIM 应用程序 Internet 应用程序开发环境 输入法 Java 集成本 地 化 支

持 个性化选项 无线支持目前在sitsnag平台上使用的qtopia 版本为1.5.0 free ,是面向PDA的一个版本,当

然它也有面向手机的版本。Qtopia PDA版是一个强大的平台,专用于基于Linux

操作系统的PDA(个人数字助理设备)。许多PDA都已采用了Qtopia, Qtopia PDA 版已经成了事实上的Linux 标准,它代表了可行的“第三种”PDA设计方案。Qtopia PDA版具有可定制的用户界面,支持更大的屏幕尺寸以及横向和纵向布局。

图3.4

-1 Qtopia 层次结构

六、实验步骤

1. 实验可以分为以下几个步骤进行:(1) 在装有linux 的pc机上安装交叉编译环境。安装光盘时所安装的编译器版本较低,不能正常编译QT 程序,所以编译前需要安装Qt/tools/arm-linux-gcc-3.4.1.tar.bz2 ,并在/root/.bash_profile 中修改编译器搜索路径。

(2) 编译库文件:(3) 编译qt-x11-2.3.2:(4) 编译安装qt-embedded-2.3.2(5) 编译安装QTOPIA(6) 将需要拷贝到开发板上的文件整理到一个单独的文件夹里面在本次实验中,buildqtopia.sh 文件已为大家做好了以上几步,我们可以直接运行该文件进行编译。大家可以分析buildqtopia.sh 内容,掌握编译的步骤。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

154

http://www.up-tech.com博创科技(UP-TECH)

Page 155: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

2. 编译步骤:cd src./buildqtopia.sh当编译完成后,在src/qtopia-free-2.1.1/image/opt/Qtopia 下是编译完成的Qtopia桌面环境。说明: 在编译完成后,src 下的各个目录对应如下软件包: e2fsprogs-libs-1.37 ext2文件系统工具包,Qtopia 用到了其中的libuuid e2fs-install ext2 工具包编译结果 jpeg-6b jpeg解码库 jpeg-install jpeg编译结果 tslib 触摸屏工具包 tslib-install 触摸屏工具包编译结果 tmake-1.13 tmake 工具,编译Qtopia 时需要使用 qt-2.3.2 Qt/X11-2.3.2 及编译结果, 编译Qtopia 时需要使用其中的工具 qt-x11-free-3.3.4 Qt/X11-3.3.4 及编译结果,编译Qtopia 时需要使用其中的工具 qt-2.3.10 Qt/Embedded 2.3.10 及编译结果 qtopia-free-2.1.1 Qtopia 2.1.1及编译结果

3. 安装步骤:3.1 Qtopiacd qtopia-free-2.1.1/image/opt/tar cvjf /root/share/qtopia-install.tar.bz2 Qtopia将/root/share /qtopia-install.tar.bz2 下载到目标机,并解压缩到/mnt/yaffs 下。3.2 相关文件将src/qtopia.sh 下载到目标机的/mnt/yaffs/Qtopia 目录下.将src/e2fs-install/lib/libuuid.so*下载到目标机的/mnt/yaffs/lib 目录下将src/jpeg-install/lib/libjpeg.so*下载到目标机的/ mnt/yaffs/lib 目录下将tools/usr/local/arm/3.4.1/arm-linux/lib/libgcc_s.so* 下载到目标机的/ mnt/yaffs/lib 目录下将tools/usr/local/arm/3.4.1/arm-linux/lib/libstdc++.so* 下载到目标机的/ mnt/yaffs/lib 目录下3.3 目标机上的处理在目标机上执行:cd /usrln -s /mnt/yaffs/Qtopia qpecd /mnt/yaffs/Qtopia

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

155

http://www.up-tech.com博创科技(UP-TECH)

Page 156: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

mkdir tmp

4 运行:

插上USB鼠标,在目标机上执行qtopia.sh 即可运行qtopia 桌面环境。注意:1 .如果运行./qtopia.sh 后提示找不到库文件,请从编译器目录下查找,并拷贝到

开发板/mnt/yaffs/lib 中。 2.如果提示:can’t open framebuffer device /dev/fb0 可以执行:ln –sf /dev/fb/0 /dev/fb0 3.如果提示:Qt/Embedded data directory is not owned by user 0:/tmp/qtembedded-0 运行:chown root:root /tmp/qtembedded-0 4.如果提示:Qtopia data directory is not owned by user 0:/tmp/qtopia-0 运行:chown root:root /tmp/qtopia-0

七、思考题

1 .请思考Qtopia 的framebuffer 的机制。

第四章 内核与根文件系统实验

4.1 Linux 内核移植与编译实验

一、Linux 内核背景知识

自1991 年11 月由芬兰的Linus Ttorvalds 推出Linux 0.1.0 版内核至今,Linux 内核已经升级到Linux2.6.7 (写本文档时,www.kernel.org 发布的最新版Linux 内核)。其发展速度是如此的迅猛,是目前市场上唯一可以挑战Windows 的操作系统。在其发展过程中得到分布于全世界的广大OpenSource 项目追随者的大力支持。尤其是一些曾经参与Unix 开发的人员,他们把应用于Unix 上的许多应用程序移植到Linux 上来,使得

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

156

http://www.up-tech.com博创科技(UP-TECH)

Page 157: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

Linux 的功能得到巨大的扩展。目前比较稳定的版本是Linux2.4.8 。在Linux 的版本号中,第一个数为主版本号。第二个为次版本号。第三个为修订号。次版本号为偶数表明是稳定发行版本,奇数则是在开发中的版本。随着其功能不断加强,灵活多样的实现加上其可定制的特性以及开放源码的优势, Linux 在各个领域的应用正变得越来越广泛。目前Linux 的应用正有舍去中间奔两头的趋势,即在PC 机上Linux 要真正取代Windows ,或许还有很长的路要走,但在服务器市场上它已经牢牢站稳脚跟。而随着嵌入式领域的兴起更是为Linux 的长足发展提供了无限广阔的空间。目前专门针对嵌入式设备的Linux 改版就有好几种。包括针对无MMU 的uClinx 和针对有MMU 的标准LINUX 在各个硬件体系结构的移植版本。uClinux 是一种Linux 的变型版本,其主要针对ARM7TDMI ,DragonBall 系列的68EZ328 ,68VZ328 ,ColdFire 系列的5272 ,5307 等大量不带MMU (内存管理单元)功能模块的芯片。这种芯片面向低端市场,价格便宜功能灵活。但是传统的Linux 内核采用虚拟内存管理技术,这种设计运行在没有MMU 的芯片上时,这部分关于内存管理的代码就变成冗余代码甚至对系统整体性能产生负面影响。uClinux 正是为了解决这一问题而开发的。其名称中“u” (发音miu)就是micro ,小的意思。而“C” 则是Control ,控制的意思。即uClinux 是为微控制领域量身定做的Linux 版本。uClinux的设计就是通过对标准Linux 内核裁减,去除虚拟内存管理部分的代码,并对内存分配进行优化,从而达到提高系统运行效率的目的。它虽然体积小但依然保存了Linux 内核的大多数优点。其主要特点有:

1 )支持通用Linux API2 )内核体积可以小于512K3 )具有完整的TCP/IP协议栈4 )支持其它大量的网络协议5 )支持各种文件系统(NFS ,ext2 ,romfs ,jffs ,FAT16/32以及MS-DOS)

但是uClinux 的应用程序开发要求用户自己正确的处理内存管理,一旦不慎错误地修改了其他进程的内存,将可能造成系统死机。基于像ARM2410 这样的ARM9内核的ARM -LINUX 使用了MMU 的内存管理,对进程有保护,提高了嵌入式系统中多进程的保护能力。使用户应用程序的可靠性得以提高,降低了用户的开发难度。linux 内核的基本结构如图4.1.1 所示:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

157

http://www.up-tech.com博创科技(UP-TECH)

Page 158: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图4.1.1 linux 内核结构分布

二、Linux 移植准备

所谓Linux 移植就是把Linux 操作系统针对具体的目标平台做必要改写之后,安装到该目标平台使其正确的运行起来。这个概念目前在嵌入式开发领域讲的比较多。其基本内容是:获取某一版本的Linux 内核源码,根据我们的具体目标平台对这源码进行必要的改写(主要是修改体系结构相关部分),然后添加一些外设的驱动,打造一款适合于我们目标平台(可以是嵌入式便携设备也可以是其它体系结构的PC 机)的新操作系统,对该系统进行针对我们目标平台的交叉编译,生成一个内核映象文件,最后通过一些手段把该映象文件烧写(安装)到我们目标平台中。而通常对Linux 源码的改写工作难度较大,它要求你不仅对Linux 内核结构要非常熟悉,还要求你对目标平台的硬件结构要非常熟悉。同时还要求你对相关版本的汇编语言较熟悉因为与体系结构相关的部分源码往往是用汇编写的。所以这部分工作一般由目标平台提供商来完成。比如说针对目前嵌入式系统中最流行的ARM 平台,它的这部分工作就是由英国ARM 公司的工程师完成的,我们所要做的就是从其网站上下载相关版本Linux 内核的补丁(Patch)。把它打到我们的Linux 内核上,再进行交叉编译就行。其基本过程是这样的(以Linux2.6.0 为例):到ftp://ftp.arm.linux.org.uk 上下载Linux2.6.0 内核及其关于ARM 平台的补丁(如:Patch-2.6.0-rmk1.gz )。给Linux2.6.0 打补丁:zcat ../patch-2.6.0-rmk1.gz | patch –p1 (前面../表示补丁文件放在内核文件上一层目录)

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

系统调用接口进程管理内存管理

块设 备管理

字符设 备管理

调 度程序

TCP/IP协议

网络事务处理

体系结构相关代码硬件平台

158

http://www.up-tech.com博创科技(UP-TECH)

Page 159: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

准备交叉编译环境。交叉编译环境工具链一般包括binutils (含AS 汇编器,LD 链接器等),arm-gcc ,glibc 等。交叉编译环境的搭建也是个复杂的过程,后面我将做进一步介绍。修改内核目录下的makefile 文件,主要是以下几行:

注释掉ARCH:=$(shell uname –m | sed –e s/i.86/i386/-e s/sun4u/sparc64/ -e s/arm. \ */arm/ - e s/sa110/arm/) 这一行。ARCH := 改为 ARCH := armCROSS_COMPILE := 改为 CROSS_COMPILE = 交叉编译工具中arm-linux 所在目录/arm-linux-例如:CROSS_COMPILE = /usr/local/arm/2.95.3/bin/arm-linux- 此后就可以进行编译。

三、关于交叉编译环境

交叉编译环境的建立最重要的就是要有一个交叉编译器。所谓的交叉编译就是:利用运行在某机器上的编译器编译某个源程序生成在另一台机器上运行的目标代码的过程。编译器的生成依赖于相应的函数库,而这些函数库又得依靠编译器来编译,所以这里有个“蛋和鸡”的关系,所以最初第一的版本的编译器肯定得用机器码去生成,现在的编译器就不必了。这里我主要用到的编译器是arm-linux-gcc ,它是gcc 的arm改版。gcc 是个功能强大的c 语言编译工具,其年龄比Linux 还长。无论编译器的功能有多么强大,但它的实质都是一样的,都是把某种以数字和符号为内容的高级编程语言转换成机器语言指令的集合。编译工具的基本结构如图4.1.2 所示:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

159

http://www.up-tech.com博创科技(UP-TECH)

Page 160: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图4.1.2 编译工具的基本结构编译器通常用机器语言或汇编语言编写而成,当然也可以用其它一些高级语言编写。编译过程中,编译器把源程序的各类信息和编译各阶段的中间信息保存在不同的符号表中,表格管理程序负责构造,查找和更新这些表格。错误处理程序主要功能是处理各个阶段中出现的错误。编译过程中,仅有一个编译器是不行的,还必需和其它的一些辅助工具联合,才能工作。这些辅助编译工具主要有:解释程序(Interpreter ):它本身与编译器类似也是一种语言翻译工具,它直接执行源程序,尤其是一些脚本语言程序,其优点是简单,好移植,但执行速度与编译好的目标代码相比就要慢许多。汇编器(Assembler ):它是用于特定计算机上的汇编语言翻译程序。连接器(Linker ):其作用是把在不同的目标文件中编译或汇编的代码收集到一个可直接执行的文件中。同时它也把目标程序和标准库函数的代码相连。装载器(Loader ):编译器,汇编器及连接器所生成的代码经常还不能直接执行。它们的主要存储器访问可以在存储器的任何位置,只是在逻辑上相互之间存在一个固定的关系,最终位置的确定和某个起始位置相关。通常这样的代码是可复位位的。装载器可处理所有与指定的基地址或起始地址相关的可复位位的地址。这样使得代码的编译更加灵活。预处理器:它是在编译开始时由编译器调用,专门负责删除注释,包含其它文件以及执行

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

源程序

词法分析

语法分析

语义分析

生成中间代码

优化代码

错误处理

生成目标代码

符号表及其管理

目标程序

160

http://www.up-tech.com博创科技(UP-TECH)

Page 161: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

宏替换的。调试器:调试器用于对目标代码的调试,从而达到排除代码中存在的错误。目前交叉编译技术有两种典型的实现模式,它们分别是:Java 模式即Java 的字节码编译技术和GNU GCC模式即通常所说的Cross GCC 技术。Java 模式最大的特点就是引入了一个自定义的虚拟机(JVM),所有Java 源程序都会被编译成在这个虚拟机上才能执行的“目标代码”——字节码(Bytecode )。在实时运行时,可以有两种运行方式,一种是编译所获得的字节码由JVM 在实际计算机系统上执行;另外一种方式是通过Java 实时编译器(Just-In-TimeCompiler )将字节码首先转换成本地机可以直接执行的目标代码,而后交给实际的计算机系统运行,这实际上是两次编译过程,一次是非实时的,一次是实时的。第一次非实时编译时,Java 编译器生成的是基于JVM 的“目标代码”,所以它其实也就是一次交叉编译过程。GCC 模式与Java 模式不同,它通过Cross GCC 直接生成目标平台的目标代码,从而能够直接在目标平台上运行。其关键在于对Cross GCC 选择,我们需要选择针对具体目标平台的Cross Gcc。相对来说,GCC 模式代码比Java 模式更为优化,效率更高。目前Linux 操作系统也主要是以GCC 模式进行移植的。我们将对它做进一步介绍。GCC 在进行代码编译时,为了保证编译过程与具体计算机硬件平台的无关性,它使用RTL(Register Transfer Language)寄存器传递语言对目标平台的指令进行描述。GCC 编译过程也是比较复杂的,其基本流程如图4.1.3 所示:从GCC 输出的是汇编语言源程序,如果我们想要进一步编译成我们想要的机器代码,则还需要汇编器等的协助,这就是我们前面提到的工具链。工具链中通常包含GNU Binutils ,GNU GCC ,GNU GLibc 。Binutils 中主要包含链接器ld和汇编器as 。而GNU GCC 我们以上已做了不少介绍了。至于GNU GLibc ,它提供了一个C 库,使得系统能完成基本的系统调用及其它的一些函数调用。下面我们介绍一下GCC 交叉编译器的生成过程。生成GCC 交叉编译器的过程一般包含如下几个步骤:1 )取得Binutils 、GCC 、Glibc 的源码。你可以到相关网站去获得,网上这方面资源比较丰富。你把这三个文件解压到你自己的目录如:/toolchain/gcc, /toolchain/bu, /toolchain/glibc,2)配置并编译Binutils ,得到我们下一步要用到的汇编器和连接器。在配置Binutils 之前先把Linux 内核中GCC 所必需的头文件拷到GCC 可以找到的目录。如下操作:

cp –dr include/asm-arm /toolchain/gcc/arm-linux/include/asmcp –dr include/linux /toolchain/gcc/arm-linux/include/linux

然后进入Binutils 目录:./configure --target=arm-linux --prefix=/toolchain/armmake all install

3 )配置并编译GCC 源代码,生成GCC 编译器。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

161

http://www.up-tech.com博创科技(UP-TECH)

Page 162: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

编译之前先修改gcc 的t-linux 文件,此文件放在gcc/config/arm 目录下。在t-linux 文件中的TARGET_LIBGCC2_CFLAGS 后加上__gthr_posix_h inhibit_libc ,操作如下:进入gcc/config/arm 目录

mv t-linux t-linux-orig // 备份原来的t-linux 文件修改如下:

sed's/TARGET_LIBGCC2_CFLAGS =/TARGET_LIBGCC2_CFLAGS = -D__gthr_posix_h -Dinhibit_libc/' < t-linux-orig > t-linux-core

cp ./t-linux-core ./t-linux

然后进入GCC 安装目录进行编译,如下操作:(\ 是行连接符号)./configure \

--target=arm-linux \--prefix=/toolchain/gcc \--enable-languages=c \--with-local-prefix=/toolchain/gcc/arm-linux \--without-headers \ (\\ 不编译头文件)--with-newlib \--disable-shared

make all install

这里首先生成的是C 编译器。4 )配置Glibc 编译生成Glibc 的C 函数库。编译Glibc 之前我们先要把编译器改为我们刚刚生成的交叉编译器arm-linux-gcc ,同时要指定编译所需要的头文件。操作如下

CC=arm-linux-gcc AR=arm-linux-ar RANLIB=arm-linux-ranlib

然后进入Glibc 的安装目录,进行配置如下:./configure \

--host=arm-linux \--prefix=/toolchain/gcc/arm-linux \--enable-add-ons \--with-headers=/toolchain/gcc /arm-linux/include

make all install

5 )再次配置并编译GCC 源代码,生成其它语言的编译器如:C++ 等。恢复t-linux 文件用备份的t-linux-orig 覆盖改动后的t-linux

cp /toolchian/gcc/config/arm/t-linux-orig /toolchian/gcc/config/arm/t-linux

重新编译 ./configure \

--target=arm-linux \

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

162

http://www.up-tech.com博创科技(UP-TECH)

Page 163: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

--prefix=/toolchian/gcc \--enable-languages=c,c++ \--with-local-prefix=/toolchian/gcc /arm-linux

make all install

这部分工作如果从头自己做是比较复杂的,而且必需对你的硬件平台的体系结构非常熟悉,所以我们通常从网上直接下载相关工具包。

图4.1.3 用GCC 编译程序流程

四、修改Linux 内核源码

在完成交叉编译环境的建立之后,进入下一阶段,对linux 内核的移植修改。linux 的移植是个繁重的工作,其主要包含启动代码的修改,内核的链接及装入,参数传递,内核引导几个部分。linux 内核分为体系结构相关部分和体系结构无关部分。在Linux 启动的第一阶段,内核与体系结构相关部分(arch 目录下)首先执行,它会完成硬件寄存器设置,内存映像等初始化工作。然后把控制权转给内核中与系统结构无关部分。而我们在移植工

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

源码解析 语法树的优化 RTL 代码生成 函数调用优化

转移指令优化 寄存器扫描 SAA( Static Single Assignment)优化

公用子表达式削减 二次公用子表达式优化

数据流分析 指令合并

局部寄存器分配动

循环语句优化

指令时序调整

二次指令时序调整

寄存器类优先级选择

寄存器移动

基本块重新安排

重载

二次转移指令优化

可延迟性分支时序安排 多分支指令合并 寄存器使用优化

调试信息输出输出与程序对应的汇编语言程序

163

http://www.up-tech.com博创科技(UP-TECH)

Page 164: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

作中要改动的代码主要集中在与体系结构相关部分。在arch 目录中我们可以看到有许多子目录,它们往往是用芯片命名的,表示是针对该芯片体系结构的代码。为arm系列芯片编译内核,就应修改ARM 目录下的相关文件。在ARM 的子目录下我们可以找到一个boot 目录,在boot 下有一个init.S 的文件,.S表示它是汇编语言文件。这里init.S 是用ARM 汇编写成的。这个init.S 就是引导Linux 内核在Arm 平台上启动的初始化代码。它里头定义了一个全局符号_start ,它定义了默认的起始地址。同时它也是整体内核二进制镜像的起始标志。Init.S 主要完成以下功能:定义数据段、代码段、bbs(未初始化数据段)起始地址变量并对bbs段进行初始化。设置寄存器以初始化系统硬件。关闭中断。初始化LCD 显示。将数据段数据复制到内存。跳转到内核起始函数start_kernel继续执行。对主寄存器的修改。Init.S 源代码如下:

/* * linux/arch/arm/boot/bootp/init.S * * Copyright (C) 2000 Russell King ** Header file for splitting kernel + initrd. Note that we pass * r0 through to r3 straight through. */

.section .start,#alloc,#execinstr

.type_entry, #function_entry: adr r10, initdata

ldr r11, initdatasub r11, r10, r11 @ work out exec offsetb splitify.size _entry,. - _entry

.typeinitdata, #objectinitdata: .word initdata @ compiled address of this

.size initdata,. - initdata

.textsplitify: adr r13, data

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

164

http://www.up-tech.com博创科技(UP-TECH)

Page 165: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

ldmia r13 !, {r4-r6} @ move the initrdadd r4, r4, r11 @ correctionbl move

ldmia r13 !, {r4-r6} @ then the kernelmov r12, r5add r4, r4, r11 @ correctionbl move

/* * Setup the initrd parameters to pass to the kernel. This can either be * passed in via a param_struct or a tag list. We spot the param_struct * method by looking at the first word; this should either indicate a page * size of 4K, 16K or 32K. */

ldmia r13, {r4-r8} @ get size and addr of initrd @ r5 = ATAG_INITRD @ r6 = initrd start @ r7 = initrd end @ r8 = param_struct address

ldr r9, [r8, #0] @ no param struct ?teq r9, #0x1000 @ 4K ?teqne r9, #0x4000 @ 16K?teqne r9, #0x8000 @ 32K?beq param_struct

ldr r9, [r8, #4] @ get first tagteq r9, r4bne taglist @ ok, we have a tag list

/* * We didn't find a valid tag list - create one. */

str r4, [r8, #4]mov r4, #8str r4, [r8, #0]mov r4, #0str r4, [r8, #8]

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

165

http://www.up-tech.com博创科技(UP-TECH)

Page 166: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

/* * find the end of the tag list, and then add an INITRD tag on the end. * If there is already an INITRD tag, then we ignore it; the last INITRD * tag takes precidence. */taglist: ldr r9, [r8, #0] @ tag length

teq r9, #0 @ last tag ?addne r8, r8, r9bne taglist

mov r4, #16 @ length of initrd tagmov r9, #0 @ end of tag list terminatorstmia r8, {r4, r5, r6, r7, r9}mov pc, r12 @ call kernel

/* * We found a param struct. Modify the param struct for the initrd */param_struct: add r8, r8, #16*4

stmia r8, {r6,r7} @ save in param_structmov pc, r12 @ call kernel

move: ldmia r4!, {r7 - r10} @ 一次搬移32个字节stmia r5!, {r7 - r10}ldmia r4!, {r7 - r10}stmia r5!, {r7 - r10}subs r6, r6, #8 * 4bcs movemov pc, lr

data: .word initrd_start.word initrd_addr.word initrd_len

.word kernel_start

.word kernel_addr

.word kernel_len

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

166

http://www.up-tech.com博创科技(UP-TECH)

Page 167: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

.word 0x54410001 @ r4 = ATAG_CORE

.word 0x54420005 @ r5 = ATAG_INITRD

.word initrd_addr @ r6

.word initrd_len @ r7

.word params @ r8

.typekernel_start,#object

.typeinitrd_start,#object

其源代码读者自己可以进行分析,而至于初始化设置的寄存器则要根据你的平台,参考相应的芯片手册。一般要做修改的寄存器有:片选组基地址寄存器,DRAM存储配置寄存器,DRAM片选寄存器,中断屏蔽寄存器等。此后代码会进入到entry.S 继续执行,它会继续完成对中断向量表配置等一系列动作。第一阶段的启动过程除了以上所说的之外,还要进行内核的链接与装入等工作。内核可执行文件是由许多链接在一起的目标文件组成的。我们以ELF(可链接可编译文件,是目前大多数Linux 系统都能认的一种文件格式)为例。ELF文件有text(文本段),data(数据段),bbs 等组成。这些段又由链接脚本(Linker description)负责链接装入。链接脚本又有输入文件和输出文件。输出文件中输出段告诉链接器如何分配存储器。而输入文件的输入段则描述如何把输入文件与存储器映射。其形式如下:(输出文件)

/* * linux/arch/arm/boot/compressed/vmlinux.lds.in* Copyright (C) 2000 Russell King* This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */OUTPUT_ARCH(arm) // 输出为ARM 格式ENTRY(_start) // 定义入口点SECTIONS{ . = LOAD_ADDR; //“.” 表示当前计数器 _load_addr = .;

. = TEXT_START; // 文本段起始 _text = .;

.text : { // 把各个输入文件中文本段合并到此 _start = .;

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

167

http://www.up-tech.com博创科技(UP-TECH)

Page 168: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

*(.start) *(.text) *(.fixup) *(.gnu.warning) *(.rodata) *(.rodata.*) *(.glue_7) *(.glue_7t) input_data = .; arch/arm/boot/compressed/piggy.o input_data_end = .; . = ALIGN(4); } _etext = .; //文本段结束(以下各段类似) _got_start = .; .got : { *(.got) } _got_end = .; .got.plt : { *(.got.plt) } .data : { *(.data) } _edata = .;

. = BSS_START; __bss_start = .; .bss : { *(.bss) } _end = .;

.stack (NOLOAD): { *(.stack) }

.stab 0 : { *(.stab) } .stabstr 0 : { *(.stabstr) } .stab.excl 0 : { *(.stab.excl) } .stab.exclstr 0 : { *(.stab.exclstr) } .stab.index 0 : { *(.stab.index) } .stab.indexstr 0 : { *(.stab.indexstr) } .comment 0 : { *(.comment) }}

经过以上两个步骤,接下来要向内核传递参数并引导内核启动。前面的工作我们已经完成了初始化硬件寄存器,标示根设备,内存映射等工作,其中关于DRAM和Flash 数量,指

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

168

http://www.up-tech.com博创科技(UP-TECH)

Page 169: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

定系统中可用页面的数目、文件系统大小等信息我们就以参数形式从启动代码传给内核。这样接下来就会完成设置陷阱,初始化中断,初始化计时器,初始化控制台等一系列操作而使内核正确启动。Linux 移植过程中内容非常多,涉及的知识量也很大,而且由于平台的不同,和内核版本的不同所涉及的内容往往也有很大不同。所以以上给出内容也仅作为读者参考之用。具体操作时还应收集相关平台及内核版本的详细资料,才能展开相应工作。限于本书篇幅我们也无法做更深入的介绍。下面我们以已改造好的ARM-linux ,针对UP-CUP S2410 经典平台平台来讲解内核的裁减,这部分也是其重点内容,而且也是普通读者经常遇到的内容。

五、linux 内核的源代码的目录分布

linux-2.4.x 的目录结构如图5.1.1 所示:

图5.1.1 linux-2.4。x 的目录结构 arch

与体系结构相关的代码全部放在这里,如图5.1.2 所示,我们的实验设备中使用的是其中的arm目录。

图5.1.2 arch的目录结构 Documentation

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

169

http://www.up-tech.com博创科技(UP-TECH)

Page 170: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

这里存放着内核的所有开发文档,如图5.1.3 所示,其中的文件会随版本的演变发生变化,通过阅读这里的文件是获得内核最新的开发资料的最好的地方。

图5.1.3 documentation 的结构目录 Drivers

此目录包括所有的驱动程序,如图5.1.4 所示,下面又建立了多个目录,分别存放各个分类的驱动程序源代码。下面的截图是UP-CUP S2410 经典平台中使用的arminux-2.4.x中的drivers 目录文件列表。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

170

http://www.up-tech.com博创科技(UP-TECH)

Page 171: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图5.1.4 drivers 的结构目录drivers 目录是内核中最大的源代码存放处,大约占整个内核的一多半。其中我们经常会用到的目录有: Drivers/char字符设备是drivers 目录中最为常用,也许是最为重要的目录,因为其中包含了大量与驱动程序无关的代码。通用的tty 层在这里实现,console.c 定义了linux 终端类型,vt.c中定义了虚拟控制台;lp.c 中实现了一个通用的并口打印机的驱动,并保持设备无关性;kerboard.c 实现高级键盘处理,它导出handle_scancode 函数,以便于其他与平台相关的键盘驱动使用。我们的大部分实验也是放在这个目录下。 Driver/bloc其中存放所有的块设备驱动程序,也保存了一些设备无关的代码。目录中最重要的文件是ll_rw_blk.c ,它是一个底层块读写文件,blkpg.c 实现了块设备的分区和几何参数的通用处理,它导出的公共函数为blk_ioctl ,可以被其他块设备驱动程序使用。rd.c实现了RAM 磁盘,nbd.c实现了网络块设备,loop.c 实现了回环块设备。 Drives/ide

专门存放针对IDE 设备的驱动。 Drivers/scsi

存放SCSI 设备的驱动程序,当前的cd 刻录机、扫描仪、U 盘等设备都依赖这个SCSI 的通用设备。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

171

http://www.up-tech.com博创科技(UP-TECH)

Page 172: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

Drivers/net

存放网络接口适配器的驱动程序,还包括一些线路规程的实现,但不实现实际的通信协议,这部分在顶层目录的net 目录中实现。 Drivers/video

这里保存了所有的帧缓冲区视频设备的驱动程序,整个目录实现了一个单独的字符设备驱动。/dev/fb 设备的入口点在fbmem.c 文件中,该文件注册主设备号并维护一个此设备的清单,其中记录了哪一个帧缓冲区设备负责哪个次设备号。 Drivers/media

这里存放的代码主要是针对无线电和视频输入设备,比如目前流行的usb 摄像头。 fs

此目录下包括了大量的文件系统的源代码,如图5-5 所示,其中在嵌入式开发中要使用的包括:devfs 、cramfs 、ext2 、,jffs2 、romfs 、yaffs、vfat 、nfs 、proc 等。

图5.1.5 fs的结构目录文件系统是Linux 中非常重要的子系统,这里实现了许多重要的系统调用,比如exec.c文件中实现了execve 系统调用;用于文件访问的系统调用在open.c 、read_write.c等文件中定义,select.c实现了select和poll 系统调用,pipe.c 和fifo.c 实现了管道和

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

172

http://www.up-tech.com博创科技(UP-TECH)

Page 173: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

命名管道, mkdir、rmdir 、rename 、link 、symlink 、mknod 等系统调用在namei.c中实现。文件系统的挂装和卸载和用于临时根文件系统的initrd 在super.c 中实现。Devices.c 中实现了字符设备和块设备驱动程序的注册函数;file.c 、inode.c 实现了管理文件和索引节点内部数据结构的组织。Ioctl.c实现ioctl 系统调用。 include

这里是内核的所有头文件存放的地方,如图5.1.6 所示,其中的linux 目录是头文件最多的地方,也是驱动程序经常要包含的目录。

图5.1.6 include 的目录结构 init

linux 的main.c 程序,通过这个比较简单的程序,我们可以理解LINUX 的启动流程。 ipcsystem V 的进程间通信的原语实现,包括信号量、共享内存。

kernel

这个目录下存放的是除网络、文件系统、内存管理之外的所有其他基础设施,从下面的文件列表5.1.7 所示,我们大致可以看出,其中至少包括进程调度sched.c ,进程建立fork.c ,定时器的管理timer.c ,中断处理,信号处理等。

图5.1.7 kernel 的目录结构

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

173

http://www.up-tech.com博创科技(UP-TECH)

Page 174: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

lib

包括一些通用支持函数,类似于标准C 的库函数。其中包括了最重要的vsprintf函数的实现,它是printk和sprintf 函数的核心。还有将字符串转换为长整形数的simple_atol 函数。其文件列表如图5.1.8 所示。

图5.1.8 lib 的目录结构 mm

这个目录包含实现内存管理的代码,包括所有与内存管理相关的数据结构,如图5-9 所示,其中我们在驱动中需要使用的kmalloc 和kfree 函数在slab.c中实现,mmap 定义在mmap.c 中的do_mmap_pgoff 函数。将文件映射到内存的实现在filemap.c 中,mprotect 在mprotect.c ,remap 在remap.c 中实现;vmscan.c 中实现了kswapd 内核线程,它用于释放未使用和老化的页面到交换空间,这个文件对系统的性能起着关键的影响。

图5.1.9 mm 的目录结构 net

这个目录包含了套接字抽象和网络协议的实现,如图5.1.10 所示,每一种协议都建立了一个目录,我们可以看到有26 个目录,但是其中的core 、bridge 、ethernet 、sunrpc 、khttpd 不是网络协议。我们使用最多的是ipv4 、ipv6 、802、ipx 等。Ipv4 、ipv6 是ip协议的第4 版本和第6 版本。Core 目录中实现了通用的网络功能:设备处理、防火墙、组播、别名等;ethernet 和bridge 实现特定的底层功能:以太网相关的辅助函数以及网桥功能。Sunrpc 中提供了支持NFS服务器的函数。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

174

http://www.up-tech.com博创科技(UP-TECH)

Page 175: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图5.1.10 net的目录结构 script

这个目录存放许多脚本,主要用于配置内核,其文件列表如图5.1.11 所示:

图5.1.11 script的目录结构

六、Linux 内核裁减

Linux 内核的裁剪与编译看上去是个挺简单的过程。只是对配置菜单的简单选择。但是内核配置菜单本身结构庞大,内容复杂。具体如何选择却难住了不少人。因此熟悉与了解该菜单的各项具体含义就显得比较重要。我们现在就对其作一些必要介绍:Linux 内核的编译菜单有好几个版本,运行:1 )make config :进入命令行,可以一行一行的配置,这不好使用所以我们不具体介绍。2 )make menuconfig:进入我们熟悉的menuconfig菜单,相信很多人对此都不陌生。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

175

http://www.up-tech.com博创科技(UP-TECH)

Page 176: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

3 )make xconfig :在2.4.X 以及以前版本中xconfig 菜单是基于TCL/TK 的图形库的。所有内核配置菜单都是通过Config.in 经由不同脚本解释器产生.config 。而目前刚刚推出的2.6.X 内核用QT 图形库。由KConfig 经由脚本解释器产生。这两版本差别很大。2.6.X 的xconfig 菜单结构清晰,使用也更方便。但基于目前2.4.X 版本比较成熟,稳定,用的最多。所以这里我还是以2.4.X 版本为基础介绍相关裁剪内容。同时因为xconfig 界面比较友好,大家容易掌握。但它却没有menuconfig菜单稳定。有些人机器跑不起来。所以考虑最大众化角度,我们以较稳定,且不够友好的menuconfig为主进行介绍,它会用了,Xconfig 就没问题。 2.4.X 版本xconfig 配置菜单,2.4.X 版本menuconfig配置菜单,2.6.X 版本 xconfig 配置菜单分别如图4.1.4 ,4.1.5 ,4.1.6 所示:

图4.1.4 2.4.X版本xconfig 配置菜单

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

176

http://www.up-tech.com博创科技(UP-TECH)

Page 177: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图4.1.5 2.4.X 版本menuconfig配置菜单

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

177

http://www.up-tech.com博创科技(UP-TECH)

Page 178: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图4.1.6 2.6.X 版本 xconfig 配置菜单在选择相应的配置时,有三种选择方式,它们分别代表的含义如下:  Y -- 将该功能编译进内核  N-- 不将该功能编译进内核  M-- 将该功能编译成可以在需要时动态插入到内核中的模块如果你是使用的是make xconfig ,那使用鼠标就可以选择对应的选项。这里使用的是make menuconfig,所以需要使用空格键进行选取。在每一个选项前都有一个括号, 有的是中括号有的是尖括号,还有圆括号。用空格键选择时可以发现,中括号里要么是空,要么是"*" ,而尖括号里可以是空,"*" 和"M" 这表示前者对应的项要么不要,要么编译到内核里;后者则多一样选择,可以编译成模块。而圆括号的内容是要你在所提供的几个选项中选择一项。( 注:其中有不少选项是目标板开发人员加的,对于陌生选项,自己不知道该选什么时建议使用默认值)下面我们来看看具体配置菜单,进入内核所在目录,键入make menuconfig你就会看到配置菜单具有如下一些项:1 、Code maturity level options代码成熟度选项,它又有子项:1.1 、prompt for development and/or incomplete code/drivers该选项是对那些还在测试阶段的代码,驱动模块等的支持。一般应该选这个选项,除非你只是想使用LINUX 中已经完全稳定的东西。但这样有时对系统性能影响挺大。1.2 、prompt for obsolete code/drivers该项用于对那些已经老旧的,被现有文件替代了的驱动,代码的支持,可以不选,除非你的机器配置比较旧。但那也会有不少问题。所以该项以基本不用,在新的版本中已被替换。2 、loadable module support动态加载模块支持选项,其子项有:2.1 、 enable module support支持模块加载功能,应该选上。2.2 set version information on all module symbols该项用来支持跨内核版本的模块支持。即为某个版本的内核编译的模块可以在另一个版本的内核下使用,我们一般用不上。所以不选。2.3 kernel module loader如果你启用这个选项,你可以通过kerneld程序的帮助在需要的时候自动载入或卸载那些可载入式的模块。我们一般会选上。3 、system type系统类型,主要是CPU 类型,以及于此相关的内容。该项下的子项比较多,内容也比较复杂,我无法对每个CPU 都加以说明,就以我们的开发平台作相应介绍,其它平台与此类似。如果你是进行交叉编译,该项下的内容往往是经过相应目标平台开发人员修改的。主要是针对该平台的体系结构定义,这样可以优化系统性能。正因为目标平台的多样性所以该项

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

178

http://www.up-tech.com博创科技(UP-TECH)

Page 179: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

定义也常常是五花八门。但开发人员一般会考虑到这些,事先设定好默认值。作为初学者按给出的默认选项就行。当然你也许想用一个原始的版本内核来建构针对你的平台的新内核,如果你的内核版本支持你目标平台所用的CPU 那你就选上它。但不要选同系列中高于你所用的CPU 型号否则不支持。你也可以在Config.in 或KConfig 中修改该项以支持你的目标平台。当然其中还有一些较复杂的事情要处理。由于本文档并不针对高级用户所以这部分内容不深入介绍。在我们ARM2410-CL 平台上你在该项上看到的是S3C2410 的ARM 系列CPU 。其它选项是关于该芯片及平台的一些结构定义。其它版本内核遇到的不会是这种情况,但一般包含processor family 选项,它让我们选择CPU 的类型,BIOS 可以自检到,留意一下你的系统的启动信息。选上正确的CPU 类型就行。4 、General setup4.1 、support hot-plugable devieces对可热拔插的设备的支持,看情况选择。若要对U盘等USB 设备进行控制,建议选上。下面分别是4.2 、Networking : support 网络支持,用到网络设备当然要选上。4.3 、System V IPC :支持systemV 的进程间通讯,选上吧。4.4 、sysctl support :该项支持在不重启情况下直接改变内核的参数。启用该选项后内核大约会增大8K ,如果你的内存太小就别选。4.5 、NWFPE math emulation一般要选一个模拟数学协处理器,选上吧。4.6 、Power manager电源管理,给X86编译内核时较有用可以选上,尤其是笔记本。给ARM 编内核时可不选。其它的看情况,在我们的平台上目前都用不着,不用选。5 、Networking option网络选项,它主要是关于一些网络协议的选项。Linux 号称网络操作系统,它最强大的功能也就是在于对网络功能的灵活支持。这部分内容相当多,看情况,一般我们把以下几项选上。5.1 、 packet socket包协议支持,有些应用程序使用Packet 协议直接同网络设备通讯,而不通过内核中的其它中介协议。同时它可以让你在TCP 不能用时找到一个通讯方法。5.2 、 unix domain socket对基本UNIX socket 的支持5.3 、 TCP/IP networking对TCP/IP 协议栈的支持,当然要。如果你的内核很在意大小,而且没有什么网络要就,也不跑类似X Window之类基于Unix Socket的应用那你可以不选,可节省大约144K 空间。至于其它众多的选项,这里挑一些对其意思简单介绍一下:Network firewalls :是否让内核支持采用网络防火墙。如果计算机想当firewalls

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

179

http://www.up-tech.com博创科技(UP-TECH)

Page 180: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

server 或者是处于TCP/IP 通信协议的网络的网路结构下这一项就选上。Packet socket : mmapped IO 选该项则Packet socket 可以利用端口进行快速通讯的。IP:advanced router 如果你想把自己的Linux 配成路由器功能这项肯定要选。选上后会带出几个子项。这些子项可以更精确配置相关路由功能。socket filter:就是包过滤。IP:multicasting 即网络广播协议的支持,可以一次一个packet 送到好几台计算机的操作。IP:syncookies 一种保护措施,将各种TCP/IP 的通信协议加密,防止Attacker 攻击用户的计算机,并且可以纪录企图攻击用户的计算机的IP地址。IP: masquerading :这个选项可以在Network Firewalls选项被选后生效。masquerading 可以将内部网络的计算机送出去的封包,通过防火墙服务器直接传递给远端的计算机,而远端的计算机看到的就是接收到的防火墙服务器送过来的封包,而不是从内部的计算机送过来的。这样如果内部只有一台计算机可以上网,其余的机器可以通过这台机子的防火墙服务器向外连线。它是一种伪装,如果你的网络里有一些重要的信息,那你在使用 IP Masquerade 之前就要三思。因为它即可能成为你通往互联网的网关同样也可能为外边世界进入你网络的提供一条途径。IP:ICMP masquerading: 一般masquerading 只提供处理TCP ,UDP packets ,若要让masqurerading 也能处理ICMP packets ,就把这选项选上。IP:always defragment :可将接收到的packet fragments重新组合回原来那个封包。IP:accounting :统计IP packet 的流量,也就是网络的流通情况。IP:optimize as router not host :可以关闭copy&checksum 技术,防止流量大的服务器的IP packets 丢失。IP:tunneling tunnel 即隧道。这里是指用另外一种协议来封装数据或包容协议类型。这样就相当于在不同的协议之间打了条隧道。使得数据包可以被不同的协议接受和解释。这样我们可在不同网域中使用linux ,且都不用改IP就可以直接上网了。对于嵌入式设备这点还是挺有用的。IP:GRE tunneling 此"GRE" 可不是彼"GRE" ,它是(Generic Routing Encapsulation) 。选该项后可以支持在IPv4 与IPv6 之间的通讯。IP: ARP daemon support 即对ARP的支持。它是把IP地址解析为物理地址。IP:Reverse ARP :RARP( 逆向地址解析) 协议,可提供bootp的功能,让计算机从可以从网卡的Boot Ram启动,这对于搭建无盘工作站是很有用的,但现在硬件价格下跌好像无盘工作站用的已经不多了。IP:Disable Path MTU Discovery :MTU 有助于处理拥挤的网络。MTU (Maximal Transfer Unit)最大的传输单位,即一次送往网络的信息大小。而Path MTUD iscovery的意思是当Linux 发现一些机器的传输量比较小时,就会分送网络信息给它。如此可以增加网络的速度,所以大部分时候都选N ,也就是Enable 。The IPX protocol :IPX 为Netware 网络使用的通讯协议,主要是NOVELL系统支持的。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

180

http://www.up-tech.com博创科技(UP-TECH)

Page 181: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

QoS and/or fair queueing :QoS 即(Quality Of Service ) 这是一种排定某种封包先送的网络线程表,可同时针对多个网络封包处理并依优先处理顺序来排序,称之为packet schedulers 。此功能特别是针对实时系统时格外重要,当多个封包同时送到网络设备时,Kernel 可以适当的决定出哪一个封包必须优先处理。因此Kernel 提供数种packet scheduling algorithm 。其它网络选项还有很多考虑篇幅无法给其作一一解释,如果你有兴趣可以查看相关帮助文件。这里我建议你下一个2.6.X 内核。在其Xconfig 中可以很方便查看各项的帮助信息。6 、Networking deveices :网络设备支持。上面选好了网络协议了,现在选的是网络设备,其实主要就是网卡,所以关键是确定自己平台所使用的网卡芯片。该项下的子项也不少。6.1 、Dummy net driver support哑( 空) 网络设备支持。它可让我们模拟出TCP/IP环境对SLIP 或PPP 的传输协议提供支持。选择它Linux 核心增大不大。如果没有运行SLIP 或PPP协议,就不用选它。6.2 、Bonding driver support bonding技术是用来把多块网卡虚拟为一块网卡的,使他们有一个共同的IP地址。6.3 、Universal TUN/TAP device driver support 用于支持TUNx/TAPx 设备的6.3 、SLIP (serial line) support这是MODEM族常用的一种通讯协议,必须通过一台Server (叫ISP )获取一个IP地址,然后利用这个IP地址,可以模拟以太网络,使用有关TCP/IP的程序。6.4 、PLIP (parallel port ) support依字面上看,它是一种利用打印机的接口(平行接口),然后利用点对点来模拟TCP/IP的环境。它和 SLIP /PPP全都属于点对点通讯,您可以把两台电脑利用打印机的连接接口串联起来,然后,加入此通讯协议。如此一来,这两部电脑就等于一个小小的网络了。不过,如果电脑有提供打印服务的话,这个选项最好不要打开,不然可能会有问题(因为都是用平行接口)。6.5 、PPP(point -to -point )support点对点协议,近年来,PPP协议已经慢慢的取代SLIP 的规定了,原因是PPP协议可以获取相同的IP地址,而SLIP 则一直在改变IP地址,在许多的方面,PPP 都胜过SLIP 协议。6.6 、EQL (serial line load balancing) support 两台机器通过SLIP 或PPP协议,使用两个MODEM,两条电话线,进行通讯时,可以用这个Driver 以便让MODEM的速度提高两倍。当然。6.7 、Token Ring driver support 对令牌环网的支持。6.8 、Ethertap network tap6.9 、Ethernet (10 or 100Mbit) 十至百兆以太网设备,我们现在该类型设备用的比较多。进入该项里头还有许多小项,它们是关于具体网络设备( 一般就是网卡) 的信息。选择我们平台相关的就行。6.10 、ARCnet support

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

181

http://www.up-tech.com博创科技(UP-TECH)

Page 182: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

它是一种网卡但不流行基本没用。其它的诸如千兆以太网,万兆以太网,无线网络,广域网,ATM ,PCMCIA卡等等网络设备的支持,要看你的具体应用而定。这里不作一一介绍。7 、Amateur Radio support 这个选项用的不多,它是用来启动无线网络的,通过无线网络我们可以利用公众频率来进行数据传输,如果你有相关无线网络通讯设备就可以用它。8 、IrDA(infrared) support 该项也属于无线通讯的一种,用于启动对红外通讯的支持。目前在2.6.X 的内核里对它的支持内容更丰富了。9 、ATA/ATAPI/MFM/RLL support 该项主要对ATA/ATAPI/MFM/RLL 等协议的支持。在嵌入式设备中,目前这些设备应用的还不多,但台式机及笔记本用户如果你有支持以上协议的硬盘或光驱就可选上它。在2.6.X 内核中这方面的支持内容也比较丰富。10 、SCSI device support 如果你有SCSI 设备(SCSI 控制卡,硬盘或光驱等) 你选上这项。目前SCSI 设备类型已经比较多,要具体区分它们你得先了解他们所使用的控制芯片类型。2.6.X 内核中对各类型SCSI 设备已经有更具体详细的支持。11 、ISDN support ISDN (Integrated Services Digital Networks)它是一种高速的数字电话服务。通过专用ISDN 线路加上装在你电脑上的ISDN 卡。利用SLIP 或PPP协议进行通讯。所以你若想启动该项支持ISDN 通讯,你还应启动前面提到的Networking Devices中的SLIP 或PPP 。12 、Console drivers support 控制台设备支持。目前安装uClinux/Linux 的设备几乎都是带控制台的,所以这项是必选项。这里头还有几个子项:12.1 、VGA text console 一般台式机选该项。支持VGA 显示设备。12.2 、Support Frame Buffer devices 该项支持Frame Buffer 设备。Frame Buffer 技术在2.4.X 内核被全面采用。它通过开辟一块内存空间模拟显示设备。这样我们可以像操作具体图形设备一样来操作这块内存,直接给它输入数据,在具体显示设备上输出图形。在嵌入式设备上广泛采用LCD 作为显示设备,所以该项显得比较重要。当该项被选上后会出现一子项让我们根据自己平台配备的具体硬件选择相应支持。这些也往往是设备开发人员给添加的。以我们的UP-CUP 3000 平台为例,你应选上:

support for frame buffer devicesS3C2410X LCD supportAdvanced low level driver options8 bpp packet pixels support 该项在UP-CUP S2410 经典平台平台上改为320*240 8bit 256 color STN LCD support

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

182

http://www.up-tech.com博创科技(UP-TECH)

Page 183: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

13 、parallel port support对并行口的设备的支持。LINUX 可以支持PLIP 协议(利用并行口的网络通讯协定),并口的打印机,ZIP 磁盘驱动器、扫描仪等。如果有打印机在选择利用并口通讯时要小心,因为它们可能会互相干扰。14 、Memory Technology Device (MTD) support MTD 包含flash ,RAM 等存储设备。MTD 在现在的嵌入式设备中应用的相当多,也特别重要。选中该项我们可以对MTD 进行动态支持。其下还有好多具体小项,这里按UP-CUP 3000 平台平台做一些解释:14.1 、MTD partitioning support选上该项可支持对MTD 的分区操作。我们在对嵌入式设备的操作系统移植过程中往往要对MTD 进行分区,然后在各分区放置不同的数据。以让系统能被正确引导启动。14.2 、Direct char device access to MTD devices 选该项为系统的所有MTD 设备提供一个字符设备,通过该字符设备我们能直接对MTD设备进行读写以及利用ioctl()函数来获取该MTD 设备的相关信息。14.3 、Caching block device access to MTD devices有许多flash 芯片其擦除的块太大因此作为块设备使用效率被大打折扣。我们选上该项后,它支持利用RAM 芯片作为缓存来使用MTD 设备。这时对于MTD 设备块设备就相当于它的一个用户。通过JFFS 文件系统的控制,它可以模拟成一个小型块设备,具有读,写,擦,校验等一系列功能。14.4 、NAND flash device drivers 子项中有几项是关于MTD 设备驱动的,我们的平台选择的是NAND flash 所以我们选上它。选上后在其二级子项中我们还要选上:14.4.1 、NAND devices support14.4.2 、verify NAND pages writes 支持页校验14.4.3 、NAND flash device on ARM board15 、Plug and Play support 这是对PNP( 即插即用) 设备的支持。16 、block devices 块设备,该项下也有好几个子项,主要是关于各种块设备的支持。至少把RAM 的支持项选上。如在我们UP-CUP S2410 经典平台平台上我们要选上:1)RAM disk support2)Initial RAM disk(initrd) support17 、File systems文件系统在Linux 中是非常重要的。该项下的子项也非常多。17.1 、Quota support 份额分配支持。选择该项则系统支持对每个用户使用的磁盘空间进行限制。17.2 、Kernel automounter support 在有NFS文件系统的支持下,选择该项可使得内核可以支持对一些远端文件系统的自动挂

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

183

http://www.up-tech.com博创科技(UP-TECH)

Page 184: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

栽。17.3 、Kernel automounter version 4 support V3 版本的升级,它兼容V317.4 、Reiserfs supportReiserFS 这种文件系统以日志方式不仅把文件名,而且把文件本身保存在一个" 平衡树" 里。其速度与ETX2 差不多但比传统的文件系统架构更为高效。尤其适合大目录下文件的情况。17.5 、ROM file system support 它是一个非常小的只读文件系统,主要用于安装盘及根文件系统。17.6 、JFS filesystem support 这是IBM 的一个日志文件系统。17.7 、Second extended fs support 著名的EXT2(二版扩展文件系统) ,除非你是用DOS 模拟器否则得选它。17.8 、Ext3 journalling file system support 它其实是EXT2 的日志版,我们通常叫它EXT3 。17.9 、Journalling Flash file system v2(jffs2) supportFlash 日志文件系统,UP-CUP S2410 经典平台可以支持该文件系统,但是我们使用了效率更高的YAFFS文件系统。17.10 、ISO 9660 CDROM file system support光驱的支持17.11 、/proc file system support 这是虚拟文件系统,能够提供当前系统的状态信息。它运行时在内存生成,不占任何硬盘空间。通过CAT命令可以读到其文件的相关信息。17.12 、/dev file system support 它是类似于/proc 的一个文件系统,也是虚拟的,主要用于支持devfs( 设备文件系统) 。把它选上,这样我们就可以不依赖于传统的主次设备号的方式来管理设备。而是由devfs自动管理。17.13 、NFS file system 网络文件系统。17.13.1 、NFS file system support 对网络文件系统的支持。NFS通过SLIP ,PLIP ,PPP或以太网进行网络文件管理。它是比较重要的。17.13.2 、NFS server support选这项可以把你的Linux 配置为NFS server17.13.3 、SMB file system supportSMB (Server Message Block) ,它是用于和局域网中相连的Windows 机器建立连接的。相当于网上邻居。 这些协议都需要在TCP/IP 被启用后才有效。17.14 、Native Language Support就是对各国语言的支持。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

184

http://www.up-tech.com博创科技(UP-TECH)

Page 185: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

18 、character devicesLINUX 支持很多特殊的字符设备,所以该项下的子项也特别多。18.1 、virtual terminal 虚拟终端,选上18.2 、support for console on virtual terminal 虚拟终端控制台,也给选上。18.3 、non-standar serial port support 非标准串口设备的支持。如果你的平台上有一些非标准串口设备需要支持,就选上它。18.4 、Serial drivers 串口设置,一般选上自己开发平台相关的串口就行。在UP-CUP S2410 经典平台上选S3C2410 serial port support 和support for console on S3C2410 serial port18.5 、UNIX98 PTY supportPTY(pseudo terminal)伪终端,它是软件设备由主从两部分组成。从设备与具体的硬件终端绑定,而主设备则由一个进程控制向从设备写入或读出数据。其典型应用如:telnet服务器和xterms18.6 、I2C support 对I2C 设备的支持。18.7 、Mice就是对鼠标的支持。18.8 Joysticks 对一些游戏手柄的支持。18.9 QIC-02 tape support 对一些非SCSI 的磁带设备支持。18.10 watchdog card support 对看门狗定时设备的支持。18.11 /dev/nvram support 这是一种和BIOS 配合工作的RAM 设备。我们常称它为"CMOS RAM" ,而NVRAM 主要是在Ataris机器上的称法。通过设备名/dev/nvram 可以读写该部分内存内容。它通常保存一些机器运行必需的重要数据,而且保证掉电后能继续保存。18.12 、Enhanced Real Time Clock Support在每台PC 机上都内建了一个时钟,它可以产生出从1Hz到8192Hz 的信号。在多CPU的机器中这项必选。18.13 、/dev/agpgart (AGP Support) AGP (Accelerated Graphics Port) 通过它可以沟通显卡与其它设备。如果有AGP 设备就选上它。嵌入式系统中目前用的还不多,但台式机AGP 设备已相当普及。18.14 、Siemens R3964 line discipline这项主要是支持利用Siemens R3964 的包协议进行同步通讯的。18.15 、Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) 选该项后则在内核级提供对XFree86 4.0的DRI(Direct Rendering Infrastructure) 的

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

185

http://www.up-tech.com博创科技(UP-TECH)

Page 186: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

支持,选择正确的显卡后,该设备能提供对同步,安全的DMA 交换支持。选该项同时要把/dev/agpgart (AGP Support)选上。19 、USB support 即对USB 设备的支持。 如果有相关设备就选上。20 、sound card support关于声卡的支持,根据你自己的情况来配置。21 、kernel hacking这里是一些有关内核调试及内核运行信息的选项。如果你正打算深入研究自己系统上运行的LINUX 如何运作,可以在这里找到相关选项,但一般没有必要的话可以全部关掉。

七、内核的编译步骤

在完成内核的裁减之后,内核的编译就是一个非常简单的过程。你只要执行以下几条命令就行:1 、 进入到/arm2410cl/kernel/linux-2.4.18-2410cl/ 目录下

[root@zxt /]# cd /arm2410cl/kernel/linux-2.4.18-2410cl/2 、 make clean

[root@ linux-2.4.18-2410cl/] make clean这条命令是在正式编译你的内核之前先把环境给清理干净。有时你也可以用make realclean 或make mrproper 来彻底清除相关依赖,保证没有不正确的.o文件存在。3 、make dep这条命令是编译相关依赖文件。4 、make zImage这条命令就是最终的编译命令。有时你可以直接用make(2.6.X版本上用) 或make bzImage (给PC 机编译大内核时用)5 、到/arm2410cl/kernel/linux-2.4.18-2410cl/arch/arm/boot 下查看新生成的内核文件

6 、 make install这条命令可以把相关文件拷贝到默认的目录。当然在给嵌入式设备编译时这步可以不要。因为具体的内核安装还需要你手工进行。 我们如果使用虚拟机也可以直接拷贝到windows 下然后烧写,具体烧写过程见恢复出厂设置,把相应文件做替换即可;这个可以把vivi 和zImage ,root.cramfs 都编译好后一起进行烧写,但是最好还是分别进行。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

186

http://www.up-tech.com博创科技(UP-TECH)

Page 187: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

八、思考题

1 、 根据《开发指南》上的方法,烧写一下你编译出来的内核看看运行是什么情况。2 、 你可以在“内核裁减与配置”一步中做一些改动,如增加一个你熟悉的模块,编译内核然后烧写并运行它看该模块工作是否正常,这就为下一步驱动程序开发做准备。

4.2 根文件系统实验

一、实验目的1 、 了解UP-CUP S2410 经典平台的根文件系统结构2 、 了解根文件系统的生成过程3 、 完成一个简单的文件系统生成步骤4 、 了解busybox 、mkcramfs工具

二、实验内容使用busybox 生成文件系统中的命令部分,使用mkcramfs工具制作文件系统,并

完成将文件系统放置到开发板的烧写工作。三、预备知识

1 .熟悉linux 下文件目录结构2 .熟悉linux 下常用命令的使用3 .掌握Makefile 的编写和使用。4 .掌握Linux 下的程序编译与交叉编译过程

四、实验设备及工具硬件:UP-CUP S2410 经典平台嵌入式实验仪,PC 机pentumn500 以上, 硬盘

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

187

http://www.up-tech.com博创科技(UP-TECH)

Page 188: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

10G 以上软件:PC 机操作系统REDHAT LINUX 9.0 +MINICOM + AMRLINUX 开发环

境五、实验原理

Linux 内核在启动过程中会安装文件系统,文件系统为linux 操作系统不可或缺的重要组成部分。用户通常是通过文件系统同操作系统与硬件设备进行交互,在linux 系统中硬件也作为文件系统的一部分。

我们通常所说的文件系统分为两个含义,一个含义是磁盘和磁盘机制的文件系统即物理文件系统,另一个含义是用户看得见并能操作的逻辑文件系统。本次实验希望大家能对Linux 下的逻辑文件系统有一个认识,并对嵌入式系统中的逻辑文件系统有一个初步的了解。5.1 文件系统基本概念

Linux 的一个最重要特点就是它支持许多不同的文件系统。这使Linux 非常灵活,能够与许多其他的操作系统共存。Linux 支持的常见的文件系统有:JFS 、 ReiserFS 、ext 、ext2 、ext3 、ISO9660 、XFS、Minx 、MSDOS 、UMSDOS 、VFAT 、NTFS 、HPFS 、NFS、SMB 、SysV 、PROC 等。随着时间的推移, Linux 支持的文件系统数还会增加。

Linux 是通过把系统支持的各种文件系统链接到一个单独的树形层次结构中,来实现对多文件系统的支持的。该树形层次结构把文件系统表示成一个整个的独立实体。无论什么类型的文件系统,都被装配到某个目录上,由被装配的文件系统的文件覆盖该目录原有的内容。该个目录被称为装配目录或装配点。在文件系统卸载时,装配目录中原有的文件才会显露出来。

在Linux 文件系统中,文件用i 节点来表示、目录只是包含有一组目录条目列表的简单文件,而设备可以通过特殊文件上的I/O 请求被访问。

1. I节点(Inodes )每个文件都是由被称为i 节点的一个结构来表示的。每个i 节点都含有对特定文件的

描述:文件类型、访问权限、属主、时间戳、大小、指向数据块的指针。分配给一个文件的数据块的地址也存储在该文件的i 节点中。当一个用户在该文件上请求一个I/O 操作时,内核代码将当前偏移量转换成一个块号,并使用这个块号作为块地址表中的索引来读写实

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

188

http://www.up-tech.com博创科技(UP-TECH)

Page 189: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

际的物理块。这个图形表示了一个i 节点的结构:

2. 目录目录是一个分层的树结构。每个目录可以包含有文件和子目录。 目录是作为一个特殊的文件实现的。实际上,目录是一个含有目录条目的文件,每个条目含有一个i 节点号和一个文件名。当进程使用一个路径名时,内核代码就会在目录中搜索以找到相应的i 节点号,在文件名被转换成了一个i 节点以后,该i 节点就被加载到内存中并被随后的请求所使用。 这个图形表示了一个目录:

3. 链接(Links )Unix 文件系统实现了链接的概念。几个文件名可以与一个i 节点相关联。i 节点含

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

189

http://www.up-tech.com博创科技(UP-TECH)

Page 190: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

有一个字段,其中含有与文件的关联数目。要增加一个链接只需简单地建立一个目录项,该目录项的i 节点号指向该i 节点并增加该i 节点的连接数即可。但删除一个链接时,也即当使用 rm 命令删除一个文件名时,内核会递减i 节点的链接计数值,如果该计数值等于零的话,就会释放该i 节点。

这种类型的链接称为硬链接(hard link) ,并且只能在单独的文件系统内使用:也即不可能创建一个跨越文件系统的硬链接。而且,硬链接只能指向文件:为了防止造成目录树的循环,不能创建目录的硬链接。

在大多数Unix 文件系统中还有另外一种链接。符号链接(Symbolic link) 仅是含有一个文件名的简单文件。在从路径名到i 节点的转换中,但内核遇到一个符号链接时,就用该符号链接文件的内容替换链接的文件名,也即用目标文件的名称来替换,并重新开始路径名的翻译工作。由于符号链接并没有指向i 节点,因此就有可能创建一个跨越文件系统的符号链接。符号链接可以指向任何类型的文件,甚至是一个不存在的文件。由于没有与硬链接相关的限制,因此它们非常有用。然而,它们会用掉一点磁盘空间,并且需要为它们分配i 节点和数据块。由于内核在遇到一个符号链接时需要重新开始路径名到i 节点的转换工作,因此会造成路径名到i 节点转换的额外负担。 4. 设备特殊文件(Device special files)

在Unix 类操作系统中,设备是可以通过特殊的文件进行访问的。设备特殊文件不会使用文件系统上的任何空间,它只是对设备驱动程序的一个访问点。 存在两类设备特殊文件:字符和块设备特殊文件。前者允许以字符模式进行I/O 操作,

而后者需要通过高速缓冲功能以块模式写数据方式进行操作。当对设备特殊文件进行I/O请求操作,就会传递到( 虚拟的) 设备驱动程序中。对特殊文件的引用是通过主设备号和次设备号进行的,主设备号确定了设备的类型,而次设备号指明了设备单元。

5. 虚拟文件系统(The Virtual File System)Linux 内核含有一个虚拟文件系统层,用于系统调用操作文件。VFS是一个间接层,

用于处理涉及文件的系统调用,并调用物理文件系统代码中的必要功能来进行I/O 操作。该间接机制常用于Unix 类操作系统中,以利于集成和使用几种类型的文件系统。当处理器发出一个基于文件的系统调用时,内核就会调用VFS中的一个函数。该函数

会处理与结构无关的操作并且把调用重新转向到与结构相关的物理文件系统代码中的一个函数去。文件系统代码使用高速缓冲功能来请求对设备的I/O 操作。这个方案见下图所示:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

190

http://www.up-tech.com博创科技(UP-TECH)

Page 191: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

6. VFS 结构VFS定义了每个文件系统必须实现的函数集。该接口由一组操作集组成,涉及三类对

象:文件系统、i 节点和打开文件。 VFS知道内核所支持的文件系统的类型,它使用一个在内核配置时定义的一张表来获

取这些信息。该表中的每个条目描述了一个文件系统类型:它含有文件系统类型的名称以及在加载操作时调用的函数的指针。当需要加载一个文件系统时,就会调用相应的加载函数。该函数负责从磁盘上读取超级块、初始化内部变量,并且向VFS返回被加载文件系统的描述符。在文件系统已被加载以后,VFS函数就可以使用这个描述符来访问物理文件系统的子程序。 被加载文件系统的描述符含有几类数据:每个文件系统类型常用的信息、物理文件系统内核代码提供的函数指针以及物理文件系统代码私有数据。文件系统描述符中所包含的函数指针使得VFS能访问文件系统的内部函数。

VFS还使用了另外两类描述符: i节点描述符和打开文件描述符。每个描述符含有与所使用文件相关的信息以及物理文件系统代码提供的操作集。i 节点描述符含有用于任何文

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

191

http://www.up-tech.com博创科技(UP-TECH)

Page 192: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

件操作( 例如, create, unlink) 的函数指针集,而文件描述符含有操作已被打开文件的函数的指针( 例如, read, write) 。 5.2 常见的嵌入式文件系统 文件系统都会被烧录在与某一存储设备上。在嵌入式设备上很少使用大容量的IDE 硬盘作为自己的存储设备,嵌入式设备往往选用ROM 、闪存(flash memory)等作为它的主要存储设备。在嵌入式设备上选用哪种文件系统格式与闪存的特点是相关的。1 .闪存技术

目前市场上的flash 从结构上大体可以分为AND 、NAND、NOR 和DiNOR 等几种。其中NOR 和DiNOR 的特点为相对电压低、随机读取快、功耗低、稳定性高,而NAND和AND 的特点为容量大、回写速度快、芯片面积小。现在,NOR 和NAND FLASH 的 应 用最为 广 泛 ,除了 在 嵌 入 式 设 备 上 得到 广 泛 的 应 用 外, 在CompactFlash 、Secure Digital、PC Cards 、MMC 存储卡以及USB 闪盘存储器市场都都占用较大的份额。

NOR 的特点是可在芯片内执行,这样应该程序可以直接在flash 内存内运行,不必再把代码读到系统RAM 中。NOR 的传输效率很高,但写入和探险速度较低。而NAND结构能提供极高的单元密度,并且写入和擦除的速度也很快,是高数据存储密度的最佳选择。这两种结构性能上的异同步如下: (1) NOR 的读速度比NAND稍快一些。 (2) NAND的写入速度比NOR 快很多。 (3) NAND的擦除速度远比NOR 快。 (4) NAND的擦除单元更小,相应的擦除电路也更加简单。 (5) NAND闪存中每个块的最大擦写次数量否万次,而NOR 的擦写次数是十万次。此外,NAND的实际应用方式要比NOR 复杂得多。NOR 可以直接使用,并在上面

直接运行代码。而NAND需要I/O 接口,因此使用时需要驱动程序。不过当今流行的操作系统对NAND Flash都有支持,Linux 内核也对NAND Flash提供了很好的支持。由于以上flash 的特性决定了,在嵌入式设备中,我们一般会把只读属性的映象文件,如启动引导程序blob 、内核、文件系统文件存放在NOR Flash 中,而把一些读写类的文件,如用户应用程序等存放在NAND Flash中, 出于成本的考虑,很多厂家会选用低容量昂贵的NOR Flash 存储启动引导程序和内核,而把文件系统存放在NAND Flash中。2 .Ext2fs 文件系统

Ext2fs 是 Linux 事实上的标准文件系统,它已经取代了它的前任 — 扩展文件系统(或 Extfs )。Extfs 支持的文件大小最大为 2 GB ,支持的最大文件名称大小为

255 个字符 — 而且它不支持索引节点(包括数据修改时间标记)。Ext2fs 做得更好,它的优

点是: (1) Ext2fs 支持达 4 TB 的内存。 (2) Ext2fs 文件名称最长可以到 1012 个字符。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

192

http://www.up-tech.com博创科技(UP-TECH)

Page 193: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

(3) 当创建文件 系 统 时 ,管理员可 以选择逻辑块的 大 小(通常大 小 可选择 1024 、2048

和 4096 字节)。 (4) Ext2fs 实现了快速符号链接:不需要为此目的而分配数据块,并且将目标名称直 接存储在索引节点(inode)表中。这使性能有所提高,特别是在速度上。

 因为 Ext2 文件系统的稳定性、可靠性和健壮性,所以几乎在所有基于 Linux

的系统(包括台式机、服务器和工作站 — 并且甚至一些嵌入式设备)上都使用 Ext2 文件系统。然而,当在嵌入式设备中使用 Ext2fs 时,它有一些缺点:

(1) Ext2fs 是为象 IDE 设备那样的块设备设计的,这些设备的逻辑块大小是 512 字节,1 K 字节等这样的倍数。这不太适合于扇区大小因设备不同而不同的闪存设备。

(2) Ext2 文件系统没有提供对基于扇区的擦除/写操作的良好管理。在 Ext2fs 中,为了在一个扇区中擦除单个字节,必须将整个扇区复制到 RAM ,然后擦除,然后重写入。考虑到闪存设备具有有限的擦除寿命(大约能进行 100,000 次擦除),在此之后就不能使用它们,所以这不是一个特别好的方法。

(3) 在出现电源故障时,Ext2fs 不是防崩溃的。 Ext2 文件系统不支持损耗平衡,因此缩短了扇区/闪存的寿命。(损耗平衡确保将地址范围的不同区域轮流用于写和/或擦除操作以延长闪存设备的寿命。) Ext2fs 没有特别完美的扇区管理,这使设计块驱动程序十分困难。 由于这些原因,通常相对于 Ext2fs ,在嵌入式环境中使用 MTD/JFFS2 组合是

更好的选择。

用 Ramdisk 挂装 Ext2fs:  通过使用 Ramdisk 的概念,可以在嵌入式设备中创建并挂装 Ext2 文件系统

(以及用于这一目的的任何文件系统)。 创建一个简单的基于 Ext2fs 的 Ramdisk : mke2fs -vm0 /dev/ram 4096

  mount -t ext2 /dev/ram /mnt   cd /mnt   cp /bin, /sbin, /etc, /dev ... files in mnt   cd ../   umount /mnt   dd if=/dev/ram bs=1k count=4096 of=ext2ramdisk

mke2fs 是用于在任何设备上创建 ext2 文件系统的实用程序 — 它创建超级块、索引节点以及索引节点表等等。

在上面的用法中,/dev/ram 是上面构建有 4096 个块的 ext2 文件系统的设备。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

193

http://www.up-tech.com博创科技(UP-TECH)

Page 194: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

然后,将这个设备(/dev/ram )挂装在名为 /mnt 的临时目录上并且复制所有必需的文件。一旦复制完这些文件,就卸装这个文件系统并且设备(/dev/ram )的内容被转储到一个文件(ext2ramdisk )中,它就是所需的 Ramdisk (Ext2 文件系统)。

上面的顺序创建了一个 4 MB 的 Ramdisk ,并用必需的文件实用程序来填充它。

一些要包含在 Ramdisk 中的重要目录是: /bin — 保存大多数象 init 、busybox 、shell 、文件管理实用程序等二进制文件。 /dev — 包含用在设备中的所有设备节点 /etc — 包含系统的所有配置文件 /lib — 包含所有必需的库,如 libc 、libdl 等

3 . 日志闪存文件系统JFFS2

瑞典的 Axis Communications 开发了最初的 JFFS ,Red Hat 的 David Woodhouse 对它进行了改进。 第二个版本,JFFS2 ,作为用于微型嵌入式设备的原始闪存芯片的实际文件系统而出现。JFFS2 文件系统是日志结构化的,这意味着它基本上是一长列节点。每个节点包含有关文件的部分信息 — 可能是文件的名称、也许是一些数据。相对于 Ext2fs ,JFFS2 因为有以下这些优点而在无盘嵌入式设备中越来越受欢迎: (1) JFFS2 在扇区级别上执行闪存擦除/写/读操作要比 Ext2 文件系统好。 (2) JFFS2 提供了比 Ext2fs 更好的崩溃/掉电安全保护。当需要更改少量数据时 ,Ext2 文件系统将整个扇区复制到内存(DRAM)中,在内存中合并新数据,并写回整个扇区。这意味着为了更改单个字,必须对整个扇区(64 KB)执行读/擦除/写例程 — 这样做的效率非常低。要是运气差,当正在 DRAM 中合并数据时,发生了电源故障或其它事故,那么将丢失整个数据集合,因为在将数据读入 DRAM 后就擦除了闪存扇区。JFFS2 附加文件而不是重写整个扇区,并且具有崩溃/掉电安全保护这一功能。 这可能是最重要的一点:JFFS2 是专门为象闪存芯片那样的嵌入式设备创建的,所以它的整个设计提供了更好的闪存管理。

因为本文主要是写关于闪存设备的使用,所以在嵌入式环境中使用 JFFS2 的缺点很少: 当文件系统已满或接近满时,JFFS2 会大大放慢运行速度。这是因为垃圾收集的问题。4. YAFFS 文件系统

YAFFS,Yet Another Flash File System ,是一种类似于JFFS/JFFS2 的专门为Flash 设计的嵌入式文件系统。与JFFS 相比,它减少了一些功能,因此速度更快、占用内存更少。YAFFS和JFFS 都提供了写均衡,垃圾收集等底层操作。它们的不同之处在于:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

194

http://www.up-tech.com博创科技(UP-TECH)

Page 195: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

(1 )、JFFS 是一种日志文件系统,通过日志机制保证文件系统的稳定性。YAFFS仅仅借鉴了日志系统的思想,不提供日志机能,所以稳定性不如JAFFS ,但是资源占用少。(2 )、JFFS 中使用多级链表管理需要回收的脏块,并且使用系统生成伪随机变量决定要回收的块,通过这种方法能提供较好的写均衡,在YAFFS中是从头到尾对块搜索,所以在垃圾收集上JFFS 的速度慢,但是能延长NAND的寿命。(3 )、JFFS 支持文件压缩,适合存储容量较小的系统;YAFFS不支持压缩,更适合存储容量大的系统。 YAFFS 还带有NAND芯片驱动,并为嵌入式系统提供了直接访问文件系统的API ,用户可以不使用Linux 中的MTD 和VFS ,直接对文件进行操作。NAND Flash 大多采用MTD+YAFFS 的模式。MTD ( Memory Technology Devices ,内存技术设备)是对Flash 操作的接口,提供了一系列的标准函数,将硬件驱动设计和系统程序设计分开。5. tmpfs 当 Linux 运行于嵌入式设备上时,该设备就成为功能齐全的单元,许多守护进程会在

后台运行并生成许多日志消息。另外,所有内核日志记录机制,象 syslogd 、dmesg 和 klogd ,会在 /var 和 /tmp 目录下生成许多消息。由于这些进程产生了大量数据,所以允许将所有这些写操作都发生在闪存是不可取的。由于在重新引导时这些消息不需要持久存储,所以这个问题的解决方案是使用 tmpfs。

tmpfs 是基于内存的文件系统,它主要用于减少对系统的不必要的闪存写操作这一唯一目的。因为 tmpfs 驻留在 RAM 中,所以写/读/擦除的操作发生在 RAM 中而不是在闪存中。因此,日志消息写入 RAM 而不是闪存中,在重新引导时不会保留它们。tmpfs 还使用磁盘交换空间来存储,并且当为存储文件而请求页面时,使用虚拟内存(VM )子系统。 tmpfs 的优点包括: (1) 动态文件系统大小 — 文件系统大小可以根据被复制、创建或删除的文件或目录的数量来缩放。使得能够最理想地使用内存。 (2) 速度 — 因为 tmpfs 驻留在 RAM ,所以读和写几乎都是瞬时的。即使以交换的形式存储文件,I/O 操作的速度仍非常快。

tmpfs 的一个缺点是当系统重新引导时会丢失所有数据。因此,重要的数据不能存储在 tmpfs 上。

6. cramfs 的特点注:引用地址:http://blog.chinaunix.net/u/19942/showart.php?id=128600

在嵌入式的环境之下,内存和外存资源都需要节约使用。如果使用RAMDISK 方式来使用文件系统,那么在系统运行之后,首先要把外存(Flash) 上的映像文件解压缩到内存

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

195

http://www.up-tech.com博创科技(UP-TECH)

Page 196: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

中,构造起RAMDISK 环境,才可以开始运行程序。但是它也有很致命的弱点。在正常情况下,同样的代码不仅在外存中占据了空间( 以压缩后的形式存在) ,而且还在内存中占用了更大的空间( 以解压缩之后的形式存在) ,这违背了嵌入式环境下尽量节省资源的要求。

使用cramfs 就是一种解决这个问题的方式。cramfs 是一个压缩式的文件系统,它并不需要一次性地将文件系统中的所有内容都解压缩到内存之中,而只是在系统需要访问某个位置的数据的时侯,马上计算出该数据在cramfs 中的位置,将其实时地解压缩到内存之中,然后通过对内存的访问来获取文件系统中需要读取的数据。cramfs 中的解压缩以及解压缩之后的内存中数据存放位置都是由cramfs 文件系统本身进行维护的,用户并不需要了解具体的实现过程,因此这种方式增强了透明度,对开发人员来说,既方便,又节省了存储空间。cramfs 拥有以下一些特性:

1) 采用实时解压缩方式,但解压缩的时侯有延迟。2) cramfs 的数据都是经过处理、打包的,对其进行写操作有一定困难。所以

cramfs 不支持写操作,这个特性刚好适合嵌入式应用中使用Flash 存储文件系统的场合。3) 在cramfs 中,文件最大不能超过16MB 。4) 支持组标识(gid) ,但是mkcramfs只将gid 的低8 位保存下来,因此只有这8

位是有效的。5) 支持硬链接。但是cramfs 并没有完全处理好,硬链接的文件属性中,链接数仍

然为1.6) cramfs 的目录中,没有“.” 和“..” 这两项。因此,cramfs 中的目录的链接数

通常也仅有一个。cramfs 中,不会保存文件的时间戳(timestamps) 信息。当然,正在使用的文件由

于 inode 保存在内存中,因此其时间可以暂时地变更为最新时间,但是不会保存到cramfs 文件系统中去。当前版本的cramfs 只支持PAGE_CACHE_SIZE 为4096 的内核。因此,如果发现

cramfs 不能正常读写的时侯,可以检查一下内核的参数设置。2 、使用cramfs

可以从http://sourceforge.net/projects/cramfs/ 下载cramfs-1.1.tar.gz 。然后执行

tar zxvf cramfs-1.1.tar.gz进入解包之后生成cramfs-1.1 目录,执行编译命令:Make编译完成之后,会生成mkcramfs和cramfsck 两个工具,其中cramfsck 工具是用

来创建cramfs 文件系统的,而mkcramfs工具则用来进行cramfs 文件系统的释放以及检查。

下面是mkcramfs的命令格式:mkcramfs [-h] [-e edition] [-i file] [-n name] dirname outfilemkcramfs的各个参数解释如下:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

196

http://www.up-tech.com博创科技(UP-TECH)

Page 197: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

-h:显示帮助信息-e edition :设置生成的文件系统中的版本号-i file :将一个文件映像插入这个文件系统之中( 只能在Linux2.4.0 以后的内核版本中使用)-n name :设定cramfs 文件系统的名字dirname :指明需要被压缩的整个目录树outfile :最终输出的文件cramfsck 的命令格式:cramfsck [-hv] [-x dir] filecramfsck 的各个参数解释如下:-h:显示帮助信息-x dir :释放文件到dir 所指出的目录中-v:输出信息更加详细file :希望测试的目标文件

5.3 嵌入式Linux 中的MTD 驱动层要使 用 Cramfs 或 YAFFS 文件 系 统 ,离不 开 MTD 驱动程序层的支持 。

MTD(Memory Technology Device) 是Linux 中的一个存储设备通用接口层, 虽然也可以建立在RAM 上,但它是专为基于Flash 的设备而设计的。MTD 包含特定Flash 芯片的驱动程序,并且越来越多的芯片驱动正被添加进来。用户要使用MTD ,首先要选择适合自己系统的Flash 芯片驱动。Flash 芯片驱动向上层提供读、写、擦除等基本的Flash 操作方法。MTD 对这些操作进行封装后向用户层提供MTD char 和MTD block 类型的设备MTD char 类型的设备包括/dev/mtd0 , /dev/mtdI等· 它们提供对Flash 的原始字符访问;MTD block类型的设备包括/dev/ mtdblock0 、/dev/ mtdblockl 等MTD block 设备是将Flash 模拟成块设备。这样可以在这些模拟的块设备上创建像YAFFS 或Cramfs等格式的文件系统。另外,MTD 支持CFI (Common Flash Interface) 接口。利用它可以在一块Flash 存储

芯片上创建多个Flash 分区。每一个分区作为一个MTD block 设备,可以把系统软件和数据等分配到不同的分区上, 同时可以在不同的分区上采用不同的文件系统格式。分区的方法在下文中有详细介绍。5.3 嵌入式根文件系统 如果您熟悉Linux 操作系统环境,您应该熟悉Linux 下的根文件系统目录结构。文件系统的顶层目录有其习惯的用法和目的,下边的列表显示了文件系统目录结构及其习惯用法。目录 习惯用法 bin 用户命令所在目录dev 硬件设备文件及其它特殊文件et c 系统配置文件,包括启动文件等home   多用户主目录lib   链接库文件目录mnt 装配点, 用于装配临时文件系统或其他的文件系统

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

197

http://www.up-tech.com博创科技(UP-TECH)

Page 198: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

opt 附加的软件套件目录proc 虚拟文件系统,用来显示内核及进程信息root root 用户主目录sbin 系统管理员命令目录tmp 临时文件目录usr 用户命令目录var 监控程序和工具程序所存放的可变数据

对于 用途单一 的嵌 入式 系统 ,上边的 一些 用于 多用 户的 目录可以省略,例如 /home 、/opt、/root 目录等。而/bin、/dev 、/etc、/lib 、/proc 、/sbin 和/usr目录,是几乎每个系统必备的目录,也是不可或缺的目录。 

六、实验步骤1 . UP-CUP S2410 经典平台 Linux 文件系统构建方案:1 .1 根文件系统:根文件系统是系统启动时挂载的第一个文件系统,其他的文件系统需要在跟文件系统

目录中建立节点后再挂载。UP-CUP S2410 经典平台有一个64M 大小的NANDFLASH ,根文件系统和用户

文件系统建立在该flash 的后大半部分。该flash 的前小半部分用来存放bootloader 和kernel 映像。根文件系统选用了Cramfs 文件系统格式。1 .2 .用户YAFFS文件系统:由于Cramfs 为只读文件系统,为了得到可读写的文件系统,用户文件系统采用

YAFFS格式。用户文件系统挂载于根文件系统下的/mnt/yaffs 目录。1 .3 临时文件系统: 为了避免频繁的读写操作对Flash 造成的伤害,系统对频繁的读写操作的文件夹采用了Ramfs 文件系统。根目录下的/var,/tmp 目录为Ramfs 临时文件系统的挂载点。2 文件系统构建流程

在嵌人式Linux 系统中混合使用Cramfs 、YAFFS和Ramfs 三种文件系统的实现思路如下:配置内核:将内核对MTD ,Cramfs ,YAFFS以及Ramfs 文件系统的支持功能编

译进内核。划分Flash 分区: 对Flash 物理空间进行分区,以便在不同的分区上存放不同的数据,采用不同的文件系统格式; 必要时编写MAPS文件。今修改系统脚本: 在系统启动后利用脚本挂载文件系统。今创建文件系统镜像文件: 利用工具生成文件系统镜像文件,并通过Flash 烧写工具将镜像文件烧写到Flash 物理空间。这几个步骤的详细过程如下。2.1 内核配置(运行make menuconfig)

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

198

http://www.up-tech.com博创科技(UP-TECH)

Page 199: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

(1) 配置MTD· 要使用Cramfs 和YAFFS文件系统,首先需要配置MTD. 在Memory Technology Devices (MTD) --->选项中选中如下选项:<*> Memory Technology Device (MTD) support MTD支持[*] MTD partitioning support MTD 分区支持<*> Direct char device access to MTD devices 字符设备的支持 <*> Caching block device access to MTD devices 块设备支持NAND Flash Device Drivers ---> 对NAND Flash的支持

<*> SMC Device Support<*> Simple Block Device for Nand Flash(BON FS)<*> SMC device on S3C2410 SMDK[*] Use MTD From SMC

(2) 配置文件系统。<*> Kernel automounter version 4 support (also supports v3) 文件系统自动挂载支持<*> DOS FAT fs supportt fs support 对DOS/FAT 文件系统的支持<*> VFAT (Windows-95) fs support<*> Yaffs filesystem on NAND 对YAFFS文件系统的支持<*> Compressed ROM file system support 对Cramfs 文件系统的支持[*] Virtual memory file system support (former shm fs) 对temfs文件系统的支持<*> Simple RAM-based file system support [*] /proc file system support 对/proc 和/dev 设备文件系统的支持 [*] /dev file system support (EXPERIMENTAL) /dev 设备文件系统支持[*] Automatically mount at boot 启动时自动挂载的支持[*] /dev/pts file system for Unix98 PTYs

Network File Systems ---> 对NFS网络文件系统的支持<*> NFS file system support [*] Provide NFSv3 client support

2.2 根文件系统的实现制作Cramfs 格式的根文件系统:一个使用linux 内核的嵌入式系统中的root 文件系统必须包括支持完整linux 系统的

全部东西,因此,它至少应包括:基本文件系统结构;至少含有目录 /dev 、/proc 、/bin 、/etc 、/lib 、/usr ;最基本的应用程序,如sh、ls 、cp、mv 等;最低限度的配置文件,如inittab 、fstab等;设备:/dev/null 、/dev/console 、/dev/ tty* 、/dev/ttyS* 、对应flash分区的设备节点等;基本程序运行所需的函数库。但由于嵌入式系统资源相对紧缺,在构建的时候要根据系统进行定制。由于条件及时间有限,实验中仅介绍了其中的一部分,有兴趣的同学可以自己尝试进

行其他的工作。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

199

http://www.up-tech.com博创科技(UP-TECH)

Page 200: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

小 型 嵌 入 式 Linux 系 统安排 root 文件 系 统 时 有 一 个常用 的利器 :BusyBox 。Busybox 是 Debian GNU/Linux 的大名鼎鼎的 Bruce Perens 首先开发,使用在 Debian 的安装程序中。后来又有许多 Debian developers 贡献力量,这其中尤推 busybox 目前的维护者 Erik Andersen ,他患有癌症,可是却是一名优秀的自由软件开发者。

Busybox 编译出一个单个的独立执行程序,就叫做 busybox 。但是它可以根据配置,执行 ash shell 的功能,以及几十个各种小应用程序的功能。这其中包括有一个迷您的 vi 编辑器,以及其他诸如 sed, ifconfig, mkdir, mount, ln, ls, echo, cat ... 等等这些都是一个正常的系统上必不可少的,但是如果我们把这些程序的原件拿过来的话,它们的体积加在一起,让人吃不消。可是 busybox 有全部的这么多功能,大小也不过 100K 左右。而且,用户还可以根据自己的需要,决定到底要在 busybox 中编译进哪几个应用程序的功能。这样的话,busybox 的体积就可以进一步缩小了。

将文件系统放置到开发板之前需要用mkcramfs工具打包,我们所使用的物理文件系统是 cramfs , 这 个 工 具 可 以 将 制 作好的文件 系 统按照 cramfs 支持 的 格 式进行压缩。Mkcramfs 工具的生成和具体参数的使用在上边已有说明。实验步骤如下:[root@vm-dev ~]#cd /arm2410cl/exp[root@vm-dev exp]# mkdir rootfs[root@vm-dev exp]#cd rootfs/[root@vm-dev rootfs]#cp –arf /arm2410cl/rootfs/busybox-1.00-

pre10/ /arm2410cl/root/ .[root@vm-dev rootfs]#cp –arf /arm2410cl/rootfs/mkfs.cramfs .[root@vm-dev rootfs]#cp –arf /arm2410cl/rootfs/target root[root@vm-dev rootfs]# ls busybox-1.00-pre10 mkfs.cramfs root [root@vm-dev rootfs]# cd busybox-1.00-pre10/[root@vm-dev busybox-1.00-pre10]#

注:busybox-1.00-pre10 为busybox 工具源代码,root 为ARM2410-CL 教学平台的发布版根文件系统内容。a) 、配置,安装busybox make menuconfig配置界面如图所示:进行到这一步时注意:

General Configuration --->[*] Use the devpts filesystem for Unix98 PTYs

Build Options --->

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

200

http://www.up-tech.com博创科技(UP-TECH)

Page 201: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

[*] Build BusyBox as a static binary (no shared libs) [*] Do you want to build BusyBox with a Cross Compiler?

选择交叉编译(/opt/host/armv4l/bin/armv4l-unknown-linux-gcc) Cross Compiler prefix 回车将路径改为/opt/host/armv4l/bin/armv4l-unknown-linux-

Installation Options ---> [ ] Don't use /usr Init Utilities ---> 全都不要

busybox 配置界面Login/Password Management Utilities ---> 全都不要Networking Utilities --->

* make dep* make

* make PREFIX=./root install注意:若make dep不起作用,请在busybox-1.00-pre10/ 目录下用“rm  ./.depe

nd”  命令删除.depend 文件,该文件保存了上次编译的依赖关系编译完后,会在当前目录下生成root 目录,该目录内容如下:

[root@BC busybox-1.00-pre10]# ls root/bin linuxrc sbin usr

bin linuxrc sbin usr 目录中包含了常用到的命令,这些命令可以替代ARM2410-S教学平台的发布版根文件系统相应目录的命令。b )、替代教学平台原根文件系统相应目录

cd /arm2410cl/exp/rootfs/root/ rm -rf bin/ sbin/ usr/

cp -arf /arm2410cl/exp/rootfs/busybox-1.00-pre10/root/* .

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

201

http://www.up-tech.com博创科技(UP-TECH)

Page 202: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

c) 、生成Cramfs 文件系统cd /arm2410cl/exp/rootfs/mkcramfs root root.cramfs

d) 、烧写根文件系统(root) (参考《2410 经典版快速开始手册2.0.pdf 》) 启动vivi

vivi>load flash root x 回车 当出现Ready for downloading using xmodem... Waiting... §§§§§§§§§§§§... 点击超级终端任务栏上“传送”下拉菜单中的“发送文件”,选择好镜像文件root.cramfs, 协议为Xmodem, 点击“发送" ,8 分钟左右root.cramfs烧写完毕;

第五章 驱动模块实验

5.1 内核驱动设计入门-模块方式驱动实验

一、实验目的

学习在LINUX 下进行驱动设计的原理 掌握使用模块方式进行驱动开发调试的过程

二、实验内容

在PC 机上编写简单的虚拟硬件驱动程序并进行调试,实验驱动的各个接口函数的实现,分析并理解驱动与应用程序的交互过程。

三、预备知识

有C 语言基础。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

202

http://www.up-tech.com博创科技(UP-TECH)

Page 203: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

掌握在Linux 下常用编辑器的使用。 掌握Makefile 的编写和使用。 掌握Linux 下的程序编译与交叉编译过程。 有驱动开发的基本知识。

四、实验设备及工具

硬件:PC 机Pentium 500 以上, 硬盘40G 以上, 内存大于128M 。软件:PC 机操作系统REDHAT LINUX 9.0 +MINICOM + AMR-LINUX 开发环

五、实验原理

Linux 中的驱动设计是嵌入式Linux 开发中十分重要的部分,它要求开发者不仅要熟悉Linux 的内核机制、驱动程序与用户级应用程序的接口关系、考虑系统中对设备的并发操作等等,而且还要非常熟悉所开发硬件的工作原理。这对驱动开发者提出了比较高的要求,这个实验主要是给大家进入驱动设计提供一个简单入门的一个实例,并不需要提供太多与硬件相关的内容,这部分应该是通过仔细阅读芯片厂家提供的资料来解决。驱动程序的作用是应用程序与硬件之间的一个中间软件层,驱动程序应该为应用程序展现硬件的所有功能,不应该强加其他的约束,对于硬件使用的权限和限制应该由应用程序层控制。但是有时驱动程序的设计是跟所开发的项目相关的,这时就可能在驱动层加入一些与应用相关的设计考虑,主要是因为在驱动层的效率比应用层高,同时为了项目的需要可能只强化或优化硬件的某个功能,而弱化或关闭其他一些功能;到底需要展现硬件的哪些功能全都由开发者根据需要而定。驱动程序有时会被多个进程同时使用,这时我们要考虑如何处理并发的问题,就需要调用一些内核的函数使用互斥量和锁等机制。驱动程序主要需要考虑下面三个方面:提供尽量多的选项给用户,提高驱动程序的速度和效率,尽量使驱动程序简单,使之易于维护。Linux 的驱动开发调试有两种方法,一种是直接编译到内核,再运行新的内核来测试;二是编译为模块的形式,单独加载运行调试。第一种方法效率较低,但在某些场合是唯一的方法。模块方式调试效率很高,它使用insmod 工具将编译的模块直接插入内核,如果出现故障,可以使用rmmod 从内核中卸载模块。不需要重新启动内核,这使驱动调试效率大大提高。我们的实验在PC 机和UP-CUP S2410 经典平台上都可以运行,编译时使用不同的编译器就可以了。1.驱动程序与应用程序的区别应用程序一般有一个main 函数,从头到尾执行一个任务;驱动程序却不同,它没有main 函数,通过使用宏module_init( 初始化函数名); 将初始化函数加入内核全局初

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

203

http://www.up-tech.com博创科技(UP-TECH)

Page 204: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

始化函数列表中,在内核初始化时执行驱动的初始化函数,从而完成驱动的初始化和注册,之后驱动便停止等待被应用软件调用。驱动程序中有一个宏moudule_exit( 退出处理函数名) 注册退出处理函数。它在驱动退出时被调用。应用程序可以和GLIBC库连接,因此可以包含标准的头文件,比如<stdio.h> <stdlib.h>, 在驱动程序中是不能使用标准C 库的,因此不能调用所有的C 库函数,比如输出打印函数只能使用内核的printk函数,包含的头文件只能是内核的头文件,比如<linux/module.h> 。2. 内核版本与编译器的版本依赖当模块与内核链接时,insmod 会检查模块和当前内核版本是否匹配,每个模块都定义了版本符号__module_kernel_version, 这个符号位于模块文件的ELF头的.modinfo 段中。只要在模块中包含<linux/module.h> ,编译器就会自动定义这个符号。每个内核版本都需要特定版本的编译器的支持,高版本的编译器并不适合低版本的内核,比如UP-CUP S2410 经典平台实验仪中的LINUX-2.4.19 的内核需要2.95.3 的GCC版本编译器。Linux-2.4 版本的insmod 命令装载模块时,首先从/lib/modules 目录和内核相关的子目录中查找模块文件,如果需要从当前目录装载,使用insmod module.o 。3. 主设备号和次设备号传统方式中的设备管理中, 除了设备类型外, 内核还需要一对称作主次设备号的参数, 才能唯一标识一个设备。主设备号相同的设备使用相同的驱动程序,次设备号用于区分具体设备的实例。比如PC 机中的IDE 设备,一般主设备号使用3 ,WINDOWS 下进行的分区,一般将主分区的次设备号为1 ,扩展分区的次设备号为2 、3 、4 ,逻辑分区使用5 、6….。设备操作宏MAJOR() 和MINOR() 可分别用于获取主次设备号,宏MKDEV() 用于将主设备号和次设备号合并为设备号,这些宏定义在include/linux/kdev_t.h中。对于LINUX 中对设备号的分配原则可以参考Documentation/devices.txt 。对于查看/dev 目录下的设备的主次设备号可以使用如下命令:

[/mnt/yaffs]ls /dev -l crw------- 1 root root 5, 1 Jan 1 00:00 console crw------- 1 root root 5, 64 Jan 1 00:00 cua0 crw------- 1 root root 5, 65 Jan 1 00:00 cua1 crw-rw-rw- 1 root root 1, 7 Jan 1 00:00 full drwxr-xr-x 1 root root 0 Jan 1 00:00 keyboard crw-r----- 1 root root 1, 2 Jan 1 00:00 kmemcrw-r----- 1 root root 1, 1 Jan 1 00:00 memdrwxr-xr-x 1 root root 0 Jan 1 00:00 mtddrwxr-xr-x 1 root root 0 Jan 1 00:00 mtdblockcrw-rw-rw- 1 root root 1, 3 Jan 1 00:00 nullcrw-r----- 1 root root 1, 4 Jan 1 00:00 port

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

204

http://www.up-tech.com博创科技(UP-TECH)

Page 205: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

crw------- 1 root root 108, 0 Jan 1 00:00 pppcrw-rw-rw- 1 root root 5, 2 Jan 1 00:00 ptmxcrw-r--r-- 1 root root 1, 8 Jan 1 00:00 randomlr-xr-xr-x 1 root root 4 Jan 1 00:00 root -> rd/0crw-rw-rw- 1 root root 5, 0 Jan 1 00:00 ttycrw------- 1 root root 4, 64 Jan 1 00:11 ttyS0crw------- 1 root root 4, 65 Jan 1 00:00 ttyS1crw-r--r-- 1 root root 1, 9 Jan 1 00:00 urandomcrw-rw-rw- 1 root root 1, 5 Jan 1 00:00 zero

4. 设备文件设备类型、主次设备号是内核与设备驱动程序通信时所使用的,但是对于开发应用程序的用户来说比较难于理解和记忆,所以Linux 使用了设备文件的概念来统一对设备的访问接口,在引入设备文件系统(devfs)之前Linux 将设备文件放在/dev 目录下,设备的命名一般为设备文件名+数字或字母表示的子类,例如/dev/hda1 、/dev/hda2 等。在Linux -2.4 内核中引入了设备文件系统(devfs),所有的设备文件作为一个可以挂装的文件系统,这样就可以被文件系统进行统一管理,从而设备文件就可以挂装到任何需要的地方。命名规则也发生了变化,一般将主设备建立一个目录,再将具体的子设备文件建立在此目录下。比如在UP-CUP S2410 经典平台中的MTD 设备为:/dev/mtdblock/0 。5. 设备驱动程序接口通常所说的设备驱动程序接口是指结构file_operations{} ,它定义在include/linux/fs.h 中。 file_operations 数据结构说明

struct file_operations {struct module *owner;loff_t (*llseek) (struct file *, loff_t, int);ssize_t (*read) (struct file *, char *, size_t, loff_t *);ssize_t (*write) (struct file *, const char *, size_t, loff_t *);int (*readdir) (struct file *, void *, filldir_t);unsigned int (*poll) (struct file *, struct poll_table_struct *);int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);int (*mmap) (struct file *, struct vm_area_struct *);int (*open) (struct inode *, struct file *);int (*flush) (struct file *);int (*release) (struct inode *, struct file *);int (*fsync) (struct file *, struct dentry *, int datasync);int (*fasync) (int, struct file *, int);

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

205

http://www.up-tech.com博创科技(UP-TECH)

Page 206: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

int (*lock) (struct file *, int, struct file_lock *);ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *);ssize_t (*writev) (struct file *, const struct iovec *, unsigned long, loff_t *);ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long,

unsigned long, unsigned long);#ifdef MAGIC_ROM_PTR

int (*romptr) (struct file *, struct vm_area_struct *);#endif /* MAGIC_ROM_PTR */};

file_operations 结构是整个Linux 内核的重要数据结构,它也是file{} 、inode{} 结构的重要成员,表5.1.1 中分别说明结构中主要的成员:

表5.1.1 file_operations 结构Owner module的拥有者。Llseek 重新定位读写位置。Read 从设备中读取数据。Write 向字符设备中写入数据。

Readdir 只用于文件系统,对设备无用。Ioctl 控制设备,除读写操作外的其他控制命令。

Mmap 将设备内存映射到进程地址空间,通常只用于块设备。Open 打开设备并初始化设备。Flush 清除内容,一般只用于网络文件系统中。

Release 关闭设备并释放资源。Fsync 实现内存与设备的同步,如将内存数据写入硬盘。Fasync 实现内存与设备之间的异步通讯。Lock 文件锁定,用于文件共享时的互斥访问。Readv 在进行读操作前要验证地址是否可读。Writev 在进行写操作前要验证地址是否可写。

在嵌入式系统的开发中,我们一般仅仅实现其中几个接口函数:read 、write 、ioctl 、open 、release ,就可以完成应用系统需要的功能。6.file 数据结构说明

struct file {struct list_head f_list;struct dentry *f_dentry;struct vfsmount *f_vfsmnt;struct file_operations *f_op;atomic_t f_count;

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

206

http://www.up-tech.com博创科技(UP-TECH)

Page 207: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

unsigned int f_flags;mode_t f_mode;loff_t f_pos;unsigned long f_reada, f_ramax, f_raend, f_ralen, f_rawin;struct fown_struct f_owner;unsigned int f_uid, f_gid;int f_error;unsigned long f_version;/* needed for tty driver, and maybe others */void *private_data;/* preallocated helper kiobuf to speedup O_DIRECT */struct kiobuf *f_iobuf;long f_iobuf_lock;

};

file 结构中与驱动相关的重要成员说明我们将struct file 结构指针定义为flip ,以便于下面说明。

表5.1.2 file 结构中与驱动相关的成员f_mode 标识文件的读写权限f_pos 当前读写位置,类型为loff_t 是64位的数,只能读不能写f_flag 文件标志,主要用于进行阻塞/ 非阻塞型操作时检查

f_op 文件操作的结构指针,内核在OPEN 操作时对此指针赋值。private_data Open 系统调用在调用驱动程序的open 方法前,将此指针值

NULL ,驱动程序可以将这个字段用于任何目的,一般用它指向已经分配的数据,但在内核销毁file 结构前要在release 方法中释放内存。

f_dentry 文件对应的目录项结构,一般在驱动中用filp->f_dentry->d_inode访问索引节点时用到它。

7.驱动接口的实现过程我们先看看实验代码框架

#define DEVICE_NAME "demo"static ssize_t demo_write(struct file *filp,const char * buffer, size_t count){ char drv_buf[];

copy_from_user(drv_buf , buffer, count);…}static ssize_t demo_read(struct file *filp, char *buffer, size_t count, loff_t *ppos)

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

207

http://www.up-tech.com博创科技(UP-TECH)

Page 208: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

{ char drv_buf[];copy_to_user(buffer, drv_buf,count);…. }static int demo_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg){}static int demo_open(struct inode *inode, struct file *file){}static int demo_release(struct inode *inode, struct file *filp){

MOD_DEC_USE_COUNT;DPRINTK("device release\n");return 0;

}

static struct file_operations demo_fops = {owner: THIS_MODULE,write: demo_write,read: demo_read,ioctl: demo_ioctl,open: demo_open,release:demo_release,

};

#ifdef CONFIG_DEVFS_FSstatic devfs_handle_t devfs_demo_dir, devfs_demoraw;#endif

static int __init demo_init(void){

int result;#ifdef CONFIG_DEVFS_FS

devfs_demo_dir = devfs_mk_dir(NULL, "demo", NULL);devfs_demoraw = devfs_register(devfs_demo_dir, "0", DEVFS_FL_DEFAULT,

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

208

http://www.up-tech.com博创科技(UP-TECH)

Page 209: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

demo_Major, demo_MINOR, S_IFCHR | S_IRUSR | S_IWUSR,&demo_fops, NULL);

#else SET_MODULE_OWNER(&demo_fops); result = register_chrdev(demo_Major, "scullc", &demo_fops); if (result < 0) return result; if (demo_Major == 0) demo_Major = result; /* dynamic */#endif

printk(DEVICE_NAME " initialized\n");return 0;

}

static void __exit demo_exit(void){ unregister_chrdev(demo_major, "demo"); kfree(demo_devices);

printk(DEVICE_NAME " unloaded\n");}

module_init(demo_init);module_exit(demo_exit);

其中, static struct file_operations demo_fops = {…} 完成了将驱动函数映射为标准接口,devfs_registe ()和register_chrdev()函数完成将驱动向内核注册。

static struct file_operations demo_fops = {owner: THIS_MODULE,write: demo_write,read: demo_read,ioctl: demo_ioctl,open: demo_open,release:demo_release,

};

上面的这种特殊表示方法不是标准C 的语法,这是GNU 编译器的一种特殊扩展,它使用名字对进行结构字段的初始化,它的好处体现在结构清晰,易于理解,并且避免了结构发生变化带来的许多问题。 Open 方法Open 方法提供给驱动程序初始化设备的能力,从而为以后的设备操作做好准备,此外open 操作一般还会递增使用计数,用以防止文件关闭前模块被卸载出内核。在大多数驱

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

209

http://www.up-tech.com博创科技(UP-TECH)

Page 210: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

动程序中Open 方法应完成如下工作:1. 递增使用计数2. 检查特定设备错误。3. 如果设备是首次打开,则对其进行初始化。4. 识别次设备号,如有必要修改f_op指针。5. 分配并填写filp->private_data 中的数据。

Release 方法与open 方法相反,release 方法应完成如下功能:

1. 释放由open分配的filp->private_data 中的所有内容2. 在最后一次关闭操作时关闭设备3. 使用计数减一

Read 和Write 方法ssize_t demo_write(struct file *filp,const char * buffer, size_t count,loff_t *ppos)ssize_t demo_read(struct file *filp, char *buffer, size_t count, loff_t *ppos)

read 方法完成将数据从内核拷贝到应用程序空间,write 方法相反,将数据从应用程序空间拷贝到内核。对于者两个方法,参数filp 是文件指针,count 是请求传输数据的长度,buffer是用户空间的数据缓冲区,ppos 是文件中进行操作的偏移量,类型为64 位数。由于用户空间和内核空间的内存映射方式完全不同,所以不能使用象memcpy 之类的函数,必须使用如下函数:

unsigned long copy_to_user (void *to,const void *from,unsigned long count);unsigned long copy_from_user(void *to,const void *from,unsigned long count);

Read 的返回值1. 返回值等于传递给read 系统调用的count 参数,表明请求的数据传输成功。2. 返回值大于0 ,但小于传递给read 系统调用的count 参数,表明部分数据传输成功,根据设备的不同,导致这个问题的原因也不同,一般采取再次读取的方法。

3. 返回值=0 ,表示到达文件的末尾。4. 返回值为负数,表示出现错误,并且指明是何种错误。5. 在阻塞型io 中,read调用会出现阻塞。

Write 的返回值1. 返回值等于传递给write 系统调用的count 参数,表明请求的数据传输成功。2. 返回值大于0 ,但小于传递给write 系统调用的count 参数,表明部分数据传输

成功,根据设备的不同,导致这个问题的原因也不同,一般采取再次读取的方法。3. 返回值=0 ,表示没有写入任何数据。标准库在调用write 时,出现这种情况会重复调用write 。

4. 返回值为负数,表示出现错误,并且指明是何种错误。错误号的定义参见<linux/errno.h>

5. 在阻塞型io 中,write 调用会出现阻塞。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

210

http://www.up-tech.com博创科技(UP-TECH)

Page 211: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

ioctl 方法ioctl 方法主要用于对设备进行读写之外的其他控制,比如配置设备、进入或退出某种操作模式,这些操作一般都无法通过read/write 文件操作来完成,比如在UP-CUP S2410 经典平台中的SPI 设备通道的选择操作,无法通过write 操作控制,这就是ioctl 操作的功能。用户空间的ioctl 函数的原型为:

int ioctl(inf fd,int cmd,…)

其中的…代表可变数目的参数表,实际中是一个可选参数,一般定义为:int ioctl(inf fd,int cmd,char *argp)

驱动程序中定义的ioctl 方法原型为:int (*ioctl) (struct inode *inode, struct file *file,unsigned int cmd, unsigned long arg)

inode 和 filp 两个指针对应应用程序传递的文件描述符fd,cmd 不会被修改地传递给驱动程序,可选的参数arg 则无论用户应用程序使用的是指针还是其他类型值,都以unsigned long 的形式传递给驱动。 ioctl 方法的命令编号确定由于为了防止向不该控制的设备发出正确的命令,LINUX 驱动的ioctl 方法中的cmd参数推荐使用唯一编号,编号方法并根据如下规则定义:编号分为4 个字段:1. type(类型):也称为幻数,8 位宽。2. number( 号码) :顺序数,8 位宽。3. direction(方向) :如果该命令有数据传输,就要定义传输方向,2 位宽,可使用

的数值:a) _IOC_NONEb) _IOC_READc) _IOC_WRITE

4. size(大小) :数据大小,宽度与体系结构有关,在ARM 上为14位。这些定义在<linux/ioctl.h> 中可以找到。其中还定义了一些用于构造命令号的宏:

#define _IOC_NRBITS 8#define _IOC_TYPEBITS 8#define _IOC_SIZEBITS 14#define _IOC_DIRBITS 2

#define _IOC_NRMASK ((1 << _IOC_NRBITS)-1)#define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1)#define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1)#define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1)

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

211

http://www.up-tech.com博创科技(UP-TECH)

Page 212: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

#define _IOC_NRSHIFT 0#define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS)#define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS)#define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS)#define _IOC_NONE 0U#define _IOC_WRITE 1U#define _IOC_READ 2U

#define _IOC(dir,type,nr,size) \(((dir) << _IOC_DIRSHIFT) | \ ((type) << _IOC_TYPESHIFT) | \ ((nr) << _IOC_NRSHIFT) | \ ((size) << _IOC_SIZESHIFT))

/* used to create numbers */#define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0)#define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),sizeof(size))#define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),sizeof(size))#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))

/* used to decode ioctl numbers.. */#define _IOC_DIR(nr) (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK)#define _IOC_TYPE(nr) (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)#define _IOC_NR(nr) (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK)#define _IOC_SIZE(nr) (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK)

内核目前没有使用ioctl 的cmd 参数,所以你如果自己简单定义一个如1 、2 、3 这样的命令号也是可以的。 ioctl 方法的返回值ioctl 通常实现一个基于switch 语句的各个命令的处理,对于用户程序传递了不合适的命名参数时,POSIX 标准规定应返回-ENOTTY,返回-EINVAL 是以前常见的方法。不能使用与LINUX 预定义命令相同的号码,因为这些命令号码会被内核sys_ioctl 函数识别,并且不再将命令传递给驱动的ioctl 。Linux 针对所有文件的预定义命令的幻数为“T” 。所以我们不应使用TYPE 为”T” 的幻数。 devfs_register 函数其原型为:

devfs_register ( devfs_handle_t dir, const char *name, unsigned int flags,unsigned int major, unsigned int minor, umode_t mode, void *ops, void *info)

其中的参数说明如表5.1.3 所示:表5.1.3参数说明

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

212

http://www.up-tech.com博创科技(UP-TECH)

Page 213: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

Dir 新创建的设备文件的父目录,一般设为null, 表示父目录为/devName 设备名称, 如想包含子目录, 可以直接在名字中包含’/’Flags Devfs 标志的位掩码。Major 主 设 备

号如果在flags参数中指定为DEVFS_FL_AUTO_DEVNUM,则主次设备号就无用了。

Minor 次 设 备号,

Mode 设备的访问模式Ops 设备的文件操作数据结构指针Info filp->private_data 的默认值。

8.关于阻塞型IOread 调用有时会出现当前没有数据可读,但是马上就会有数据到达,这时就会使用睡眠并等待数据的方法,这就是阻塞型IO ,write 也是同样的道理。在阻塞型IO 中涉及到如何使进程睡眠、如何唤醒,如何在阻塞的情况查看是否有数据。 睡眠与唤醒当进程等待一个事件时,应该进入睡眠,等待被事件唤醒,这主要是由等待队列这种机制来处理多个进程的睡眠与唤醒。这里要使用到如下几个函数和结构:这个结构和函数的定义在<linux/wait.h> 文件中。

wait_queue_head_t

struct __wait_queue_head {wq_lock_t lock;struct list_head task_list;

#if WAITQUEUE_DEBUGlong __magic;long __creator;

#endif};typedef struct __wait_queue_head wait_queue_head_t;

初始化函数static inline void init_waitqueue_head(wait_queue_head_t *q)

如果声明了等待队列,并完成初始化,进程就可以睡眠。根据睡眠的深浅不同,可调用sleep_on 的不同变体函数完成睡眠。一般会用到如下几个函数:

sleep_on(wait_queue_head_t *queue);interruptible_sleep_on(wait_queue_head_t *queue);sleep_on_timeout(wait_queue_head_t *queue, long timeout);

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

213

http://www.up-tech.com博创科技(UP-TECH)

Page 214: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

interruptible_sleep_on_timeout(wait_queue_head_t *queue, long timeout);wait_event(wait_queue_head_t queue,int condition);wait_event_ interruptible (wait_queue_head_t queue,int condition);

我们大多数情况下应使用“可中断”的函数,也就是带interruptible 的函数。还要注意,睡眠进程被唤醒并不一定代表有数据,也有可能被其他信号唤醒,所以醒来后需要测试condition 。9. 并发访问与数据保护

1. 可以使用循环缓冲区并且避免使用共享变量这种方法是类似于“生产者消费者问题”的处理方法,生产者向缓冲区写入数据,消费者从缓冲区读取数据。

2. 使用自旋锁实现互斥访问自旋锁的操作函数定义在<linux/spinlock.h> 文件中。其中包含了许多宏定义,主要的函数如表5.1.4 所示:

表5.1.4自旋锁德操作函数spin_lock_init(lock)) 初始化锁

spin_lock(lock) 获取给定的自旋锁spin_is_locked(lock) 查询自旋锁的状态

spin_unlock_wait(lock) ) 释放自旋锁spin_unlock(lock) 释放自旋锁

spin_lock_irqsave(lock, flags) 保存中断状态获取自旋锁spin_lock_irq(lock) 不保存中断状态获取自旋锁spin_lock_bh(lock) 获取给定的自旋锁并阻止底半部的执行

Linux 中还提供了称为读者/写者自旋锁,这种锁的类型为rwlock_t ,可以通过<linux/spinlock.h> 文件查看更详细的内容。10. 中断处理中断是所有现在微处理器的重要功能,Linux 驱动程序中对于中断的处理方法一般使用以下几个函数:请求安装某个中断号的处理程序:

extern int request_irq(unsigned int irq, void (*handler)(int, void *, struct pt_regs *), unsigned long flag,

const char * dev_name, void *dev_id);

释放中断extern void free_irq(unsigned int, void *);

request_irq 函数中的参数说明如表5.1.5 所示:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

214

http://www.up-tech.com博创科技(UP-TECH)

Page 215: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

表5.1.5 request_irq函数中的参数说明irq : 请求的中断号

void (*handler)(int, void *, struct pt_regs *), 要安装的处理函数指针unsigned long flag, 与中断管理相关的位掩码

const char * dev_name, 用于在/proc/interrupts 中显示的中断的拥有者

void *dev_id); 用于标识产生中断的设备号。其中的flag中的可以设置的位定义如表5.1.6 所示:

表5.1.6 Flag 的位定义SA_INTERRUPT 是快速中断程序,一般运行在中断禁用状

态SA_SHIRQ 中断可以在设备之间共享

SA_SAMPLE_RANDOM指出产生的中断对 /dev/random 和 /dev/urandom 设备使用的商池有贡献。从这些设备读取会返回真正的随机数。

一般我们应该在设备第一次open 时使用request_irq 函数,在设备最后一次关闭时使用free_irq 。编写中断处理函数的注意事项:中断处理程序与普通C 代码没有太大不同,不同的是中断处理程序在中断期间运行,它有如下限制:不能向用户空间发送或接受数据,不能执行有睡眠操作的函数不能调用调度函数11. 驱动的调试1 、使用printk 函数最简单的方法是使用printk函数,printk函数中可以使用附加不同的日志级别或消息优先级,如下例子:

printk(KERN_DEBUG “Here is :%s: %i \n”,__FILE,__LINE__);

上述例子中宏KERN_DEBUG 和后面的””之间没有逗号,因为宏实际是字符串,在编译时会由编译器将它和后面的文本拼接在一起。在头文件<linux/kernel.h> 中定义了8 种可用的日志级别字符串:

1 、 KERN_EMERG

2 、 KERN_ALERT

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

215

http://www.up-tech.com博创科技(UP-TECH)

Page 216: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

3 、 KERN_CRIT

4 、 KERN_ERR

5 、 KERN_WARNING

6 、 KERN_NOTICE

7 、 KERN_INFO

8 、 KERN_DEBUG

当优先级小于Console_loglevel 这个整数时,消息才能被显示到控制台,如果系统运行了klogd 和syslogd则内核将把消息输出到/var/log/messages 中。2 、使用/proc 文件系统/proc 文件系统是由程序创建的文件系统,内核利用它向外输出信息。/proc 目录下的每一个文件都被绑定到一个内核函数,这个函数在此文件被读取时,动态地生成文件的内容。典型的例子就是ps 、top 命令就是通过读取/proc 下的文件来获取他们需要的信息。大多数情况下proc 目录下的文件是只读的。使用/proc 的模块必须包含<linux/proc_fs.h> 头文件。接口函数read_proc可用与输出信息,其定义如下:

int (*read_proc)(char *page, char **start, off_t offset, int count, int *eof, void *data);

其中的参数说明如表5.1.7 所示:表5.1.7接口函数的参数说明

参数 说明Page 将要写入数据的缓冲区指针。Start 数据将要写入的页面位置。

Offset 页面中的偏移量。count 写入的字节数。

eof 指向一个整形数, 当没有更多数据时, 必须设置这个参数.data 驱动程序特定的数据指针,可用于内部使用。

函数的返回值表示实际放入页面缓冲区的数据字节数。如何建立函数与/proc 目录下的文件之间的关联使用create_proc_read_entry() 函数,其定义如下:

struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode,

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

216

http://www.up-tech.com博创科技(UP-TECH)

Page 217: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

struct proc_dir_entry *parent);

其中的参数含义说明如表5.1.8 所示:表5.1.8 create_proc_read_entry() 函数中的参数说明

Name 文件名称Mode 文件权限Parent 文件的父目录的指针,为null 时代表父目录为/proc

3 、使用ioctl 方法ioctl 系统调用会调用驱动的ioctl 方法,我们可以通过设置不同的命名号来编写一些测试函数,使用ioctl 系统调用在用户级调用这些函数进行调试。4 、使用strace 命令进行调试strace 命令是一个功能强大的工具,它可以显示用户空间的程序发出的全部系统调用,不仅可以显示调用,还可以显示调用的参数和用符号方式表示的返回值。

Strace 有几个有用的参数,如表5.1.9所示:表5.1.9 strace 的参数

-t 显示调用发生的时间-T 显示调用花费的时间-e 限定被跟踪的系统调用的类型-o 将输出重定向到一个文件

Strace 是从内核接收信息,所以它可以跟踪没有使用调试方式编译的程序。还可以跟踪一个正在运行的进程。可以使用它生成跟踪报告,交给应用程序开发人员;但是对于内核开发人员同样有用。我们可以通过每次对驱动调用的输入输出数据的检查,来发现驱动的工作是否正常。

六、程序分析

参考驱动代码demo.c 如下,其中的demo_read,demo_write函数完成驱动的读写接口功能,do_write 函数实现将用户写入的数据逆序排列,通过读取函数读取转换后的数据。这里只是演示接口的实现过程和内核驱动对用户的数据的处理。Demo_ioctl 函数演示ioctl 调用接口的实现过程。

#ifndef __KERNEL__# define __KERNEL__#endif#ifndef MODULE

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

217

http://www.up-tech.com博创科技(UP-TECH)

Page 218: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

# define MODULE#endif#include <linux/config.h>#include <linux/module.h>#include <linux/devfs_fs_kernel.h>#include <linux/init.h>#include <linux/kernel.h> /* printk() */#include <linux/slab.h> /* kmalloc() */#include <linux/fs.h> /* everything... */#include <linux/errno.h> /* error codes */#include <linux/types.h> /* size_t */#include <linux/proc_fs.h>#include <linux/fcntl.h> /* O_ACCMODE */#include <linux/poll.h> /* COPY_TO_USER */#include <asm/system.h> /* cli(), *_flags */#define DEVICE_NAME "demo"#define demo_MAJOR 254#define demo_MINOR 0static int MAX_BUF_LEN=1024;static char drv_buf[1024];static int WRI_LENGTH=0;

/*********************************************************************//*逆序排列缓冲区数据*/static void do_write(){

int i;int len = WRI_LENGTH;char tmp;for(i = 0; i < (len>>1); i++,len--){

tmp = drv_buf[len-1];drv_buf[len-1] = drv_buf[i];drv_buf[i] = tmp;

}}/*********************************************************************/static ssize_t demo_write(struct file *filp,const char *buffer, size_t count){

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

218

http://www.up-tech.com博创科技(UP-TECH)

Page 219: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

if(count > MAX_BUF_LEN)count = MAX_BUF_LEN;copy_from_user(drv_buf , buffer, count);WRI_LENGTH = count;printk("user write data to driver\n");do_write();return count;

}/*********************************************************************/static ssize_t demo_read(struct file *filp, char *buffer, size_t count, loff_t *ppos){

if(count > MAX_BUF_LEN)count=MAX_BUF_LEN;

copy_to_user(buffer, drv_buf,count);printk("user read data from driver\n");return count;

}/*********************************************************************/static int demo_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg){

switch(cmd){case 1:printk("runing command 1 \n");break;case 2:printk("runing command 2 \n");break;default:

printk("error cmd number\n");break;}return 0;

}/*********************************************************************/static int demo_open(struct inode *inode, struct file *file){

sprintf(drv_buf,"device open sucess!\n");printk("device open sucess!\n");return 0;

}/*********************************************************************/static int demo_release(struct inode *inode, struct file *filp){

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

219

http://www.up-tech.com博创科技(UP-TECH)

Page 220: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

MOD_DEC_USE_COUNT;printk("device release\n");return 0;

}/*********************************************************************/static struct file_operations demo_fops = {

owner: THIS_MODULE,write: demo_write,read: demo_read,ioctl: demo_ioctl,open: demo_open,release: demo_release,

};/*********************************************************************/#ifdef CONFIG_DEVFS_FSstatic devfs_handle_t devfs_demo_dir, devfs_demoraw;#endif/*********************************************************************/static int __init demo_init(void){#ifdef CONFIG_DEVFS_FS

devfs_demo_dir = devfs_mk_dir(NULL, "demo", NULL);devfs_demoraw = devfs_register(devfs_demo_dir, "0", DEVFS_FL_DEFAULT,

demo_MAJOR, demo_MINOR, S_IFCHR | S_IRUSR | S_IWUSR,&demo_fops, NULL);

#elseint result;

SET_MODULE_OWNER(&demo_fops); result = register_chrdev(demo_MAJOR, "scullc", &demo_fops); if (result < 0) return result;// if (demo_MAJOR == 0) demo_MAJOR = result; /* dynamic */#endif

printk(DEVICE_NAME " initialized\n");return 0;

}/*********************************************************************/static void __exit demo_exit(void){

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

220

http://www.up-tech.com博创科技(UP-TECH)

Page 221: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

unregister_chrdev(demo_MAJOR, "demo"); //kfree(demo_devices);

printk(DEVICE_NAME " unloaded\n");}/*********************************************************************/module_init(demo_init);module_exit(demo_exit);

参考Makefile 如下:KERNELDIR = /usr/src/linux#KERNELDIR = /arm2410cl/ kernel/linux-2.4.18-2410cl/INCLUDEDIR = $(KERNELDIR)/include#CROSS_COMPILE=armv41-unknown-linux-AS =$(CROSS_COMPILE)asLD =$(CROSS_COMPILE)ldCC =$(CROSS_COMPILE)gccCPP =$(CC) -EAR =$(CROSS_COMPILE)arNM =$(CROSS_COMPILE)nmSTRIP =$(CROSS_COMPILE)stripOBJCOPY =$(CROSS_COMPILE)objcopyOBJDUMP =$(CROSS_COMPILE)objdumpCFLAGS += -I..CFLAGS += -Wall -O -D__KERNEL__ -DMODULE -I$(INCLUDEDIR)TARGET = demoOBJS = demo.o hello.oSRC = demo.c hello.c

all: $(OBJS)

demo.o: demo.c$(CC) -c $(CFLAGS) $^ -o $@

hello.o: hello.c$(CC) -c $(CFLAGS) $^ -o $@

install:install -d $(INSTALLDIR)

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

221

http://www.up-tech.com博创科技(UP-TECH)

Page 222: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

install -c $(TARGET).o $(INSTALLDIR)

clean:rm -f *.o *~ core .depend

其中的:#KERNELDIR = /arm2410cl/ kernel/linux-2.4.18-2410cl/#CROSS_COMPILE= armv4l-unknown-linux-

两行宏变量定义用于使用armv4l-unknown-linux-gcc 编译器编译驱动,适用于UP-CUP S2410 经典平台平台。默认使用gcc编译器,使用X86 PC 平台。

用户测试程序test_demo.c 代码如下:#include <stdio.h>#include <stdlib.h>#include <fcntl.h>void showbuf(char *buf);int MAX_LEN=32;int main(){

int fd;int i,j,k;char buf[255];

for(i=0; i<MAX_LEN; i++){buf[i]=i;

}fd=open("/dev/demo",O_RDWR);if(fd < 0){

printf("####DEMO device open fail####\n");return (-1);

}printf("write %d bytes data to /dev/demo \n",MAX_LEN);showbuf(buf);write(fd,buf,MAX_LEN);printf("Read %d bytes data from /dev/demo \n",MAX_LEN);read(fd,buf,MAX_LEN);showbuf(buf);ioctl(fd,1,NULL);ioctl(fd,4,NULL);close(fd);

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

222

http://www.up-tech.com博创科技(UP-TECH)

Page 223: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

}void showbuf(char *buf){

int i,j=0;for(i=0;i<MAX_LEN;i++){

if(i%4 ==0)printf("\n%4d: ",j++);

printf("%4d ",buf[i]);}printf("\n*****************************************************\n");

}

七、实验步骤

1 、阅读和理解源代码进入/arm2410cl/exp/drivers/01_demo ,使用vi编辑器或其他编辑器阅读理解源代码。2 、编译驱动模块及测试程序上面介绍了在Makefile 中有两种编译方法,可以在本机上使用gcc 也可以使用交叉编译器进行编译,这里我们只首先介绍使用gcc 交叉编译的结果。

[root@vm-dev 01_demo]# make arm-linux-gcc -c -I.. -Wall -O -D__KERNEL__ -DMODULE -I/arm2410cl/kernel/linux-

2.4.18-2410cl/include demo.c -o demo.o demo.c:108: warning: initialization from incompatible pointer type arm-linux-gcc -c -I.. -Wall -O -D__KERNEL__ -DMODULE -I/arm2410cl/kernel/linux-

2.4.18-2410cl/include hello.c -o hello.o arm-linux-gcc -I.. -Wall -O -D__KERNEL__ -DMODULE -I/arm2410cl/kernel/linux-

2.4.18-2410cl/include -c -o test_demo.o test_demo.c arm-linux-gcc test_demo.o -o test_demo [root@vm-dev 01_demo]#

将生成的驱动程序 demo.o 和对应的测试程序test_demo 通过nfs 挂载的开发板上,进行测试:

[/mnt/yaffs]cd /host/exp/drivers/01_demo/ [/host/exp/drivers/01_demo]ls Makefile demo.o hello.o test.c test_demo.c demo.c hello.c readme test_demo test_demo.o [/host/exp/drivers/01_demo]insmod demo.o

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

223

http://www.up-tech.com博创科技(UP-TECH)

Page 224: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

Using demo.o Warning: loading demo will taintdthe kernel: no eicense See hmtp://www.tux.oro/lkml/#export-t ainted fir information anout tainted modules itialized [/host/exp/drivers/01_demo]ls /dev/d /dev/dcm/ /dev/demo/ /dev/dsp [/host/exp/drivers/01_demo]ls /dev/demo/0 /dev/demo/0[/host/exp/drivers/01_demo]./test_demo

如果使用本地gcc 编译,要求开发主机的内核系统必须是2.4 内核,并且修改Makefile 文件,指定新的本地开发主机的内核路径,例如;/usr/src/linux 参考Makefile 定义如下:KERNELDIR = /usr/src/linux

[root@zxt /]# cd /arm2410cl/exp/drivers/01_demo/[root@zxt 01_demo]# makegcc -c -I.. -Wall -O -D__KERNEL__ -DMODULE -I/usr/src/linux/include demo.c -o

demo.odemo.c:108: warning: initialization from incompatible pointer typegcc -c -I.. -Wall -O -D__KERNEL__ -DMODULE -I/usr/src/linux/include hello.c -o hello.ogcc -I.. -Wall -O -D__KERNEL__ -DMODULE -I/usr/src/linux/include -c -o test_demo.o

test_demo.cgcc test_demo.o -o test_demo

注意:如果编译的时候出现问题,可能是在/usr/src 下没有建立一个linux 连接,可以使用下面的命令:

[root@zxt 01_demo]# cd /usr/src/[root@zxt src]# ln -sf linux-2.4.20-8 linux[root@zxt src]# lsdebug linux linux-2.4 linux-2.4.20-8 redhat

3 、测试驱动程序如果使用gcc编译的话,需要通过下面的命令来建立设备节点,如果使用交叉编译器的话,不需要建立设备节点。

#mknod /dev/demo c 254 0

首先要插入驱动模块demo.o ,然后可以用lsmod 命令来查看模块是否已经被插入,在不使用该模块的时候还可以用rmmod 命令来将模块卸载。

[root@zxt 01_demo]# insmod demo.oWarning: loading demo.o will taint the kernel: no license See http://www.tux.org/lkml/#export-tainted for information about tainted modules

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

224

http://www.up-tech.com博创科技(UP-TECH)

Page 225: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

Module demo loaded, with warnings

下面使用测试程序来进行测试,按照上面步骤成功后会出现下面的结果:[root@zxt 01_demo]# ./test_demowrite 32 bytes data to /dev/demo

0: 0 1 2 3 1: 4 5 6 7 2: 8 9 10 11 3: 12 13 14 15 4: 16 17 18 19 5: 20 21 22 23 6: 24 25 26 27 7: 28 29 30 31*****************************************************Read 32 bytes data from /dev/demo

0: 31 30 29 28 1: 27 26 25 24 2: 23 22 21 11 3: 12 13 14 15 4: 16 17 18 19 5: 20 10 9 8 6: 7 6 5 4 7: 3 2 1 0*****************************************************

如果模块没有成功插入的话,会出现下面的情况:[root@zxt 01_demo]# ./test_demo####DEMO device open fail####

在驱动模块成功插入后,会在/dev 下面建立一个叫做demo 的设备文件,我们也可以使用cat 命令来直接调用read函数,来测试读过程。

[root@zxt 01_demo]# cat /dev/demodevice open success!

八、思考题

1 、添加一些自己的功能,修改源代码并编译调试。2 、增加一个中断驱动函数,比如PC 机并口,试验中断驱动的实现。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

225

http://www.up-tech.com博创科技(UP-TECH)

Page 226: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

5.2 内核驱动设计实验-触摸屏驱动

一、实验目的

了解在UP-CUP S2410 经典平台平台上实现触摸屏Linux 驱动程序的基本原理。 了解Linux 驱动开发的基本过程。

二、实验内容

以一个简单字符设备驱动程序为原型,剖析其基本结构。进行部分改写之后并编译实现其相应功能。

三、预备知识

掌握在Linux 集成开发环境中编写和调试程序的基本过程。 了解ARM 芯片(本实验是针对ARMS3C2410系列)的基本结构。 了解Linux 内核中关于设备控制的基本原理。

四、实验设备及工具

硬件:UP-CUP S2410 经典平台嵌入式实验仪,PC 机pentumn500 以上, 硬盘40G 以上, 内存大于128M软件:PC 机操作系统REDHAT LINUX 9.0 +MINICOM + AMRLINUX 开发环境

五、实验原理

1 、Linux 设备驱动概述Linux 设备驱动程序属于Linux 内核的一部分,并在Linux 内核中扮演着十分重要的角色。它们像一个个“黑盒子”使某个特定的硬件响应一个定义良好的内部编程接口,同时完全

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

226

http://www.up-tech.com博创科技(UP-TECH)

Page 227: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

隐蔽了设备的工作细节。用户通过一组标准化的调用来完成相关操作,这些标准化的调用是和具体设备驱动无关的,而驱动程序的任务就是把这些调用映射到具体设备对于实际硬件的特定操作上。我们可以把设备驱动作为内核的一部分,直接编译到内核中,即静态编译,也可以单独作为一个模块(module)编译,在需要它的时候再动态的把它插入到内核中。在不需要时也可把它从内核中删除,即动态连接。显然动态连接比静态连接有更多的好处,但在嵌入式开发领域往往要求进行静态连接,尤其是像S3C44B0 这种不带MMU 的芯片。但在S3C2410 等带MMU 的ARM 芯片中我们依然可以使用动态连接。目前Linux 支持的设备驱动可分为三种:字符设备(character device ),块设备(block device ),网络接口设备(network interface)。当然它们之间的也并不是要严格的加以区分。◆字符设备:所有能够像字节流一样访问的设备比如文件等在Linux 中都通过字符设备驱动程序来实现。在Linux 中它们也被映射为文件系统的一个节点,常在/dev 目录下。字符设备驱动程序一般要包含open ,close ,read ,write 等几个系统调用。◆块设备:Linux 的块设备通常是指诸如磁盘,内存,Flash 等可以容纳文件系统的存储设备。与字符设备类似,块设备也是通过文件系统来进行访问,它们之间的区别仅仅在于内核内部管理数据的方式不同。它也允许像字符设备一样的访问,可以一次传递任意多的字节。Linux 中的块设备包含整数个块,每个块包含2 的几次幂的字节。◆网络接口设备:网络接口设备是Linux 中比较复杂的一种设备,通常它们指的是硬件设备,但有时也可是一个软件设备(如回环接口loopback )。它们由内核中网络子系统驱动,负责发送和接收数据包,而且它并不需要了解每一项事务是如何映射到实际传送的数据包的。它们的数据传送往往并不是面向流的(少数如telnet,FTP 等是面向流的),所以不容易把它们映射到一个文件系统的节点上。在Linux 中采用给网络接口设备分配一个唯一名字的方法来访问该设备。由于设备驱动是沟通底层硬件与上层应用程序的桥梁,它所涉及的内容相当多。要编写一个完整的驱动程序,要求你不仅对硬件设备及其工作原理要相当熟悉,同时你必需具备一定的内核结构的知识,此外对上层应用程序及开发语言也具有比较过硬的开发能力。正是因为驱动程序自身的复杂以及有较广的牵涉面,所以我们不能期望通过一个简单的实验来达到多大的目的。在具体应用开发中会遇到很多问题,这要求读者在各方面知识都有积累之后在具体实践中去解决。我们这里将以一个简单的字符设备驱动(应用于UP -NETARM3000 上的触摸屏驱动)来讲解一下Linux 驱动开发的整个流程,同时让读者了解Linux 驱动的一些相关原理。本实验的目的并不在于让读者从头开发一个实际可用的驱动,因为作为一个单独的实验来说这不是很实际。我们的目的只是让读者对Linux 驱动程序的开发有一个整体的了解。2 、Linux 关于字符设备的管理驱动程序在Linux 内核中往往是以模块形式出现的。与应用程序的执行过程不同,模块通常只是预先向内核注册自己,当内核需要时响应请求。模块中包含两个重要的函数:init_module 和cleanup_module 。前者是模块的入口,它为模块调用做好准备工作,而后者则是在模块即将卸载时被调用,做一些清扫工作。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

227

http://www.up-tech.com博创科技(UP-TECH)

Page 228: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

驱动程序模块通过函数:int register_chrdev(unsigned int major, const char *name, struct file_operations *fops);

来完成向内核注册的。其中unsigned int major 为主设备号,const char *name为设备名,至于结构指针struct file_operations *fops 它在驱动程序中十分重要我们下还要做详细介绍。在Linux 中字符设备是通过文件系统中的设备名来进行访问的。这些名称通常放在/dev目录下,通过命令ls –l /dev 我们可以看到该目录下的一大堆设备文件,其中第一个字母是“C” 的为字符设备,而第一个字母是“b” 的为块设备文件。其中每个设备文件都具有一个主设备号(major)和一个次设备号(minor)。当驱动程序调用open 系统调用时,内核就是利用主设备号把该驱动与具体设备对应起来的。而次设备号内核并不关心,它是给主设备号已经确定的驱动程序使用的,一个驱动程序往往可以控制多个设备,如一个硬盘的多个分区,这时该硬盘拥有一个主设备号,而每个分区拥有自己的次设备号。2.0 以前版本的内核支持128个主设备号,在2.4 版内核中已经增加到256个,但显然这还是不够的。计算机技术在迅猛发展,各种外设也是层出不穷,这样主设备号就越来越显得是一种希缺资源了。当然这也就给实际开发造成麻烦,为了解决这一问题,在2.4 版本以后的内核中引入了devfs 设备文件系统,它给我们提供一套自动管理设备文件的手段,使得设备文件的管理容易了许多。下面我们还将具体介绍它。在我们编写好一个驱动程序模块后,按传统的主次设备号的方法来进行设备管理,则我们应手工为该模块建立一个设备节点。命令:

mknod /dev/ts c 254 0

其中/dev/ts 表示我们的设备名是ts,“C” 说明它是字符设备,“254” 是主设备号,“0” 是次设备号。一旦通过mknod 创建了设备文件,它就一直保留下来,除非我们手工删除它。这里要注意的是,在Linux 内核中有许多设备号已经静态的赋予一些常用设备,剩余给我们用的设备号已经不多。如果我们的设备也随意找一个空闲的设备号,并进行静态编译的话,当其它的开发者也采用类似手段分配设备号,那很快就会造成混乱。如何解决这个问题呢,比较好的方法就是采用动态分配的方法。在我们用register_chrdev 注册模块时,给major赋值为0 ,则系统就采用动态方式分配设备号。它会在所有未被使用的设备号中为我们选定一个,作为函数返回值返回给我们。一旦分配了设备号,我们就可以在/proc/devices 中看到相关内容。/proc 在前面关于操作系统移植的实验中我们已经提到,它是一个伪文件系统,它实际并不占用任何硬盘空间,而是在内核运行时在内存中动态生成的。它可以显示当前运行系统的许多相关信息。显然这一点对我们动态分配主设备号是非常有意义的。因为,正如我们前面提到的一样,我们采用主次设备号的方式管理设备文件,我们要在/dev 目录下为我们的设备创建一个设备名,可我们的设备号却是动态产生的,每次都不一样,这样我们就不得不每次都从新运行一次mknod 命令。这个过程我们通常通过编写自动执行脚本来完成,而其中的主设备号我们就可以通过/proc/devices 中获得。当设备模块被卸载时我们往往也会通过一个卸载脚本来显示的删除/dev 中相关设备名,这是一个比较好的习惯,因为内核报找不到相关设备文件,总比内核找到一个错误的驱动去执行要好得多!

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

228

http://www.up-tech.com博创科技(UP-TECH)

Page 229: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

前面已经提到了file_operations 这个结构。内核就是通过这个结构来访问驱动程序的。在内核中对于一个打开的文件,包括一个设备文件,都用file 结构来标志,而我们常给出一个file_operations 类型的结构指针,一般命名为fops 来指向该file 结构。可以说file 与file_operations 这两个结构就是驱动设备管理中最重要的两个结构。在file_operations 结构中每个字段都必须指向驱动程序中实现特定的操作函数。对于不支持的操作,对应字段就被置为NULL 。这样随着内核不断增加新功能,file_operations结构也就变得越来越庞大。现在的内核开发人员采用一种叫“标记化”的方法来为该结构进行初始化。即对驱动中用到的函数记录到相应字段中,没有用到的就不管。这样代码就精简了许多。结构体file_operations 在头文件linux/fs.h 中定义的,在内核2.4 版内核中我们可以看到file_operations 结构常是如下的一种定义:

struct file_operations { struct module *owner;// 标示模块拥有者。 loff_t (*llseek) (struct file *, loff_t, int);//loff_t 是一个64位的长偏移数,llseek 方法标示当前文件的操作位置。 ssize_t (*read) (struct file *, char *, size_t, loff_t *);//ssize_t (signed size )表示当前平台的固有整数类型。Read 是读函数。 ssize_t (*write) (struct file *, const char *, size_t, loff_t *);// 写函数。 int (*readdir) (struct file *, void *, filldir_t);//readdir 方法用于读目录,其只对文件系统有效。 unsigned int (*poll) (struct file *, struct poll_table_struct *);// 该方法用于查询设备是否可读,可写或处于某种状态。当设备不可读写时它们可以

被阻塞直至设备变为可读或可写。如果驱动程序中没有定义该方法则它驱动的设备就会被认为是可读写的。

int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);//ioctl 是一个系统调用,它提供了一种执行设备特定命令的方法。 int (*mmap) (struct file *, struct vm_area_struct *);// 该方法请求把设备内存映射到进程地址空间。 int (*open) (struct inode *, struct file *);// 即打开设备文件,它往往是设备文件执行的第一个操作。 int (*flush) (struct file *);// 进程在关闭设备描述符副本之前会调用该方法,它会执行设备上尚未完成的操作。 int (*release) (struct inode *, struct file *);// 当file 结构被释放时就会调用该方法。 int (*fsync) (struct file *, struct dentry *, int datasync);// 该方法用来刷新待处理的数据。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

229

http://www.up-tech.com博创科技(UP-TECH)

Page 230: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

int (*fasync) (int, struct file *, int);// 即异步通知它是比较高级功能这里不作介绍。 int (*lock) (struct file *, int, struct file_lock *);// 该方法用来实现文件锁定。 ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *);// 应用程序有时需要进行涉及多个内存区域的单次读写操作,利用该方法以及下面的

writev 可以完成这类操作。 ssize_t (*writev) (struct file *, const struct iovec *, unsigned long, loff_t *);

};

前面已经提到,我们目前采用的是“标记化”方法来为该结构赋值。在我们下面要给出的代码中我们可以看到如下一段:

static struct file_operations s3c44b0_fops = {owner: THIS_MODULE,open: s3c44b0_ts_open,read: s3c44b0_ts_read,release: s3c44b0_ts_release,poll: s3c44b0_ts_poll,

};

它只对我们需要的函数赋值,对不需要的没有进行操作。这样使得代码结构更为清晰。下面要讲到的是另一个重要的结构——file ,它也定义在头文件linux/fs.h 中。它代表一个打开的文件,由内核在调用open 时创建。并传递给在该文件上进行操作的所有函数,直到最后的close 函数被调用。在文件的所有实例都关闭时,内核释放这个数据结构。下面我们对它里面的一些重要字段做一些解释:

◆ mode_t f_mode;该字段表示文件模式,它通过FMODE_READ和FMODE_WRITE 位来标示文件是否可读,可写。

◆ loff_t f_pos;该字段标示文件当前读写位置。

◆ unsigned int_f_flags;这是文件标志,如O_RDONLY ,O_NONBLOCK,O_SYNC等,驱动程序为了支持非阻塞型操作需要检查这个标志。

◆ struct file_operations *f_op;这就是对我们前面介绍的file_operations结构的操作。内核在执行open操作时对这个指

针赋值,以后需要处理这些操作时就读取这个指针。 ◆ void *private_data;

这是个应用非常灵活的字段,驱动可以把它应用于任何目的,可以把它指向已经分配的数据,但一定要在内核销毁file 结构前在release 方法中释放该内存。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

230

http://www.up-tech.com博创科技(UP-TECH)

Page 231: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

◆ struct dentry *f_dentry;它对应一个目录项结构,是一种优化的设计。3 、触摸屏的控制本系统触摸屏的控制是使用的S3c2410 处理器自带的触摸屏控制器,这部分的开发

主要参考S3c2410 处理器的芯片手册的第416页到第419页,具体详见流程图。这部分的控制主要是设置触摸屏的采样模式,处理器提供的模式:

1 .正常的转换模式2 .手动的x/y 位置转换模式3 .自动的x/y 位置转换模式我们这里使用的是第3 种转换模式。需要注意的是在完成一次x/y 坐标采样的过程中

需要一次模式转换即在点击触摸屏之前是等待中断模式,当有触摸动作产生触摸屏中断以后,在x/y 的坐标采集驱动中设置成自动的x/y 位置转换模式,在完成采集以后再转换回等待中断。

ADC 控制寄存器Register Address R/W Description

Reset Value

ADCCON 0x58000000 R/W ADC control register 0x3FC4

ADCCON Bit Description Initial State

ECFLG [15] End of conversion flag (read only). 0 = A/D conversion in process 1 = End of A/D conversion

0

PRSCEN [14] A/D converter prescaler enable. 0 = Disable 1 = Enable

0

PRSCVL [13:6] A/D converter prescaler value. Data value: 1 ~ 255 Note that division factor is (N+1) when the prescaler value is N.

0xFF

SEL_MUX [5:3] Analog input channel select. 000 = AIN 0 001 = AIN 1 010 = AIN 2 011 = AIN 3 100 = AIN 4 101 = AIN 5 110 = AIN 6 111 = AIN 7 (XP)

0

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

231

http://www.up-tech.com博创科技(UP-TECH)

Page 232: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

STDBM [2] Standby mode select. 0 = Normal operation mode 1 = Standby mode

1

READ_ START

[1] A/D conversion start by read. 0 = Disable start by read operation 1 = Enable start by read operation

0

ENABLE_ START

[0] A/D conversion starts by setting this bit. If READ_START is enabled, this value is not valid. 0 = No operation 1 = A/D conversion starts and this bit is cleared after the start-up.

0

ADC 触摸屏控制寄存器Registe

r Address R/W Description

Reset Value

ADCTSC

0x58000004 R/W ADC touch screen control register 0x058

ADCTSC Bit Description Initial State

Reserved [8] This bit should be zero. 0 YM_SEN [7] Select output value of YMON. 0 = YMON output is

0 (YM = Hi-Z). 1 = YMON output is 1 (YM = GND). 0

YP_SEN [6] Select output value of nYPON. 0 = nYPON output is 0 (YP = External voltage). 1 = nYPON output is 1 (YP is connected with AIN[5]).

1

XM_SEN [5] Select output value of XMON. 0 = XMON output is 0 (XM = Hi-Z). 1 = XMON output is 1 (XM = GND).

0

XP_SEN [4] Select output value of nXPON. 0 = nXPON output is 0 (XP = External voltage). 1 = nXPON output is 1 (XP is connected with AIN[7]).

1

PULL_UP [3] Pull-up switch enable. 0 = XP pull-up enable 1 = XP pull-up disable

1

AUTO_PST

[2] Automatically sequencing conversion of X-position and Y-position 0 = Normal ADC conversion 1 = Auto (Sequential) X/Y Position Conversion Mode

0

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

232

http://www.up-tech.com博创科技(UP-TECH)

Page 233: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

XY_PST [1:0] Manual measurement of X-position or Y-position. 00 = No operation mode 01 = X-position measurement 10 = Y-position measurement 11 = Waiting for Interrupt Mode

0

注意:在自动模式,ADC 触摸屏控制寄存器要在开始读之前重新配置ADC 开始延迟寄存器

Register

Address R/W Description Reset Value

ADCDLY

0x58000008 R/W ADC start or interval delay register 0x00ff

ADCDLY

Bit Description Initial State

DELAY [15:0]

1) Normal Conversion Mode, Separate X/Y Position Conversion Mode, and Auto (Sequential) X/Y Position Conversion Mode. X/Y Position Conversion Delay Value. 2) Waiting for Interrupt Mode.

00ff

When Stylus down occurs in Waiting for Interrupt Mode, this register generates Interrupt signal (INT_TC) at intervals of several ms for Auto X/Y Position conversion. NOTE:Do not use Zero value (0x0000)

ADC 转换数据寄存器(ADCDAT0 )Registe

r Address R/W Description

Reset Value

ADCDAT0

0x5800000C R ADC conversion data register -

ADCDAT0

Bit Description Initial State

UPDOWN

[15] Up or down state of Stylus at Waiting for Interrupt Mode. 0 = Stylus down state 1 = Stylus up state

-

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

233

http://www.up-tech.com博创科技(UP-TECH)

Page 234: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

AUTO_PST

[14] Automatic sequencing conversion of X-position and Y-position. 0 = Normal ADC conversion 1 = Sequencing measurement of X-position, Y-position

-

XY_PST [13:12]

Manual measurement of X-position or Y-position. 00 = No operation mode 01 = X-position measurement 10 = Y-position measurement 11 = Waiting for Interrupt Mode

-

Reserved [11:1

0] Reserved

XPDATA (Normal ADC)

[9:0] X-position conversion data value. (include Normal ADC conversion data value) Data value: 0 ~ 3FF

-

ADC 转换数据寄存器(ADCDAT1 )Registe

r Address R/W Description

Reset Value

ADCDAT1

0x58000010 R ADC conversion data register -

ADCDAT1

Bit Description Initial State

UPDOWN

[15]

Up or down state of Stylus at Waiting for Interrupt Mode. 0 = Stylus down state 1 = Stylus up state

-

AUTO_PST

[14] Automatically sequencing conversion of X-position and Y-position. 0 = Normal ADC conversion

-

1 = Sequencing measurement of X-position, Y-position

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

234

http://www.up-tech.com博创科技(UP-TECH)

Page 235: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

XY_PST [13:1

2]

Manual measurement of X-position or Y-position. 00 = No operation mode 01 = X-position measurement 10 = Y-position measurement 11 = Waiting for Interrupt Mode

-

Reserved [11:1

0] Reserved

YPDATA [9:0] Y-position conversion data value Data value: 0 ~ 3FF

-

4 .触摸屏相关电路图

图3-22

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

235

http://www.up-tech.com博创科技(UP-TECH)

12345678

J510

ETS-8#

ETSYM

ETSYPETSXPETSXM

Page 236: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

触摸屏电路

六、程序分析

剖析UP-CUP S2410 经典平台平台上运行的触摸屏驱动程序(s3c2410-ts.c ),该程序在/arm2410cl/kernel/linux-2.4.18-2410cl/drivers/char/s3c2410-ts.c ,具体代码如下:

/****************************************************************************

* * s3c2410-ts.c* * touchScreen driver for SAMSUNG S3C2410 Date:2004/8/18**************************************************************************

**/

#include <linux/config.h>#include <linux/module.h> // 含使用记数宏的定义。#include <linux/kernel.h>#include <linux/init.h> // 含模块初始化代码。#include <linux/miscdevice.h>#include <linux/sched.h>

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

236

http://www.up-tech.com博创科技(UP-TECH)

G1_N1

S2_P2

G2_P3 D2_P 4S1_N 5D1_N 6U506

FDC6321

G1_N1

S2_P2

G2_P3 D2_P 4S1_N 5D1_N 6U507

FDC6321nYPON

XMON

YMON

nXPON

TS2-XMON

GPG13

GPG14

GPG15

VDD33

VDD33

GND

GND

TSXM2

TSXP2

TSYM2

TSYP2

R503

4.7K

R504

4.7K

C508102

C509102

GND

GND

1

2

3 JP503AIN5-Sel

1

2

3 JP504AIN7-Sel

AIN7

AIN5

EAIN5

EAIN7

R50110K

GND

.

Page 237: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

#include <linux/delay.h>#include <linux/poll.h>#include <linux/spinlock.h> // 有关自旋锁的定义。#include <linux/irq.h>#include <linux/delay.h>

#include <asm/hardware.h>

#ifdef CONFIG_PM#include <linux/pm.h>#endif

/* debug macros */#undef DEBUG#ifdef DEBUG#define DPRINTK( x... ) printk("s3c2410-ts: " ##x)/*由于驱动主要是内核空间运行的,所以无法使用用户空间的相关库函数,这里不能

用标准C 库中的ptintf 来打印调试信息,只能用内核支持的printk 函数。*/#else#define DPRINTK( x... )#endif

#define PEN_UP 0 // 定义抬笔,即触摸屏不被压下。#define PEN_DOWN 1 // 定义下笔,即触摸屏被压下。#define PEN_FLEETING 2 // 定义拖动。#define MAX_TS_BUF 16 // 定义缓冲区大小位16字节。#define DEVICE_NAME "s3c2410-ts" // 定义了设备名以后我们就根据它来寻找该

设备。#define TSRAW_MINOR 1 // 次设备号为1 。typedef struct {

unsigned int penStatus; /* 触 摸 屏 状 态 : PEN_UP, PEN_DOWN, PEN_SAMPLE */

TS_RET buf[MAX_TS_BUF]; /* protect against overrun */unsigned int head, tail; /* head and tail for queued events */wait_queue_head_t wq;

/* 等待队列,它定义在<linux/list.h> 中,包含一个锁变量和一个正在睡眠进程链表。当有好几个进程都在等待某件事时,Linux 会把这些进程记录到这个等待队列。*/

spinlock_t lock;

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

237

http://www.up-tech.com博创科技(UP-TECH)

Page 238: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

/*使用自旋锁。自旋锁是基于共享变量来工作的,函数可以通过给某个变量设置一个特

殊值来获得锁。而其它需要锁的函数则会循环查询锁是否可用。*/ #ifdef USE_ASYNC

struct fasync_struct *aq;#endif#ifdef CONFIG_PM

struct pm_dev *pm_dev;#endif} TS_DEV; // 该结构用于记录设备运行的各种状态static TS_DEV tsdev;

#define BUF_HEAD (tsdev.buf[tsdev.head]) // 定义缓冲区头。#define BUF_TAIL (tsdev.buf[tsdev.tail]) // 定义缓冲区尾。#define INCBUF(x,mod) ((++(x)) & ((mod) - 1))/*这个宏定义使得队列操作中指针始终能指到当前队列的头或尾。当队列满了后指针重

新回到最初位置。比如我们有一个容量为8 的队列,当head 为0 时运算结果为1 ,head 为1 时运算结果为2 ,当head 为7 时运算结果为0 。有兴趣的读者自己可以取不同的数运算一次。它在以后的两行代码中用到:

tedev.head=INCBUF(tsdev.head,MAX_TS_BUF); 和tedev.tail=INCBUF(tsdev.tail,MAX_TS_BUF);*/

static int tsMajor = 0; //设置主设备号为0 ,这样我们将进行动态分配主设备号。static void (*tsEvent)(void);

#define HOOK_FOR_DRAG //设置拖动宏。 #ifdef HOOK_FOR_DRAG#define TS_TIMER_DELAY (HZ/100) /* 10 ms */static struct timer_list ts_timer; // 如果使用拖动则要启用系统定时器。#endif

#define wait_down_int(){ ADCTSC = DOWN_INT | XP_PULL_UP_EN | \XP_AIN | XM_HIZ | YP_AIN | YM_GND | \

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

238

http://www.up-tech.com博创科技(UP-TECH)

Page 239: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

XP_PST(WAIT_INT_MODE); }#define wait_up_int() { ADCTSC = UP_INT | XP_PULL_UP_EN | XP_AIN | XM_HIZ |

\YP_AIN | YM_GND | XP_PST(WAIT_INT_MODE); }

#define mode_x_axis() { ADCTSC = XP_EXTVLT | XM_GND | YP_AIN | YM_HIZ | \XP_PULL_UP_DIS | XP_PST(X_AXIS_MODE); }

#define mode_x_axis_n() { ADCTSC = XP_EXTVLT | XM_GND | YP_AIN | YM_HIZ | \

XP_PULL_UP_DIS | XP_PST(NOP_MODE); }#define mode_y_axis() { ADCTSC = XP_AIN | XM_HIZ | YP_EXTVLT | YM_GND | \

XP_PULL_UP_DIS | XP_PST(Y_AXIS_MODE); }#define start_adc_x() { ADCCON = PRESCALE_EN | PRSCVL(49) | \

ADC_INPUT(ADC_IN5) | ADC_START_BY_RD_EN | \ADC_NORMAL_MODE; \

ADCDAT0; }#define start_adc_y() { ADCCON = PRESCALE_EN | PRSCVL(49) | \

ADC_INPUT(ADC_IN7) | ADC_START_BY_RD_EN | \ADC_NORMAL_MODE; \

ADCDAT1; }#define disable_ts_adc() { ADCCON &= ~(ADCCON_READ_START); }

static int adc_state = 0;static int x, y; // 坐标值static void tsEvent_raw(void){

if (tsdev.penStatus == PEN_DOWN) {BUF_HEAD.x = x;BUF_HEAD.y = y;BUF_HEAD.pressure = PEN_DOWN;

#ifdef HOOK_FOR_DRAG ts_timer.expires = jiffies + TS_TIMER_DELAY; // 设置定时时间add_timer(&ts_timer);

#endif} else {

#ifdef HOOK_FOR_DRAG del_timer(&ts_timer);

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

239

http://www.up-tech.com博创科技(UP-TECH)

Page 240: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

#endif

BUF_HEAD.x = 0;BUF_HEAD.y = 0;BUF_HEAD.pressure = PEN_UP;

}

tsdev.head = INCBUF(tsdev.head, MAX_TS_BUF);wake_up_interruptible(&(tsdev.wq));

#ifdef USE_ASYNCif (tsdev.aq)

kill_fasync(&(tsdev.aq), SIGIO, POLL_IN);#endif

#ifdef CONFIG_PMpm_access(tsdev.pm_dev);

#endif}

static int tsRead(TS_RET * ts_ret){

spin_lock_irq(&(tsdev.lock));ts_ret->x = BUF_TAIL.x;ts_ret->y = BUF_TAIL.y;ts_ret->pressure = BUF_TAIL.pressure;tsdev.tail = INCBUF(tsdev.tail, MAX_TS_BUF);spin_unlock_irq(&(tsdev.lock));

return sizeof(TS_RET);} // 设备读取数据函数

static ssize_t s3c2410_ts_read(struct file *filp, char *buffer, size_t count, loff_t *ppos)/* 设备读函数,各参数含义:*filp打开的文件,*buffer数据缓存,count 请求传送数

据长度,*ppos 用户在文件中进行存储操作的位置。*/{

TS_RET ts_ret;

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

240

http://www.up-tech.com博创科技(UP-TECH)

Page 241: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

retry: if (tsdev.head != tsdev.tail) {

int count;count = tsRead(&ts_ret); //读取设备缓存中数据。if (count) copy_to_user(buffer, (char *)&ts_ret, count);

/*驱动程序运行在内核空间,而应用程序运行在用户空间。用户空间内存页是可被换出

的。当内核空间访问用户空间时有可能当前页并不存在而造成错误。所以当我们要从内核空间拷贝整段数据到用户空间时只能借助于内核函数:

unsigned long copy_to_user(void *to, const void *from, unsigned long count)同样从用户空间往内核空间拷贝数据也只能借助于内核函数:unsigned long copy_from_user(void *to, const void *from, unsigned long count ) 它将在驱

动程序写函数中用到,关于内存页交换读者可以参看Linux 内存管理部分资料。*/

return count;} else {

if (filp->f_flags & O_NONBLOCK) // 非阻塞return -EAGAIN;

interruptible_sleep_on(&(tsdev.wq)); //进程进入睡眠if (signal_pending(current))

return -ERESTARTSYS;goto retry;

}

return sizeof(TS_RET);} //驱动程序的读函数,它调用设备读取数据函数。#ifdef USE_ASYNCstatic int s3c2410_ts_fasync(int fd, struct file *filp, int mode) {

return fasync_helper(fd, filp, mode, &(tsdev.aq));}#endif

static unsigned int s3c2410_ts_poll(struct file *filp, struct poll_table_struct *wait){

poll_wait(filp, &(tsdev.wq), wait);/*把当前进程放入一个等待队列而不立即调度,它被设计为由设备驱动程序的poll 方

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

241

http://www.up-tech.com博创科技(UP-TECH)

Page 242: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

法使用*/return (tsdev.head == tsdev.tail) ? 0 : (POLLIN | POLLRDNORM);

} // 该函数会检查进程是否被阻塞。static inline void start_ts_adc(void) //ad 转换{

adc_state = 0;mode_x_axis();start_adc_x(); //x 轴转换

}

static inline void s3c2410_get_XY(void) // 获取ad采样值{

if (adc_state == 0) { adc_state = 1;disable_ts_adc();y = (ADCDAT0 & 0x3ff); mode_y_axis();start_adc_y(); //y 轴转换

} else if (adc_state == 1) { adc_state = 0;disable_ts_adc();x = (ADCDAT1 & 0x3ff); tsdev.penStatus = PEN_DOWN;DPRINTK("PEN DOWN: x: %08d, y: %08d\n", x, y);wait_up_int();tsEvent();

}}static void s3c2410_isr_adc(int irq, void *dev_id, struct pt_regs *reg)//ad 转换中断处理函数{#if 0

DPRINTK("Occured Touch Screen Interrupt\n");DPRINTK("SUBSRCPND = 0x%08lx\n", SUBSRCPND);

#endifspin_lock_irq(&(tsdev.lock));if (tsdev.penStatus == PEN_UP)

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

242

http://www.up-tech.com博创科技(UP-TECH)

Page 243: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

s3c2410_get_XY();#ifdef HOOK_FOR_DRAG

else s3c2410_get_XY();

#endifspin_unlock_irq(&(tsdev.lock));

}

static void s3c2410_isr_tc(int irq, void *dev_id, struct pt_regs *reg)// 这是中断处理函数,当触摸屏事件发生时触发中断,内核捕捉该中断后交由该函数

处理。{#if 0

DPRINTK("Occured Touch Screen Interrupt\n");DPRINTK("SUBSRCPND = 0x%08lx\n", SUBSRCPND);

#endifspin_lock_irq(&(tsdev.lock));

/* 它也是要和spin_unlock_irq(&(tsdev.lock)) 成对出现在同一个函数中,它们提供一套锁机制,与中断禁止机制来联合保护一些关键代码,使其不被非法访问。这些机制对于驱动总是比较重要,在很多地方都会用到。*/

if (tsdev.penStatus == PEN_UP) { start_ts_adc();} else { tsdev.penStatus = PEN_UP; DPRINTK("PEN UP: x: %08d, y: %08d\n", x, y); wait_down_int(); tsEvent();}spin_unlock_irq(&(tsdev.lock));

}

#ifdef HOOK_FOR_DRAGstatic void ts_timer_handler(unsigned long data){

spin_lock_irq(&(tsdev.lock));if (tsdev.penStatus == PEN_DOWN) {

start_ts_adc();}

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

243

http://www.up-tech.com博创科技(UP-TECH)

Page 244: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

spin_unlock_irq(&(tsdev.lock));}#endif

static int s3c2410_ts_open(struct inode *inode, struct file *filp)// 打开设备,该函数中往往要完成设备初始化和使用记数增值。{

tsdev.head = tsdev.tail = 0;tsdev.penStatus = PEN_UP;

#ifdef HOOK_FOR_DRAG init_timer(&ts_timer);ts_timer.function = ts_timer_handler;

#endiftsEvent = tsEvent_raw;init_waitqueue_head(&(tsdev.wq)); //初始化等待队列头。MOD_INC_USE_COUNT;

/* 使用记数宏,当open一个设备时,调用它使得使用记数加一。*/return 0;

}

static int s3c2410_ts_release(struct inode *inode, struct file *filp)// 设备释放函数。{#ifdef HOOK_FOR_DRAG

del_timer(&ts_timer);#endif

MOD_DEC_USE_COUNT; // 该宏常放在release函数中,使用记数减一。 return 0;

}

static struct file_operations s3c2410_fops = {owner: THIS_MODULE,open: s3c2410_ts_open,read: s3c2410_ts_read,release: s3c2410_ts_release,

#ifdef USE_ASYNCfasync: s3c2410_ts_fasync,

#endif

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

244

http://www.up-tech.com博创科技(UP-TECH)

Page 245: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

poll: s3c2410_ts_poll,}; // 这就是内核对驱动的调用接口。void tsEvent_dummy(void) {}#ifdef CONFIG_PMstatic int s3c2410_ts_pm_callback(struct pm_dev *pm_dev, pm_request_t req,

void *data) { switch (req) {

case PM_SUSPEND:tsEvent = tsEvent_dummy;break;

case PM_RESUME:tsEvent = tsEvent_raw;wait_down_int();break;

} return 0;}#endif

#ifdef CONFIG_DEVFS_FSstatic devfs_handle_t devfs_ts_dir, devfs_tsraw;#endif/* 这段代码是为支持devfs (设备文件系统)用的,通过devfs 就可以让内核自动管

理设备文件。它能动态的分配设备号,能自主创建设备文件节点*/static int __init s3c2410_ts_init(void)/*驱动初始化函数,它要完成的任务很多,有硬件初始化设置,中断请求,设备注册等

等。过去这部分工作往往在模块入口module_init 中完成,现在的编码习惯通常是开辟独立的初始化函数。它再作为一个参数传给module_init 。

*/{

int ret;

tsEvent = tsEvent_dummy;

ret = register_chrdev(0, DEVICE_NAME, &s3c2410_fops);

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

245

http://www.up-tech.com博创科技(UP-TECH)

Page 246: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

/* 注册设备,主设备号这里设为0 说明是动态分配主设备号,后面是设备名和内核访问设备的接口file_operations*/

if (ret < 0) { printk(DEVICE_NAME " can't get major number\n"); return ret;}tsMajor = ret;

/* set gpio to XP, YM, YP and YM */#if 0

set_GPIO_mode(GPIO106_nYPON_MD);set_GPIO_mode(GPIO105_YMON_MD);set_GPIO_mode(GPIO104_nXPON_MD);set_GPIO_mode(GPIO103_XMON_MD);

GPUP(GPIO106_nYPON) |= GPIO_bit(GPIO106_nYPON);GPUP(GPIO105_YMON) &= GPIO_bit(GPIO105_YMON);GPUP(GPIO104_nXPON) |= GPIO_bit(GPIO104_nXPON);GPUP(GPIO103_XMON) &= GPIO_bit(GPIO103_XMON);

#elseset_gpio_ctrl(GPIO_YPON); set_gpio_ctrl(GPIO_YMON);set_gpio_ctrl(GPIO_XPON);set_gpio_ctrl(GPIO_XMON);

#endif

/* Enable touch interrupt */ret = request_irq(IRQ_ADC_DONE, s3c2410_isr_adc, SA_INTERRUPT,

DEVICE_NAME, s3c2410_isr_adc);if (ret) goto adc_failed;ret = request_irq(IRQ_TC, s3c2410_isr_tc, SA_INTERRUPT,

DEVICE_NAME, s3c2410_isr_tc);/*请求中断,因为中断信号往往是通过特定的中断信号线传输的,任何一款芯片留给中

断信号的接口都是有限的,所以内核会维护一个中断信号线注册表,模块要使用中断就得向它申请一个中断通道,当它使用完该通道之后要释放该通道。这里使用的就是函数:

int request_irq (unsigned int irq, void(*handler)(int, void*, struct pt_regs *), unsigned long flags, const char *dev_name, void *dev_id )

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

246

http://www.up-tech.com博创科技(UP-TECH)

Page 247: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

其各参数是:IRQ_ADC_DONE 、IRQ_TC :请求的中断号;s3c2410_isr_adc 、S3c2410_isr_tc :中断处理函数的指针;SA_INTERRUPT :这是一个与中断管理有关的位掩码选项;DEVICE_NAME :设备名,它被用来在/proc/interrupts 中显示中断拥有者;s3c2410_isr_adc 、S3c2410_isr_tc :它是一个唯一的标志符,通过该指针多个设备可

以共享信号线。驱动程序也可以用它指向自己的私有数据区,用来识别哪个设备产生了中断。

*/if (ret) goto tc_failed;

/* Wait for touch screen interrupts */wait_down_int();

#ifdef CONFIG_DEVFS_FSdevfs_ts_dir = devfs_mk_dir(NULL, "touchscreen", NULL);devfs_tsraw = devfs_register(devfs_ts_dir, "0raw", DEVFS_FL_DEFAULT,

tsMajor, TSRAW_MINOR, S_IFCHR | S_IRUSR | S_IWUSR,&s3c2410_fops, NULL);

#endif

#ifdef CONFIG_PM#if 0

tsdev.pm_dev = pm_register(PM_GP_DEV, PM_USER_INPUT, s3c2410_ts_pm_callback);

#endiftsdev.pm_dev = pm_register(PM_DEBUG_DEV, PM_USER_INPUT,

s3c2410_ts_pm_callback);#endif

printk(DEVICE_NAME " initialized\n");

return 0; tc_failed:

free_irq(IRQ_ADC_DONE, s3c2410_isr_adc); //释放中断 adc_failed:

return ret;}

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

247

http://www.up-tech.com博创科技(UP-TECH)

Page 248: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

static void __exit s3c2410_ts_exit(void){#ifdef CONFIG_DEVFS_FS

devfs_unregister(devfs_tsraw);devfs_unregister(devfs_ts_dir);

#endifunregister_chrdev(tsMajor, DEVICE_NAME); // 注销设备注册。

#ifdef CONFIG_PMpm_unregister(tsdev.pm_dev);

#endiffree_irq(IRQ_ADC_DONE, s3c2410_isr_adc); //释放中断free_irq(IRQ_TC, s3c2410_isr_tc);

}

module_init(s3c2410_ts_init); // 模块入口,初始化。module_exit(s3c2410_ts_exit); // 模块出口。

七、实验步骤

改写该驱动程序,在其基础上实现一些你想要的简单功能。由于驱动程序的复杂性,不容易上手且又容易出问题,所以建议你先只对其中的调试信息做一些改动,在运行该驱动程序时看看其在屏幕上的打印信息。在你对整个过程及相关硬件有较多的一些了解之后再动手做一些功能上的调整。

结合ARM-Linux的移植实验中的相关内容,把改动的驱动程序编译进内核,并下载内核验证结果。你只要把该驱动在必要地方修改后(注意修改前的代码一定要做备份)保存代码,回到内核目录,make bzImage编译内核,然后下载编译好的内核。

八、思考题

1 、 另外找一个Linux 的设备驱动程序(在Linux 源码的drivers 目录下),剖析它的结构及工作原理。2 、 把UP-CUP S2410 经典平台开发平台上的触摸屏驱动从内核中卸载,自己动手写一个类似的驱动程序,以新驱动代替旧驱动并编译进内核看看运行情况。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

248

http://www.up-tech.com博创科技(UP-TECH)

Page 249: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

5.3 IC 卡读写实验

一、实验目的

了解在UP-CUP S2410 经典平台平台上实现IC卡驱动程序的基本原理。 了解Linux 驱动开发的基本过程。

二、实验内容

了解IC卡的分类和内部结构,以及IC卡驱动程序的编写

三、预备知识

掌握在Linux 集成开发环境中编写和调试程序的基本过程。 了解Linux 内核中关于设备控制的基本原理。

四、实验设备及工具

硬件:UP-CUP S2410 经典平台嵌入式实验仪,PC 机pentumn500 以上, 硬盘40G 以上, 内存大于128M软件:PC 机操作系统REDHAT LINUX 9.0 +MINICOM + AMRLINUX 开发环境

五、实验原理

1 、IC 卡基础知识IC卡(IntegratedCircuitcard) 又叫智能卡(Smartcard),它将一个集成电路芯片镶嵌于塑料基片中。由于其内部具有现代高科技产品集成电路不但可以存储大量信息,具有极强的保密性能,并且抗干扰、无磨损、寿命长,因此在广泛的领域中得到应用。它将微电子技术和计算机技术结合在一起,提高了人们生活和工作的现代化程度。IC卡芯片具有写入数据和存储数据的能力,IC卡存储器中的内容根据需要可以有条件的供外部读取和供内部进行信息处理。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

249

http://www.up-tech.com博创科技(UP-TECH)

Page 250: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

IC卡的分类 从IC卡的读写方法上来分类:有接触型和非接触型两种。两种卡的集成电路均密封在塑料卡基片内部,可防水,防尘,防磁。 (1 )、接触型IC卡的表面可以看到一个方型镀金接口,共有八个或六个镀金触点,用于与读写器接触,通过电流信号完成读写。持卡人刷卡时,须将IC卡手稿读写器,读写完毕,读写器可自动弹出,或由持卡人抽出卡片。因此这种IC卡刷卡慢,但可靠性高,多用于存储信息量大,读写操作复杂的场合。(2 )、非接触型IC卡上设有射频信号接收器或红外线收发器,在一定距离内即可收发读写器的信号,实现非接触读写。这种IC卡常用于身份验证,电子门禁等场合。卡上记录信息简单,读写要求不高,卡型变化也较大,可以作成徽章等形式。根据IC卡内部结构可以分为以下三类: (1 )、存储卡(MemoryCard ):这种IC卡内封装的集成电路一般为电可擦除的可编程只读存储器EEPROM. 这种器件的特点是存储数据量大,容量为几KB 到几十KB 。信息可以长期保存,也可以在读写器中擦除和改写;读写速度快,操作简单。卡上数据的保护主要依赖于读写器中的软件口令以及向卡上加密写入信息,软件读出时破译,因此这种IC卡安全性稍差。但这种IC卡结构简单、使用方便、成本低,与磁卡相比又有存储容量大,信息在卡上存储,不需读写器联网的特点,因此也得到广泛的应用。主要用于安全性要求不高的场合,如电话卡、水电费卡、医疗卡等。 (2 )、逻辑加密卡:这种IC卡中除了封装了上述EEPROM 存储器外,还专设有逻辑加密电路,提供了硬件加密手段。因此不但存储量大, 而且安全性强, 不但可保证卡上存储数据读写安全, 而且能进行用户身份的认证. 由于密码不是在读写器软件中而是存储于IC卡上,所以几乎没有破密的可能性。 (3 )、CPU 卡:这是真正的卡上单片机系统,IC卡片内集成了中央处理器CPU 、程序存储器ROM 、数据存储器EEPROM 和RAM ,一般ROM 中还配有卡上操作系统软件COS(Chip Operating System). 。IC卡上的微处理器可以执行COS 监控程序,接收从读写器送来的命令和数据,分析命令后控制对存储器的访问。由于这种卡具有智能,读写器对卡的操作要经过卡上COS ,所以保密性更强。而且微处理器具有数据加工和处理的能力, 可以对读写数据进行逻辑和算术运算。这种IC卡存储的数据对外相当于一个黑盒子,保密性极强。目前IC卡上用的微处理器一般为8 位CPU ,存储容量几十K 上下。智能卡常用作证件和信用卡。在本实验中,我们仅仅涉及接触型IC卡中的存储卡和逻辑加密卡。

IC卡制作过程IC卡包括三个部分:塑料基片(有或没有磁条)、接触面、集成电路,其制作过程如下:(1 )、厂家将大的硅片切成小块,一个六英寸直径的硅片可以造出上千个芯片。 (2 )、对小硅片进行光刻以产生必要的电路,并将她封装在黑色的集成电路模块中。(3 )、将集成电路的输入输出端连结到大的接触面上,便于今后读写器的操作。(4 )、把造好的模块嵌入到卡上。

IC卡的标准接触型IC卡的国际标准是最广为人知的ISO7816 ,我国已采用其第一、二、三部分作为

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

250

http://www.up-tech.com博创科技(UP-TECH)

Page 251: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

中国标准。此标准主要是定义了塑料基片的物理和尺寸特性(7816/1) ,触点的尺寸和位置(7816/2) ,信息交换的底层协议描述(7816/3) ,7816/4 论述了跨行业的命令集。1 、物理特性应符合ISO7816 :1987 中规定的各类识别卡的物理特性和ISO7813 中规定的金融交易卡的全部尺寸要求,此外还应符合国际标准ISO7816-1 :1987 规定的附加特性、机械强度和静电测试方法。2 、触点尺寸与位置应符合国际标准ISO7816-2 :1988 中的规定。3 、电信号与传输协议:IC卡与接口设备之间电源及信息交换应符合ISO/IEC7816-3 :1989 的规定。4 、行业间交换用命令:有相应的国际标准ISO/IEC7816-4 :1994 。但该版本尚未正式通过。5 、应用标识符的编号系统和注册过程应符合国际标准ISO/IEC7816-5 :1994 中的规定。按照国际标准ISO7816 对接触式IC卡的规定,在IC卡的左上角封装有IC芯片,其上覆盖有6 或8 个触点和外部设备进行通讯,如图5.3.1 所示。

按ISO标准, 部分触点及其定义为:1 、Vcc :IC卡工作电源;2 、RST:复位信号(可选);3 、CLK:有关信号的定时与同步;5 、GND :地;6 、Vpp:存储器编程电源(可选);7 、I/O :IC卡中串行数据的输入/ 输出;

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

251

http://www.up-tech.com博创科技(UP-TECH)

图 5.3.1 IC卡 ISO标准

5678

1234

Page 252: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

剩余的两个触点视不同情况则可在有关应用标准中予以定义2 、AT24CXX 系列存储卡读卡器原理存储卡(Memory Card) 是IC卡的一种,它是一种用可电擦除的可编程内存(EEPROM)为核心IC卡,能够多次重复使用。IC卡中的内存类型如表5.3.1 所示。

表5.3.1 IC 卡内存类型内存类型 功能

ROM(Read Only Memory) 只读存储器,一次写入后不可更改或删除。一般由芯片制造商进行掩膜写入信息,价格便宜,适合于大量的应用

RAM(Random Access Memory)

随机存取内存,掉电后信息丢失,卡片上需电源。一般和其它种类的内存共同使用,作为信息处理时的临时存储

PROM(Programmable ROM)

一次编程多次读出内存,可由用户编程写入应用信息,价格较便宜适合于较大量的应用

EPROM (Erasable PROM) 可在紫外线擦除之后写入信息。目前,在IC卡中已经很少应用

EEPROM(Electronically EPROM)

电可擦除、写入内存。目前,在IC卡上应用得最多

AT24CXX 系列内存概述AT24CXX 系列内存封装:AT24CXX 系列内存是Atmel公司出品的高集成度串行EEPROM 内存,它提供的的接口是I2C 接口。AT24CXX 系列有两种封装,一种是作为普通EEPROM 的封装,另外一种是专门作为IC卡内存的“小封装”,这两种封装形式如图5-22 所示。普通EEPROM 的封装有DIP-8 、SOIC-14 和SOIC-8 三种形式,三种的封装的引脚

定义如图5.3.2所表示:

其它引脚定义如下:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

252

http://www.up-tech.com博创科技(UP-TECH)

图 5.3.2普通封装的 AT24CXX

Page 253: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

VCC :电源 SCL(Serial Clock) :串行时钟, 在 时钟的 上升沿,资料写入

EEPROM ;在时钟的下降沿,资料从EEPROM 被读出。 SDA(Serial Data) :双向资料端口,这是一个漏极开路的引脚,满足“线与”的条件,在使用过程中需要加上拉电阻。

A0 、A1 、A2 :地址端口,和AT24CXX 各个系列有关,具体使用方法在下面进行具体分析。

WP(Write Protect) :写保护,当该引脚连接到GND 的时候,芯片可以进行正常的读写操作;当连接到VCC 的时候,根据系列的不同有不同的情况,将在下面详细叙述。

GND :地。在IC卡中使用的AT24CXX 系列内存的封装和普通的EEPROM 不同,它的引脚端符合ISO/IEC7816-2 标准,其触点的安排如表5.3.2 所示:

表5.3.2 AT24CXX 系列器件封装触点 引脚 功能C1 VCC 电源C2 NC 保留C3 SCL 串行时钟C4 NC 保留C5 GND 地C6 NC 保留C7 SDA 串行资料C8 NC 保留

AT24CXX 系列内存分类以及特点AT24CXX 系列存储器具有以下特点:

可以适应标准电压和低电压操作,AT24CXX 系列能够使用的工作电压如下:5.0V (VCC = 4.5V - 5.5V)2.7V (VCC = 2.7V - 5.5V)2.5V (VCC = 2.5V - 5.5V)1.8V (VCC = 1.8V - 5.5V)

数 据传输速度可 变 :当工 作 电压为 5V 时传输速度是 400kHz , 为2.7V、2.5V以及1.8V的时候传输速度是100kHz 。

分页式存储方式,每页的大小为8 字节,根据内存容量的不同,支持不同大小的页面写入方式。

自计时写周期小于10毫秒。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

253

http://www.up-tech.com博创科技(UP-TECH)

Page 254: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

高可靠性:可以进行一百万次读写操作,资料保存时间长于100 年。AT24CXX 系列的内存的种类和特征如表5.3.3 所示。

表5.3.3 AT24CXX 系列内存组织结构型号 容量 页 页面写入字节

AT24C01A 1K 8 字节/ 页,128 页 8 字节/ 页AT24C02 2K 8 字节/ 页,256 页 8 字节/ 页AT24C04 4K 8 字节/ 页,256

页,2 块16字节/ 页

AT24C08 8K 8 字节/ 页,256页,4 块

16字节/ 页AT24C16 16K 8 字节/ 页,256

页,8 块16字节/ 页

AT24CXX 系列内存根据不同的容量,位址端口(A0 、A1 、A2) 和写保护引脚(WP) 的工作方式有所不同:

AT24C01A :地址端口A0 、A1 、A2 是器件的编号埠,通过对三个埠的编号可以确定该器件在系统中的编号;也就是说,在一根总线上最多可以挂接8 个该器件,通过对地址码的最低三位的设置来决定使用哪一个器件。当该器件的WP引脚连接到VCC 的时候,器件处于写保护状态,不能够对其进行读写操作。

AT24C02:和AT24C01相同。 AT24C04:只使用A2 、A1 这两个埠作为器件编号;在一根总线上可以挂接4块该器件;第三位作为芯片内部的块的选择,决定使用第一个块还是第二个块。A0 这个埠不使用。当该器件的WP 引脚连接到VCC 的时候,器件处于写保护状态,不能够对其进行读写操作。

AT24C08:只使用A2 这一个埠作为器件编号;在一根总线上可以挂接2 块该器件;

第二位和第三位作为芯片内部的块选择,可以选择四个块中的一个。A0 、A1这两个埠不使用。当该器件的WP 引脚连接到VCC 的时候,器件仍然可以进行读写操作。AT24C18:不使用外部引脚作为器件编号,所以在同一根总线上只能够挂接1 块该器件;三位元全部作为芯片内部的块选择,可以选择八个块中间的一块。当该器件的WP 引脚连接到VCC 的时候,器件的高8K 字节( 第4 块到第7 块) 处于写保护状态,不能够对其进行读写操作。

AT24CXX 系列内存内部结构:

AT24CXX系里内存的内部结构如图5.3.3 所示,其中各个单元功能如下: 启动和停止逻辑单元:接收资料引脚上的电平信号,进行判断是否进行启动和停止操作。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

254

http://www.up-tech.com博创科技(UP-TECH)

Page 255: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

串行控制逻辑单元:根据SCL 、SDA以及“启动”、“停止”逻辑单元发出的各种信号进行区分

并排列出有关的“寻址”、“读数据”和“写数据”等逻辑,将它们传送到相应的操作单元。例如:当操作命令为“寻址”时候,它将通知地址计数器加1 并启动器件地址比较器进行工作。在“读数据”时,它控制“数据输出确认逻辑单元”;在“写数据”时候,它控制升压/ 定时电路,以便向EEPROM 电路提供编程所需要的高电压。 地址/ 计数器单元:

产生访问EEPROM 所需要的存储单元的地址,并将其分别送到X译码器进行字选(字长8 位),送到Y译码器进行位选。

图5.3.3 AT24XX 系列器件内部结构 升压/ 定时单元:由于EEPROM 资料写入时候需要向电路施加编程高电压,为了解决单一电源电压的供电问题,芯片生产厂家采用了电压的片内提升电路。电压的提升范围一般可以达到12-21.5V 。 数据输入/ 输出应答逻辑单元:地址和资料均以8 位码串行输入输出。数据传送时,每成功传送一个字节数据后,接收器都必须产生一个应答信号;在第9 个时钟周期时候将SDA线置于低电压作为应答信号。

AT24CXX 的地址分配在I2C 器件中,AT24CXX 系列器件是其中的从器件,拥有自己的I2C 从地址。I2C 总线上的主器件(如控制器)等就是通过从地址来选择挂在同一根I2C 总线上的不同从器件的。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

255

http://www.up-tech.com博创科技(UP-TECH)

Page 256: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

每一种从器件都有属于自己的从地址,AT24CXX 系列器件的从位址是1010XXXX ,具体如表5-22 所示。其中B7-B4四位是AT24CXX 固定的,B3-B1是根据器件系列中型号不同而定的。A2 、A1 、A0 为器件编号,其位数决定了在同一根I2C 总线上能够挂接几个相同的该器件,使用的位数也根据型号的不同而不同。P2 、P1 、P0 为器件内部块选择,根据型号不同能够选择的块数也不同,具体可以参看表5-22 。最后一位B0 是读写位元控制,当其为高位时候对应读操作,否则为写操作。

表5.3.4 AT24CXX 系列器件位址器件 B7 B6 B5 B4 B3 B2 B1 B0

AT24C01A/02 1 0 1 0 A2 A1 A0 R/WAT24C04 1 0 1 0 A2 A1 P0 R/WAT24C08 1 0 1 0 A2 P1 P0 R/WAT24C16 1 0 1 0 P2 P1 P0 R/W

【例5-1 】一块AT24C01A ,其引脚A2 、A1 、A0 全部接到高电平,对其进行读操作,则对应的器件地址为10101111 。【例5-2 】如图5.3.4 ,两块AT24C04 接连接到同一根I2C 总线上,A2 、A1 、A0的连接方式如图。对器件JP1 的第二块的读操作器件地址是10101011 ,对器件JP2 中第一块的写操作地址是10100100 。

图5.3.4 连接两个AT24C04

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

256

http://www.up-tech.com博创科技(UP-TECH)

Page 257: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

除去AT24CXX 的器件地址之外,每一块器件还有一个自己的8 位内部地址码,这是用来寻址内部存储单元的,根据器件系列的不同,内部地址码的实际位数也不一样。

对于AT24C01A 而言,只用了8 位地址码的低7 位来寻址128 字节;对于AT24C02而言,使用8 位地址码来寻址256 字节;对于AT24C04而言,使用8 位地址码并且结合前面的块地址一起来寻址512 字节;对于AT24C10而言,使用8 位地址码并且结合前面的块地址一起来寻址512 字节。

【例5-3 】在图5.3.4 中间,如果要对器件JP-1的内部第二块的地址12H 进行写操作,其器件地址和内部地址分别为10101011 和00010010 。

AT24CXX 系列内存读写操作AT24CXX 系列内存的资料接口完全符合I2C 的标准,下面我们就来看看AT24CXX 系列内存的读写操作。

启动信号、停止信号和应答信号启动信号:当SCL处于高电平时候,SDA从高到低的跳变作为I2C 总线的启动信号,

启动状态应该在操作命令(读写)之前进行建立。停止信号:当SCL处于高电平时候,SDA 从低到高的跳变作为I2C 总线的停止信号,表示一种操作的结束,马上即将结束所有的相关的通信。

SDA和SCL通常接有上拉电阻,当SCL 为高电平时候,对应的SDA上的资料为有效;而当SCL 为低电平时候,允许SDA上的电平变动。图5.3.5是启动信号和停止信号的时序图。

资料和地址都是以8 位的串行信号输入的,当AT24CXX 系列接收到8 位元资料之后都会在第九个时钟周期时候发送出一个“0”信号来进行应答。图5.3.6是应答信号对应的时序图。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

257

http://www.up-tech.com博创科技(UP-TECH)

图 5.3.5 启动信号和停止信号时序

Page 258: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

图 5.3.7字节写时序图

Beijing Universal Pioneering Technology Co.,LTD.

写操作:AT24CXX 系列的写操作有两种:字节写和页面写。字节写:每次在指定位置写入一个字节数据。首先控制器(主器件)向AT24CXX 发送启动信号和器件地址(最低位置0 )之后,然后等待应答信号;当应答信号来到之后发送一个器件内部地址,用以指定资料写入到器件内部的哪一个地址单元中,然后再次等待应答信号;当应答信号到来之后立即发送待写入资料,当此次的应答信号来到之后发送停止信号,AT24CXX 进入写周期。在写周期之内,AT24CXX 不能够进行任何的输入操作。图5.3.7 是字节写的时序图。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

258

http://www.up-tech.com博创科技(UP-TECH)

图 5.3.6应答信号时序

Page 259: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

图 5.3.9指定位置读时序图

图 5.3.8页面写时序图

Beijing Universal Pioneering Technology Co.,LTD.

页面写:页面写和字节写操作很类似,只是控制器(主器件)在进行完成第一轮资料传送之后不需要发送停止信号,而是继续发送待写入的资料。在每一个资料被吸入之后,AT24CXX 都会发送出一个应答信号,当控制器接收到这个应答信号之后即可以进行下一个资料的传送,当全部资料传送完成之后再次发送出停止信号,停止整个资料传送过程。

需要注意的是,在AT24C04 、AT24C08 、AT24C16 等器件中,页面写入是16 字节/ 页,而AT24C01A 和AT24C02 是8 字节/ 页,也就是说,当发送的字节数达到了字节写入页的最高数的时候就会“溢出”,重新覆盖该页面从第一个字节起前面已经写入的字节。页面写入的起始地址一般定在每一个页面的第一个字节,例如:10H 、30H 等;每次写入的字节数一般为页面内的最大字节数,如8 字节或者16 字节。图5.3.8 为页面写的时序图。

读操作:AT24CXX 系列内存的读操作有三种方式:指定位置读、连续读和当前地址读。

指定位置读:这是指定一个需要读取的位址单元地址,对其进行读取。其操作步骤是首先给出一个启动信号,然后给出器件地址;在接收到应答信号之后马上发送一个指定的器件内部地址(即需要读取的位元组地址),然后等待应答,当应答到来的时候不发送停止信号而是发送一个启动信号和一个对应读器件的器件地址,当应答到来的时候就可以接受到需要读取位址的字节资料,接受完成之后发送一个停止信号而不是一个应答信号。也有把前面地址的写入过程称为“空写”(Dummy Write) 操作的,图5.3.9 是指定位置读的时序图。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

259

http://www.up-tech.com博创科技(UP-TECH)

Page 260: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

图 5.3.10 当前地址读时序图

Beijing Universal Pioneering Technology Co.,LTD.

当前地址读:当前地址读写一般是和其它两种读操作结合起来的使用的。AT24CXX 系列芯片内部有一个地址计数器,它会保留接收到的最后一个地址并且自动加1 ,所以当使用当前地址读的时候,芯片读出的是前一个写入地址的紧接着的地址。当前地址读的操作步骤如下:发送启动信号和对应的读操作器件地址,在收到应答信号之后就可以开始接受资料,这个资料是前一个完成的读操作对应的地址的后一个地址单元中存放的数据。图5.3.10 给出了当前地址读的时序。

连续读:连续读需要从一个指定位址读或者当前地址读开始。当接收器件接收到一个资料之后不发送停止信号,而是发送一个应答信号;当AT24CXX 接收到这个应答信号之后其自动把地址加1 ,然后继续发送该地址对应的资料,直到接收器件不发送应答信号而是一个停止信号。需要注意的是,AT24CXX 在没有接收到应答信号而是接收到一个停止信号之后就立即停止向外部送资料。连续读过程中,当地址计数器的值超过了器件的最大地址之后会自动溢出——从最低地址开始,这是和页面写不同的(页面写是在页面内部溢出翻转)。图5.3.11 是连续读的时序图。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

260

http://www.up-tech.com博创科技(UP-TECH)

图 5.3.11 连续读时序图

Page 261: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

六、程序分析

1 、IC 卡驱动程序源码中的部分函数分析 文件定位函数

每个打开文件都有一个与其相关联的“当前文件位移量”。它是一个非负整数,用以度量从文件开始处计算的字节数。通常,读、写操作都从当前文件位移量处开始,并使位移量增加所读或写的字节数。

static loff_t mega8_iccard_llseek(struct file *file,loff_t offset, int orig){

ICCARD_DEV_INFO *iccd= (ICCARD_DEV_INFO*)file->private_data;switch (orig) {case 0: // 从文件开始处计算的位移量

/* SEEK_SET */file->f_pos = offset;break;

case 1: // 从当前位置处计算的位移量/* SEEK_CUR */file->f_pos += offset;break;

case 2: // 从文件结束处计算的位移量/* SEEK_END */file->f_pos = iccd->memsize + offset;break;

default:return -EINVAL;

}if (file->f_pos < 0)

file->f_pos = 0;else if (file->f_pos >= iccd->memsize)

file->f_pos = iccd->memsize - 1;return file->f_pos;

}

重要数据结构:typedef struct _iccard_dev_info{

unsigned char minor; // 次设备号char *devname; // 设备名loff_t memsize; // 存储容量

}ICCARD_DEV_INFO;

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

261

http://www.up-tech.com博创科技(UP-TECH)

Page 262: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

ICCARD_DEV_INFO iccarddevinfo[]={{ICCARD_24C02_MINOR, ICCARD_24C02_NAME, 256},{ICCARD_24C04_MINOR, ICCARD_24C04_NAME, 512},{ICCARD_24C08_MINOR, ICCARD_24C08_NAME, 1024},{ICCARD_24C16_MINOR, ICCARD_24C16_NAME, 2048},{ICCARD_24C32_MINOR, ICCARD_24C32_NAME, 4096},{ICCARD_24C64_MINOR, ICCARD_24C64_NAME, 8192},{ICCARD_4442_MINOR, ICCARD_4442_NAME, 256},

};

读设备函数static ssize_t mega8_iccard_read (struct file *file, char *buf, size_t count, loff_t *offset){

ICCARD_DEV_INFO *iccd= (ICCARD_DEV_INFO*)file->private_data;struct i2c_client *client = &mega8_client;I2C_ICCard buffer;size_t total_retlen=0;int ret=0;int len;if (*offset + count > iccd->memsize) // 计算读取的字节数

count = iccd->memsize- *offset;while (count) { //如果读取的字节数为正

if (count > MAX_ICCARD_RWBUFFER) len = MAX_ICCARD_RWBUFFER;

elselen = count;

buffer.cmd=CMD_ICC_READ; //读取命令字iccarddev.iccard_data.address = buffer.iccard_addr = *offset;//IC卡的读取地址iccarddev.iccard_data.cnt = buffer.iccard_cnt = len;iccarddev.lasterrcode = ICC_FAILED_WAITING; //IC卡通讯状态等待ret = i2c_master_send(client, (const char*)&buffer,

ICCARD_COUNT_OFFSET);

if(ret<0){ // 返回的字节数小于0iccarddev.lasterrcode=ICC_FAILED_READERR; // 读取失败break;

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

262

http://www.up-tech.com博创科技(UP-TECH)

Page 263: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

}retry:

if(iccarddev.lasterrcode==ICC_FAILED_WAITING){ // 等待interruptible_sleep_on(&(iccarddev.wq));if (signal_pending(current))

return -ERESTARTSYS;goto retry; // 重试

}else if(iccarddev.lasterrcode==ICC_FAILED_NULL){// 读取成功

*offset += buffer.iccard_cnt;copy_to_user(buf, (char *)iccarddev.iccard_data.buffer, buffer.iccard_cnt);// 拷贝到用户空间if (copy_to_user(buf, (char *)iccarddev.iccard_data.buffer,

buffer.iccard_cnt)) {return -EFAULT;

}else{total_retlen += buffer.iccard_cnt;count -= buffer.iccard_cnt;buf += buffer.iccard_cnt;

}}else{

//read errorbreak;

}}return total_retlen; // 返回读取的总字节数

}

重要数据结构:typedef struct {

ICCARD_data iccard_data;int lasterrcode;wait_queue_head_t wq;spinlock_t lock;

}ICCARD_DEV;typedef struct tagICCardRWBuffer{

unsigned short address;unsigned char cnt;

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

263

http://www.up-tech.com博创科技(UP-TECH)

Page 264: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

unsigned char buffer[MAX_ICCARD_RWBUFFER];}ICCARD_data;struct i2c_client {

char name[32];int id;unsigned int flags; /* div., see below */unsigned int addr; /* chip address - NOTE: 7bit */

/* addresses are stored in the */ /* _LOWER_ 7 bits of this char */

/* addr: unsigned int to make lm_sensors i2c-isa adapter work more cleanly. It does not take any more memory space, due to alignment considerations */struct i2c_adapter *adapter; /* the adapter we sit on */struct i2c_driver *driver; /* and our access routines */void *data; /* for the clients */int usage_count; /* How many accesses currently */

/* to the client */int (*slvRecvNotify)(char *buf, int len, int begin);

};static struct i2c_client mega8_client = {

name: "I2C Mega8",id: 1,flags: 0,addr: MEGA8_I2CADDRESS,adapter: NULL,driver: &i2c_mega8_driver,slvRecvNotify: i2c_mega8_slvRcv,

};

写设备函数static ssize_t mega8_iccard_write(struct file * file, const char * buf, size_t count, loff_t *offset){

ICCARD_DEV_INFO *iccd= (ICCARD_DEV_INFO*)file->private_data;struct i2c_client *client = &mega8_client;I2C_ICCard buffer;size_t total_retlen=0;int ret=0;

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

264

http://www.up-tech.com博创科技(UP-TECH)

Page 265: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

int len;if (*offset + count > iccd->memsize)

count = iccd->memsize- *offset;while (count) {

if (count > MAX_ICCARD_RWBUFFER) len = MAX_ICCARD_RWBUFFER;

elselen = count;

buffer.cmd=CMD_ICC_WRITE;iccarddev.iccard_data.address = buffer.iccard_addr = *offset;iccarddev.iccard_data.cnt = buffer.iccard_cnt = len;iccarddev.lasterrcode = ICC_FAILED_WAITING;if (copy_from_user(buffer.iccard_buf, buf, len)) {

return -EFAULT;}ret = i2c_master_send(client, (const char*)&buffer, ICCARD_COUNT_OFFSET

+ len);if(ret<0){

iccarddev.lasterrcode=ICC_FAILED_READERR;break;

}retry:

if(iccarddev.lasterrcode==ICC_FAILED_WAITING){interruptible_sleep_on(&(iccarddev.wq));if (signal_pending(current))

return -ERESTARTSYS;goto retry;

}else if(iccarddev.lasterrcode==ICC_FAILED_NULL){//write successfully

*offset += buffer.iccard_cnt;total_retlen += buffer.iccard_cnt;count -= buffer.iccard_cnt;buf += buffer.iccard_cnt;

}else{

//write errorbreak;

}

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

265

http://www.up-tech.com博创科技(UP-TECH)

Page 266: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

}return total_retlen;

}

写函数与读函数类似 释放设备函数static int mega8_iccard_release (struct inode *inode, struct file *file){

mega8_device_release (DTYPE_ICCARD);atomic_inc (&atom_cnt);return 0;

}

2 、IC 卡读写应用程序 (iccard-test.c)#include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <errno.h>#include <unistd.h>int MAX_LEN=96; /* 定义读写的字节数 */int main(){ int fd,i; /* fd 为将要用到的文件描述符 */ char buf[MAX_LEN],readic[MAX_LEN]; for(i=0;i<MAX_LEN;i++){ /* 给数组赋值 */ buf[i]=i+32; } if((fd=open("/dev/mcu/iccard24c16",O_RDWR))==-1){ /* 打开IC卡设备, 如果出错*/ fprintf(stderr,"Open error %d\n",errno); /* 打印errno 变量的值 */ exit(1); } printf("Write %d bytes data to /dev/mcu/iccard24c16 \n",MAX_LEN); if(write(fd,buf,MAX_LEN)==-1){ /* 将数据写入IC卡 */ fprintf(stderr,"Write error %d\n",errno); exit(1); } if((lseek(fd,0,SEEK_SET))==-1){ /* 将文件读写指针定位到起始位置 */ fprintf(stderr,"Lseek error %d\n",errno);

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

266

http://www.up-tech.com博创科技(UP-TECH)

Page 267: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

exit(1); } printf("\nRead %d bytes data from /dev/mcu/iccard24c16 \n",MAX_LEN); if(read(fd,readic,MAX_LEN)==-1){ /* 读IC卡, 并将数据存入readic[] 数组

*/ fprintf(stderr,"Read error %d\n",errno); exit(1); } if(close(fd)==-1){ /* 关闭IC卡设备 */ fprintf(stderr,"Close error%d\n",errno); exit(1); } for(i=0;i<MAX_LEN;i++){ /* 输出显示读出的数据 */ if((i%8)==0) printf("\n"); printf("%4c",readic[i]); } printf("\n"); return 0; /* 成功返回, 程序结束 */}

这是一个比较简单的IC卡读写程序,主要涉及到open ,close ,read ,write,lseek等几个基本的系统调用。

七、实验步骤

编译并运行IC卡读写程序1 )编译IC卡读写程序 在安装目录:/arm2410cl/exp/drivers/ 03_iccardtest 下 #arm-linux-gcc iccard-test.c –o iccard-test

2 )运行读写程序启动minicom ,mount 主机共享目录,将程序下到板子上运行,( 如果运行不成功,请将/mnt/yaffs/iccard/ 下的i2c-tomega8.o 驱动加载上) 。运行效果截图如图5.3.12 :

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

267

http://www.up-tech.com博创科技(UP-TECH)

Page 268: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图5.3.12 运行结果图

八、思考题

1.如果不调用lseek ,输出结果会怎样。2.将MAX_LEN 设为更大的值,观察输出结果。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

268

http://www.up-tech.com博创科技(UP-TECH)

Page 269: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

5.4 PS2 键盘鼠标驱动实验

一、实验目的

了解PS/2键盘鼠标协议和接口; 了解模块驱动方法,掌握交叉编译的概念及方法,学习鼠标驱动的方法。

二、实验内容

加载PS/2 驱动模块,观察键盘鼠标的接管情况。

三、预备知识

C 语言的基础知识。 Linux 的基本操作。 了模块驱动的基本命令。

四、实验设备及工具

硬件:UP-CUP S2410 经典平台嵌入式实验仪,PC 机Pentumn500 以上, 硬盘40G 以上, 内存大于128M 。软件:PC 机操作系统REDHAT LINUX 9.0 +MINICOM + AMRLINUX 开发环境

五、实验原理

1 、PS/2协议PS/2 设备接口广泛用于现代的鼠标和键盘,它由IBM 开发,现在是大多数键盘、鼠标与PC机通讯的标准协议。物理上的PS/2 接口是两类连接器的一种:5 脚的DIN或6 脚的mini -DIN 。这两种连接器(在电气特性上)是十分类似的,实际上两者只有一点不同那就是管脚的排列。这就意味着这两种连接器可以很容易用一种简单的硬件连线的适配器来转换。DIN标准是由德国标准化组织建立的。PC 键盘可以有6 脚的mini-DIN 或5 脚的DIN连接器。具有6 脚的mini-DIN 的键盘通常叫做“PS/2”键盘,而那些有5 脚的

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

269

http://www.up-tech.com博创科技(UP-TECH)

Page 270: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

DIN 的叫做“AT” 设备(“XT”键盘也是用5 脚DIN ,但它们非常古老并且多年前就不再生产了)。所以现代的为PC 生产的键盘不是PS/2 ,AT 就是USB 的。鼠标流行着大量的形状和大小、接口,最流行的类型可能算是PS/2 鼠标,现在USB 鼠标渐渐开始流行起来了。每种连接器的引脚定义如图5.4.1 所示:在刚才提到的连接器上有四个有趣的管脚:地、+5V 、数据和时钟。主机提供+5V ,并且键盘/ 鼠标的地连接到主机的地上。数据和时钟都是集电极开路的,这就意味着它们通常保持高电平而且很容易下拉到地(逻辑0 )。任何你连接到PS/2 鼠标、键盘或主机的设备在时钟和数据线上要有一个大的上拉电阻。把线拉低就置“0” ,让线上浮成高电平就置“1” 。参考图5.4.2 中数据和时钟线的一般接口结构。PS/2 鼠标和键盘履行一种双向同步通信协议。换句话说,每次数据线上发送一位数据并且没在时钟线上发一个脉冲就被读入。键盘/ 鼠标可以发送数据到主机,而主机也可以发送数据到设备,但主机总是在总线上有优先权,它可以在任何时候抑制来自键盘/ 鼠标的通信,只要把时钟位拉低即可。

图5.4.1连接器的引脚定义

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

270

http://www.up-tech.com博创科技(UP-TECH)

Page 271: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图5.4.2数据和时钟线的一般接口结构2 、模块模块(module)是在内核空间运行的程序,实际上是一种目标对象文件,没有链接,不能独立运行,但是可以装载到系统中作为内核的一部分运行,从而可以动态扩充内核的功能。模块最主要的用处就是用来实现设备驱动程序。 Linux 下对于一个硬件的驱动,可以有两种方式:直接加载到内核代码中,启动内核时就会驱动此硬件设备。另一种就是以模块方式,编译生成一个.o文件。当应用程序需要时再加载进内核空间运行。所以我们所说的一个硬件的驱动程序,通常指的就是一个驱动模块。对于一个设备,它可以在/dev 下面存在一个对应的逻辑设备节点,这个节点以文件的形式存在,但它不是普通意义上的文件,它是设备文件,更确切的说,它是设备节点。这个节点是通过mknod 命令建立的,其中指定了主设备号和次设备号。主设备号表明了某一类设备,一般对应着确定的驱动程序;次设备号一般是区分不同属性,例如不同的使用方法,不同的位置,不同的操作。这个设备号是从/proc/devices 文件中获得的,所以一般是先有驱动程序在内核中,才有设备节点在目录中。这个设备号(特指主设备号)的主要作用,就是声明设备所使用的驱动程序。驱动程序和设备号是一一对应的,当你打开一个设备文件时,操作系统就已经知道这个设备所对应的驱动程序。对于一个硬件,Linux 是这样来进行驱动的:首先,我们必须提供一个.o的驱动模块文件(这里我们只说明模块方式,其实内核方式是类似的)。我们要使用这个驱动程序,首先要加载运行它(insmod *.o )。这样驱动就会根据自己的类型(字符设备类型或块设备类型,例如鼠标就是字符设备而硬盘就是块设备)向系统注册,注册成功系统会反馈一个主设备号,这个主设备号就是系统对它的唯一标识(例如硬盘块设备在/proc/devices 中显示的主设备号为3 ,我们用ls -l /dev/had 看到的主设备就肯定是3 )。驱动就是根据此主设备号来创建一个一般放置在/dev 目录下的设备文件(mknod 命令用来创建它,

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

271

http://www.up-tech.com博创科技(UP-TECH)

Page 272: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

它必须用主设备号这个参数)。在我们要访问此硬件时,就可以对设备文件通过open 、read 、write 等命令进行。而驱动就会接收到相应的read 、write 操作而根据自己的模块中的相应函数进行了。3 、Linux 键盘驱动的工作原理首先让我们通过以下的结构图5.4.3 来了解一下用户从终端的击键是如何工作的:

_____________ _________ _________ / \ put_queue | |receive_buf| |tty_read/handle_scancode \-------->|tty_queue|---------->|tty_ldisc|------->\ / | | |buffer | \_____________/ |_________| |_________|

_________ ____________ | |sys_read| |--->|/dev/ttyX|------->|user process| | | | | |_________| |____________|

图5.4.3 键盘结构图首先,当你输入一个键盘值的时候,键盘将会发送相应的scancodes 给键盘驱动。一个独立的击键可以产生一个六个scancodes 的队列。键盘驱动中的handle_scancode() 函数解析scancodes 流并通过kdb_translate() 函数里的转换表(translation-table )将击键事件和键的释放事件(key release events )转换成连续的keycode 。比如,'a' 的keycode 是30 。击键’a'的时候便会产生keycode 30 。释放a 键的时候会产生keycode 158 (128+30 )。然后,这些keycode 通过对keymap的查询被转换成相应key符号。这步是一个相当复杂的过程。以上操作之后,获得的字符被送入raw tty 队列--tty_flip_buffer 。receive_buf() 函数周期性的从tty_flip_buffer中获得字符,然后把这些字符送入tty read 队列。当用户进程需要得到用户的输入的时候,它会在进程的标准输入(stdin )调用read()函数。sys_read() 函数调用定义在相应的tty 设备(如/dev/tty0 )的file_operations 结构中指向tty_read 的read() 函数来读取字符并且返回给用户进程。file_operations 是文件操作结构,定义了文件操作行为的成员,结构如下,很容易理解:

struct file_operations {

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

272

http://www.up-tech.com博创科技(UP-TECH)

Page 273: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

struct module *owner; loff_t (*llseek) (struct file *, loff_t, int); ssize_t (*read) (struct file *, char *, size_t, loff_t *);<---- 这是本文提到的read函数 ssize_t (*write) (struct file *, const char *, size_t, loff_t *); int (*readdir) (struct file *, void *, filldir_t); unsigned int (*poll) (struct file *, struct poll_table_struct *); int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); int (*mmap) (struct file *, struct vm_area_struct *); int (*open) (struct inode *, struct file *); int (*flush) (struct file *); int (*release) (struct inode *, struct file *); int (*fsync) (struct file *, struct dentry *, int datasync); int (*fasync) (int, struct file *, int); int (*lock) (struct file *, int, struct file_lock *); ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *); ssize_t (*writev) (struct file *, const struct iovec *, unsigned long, loff_t *); ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int); unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long,

unsigned long, unsigned long);};

我们知道unix 系统中设备也是文件,所以tty 设备我们也可以进行文件操作。 键盘驱动器可以有如下4 种模式:- scancode (RAW 模式):应用程序取得输入的scancode 。这种模式通常用于应用程序实现自己的键盘驱动器,比如X11程序。- keycode(MEDIUMRAW 模式):应用程序取得key 的击键和释放行为(通过keycode 来鉴别这两种行为)信息。- ASCII (XLATE 模式):应用程序取得keymap定义的字符,该字符是8 位编码的。- Unicode(UNICODE 模式):此模式唯一和ASCII 模式不同之处就是UNICODE 模式允许用户将自己的10 进制值编写成UTF8 的unicode字符,如十进制的数可以编写成Ascii_0 到Ascii_9 ,或者用户16 进制的值可以用Hex_0 到Hex_9 来代表。一个keymap可以产生出一系列UTF8 的序列。

六、程序分析

分析源代码Ps2_kbd_mouse.c

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

273

http://www.up-tech.com博创科技(UP-TECH)

Page 274: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

使用者在键盘上按一个键, 就产生一个中断请求,CPU 在响应中断时进入键盘的中断服务程序keyboard_interrupt() 。人们往往以为键盘是很简单的设备, 但实际上键盘的结构和操作都不简单。我们以字符”A” 为例来说明键盘的操作。当在键盘上按下一个键时,键盘立即就向母板发出一个字节的代码, 称为”键盘扫描码” 。具体位置取决于键的位置,”A”键的键盘扫描码为0x1c 。母板上的键盘接口在接收这个字节以后就把它转换成一种”系统扫描码”, 并将其存入控制器的内部缓冲区, 然后便向CPU 发出一个中断请求。对于”A” 键, 其系统扫描码为0x1e 。当CPU 从键盘接口的数据寄存器读时, 读出的就是系统扫描码。然后, 当放开”A” 时, 键盘又要向母板发出键盘扫描码, 而这次是两个字节, 第一个是0xf0, 表示是放开一个键; 然后是0x1c, 表示是哪一个键. 同样母板上的键盘接口也要把它转换成系统扫描码、也要向CPU 发出中断请求, 但是系统扫描码仍然是一个字节, 只是在0x1e 的基础上把最高位设成1,变成0x9e 。这样, 在CPU 从键盘接口读出的单字节系统扫描码中, 其最高位表示按下或放开, 而低7 位则与具体的键对应。不光对普通的字符键是如此, 对功能键和控制键也是一样。例如, 左右两个Shift 键的系统扫描码分别为0x2a 和0x36 。这样, 以输入一个小写的”a” 为例,CPU 实际上可能要发生4 次中断、要依次从键盘接口读出4 个字节的系统扫描码, 例如0x36,0x1e,0x9e,0xb6。对于把这个序列解释成什么, 那就是软件的事了; 如果解释成ASCII 码, 而键盘又没有锁定在大写状态, 那就是”a” 。由此可见, 键盘接口向CPU发出中断请求并不意味着从键盘接收到了一个字符, 而只是意味着键盘上发生了某种事件。此外, 上面只是一般而言, 实际上还有不少例外。其中最重要的是所谓”扩充键” 。早期的PC 键盘上只有83 个键, 后来扩充到了101键或104键, 例如右边的Ctrl键就是一个扩充键。当按下或放开扩充键时, 键盘扫描码和系统扫描码都以一个0xe0 字节开头,所以按下右边Ctrl键时的键盘扫描码是[0xe0,0x14]; 放开时为[0xe0,0xf0,0x14];相应的系统扫描码则为[0xe0,0x1d] 以及[0xe0,0x9d] 。事件 键盘扫描码 系统扫描码按下”A” 键 0x1c 0x1e放开”A” 键 0xf0,0x1c 0x9e按下右Shift 键 0x59 0x36放开右Shift 键 0xf0,0x59 0xb6按下右Ctrl键 0xe0,0x14 0xe0,0x1d放开右Ctrl键 0xe0,0xf0,0x14 0xe0,0x9d

之所以把键盘扫描码转换成系统扫描码, 是为了建立起一个统一的扫描码界面。这些转换是由键盘接口完成的, 所以不占用CPU 的时间。不过, 有需要时也可以通过键盘控制器关闭这种转换。显然, 对于软件而言键盘扫描码是不可见的, 所以我们在下面讲到”扫描码”时都是指系统扫描码。此外, 按下一个键时产生的扫描码称为”make code”, 而放开一个键时产生的扫描码则称为”break code” 。对扫描码的实际处理是由handle_scancode() 完成的,其代码在/arm2410cl/kernel/linux-2.4.18-2410cl/drivers/char/keyboard.c 中。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

274

http://www.up-tech.com博创科技(UP-TECH)

Page 275: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

void handle_scancode(unsigned char scancode, int down){

unsigned char keycode;char up_flag = down ? 0 : 0200;char raw_mode;pm_access(pm_kbd);add_keyboard_randomness(scancode | up_flag);tty = ttytab? ttytab[fg_console]: NULL;if (tty && (!tty->driver_data)) {

/* * We touch the tty structure via the ttytab array * without knowing whether or not tty is open, which * is inherently dangerous. We currently rely on that * fact that console_open sets tty->driver_data when * it opens it, and clears it when it closes it. */tty = NULL;

}kbd = kbd_table + fg_console;if ((raw_mode = (kbd->kbdmode == VC_RAW))) {

put_queue(scancode | up_flag);/* we do not return yet, because we want to maintain the key_down array, so that we have the correct values when finishing RAW mode or when changing VT's */

}/* * Convert scancode to keycode */if (!kbd_translate(scancode, &keycode, raw_mode))

goto out;/* * At this point the variable `keycode' contains the keycode. * Note: the keycode must not be 0 (++Geert: on m68k 0 is valid). * We keep track of the up/down status of the key, and * return the keycode if in MEDIUMRAW mode. */kbd_processkeycode(keycode, up_flag, 0);

out:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

275

http://www.up-tech.com博创科技(UP-TECH)

Page 276: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

#ifdef CONFIG_CONSOLE_PM // bushido_poke_blanked_console = 1;

#endifschedule_console_callback();

}

参数down 为1 表示扫描码的最高位为0 ,表示键处于按下状态。局部量up_flag 实际上相当于把扫描码的最高位抽了出来。这里的pm_access() 是为电源管理留下的,其意图是在人机界面上长时间没有活动以后就使显示器进入省电模式,然后一旦有键盘输入时就恢复到正常运行。PC 机的控制台终端由显示器和键盘两部分构成,所以除tty_struct 数据结构外还有个kbd_struct 数据结构。同时,物理的显示器和键盘又可能用十多个虚拟终端,通过Alt键与功能键的组合来切换,显然,每个虚拟终端都应该有自己的tty_struct结构和kbd_struct 结构。为此内核中设立了tty_table[] 和kbd_table[] 两个数组,而全局量fg_console 则记录着当前的“前台”虚拟终端号,同时,为了便于后面的处理,又设立了tty 和kbd 两个全局量,使它们分别指向“前台”虚拟终端的tty_struct结构和kbd_struct 结构。如果前台终端的键盘工作于“原始”模式VC_RAW( 可以通过系统调用ioctl()) 设置,那就直接把键盘扫描码放到键盘的接收队列中,否则就要将扫描码转换成“键码”后才放到队列中。所谓”原始“(raw) 模式对于不同的层次有不同的意义,键盘的原始模式有两种,其中最原始的就是VC_RAW ,表示直接把扫描码送给应用层。我们先看转换扫描码的函数

static int Ps2_Kbd_translate(unsigned char scancode, unsigned char *keycode, char raw_mode)

{static int prev_scancode = 0;

DPRINTK("scancode = 0x%x\n",scancode);

/* special prefix scancodes.. */if (scancode == 0xe0 || scancode == 0xe1) {

prev_scancode = scancode;return 0;

}

/* 0xFF is sent by a few keyboards, ignore it. 0x00 is error */if (scancode == 0x00 || scancode == 0xff) {

prev_scancode = 0;

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

276

http://www.up-tech.com博创科技(UP-TECH)

Page 277: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

return 0;}

scancode &= 0x7f;

if (prev_scancode) {/* * usually it will be 0xe0, but a Pause key generates * e1 1d 45 e1 9d c5 when pressed, and nothing when released */if (prev_scancode != 0xe0) {

if (prev_scancode == 0xe1 && scancode == 0x1d) {prev_scancode = 0x100;return 0;

}else if (prev_scancode == 0x100

&& scancode == 0x45) {*keycode = E1_PAUSE;prev_scancode = 0;

} else {#ifdef KBD_REPORT_UNKN

if (!raw_mode)printk(KERN_INFO "keyboard: unknown e1 escape sequence\n");

#endifprev_scancode = 0;return 0;

}} else {

prev_scancode = 0;/* * The keyboard maintains its own internal caps lock and * num lock statuses. In caps lock mode E0 AA precedes make * code and E0 2A follows break code. In num lock mode, * E0 2A precedes make code and E0 AA follows break code. * We do our own book-keeping, so we will just ignore these. *//*

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

277

http://www.up-tech.com博创科技(UP-TECH)

Page 278: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

* For my keyboard there is no caps lock mode, but there are * both Shift-L and Shift-R modes. The former mode generates * E0 2A / E0 AA pairs, the latter E0 B6 / E0 36 pairs. * So, we should also ignore the latter. - [email protected] */if (scancode == 0x2a || scancode == 0x36)

return 0;if (e0_keys[scancode])

*keycode = e0_keys[scancode];else {

#ifdef KBD_REPORT_UNKNif (!raw_mode)

printk(KERN_INFO "keyboard: unknown scancode e0 %02x\n", scancode);

#endifreturn 0;

}}

} else if (scancode >= SC_LIM) {

首先, 如前所述, 如果读入的扫描码是0xe0(或0xe1), 那就是扩充键的前缀码。此时的扫描码是个序列, 所以需要为之实现一种”有限状态机”, 全局量prev_scancode 就是用于这个目的。这里先把前缀码作为一种状态保存在prev_scancode 中, 并返回0,表示这个字节应予丢弃。此外,0x00 和0xff不是有效的扫描码, 也要丢弃。对于扫描码本身的处理因是否为扩充键而异。如果prev_scancode 非0,那就说明在此之前的字节是个前缀码, 此时又要看前缀码是否为0xe0 。前缀码0xe1 是个特例, 在按下或放开Pause键的时候, 键盘向主机发出一个三字节的序列[0xe1,0x1d,0x45]或[0xe1,0x1d,0xc5] 。所以代码中为这个序列设置了一个中间状态0x100, 并对这个序列进行校验。如果三个字节都对, 那就是E1_PAUSE, 否则就予以丢弃。除Pause以外, 其他扩充键的前缀码都是0xe0 。前面讲到, 左右两个Shift 键并非扩充键, 但是有些键盘在NumLock 或CapsLock状态下操作左右Shift 键时会把它们当成扩充键。由于Linux 内核自己维持各种锁定状态, 所以丢弃作为扩充键的左右Shift 键扫描码。对于扩充键, 从扫描码到键码的转换由数组e0_keys[]提供:

static unsigned char e0_keys[128] = {0, 0, 0, 0, 0, 0, 0, 0, /* 0x00-0x07 */0, 0, 0, 0, 0, 0, 0, 0, /* 0x08-0x0f */0, 0, 0, 0, 0, 0, 0, 0, /* 0x10-0x17 */

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

278

http://www.up-tech.com博创科技(UP-TECH)

Page 279: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

0, 0, 0, 0, E0_KPENTER, E0_RCTRL, 0, 0, /* 0x18-0x1f */0, 0, 0, 0, 0, 0, 0, 0, /* 0x20-0x27 */0, 0, 0, 0, 0, 0, 0, 0, /* 0x28-0x2f */0, 0, 0, 0, 0, E0_KPSLASH, 0, E0_PRSCR, /* 0x30-0x37 */E0_RALT, 0, 0, 0, 0, E0_F13, E0_F14, E0_HELP, /* 0x38-0x3f */E0_DO, E0_F17, 0, 0, 0, 0, E0_BREAK, E0_HOME, /* 0x40-0x47 */E0_UP, E0_PGUP, 0, E0_LEFT, E0_OK, E0_RIGHT, E0_KPMINPLUS, E0_END,

/* 0x48-0x4f */E0_DOWN, E0_PGDN, E0_INS, E0_DEL, 0, 0, 0, 0, /* 0x50-0x57 */0, 0, 0, E0_MSLW, E0_MSRW, E0_MSTM, 0, 0, /* 0x58-0x5f */0, 0, 0, 0, 0, 0, 0, 0, /* 0x60-0x67 */0, 0, 0, 0, 0, 0, 0, E0_MACRO, /* 0x68-0x6f *///0, 0, 0, 0, 0, 0, 0, 0, /* 0x70-0x77 */0, 0, 0, 0, 0, E0_BACKSLASH, 0, 0, /* 0x70-0x77 */0, 0, 0, E0_YEN, 0, 0, 0, 0 /* 0x78-0x7f */

};

例如, 右Ctrl键的扫描码为[0xe0,0x1d], 所以用0x1d 为下标查得其键码E0_RCTRL。又如PageUp键的扫描码为[0xe0,0x49], 所以用0x49 为下标从表中查得其键码E0_PGUP 。

/* * Translation of escaped scancodes to keycodes. * This is now user-settable. * The keycodes 1-88,96-111,119 are fairly standard, and * should probably not be changed - changing might confuse X. * X also interprets scancode 0x5d (KEY_Begin). * * For 1-88 keycode equals scancode. */#define E0_KPENTER 96#define E0_RCTRL 97#define E0_KPSLASH 98#define E0_PRSCR 99#define E0_RALT 100#define E0_BREAK 101 /* (control-pause) */#define E0_HOME 102#define E0_UP 103#define E0_PGUP 104#define E0_LEFT 105

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

279

http://www.up-tech.com博创科技(UP-TECH)

Page 280: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

#define E0_RIGHT 106#define E0_END 107#define E0_DOWN 108#define E0_PGDN 109#define E0_INS 110#define E0_DEL 111

/* for USB 106 keyboard */#define E0_YEN 124#define E0_BACKSLASH 89#define E1_PAUSE 119

数组e0_keys[] 的内容是可以通过系统调用ioctl()设置的, 但是这里的注释说改了以后可能会使X window 软件弄糊涂。这也部分地回答了读者可能会有的疑问, 就是为什么需要”键码” 。再看不带前缀的扫描码, 即非扩充键的扫描码:

} else if (scancode >= SC_LIM) {/* This happens with the FOCUS 9000 keyboard Its keys PF1..PF12 are reported to generate 55 73 77 78 79 7a 7b 7c 74 7e 6d 6f Moreover, unless repeated, they do not generate key-down events, so we have to zero up_flag below *//* Also, Japanese 86/106 keyboards are reported to generate 0x73 and 0x7d for \ - and \ | respectively. *//* Also, some Brazilian keyboard is reported to produce 0x73 and 0x7e for \ ? and KP-dot, respectively. */

*keycode = high_keys[scancode - SC_LIM];

if (!*keycode) {if (!raw_mode) {

#ifdef KBD_REPORT_UNKNprintk(KERN_INFO "keyboard: unrecognized scancode (%02x)" " - ignored\n", scancode);

#endif}return 0;

}

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

280

http://www.up-tech.com博创科技(UP-TECH)

Page 281: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

} else*keycode = scancode;

return 1;}

常数SC_LIM 的值为89 ,即0x59 。数值小于SC_LIM 的扫描码与键码相同而无需转换:否则便由数组high_key[] 提供转换,转换时以(scancode_SC_LIM) 为下标。如下:

static unsigned char high_keys[128 - SC_LIM] = { RGN1, RGN2, RGN3, RGN4, 0, 0, 0, /* 0x59-0x5f */0, 0, 0, 0, 0, 0, 0, 0, /* 0x60-0x67 */0, 0, 0, 0, 0, FOCUS_PF11, 0, FOCUS_PF12, /* 0x68-0x6f */0, 0, 0, FOCUS_PF2, FOCUS_PF9, 0, 0, FOCUS_PF3, /* 0x70-0x77 */FOCUS_PF4, FOCUS_PF5, FOCUS_PF6, FOCUS_PF7, /* 0x78-0x7b */FOCUS_PF8, JAP_86, FOCUS_PF10, 0 /* 0x7c-0x7f */

};

这个范围中的大多是功能键,其键码的数值在89 ~127范围中,如FOCUS_PF2 就是PF2键的键码(FOCUS_PF1 的数值为85 ,与扫描码相同,所以不在这个数组中) 。

七、实验步骤

1 、阅读和理解源代码进入/arm2410cl/kernel/linux-2.4.18-2410cl/drivers/char ,使用vi编辑器或其他编辑器阅读理解源代码。2 、测试应用程序启动minicom ,将PS/2 鼠标插入开发板右侧的PS/2 接口中,然后执行下面的命令:

[/mnt/yaffs] cd kbd_gpm/[/mnt/yaffs/kbd_gpm] gpm -t ps/2 -m /dev/misc/psaux

在执行完上面的命令后,在屏幕上会看到一个白色的小方块,我们可以使用鼠标进行控制。为了方便使用,我们把上面的命令编辑成了一个脚本文件,你可以直接输入“./gpm.sh”来完成上面的工作。我们还可以进行键盘的测试,在当前目录下还有一个“kbd.sh”文件。执行后,会接管键盘,并在开发板屏幕上显示,运行exit命令从该模式推出

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

281

http://www.up-tech.com博创科技(UP-TECH)

Page 282: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

5.5 SD卡使用实验

一、实验目的

掌握SD 卡规范的概念 学习SD 卡驱动的基本流程 掌握SD 卡驱动的使用

二、实验内容

根据所提供的SD 卡原理图,SD 卡的读写时序,SD 规范理解SD 的驱动函数。

三、预备知识

仔细阅读《SD Memory Card Functional Description 》第4 章。 仔细阅读SD 卡相关模块使用的说明。

四、实验设备及工具

硬件:UP-CUP S2410 经典平台、PC 机Pentium 500 以上, 硬盘10G 以上。软件:PC 机操作系统REDHAT LINUX 9.0 +MINICOM +ARM-LINUX 开发环境

五、实验原理

1 、简介SD 卡是Secure Digital Card 卡的简称,直译成汉语就是“安全数字卡”,是由日本松下公司、东芝公司和美国SANDISK 公司共同开发研制的全新的存储卡产品。SD 存储卡是一个完全开放的标准(系统),多用于MP3 、数码摄像机、数码相机、电子图书、AV 器材等等,尤其是被广泛应用在超薄数码相机上。SD 卡在外形上同MultiMedia Card 卡保持一致,大小尺寸比MMC 卡略厚,容量也大很多。并且兼容MMC 卡接口规范。SD 卡最大的特点就是通过加密功能,可以保证数据资料的安全保密。它还具备版权

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

282

http://www.up-tech.com博创科技(UP-TECH)

Page 283: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

保护技术,所采用的版权保护技术是DVD 中使用的CPRM 技术(可刻录介质内容保护)。2 、SD 存储卡概念SD 卡通信基于9 芯的接口(Clock, Command,4xDat ,3xPower lines),最大的操作频率是25MHz 。SD 卡规范包括多个文档,各文档之间的结构如图5.5.1 所示:

图5.5.1 文档结构3 、SD 卡的总线拓扑SD 卡系统支持两种通信协议:SD 和SPI 方式。模式的选择对主机是透明的,由SD 卡自动检测复位命令的模式,在此后的通信过程中始终使用此种通信方式。SD 卡在结构上使用一主多从星型拓扑结构。拓扑图如图5.5.2 所示:

图5.5.2 SD 卡系统的总线拓扑图4 、SD 总线信号CLK:时钟信号

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

283

http://www.up-tech.com博创科技(UP-TECH)

Page 284: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

CMD :命令/ 相应信号DAT0-DAT3 :双向数据传输信号VDD ,VSS1 ,VSS2 :电源和地信号其原理图如图5.5.3 所示:

图5.5.3 SD 卡原理图5 、SD 总线协议SD 总线上的通信基于位流的方式,在位流中实现命令和数据,包含起始位和停止位。CMD :命令发起一个操作过程。命令可分为地址方式(主机到单个SD 卡)或者广播方式(主机到所有的SD 卡)。Response :是卡对前一个命令的回应,通过CMD 线传输。DAT:通过数据线传输。SD 卡传输数据的单位是块,块数据之后是CRC 位段。SD 卡传输定义单块和多块的传输。其中,多块传输在快速写入中优于单块传输。在数据传输的过程中,可以使用单数据线(DAT0 )或者多数据线(DAT0 -DAT3 )。在CMD 线上,数据传输的次序是先传输高位后传低位。6 、读块时序读块时序如图5.5.4 所示:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

284

http://www.up-tech.com博创科技(UP-TECH)

Page 285: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图5.5.4 读块时序图7 、写块时序写块时序图如图5.5.5 所示:

图5.5.5 写块时序图8 、SD 卡外型和接口标准SD 的外形尺寸是24mm×32mm×2.1mm ,如图5.5.6 所示:

图5.5.6 SD 卡的外形和接口表SD 卡引脚定义如表5.5.1 所示:

表5.5.1 表SD 卡引脚定义

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

285

http://www.up-tech.com博创科技(UP-TECH)

Page 286: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

S :供电,I :输入,O :输出,使用推挽驱动,PP :IO 使用推挽方式。9 、SD 卡命令介绍SD 卡的命令有四种类型: 无响应广播命令 带响应广播命令。各个卡的响应同时进行,这种类型的命令仅用于所用的CMD 线是

分立的-命令和响应会在每根CMD 线上单独进行。 带地址命令-DAT上无数据传输 带地址命令-DAT上有数据传输SD 卡的命令格式如表5.5.2 所示:

表5.5.2 SD 卡的命令格式

注意:SD 卡命令请参见附录10、SD 卡寄存器SD 卡的寄存器描述如表5.5.3 所示:

表5.5.3 SD 卡的寄存器描述名称 位宽 描述CID 128 卡ID 号寄存器,每个卡唯一(必有)

RCA 16 卡相对地址寄存器,卡在系统中的局部地址。在初始化的过程中由卡申请,最终由主机确定(必有)

DSR 16 驱动电压配置寄存器,配置卡的输出驱动。(可选)

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

286

http://www.up-tech.com博创科技(UP-TECH)

Page 287: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

CSD 128 SD 特定数据寄存器,存储关于卡的操作条件。(必有)SCR 64 SD 配置寄存器,存储关于卡的特征和性能(必有)

OCR 32 操作条件寄存器(必有)SD 卡接口定义了六个寄存器:OCR ,CID ,CSD ,RCA ,DSR 和SCR 。这些寄存器仅可以通过响应的命令来读取。OCR ,CID ,CSD 和SCR 寄存器包含卡的状态信息,而RCA 和 DSR 寄存器存储卡的实际配置参数。

OCR 寄存器32 位操作条件寄存器保存有SD 卡的VDD 电压配置。另外,该寄存器包含一个状态信息位。当上电过程结束后,状态信息位就会被置位。设置SD 卡OCR 寄存器的作用是为了操作不支持全操作电压范围的SD 卡。OCR 寄存器的定义如表5.5.4 所示:

表5.5.4 OCR 寄存器定义列表

CID寄存器SD 卡标识寄存器长度128位。包括若干卡识别信息。每个SD 卡都有唯一的一个标识。CID寄存器的结构如表5.5.5 所示:

表5.5.5 CID数据域定义

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

287

http://www.up-tech.com博创科技(UP-TECH)

Page 288: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

CSD寄存器SD 卡相关数据寄存器-提供如何访问卡中内容的信息。CSD 定义数据格式,错误校正类型,最大数据访问时间,是否使用DSR 寄存器。通过使用命令CMD27 来改变该寄存器中的可更改内容。如表5.5.6 所示:

表5.5.6 CSD 数据域定义

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

288

http://www.up-tech.com博创科技(UP-TECH)

Page 289: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

RCA 寄存器

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

289

http://www.up-tech.com博创科技(UP-TECH)

Page 290: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

可写16 位相对地址寄存器,由卡在SD 识别器件发送。相对地址用于SD 卡与主机之间进行通讯。缺省的RCA 值是0x0000 。此值同样用于设置所有的卡进入Stand-by 状态(CMD7)

DSR寄存器上文有述,DSR 寄存器主要用于设定SD 卡的驱动电平范围。用以提高SD 卡的总线性能。缺省DSR 值为0x404 。

SCR寄存器提供SD 中的配置状态。其结构如表5.5.7 所示:

表5.5.7 SD 数据域定义

11、SD 卡详细介绍主机和SD 卡之间的通讯过程由主机统一控制。主机发出的命令由两种类型:广播命令和地址(点到点)命令。SD 卡通讯中使用两种模式:卡识别模式和数据传输模式。

卡识别模式主机复位后进入卡识别模式来搜索新卡。卡会保持此种模式直到收到命令SEND_RCA (CMD3)在此种模式中,主机复位所有的SD 卡,校验操作电压范围,请求SD 相对卡地址(RCA )。此种操作通过选择它们的命令线依次对每个SD 卡进行。在卡识别模式下进行的数据通信全部在CMD 线上传输的。在卡识别模式的数据状态图5.5.7 :

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

290

http://www.up-tech.com博创科技(UP-TECH)

Page 291: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图5.5.7 SD 卡识别过程复位后总线进入有效的状态,主机会分别请求每个SD 卡发出他们的有效操作条件(APP_CMD_CMD55 + ACMD41 ,其中,RCA=0x0000 )。ACMD41 命令的响应是OCR 寄存器的内容。不兼容的卡就会进入Inactive 状态。此后,主机发出ALL_SEND_CID (CMD2) 命令,获取每个卡的ID 号。当SD 卡发送CID 数据后,进入Identification 状态。之后,主机发送CMD3 (SEND_RELATIVE_ADDR) 命令请求卡发送其新的RCA 地址(发送之后,卡进入the Stand-by State )。此时,如果主机要求SD 卡更换RCA 地址的话就会重复发送CMD3要求新的RCA 地址。SD 卡最终发送的RCA 地址就是实际的RCA 。

数据传输模式卡识别过程结束后,进入数据传输模式。在此模式中,主机发送SEND_CSD (CMD9) 命令获取卡的CSD 寄存器的内容(例如:传输块的长度,卡存储容量)。发送SET_DSR (CMD4) 配置所有识别卡的驱动电压范围。发送CMD7来选择一个卡进入传输状态(Transfer State),在任意时刻,只有一个卡可以处于该状态。当发送的CMD7中的RCA 为“0x0000” 时,所有的卡进入Stand-by 状态,如图5.5.8 所示。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

291

http://www.up-tech.com博创科技(UP-TECH)

Page 292: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图5.5.8 SD 卡状态图(数据传输模式)数据传输模式摘要如下:

所有的数据读取命令在主机发出CMD12 之后被中断。数据传输过程被中断并返回到Transfer 状态。读取命令包括:CMD17-读取块,CMD18-读取多个块,CMD30-发送写保护,ACMD51- 发送SCR ,CMD56-读入模式通用命令。所有的数据写入命令在主机发出CMD12 之后被中断。写命令必须在SD 卡处于非选定状态之前停止(卡状态切换命令:CMD7)。写命令包括:CMD24 、CMD25-写块,CMD26-写CSD ,CMD42-锁和解锁命令,CMD56-写模式通用命令。当数据发送完毕后,SD 卡退出数据写入状态返回到如下的两种状态:编程状态(发送成功)或者传输状态(发送失败)。如果写入块的操作停止后,块长和CRC 校验有效,数据就会在SD 卡中编程。SD 卡提供数据缓冲的功能用于写块,如果写缓冲区满,只要卡仍然处于编程状态,数据线DAT0 就会保持低(忙状态)。对于命令CSD 、CID 、写保护和擦除操作没有相应的数据缓冲区。编程中不能使用参数设置命令。参数设置命令包括:设定块长度(CMD16 )、擦除快起始(CMD32 )、擦除快中止(CMD33 )

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

292

http://www.up-tech.com博创科技(UP-TECH)

Page 293: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

编程中不可以使用读命令。擦除和编程中CMD7无效。擦除和编程完成后SD 卡会进入Disconnect 状态释放数据线。使用命令CMD7,SD 卡可以重新选择在Disconnect 状态。复位SD 卡(命令CMD0和CMD15 )将结束任何处于等待或正在进行的编程操作,这会破坏卡中的保存的数据的内容。

六、程序分析

驱动程序代码参考:struct mmc_slot {

/* power up */void (*power_up)(struct mmc_slot *slot);/* power down */void (*power_down)(struct mmc_slot *slot);/* wait for reset */void (*wait_for_reset)(struct mmc_slot *slot);/* set clock rate */void (*set_clock)(struct mmc_slot *slot, int rate);/* send command and receive response */int (*send_cmd)(struct mmc_slot *slot, struct mmc_cmd *cmd);/* transfer 1 block for Memory Card */int (*transfer1b)(struct mmc_slot *slot, int rd, u_long from, u_char *buf);struct semaphore mutex; /* for exclusive I/O */__u8 id; /* slot id(begins at 0) assigned by slot driver */__u8 narrow_bus; /* if true, support only narrow bus *//* MMC card information */unsigned int read_len; /* read block length */unsigned int write_len; /* write block length */u_long size; /* total size of card in bytes */u_long stat; /* card status */__u8 readonly; /* If true, it's readonly *//* Temporary registers */RCA_regs rca;CID_regs cid;OCR_regs ocr;CSD_regs csd;R1_status r1;

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

293

http://www.up-tech.com博创科技(UP-TECH)

Page 294: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

void *priv;};/* MMC Command request type */struct mmc_cmd {

__u8 cmd; /* command */__u32 arg; /* command argument */__u8 res_type; /* response type */__u8 res_flag; /* response flag */__u8 res[MMC_RES_LEN_LONG]; /* response buffer */__u8 *data; /* pointer to data buffer */__u32 data_len; /* data length */__u32 t_res; /* timing between command and response */__u32 t_fin; /* timing after response */

};//mmc_slot_s3c2410.c/* * drivers/mmc/mmc_slot_s3c2410.c * * MMC slot interfaces specific to S3C2410 SD Controller * * Copyright (C) 2002-2003 MIZI Research, Inc. * * Author: Chan Gyun Jeong <[email protected]> * $Id: mmc_slot_s3c2410.c,v 1.2 2004/01/26 08:29:56 laputa Exp $ * * Revision History: * * 2002-12-07 Chan Gyun Jeong [email protected] * - initial release * * 2003-01-13 Chan Gyun Jeong <[email protected]> * - clean up, and sort of improvements * * 2003-01-17 Chan Gyun Jeong <[email protected]> * - support for interrupt-driven data I/O * * 2004-01-06 kwang hyun LA <laputa: [email protected]> * - pre-scaler caculate method changed for s3c2410 * * */#include <linux/config.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/irq.h>#include <linux/delay.h>#include <asm/hardware.h>#include <asm/arch/cpu_s3c2410.h>#include "mmc.h"

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

294

http://www.up-tech.com博创科技(UP-TECH)

Page 295: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

/* Board-specific definitions */#ifdef CONFIG_S3C2410_SMDK#define SD_GPIO_CD GPIO_nCD_SD#define SD_IRQ_CD IRQ_nCD_SD#define SD_CD_LOWACTIVE#undef USE_POLLING#define USE_INTERRUPT#endifstatic struct tq_struct card_detect_task;static volatile int card_in;#ifdef USE_INTERRUPTstatic DECLARE_WAIT_QUEUE_HEAD(wq);static volatile int reading;static u_char *buffer;static int bufcnt;static int datalen;static volatile int error;#endif// 读写数据/* * MMC Data R/W functions */static int read_data(struct mmc_slot *slot, u_char *buf, int len) {#ifdef USE_POLLING

int i = 0;int cnt;u32 stat;DEBUG2(4, "[%s] ", __FUNCTION__);while (i < len) {

stat = SDIDSTA;if (!card_in) {

SDIDSTA = stat;return -ENODEV;

}if (stat & SDIDSTA_TOUT) {

DEBUG2(2, "[%s] Timeout Error\n", __FUNCTION__);SDIDSTA = stat; /* clear */

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

295

http://www.up-tech.com博创科技(UP-TECH)

Page 296: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

return -EIO;}stat = SDIFSTA;if (stat & SDIFSTA_RX) {

cnt = (stat & SDIFSTA_CNT);while (cnt) {

*((u32 *)(buf + i)) = SDIDAT;#ifdef CONFIG_MMC_DEBUG

DEBUG2(4, "%02x", buf[i + 0]);DEBUG2(4, "%02x", buf[i + 1]);DEBUG2(4, "%02x", buf[i + 2]);DEBUG2(4, "%02x", buf[i + 3]);

#endifi += sizeof(u32);cnt -= sizeof(u32);

}}

}DEBUG2(4, "\n");do {

stat = SDIDSTA;if (!card_in) {

SDIDSTA = stat;return -ENODEV;

}} while (!(stat & SDIDSTA_TOUT) && !(stat & SDIDSTA_DFIN));SDIDSTA = stat; /* clear */return 0;

#elif defined(USE_INTERRUPT)interruptible_sleep_on(&wq);if (!card_in) {

return -ENODEV;}if (error) {

return -EIO;}return 0;

#endif /* USE_POLLING */

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

296

http://www.up-tech.com博创科技(UP-TECH)

Page 297: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

}static int write_data(struct mmc_slot *slot, const u_char *buf, int len){#ifdef USE_POLLING

int i;int cnt;u32 stat;

#ifdef CONFIG_MMC_DEBUGDEBUG2(4, "[%s] ", __FUNCTION__);for(i = 0; i < len; i++)

DEBUG2(4, "%02x", buf[i]);DEBUG2(4, "\n");

#endifi = 0;while (i < len) {

stat = SDIFSTA;if (!card_in) {

SDIDSTA = stat;return -ENODEV;

}if (stat & SDIFSTA_TX) {

cnt = SDI_MAX_TX_FIFO - (stat & SDIFSTA_CNT);while (cnt) {

SDIDAT = *((u32 *)(buf + i));i += sizeof(u32);cnt -= sizeof(u32);

}}

}do {

stat = SDIDSTA;if (!card_in) {

SDIDSTA = stat;return -ENODEV;

}} while (!(stat & SDIDSTA_TOUT) && !(stat & SDIDSTA_DFIN));SDIDSTA = stat; /* clear */return 0;

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

297

http://www.up-tech.com博创科技(UP-TECH)

Page 298: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

#elif defined(USE_INTERRUPT)interruptible_sleep_on(&wq);if (!card_in) {

return -ENODEV;}if (error) {

return -EIO;}return 0;

#endif /* USE_POLLING */}//sdi 中断服务程序static void sdi_interrupt(int irq, void *dev_id, struct pt_regs *regs){

u32 stat;u32 cnt;if (reading) {

#ifdef CONFIG_MMC_DEBUGif (bufcnt == 0) {

DEBUG2(4, "[%s] RX: ", __FUNCTION__);}

#endifstat = SDIFSTA;if (stat & SDIFSTA_RX_LAST) {

DEBUG2(5, "\nRX_LAST\n");cnt = (stat & SDIFSTA_CNT) / sizeof(u32);while (cnt) {

*((u32 *)(buffer + bufcnt)) = SDIDAT;#ifdef CONFIG_MMC_DEBUG

DEBUG2(4, "%02x", buffer[bufcnt + 0]);DEBUG2(4, "%02x", buffer[bufcnt + 1]);DEBUG2(4, "%02x", buffer[bufcnt + 2]);DEBUG2(4, "%02x", buffer[bufcnt + 3]);

#endifbufcnt += sizeof(u32);cnt--;

}} else if (stat & SDIFSTA_RX_FULL) {

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

298

http://www.up-tech.com博创科技(UP-TECH)

Page 299: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

DEBUG2(5, "\nRX_FULL\n");cnt = SDI_MAX_RX_FIFO / sizeof(u32);while (cnt && bufcnt < datalen) {

*((u32 *)(buffer + bufcnt)) = SDIDAT;#ifdef CONFIG_MMC_DEBUG

DEBUG2(4, "%02x", buffer[bufcnt + 0]);DEBUG2(4, "%02x", buffer[bufcnt + 1]);DEBUG2(4, "%02x", buffer[bufcnt + 2]);DEBUG2(4, "%02x", buffer[bufcnt + 3]);

#endifbufcnt += sizeof(u32);cnt--;

}}stat = SDIDSTA;if (stat & SDIDSTA_DFIN) {

DEBUG2(4, "\n");DEBUG2(5, "DFIN\n");SDIDSTA = stat;wake_up_interruptible(&wq);

} else if (stat & SDIDSTA_TOUT) {DEBUG2(4, "\n");DEBUG2(5, "DTOUT\n");SDIDSTA = stat;error = 1;wake_up_interruptible(&wq);

}} else {

stat = SDIFSTA;if (stat & SDIFSTA_TX_EMP) {

DEBUG2(5, "TX_EMP\n");cnt = SDI_MAX_TX_FIFO / sizeof(u32);while (cnt && bufcnt < datalen) {

SDIDAT = *((u32 *)(buffer + bufcnt));bufcnt += sizeof(u32);cnt--;

}}

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

299

http://www.up-tech.com博创科技(UP-TECH)

Page 300: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

stat = SDIDSTA;if (stat & SDIDSTA_DFIN) {

DEBUG2(5, "DFIN\n");SDIDSTA = stat;wake_up_interruptible(&wq);

} else if (stat & SDIDSTA_TOUT) {DEBUG2(5, "DTOUT\n");SDIDSTA = stat;error = 1;wake_up_interruptible(&wq);

}}

}// 发送sd命令函数 send_cmdstatic int send_cmd(struct mmc_slot *slot, struct mmc_cmd *cmd){

int ret;u32 stat;if (cmd->res_flag & MMC_RES_FLAG_RDATA) {

#ifdef USE_INTERRUPTSDIIMSK = SDIIMSK_TOUT | SDIIMSK_DFIN | SDIIMSK_RX_LAST |

SDIIMSK_RX_FULL;reading = 1;buffer = cmd->data;bufcnt = 0;datalen = cmd->data_len;error = 0;

#endifstat = SDIDCON_RACMD_1 | SDIDCON_BLK | SDIDCON_RX | 1 << 0;SDIBSIZE = cmd->data_len;SDICON |= SDICON_FRESET;SDIDCON = stat;

} else if (cmd->res_flag & MMC_RES_FLAG_WDATA) {#ifdef USE_INTERRUPT

SDIIMSK = SDIIMSK_TOUT | SDIIMSK_DFIN | SDIIMSK_TX_EMP; reading = 0;buffer = cmd->data;bufcnt = 0;

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

300

http://www.up-tech.com博创科技(UP-TECH)

Page 301: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

datalen = cmd->data_len;error = 0;

#endifstat = SDIDCON_TARSP_1 | SDIDCON_BLK | SDIDCON_TX | 1 << 0;SDIBSIZE = cmd->data_len;SDICON |= SDICON_FRESET;SDIDCON = stat;

} else if (cmd->res_flag & MMC_RES_FLAG_DATALINE) {#ifdef USE_INTERRUPT

SDIIMSK = SDIIMSK_TOUT | SDIIMSK_DFIN | SDIIMSK_RX_LAST | SDIIMSK_RX_FULL;

reading = 1;buffer = cmd->res;bufcnt = 0;datalen = cmd->data_len;error = 0;

#endifstat = SDIDCON_RACMD_1 | SDIDCON_BLK | SDIDCON_RX | 1 << 0;SDIBSIZE = cmd->data_len;SDICON |= SDICON_FRESET;SDIDCON = stat;

}stat = SDICCON_START | cmd->cmd;if (cmd->res_type != MMC_RES_TYPE_NONE) {

stat |= SDICCON_WRSP;if (cmd->res_type == MMC_RES_TYPE_R2) {

stat |= SDICCON_LRSP;}

}SDICARG = cmd->arg;SDICCON = stat;if (cmd->res_type != MMC_RES_TYPE_NONE) {

if (cmd->res_flag & MMC_RES_FLAG_DATALINE) {ret = read_data(slot, cmd->res, cmd->data_len);goto cmdexit;

} else {while(1) {

stat = SDICSTA;

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

301

http://www.up-tech.com博创科技(UP-TECH)

Page 302: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

if (!card_in) {SDICSTA = stat;return -ENODEV;

}if (stat & SDICSTA_TOUT) {

ret = -ETIMEDOUT;SDICSTA = stat; /* clear bits */DEBUG2(2, "[%s] Timeout Error\n", __FUNCTION__);goto cmdexit;

}if (stat & SDICSTA_RSP) break;

}if (!(cmd->res_flag & MMC_RES_FLAG_NOCRC)) {

if ((stat & SDICSTA_ALLFLAG) != (SDICSTA_SENT | SDICSTA_RSP)) {

#if 0ret = -EIO;SDICSTA = stat; /* clear bits */DEBUG2(2, "[%s] CRC Error\n", __FUNCTION__);goto cmdexit;

#endif}

}SDICSTA = stat; /* clear bits */if (cmd->res_flag & MMC_RES_FLAG_RDATA) {

ret = read_data(slot, cmd->data, cmd->data_len);

goto cmdexit;}if (cmd->res_flag & MMC_RES_FLAG_WDATA) {

ret = write_data(slot, cmd->data, cmd->data_len);

goto cmdexit;}if (mmc_get_res_len(cmd->res_type) == MMC_RES_LEN_LONG) {

stat = SDIRSP0;

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

302

http://www.up-tech.com博创科技(UP-TECH)

Page 303: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

stat = cpu_to_be32(stat);memcpy(cmd->res, &stat, sizeof(stat));stat = SDIRSP1;stat = cpu_to_be32(stat);memcpy(cmd->res + (1 * sizeof(stat)), &stat, sizeof(stat));stat = SDIRSP2;stat = cpu_to_be32(stat);memcpy(cmd->res + (2 * sizeof(stat)), &stat, sizeof(stat));stat = SDIRSP3;stat = cpu_to_be32(stat);memcpy(cmd->res + (3 * sizeof(stat)), &stat, sizeof(stat));

} else {stat = SDIRSP0;stat = cpu_to_be32(stat);memcpy(cmd->res, &stat, sizeof(stat));stat = SDIRSP1;stat = cpu_to_be32(stat);memcpy(cmd->res + (1 * sizeof(stat)), &stat, sizeof(stat));

}}

} else {do {

stat = SDICSTA;if (!card_in) {

SDICSTA = stat;return -ENODEV;

}} while (!(stat & SDICSTA_SENT));SDICSTA = stat; /* clear bits */

}ret = 0;

cmdexit:return ret;

}

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

303

http://www.up-tech.com博创科技(UP-TECH)

Page 304: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

//sd 模块初始化程序static int __init init_mmc_slot_s3c2410(void){

int ret;/* Initialize status variables */card_in = 0;/* Initialize h/w settings */set_gpio_ctrl(GPIO_SDDAT3 | GPIO_MODE_SDDAT | GPIO_PULLUP_EN);set_gpio_ctrl(GPIO_SDDAT2 | GPIO_MODE_SDDAT | GPIO_PULLUP_EN);set_gpio_ctrl(GPIO_SDDAT1 | GPIO_MODE_SDDAT | GPIO_PULLUP_EN);set_gpio_ctrl(GPIO_SDDAT0 | GPIO_MODE_SDDAT | GPIO_PULLUP_EN);set_gpio_ctrl(GPIO_SDCMD | GPIO_MODE_SDCMD | GPIO_PULLUP_EN);set_gpio_ctrl(GPIO_SDCLK | GPIO_MODE_SDCLK | GPIO_PULLUP_EN);

#ifdef CONFIG_S3C2410_SMDKset_gpio_ctrl(SD_GPIO_CD);

#endif/* Register IRQ handlers */set_external_irq(SD_IRQ_CD, EXT_BOTH_EDGES, GPIO_PULLUP_DIS);ret = request_irq(SD_IRQ_CD, card_detect_interrupt,

SA_INTERRUPT, "SD CD", (void *)&slot);if (ret) {

printk("MMC Slot: request_irq(SD CD) failed\n");goto err1;

}#ifdef USE_INTERRUPT

ret = request_irq(IRQ_SDI, sdi_interrupt, SA_INTERRUPT, "SDI", (void *)&slot);

if (ret) {printk("MMC Slot: request_irq(SDI) failed\n");goto err2;

}#endif

printk("MMC Slot initialized\n");card_detect_interrupt(SD_IRQ_CD, (void *)&slot, NULL);return 0;

#ifdef USE_INTERRUPT err2:

free_irq(SD_IRQ_CD, (void *)&slot);

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

304

http://www.up-tech.com博创科技(UP-TECH)

Page 305: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

#endif err1:

return ret;}

七、实验步骤

本实验中,SD 卡以模块的形式编译在内核源码中。进行SD 卡实验的步骤是:1 、编译SD 驱动模块

[root@zxt /]# cd /arm2410cl/kernel/linux-2.4.18-2410cl/[root@zxt kernel-2410classic]# make menuconfig

进入Main Menu → SD/MMC→SD/MMC devices 菜单,选择如图所示:

编译内核模块:make depmakemake modules

编译后在下面的目录中生成三个模块文件,在本实验中我们已经把这三个文件复制到了/mnt/yaffs/sdcard 中。这三个文件分别为:mmc_core.o 、mmc_disk.o、mmc_slot_s3c2410.o 。

/arm2410cl/kernel/linux-2.4.18-2410cl/drivers/mmc/

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

305

http://www.up-tech.com博创科技(UP-TECH)

Page 306: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

2 、下载调试切换到minicom 终端窗口,使用NFS mount 开发主机的/arm2410cl 到/host 目录,然后插入SD 卡驱动模块。我们已经把三个驱动文件做成了一个脚本文件,用户可以直接运行脚本文件来实现驱动模块的插入功能。

[/mnt/yaffs]cd sdcard/[/mnt/yaffs/sdcard]./inssd.shUsing mmc_core.oWarning: loading mmc_core will taint the kernel: non-GPL license - Not GPL, Proprietary

License See http://www.tux.org/lkml/#export-tainted for information about tainted modulesUsing mmc_slot_s3c2410.oWarning: loading mmc_slot_s3c2410 will taint the kernel: non-GPLM licenseM- NotSee http://wwS.tux.org/lkml/#lxport-tainted for information atbout tainted modules

initializedUsing mmc_disk.oWarning: loading mmc_disk will taint the kernel: non-GPL license - Not GPL, Proprietary

License See http://www.tux.org/lkml/#export-tainted for information about tainted modulesSD Memory Card IDentified ID=0x3102. Use SDMC DriverPartition check: mmca: p1

3 、测试SD 卡当设备正确检测到SD 卡并识别后,我们就可以通过mount 命令来挂载我们的SD 卡了。挂载成功后我们可以使用cp 、mkdir、rm 等命令对SD 卡上的文件进行操作。

[/mnt/yaffs/sdcard]cd /mnt/[/mnt]mount sdcard/MSDOS FS: Using codepage 936MSDOS FS: IO charset cp936[/mnt]cd sdcard/[/mnt/sdcard]lsmplayer2 xyt.avi

八、思考题

如果在SD 总线上接入两个SD 设备,电路、驱动程序要进行怎样的修改?

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

306

http://www.up-tech.com博创科技(UP-TECH)

Page 307: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

5.6 IDE_ 硬盘读写实验

一、实验目的

了解在ARM2410-S 平台上实现IDE_ 硬盘Linux 驱动程序的基本原理。 了解Linux 驱动开发的基本过程。

二、实验内容

以一个简单块设备驱动程序为原型,剖析其基本结构。进行部分改写之后并编译实现其相应功能。

三、预备知识

掌握在Linux 集成开发环境中编写和调试程序的基本过程。 了解ARM 芯片(本实验是针对ARMS3C2410系列)的基本结构。 了解Linux 内核中关于设备控制的基本原理。

四、实验设备及工具

硬件:UP-CUP S2410 经典平台、PC 机Pentium 500 以上, 硬盘10G 以上。软件:PC 机操作系统REDHAT LINUX 9.0 +MINICOM +ARM-LINUX 开发环境

五、实验原理

1 、IDE 设备驱动基础知识介绍 Linux 对物理设备的管理:

在硬件系统中,CPU 并不是系统中唯一的智能设备,每个物理设备都拥有自己的控制器。键盘、鼠标和串行口由一个高级I/O 芯片统一管理,IDE 控制器控制IDE 硬盘而SCSI 控制器控制SCSI 硬盘等等。每个硬件控制器都有各自的控制和状态寄存器(CSR )并且各不相同。例如Adaptec 2940 SCSI 控制器的CSR 与NCR 810SCSI 控制器完全不一

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

307

http://www.up-tech.com博创科技(UP-TECH)

Page 308: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

样。这些CSR 被用来启动和停止、初始化设备及对设备进行诊断。在Linux 中管理硬件设备控制器的代码并没有放置在每个应用程序中而是由内核统一管理。这些处理和管理硬件控制器的软件就是设备驱动。Linux 核心设备驱动是一组运行在特权级上的内存驻留底层硬件处理共享库。由它们负责管理各个设备。设备驱动的一个基本特征是设备处理的抽象概念。所有硬件设备都被看成普通文件;可以通过和操纵普通文件相同的标准系统调用来打开、关闭、读取和写入设备。系统中每个设备都用一种特殊的设备相关文件来表示(devicespecial file) ,例如系统中第一个IDE 硬盘被表示成/dev/hda 。块(磁盘)设备和字符设备的设备相关文件可以通过mknod 命令来创建,并使用主从设备号来描叙此设备。网络设备也用设备相关文件来表示,但Linux 寻找和初始化 网络设备时才建立这种文件。由同一个设备驱动控制的所有设备具有相同的主设备号。从设备号则被用来区分具有相同主设备号且由相同设备驱动控制的不同设备。例如主IDE 硬盘的每个分区的从设备号都不相同。如/dev/hda2 表示主IDE 硬盘的主设备号为3 而从设备号为2 。Linux 通过使用主从设备号将包含在系统调用中的(如将一个文件系统mount 到一个块设备)设备相关文件映射到设备的设备驱动以及大量系统表格中,如字符设备表,chrdevs。Linux 支持字符、块及网络三类硬件设备。字符设备指那些无需缓冲直接按顺序读写的设备,如系统的串口设备/dev/cua0和/dev/cua1。块设备则仅能以块为单位随机读写,即不管块位于设备中何处都可以对其进行读写,典型的块大小为512或1024 字节。块设备可以通过其设备相关文件进行访问,但更为平常的访问方法是通过文件系统。只有块设备才能支持可安装文件系统。网络设备可以通过BSD 套接口访问。设备驱动必须为Linux 核心或者其从属子系统提供一个标准接口。例如终端驱动为Linux核心提供了一个文件I/O 接口而SCSI 设备驱动为SCSI 子系统提供了一个SCSI 设备接口,同时此子系统为核心提供了文件I/O 和buffer cache 接口。设备驱动可以使用标准的核心服务如内存分配、中断发送和等待队列等等。多数Linux 设备驱动可以在核心模块发出加载请求时加载,同时在不再使用时卸载。这样核心能有效地利用系统资源。Linux设备驱动可以连接到核心中。当核心被编译时,哪些核心被连入核心是可配置的。当系统启动及设备驱动初始化时将查找它所控制的硬件设备。如果某个设备的驱动为一个空过程并不会有什么问题。此时此设备驱动仅仅是一个冗余的程序,它除了会占用少量系统内存外不会对系统造成什么危害。设备被执行某个命令时,如“将读取磁头移动到硬盘的第48 扇区上”,设备驱动可以从轮询方式和中断方式中选择一种以判断设备是否已经完成此命令。

轮询与中断:轮询方式意味着需要经常读取设备的状态,一直到设备状态表明请求已经完成为止。如果设备驱动被连接进入核心,这时使用轮询方式将会带来灾难性后果:核心将在此过程中无所事事,直到设备完成此请求。但是轮询设备驱动可以通过使用系统定时器,使核心周期性调用设备驱动中的某个例程来检查设备状态。定时器过程可以检查命令状态及Linux 软盘驱动的工作情况。使用定时器是轮询方式中最好的一种,但更有效的方法是使用中断。基于中断的设备驱动会在它所控制的硬件设备需要服务时引发一个硬件中断。Linux 核心

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

308

http://www.up-tech.com博创科技(UP-TECH)

Page 309: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

需要将来自硬件设备的中断传递到相应的设备驱动。这个过程由设备驱动向核心注册其使用的中断来协助完成。此中断处理例程的地址和中断号都将被记录下来。对中断资源的请求一部分在驱动初始化时就已经完成,一些中断,如PCI 设备中断,在启动时进行动态分配。设备驱动必须在取得对此中断的所有权之前找到它所控制设备的中断号(IRQ)。如何将中断发送给CPU 本身取决于体系结构,但是在多数体系结构中,中断以一种特殊模式发送同时还将阻止系统中其它中断的产生。设备驱动在其中断处理过程中作的越少越好,这样Linux 核心将能很快的处理完中断并返回中断前的状态中。为了在接收中断时完成大量工作,设备驱动必须能够使用核心的底层处理例程或者任务队列来对以后需要调用的那些例程进行排队。

直接存储访问(DMA):

数据量比较少时,使用中断驱动设备驱动程序能顺利地在硬件设备和内存之间交换数据。例如波特率为9600 的modem 可以每毫秒传输一个字符。如果硬件设备引起中断和调用设备驱动中断所消耗的中断时延比较大(如2 毫秒)则系统的综合数据传输率会很低。则9600 波特率modem 的数据传输只能利用0.002% 的CPU 处理时间。高速设备如硬盘控制器或者以太网设备数据传输率将更高。SCSI 设备的数据传输率可达到每秒40M 字节。直接内存存取(DMA )是解决此类问题的有效方法。DMA 控制器可以在不受处理器干预的情况下在设备和系统内存之间高速传输数据。在传输过程中CPU 可以转去执行其他任务。设备驱动使用DMA 时必须十分小心。首先DMA 控制器没有任何虚拟内存的概念,它只存取系统中的物理内存。同时用作DMA 传输缓冲的内存空间必须是连续物理内存块。这意味着不能在进程虚拟地址空间内直接使用DMA 。但是你可以将进程的物理页面加锁以防止在DMA 操作过程中被交换到交换设备上去。另外DMA 控制器所存取物理内存有限。DMA 通道地址寄存器代表DMA 地址的高16 位而页面寄存器记录的是其余8 位。所以DMA 请求被限制到内存最低16M 字节中。DMA 通道是非常珍贵的资源,并且还不能够在设备驱动间共享。与中断一样,设备驱动必须找到它应该使用那个DMA通道。有些设备使用固定的DMA 通道。有时设备的DMA 通道可以由跳线来设置,许多以太网设备使用这种技术。设计灵活的设备将告诉系统它将使用哪个DMA 通道,此时设备驱动仅需要从DMA 通道中选取即可。 Linux 通过dma_chan (每个DMA 通道一个)数组来跟踪DMA 通道的使用情况。dma_chan 结构中包含有两个域,一个是指向此DMA 通道拥有者的指针,另一个指示DMA 通道是否已经被分配出去。当敲入cat/proc/dma打印出来的结果就是dma_chan 结构数组。

设备驱动与核心接口:Linux 核心与设备驱动之间必须有一个以标准方式进行互操作的接口。每一类设备驱动:字符设备、块设备及网络设备都提供了通用接口以便在需要时为核心提供服务。这种通用接口使得核心可以以相同的方式来对待不同的设备及设备驱动。如SCSI 和IDE 硬盘的区别很大但Linux 对它们使用相同的接口。Linux 动态性很强,每次Linux 核心启动时如遇到不同的物理设备将需要不同的物理设备驱动。Linux 允许通过配置脚本在核心重建时将设备驱动包含在内。设备驱动在启动初始化时可能会发现系统中根本没有任何硬件需要控

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

309

http://www.up-tech.com博创科技(UP-TECH)

Page 310: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

制。其它设备驱动可以在必要时作为核心模块动态加载到。为了处理设备驱动的动态属性,设备驱动在初始化时将其注册到核心中去。Linux 维护着已注册设备驱动表作为和设备驱动的接口。这些表中包含支持此类设备例程的指针和相关信息。

设备驱动程序框架:Linux 的设备驱动程序与外接的接口可以分为以下3 部分。

(1 ) 驱动程序与内核的接口,这是通过数据结构file_operations来完成的。(2 ) 驱动程序与系统引导的接口,这部分利用驱动程序对设备进行初始化。(3 ) 驱动程序与设备的接口,这部分描述了驱动程序如何与设备进行交互,

这与具体设备密切相关。根据功能,驱动程序的代码可以分为如下几个部分。

(1 ) 驱动程序的注册和注销。(2 ) 设备的打开与释放。(3 ) 设备的读和写操作。(4 ) 设备的控制操作。(5 ) 设备的中断和查询处理。

IDE 硬盘介绍:Linux 系统上使用得最广泛的硬盘是集成电子磁盘或者IDE 硬盘。IDE 是一个硬盘接口而不是类似SCSI 的I/O 总线接口。每个IDE 控制器支持两个硬盘,一个为主另一个为从。主从硬盘可以通过盘上的跳线来设置。Linux 以其发现控制器的顺序来对IDE 硬盘进行命名。在主控制器中的主盘为/dev/hda而从盘为/dev/hdb 。/dev/hdc 用来表示从属IDE 控制器中的主盘。IDE 子系统将向Linux 核心注册IDE 控制器而不是IDE 硬盘。主IDE 控制器的主标志符为3 而从属IDE 控制器的主标志符为22 。如果系统中包含两个IDE 控制器则IDE 子系统的入口在blk_dev和blkdevs 数组的第2 和第22 处。IDE 的块设备文件反应了这种编号方式,硬盘/dev/hda 和/dev/hdb 都连接到主IDE 控制器上,其主标志符为3 。对IDE 子系统上这些块相关文件的文件或者buffercache的操作都通过核心使用主设备标志符作为索引定向到 IDE 子系统上。当发出请求时,此请求由哪个IDE 硬盘来完成取决于IDE 子系统。为了作到这一点IDE 子系统使用从设备编号对应的设备特殊标志符,由它包含的信息来将请求发送到正确的硬盘上。位于主IDE 控制器上的IDE 从盘/dev/hdb 的设备标志符为(3 ,64 )。而此盘中第一个分区(/dev/hdb1 )的设备标志符为(3 ,65) 。 IDE 子系统初始化: Linux 可以支持的最多IDE 控制器个数为4 。每个控制器用ide_hwifs 数组中的ide_hwif_t 结构来表示。每个ide_hwif_t 结构包含两个ide_drive_t 结构以支持主从IDE 驱动器。在IDE 子系统的初始化过程中Linux 通过访问系统CMOS来判断是否有关于硬盘的信息。这种CMOS由电池供电所以系统断电时也不会遗失其中的内容。它位于永不停止的系统实时时钟设备中。此CMOS内存的位置由系统BIOS 来设置,它将通知Linux

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

310

http://www.up-tech.com博创科技(UP-TECH)

Page 311: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

系统中有多少个IDE 控制器与驱动器。Linux 使用这些从BIOS 中发现的磁盘数据来建立对应此驱动器的ide_hwif_t 结构。许多现代PC 系统使用PCI 芯片组如Intel 82430 VX 芯片组将PCIEIDE控制器封装在内。IDE 子系统使用PCI BIOS 回调函数来定位系统中PCI (E )IDE 控制器。然后对这些芯片组调用PCI 特定查询例程。每次找到一个IDE接口或控制器就有建立一个ide_hwif_t 结构来表示控制器和与之相连的硬盘。在操作过程中IDE 驱动器对I/O 内存空间中的IDE 命令寄存器写入命令。主IDE 控制器的缺省控制和状态寄存器是0x1F0- 0x1F7 。这个地址由早期的IBM PC 规范设定。IDE 驱动器为每个控制器向Linux 注册块缓冲cache和VFS节点并将其加入到blk_dev 和blkdevs 数组中。IDE 驱动器需要申请某个中断。一般主IDE 控制器中断号为14 而从属IDE 控制器为 15 。然而这些都可以通过命令行选项由核心来重载。IDE 驱动器同时还将gendisk入口加入到启动时发现的每个IDE 控制器的gendisk链表中去。分区检查代码知道每个IDE 控制器可能包含两个IDE 硬盘。2 、硬件连接图

S3C2410 的IO 引脚与IDE 硬盘的硬件接线图如图5.6.3所示。表5.6.3 为S3C2410 的IO 引脚与IDE 硬盘引脚连接分配表,表中描述了各IO 引脚与IDE 硬盘对应的控制信号线,根据表中的描述配置S3C2410 相关的寄存器。

表5.6.3 S3C2410的IO 引脚与IDE 硬盘连接引脚分配S3C24

10IDE硬盘 I

/O

S3C2410 IDE硬盘 I/O

nRESET

O ADDR1 DA0 O

DATA0~

DATA15

D00~D15 I,O

ADDR2 DA1 O

new O ADDR3 DA2 O

nOE O ADDR4 O

nWAIT IORDY I ADDR5 O

EINT6 INTRQ I

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

311

http://www.up-tech.com博创科技(UP-TECH)

Page 312: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图5.6.3 IDE硬盘接线图3 、寄存器读写时序寄存器读/ 写时序图如图5.6.4 所示:

图5.6.4寄存器读/ 写时序图

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

312

http://www.up-tech.com博创科技(UP-TECH)

Page 313: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

注意:(1) 设备地址由 、 及A[02:00] 决定。 (2) 数据由D[15:00](16 位) 或D[07:00](8)位决定。(3) 在PIO 模式0 、1 和2 中有效,其他模式忽略该信号。(4) 设备产生IORDY 低电平以扩展PIO 周期。 或 被设置tA 时间后,主控制器可判断周期是否被扩展。IORDY 描述有以下3 中方式:①设备从来不产生IODRY 低电平:无等待。②设备在tA 前开始驱动IORDY 为低,将使IORDY 在tA 前被设定:无等待。③设备在tA 前开始驱动IORDY 为低:有等待。在IORDY 重新被设定后完成周期。为了在周期内产生等待信号及设定 ,在IORDY 被设定前,在tRD 信号后设备将把读得得数据置于D15 ~00 。寄存器读/ 写时序设置如表5.6.4 所示:

表5.6.4 寄存器读/ 写时序设置符号

项目 模式0 (ns)

模式1 (ns)

模式2 (ns)

模式3 (ns)

模式4 (ns)

注释

t0 周期时间 (min) 600 383 240 180 120 1 t1 地址有效时, /

调整时间(min) 70 50 30 30 25

t2 / (min) 165 125 100 80 70 1

t2/ (min) 寄存器

(8 bit) 290 290 290 80 70 1

t2i / 唤醒 (min) - - - 70 25 1

t3 数据调整时间

(min) 60 45 30 30 20

t4 数据保持时间

(min) 30 20 15 10 10

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

313

http://www.up-tech.com博创科技(UP-TECH)

Page 314: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

t5 数据调整时间 (min) 50 35 20 20 20

t6 数据保持时间(min) 5 5 5 5 5

t6Z 数据触发态(max) 30 30 30 30 30 2

t7 地址有效时,IOCS16 的设定最大时间 (max)

90 50 40 n/a n/a 4

t8 地址有效时,IOCS16 的释放时间 (max)

60 45 30 n/a n/a 4

t9 地址有效时, / 的保持时间 20 15 10 10 10

tRD 如果tA后,IORDY 初始化为低,读数据有效时,IORDY的启动时间 (min)

0 0 0 0 0

tA IORDY 调整时间 35 35 35 35 35 3

tB IORDY 脉冲宽度 (max) 1250 1250 1250 1250 1250

tC IORDY 设定到释放的时间 (max)

5 5 5 5 5

注: 的最大负载为一个50pF 的LSTTL。时间级为ns 级。IORDY 高电平到高电平的最小时间为0ns ,但是必须符合最小 宽度。

1 , t0 为最小总周期时间,t2 为最小指令启动时间,t2i 为最小指令恢复时间及指令失效时间。实际周期时间等于实际指令活动时间加实际指令停止时间。T0t2和t2i 应遵循时间的要求。最小总周期时间要求大于t2加t2i 。主控器可加长t2或t2i的时间长度,以保证t0 等于或大于设备驱动识别指令的返回值。

2 , 参数设定了从 低电平,到CF 存储卡( 触发态) 不能驱动数据总线特定时间。

3 , 从 或 启动到IORDY 首次采样应有一段延时。如果IORDY静止,在PIO 周期完成前,主控器将等待IORDY 启动。

4 , t7 和t8 仅可作用于模式0 、1 或2 。在其他模式,该信号无效。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

314

http://www.up-tech.com博创科技(UP-TECH)

Page 315: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

六、程序分析

剖析UP-CUP S2410 经典平台平台上运行的IDE 硬盘驱动程序中的主要函数, 详细内容请参阅 /arm2410cl/kernel/linux-2.4.18-2410cl/include/asm/arch-s3c2410/ide.h/arm2410cl/kernel/linux-2.4.18-2410cl/drivers/ide/ide.c

#define IDE_DATA_OFFSET (0) //数据寄存器#define IDE_ERROR_OFFSET (1) //特征寄存器#define IDE_NSECTOR_OFFSET (2) //扇区数寄存器#define IDE_SECTOR_OFFSET (3) //扇区号寄存器#define IDE_LCYL_OFFSET (4) //低柱面寄存器#define IDE_HCYL_OFFSET (5) //高柱面寄存器#define IDE_SELECT_OFFSET (6) //选择卡/ 磁头寄存器#define IDE_STATUS_OFFSET (7) //状态寄存器#define IDE_CONTROL_OFFSET (8) //设备控制寄存器struct block_device_operations ide_fops[] = {{

owner: THIS_MODULE,open: ide_open,release: ide_release,ioctl: ide_ioctl,check_media_change: ide_check_media_change,revalidate: ide_revalidate_disk

}};// 内核对驱动的调用接口。int __init ide_init (void)/*驱动初始化函数,它要完成的任务很多,有硬件初始化设置,中断请求,设备注册

等等。过去这部分工作往往在模块入口module_init 中完成,现在的编码习惯通常是开辟独立的初始化函数。再被init_module函数调用。

*/{

static char banner_printed;int i;if (!banner_printed) {

printk(KERN_INFO "Uniform Multi-Platform E-IDE driver " REVISION "\n");ide_devfs_handle = devfs_mk_dir (NULL, "ide", NULL);system_bus_speed = ide_system_bus_speed();banner_printed = 1;

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

315

http://www.up-tech.com博创科技(UP-TECH)

Page 316: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

}init_ide_data ();

/* init_ide_data 为硬盘硬件初始化接口函数,它是我们添加IDE CF 驱动的主要函数,其函数内引用了ide_init_default_hwifs()函数。我们对硬盘初始化在ide_init_default_hwifs()函数中完成。下边会具体分析ide_init_default_hwifs()函数的实现。

*/initializing = 1;ide_init_builtin_drivers();initializing = 0;for (i = 0; i < MAX_HWIFS; ++i) {

ide_hwif_t *hwif = &ide_hwifs[i];if (hwif->present)

ide_geninit(hwif);}return 0;

}static __inline__ voidide_init_default_hwif_ports(hw_regs_t *hw, int data_port, int ctrl_port, int *irq){ ide_ioreg_t reg = (ide_ioreg_t) data_port; int i; memset(hw, 0, sizeof(*hw)); for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) { hw->io_ports[i] = reg; reg += 2; } /* 初始化8 个数据控制寄存器*/ hw->io_ports[IDE_CONTROL_OFFSET] = (ide_ioreg_t) ctrl_port; /* 初始化设备状态

寄存器*/ if (irq) *irq = 0;}static __inline__ voidide_init_default_hwifs(void){

hw_regs_t hw;BWSCON = ((BWSCON & ~(BWSCON_ST1 | BWSCON_WS1 | BWSCON_DW1))

|(BWSCON_ST1 | BWSCON_WS1 | BWSCON_DW(1, BWSCON_DW_16)));

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

316

http://www.up-tech.com博创科技(UP-TECH)

Page 317: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

/*BANK1 口,15为数据总线,有关BANK1 的声明部分,请参阅include\asm-arm\arch-s3c2410\S3C2410.h头文件部分代码*/

BANKCON1= BANKCON_Tacs4 | BANKCON_Tcos4 | BANKCON_Tacc14 |BANKCON_Toch4 | BANKCON_Tcah4 | BANKCON_Tacp6 | BANKCON_PMC1;

/* 设置BANK1 控制寄存器*/set_external_irq(IRQ_IDE, EXT_RISING_EDGE, GPIO_PULLUP_DIS);

/* 分配外部中断6 ,上升延中断有效,下拉电阻有效*/ide_init_default_hwif_ports(&hw, IDE_BASE+0x20, IDE_BASE+0x10, NULL);hw.irq = IRQ_IDE; /* 设置ENTR6 中断号*/hw.dma = NO_DMA; /* 非DMA 方式*/ide_register_hw(&hw, NULL); /*IDE 设备注册*/

}ide_open (struct inode * inode, struct file * filp) ;// 打开设备,该函数中往往要完成设备初始化和使用记数增值。ide_release (struct inode * inode, struct file * file);// 设备释放函数。ide_ioctl (struct inode *inode, struct file *file,unsigned int cmd, unsigned long arg) ;// 提供支持IDE 设备特定命令的方法。init_module (void) ; // 模块入口,初始化。cleanup_module (void) ; // 模块出口,注销模块占有的资源。

七、实验步骤

由于我们已经将IDE 硬盘的驱动编入内核当中,所以在使用硬盘时,只需要将其插入开发板中插槽,并将其挂载即可。 1 、驱动IDE 接口

在挂载IDE 硬盘前应先驱动IDE 接口,否则下面的实验不能进行。 [/mnt/yaffs]cd ide

[/mnt/yaffs/ide] ins.sh

IDE 驱动成功。2 、挂载硬盘将硬盘插入后,使用mount 命令来挂载

[/mnt/yaffs]cd /mnt[/mnt]mount hdap1/ /dev/ide/host0/bus0/target1/lun0: p1 /dev/ide/host0/bus0/target1/lun0: p1

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

317

http://www.up-tech.com博创科技(UP-TECH)

Page 318: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

MSDOS FS: Using codepage 936MSDOS FS: IO charset cp936[/mnt]cd hdap1/[/mnt/hdap1]ls1_fish_again.avi mplayer2aidu.avi root.cramfscaiyi.avi v4lcaplydy.avi xj.avimm xyt.avimplayer yaffs-uptech2410-2005-4-15.tar.bz2

2 、测试硬盘挂载成功后我们可以使用cp 、mkdir、rm 等命令对硬盘上的文件进行操作。

5.7 音频驱动及应用实验

一、实验目的

掌握UDAl341TS 音频芯片工作原理 熟悉linux 音频驱动程序实现方法 熟悉播放软件解码编程基本知识

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

318

http://www.up-tech.com博创科技(UP-TECH)

Page 319: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

二、实验内容

介绍音频芯片工作原理和音频播放器的基本工作原理,剖析音频驱动程序的实现过程。

三、预备知识

掌握在Linux 集成开发环境中编写和调试程序的基本过程。 了解S3C2410 的ⅡS 总线结构。

四、实验设备及工具

硬件:UP-CUP S2410 经典平台嵌入式实验仪,PC 机Pentumn500 以上, 硬盘40G 以上, 内存大于128M 。软件:PC 机操作系统REDHAT LINUX 9.0 +MINICOM + AMRLINUX 开发环境

五、实验原理

1 、音频驱动硬件体系结构 IIS 音频接口音频系统设计包括软件设计和硬件设计两方面,在硬件上使用了基于IIS 总线的音频系统体系结构。IIS(Inter-IC Sound bus) 又称I2S ,是菲利浦公司提出的串行数字音频总线协议。目前很多音频芯片和MCU 都提供了对IIS 的支持。图5.7.1 是UP-CUP S2410 经典平台音频芯片接线图。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

319

http://www.up-tech.com博创科技(UP-TECH)

Page 320: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图5.7.1 UP-CUP S2410 经典平台音频芯片接线图IIS 总线只处理声音数据。其他信号( 如控制信号) 必须单独传输。为了使芯片的引出管脚尽可能少,IIS 只使用了四根串行总线。IIS 音频接口总线共有四根线:串行数据输入(IISDI )、串行数据输出(IISDO)、左右声道选择(IISLRCK)和串行位时钟(IISCLK )。由主控设备提供IISLRCK 和IISCLK 。UDAl341TS 芯片除了提供IIS 接口和麦克风扬声器接口,还提供L3 接口控制音量等。L3 接口分别连到S3C2410 的3 个通用数据输出引脚上。IISCON 寄存器的设置和位描述如表5.7.1 ,5.7.2 所示所示:

表5.7.1 IISCON 寄存器的设置寄存器 地址 R/W 描述 复位值IISCO

N

0x01D18000(Li/HW, Li/W, Bi/W) 0x01D18002(Bi/HW)

R/W IIS 控制寄存器 0x100

表5.7.2 IISCON 寄存器的位描述IISCON 位 描述 初始化状

左/ 右声道指示(只读)

[8]

0 = 左声道 1 = 右声道 1

发送FIFO 准备好标志(只读)

[7]

0=FIFO 没准备好(空) 1=FIFO 准备好(非空) 0

接收FIFO 准备好标志(只读)

[6

0=FIFO 没准备好(满) 1=FIFO 准备好(非满)

0

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

320

http://www.up-tech.com博创科技(UP-TECH)

Page 321: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

]

发送DMA 服务请求使能

[5]

0= 请求禁止 1= 请求使能 0

接收DMA 服务请求使能

[4]

0= 请求禁止 1= 请求使能 0

发送声道空闲信号 [3]

在闲置状态 IISLRCK 是停止的(暂停Tx )。只有在IIS 是主控时这一位才有效。0= 产生IISLRCK 1= 不产生IISLRCK

0

接收声道空闲信号 [2]

在闲置状态 IISLRCK 是停止的(暂停Rx ),只有在IIS 是主控时这一位才有效。0= 产生IISLRCK 1= 不产生IISLRCK

0

IIS 比率使能 [1]

0 = 比率禁止 1 = 比率使能 0

IIS 接口使能 IIS (开始)

[0]

0=IIS 禁止(停止) 1=IIS 使能(开始) 0

参考:prescaler enable ,打开DMA 服务请求 IISMOD寄存器

IISMOD 寄存器的设置和位描述如表5.7.3 和表5.7.4 所示。表5.7.3 IISMOD寄存器的设置

寄存器 地址 R/W 描述 复位值IISMOD

0x01D18004(Li/W, Li/HW, Bi/W)

0x01D18006(Bi/HW)R/W IIS 模式寄存

器 0x0

表5.7.4 IISMOD寄存器的位描述IISMOD 位 描述

初始化状态

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

321

http://www.up-tech.com博创科技(UP-TECH)

Page 322: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

主/ 从动模式选择

[8] 0= 主模式(IISLRCK和IISCLK 为输出)1= 从动模式(IISLRCK和IISCLK 为输入) 0

传送/ 接收模式选择

[7:6]

00= 无转移 01= 接收模式 10= 传输模式 11= 传输和接收模式 00

左/ 右声道有效电平

[5] 0= 左声道低(右声道高)1= 左声道高(右声道低) 0

串行接口模式 [4] 0=IIs 兼容格式1=MSB (左)- 对齐格式 0

每通道串行数据位

[3] 0 = 8- 位 1 = 16-位

0

主时钟频率选择

[2] 0 = 256fs 1 = 384fs (fs : 采样频率) 0

串行位时钟频率选择

[1:0]

00 = 16fs 10 = 48 01 = 32fs 11 = N/A fs (fs : 采样频率)

00

参考:发送模式,16 位数据,串行位频率为32fs ,主控时钟频率为384fs

IISPSR 寄存器IISPSR 寄存器的设置和位描述如表5.7.5 和表5.7.6 所示,它的除数因子如表5-39 所示。

表5.7.5 IISPSR 寄存器的设置寄存器 地址 R/W 描述 复位值

IISPSR

0x01D18008(Li/B, Li/HW, Li/W, Bi/W) 0x01D1800A(Bi/HW) 0x01D1800B(Bi/B)

R/W

IIS 预比例寄存器(预分 频 寄 存器)

0x0

表5-38 IISPSR 寄存器的位描述IISPSR 位 描述 初始化状态预分频系数A [7:4

] 预分频系数A 的预分频除数因子一个时钟的预分频系数A= MCLK/< 除数因子>

0x0

预分频系数B [3:0]

预分频系数B 的预分频除数因子一个时钟的预分频系数B= MCLK/< 除数因子>

0x0

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

322

http://www.up-tech.com博创科技(UP-TECH)

Page 323: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

表5.7.6 IISPSR 寄存器的除数因子IISPSR[3:0] / [7:4] 除数因子 IISPSR[3:0] / [7:4] 除数因子

0000b 2 1000b 1

0001b 4 1001b –

0010b 6 1010b 3*

0011b 8 1011b –

0100b 10 1100b 5*

0101b 12 1101b –

0110b 14 1110b 7*

0111b 16 1111b –

参考:在本实验中,主要是播放44.1kHz (IISLRCK)的16 位双声道音频,系统时钟为67.5MHz ,采用384fs模式,所以分频值为4 。时钟频率的对照如表5.7.7 所示。

表5.7.7 时钟频率对应表IISLRCK (fs)

8.000 KHz

11.02 KHz

16.00 KHz

22.05 KHz

32.000 KHz

44.100 KHz

48.000 KHz

64.000 KHz

88.200 KHz

96.000 KHz

CODECLK (MHz)

256fs 2.048

2.822

4.096

5.645

8.192

11.289

12.288

16.384

22.579

24.576

384fs 3.072

4.233

6.144

8.467

12.288

16.934

18.432

24.576

33.868

36.864

IISFCON 寄存器IISFCON 寄存器的设置和位描述如表5.7.8 和5.7.9 所示:

表5.7.8 IISFCON 寄存器的设置寄存器 地址 R/W 描述 复位值IISFCON

0x01D1800C(Li/HW, Li/W, Bi/W) 0x01D1800E(Bi/HW)

R/W IIS FIFO 接口寄存器 0x0

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

323

http://www.up-tech.com博创科技(UP-TECH)

Page 324: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

表5.7.9 IISFCON 寄存器的位描述IISFCON 位 描述 初始化状

态传送FIFO 访问模式选择

[11] 0= 标准访问模式 1=DMA 访问模式 0

接收FIFO 访问模式选择

[10] 0= 标准访问模式 1=DMA 访问模式 0

传送FIFO 使能 [9] 0=FIFO 禁止 1=FIFO 使能 0

接收FIFO 使能 [8] 0=FIFO 禁止 1=FIFO 使能 0

传送 FIFO 数 据 计 数(只读)

[7:4] 数据计数值=0 ~ 8 000

接收 FIFO 数 据 计 数(只读)

[3:0] 数据计数值=0 ~ 8 000

参考:DMA 模式,打FIFO

DMA 数据传输方式DMA (Direct Memory Access )技术是一种代替微处理器完成存储器与外部设备或存储器之间大数据量传送的方法,也称直接存储器存取方法。我们知道,在微机系统内,要把外设的数据读到内存或把闪存数据送别外设。一般是通过CPU 执行一段程序来完成的。但利用DMA 技术则可不用CPU 介入就能实现外设与内存之间数据的直接传送。一般认为,相对于CPU 执行程序实现外设与存储之间的数据传送而言,DMA 直接数传速率要更高,但这点并不是DMA 技术的主要优点。因为相对于CPU 执行程序的速度来讲,外设数据传输的速率往往是比较慢的,而且目前在一些高档微机系统中,CPU 对内存的读写速率可能还要高于DMA 的传送速率。DMA 的主要优点是当需要把一个外设的大量数据送到指定内存时,它可以自动完成传送任务。也就是说外设发出一个DMA 请求,则DMA 电路暂停CPU 操作,并控制外设与内存之间进行一次传数,然后再让CPU 继续执行程序。这样就使CPU 节省了大量对外设查询时间,从而提高了系统的整体性能。从这点上看,似乎与微机的中断功能有点类似。但实际上,在数据量很大且数传速率较高的情况下,频繁的中断会大大降低系统的执行效率,同时数传速率也不可能高。S3C2410X 有4 个DMA 控制器,其中DMA1(数据输入)和DMA2(数据输出)可用于IIS 的控制。通过设置CPU 的IISFCON 寄存器可以使IIS 接口工作在DMA 模式下。此模式下FIFO 寄存器组的控制权掌握在DMA 控制器上。当FIFO 满时,由DMA 控制器对FIFO 中的数据进行处理。DMA 模式的选择由IISCON 寄存器的第四和第五位控制。 DCONO 寄存器的设置和位描述如表5.7.10 和5.7.11 所示:

表5.7.10 DCONn 寄存器的设置寄存器 地址 读/ 写 描述 复位值

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

324

http://www.up-tech.com博创科技(UP-TECH)

Page 325: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

DCON00x4B00001

0R/W DMA 0 控制寄存

器 0x00000000

DCON10x4B00005

0R/W DMA 1 控制寄存

器 0x00000000

DCON20x4B00009

0R/W DMA 2 控制寄存

器 0x00000000

DCON30x4B0000D

0R/W DMA 3 控制寄存

器 0x00000000

表5.7.11 BDCON0寄存器的位描述DCONn 位 描述 初始化

状态 DMD_HS

[31]

Select one between Demand mode and Handshake mode. 0: Demand mode is selected.

0

1: Handshake mode is selected. In both modes, DMA controller starts its transfer and asserts DACK for a given asserted DREQ. The difference between the two modes is whether it waits for the deasserted DACK or not. In the Handshake mode, DMA controller waits for the deasserted DREQ before starting a new transfer. If it finds the deasserted DREQ, it deasserts DACK and waits for another asserted DREQ. In contrast, in the Demand mode, DMA controller does not wait until the DREQ is deasserted. It just deasserts DACK and then starts another transfer if DREQ is asserted. We recommend using Handshake mode for external DMA request sources to prevent unintended starts of new transfers.

SYNC

[30]

Select DREQ/DACK synchronization. 0: DREQ and DACK are synchronized to PCLK (APB clock). 1: DREQ and DACK are synchronized to HCLK (AHB clock). Therefore, for devices attached to AHB system bus, this bit has to be set to 1, while for those attached to APB system, it should be set to 0. For the devices attached to external systems, the user should select this bit depending on which the external system is synchronized with between AHB system and APB system.

0

INT[29]

Enable/Disable the interrupt setting for CURR_TC (terminal count) 0: CURR_TC interrupt is disabled. The user has to view the transfer count in the status register (i.e.

0

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

325

http://www.up-tech.com博创科技(UP-TECH)

Page 326: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

polling). 1: interrupt request is generated when all the transfer is done (i.e. CURR_TC becomes 0).

TSZ[28]

Select the transfer size of an atomic transfer (i.e. transfer performed each time DMA owns the bus before releasing the bus). 0: a unit transfer is performed. 1: a burst transfer of length four is performed.

0

SERV

MODE

[27]

Select the service mode between Single service mode and Whole service mode.

0

0: Single service mode is selected in which after each atomic transfer (single or burst of length four) DMA stops and waits for another DMA request. 1: Whole service mode is selected in which one request gets atomic transfers to be repeated until the transfer count reaches to 0. In this mode, additional request are not required. Note that even in the Whole service mode, DMA releases the bus after each atomic transfer and then tries to re-get the bus to prevent starving of other bus masters.

HWSR

CSEL

[26:24]

Select DMA request source for each DMA. 00

DCON0: 000:nXDREQ0 001:UART0 010:SDI 011:Timer 100:USB device EP1 DCON1: 000:nXDREQ1 001:UART1 010:I2SSDI 011:SPI 100:USB device EP2 DCON2: 000:I2SSDO 001:I2SSDI 010:SDI 011:Timer 100:USB device EP3 DCON3: 000:UART2 001:SDI 010:SPI 011:Timer 100:USB device EP4 These bits control the 4-1 MUX to select the DMA request source of each DMA. These bits have meanings only if H/W request mode is selected by DCONn[23].

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

326

http://www.up-tech.com博创科技(UP-TECH)

Page 327: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

SWHW_

SE L

[23]

Select the DMA source between software (S/W request mode) and hardware (H/W request mode). 0: S/W request mode is selected and DMA is triggered by setting SW_TRIG bit of DMASKTRIG control register. 1: DMA source selected by bit[26:24] triggers the DMA operation.

0

RELOAD

[22]

Set the reload on/off option. 0: auto reload is performed when a current value of transfer count becomes 0 (i.e. all the required transfers are performed). 1: DMA channel (DMA REQ) is turned off when a current value of transfer count becomes 0. The channel on/off bit (DMASKTRIGn[1]) is set to 0 (DREQ off) to prevent unintended further start of new DMA operation.

0

DSZ

[21:20]

Data size to be transferred. 00 = Byte 01 = Half word 10 = Word 11 = reserved

00

TC[19:0]

Initial transfer count (or transfer beat). Note that the actual number of bytes that are transferred is computed by the following equation: DSZ x TSZ x TC. Where, DSZ, TSZ (1 or 4), and TC represent data size (DCONn[21:20]), transfer size (DCONn[28]), and initial transfer count, respectively. This value will be loaded into CURR_SRC only if the CURR_SRC is 0 and the DMA ACK is 1.

00000

图5.7.2 是S3C2410X 芯片与菲利浦公司的UDAl341TS 音频芯片的连接示意图。

图5.7.2 UDAl341TS 音频芯片的连接在这个体系结构中,为了实现全双工,数据传输使用两个DMA 通道。数据传输( 以回放

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

327

http://www.up-tech.com博创科技(UP-TECH)

Page 328: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

为例) 先由内部总线送到内存,然后传到BDMA 控制器通道1 ,再通过IIS 控制器写入IIS 总线并传输给音频芯片。通道2 用来录音。2 、音频设备底层软件设计音频设备驱动程序的主要任务是控制音频数据在硬件中流动,并为音频应用提供标准接口。由于嵌入式系统资源有限,且处理器能力不强,所以在音频设备的驱动程序设计中,合理分配系统资源是难点。在三星公司的ARM 芯片中,I /O 设备的寄存器作为内存空间的一部分,可以使用普通的内存访问语句读写I /O寄存器,进而控制外部设备。这是该嵌入式系统与传统的基于Intel 处理器的PC 最大的不同。 音频设备驱动程序功能:设备驱动程序中需要完成的任务包括:对设备以及对应资源初始化和释放;读取应用程序传送给设备文件的数据并回送应用程序请求的数据。这需要在用户空间、内核空间、总线及外设之间传输数据。 驱动程序构架:Linux 驱动程序中将音频设备按功能分成不同类型,每种类型对应不同的驱动程序。UDAl341TS 音频芯片提供如下功能:· 数字化音频。这个功能有时被称为DSP 或Codec 设备。其功能是实现播放数字化声音文件或录制声音。· 混频器。用来控制各种输入输出的音量大小,在本系统中对应L3 接口。在Linux 设备驱动程序将设备看成文件,在驱动程序中将结构file_operations 中的各个函数指针与驱动程序对应例程函数绑定,以实现虚拟文件系统VFS对逻辑文件的操作。数字音频设备(audio) 、混频器(mixer) 对应的设备文件分别是/dev/dsp 和/dev/mixer 。 设备的初始化和卸载:对/dev/dsp 的驱动设计主要包含:设备的初始化和卸载、内存与DMA 缓存区的管理、设备无关操作( 例程) 的实现以及中断处理程序。在设备初始化中对音频设备的相关寄存器初始化,并在设备注册中使用了两个设备注册函数register sound_dsp() 和regiter_sound_mixer()注册音频设备和混频器设备。这两个函数在2 .2 以上版本的内核drivers /sound /sound_core .c 文件中实现。其作用是注册设备,得到设备标识,并且实现设备无关操作的绑定。在这些注册函数里使用的第一个参数都是struct file_operations 类型的参数。该参数定义了设备无关接口的操作。设备卸载时使用注销函数。注销时用输入注册时得到的设备号即可。在注销时还必须释放驱动程序使用的各种系统资源包括DMA 、设备中断等。 DMA 缓存区设计和内存管理:在音频设备的驱动程序设计中,DMA 缓存区设计和内存管理部分最为复杂。由于音频设

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

328

http://www.up-tech.com博创科技(UP-TECH)

Page 329: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

备有很高的实时性要求,所以合理地使用内存能加快对音频数据的处理,并减少时延。三星公司的DMA 控制器没有内置DMA 存储区域,在驱动程序中必须为音频设备分配DMA 缓存区。这样就能通过DMA 直接将需要回放或是录制的声音数据存放在内核的DMA 缓存区中。 设备无关操作:设备无关操作对应于file_operations 指向的各个例程,它让用户用访问文件的方式访问设备。对设备的打开和读写是启动程序为用户程序提供的最主要接口,分别对应于file_operations 中的open 、read 和write 例程。在open 例程中需要完成的任务主要是设备初始化,包括:(1 )通过设置IIS 寄存器控制音频设备的初始化,并且初始化设备的工作参数( 包括速度、声道、采样宽度) ;(2 )为设备分配DMA 通道;(3 )根据采样参数计算出缓存内段的大小( 程序也可以指定缓存内段的大小) ;当缓存区和DMA 设置好后,读写操作主要对缓存操作。 对设备的操作除了读写操作外,还有音频播放中的暂停和继续。这两个操作在ioctl 接口中实现,通过对相应的IIS 总线控制器(IISCON寄存器) 操作实现。在对音频操作时还要注意:一次采样得到的数据必须一次处理,否则不能正确播放数据。3 、WAV 音乐格式在Windwos 环境下,大部分的多媒体文件都依循着一种结构来存放信息, 这种结构称为“资源互换文件格式”( resources interchange file format , 简称RIFF) 。例如声音的WAV 文件、视频的AVI 文件等等均是由此结构衍生出来的。RIFF 可以看作是一种树状结构, 其基本构成单位为chunk ,犹如树状结构中的节点,每个chunk 由“辨别码”、“数据大小”及“数据”所组成。辨别码由4 个ASCII 码所构成,数据大小则标示出紧跟其后数据的长度( 单位为Byte),而数据大小本身也用掉4 个Byte ,所以事实上一个chunk 的长度为数据大小加8 。一般而言,chunk 本身并不允许内部再包含chunk ,但有两种例外,分别为以“RIFF” 及“LIST” 为辨别码的chunk 。而针对这两种chunk ,RIFF 又从原先的“数据”中切出4 个Byte 。这4 个Byte 称为“格式辨别码”,然而RIFF 又规定文件中仅能有一个以“RIFF” 为辨别码的chunk 。只要是依循这一结构的文件, 我们均称之为RIFF 文档。这种结构提供了一种系统化的分类。如果和MS-DOS 文件系统作比较,“RIFF”chunk 就好比是一台硬盘的根目录, 其格式辨别码便是此硬盘的逻辑代码(C :或D :) ,而“LIST”chunk 即为其下的子目录,其他的chunk 则为一般的文件。至于在RIFF 文件的处理方面,微软提供了相关的函数。视窗下的各种多媒体文件格式就如同在磁盘上规定仅能放怎样的目录,而在该目录下仅能放何种数据。WAV 为waveform(波形) 的缩写。声音文件的结构如表5.7.12 所示,“RIFF” 的格式辨别码为“WAVE” 。整个文件由两个chunk 所组成: 辨别码“fmt ” (注意,最后一个是空白字符!)及“data” 。

表5.7.12  WAV 文件结构

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

329

http://www.up-tech.com博创科技(UP-TECH)

Page 330: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

“RIFF”

××××

“WAVE”

“fmt”sizeof(PCMWAVEFORMA

T)struct of

PCMWAVEFORMATdata

××××

wave form data

在“fmt” 的chunk 下包含了一个PCMWAVE-FORMAT 数据结构,其定义如下:typedef struct pcmwaveformat-tag{WAVEFORMAT wf;WORD wBitsPerSample;}PCMWAVEFORMAT;typedef struct waveformat-tag{WORD wFormat Tag ;WORD nChannels;DWORD nSamplesPerSec;DWORD nAvgBytesperSec;WORD nBlockAlign;}WAVEFORMAT;

其意义分别为:wFormat Tag :记录着此声音的格式代号,例如WAVE- FORMAT- PCM ,WAVE- FORAM- AD-PCM 等等。nChannels :记录声音的通道数。nSamplesPerSec :记录每秒取样数。

nAvgBytesPerSec :记录每秒的数据量。nBlockAlign :记录区块的对齐单位。wBitsPerSample :记录每个取样所需的位数。“data”Chunk 包含着真正的声音数据。Windows 目前仅提供WAVE- FORMAT- PCM一种数据格式,所代表的意义是脉冲编码调制(pulse code modulation) 。针对这种格式,Windows 定义了在“data” 的chunk 中数据的存放情形,图5.7.3 中列出了四种不同通道数及取样所需的位元数以及位元位置的安排。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

330

http://www.up-tech.com博创科技(UP-TECH)

Page 331: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图5.7.3  PCM 文件中位元安排方式第一排表示单声道8 位元,第二排表示双声道8 位元,第三排表示单声道16 位元,第四排表示双声道16 位元。8 位元代表音量大小由8 个位元所表示,16 位元则代表音量大小由16 个位元所表示。理论上8 位元可以表示0 ~255,16 位元可表示0 ~65535 ,不过Windows 规定16 位元其值的范围为-32168 ~32167 。此外尚有一点要注意的是,0 并不一定代表无声,而是由中间的数值来决定,也就是在8 位元时为128,16 位元时为0 才是无声。所以,若程序设计时需放入无声的数据, 需特别注意声音格式是16 或是8 位元,以放入适当的值。4 、MP3 文件格式 概述:MP3 文件是由帧(frame)构成的,帧是MP3 文件最小的组成单位。MP3 的全称应为MPEG1 Layer-3 音频文件,MPEG(Moving Picture Experts Group) 在汉语中译为活动图像专家组,特指活动影音压缩标准,MPEG音频文件是MPEG1 标准中的声音部分,也叫MPEG 音频层,它根据压缩质量和编码复杂程度划分为三层,即Layer-1 、Layer2 、Layer3 ,且分别对应MP1 、MP2 、MP3 这三种声音文件,并根据不同的用途,使用不同层次的编码。MPEG 音频编码的层次越高,编码器越复杂,压缩率也越高,MP1 和MP2 的压缩率分别为4 :1 和6 :1-8 :1 ,而MP3 的压缩率则高达10 :1-12 :1 ,也就是说,一分钟CD 音质的音乐,未经压缩需要10MB 的存储空间,而经过MP3 压缩编码后只有1MB 左右。不过MP3 对音频信号采用的是有损压缩方式,为了降低声音失真度,MP3 采取了“感官编码技术”,即编码时先对音频文件进行频谱分析,然后用过滤器滤掉噪音电平,接着通过量化的方式将剩下的每一位打散排列,最后形成具有较高压缩比的MP3 文件,并使压缩后的文件在回放时能够达到比较接近原音源的声音效果。 整个MP3 文件结构:MP3 文件大体分为三部分:TAG_V2(ID3V2) ,Frame, TAG_V1(ID3V1) ,如表

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

331

http://www.up-tech.com博创科技(UP-TECH)

Page 332: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

5.7.13 所示:表5.7.13 MP3 文件组成

ID3V2 包含了作者,作曲,专辑等信息,长度不固定,扩展了ID3V1 的信息量。

Frame . .

Frame

一系列的帧,个数由文件大小和帧长决定 每个FRAME 的长度可能不固定,也可能固定,由位率bitrate 决定 每个FRAME 又分为帧头和数据实体两部分 帧头记录了mp3 的位率,采样率,版本等信息,每个帧之间相互独立

ID3V1 包含了作者,作曲,专辑等信息,长度为128BYTE 。

MP3 的FRAME 格式:每个FRAME 都有一个帧头FRAMEHEADER ,长度是4BYTE (32bit ), 帧头后面可能有两个字节的CRC 校验,这两个字节的是否存在决定于FRAMEHEADER 信息的第16bit ,为0 则帧头后面无校验,为1 则有校验, 校验值长度为2 个字节,紧跟在FRAMEHEADER 后面,接着就是帧的实体数据了,格式如表5.7.14 :

表5.7.14 FRAME 的格式FRAMEHEADER CRC(free ) MAIN_DATA

4 BYTE 0 OR 2 BYTE 长度由帧头计算得出

帧头FRAMEHEADER 格式如下:AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM

MAIN_DATA:MAIN_DATA 部分长度是否变化决定于FRAMEHEADER 的bitrate 是否变化,一首MP3 歌曲,它有三个版本:96Kbps(96 千比特位每秒)、128Kbps 和192Kbps 。Kbps (比特位速率),表明了音乐每秒的数据量,Kbps 值越高,音质越好,文件也越大,MP3 标准规定,不变的bitrate 的MP3 文件称作CBR ,大多数MP3 文件都是CBR 的,而变化的bitrate 的MP3 文件称作VBR ,每个FRAME 的长度都可能是变化的。下面是CBR 和VBR 的不同点:1 )CBR :固定位率的FRAME 的大小也是固定的(公式如上所述),只要知道文件总长度,和帧长即可由播放每帧需26ms 计算得出mp3 播放的总时间,也可通过计数帧的个数控制快进、快退慢放等操作。2 )VBR :VBR 是XING 公司推出的算法,所以在MP3 的FRAME 里会有“XING"这个关键字(现在很多流行的小软件也可以进行VBR 压缩,它们是否遵守这个约定,那就不得而知了),它存放在MP3 文件中的第一个有效FRAME 里,它标识了这个MP3 文件是VBR 的。同时第一个FRAME 里存放了MP3 文件的FRAME 的总个数,这就很容易获得了播放总时间,同时还有100 个字节存放了播放总时间的100 个时间分段的FRAME 的INDEX ,假设4 分钟的MP3 歌曲,240S ,分成100 段,每两个

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

332

http://www.up-tech.com博创科技(UP-TECH)

Page 333: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

相邻INDEX 的时间差就是2.4S ,所以通过这个INDEX ,只要前后处理少数的FRAME ,就能快速找出我们需要快进的FRAME 头。 ID3v1 :ID3V1 比较简单,它是存放在MP3 文件的末尾,用16 进制的编辑器打开一个MP3 文件,查看其末尾的128 个顺序存放字节,数据结构定义如下:

typedef struct tagID3V1{char Header[3]; /*标签头必须是"TAG"否则认为没有标签*/char Title[30]; /* 标题*/char Artist[30]; /* 作者*/char Album[30]; /* 专集*/char Year[4]; /* 出品年代*/char Comment[28]; /* 备注*/char reserve; /* 保留*/char track; /*音轨*/char Genre; /* 类型*/}ID3V1,*pID3V1;

ID3V1 的各项信息都是顺序存放,没有任何标识将其分开,比如标题信息不足30 个字节,则使用'\0' 补足,否则将造成信息错误。Genre 使用原码表示,请查看相应对照表。

六、程序分析

UP-CUP S2410 经典平台的UDAl341TS 音频驱动文件在下面的目录中,由于代码较长,请自行分析。

/arm2410cl/kernel/linux-2.4.18-2410cl/drivers/sound/s3c2410-uda1341.c

七、实验步骤

播放声音文件测试切换到minicom 终端窗口。进入/mnt/yaffs/sound 目录下,运行下面图示中的命令就可以听到播放MP3 的声音。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

333

http://www.up-tech.com博创科技(UP-TECH)

Page 334: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

5.8 双网卡演示实验

一、实验目的

学习Linux 内核和根文件系统在需要多块网卡设备时的配置方式。

二、实验内容

学习Linux 内核中对网卡驱动进行配置,对根文件系统和应用程序的相应文件进行配置,使用Redhat Linux 9.0操作系统环境及ARM 编译器,编译驱动模块。烧录内核,查看双网卡的工作情况。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

334

http://www.up-tech.com博创科技(UP-TECH)

Page 335: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

三、预备知识

C 语言的基础知识、程序调试的基础知识和方法,Linux 的基本操作。Linux 关于module的必要知识,以及Linux 内核的编译过程。

四、实验设备及工具

硬件:UP-CUP S2410 经典平台、PC 机Pentium 500 以上,硬盘10G 以上软件:PC 机操作系统REDHAT LINUX 9.0+MINICOM +ARM -LINUX开发环境

五、程序分析

六、实验步骤

1 、解压缩光盘文件 /develop/kernel-extend/kernel-2410s-2net-irda.tar.bz2 ,我们解压缩该内核代码至 /arm2410cl/dual-netcard 目录中:注意:首先要创建目录

tar jxf kernel-2410s-2net-irda.tar.bz2 –C /arm2410cl/dual-netcard

在目录下生成kernel-2410s 文件夹。2 、编译内核,将网卡设备选择为模块驱动的方式进入Main Menu / Network device support/ Ethernet (10 or 100Mbit) 菜单:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

335

http://www.up-tech.com博创科技(UP-TECH)

Page 336: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

3 、编译内核模块:make depmake make zImage // 编译压缩内核映象make modules // 编译内核模块

将新生成的内核映象拷贝由/arm2410cl/dual-netcard/kernel-2410s/arch/arm/boot/ 目录拷贝至更上层的/arm2410cl/dual-netcard 目录以方便稍后进行的内核烧录工作。将/arm2410cl/dual-netcard/kernel-2410s/drivers/net/ 目录下的:ne.o 和8390.o拷贝至开发板的 /mnt/yaffs/lib/modules/2.4.18-rmk7-pxa1/kernel/drivers/net/ 目录下。

[/mnt/yaffs/lib/modules/2.4.18-rmk7-pxa1/kernel/drivers/net]ls8390.o irda ne.o wan wireless

4 、烧写新的内核映象在开发板上,加载主机的NFS文件系统:

[] mount –t nfs 192.168.0.xxx:/arm2410cl /host[] cd /host/dual-netcard // 如前步操作正确可以看到zImage文件[] imagewrite /dev/mtd/0 zImage:192k

此后,系统进行内核的烧录。5 、重启实验平台,此时运行的为更新的内核。6 、重建模块的依赖关系。

[/mnt/yaffs] depmod –a

7 、网卡芯片地址和中断资源的配置。[/mnt/yaffs/lib/modules] vi modules.conf

在该文件末,添加:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

336

http://www.up-tech.com博创科技(UP-TECH)

Page 337: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

#Ethernetalias eth0 nealias eth1 neoptions ne io=0xd1000200,0xd1000400 irq=2,3

8 、重起实验平台,使用ifconfig 配置eth0 和eth1 的IP(注意:两块网卡不要分配在同以子网内)

[/mnt/yaffs] ifconfig eth0 192.168.0.11[/mnt/yaffs] ifconfig eth1 192.168.1.22[/mnt/yaffs] ifconfig // 有类似显示如下[/mnt/yaffs] ifconfigeth0 Link encap:Ethernet HWaddr 00:D0:CF:00:00:02 inet addr:192.168.0.11 Bcast:192.168.0.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) Interrupt:2 Base address:0x200

eth1 Link encap:Ethernet HWaddr 00:D0:CF:00:00:03 inet addr:192.168.1.22 Bcast:192.168.0.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) Interrupt:3 Base address:0x400

lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

至此,Linux 下双网卡的配置过程完成。注:如果PC 机处于192.168.0网段,可以分别的将两块网卡的IP配置成192.168.0网段之中。然后,连接实验平台和PC 的相同网段的网口,使用ping 192.168.0.xxx( 主机IP) 命令,

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

337

http://www.up-tech.com博创科技(UP-TECH)

Page 338: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

可以观察到网络通讯的情况。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

338

http://www.up-tech.com博创科技(UP-TECH)

Page 339: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

第六章 无线通讯实验

6.1 GPS 通讯实验

一、实验目的

掌握GPS通讯原理 学习NMEA0183 ASCII接口协议格式 学习Linux 下对GPS通讯信息采发集的编程方法

二、实验内容

学习GPS 通讯原理,阅读GPS 模块的产品说明,了解模块的电气指标、串行接口连接方式、NMEA语句格式。通过软件来设置GPS 模块的波特率、波特率、输出语句和初始化经纬度等内容。编程实现对GPS 通讯信息的采集方法,将接收到的数据进行语义的解析,并在LCD 上显示当前的地理位置信息。学习Linux GPS 数据的解析过程。

三、预备知识

熟练使用C 语言。 掌握在LINUX 下常用编辑器的使用。 了解GPS通讯原理。

四、实验设备及工具

硬件:UP-CUP S2410 经典平台嵌入式实验仪、PC 机Pentumn500 以上, 硬盘10G 以上。软件:PC 机操作系统REDHAT LINUX 9.0 +MINICOM + ARM LINUX 开发环境

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

339

http://www.up-tech.com博创科技(UP-TECH)

Page 340: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

五、实验原理

1 GPS 概述GPS (Global Positioning System-全球定位系统)是美国从本世纪70 年代开始研制,历时20 年,耗资200亿美元,具有在海、陆、空进行全方位实时三维导航与定位能力的新一代卫星导航与定位系统。GPS 的主要优点包括:(1 )全球,全天候工作:能为用户提供连续,实时的三维位置,三维速度和精密时间。不受天气的影响。(2 )定位精度高:单机定位精度优于10 米,采用差分定位,精度可达厘米级和毫米级。(3 )功能多,应用广:目前已广泛的应用于大地测量、工程测量、航空摄影测量、运载工具导航和管制、地壳运动监测、工程变形监测、资源勘察、地球动力学等学科领域。GPS 由三个独立的部分组成:空间部分:21 颗工作卫星,3 颗备用卫星。地面支撑系统:1 个主控站,3 个注入站,5 个监测站。用户设备部分:接收GPS 卫星发射信号,以获得必要的导航和定位信息,经数据处理,完成导航和定位工作。GPS 接收机硬件一般由主机、天线和电源组成。GPS 定位原理:GPS 定位的基本原理是根据高速运动的卫星瞬间位置作为已知的起算数据,采用空间距离后方交会的方法,确定待测点的位置。如图所示,假设t 时刻在地面待测点上安置GPS 接收机,可以测定GPS 信号到达接收机的时间△t ,再加上接收机所接收到的卫星星历等其它数据可以确定以下四个方程式,如图6.1.1 所示:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

340

http://www.up-tech.com博创科技(UP-TECH)

Page 341: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图6.1.1. GPS 定位原理及其定位方程上述四个方程式中待测点坐标x 、y 、z 和Vto 为未知参数,其中di=c△ti (i=1 、2 、3 、4) 。di (i=1 、2 、3 、4) 分别为卫星1 、卫星2 、卫星3 、卫星4 到接收机之间的距离。△ti (i=1 、2 、3 、4) 分别为卫星1 、卫星2 、卫星3 、卫星4 的信号到达接收机所经历的时间。c 为GPS 信号的传播速度(即光速)。四个方程式中各个参数意义如下:x 、y 、z 为待测点坐标的空间直角坐标。xi 、yi 、zi (i=1 、2 、3 、4) 分别为卫星1 、卫星2 、卫星3 、卫星4 在t 时刻的空间直角坐标,可由卫星导航电文求得。Vt i (i=1 、2 、3 、4) 分别为卫星1 、卫星2 、卫星3 、卫星4 的卫星钟的钟差,由卫星星历提供。Vto 为接收机的钟差。由以上四个方程即可解算出待测点的坐标x 、y 、z 和接收机的钟差Vto 。目前GPS 系统提供的定位精度是优于10 米,而为得到更高的定位精度,通常采用差分GPS 技术:将一台GPS 接收机安置在基准站上进行观测。根据基准站已知精密坐标,计算出基准站到卫星的距离改正数,并由基准站实时将这一数据发送出去。用户接收机在进行GPS 观测的同时,也接收到基准站发出的改正数,并对其定位结果进行改正,从而提高定位精度。2 GPS接口在UP-CUP S2410 经典平台平台上所选配的GPS 模块是GPS15L/H。接口特性如下:RS-232 输出,可输入RS232 或者具有RS-232 极性的TTL 电平。可选的波特率为:300、600、1200 、2400 、4800 、9600 、19200 。GPS15 与PC 串口的连接见示意图如图6.1.2 所示:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

341

http://www.up-tech.com博创科技(UP-TECH)

Page 342: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图6.1.2 GPS15 与PC 串口的连接串口输出协议:输出NEMA0183 格式的ASCII 码语句,输出:GPALM ,GPGGA ,GPGLL ,GPGSA ,GPGSV ,GPRMC ,GPVTG (NMEA标准语句);PGRMB ,PGRME ,PGRMF ,PGRMM ,PGRMT ,PGRMV (GARMIN 定义的语句)。还可将串口设置为输出包括GPS 载波相位数据的二进制数据。输入:初始位置、时间、秒脉冲状态、差分模式、NMEA输出间隔等设置信息。在缺省的状态下,GPS 模块输出数据的波特率为4800 ,输出信息包括:GPRMC 、GPGGA 、GPGSA 、GPGSV 、PGRME 等,每秒钟定时输出,如图6.1.3所示。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

342

http://www.up-tech.com博创科技(UP-TECH)

Page 343: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图6.1.3 GPS 模块原始输出信息

六、程序分析

GPS数据的解析GPS 原始采集的数据如上图所示。在接收进程receive 中收到“\n” 之后,表示收到一条完整的信息。在show_gps_info 进程中进行数据的解析和显示:

void* show_gps_info(void * data){

while(1){if(GET_GPS_OK){

GET_GPS_OK=FALSE;printf("%s",GPS_BUF);gps_parse(GPS_BUF,&gps_info);show_gps(&gps_info);

}usleep(100);if(STOP)break;

}}gps_parse实现GPRMC 格式数据的解析:void gps_parse(char *line,GPS_INFO *GPS){

int i,tmp,start,end;char c;char* buf=line;c=buf[5];

if(c=='C'){ // 判断"GPRMC" 语句GPS->D.hour =(buf[ 7]-'0')*10+(buf[ 8]-'0'); //读取小时GPS->D.minute =(buf[ 9]-'0')*10+(buf[10]-'0'); //读取分钟GPS->D.second =(buf[11]-'0')*10+(buf[12]-'0'); // 读取秒tmp = GetComma(9,buf);GPS->D.day =(buf[tmp+0]-'0')*10+(buf[tmp+1]-'0'); //读取日GPS->D.month =(buf[tmp+2]-'0')*10+(buf[tmp+3]-'0'); //读取月GPS->D.year =(buf[tmp+4]-'0')*10+(buf[tmp+5]-'0')+2000;// 读取年//------------------------------

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

343

http://www.up-tech.com博创科技(UP-TECH)

Page 344: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

GPS->status =buf[GetComma(2,buf)]; // 读取小时GPS->latitude =get_double_number(&buf[GetComma(3,buf)]); // 读取纬度GPS->NS =buf[GetComma(4,buf)]; //南纬or北纬GPS->longitude=get_double_number(&buf[GetComma(5,buf)]); //读取经度GPS->EW =buf[GetComma(6,buf)]; // 东经或者西经

#ifdef USE_BEIJING_TIMEZONEUTC2BTC(&GPS->D);

#endif}if(c=='A'){ //"$GPGGA"

GPS->high = get_double_number(&buf[GetComma(9,buf)]);// 读取小时}

}

七、实验步骤

1 、检查跳线断电插入硬件确定试验平台扩展槽上方JP1102/JP1103 跳线位于2 、3 之间,跳线位为EXPORT ;确定GPS/GPRS 模块的JP201/JP202 跳线位于模块外侧GPS 端。断开平台电源2 、接入设备关闭2410-CL 平台,将GPS 天线连接到GPS/GPRS 模块上,天线接收端置放在能良好接受室外信号的地方,比如说窗台,将模块插入2410-CL 扩展插槽。3 、编译程序

[root@localhost /]# cd /arm2410cl/exp/wirleess/01_gps/[root@localhost 01_gps]#make armv4l-unknown-linux-gcc -c -o main.o main.carmv4l-unknown-linux-gcc -c -o gps.o gps.carmv4l-unknown-linux-gcc -o ../bin/gps main.o gps.o -lpthread

4 、运行程序启动minicom ,执行以下指令。

[/mnt/yaffs]mount –t nfs –o nolock 192.168.0.3356:/arm2410cl /host //挂载主机目录,IP地址可变

[/mnt/yaffs]cd /host/exp/basic/binwireless/01_gps/ [/host/exp/basic/binwireless/01_gps]./gps

此时可直接在minicom 中看到试验结果。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

344

http://www.up-tech.com博创科技(UP-TECH)

Page 345: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

八、思考题

如何解析所有GPS 协议的数据?

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

345

http://www.up-tech.com博创科技(UP-TECH)

Page 346: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

6.2 GPRS 通讯实验

一、实验目的

掌握GPRS 通讯原理 学习使用ARM 嵌入式开发平台配置的GPRS 扩展板 认识GPRS 通信电路的主要构成,了解GPRS 模块的控制接口和AT 命令

二、实验内容

通过对串口编程来控制GPRS 扩展板,实现发送固定内容的短信,接打语音电话等通信模块的基本功能。利用开发平台的键盘和液晶屏实现人机交互。

三、预备知识

熟练使用C 语言 掌握在LINUX 下常用编辑器的使用 了解GPS通讯原理

四、实验设备及工具

硬件:UP-CUP S2410 经典平台嵌入式实验仪、PC 机Pentumn500 以上, 硬盘10G 以上。软件:PC 机操作系统REDHAT LINUX 9.0 +MINICOM + ARM LINUX 开发环境

五、实验原理

1 、 SIM100-E GPRS 模块硬件ARM 嵌入式开发平台的GPRS 扩展板采用的GPRS 模块型号为SIM100-E ,是SIMCOM 公司推出的GSM/GPRS 双频模块,主要为语音传输、短消息和数据业务提供无线接口。SIM100-E 集成了完整的射频电路和GSM 的基带处理器,适合于开发一些GSM/GPRS 的无线应用产品,如移动电话、PCMCIA 无线MODEM卡、无线POS 机、

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

346

http://www.up-tech.com博创科技(UP-TECH)

Page 347: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

无线抄表系统以及无线数据传输业务,应用范围十分广泛。SIM100-E 模块的详细技术指标请参阅扩展板说明文档。 SIM100-E 模块为用户提供了功能完备的系统接口。60Pin 系统连接器是SIM100-E 模块与应用系统的连接接口,主要提供外部电源、RS-232 串口、SIM卡接口和音频接口。SIM100-E 模块使用锂电池、镍氢电池或者其他外部直流电源供电,电源电压范围为:3.3V~4.6V ,电源应该具有至少2A 的峰值电流输出能力。注意SIM100-E 的下列引脚:VANA 为模拟输出电压,可提供2.5V 的电压和50mA的电流输出,用于给音频电路提供电源。VEXT 为数字输出电压,可提供2.8V 的电压和50mA的电流输出。VRTC 为时钟供电输入, 当模块断电后为内部RTC提供电源, 可接一个2.0V 的钮扣充电电池。本扩展板需要单独的5V2A 的直流电源供电,经过芯片MIC29302 稳压后得到4.2V 电压供给GPRS 模块使用。SIM100-E 提供标准的RS-232 串行接口,用户可以通过串行口使用AT 命令完成对模块的操作。串行口支持以下通信速率: 300,1200 ,2400 ,4800 ,9600 ,19200 ,38400 ,57600 ,115200(起始默认)当模块上电启动并报出RDY 后,用户才可以和模块进行通信,用户可以首先使用模块默认速率115200与模块通信,并可通过AT+IPR=<rate> 命令自由切换至其它通信速率。在应用设计中,当MCU 需要通过串口与模块进行通讯时,可以只用三个引脚:TXD ,RXD 和GND 。其他引脚悬空,建议RTS 和DTR 置低。本扩展板上采用MAX3232 芯片完成GPRS 模块的TTL 电平到RS232 电平的转换,以能和ARM 开发平台的RS232 串口连接。SIM100-E 模块提供了完整的音频接口,应用设计只需增加少量外围辅助元器件,主要是为MIC提供工作电压和射频旁路。音频分为主通道和辅助通道两部分。可以通过AT+CHFA 命令切换主副音频通道。音频设计应该尽量远离模块的射频部分,以降低射频对音频的干扰。本扩展板硬件支持两个语音通道,主通道可以插普通电话机的话柄,辅助通道可以插带MIC 的耳幔。当选择为主通道时,有电话呼入时板载蜂鸣器将发出铃声以提示来电。但选择辅助通道时来电提示音乐只能在耳机中听到。蜂鸣器是由GPRS 模块的BUZZER 引脚加驱动电路控制的。GPRS 模块的射频部分支持GSM900/DCS1800 双频,为了尽量减少射频信号在射频连接线上的损耗,必须谨慎选择射频连线。应采用GSM900/DCS1800 双频段天线,天线应满足阻抗50 欧姆和收发驻波比小于2 的要求。为了避免过大的射频功率导致GPRS 模块的损坏,在模块上电前请确保天线已正确连接。模块支持外部SIM卡,可以直接与3.0V SIM 卡或者1.8V SIM 卡连接。模块自动监测和适应SIM卡类型。对用户来说,GPRS 模块实现的就是一个移动电话的基本功能,该模块正常的工作是需要电信网络支持的,需要配备一个可用的SIM卡,在网络服务计费方面和普通手机类似。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

347

http://www.up-tech.com博创科技(UP-TECH)

Page 348: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

2 、通信模块的AT 命令集GPRS 模块和应用系统是通过串口连接的,控制系统可以发给GPRS 模块AT 命令的字符串来控制其行为。GPRS 模块具有一套标准的AT 命令集,包括一般命令、呼叫控制命令、网络服务相关命令、电话本命令、短消息命令、GPRS 命令等。详细信息请参考扩展板的应用文档。用户可以直接将扩展板和计算机串口相连,打开超级终端并正确设置端口和如下参数:波特率设为115200 ,数据位为8 ,关闭奇偶校验,数据流控制采用硬件方式,停止位为1 。然后可以在超级终端里输入“AT” 并回车,即可看到GPRS 模块回显一个“AT” ;亦可以尝试下列AT 命令子集。

1 )一般命令AT 命令字符串功能描述AT+CGMI 返回生产厂商标识AT+CGMM 返回产品型号标识AT+CGMR 返回软件版本标识ATI 发行的产品信息ATE <value> 决定是否回显输入的命令。value=0 表示关闭回显,1 打开回显。AT+CGSN 返回产品序列号标识AT+CLVL ? 读取受话器音量级别AT+CLVL=<level> 设置受话器音量级别,level在0 ~100 之间,数值越小则音量越

轻。AT+CHFA=<state> 切换音频通道。State=0 为主音频通道,1 为辅助音频通道。AT+CMIC=<ch>,<gain> 改变MIC增益,ch=0 为主MIC,1 为辅助MIC;gain 在0

~15之间。2 )呼叫控制命令ATDxxxxxxxx; 拨打电话号码xxxxxxxx,注意最后要加分号,中间无空格。ATA 接听电话ATH 拒接电话或挂断电话AT+VTS=<dtmfstr> 在语音通话中发送DTMF音,dtmfstr举例:“4 ,5 ,6”为456

三字符。3 )网络服务相关命令AT+CNUM=? 读取本机号码。AT+COPN 读取网络运营商名称AT+CSQ 信号强度指示,返回接收信号强度指示值和信道误码率。4 )电话本命令(略)5 )短消息命令AT+CMGF=<mode> 选择短消息格式。mode=0 为PDU模式,1 为文本模式。建议

文本模式。AT+CSCA? 读取短消息中心地址。AT+CMGL=<stat>列出当前短消息存储器中的短信。stat 参数空白为收到的未读短信。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

348

http://www.up-tech.com博创科技(UP-TECH)

Page 349: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

AT+CMGR=<index> 读取短消息。index 为所要读取短信的记录号。AT+CMGS=xxxxxxxx‘CR’ Text ‘CTRL+Z’ 发送短消息。xxxxxxxx为对方手机号码,回

车后接着输入短信内容,然后按CTRL+Z 发送短信。CTRL+Z 的ASCII 码是26。AT+CMGD=<index> 删除短消息。index 为所要删除短信的记录号。6 )GPRS 命令(本实验仅实现基本功能,GPRS 命令请参考手册)

六、程序分析

在本实验中创建了两个线程:发送指令线程keyshell 和GPRS 反馈读取线程gprs_read。(1 )Keyshell 线程启动后会在串口或者LCD (输出设备可选择)提示如下的提示信息:

<gprs control shell>[1] give a call[2] respond a call[3] hold a call[4] send a msg[**] help menu

(2 )循环采集键盘的信息,若为符合选项的内容就执行相应的功能函数。以按键按下“1” 为例:

get_line(cmd); //采集按键if(strncmp("1",cmd,1)==0){ //如果为“1”

printf("\nyou select to gvie a call, please input number:")fflush(stdout); // 立即输出串口缓冲区中的内容get_line(cmd); // 继续读取按键输入的电话号码

gprs_call(cmd, strlen(cmd)); // 调用具体的实现函数printf("\ncalling......"); // 显示相应的提示信息

(3 )gprs_call 实现:void gprs_call(char *number, int num){ //tty_ write 串口写函数

tty_write("atd", strlen("atd")); // 发送拨打命令ATD,详见AT 命令tty_write(number, num); // 发送电话号码tty_write(";\r", strlen(";\r")); // 发送结束字符usleep(200000); // 进行适当的延时}

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

349

http://www.up-tech.com博创科技(UP-TECH)

Page 350: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

七、实验步骤

1 、确定试验平台扩展槽上方JP1102/JP1103 跳线位于2 、3 之间,跳线位为EXPORT ;确定GPS/GPRS 模块的JP201/JP202 跳线位于模块内侧GPRS 端处于断电状态。2 、将GPRS 天线连接到模块上,将任意可用GSM 手机SIM卡插入模块背面SIMCARD插槽内,将模块插入2410-S 扩展插槽。3 、编译程序

[root@localhost /]# cd /arm2410cl/exp/wireless/02_gprs/ // 进入实验所在目录[root@localhost 02_gprs]#make // 编译试验内容生成可执行文件armv4l-unknown-linux-gcc -c -o main.o main.carmv4l-unknown-linux-gcc -c -o tty.o tty.carmv4l-unknown-linux-gcc -c -o gprs.o gprs.carmv4l-unknown-linux-gcc -c -o keyshell.o keyshell.carmv4l-unknown-linux-gcc -o ../bin/gprs main.o tty.o gprs.o keyshell.o ../keyboard/keyboard.o ../keyboard/get_key.o -lpthread

4 、运行程序启动minicom ,执行以下指令。

[/mnt/yaffs]modprobe i2c-tomega8 [/mnt/yaffs]mount –t nfs –o nolock 192.168.0.3356:/arm2410cl /host // 挂载主机目录,

IP地址可变[/mnt/yaffs]cd /host/exp/wireless/02_gprs/basic/bin [/host/exp/basic/bin]./gprs[/mnt/yaffs/gps_gprs]./gprs_test.sh Using ./i2c-tomega8.o no PS/2 device found on PS/2 Port 0! no PS/2 device found on PS/2 Port 1! Using ./serial_8250.o

5 、观看试验结果<gprs control shell> [1]give a call // 拨号 [2]respond a call // 接电话 [3]hold a call // 挂断 [4]send a msg // 发送短信(已定) [**]help menuKeyshell>

如要验证通话效果可连接耳机和话筒来实现。注意,此时数字由2410-CL 上的小键盘输入。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

350

http://www.up-tech.com博创科技(UP-TECH)

Page 351: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

八、思考题

如何利用GPRS 模块的GPRS 网络数据传输业务?

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

351

http://www.up-tech.com博创科技(UP-TECH)

Page 352: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

6.3 红外通讯实验

一、实验目的

掌握红外通信原理 了解红外通信协议的体系结构 学会在Linux 下配置红外设备和进行红外通信的方法

二、实验内容

学习红外通信原理,了解红外通信协议的结构框架。阅读TFDU4100 芯片文档,掌握其使用方法,熟练ARM 系统硬件的UART 使用方法。Linux 下配置红外设备实现红外模块和pc 机端进行通信,并且可以收发文件。

三、预备知识

C 语言的基础知识、程序调试的基础知识和方法,Linux 的基本操作。Linux 关于module 的必要知识。Linux 内核的编译。

四、实验设备及工具

硬件:UP-CUP S2410 经典平台、PC 机Pentium 500 以上,硬盘10G 以上软件:PC 机操作系统REDHAT LINUX 9.0 +MINICOM +ARM LINUX 开发环境

五、实验原理

1 .红外通讯背景红外线是波长在750nm 至1mm 之间的电磁波,其频率高于微波而低于可见光,是一种人的肉眼看不到的光线。(如图6.4.1 所示)目前无线电波和微波已被广泛应用在长距离的无线通信中,但由于红外线的波长较短,对障碍物的衍射能力差,所以更适合应用在需要短距离无线通信场合点对点的直线数据传输。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

352

http://www.up-tech.com博创科技(UP-TECH)

Page 353: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图 6.4.1 电磁波普及红外光所处位置2 .红外协议的基本结构为了使各种设备能够通过一个红外接口进行通信,红外数据协议组织(Infrared Data Association ,简称IRDA )发布了一个关于红外的统一的软硬件规范,也就是红外数据通讯标准。红外数据通讯标准包括基本协议和特定应用领域的协议两类。类似于TCP-IP 协议,它是一个层式结构,其结构形成一个栈,如图6.4.2 所示。

图 6.4.2 红外通讯协议栈协议的主要功能如下:物理层协议(Physical Layer ) 制定了红外通信硬件设计上的目标和要求,包括红外的光特性、数据编码、各种波特率下帧的包括格式等。为达到兼容,硬件平台以及硬件接口设计必须符合红外协议制定的规范。连接建立协议层(IrLAP )制定了底层连接建立的过程规范,描述了建立一个基本可靠连接的过程和要求。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

353

http://www.up-tech.com博创科技(UP-TECH)

Page 354: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

连接管理协议层(IrLMP)制定了在单位个IrLAP 连接的基础上复用多个服务和应用的规范。在IrLMP协议上层的协议都属于特定应用领域的规范和协议。流传输协议层(TingTP )在传输数据时进行流控制。制定把数据进行拆分、重组、重传等的机制。对象交换协议层(OBEX)制定了文件和其他数据对象传输时的数据格式。模拟串口层协议层(IrCOMM)允许已存在的使用串口通信的应用象使用串口那样使用红外进行通信。局域网访问协议层(IrLAN)允许通过红外局域网络唤醒笔记本电脑等移动设备,实际远程摇控等功能。整个红外协议栈虽然比较庞大复杂,但是可以通过对Linux 内核简单的配置完成,这也正是linux 的强大之处。3 .红外通信在实验平台中的实现方式s3c2410x 的UART 支持红外的收发,只要将ULCONn 寄存器的红外模式位设置为1 即可,其他相关寄存器的设置同串口实验是相同的,在红外数据传输中,对串口发送的数据采用脉冲进行调制的方式。在IrDA 标准1.0 中,脉冲的宽度为3/16 的BIT 占空比或者为固定的1.63μs 的脉冲宽度。IrDA1.0简称为SIR ,SIR 的最高通信速率是115.2Kbps 。图6.4.3 说明了红外模式的执行过程。

图6.4.3 红外功能框图在图6.4.4、6.4.5、6.4.6中给出了脉冲调制前的异步串口UART 的数据帧格式和进行脉

冲调制后的红外IR帧格式,其中,红外脉冲调制中的没有脉冲代表UART 中的“1”,红外脉冲调制中有脉冲代表UART 中的“0”;在没有串口数据传送时,红外数据帧中没有脉冲。红外模式的执行过程见图6.4.4:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

354

http://www.up-tech.com博创科技(UP-TECH)

Page 355: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图6.4.4 调制前的UART 的数据帧格式

图6.4.5 红外发送模式帧时序图

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

355

http://www.up-tech.com博创科技(UP-TECH)

Page 356: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图6.4.6 红外接收模式帧时序图红外接收器需要一种方式来区分周围的干扰, 噪声和信号。为了这个目的,通常利用尽可能高的输出功率: 高的功率表示在接收器中的大电流,有好的信噪比。然而, IR-LED(红外灯)不可能在全部的时间连续的以高功率进行数据的发送。因此, 使用每个BIT 只有 3/16 或1/4 脉冲宽度的信号进行传输。这样,输出的功率可以达到IR-LED (红外灯)连续闪烁的最大功率的4 ~5 倍。另外, 传输的途径不会携带直流成分 ( 由于接收器连续的适应周围的环境, 只检测环境变化), 这样必须利用脉冲调制。其中在本实验中用的是3/16 的脉冲宽度信号,1/4 脉冲宽度的信号用在快速红外通信中。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

356

http://www.up-tech.com博创科技(UP-TECH)

Page 357: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

1

2

3

4

5

JP1102

TXD2-Se l

1

2

3

4

5

JP1103

RXD2-Se l

RS485TXD RS485RXD

EXTXD2 EXRXD2

TXD2 RXD2

IRED_A1

IRED_C2

TXD3

RXD4

NC5

VCC1/SD6

SC7

GND8

U1105

TFDU4100

R1133

4R7

VCCR1132

4R7

R1131

4R7

IrDATXDIrDARXD

R1134

47 C1119104

C111810u

C1117104

GND GND GND

IrDA

TXD2

IrDATXD IrDARXD

RXD2

JP11042/JP1103UART2-SELECT1-2 RS4852-3 EXPORT4-5 IrDA

GND

R1135

100KGND

. .

图6.4.7 试验原理图其中TXD2 和RXD2 为UART 通道2 的发送和接收端。TFDU4100 的管脚定义如表6.4.1 :

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

357

http://www.up-tech.com博创科技(UP-TECH)

Page 358: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

表 6.4.1 TFDU4100 的管脚定义

七、实验步骤

1 、创建工作目录cd /arm2410clmkdir irdamkdir irda_modules

2 解压缩本次实验内核代码至 /arm2410cl/irda目录中:cd exp/wireless/03_irda/

tar jxf kernel-2410s-2net-irda.tar.bz2 –C /arm2410cl/irda

生成kernel-2410cl_irda 文件夹。3 、配置编译选项:红外协议栈和红外设备模块

cd /arm2410cl/ kernel-2410cl_irdamake menuconfig

进入Main Menu / IrDA (infrared)support菜单,配置方式如图6.4.8 :

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

358

http://www.up-tech.com博创科技(UP-TECH)

Page 359: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图6.4.8 红外配置菜单配置红外设备模块,进入Main Menu / IrDA(infrared)support/ Infrared-port device drivers :

图 6.4.9 配置红外设备模块4 、编译下载内核模块:

make dep

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

359

http://www.up-tech.com博创科技(UP-TECH)

Page 360: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

make make zImagemake modulesmake INSTALL_MOD_PATH=/arm2410cl/irda/irda_modules \ modules_install

// 模块的安装路径为方面后面的下载工作,将新生成的内核映象拷贝由:/arm2410cl/irda/kernel-2410/arch/arm/boot/ 目录拷贝至更上层的/arm2410cl/irda 下。

下载内核模块:编译完成后,会在/arm2410cl/irda/irda_modules 出现lib/ 目录。lib/ 目录具有如下的结构: lib/modules/2.4.18-rmk7-pxa1/ 。查看2.4.18-rmk7-pxa1/ 的内容如下:

build kernel pcmcia

我们编译的目标模块主要集中在kernel 目录下。在实验平台一端,加载NFS文件系统。将实验平台的 /lib/modules/2.4.18-rmk7-pxa1/ 替换为刚编译生成的2.4.18-rmk7-pxa1 目录。5 、烧写新的内核映象

[] mount –t nfs 192.168.0.xxx:/arm2410cl /host[] cd /host/irda // 如前步操作正确可以看到zImage文件[] imagewrite /dev/mtd/0 zImage:192k

6 、重启实验平台,此时运行的为更新的内核。7 、重建模块的依赖关系

[/mnt/yaffs] depmod –a

8 、运行应用程序:[/mnt/yaffs] cd irda[/mnt/yaffs/irda] ./irda.sh

运行结果如下:[/mnt/yaffs/irda]./irda.shinit irdaUsing /lib/modules/2.4.18-rmk7-pxa1/kernel/net/irda/irda.oUsing /lib/modules/2.4.18-rmk7-pxa1/kernel/drivers/net/irda/irtty.oUsing /lib/modules/2.4.18-rmk7-pxa1/kernel/net/irda/ircomm/ircomm.oIrCOMM protocol (Dag Brattli)Using /lib/modules/2.4.18-rmk7-pxa1/kernel/drivers/net/irda/s3c2410_ir.oIrDA: Registered device irda007:52:15.810088 xid:cmd 7774df90 > ffffffff S=6 s=0 (14)07:52:15.900064 xid:cmd 7774df90 > ffffffff S=6 s=1 (14)07:52:15.990050 xid:cmd 7774df90 > ffffffff S=6 s=2 (14)

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

360

http://www.up-tech.com博创科技(UP-TECH)

Page 361: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

07:52:16.080046 xid:cmd 7774df90 > ffffffff S=6 s=3 (14)07:52:16.170062 xid:cmd 7774df90 > ffffffff S=6 s=4 (14)07:52:16.260062 xid:cmd 7774df90 > ffffffff S=6 s=5 (14)07:52:16.350050 xid:cmd 7774df90 > ffffffff S=6 s=* Linux hint=0400 [ Computer ] (21)

注意:检查硬件的跳线。在实验平台扩展插槽的左上的位置有两排跳线。进行红外实验时,要保证两个跳线是插在4-5 的位置上的。9 、windows 端驱动的安装:(1 )连接红外模块,usb接口或者232接口均可。在本实验的开发过程中,PC 端使用的是水木行的IR650红外模块。(2 )安装驱动程序。控制面板/ 添加硬件/ ,安装从列表选择的硬件/ 红外线设备。指定驱动光盘中的IR650驱动位置即可。10 、红外通讯显示:

[/mnt/yaffs/irda]./irda.sh15:58:20.070085 xid:cmd 3bf277d4 > ffffffff S=6 s=0 (14)15:58:20.160066 xid:cmd 3bf277d4 > ffffffff S=6 s=1 (14)15:58:20.240032 xid:rsp 3bf277d4 < 001ab6fe S=6 s=1 BIN hint=8425 [ Computer

Telephony IrCOMM IrOBEX ] (21)15:58:20.250083 xid:cmd 3bf277d4 > ffffffff S=6 s=2 (14)15:58:20.340049 xid:cmd 3bf277d4 > ffffffff S=6 s=3 (14)15:58:20.430043 xid:cmd 3bf277d4 > ffffffff S=6 s=4 (14)15:58:20.520043 xid:cmd 3bf277d4 > ffffffff S=6 s=5 (14)15:58:20.610049 xid:cmd 3bf277d4 > ffffffff S=6 s=* Linux hint=0400 [ Computer ] (21)15:58:22.110029 xid:cmd ffffffff < 001ab6fe S=6 s=0 (14)15:58:22.110153 xid:rsp 3bf277d4 > 001ab6fe S=6 s=0 Linux hint=0400 [ Computer ] (21)15:58:32.610050 xid:cmd 3bf277d4 > ffffffff S=6 s=* Linux hint=0400 [ Computer ] (21)15:58:35.070081 xid:cmd 3bf277d4 > ffffffff S=6 s=0 (14)15:58:35.150031 xid:rsp 3bf277d4 < 001ab6fe S=6 s=0 BIN hint=8425 [ Computer

Telephony IrCOMM IrOBEX ] (21)15:58:35.160071 xid:cmd 3bf277d4 > ffffffff S=6 s=1 (14)

11 、发送文件:./irda.sh send[/mnt/yaffs/irda]./irda.sh send irda.sh

稍后,在PC 机端会出现对话框,如图6.4.9 :

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

361

http://www.up-tech.com博创科技(UP-TECH)

Page 362: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图6.4.10 对话框选择接收后,文件开始传输。传输完成的文件保存在桌面上。12 、接收PC 端的文件:

[/mnt/yaffs/irda]./irda.sh resvSend files to and receive files from win95Waiting for files

在PC 端,点击任务栏的红外 图标,出现如下的对话框,选择发送。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

362

http://www.up-tech.com博创科技(UP-TECH)

Page 363: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图6.4.11 发送文件注意:红外通信使用串口的工作方式,通信速率较低。所以,在选择发送文件时,注意发送文件的大小,以免等待时间过长。

八、思考题

红外通信的主要特点是什么?

6.4 蓝牙无线通讯实验

一、实验目的

掌握蓝牙设备通讯原理。 掌握Linux 嵌入式开发平台上蓝牙设备的使用。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

363

http://www.up-tech.com博创科技(UP-TECH)

Page 364: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

二、实验内容

学习蓝牙设备通讯原理,了解蓝牙通讯的结构。在PC 机与开发板之间实现蓝牙无线通讯。

三、预备知识

熟悉内核模块驱动的编译 了解根文件系统的结构

四、实验设备及工具

硬件:ARM 嵌入式开发板、PC 机Pentumn500 以上, 硬盘10G 以上。软件:PC 机操作系统REDHAT LINUX 9.0 +MINICOM + ARM LINUX 开发环境

五、实验原理

1. 蓝牙技术蓝牙(Bluetooth)技术是由爱立信、诺基亚、Intel 、IBM 和东芝5 家公司于1998年5 月共同提出开发的。蓝牙技术的本质是设备间的无线联接,主要用于通信与信息设备。近年来,在电声行业中也开始使用。依据发射输出电平可以有3 种距离等级,Class1 为100m 左右、Class2 约为10m 、Class3 约为2-3m 。一般情况下,其正常的工作范围是10m 半径之内。在此范围内,可进行多台设备间的互联。但对于某些产品,设备间的联接距离甚至远隔100m 也照样能建立蓝牙通信与信息传递。     借助采用了蓝牙技术的PDA 个人数字助理,用户可很方便地进人因特网。有了蓝牙技术,存储于手机中的信息可以在电视机上显示出来,也可以将其中的声音信息数据进行转换,以便在PC 个人电脑上聆听。东芝公司已开发上市了一种蓝牙无线Modem 和PC 卡,将2 张卡中的一张插人Modem 的主机上,另一张插人PC 个人电脑。这样,用户就成功实现了与因特网的无线联网。     蓝牙技术的特点包括:1 、采用跳频技术,数据包短,抗信号衰减能力强;2 、采用快速跳频和前向纠错方案以保证链路稳定,减少同频干扰和远距离传输时的随机噪声影响;3 、使用2.4GHzISM 频段,无须申请许可证;4 、可同时支持数据、音频、视频信号;5 、采用FM 调制方式,降低设备的复杂性。    

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

364

http://www.up-tech.com博创科技(UP-TECH)

Page 365: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

     该技术的传输速率设计为1MHz ,以时分方式进行全双工通信,其基带协议是电路交换和分组交换的组合。一个跳频频率发送一个同步分组,每个分组占用一个时隙,使用扩频技术也可扩展到5 个时隙。同时,蓝牙技术支持1 个异步数据通道或3 个并发的同步话音通道,或1 个同时传送异步数据和同步话音的通道。每一个话音通道支持64kb/s 的同步话音;异步通道支持最大速率 6.5.1 蓝牙体系结构图为721kb/s,反向应答速率为57. 6 kb/s的非对称连接,或者是432. 6 kb/s 的对称连接。          目前,蓝牙技术已被普遍应用在笔记本电脑上,以帮助两台(或多台)笔记本电脑之间实现无线通信。较红外线传输“必须保证传输信息的两个设备正对,且中间不能有障碍物”、“几乎无法控制信息传输的进度”、“没有成为被广泛接受的工业标准、设备种类不多”等致命的缺陷,蓝牙的优势显示出了勃勃生机。全世界已有2161 家公司参加了SIG (Special Interest Group)组织,并正在共同制定蓝牙技术标准。SIG 的核心公司除上述最初提出开发蓝牙技术的5 家公司外,还有3com 、Lucent 技术、微软和摩托罗拉4 家。SIG 成员公司包括:PC 个人电脑、移动电话、网络相关设备、外围辅助设备和A/ V 设备、通讯设备和汽车电子、自动售货机、医药器械、计时装置等诸多领域的设备制造公司。2. 蓝牙体系结构      蓝牙体系结构包括3 部分,各部分的构成见图1 。下面就硬件、软件、路由机制3方面作简略说明。2.1 、硬件部分     2.1.1 射频模块     将基带模块的数据包通过无线电信号以一定的功率和跳频频率发送出去,实现蓝牙设备的无线连接。          2.1.2 基带模块     采用查询和寻呼方式,使跳频时钟及跳频频率同步,为数据分组提供对称连接(SCO )和非对称连接(ASL) ,并完成数据包的定义、前向纠错、循环冗余校验、逻辑通道选择、信号噪化、鉴权、加密、编码和解码等功能。它采用混合电路交换和分组交换方式,既适合语音传送,也适合一般的数据传送。每一个语音通道支持64kb/s 同步语音,异步通道支持最大速率723.2kb/s(反向57.6kb/s )的非对称连接或433.9kb/s的对称连接。          2.2 、蓝牙协议(软件)          2.2.1 链路管理协议(LMP )

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

365

http://www.up-tech.com博创科技(UP-TECH)

Page 366: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

     通过对链接的发送、交换、实施身份鉴权和加密,并通过协商确定基带数据分组的大小,控制射频部分的电源模式、工作周期及网络内蓝牙设备的连接状态。          2.2.2 逻辑链路控制与应用协议(L2CAP )     L2CAP 与LMP 平行工作,共同实现OSI 的数据链路层的功能。它可提供对称连接和非对称连接的数据服务。          2.2.3 串行电缆仿真协议(RFCOMM )     在蓝牙的基带上仿真RS-232 的功能,实现设备串行通信。例如,在拨号网络中,主机将AT 命令发送到调制解调器,再传送到局域网,建立连接后,应用程序就可以通过RFCOMM 提供的串口发送和接收数据。          2.2.4 服务发现协议(SDP )     按照用户需要,发现相应服务及有关设备,并给出服务与设备列表。工作过程如下:主设备广播1 条信息,从设备做出相应的反应,将收集到的地址存于主设备的内存中,然后主设备从中选择1 个地址,利用链路管理代理所提供的进程在物理层建立连接。一旦建立了服务发现协议,在主从设备之间的物理层连接上就建立了一条LZCAP 点对点通信层。    

2.3 、无线办公网络的路由机制     利用蓝牙技术构建现代企业无线办公网络,实现的基本功能包括:1 、文件、档案、报表、设备资源的共享和互连,比如PC 机之间的互连,PC 机与各种外设或智能设备的互联和共享等;2 、利用蓝牙设备无线访问单位内部局域网以及Internet ;3 、通过一定的路由机制实现办公网络内部的各个匹克网之间的互连。     根据企业的实际需要,企业无线网络由多个匹克网(piconet)构成,而不同匹克网之间的通信应该只在办公网络内部进行路由,而不应通过局域网,这就需要建立一种特殊的路由机制,使得各匹克网之间的通信能够进行正确的路由,达到方便快捷的通信、拓宽通信范围、减轻网络负载的目的。        2.3.1蓝牙网关     用于办公网络内部的蓝牙移动终端通过无线方式访问局域网以及Internet ;跟踪、定位办公网络内的所有蓝牙设备,在两个属于不同匹克网的蓝牙设备之间建立路由连接,并在设备之间交换路由信息。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

366

http://www.up-tech.com博创科技(UP-TECH)

Page 367: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

          主要功能包括:          ① 实现蓝牙协议与TCP/IP协议的转换,完成办公网络内部蓝牙移动终端的无线上网功能。          ② 在安全的基础上实现蓝牙地址与IP地址之间的地址解析,它利用自身的IP 地址和TCP 端口来唯一地标识办公网络内部没有IP地址的蓝牙移动终端,比如蓝牙打印机等。          ③ 通过路由表来对网络内部的蓝牙移动终端进行跟踪、定位,使得办公网络内部的蓝牙移动终端可以通过正确的路由,访问局域网或者另一个匹克网中的蓝牙移动终端。          ④ 在两个属于不同匹克网的蓝牙移动终端之间交换路由信息,从而完成蓝牙移动终端通信的漫游与切换。在这种通信方式中,蓝牙网关在数据包路由过程中充当中继作用,相当于蓝牙网桥。         2.3.2 蓝牙移动终端(MT)

蓝牙移动终端是普通的蓝牙设备,能够与蓝牙网关以及其他蓝牙设备进行通信,从而实现办公网络内部移动终端的无线上网以及网络内部文件、资源的共享。各个功能模块关系如图6.5.2 所示。

图6.5.2 功能模块关系

如果目的端位于单位内部的局域网或者Internet ,则需要通过蓝牙网关进行蓝牙协议与TCP/IP协议的转换,如果该MT 没有IP地址,则由蓝牙网关来提供,其通信方式为MT-BG –MT 。如果目的端位于办公网络内部的另一个匹克网,则通过蓝牙网关来建立路由连接,从而完成整个通信过程的漫游.其通信方式为MT-BG-M_MT( 为主移动终端)-MT 。采用蓝牙技术也可使办公室的每个数据终端互相连通。例如多台终端共用1 台打印机,可按照一定的算法登陆打印机的等待队列,依次执行。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

367

http://www.up-tech.com博创科技(UP-TECH)

Page 368: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

3 .Linux Bluetooth软件层 BlueZ 是官方 Linux Bluetooth 栈,由主机控制接口(Host Control Interface ,HCI)层、Bluetooth 协议核心、逻辑链路控制和适配协议(Logical Link Control and Adaptation Protocol ,L2CAP )、SCO 音频层、其他 Bluetooth 服务、用户空间后台进程以及配置工具组成。 Bluetooth 规范支持针对 Bluetooth HCI 数据分组的 UART (通用异步接收器/ 传送器)和 USB 传输机制。BlueZ 栈对这两个传输机制(drivers/Bluetooth/)都支持。BlueZ BNEP(Bluetooth 网络封装协议)实现了 Bluetooth 上的以太网仿真,这使 TCP/IP 可以直接运行于 Bluetooth 之上。BNEP 模块(net/bluetooth/bnep/)和用户模式 pand 后台进程实现了 Bluetooth 个人区域网(PAN)。BNEP 使用 register_netdev 将自己作为以太网设备注册到 Linux 网络层,并使用上面为 WLAN 驱动程序描述的 netif_rx 来填充 sk_buffs 并将其发送到协议栈。BlueZ RFCOMM(net/bluetooth/rfcomm/) 提供 Bluetooth 上的串行仿真,这使得串行端口应用程序(如 minicom )和协议(如点对点协议(PPP))不加更改地在 Bluetooth 上运行。RFCOMM 模块和用户模式 dund 后台进程实现了 Bluetooth 拨号网络。 4. Bluetooth USB 适配器 Bluetooth USB 适配器拥有一个 Bluetooth CSR 芯片组,并使用 USB 传输器来传输 HCI 数据分组。因此,Linux USB 层、BlueZ USB 传输器驱动程序以及 BlueZ 协议栈是使设备工作的主要内核层。现在,您将了解到三层之间如何交互以使 Linux 网络应用程序在这个设备上运行。 Linux USB 子系统类似于 PCMCIA 子系统,它们都有与移动设备交互的主机控制器设备驱动程序,并且都包含一个向主机控制器和单个设备的设备驱动程序提供服务的核心层。USB 主机控制器遵循两个标准之一:UHCI (通用主机控制器接口)或 OHCI (开放式主机控制器接口)。由于具有 PCMCIA ,单个 USB 设备的 Linux 设备驱动程序不依赖于主机控制器。经由 USB 设备传输的数据分为四种类型(或管道): Control Interrupt Bulk Isochronous

前两个通常用于小型消息而后两个则用于较大型的消息。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

368

http://www.up-tech.com博创科技(UP-TECH)

Page 369: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

USB 设备插入时,主机控制器使用控制管道来枚举它并给它分配设备地址( 1 到 127 )。主机 控 制 器 设 备驱动程序读取的 设 备描述符包含关于 设 备 的 信 息 ,例如 class、subclass 和 protocol 。Linux 的 usbcore 内核模块支持 USB 主机控制器和 USB 设备。并包含 USB 设备驱动程序可以使用的函数和数据结构。USB 驱动程序利用 usbcore 及自己的 class/subclass/protocol 信息(请参阅内核 include/linux/usb.h 中的 struct usb_driver )注册了两个入口点:probe 和 disconnect 。当相应的 USB 设备被附加时,usbcore 用枚举期间从设备配置描述符中读取的 class 信息来匹配已注册的 class 信息,并将设备与相应的驱动程序绑定。这个核心使用一种叫做 USB Request Block 或 URB (在 include/linux/usb.h 中定义)的数据结构,来异步地管理主机和设备之间的数据传输。设备驱动程序使用这些例程来请求各种类型的数据传输(control 、interrupt 、bulk 或 isochronous)。传送请求完成后,核心会使用以前注册的回调函数来通知驱动程序。

针对 Bluetooth USB 设备而言,HCI 命令使用 Control 管道传输,HCI 事件使用 Interrupt 管道,Asynchronous (ACL) 数据使用 Bulk 管道,而 Synchronous (SCO) 音频数 据 使 用 Isochronous 管道。 Bluetooth 规范为 Bluetooth USB 设 备 定义了 class/subclass/protocol 代 码 0xE/0x01/0x01 。 BlueZ USB 传 输 驱 动 程 序(drivers/bluetooth/hci_usb.c)将该 class/subclass/protocol 信息注册到 Linux USB 核心。Belkin USB 适配器插入时,主机控制器设备驱动程序会枚举它。因为在枚举期间从适配器读取的设备描述符与 hci_usb 驱动程序注册到 USB 核心的信息相匹配,所以这个驱动程序可附加到 Belkin USB 设备。由 hci_usb 驱动程序从以上描述的各个端点读取的 HCI 、ACL 和 SCO 数据被透明传送到 BlueZ 协议栈。一旦做完这些,通过使用以上描述的 BlueZ 服务和工具,Linux TCP/IP 应用程序就可以运行在 BlueZ BNEP 上,而串行应用程序则可以运行在 BlueZ RFCOMM 上。

六、实验步骤

1 .配置编译内核蓝牙驱动模块在PC 机上运行以下命令

cd / arm2410cl/kernel/linux-2.4.18-2410cl/ /* 进入开发板内核目录*/make menuconfig /*配置开发板内核*/

2. 选择Bluetooth support 选项,如图6.5.3 所示:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

369

http://www.up-tech.com博创科技(UP-TECH)

Page 370: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图 6.5.3 配置开发板内核3 .进入Bluetooth support 子选项,并做如下设置,<M> 代表该项以模块方式编译,<*> 代表该项编译进内核,如图6.5.4 。

图6.5.4 Bluetooth support 子选项4 .在上图中选中“Bluetooth device drivers --->” ,回车进入其子菜单,编译方式如图6.5.5 所示:

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

370

http://www.up-tech.com博创科技(UP-TECH)

Page 371: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图 6.5.5 Bluetooth device drivers 子菜单5 .选择好选项后,保存并退出make menuconfig。执行以下命令:

make clean /* 删除上次编译产生的文件*/make dep /* 按选项,重新生成新的依赖关系*/make bzImage /* 编译内核映象文件bzImage*/make modules /* 编译<M> 方式的模块,生成可insmod模块*/

6 .新生成的内核映象文件bzImage 位于/arm2410cl/kernel-2410//arch/arm/boot下, 参考内核烧录实验,用串口把该文件下载到开发板的flash 。7 .把类似usb盘的蓝牙模块插入开发板的usb口,重启开发板,并复制第4 步新生成的文件到开发板:在PC 机:

mkdir /arm2410cl/tmpt_bluetooth cp /arm2410cl/kernel-2410/net/bluetooth/bnep/bnep.o /arm2410cl/tmpt_bluetoothcp /arm2410cl/kernel-2410/net/bluetooth/rfcomm/rfcomm.o /arm2410cl/tmpt_bluetoothcp /arm2410cl/kernel-2410/net/bluetooth/l2cap.o /arm2410cl/tmpt_bluetoothcp /arm2410cl/kernel-2410/drivers/bluetooth/hci_usb.o /arm2410cl/tmpt_bluetooth

在/arm2410cl /tmpt_bluetooth 目录下,编写插入模块的start.sh脚本,其内容如下:#!/bin/shinit(){

insmod l2cap.oinsmod rfcomm.oinsmod bnep.oinsmod hci_usb.o/etc/init.d/bluetooth startpand --listen --role NAP

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

371

http://www.up-tech.com博创科技(UP-TECH)

Page 372: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

}case "$1" in net) ifconfig bnep0 10.0.0.1 ;; *) echo "init bluetooth" init exit 1esacexit 0

在开发板:mount -t nfs -o nolock 192.168.0.43:/arm2410cl /host cp –arf /host/ tmpt_bluetooth /mnt/yaffs/.

8. 在开发板上运行蓝牙服务cd /mnt/yaffs/tmpt_bluetooth chmod 777 *./star.sh

9. 在一台window 系统的PC 机上安装本次实验光盘目录下的蓝牙驱动软件或购买蓝牙时自带的光盘软件,安装好后界面如图6.5.6 所示:

图6.5.6 安装后界面

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

372

http://www.up-tech.com博创科技(UP-TECH)

Page 373: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

10 .把类似usb盘的蓝牙模块插入windowsPC 机的usb口,点击上图中的红太阳搜索蓝牙设备,会搜索到linux 蓝牙设备。

图6.5.7 搜索到linux 蓝牙设备在linux 设备上点击右键,如图6.5.8 所示,选择 连接-> 蓝牙个人局域网服务,在弹出的对话框中选择“是”。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

373

http://www.up-tech.com博创科技(UP-TECH)

Page 374: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图6.5.8 蓝牙个人局域网服务

图6.5.9 网络提示过1 -2 分钟,在显示屏的右下角会显示windows 下蓝牙设备分配的IP地址。

图6.5.10 显示IP地址11 .在开发板上运行带参数的start.sh文件。如下所示:

/mnt/yaffs/tmpt_bluetooth/start.sh net

然后用ifconfig |more命令来查看网卡,会发现比以前多了一个bnep0 网卡。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

374

http://www.up-tech.com博创科技(UP-TECH)

Page 375: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

图 6.5.10 IP 显示界面用ifconfig bnep0 169.254.145.112 重新为bnep0 设备分配IP,并且ping PC 机的IP: 169.254.145.113, 看是否ping 得通。12 .若一切顺利,下边就可以把bnep0 做为网卡来连接网络了。可以尝试一下开发板提供的ftp 服务,如图6.5.11 所示,在浏览器中输入ftp://169.254.145.112,关闭弹出的用户名错误警告,在浏览器空白处点击右键,在弹出的快捷菜单中选择登陆。填入用户名root ,

图 6.5.11 FTP

密码无,然后登陆,结果如图6.5.11 所示。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

375

http://www.up-tech.com博创科技(UP-TECH)

Page 376: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

第七章 附录

7.1 常用LINUX 命令的使用

以下均以REDHAT LINUX 为例说明。

一、基本命令

ls :显示当前目录下的所有文件和目录。ls -a:可以看到隐藏的文件,如以. 开头的文件。pwd :显示当前目录路径。ps:列举当前TTY 下所有进程ps -A :列举所有cd 目录名:进入目录mkdir 目录名:创建目录rmdir 目录名:删除空目录rm -rf 目录名:强行删除整个目录内容(无法恢复);其中f 表示强制不进行提示,r 表示目录递归。注:LINUX 下的文件和目录是区分大小写的。ifconfig eth0 192.168.X.XXX 临时修改PC 机IP 地址grep ‘Modified by zou’ * -r 在一个目录树中查找含有某个字符串的所有文件

二、TAB 文件目录匹配搜索的使用

例如/usr/arm2410cl ,假设/ 目录下没有其它以arm 字符开头的其它目录和文件,则要进入这个目录,只需敲入:

cd /usr/arm然后按下TAB 键,则SHELL 会自动匹配找到/usr/arm2410cl 目录,这样就不必

完全键入剩余的2410cl 字符,这个功能在访问名字很长的文件和目录时非常有效,可以大大提供键盘输入的速度,极为方便。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

376

http://www.up-tech.com博创科技(UP-TECH)

Page 377: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

三、ncftp 工具的使用

ncftp 是LINUX 下非常好的FTP 工具软件,它除了支持FTP 命令操作外,还支持LINUX SHELL 下的命令用法,例如,它也支持TAB 键用法,支持目录上传和下载(用-r 或-R 参数)。ncftp 的用法,例如要FTP 一台IP 为192.168.2.32 的LINUX PC 机A ,命令如下:

ncftp -u zou 192.168.0.121其中zou 为A 机器上的合法的用户,连接上之后会提示输入zou 用户的密码,密码

验证通过后,就进入ncftp 命令提示符。

四、编程时获取帮助man

man ,即manunal ,是UNIX 系统手册的电子版本。根据习惯,UNIX 系统手册通常分为不同的部分(或小节,即section),每个小节阐述不同的系统内容。目前的小节划分如下:

命令:普通用户命令系统调用:内核接口函数库调用:普通函数库中的函数特殊文件:/dev 目录中的特殊文件文件格式和约定:/etc/passwd 等文件的格式游戏。杂项和约定:标准文件系统布局、手册页结构等杂项内容系统管理命令。内核例程:非标准的手册小节。手册页一般保存在 /usr/man 目录下,其中每个子目录(如man1,man2, ..., manl,

mann )包含不同的手册小节。使用man 命令查看手册页。man 命令行例子:man rpm

五、取消root密码

运行vim /etc/shadow ,可以看到第一行内容大致如下:root:$1$dVVd5YVP$OgZG58TL/NRExTfcr6URH.:11829:0:99999:7:-1:-

1:134539236 ,要取消root 密码,只需将第一行root 后第一对: 之间的字符全部删除即可,删除后如下:

root::11829:0:99999:7:-1:-1:134539236

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

377

http://www.up-tech.com博创科技(UP-TECH)

Page 378: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

然后用:w! 强行存盘(因为shadow 文件是只读的)后用:q 退出vi 则实现取消了root 密码。

六、压缩/ 解压缩

LINUX 的软件一般是以.gz 或.tar 或者.tar.gz 结尾的。前者是由gzip压缩的,后者是先用tar 归档,在用gzip 压缩而成的。

1 、以.gz 结尾的为压缩文件,用命令:gzip -d filename 来解压,得到的文件在当前目录中,但已没有了.gz 。

2 、以.tar 结尾的为归档文件,用命令:tar -xvf filename 来展开,生成的文件与源文件在同一目录中,只是少了.tar 。

3 、以.tar.gz 结尾的文件最常见,可直接用命令:gzip -cd filename| tar xfv 来解开。tar 的用法:解压:x 参数表示解压tar xzf linux-2.4.x.tgz把一个目录linux-2.4.x 压缩成一个文件:linux-2.4.x.tgztar czf linux-2.4.x.tgz linux-2.4.xc 参数表示压缩。解压缩bz2 格式压缩包tar -xjf linux.bz2建立bz2 格式压缩包tar -cjf linux-2.4.x.tar.bz2 /develop/linux-2.4.x

七、查找文件

如:main.cfind -name main.c或者:locate shadow

注意:locate 为模糊匹配,它会递归的在当前目录下的所有子目录下搜索,并列出所有名字包含shadow 字串的文件。

八、软、硬盘及光驱的使用

在Linux 中对其他硬盘逻辑分区、软盘,光盘的使用与我们通常在DOS与Windows

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

378

http://www.up-tech.com博创科技(UP-TECH)

Page 379: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

中的使用方法是不一样的,不能直接访问,因为在Linux 中它们都被视为文件,因此在访问使用前必须使用装载命令mount 将它们装载到系统的/mnt 目录中来,使用结束,必须进行卸载。命令格式如下:

mount -t 文件系统类型设备名装载目录文件类型常用的如表6-1 所示:表6-1 常用文件类型

msdos dos 分区文件ext2 ext3 Linux 的文件系统Swap Linux swap 分区或swap 文件iso9660 安装CD-ROM 的文件系统vfat 支持长文件名的dos 分区hpfs OS/2 分区文件系统

设备名是指要装载的设备的名称,如软盘、硬盘、光盘等,软盘一般为 /dev/fd0 fd1 ,硬盘一般为/dev/hda hdb ,硬盘逻辑分区一般为期hda1 hda2 等等,光盘一般为/dev/hdc 。在装载前一般要在/dev/mnt 目录下建立一个空的目录,如软盘为floppy ,硬盘分区为其盘符如c 、d 等等,光盘为cd-rom ,使用命令:

mount -t msdos /dev/fd0 /mnt/floppy装载一个mddos 格式的软盘mount -t ext2 /dev/fd0 /mnt/floppy装载一个Linux 格式的软盘mount -t vfat /dev/hda1 /mnt/c装载Windows98 格式的硬盘分区mount -t iso9660 /dev/hdc /mnt/cd-rom装载一个光盘装载完成之后便可对该目录进行操作,在使用新的软盘及光盘前必须退出该目录,

使用卸载命令进行卸载,方可使用新的软盘及光盘,否则系统不会承认该软盘的,光盘在卸载前是不能用光驱面板前的弹出键退出的。

九、LILO 与GRUB

LINUX 安装 时 一般都安装 bootloader , 可 以支持 多 操 作 系 统 并存。常见的bootloader 有LILO 和GRUB ,REDHAT6.x 使用LILO ,REDHAT9.0 同时支持LILO 和GRUB ,但默认使用的是GRUB 。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

379

http://www.up-tech.com博创科技(UP-TECH)

Page 380: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

十、Diff 创建软件补丁,用patch 打补丁

diff 是生成源码补丁的必备工具。其命令格式为:diff [ 命令行选项] 原始文件 新文件常用命令行选项如下:   -r 递归处理目录     -u 输出统一格式(unified format)   -N patch 里包含新文件  -a patch 里可以包含二进制文件它的输出在stdout 上,所以你可能需要把它重定向到一个文件。输出格式保存了上

下文(缺省是上下各三行,最少需要两行),这样,patch 的时候可以允许行号不精确匹配的情况出现。另外,在patch 文件的开头明确地用---和+++ 标示出原始文件和当前文件,也方便阅读。

通常,我们需要对整个软件包做修改,并生成一个patch 文件,下面是典型的操作过程。

tar xzvf software.tar.gz # 展开原始软件包,其目录为softwarecp _a software software-orig # 做个修改前的备份cd software[ 修改,测试……]cd ..diff -ruNa software-orig software > software-my.patch现在我们就可以保存software-my.patch 做为这次修改的结果,至于原始软件包,可

以不必保存。等到下次需要再修改的时候,可以用patch 命令把这个补丁打进原始包,再继续工作。比如是在linux kernel 上做的工作,就不必每次保存几十兆修改后的源码了。这是好处之一,好处之二是维护方便,由于unified patch 格式有一定的模糊匹配能力,能减少原软件包升级带来的维护工作量。

patchpatch 程序根据补丁(patch )文件修改一个文件。补丁文件通常是使用diff 程序

建立的一个列表,这个列表包含如何修改原始文件的一些指令。由于节省时间和空间,Patch 经常用于源代码的修补。

可以想象一个有1MB 的程序包,这个程序包的下一个版本仅仅改变了前面一个版本的两个文件的内容,这个新版本可以完全以一个1MB 的新版本进行发布或者以一个仅仅有1KB 的补丁文件进行发布。这个补丁文件可以对第一个版本的进行更新,更新后的版本就和第二个版本完全一致了。因此,如果已经下载了第一个版本,那么为了下一个版本而进行的大数据量下载工作就可以有效地避免。

常用命令行选项:  patch [命令行选项] [待patch 的文件[patch]]  -pn patch level(n 是数字) -b[ 后缀] 生成备份,缺省是.orig ,为了说明什么是

patch level ,这里看一个patch 文件的头标记。diff -ruNa xc.orig/config/cf/Imake.cfxc.bsd/config/cf/Imake.cf

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

380

http://www.up-tech.com博创科技(UP-TECH)

Page 381: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

--- xc.orig/config/cf/Imake.cf Fri Jul 30 12:45:47 1999+++ xc.new/config/cf/Imake.cf Fri Jan 21 13:48:44 2000

这个patch 如果直接应用,它会去找xc.orig/config/cf 目录下的Imake.cf 文件,假如你的源码树的根目录是缺省的xc 而不是xc.orig ,除了mv xc xc.orig 之外,有无简单的方法应用此patch 呢?patch level 就是为此而设:patch 会把目标路径名砍去开头patch level 个节( 由/ 分开的部分) 。在本例中,可以用下述命令:

cd xc; patch -p1 < /pathname/xxx.patch完成操作。注意,由于没有指定patch 文件,patch 程序默认从stdin 读入,所以

用了输入重定向。又例如:diff -r dir1 dir2 >patch20020523.patch递归的比较目录dir1 与dir2 内 , 所 有 各文件 之 不同处, 并 将 不同处记录到

patch20020523.patch 文件中。patch -p1 < [patchfile]-p1 选项代表patchfile 中文件名左边目录的层数,顶层目录在不同的机器上有所不

同。要使用这个选项,就要把你的patch 放在要被打补丁的目录下,然后在这个目录中运行path -p1 < [patchfile] 。

7.2 VI 简介

vi 是Linux/Unix 世界里极为普遍的可视化的全屏幕文本编辑器(visual edit) ,几乎可以说任何一台Linux/Unix 机器都会提供这个软件。

vi 有三种状态,即编辑方式、插入方式和命令方式。在命令方式下,所有命令都要以:开始,所键入的字符系统均作命令来处理,如:q 代表退出,:w 表示存盘。当你进入vi 时,会首先进入命令方式(同时也是编辑方式)。按下i 就进入插入方式,用户输入的可视字符都添加到文件中,显示在屏幕上。按下ESC 就可以回到命令状态(同时也是编辑方式)。

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

381

http://www.up-tech.com博创科技(UP-TECH)

Page 382: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

编辑方式和命令方式类似,都是要输入命令,但它的命令不要以: 开始,它直接接受键盘输入的单字符或组合字符命令,例如直接按下u 就表示取消上一次对文件的修改,相当于WINDOWS 下的Undo 操作。编译方式下有一些命令是要以/ 开始的,例如查找字符串就是:/string 则在文件中匹配查找string 字符串。在编辑模式下按下: 就进入命令方式。

基本命令解释:1 .光标命令k 、j 、h 、l -上、下、左、右光标移动命令。虽然您可以在Linux 中使用键盘

右边的4 个光标键,但是记住这4 个命令还是非常有用的。这4 个键正是右手在键盘上放置的基本位置。

nG -跳转命令。n 为行数,该命令立即使光标跳到指定行。Ctrl+G-光标所在位置的行数和列数报告。w 、b -使光标向前或向后跳过一个单词。2 .编辑命令i 、 a 、 r - 在 光 标 的 前 、 后 以 及 所 在 处 插 入 字 符 命 令

(i=insert 、a=append、r=replace) 。cw 、dw -改变( 置换)/ 删除光标所在处的单词的命令(c=change 、d=delete) 。x 、d$、dd-删除一个字符、删除光标所在处到行尾的所有字符以及删除整行的命

令。3 .查找命令---- /string 、?string-从光标所在处向后或向前查找相应的字符串的命令。查找下一个键入n4 .拷贝复制命令---- yy 、p -拷贝一行到剪贴板或取出剪贴板中内容的命令。在命令提示(:)下键入y3, 表示从当前光标处开始复制3 行,数字可以自己根据

需要修改,之后将光标移动到需要粘贴的地方,键入p 即可粘贴刚刚复制的内容。常用操作:无论是开启新档或修改旧文件,都可以使用vi ,所需指令为:$ vi  filemane如果文件是新的,就会在荧幕底部看到一个信息,告诉用户正在创建新文件。如果

文件早已存在,vi 则会显示文件的首廿四行,用户可再用光标(cursor )上下移动。~~上面是一个经vi 开启的模拟文件,一行开始处的波折号(~)表示文件的结尾。—指令i 在光标处插入正文—指令I 在一行开始处插入正文—指令a 在光标後追加正文—指令A 在行尾追加正文—指令o 在光标下面新开一行

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

382

http://www.up-tech.com博创科技(UP-TECH)

Page 383: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

—指令O 在光标上面新开一行在插入方式下,不能打入指令,必需先按〈Esc 〉键,返回命令方式。假若户不知

身处何态,也可以按〈Esc 〉键,不管处於何态,都会返回命令方式。在修改文件时,如何存档及退出指定文件都非常重要。在vi 内,行使存档或退出的指令时,要先按冒号(: ),改变为命令方式,用户就可以看见在荧幕左下方,出现冒号(: ),显示vi 已经改为指令态,可以进行存档或退出等工作。

:q! 放弃任何改动而退出vi ,也就是强行退出:w 存档:w! 对于只读文件强行存档:wq 存档并退出vi:x 与wq 的工作一样:zz 与wq 的工作一样删除正文删除或修改正文都是利用编辑方式,故此,下面所提及的指令只需在编辑方式下,

直接键入指令即行。—x 删除光标处字符(Character)—nx 删除光标处後n 个字符—nX 删除光标处前n 个字符—ndw 删除光标处下n 个单词(word )—dd 删除整行—d$或D 删除由光标至该行最末—u 恢复前一次所做的删除当使用vi 修改正文,加减字符时,就会采用另一组在编辑方式下操作的指令。— r  char 由char 代替光标处的字符—Rtext 〈Esc 〉由text 代替光标处的字符—cwtext 〈Esc 〉由text 取代光标处的单词—Ctext 〈Esc 〉由text 取代光标处至该行结尾处—cc 使整行空白,但保留光标位置,让你开始打入—如删除指令一样,在指令前打入的数,表示执行该指令多少次。要检索文件,必

需在编辑方式下进行。—/str〈Return〉向前搜寻str 直至文件结尾处—?str 〈Return〉往後搜寻str 直至文件开首处—n 同一方向上重复检索—N 相反方向上重复检索—vi 缠绕整个文件,不断检索,直至找到与模式相匹配的下一个出现。全程替换命令::%s/string1/string2/g 在整个文件中替换“string1” 成“string2” 。如果要替换文件中的路径:使用命令“:%s#/usr/bin#/bin#g” 可以把文件中所有路径

/usr/bin 换成/bin 。也可以使用命令“:%s/\/usr\/bin/\/bin/g”实现,其中“\” 是转义字符,

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

383

http://www.up-tech.com博创科技(UP-TECH)

Page 384: 博创科技UP-NETARM2410 DVPread.pudn.com/downloads557/ebook/2296158/S2410.doc  · Web view配置名称 型号 说明 cpu arm920t结构芯片三星s3c2410x 工作频率203mhz flash

Beijing Universal Pioneering Technology Co.,LTD.

表明其后的“/”字符是具有实际意义的字符,不是分隔符。同时编辑2 个文件,拷贝一个文件中的文本并粘贴到另一个文件中:

命令如下:---- vi file1 file2---- yy 在文件1 的光标处拷贝所在行---- :n 切换到文件2 (n=next) 或者按ctrl+ww ,就在两个文件间切换。---- p 在文件2 的光标所在处粘贴所拷贝的行---- :n 切换回文件1将文件中的某一部分修改保存到临时文件,例如仅仅把第20~59 行之间的内容存

盘成文件/tmp/1 ,我们可以键入如下命令。---- vi file---- :20,59w /tmp/1如果要在 vi 执行期间,转到shell 执行,使用惊叹号(! )执行系统指令,例

如在vi 期间,列出当前目录内容,可以键入:   :!ls另一方面,用户可以在主目录中创建.exrc 环境文件,用set 打入选项,每次调用

vi 时,就会读入.exrc 中的指令与设置。下面是.exrc 环境文件的实例:set  wrapmarging =8set  showmodeset  autoindent

TEL: 010-82110740 82110741 82110742 82110743FAX:总机转 828

384

http://www.up-tech.com博创科技(UP-TECH)