基于嵌入式Linux的设备驱动程序设计

时间:2019-05-14 23:02:46下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《基于嵌入式Linux的设备驱动程序设计》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《基于嵌入式Linux的设备驱动程序设计》。

第一篇:基于嵌入式Linux的设备驱动程序设计

基于嵌入式Linux的设备驱动程序设计

Linux为是一个成熟而稳定的操作系统。将Linux植入嵌入式设备具有众多的优点,包括可剪裁和容易移植等,所以Linux操作系统在嵌入式领域获得了广泛的应用。嵌入式Linux一直是嵌入式领域的研究热点,与PC架构不同,嵌入式系统的硬件具有多样性和差异性,嵌入式系统的开发需要对特定系统进行硬件设计,同时还要针对这些硬件来编写驱动程序。Linux内核就是通过驱动程序来同外围设备打交道的,系统设计人员必须为每个设备编写驱动程序,否则设备无法在操作系统下正常工作。设备驱动程序设计的基本概念与模型

设备驱动程序是操作系统内核与机器硬件之间的接口,它为应用程序屏蔽了硬件的细节,在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作,设计驱动程序是内核的一部分,可以实现以下功能:

对设备初始化和释放;

把数据从内核传送到硬件,以及从硬件读取数据;

读取应用程序传送给设备文件的数据,以及回送应用程序请求的数据;

检测和处理设备出现的错误。

前面已经提到驱动程序的作用,而编写驱动程序就是构造一系列可供应用程序调动的函数(包括open、release、read、write、llseek、ioctl等)。在用户自己的驱动程序中,首先要根据驱动程序的功能,实现file_operations结构中的函数,不需要的函数接口可以直接在file_operations结构中初始化为NULL;file_operations变量会在驱动程序初始化时注册到系统内部。当操作系统对设备操作时,会调用驱动程序注册的file_operations结构中的函数指针。

以下是嵌入式linux2.4设备驱动程序的最简模型。

具体实现前面定义的函数时,需注意下面几点:

1)在test_init函数中要通过调用register_chrdev()函数来向内核注册字符设备驱动程序。如果是块设备,则还需调用mmmap()进行地址空间的映射,再调用register_blkdev()函数来向内核注册块设备驱动程序,在Linux系统中,对中断的处理是属于系统核心部分,因而如果设备与系统之间以中断方式进行数据交换,则必须把该设备的驱动程序作为系统核心的一部分,也就是说设备驱动程序要通过调用request_irq()函数来申请中断,通过free_irq()函数来释放中断(在test_cleanup中实现)。

2)open()函数和release()函数的具体实现有着一定的对应性,在open()函数中主要是执行打开设备时的一些初始化代码,如果该驱动程序需要管理多个设备,那么还要获取从设备号,根据从设备号来判断需要操作的设备,其中,从设备号可通过调用函数MINOR(inode->i_rdev)来获得,然后再调用宏MOD_INC_USE_COUNT来使得驱动程序使用计数器加1,而在release()函数中则要进行相反的处理。即调用宏MOD_DEC_USE_COUNT来减小驱动程序使用计数器。

3)归根到底,驱动函数的实现就是调用内核所支持的函数(包括内核提供的API和用户自己定义的寄存器操作函数)来完成对设备的操作,虽然嵌入式系统设备的种类众多,不同设备操作的具体实现方法不可能相同,但是Linux操作系统提供了一系列特殊API,为开发内核驱动程序带来了很大的方便,调用这些API时需要注意的是:通常情况下,应用程序是通过内核接口访问驱动程序的(这是驱动程序的主要使用方式),因此驱动程序需要与应用程序交换数据,但是操作系统内核和驱动程序在内核空间中运行,而用户程序在用户空间中运行,用户程序不能访问内核空间,操作系统内核和驱动程序也不能使用指针或memcpy()等常规的C库函与用户空间传输数据,造成这种状况的主要原因是linux操作系统使用了虚拟内存机制,使用了虚拟内存机制后,用户空间的内存可能被换出,当内核使用用户空间指针时,对应的页面可能已经不在内存中了,因此在使用调用函数时要注意:设备驱动程序在申请和释放内存时不是调用malloc()和free(),而调用kmalloc()和kfree();用于内核空间与用户空间进行数据拷贝的函数主要有access_ok()(检查某内存空间是否有权访问),copy_to_user()和put_usr()(内核函数向用户空间传输数据),copy_from_user()和get_user()(用户空间向内核空间传输数据);关于内核空间与I/O空间的数据交换,不同体系结构的处理器对I/O的处理方式也不同,x86系列处理器中,I/O与内存完成不同,它是分开编址的,访问它要使用专用的指令;而对ARM体系结构的处理器来说,则是不区分I/O和内存,统一编址的,可以使用同样的指令访问,在驱动程序中可以使用一系列函数来访问I/O口,如outb()、outw()、outl()inb()、inw()、inl()、outsb()、outsw()、outsl()、insb()、insw()和insl()等。

Linux2.6与2.4内核驱动程序的区别

为了彻底防止对正在被使用的内核模块进行错误操作,linux2.6内核在加载和导出内核模块方面都较2.4内核有所改进,避免了用户执行将导致系统崩溃的操作(例如强制删除模块等)。同时,当驱动程序需要在多个文件中包含 头文件时,不必定义宏来检查内核的版本。与2.4内核相比,2.6内核在可扩展性、吞吐率等方面有较大提升,其新特性主要包括:使用了新的调度器算法;内核抢占功能显著地降低了用户交互式应用程序;多媒体应用程序等类似应用程序的延迟;改进了线程模型以及对NPTL的支持,显著改善了虚拟内存在一定成程度负载下的性能;能够支持更多的文件系统;引进了内存池技术;支持更多的系统设备,在2.4内核中有约束大型系统的限制,其支持的每一类设备的最大数量为256,而2.6内核则彻底打破了这些限制,可以支持4095种主要的设备类型,且每个单独的类型又可以支持超过一百万个的子设备;支持反向映射机制(reverse mapping),内存管理器为每一个物理页建立一个链表,包含指向当前映射页中每个进程的页表条目的指针。该链表叫PTE链,它极大的提高了找到那些映射某个页的进程的速度。

Linux操作系统的设备驱动程序是在内核空间运行的程序,其中涉及很多内核的操作,随着Linux内核版本的升级,驱动程序的开发必然也要作出相应的修改,总之,在linux2.6内核上编写设备驱动程序时具体要注意以下几个方面:

1)Linux2.6内核驱动程序必须由MODULE_LICENSE(“Dual BSD/GPL”)语句来定义许可证,而不能再用2.4内核的MODULE_LICENSE(“GPL”)。否则,在编译时会出现警告提示。

2)Linux2.6内核驱动程序可以用int try_module_get(&module)来加载模块,用module_put()函数来卸载模块,而以前2.4内核使用的宏MOD_INC_USE_COUNT和MOD_DEC_USE_COUNT则可不用。

3)前面给出的字符型设备驱动程序模型中结构体file_operations的定义要采用下面的形式。这是因为在Linux内核中对结构体的定义形式发生了变化,不再支持原来的定义形式。

4)就字符型设备而言,test_open()函数中向内核注册设备的调用函数register_chrdev()可以升级为int register_chrdev_region(dev_t from,unsigned count,char * name),如果要动态申请主设备号可调用函数int alloc_chrdev_region(dev_t * dev,unsigned baseminor,unsigned count,char * name)来完成;原来的注册函数还可以用,只是不能注册设备号大于256的设备,同理,对于块设备和网络设备的注册函数也有着相对应的代替函数。

5)在声明驱动程序是否要导出符号表方面有着很大的变化。当驱动程序模块装入内核后,它所导出的任何符号都会变成公共符合表的一部分,在/proc/ksyms中可以看到这些新增加的符号。通常情况之下,模块只需实现自己的功能,不必导出任何符号,然而,如果有其他模块需要使用模块导出的符号时,就必须导出符号,只有显示的导出符号才能被其他模块使用,Linux2.6内核中默认不导出所有的符号,不必使用EXPORT_NO_SYMBOLS宏来定义;而在2.4内核中恰恰相反,它默认导出所有的符号,除非使用EXPORT_NO_SYMBOLS,因此在上面给出的范例中可以省略去该定义语句。

6)Linx内核统一了很多设备类型,同时也支持更大的系统和更多的设备,原来Linux2.4内核中的变量kdev_t已经被废除不可用,取而代之的是dev_t。它拓展到了32位,其中包括12位主设备号和20位次设备号。调用函数为unsigned int iminor(struct inode * inode)和unsigned int imajor(struct inode * inode),而不再用Linux2.4版本中的int MAJOR(kdev_t dev)和int MINOR(kdev_t dev)。

所有的内存分配函数不再包含在头文件 中,而是包含在 中,而原来的 已经不存在。所以当在驱动程序中要用到函数kmalloc()或kfree()等内存分配函数时,就必须要定义头文件 而不是。同时,前面提到的申请内存和释放内存函数的具体参数也有了一定的改变,包括:分配标志GFP_BUFFER被取消,取而代之的是GFP_NOIO和GFP_NOFS;新增了_GFP_REPEAT、_GFP_NOFAIL和_GFP_NORETRY分配标志等,使得内存操作更加方便。

8)因为内核中有些地方的内存分配是不允许失败的,所以为了确保这种情况下得成功分配,linux2.6版本内核中开发了一种称为“内存池”的抽象。内存池其实相当于后备的高速缓存,以便在紧急状态下使用。要使用内存池的处理函数时,必须包含头文件。内存池处理函数主要有以下几个:mempool_t *mempool_create()、void*mempool_alloc()、void mempool_free()、int mempool_resize();

另外值得一提的是:2.6内核为了区别以.o为扩展名的常规对象文件,将内核模块的扩展名改为.ko,所以驱动程序最后是被编译为ko后缀的可加载模块,在应用程序中加载驱动程序模块时要注意。结语

驱动程序的开发作为嵌入式linux系统开发过程当中最重要的环节之一,与硬件特性和操作系统的内核有着紧密的联系。随着linux内核版本的升级,内核驱动程序必然要作出相应的改进,相信随着嵌入式Linux系统在各个领域中的广泛应用,具有可抢占实时性的Linux2.6内核必定会在嵌入式领域大显身手。本文会对广大的驱动程序开发人员有一定的帮助。

第二篇:基于嵌入式Linux的IPMI驱动程序设计

基于嵌入式Linux的IPMI驱动程序设计

2012-04-28

丁四华,张志政,东南大学

摘 要:针对Linux内核下通用IPMI协议实现部分过于复杂、繁琐、占用过多内存资源,不利于某些简单嵌入式应用场合的不足,提出了通过在FPGA逻辑模拟I2C通道的HOST单板与IPMC子卡的硬件环境上,采用经过简化的IPMI请求/应答消息格式,借助专业Linux的I2C核心框架,实现了相应的IPMI驱动程序功能,方便了管理员监测、管理、诊断系统状态,并根据系统崩溃时的状态,来及时恢复系统。本文详细描述了简化的IPMI协议原理,以及基于Linux内核I2C核心框架的IPMI驱动的各功能模块的设计原理,并详细描述了IPMI驱动功能模块的数据收发流程。研究结果表明,改进的简化IPMI驱动功能模块有效的降低了系统的复杂度、节省了内存资源,达到了精简嵌入式应用系统的目的。关键词:Linux;IPMI协议;FPGA;IPMC子卡;I2C总线 1.引言

IPMI(Intelligent Platform Management Interface)是一种无代理的智能平台管理接口,是由Intel 等公司推出的一个重要的开放标准。IPMI定义了管理员如何监测系统硬件状态,控制系统组件和检索重要系统事件的日志以进行远程管理和恢复。

近年来,广泛采用IPMI协议来监测硬件系统的状况,例如温度、风扇、电压和硬件错误(存储、网络等)和机箱防盗,刀片支持等。由于IPMI可以独立于操作系统之外,即使操作系统已经暂停或服务器已经关闭,管理员照样可以监测、管理、诊断和恢复系统。

针对Linux 内核自带的IPMI驱动过于复杂、繁琐、占用过多内存资源的不足,本文根据ATCA(Advanced Telecom Computing Architecture)方案设计,采用简化的IPMI协议来管理ATCA机框内各硬件单板的物理地址与状态。ATCA平台的HOST单板通过I2C总线接口同IPMC(Intelligent Platform Management Controller)子卡通信,从而获得启动所需的单板物理地址等消息, HOST 单板和IPMC子卡之间采用IPMI协议进行通信。本文讨论了该方案在Linux 下IPMI 驱动程序功能的设计。2.IPMI 协议原理

HOST单板和IPMC子卡之间的硬件接口通过I2C总线来通信,软件上采用IPMI协议。HOST单板不能直接获取单板的相关物理信息,必须要通过IPMI 协议从IPMC子卡上获取。

下面描述IPMI 协议设计要点。

(1)IPMI协议采用Request/Response 的模式,我们通常把IPMI的请求消息称为命令,通过采用Request/Response 模式可使IPMI消息在不同的传输通道上传送,在我们的系统中,采用了I2C总线作为物理上面的传输通道进行消息的传送,上面传输的消息的格式按照IPMI协议规定的消息格式。

(2)IPMI命令是一个功能命令的集合,通过IPMI消息中的Network Function字段来表示,这些命令集合中包括了与事件相关的一些命令集合。通过在命令集合里面不同的字段的不同含义来代表该条消息的具体请求。

(3)IPMI中所有的请求消息中都包括一个网络功能(Network Function),命令(command),以及可选的数据(data)字段。IPMI的响应消息和IPMI的请求消息采用同样的消息格式。IPMI消息分为请求和应答两种消息,具体的消息格式如下所示:

图1 IPMI请求消息格式

图2 IPMI应答消息格式

在IPMI消息中,一次请求消息的最大长度不能超过32Bytes,如图1中所示,在这最长的32个BYTES的消息结构中,包括了接收该消息的地址(Responser Address),自身的地址(Requester Address),消息中的NetFn/LUN字段总共是一个BYTE,前面6个bits表示的是NetFn,后面的2个bits表示的请求方的LUN,Seq/Lun字段与NetFn/LUN字段相似,只不过前面的6个bits表示的是序列号,command字段用来表示具体的命令,data字段中存放的是具体的数据,最大长度不能超过25bytes,除了上面的三个字段外,还有两个校验和字段,分别用来对消息头和消息体来进行校验。

应答消息(参见图2)和请求消息在结构上面相同,在回应请求的应答消息中用该将请求的地址和响应的地址字段相互调换,序列号保持不变,NetFn字段加1,LUN填写的是将请求消息中的字段互换。例如在HOST通过IPMC获取32bits的物理信息,HOST按照请求的消息格式发送一条请求到IPMC,IPMC收到后,按照响应的消息的格式发送应答到HOST,并将物理信息放到应答消息的DATA字段中,HOST接收到回应后就可以从DATA字段中直接获取到相关的数据信息。3.Linux下的IPMI驱动设计

Linux下IPMI模块驱动采用分层设计,详细设计说明见各以下各小节。3.1 Linux下的IPMI驱动架构

Linux下IPMI模块驱动分为两部分,一部分为I2C驱动模块,位于Linux内核态,为IPMI驱动提供底层Linux 硬件驱动;另一部分为BSP子系统PMI接口封装层,位于Linux用户态,为上层应用提供IPMI模块初始化、消息发送、消息接收接口。模块位置参见图3。

图3 Linux下的IPMI驱动架构

3.2 硬件环境描述

I2C总线是PHILIPS(飞利浦)公司推出的两线式串行总线,用于连接微控制器及其外围设备,具有简单、高效等特点。由于其接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片引脚的数量,降低了互联成本,特别适用于嵌入式产品。

HOST单板通过FPGA(Field Programable Gate Array)逻辑模拟的I2C模块与IPMC子卡通过FPGA逻辑模拟的I2C模块通信,该I2C模块目前只支持主发,从收功能。参见图4。另外,在该条I2C总线上,可以同时挂接其它的I2C设备,例如,温度监控器等。

图4 HOST单板与IPMC子卡通信图示

3.3 Linux I2C驱动模块设计

Linux下IPMI软件模块代码在整个Linux系统中属于字符设备驱动,按照模块主要功能来划分,整个驱动大体可以分为以下五个模块:

(1)I2C核心框架功能实现子模块;(2)FPGA逻辑模拟I2C设备驱动子模块;

(3)FPGA逻辑模拟I2C适配器驱动子模块;

(4)I2C设备方法子模块;

(5)IPMI用户态接口封装子模块。3.3.1 I2C核心框架功能实现子模块

该模块提供了核心数据结构的定义、I2C适配器驱动和设备驱动的注册、注销管理,I2C通信方法上层的、与具体适配器无关的代码、检测设备地址的上层代码等。

内核中I2C 相关代码可以分为三个层次(参见图5):

(1)I2C core框架:提供了核心数据结构的定义和相关接口函数,用来实现I2C适配器驱动和设备驱动的注册、注销管理,以及I2C通信方法上层的、与具体适配器无关的代码,为系统中每个I2C总线增加相应的读写方法。

(2)I2C总线适配器驱动:定义描述具体I2C总线适配器的i2c_adapter数据结构、实现在具体I2C适配器上的I2C总线通信方法,并由i2c_algorithm数据结构进行描述。

(3)I2C设备驱动:定义描述具体设备的i2c_client和可能的私有数据结构、借助I2C core提供的函数接口完成设备在内核的注册,并实现具体的功能,包括read, write以及ioctl等对用户层操作的接口。

总体而言,Linux中I2C总线的驱动分为两个部分:总线驱动(BUS)和设备驱动(DEVICE)。I2C core与I2C总线适配器驱动完成了硬件上的主机总线驱动(BUS),而I2C driver则实现了从机设备驱动。在设计中,I2C core提供的接口是统一的,不需要修改,我们只需要实现特定I2C总线适配器驱动和I2C设备驱动,这样大大提高了系统的可移植性。

图5 Linux内核I2C框架模块关系图示

3.3.2 FPGA 逻辑模拟I2C 设备驱动子模块

该模块描述具体设备的i2c_client和可能的私有数据结构、借助I2C框架的i2c_probe函数实现注册设备的attach_adapter方法、提供设备可能使用的地址范围、以及设备地址检测成功后创建i2c_client数据结构的回调函数。这部分功能主要由bsp_ipmi_drv.c文件来描述。3.3.3 FPGA逻辑模拟I2C适配器驱动子模块

FPGA模拟I2C适配器驱动子模块,定义描述具体I2C总线适配器的i2c_adapter数据结构、实现在具体I2C 适配器上的I2C总线通信方法,并由i2c_algorithm 数据结构进行描述。这部分功能主要由bsp_ipmi_adap.c文件来描述。

3.3.4 I2C设备方法子模块

该模块提供创建I2C适配器的/dev/ipmi/%d 设备节点,提供IPMI设备访问方法(read & write, open & release, ioctl)等,这部分功能主要由bsp_ipmi_devintf.c文件来描述。3.3.5 IPMI用户态接口封装子模块 该模块主要实现I2C通信从设备的选取、I2C设备方法系统调用的封装,和IPMI消息封装、数据收发的格式化等操作。这部分功能主要由bsp_ipmi_api.c文件来描述。

3.3.6 采用I2C框架的IPMI驱动的数据收发流程

IPMI模块驱动采用内核I2C核心框架,HOST单板IPMI模块驱动的数据收发流程分为四个层次(参见图6)

数据发送流程:

(1)上层用户调用Linux用户态IPMI消息发送函数BSP_IpmiSend()函数向IPMC子卡发送消息;

(2)BSP_IpmiSend()函数通过write系统调用切换到Linux内核态,调用I2C设备接口驱动层的write方法实现ipmcdev_write()函数;

(3)ipmcdev_write()函数通过调用I2C核心层i2c_master_send()函数来发送消息;

(4)i2c_master_send()函数最后调用具体I2C适配器驱动层的i2c_ipmc_xfer()函数来操作I2C总线,该函数受到I2C框架总线锁的保护,任何时刻只能由一个进程访问,符合硬件I2C总线的实际情况。

(5)i2c_ipmc_xfer()函数根据入参调用ipmc_write()函数来向I2C 硬件设备发送数据。

数据接收流程:

(1)上层用户调用Linux用户态IPMI消息接收函数BSP_IpmiRecv()函数接收来自IPMC子卡的消息;

(2)BSP_ IpmiRecv()函数通过read系统调用切换到Linux内核态,调用I2C设备接口驱动层的read方法实现ipmcdev_read()函数;

(3)ipmcdev_read()函数通过调用I2C核心层i2c_master_recv()函数来接收消息;

(4)i2c_master_read()函数最后调用具体I2C适配器驱动层的i2c_ipmc_xfer()函数来操作I2C总线,该函数受到I2C框架总线锁的保护,任何时刻只能由一个进程访问,符合硬件I2C总线的实际情况。

(5)i2c_ipmc_xfer()函数根据入参调用ipmc_read()函数来阻塞接收来自I2C硬件设备的数据。

图6 IPMI模块采用I2C核心框架的数据收发流程

4.总结

本文主要介绍了简化的嵌入式Linux的IPMI驱动程序设计。通过全文可以看出,基于FPGA逻辑模拟I2C通道的HOST 单板与IPMC 子卡的硬件环境,借助Linux内核稳定而又专业的I2C核心框架,使得设计和实现基于I2C核心框架的简化IPMI驱动变得非常容易。同时本文详细描述了IPMI协议的原理和简化后的消息格式。通过该驱动,管理员可以方便的监测、管理、诊断系统状态,并恢复系统。总之,改进的简化IPMI驱动功能模块有效的降低了系统的复杂度、节省了内存资源,达到了精简嵌入式应用系统的目的。

第三篇:嵌入式linu学习心得

嵌入式Linux学习心得

1、Linux命令

ls:查看目录-l以列表方式查看;ls –l 与ll的功能一样 pwd: 查看当前的目录

cd:改变当前操作目录cd /直接跳到根目录 cd..回到上一级目录 cat: 打印显示当前文件的内容信息

mkdir:创建目录

fdisk: 查看硬盘分区信息,-l以列表方式查看

->代表是链接文件,类似window下的快捷方式。

cp: 复制命令,例子cp 文件名 /home/dir/

mv: 移动或改名,如mv sonf.confsonf.txt(改名)移动:mv sonf.conf / rm:删除命令,如rm –f test.c;如删除目录rm –fr d

man:查看某个命令的帮助,man 命令

2、各系统目录的功能

drw—r—w--:d代表是目录,drw代表当前用户的权限,r代表组用户的权限,w代表其它用户的权限。x代表有执行权限。

/boot/gruff.conf: 启动引导程序

/dev:brw—rw--:b代表是块设备。Linux设备有三种,块设备(b开头)、字符设备(c开头)、网络设备。had代表第一个硬盘,hdb代表第二个硬盘。Hdb2代表第二块硬盘的第二个分区。3,67代表主设备为3,从设备为67./etc:存放的是系统的配置文件。Inittab文件存放不同启动方式下必须启动的进程。Inittab文件中有6个启动level,wait中对应着6个level的目录,respawn代表当一个进程被意外终止了,但会自动启动的进程,如守护进程。rc.d目录中存放了一个rc.sysinit文件,里面存放系统初始化配置信息。/etc还有一个vsftpd里面存放tcp、ftp的配置。

/home : 用户目录,存放用户的文件,/lib:存放库文件,后缀为so的文件代表动态链接库。

/lost+found:系统意外终止,存放一些可以找回的文件。

/mnt:挂载外部设备,如挂载光驱:mount –t /dev/cdrom/mnt/cdrom,如

果在双系统中,要查看windows中D盘的文件,首先应该将D盘的文件映射过来,mount –t /dev/hda2/mnt/windows/d

/opt:用户安装的应用程序

/proc:是系统运行的映射,比较重要。里面的文件数字代表进程号。每个进程号目录下包含进程的基本信息。还有其他信息,如cpuinfo等,内核支持的文件系统filesystem等。系统支持的中断interrupts,iomen代表内存分配情况。ioport存放IO端口号。还有分区信息,modole信息,状态信息,版本信息

对于Linux的设备驱动程序,有两种加载模式,一种是直接加载进linux内核,一种是以模块的方式加载到内核。

/sbin: 系统管理的一些工具。如poweroff关机工具。

/usr: 安装系统时很多文件放在此目录下面,包含一些更新等,include包含的头文件,lib 是Linux的库文件,src包含Linux2.4的内核源码

/var:存放是临时变量

3、

第四篇:嵌入式程序设计课程设计

课程设计

课 程 名嵌入式软件开发技术

题 目 基于嵌入式Linux的温度监测系统的

设计与实现

专 业 计算机科学与技术(嵌入式系统方向)班 级 13计算机嵌入式系统班 学 号 学生姓名

2016年6月

摘要

温度是个很普遍而又非常重要的参数,在日常生活、工农业生产以及科研领域都有着广泛的应用。因此,研制能够准确地测量和记录这个参数值的系统具有十分重要的意义。

基于ARM的嵌入式温度监测系统是采用嵌入式Linux作为操作系统,针对以S5PV210为处理器的开发板设计的一个嵌入式温度监测系统。论文在分析了Linux设备驱动程序的基本工作原理基础上,讨论了开发中经常会碰到的中断处理、拥塞处理、I/O端口,并在此基础上实现了基于S5PV210嵌入式处理器的开、读、写、关外部RAM的字符设备驱动和网络驱动。结合高精度温度传感器DS18B20,实现温度的正确采集,并通过以太网络将数据上传给上位机客户端。

论文首先介绍了通信网络中各种设备特性、总线结构及传输技术,然后根据单片机与PC机之间的串行通信原理,用ubantu完成温度监测系统的软件设计与实现,为用户提供一个友好的人机界面,对监测系统进行控制并显示采集后的数据。本系统还通过多线程实现了多个客户端与服务器的通信。

关键词:S5PV210;嵌入式Linux操作系统;DS18B20;网络编程

I

Abstract

Temperature is a very common and very important parameter, in daily life, industrial and agricultural production and scientific research fields have a wide range of applications.Therefore, it is very important to develop a system that can accurately measure and record the value of this parameter.The temperature monitoring system of base on the ARM is use of embedded Linux as the operating system for the processor to S5PV210 development board designed for an embedded temperature monitoring system.Based on the analysis of the basic working principle based on the Linux device drivers discussed development often encounter interrupt handling, congestion handling, I / O ports, and on this basis to achieve the embedded processor based on open S5PV210 reading, writing, characters off the external RAM device driver and network drives.Combined with precision temperature sensor DS18B20, to achieve the correct temperature acquisition, and upload the data via Ethernet to a PC client.At first,the paper introduces the characteristics of various devices in a communication network, the bus structure and transmission technology, and according to the principle of serial communication between SCM and PC, with ubantu complete temperature monitoring system software design and implementation, to provide users with a friendly man-machine interface, the monitoring system to control and display the data after collection.The system also enables communication via a plurality of multi-threaded client and the server.Key words:S5PV210;embedded Linux operating system;DS18B20;Network programming

II

1.引言.......................................................................................................................................1 1.1 设计背景及意义...............................................................................................................1 1.2 设计的主要内容................................................................................................................2 2.相关技术...............................................................................................................................2 2.1 嵌入式Linux......................................................................................................................2 2.2 S5PV210.............................................................................................................................3 2.3 socket网络编程..............................................................................................................3 3.具体实现功能.......................................................................................................................4 3.1总体框架图........................................................................................................................4 3.2客户端功能........................................................................................................................5 3.3 服务器功能........................................................................................................................5 3.4 实验板输出信息...............................................................................................................5 4.具体实现过程.......................................................................................................................6 4.1 交叉编译工具的安装.......................................................................................................6 4.2 客户端模块的设计...........................................................................................................7 4.3 服务器模块.......................................................................................................................8 4.4 LED点亮模块..................................................................................................................10 4.5 温度感应模块.................................................................................................................11 5.测试结果分析.....................................................................................................................13 5.1 各模块运行的效果.........................................................................................................13 5.2 可扩展功能......................................................................................................................15 6.总结与展望.......................................................................................................................15

第一章 引言

1.1 设计背景及意义

温度作为工业、农业、国防和科研等部门最普遍的测量项目。它在工农业生产、现代科学研究以及高新技术开发过程中也是一个极其普遍而又非

常重要的参数。因此,在这些领域中,对于这个参数的测量与控制就显得尤为重要,特别是在纺织工业、冶金、化工、食品、温室种植,汽车制造以及气象预报和科研实验室等许多地方,都具有举足轻重的作用。

以往这些工作大多是由人工完成,不但工作量大,记录的数据少,对温度的调节缺乏实时性,而且电路复杂,标定和校准也比较麻烦,难以满足现代温度测量的要求[1]。自从传感器技术、微控制器技术和计算机技术日渐成熟之后,现代的温度测量与控制系统克服了以往系统中存在的一些问题,比如对环境温度的控制与调节以及数据的记录都由微控制器或计算机自动完成,人们的工作量大大地降低,而且测得的数据也更加的精确,对环境温度的调节更具有实时性[2]。

1.2 设计的主要内容

此次主要采用嵌入式Linux作为操作系统,针对以S5PV210为处理器的开发板设计的一个嵌入式温度监测系统。在Linux设备驱动程序的基本工作原理基础上,讨论了开发中经常会碰到的中断处理、拥塞处理、I/O端口,并在此基础上实现了基于S5PV210嵌入式处理器的开、读、写、关外部RAM的字符设备驱动和网络驱动。结合高精度温度传感器DS18B20,实现温度的正确采集,并通过以太网络将数据上传给上位机客户端。

温度监测系统根据Linux中的网络通信技术和串口通信技术来传输数据。用ubantu完成温度监测系统的软件设计与实现,为用户提供一个友好的人机界面,对监测系统进行控制并显示采集后的数据。本系统还通过多线程实现了多个客户端与服务器的通信。

第二章 相关技术

2.1 嵌入式Linux Linux是UNIX系统的一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。它诞生与1991年的10月5日。以后借助与Internet

网,并进过全世界各地计算机爱好者的共同努力下,现已成为世界上使用最多的一种UNIX类操作系统,并且使用人数还在迅猛增涨。

本次设计采用Linux作为嵌入式操作系统的原因有以下几点:[3] 1)低成本开发系统: 2)可应用于多种硬件平台 3)可定制的内核 4)性能优异 5)良好的网络支持

2.2 S5PV210

S5PV210又名“蜂鸟”(Hummingbird),是三星推出的一款适用于智能手机和平板电脑等多媒体设备的应用处理器。

S5PV210采用了ARM CortexTM-A8内核,ARM V7指令集,主频可达1GHZ,64/32位内部总线结构,32/32KB的数据/指令一级缓存,512KB的二级缓存,可以实现2000DMIPS(每秒运算20亿条指令集)的高性能运算能力。

包含很多强大的硬件编解码功能,内建MFC(Multi Format Codec),支持MPEG-1/2/4,H.263,H.264等格式视频的编解码,支持模拟/数字TV输出。JPEG硬件编解码,最大支持8000x8000分辨率

内建高性能PowerVR SGX540 3D图形引擎和2D图形引擎,支持2D/3D图形加速,是第五代PowerVR产品,其多边形生成率为2800万多边形/秒,像素填充率可达2.5亿/秒,在3D和多媒体方面比以往大幅提升,能够支持DX9,SM3.0,OpenGL2.0等PC级别显示技术。

具备IVA3硬件加速器,具备出色的图形解码性能,可以支持全高清、多标准的视频编码,流畅播放和录制30帧/秒的1920×1080像素(1080p)的视频文件,可以更快解码更高质量的图像和视频,同时,内建的HDMIv1.3,可以将高清视频输出到外部显示器上。

2.3 socket网络编程

Socket是进程通讯的一种方式,即调用这个网络库的一些API函数实现分布在不同主机的相关进程之间的数据交换。[4] 几个定义:

(1)IP地址:即依照TCP/IP协议分配给本地主机的网络地址,两个进程要通讯,任一进程首先要知道通讯对方的位置,即对方的IP。

(2)端口号:用来辨别本地通讯进程,一个本地的进程在通讯时均会占用一个端口号,不同的进程端口号不同,因此在通讯前必须要分配一个没有被访问的端口号。

(3)连接:指两个进程间的通讯链路。

(4)半相关:网络中用一个三元组可以在全局唯一标志一个进程:(协议,本地地址,本地端口号)

这样一个三元组,叫做一个半相关,它指定连接的每半部分。(4)全相关:一个完整的网间进程通信需要由两个进程组成,并且只能使用同一种高层协议。也就是说,不可能通信的一端用TCP协议,而另一端用UDP协议。因此一个完整的网间通信需要一个五元组来标识:(协议,本地地址,本地端口号,远地地址,远地端口号)

这样一个五元组,叫做一个相关(association),即两个协议相同的半相关才能组合成一个合适的相关,或完全指定组成一连接。

第三章 具体实现功能

3.1总体框架图

图1 项目总体框架图

3.2客户端功能

1)显示简单的用户界面 2)发送命令给服务器 3)接收服务器传输的数据 4)显示温度数据

3.3 服务器功能

1)接收客户端发送的命令 2)处理命令

3)把命令转发给硬件 4)获取硬件处理所得的数据 5)把该数据传给客户端

3.4 实验板输出信息

1)LED灯按照客户端的指令亮灭 2)蜂鸣器唱歌

3)核心板控制输出温度传感器的数据到服务器

第四章 具体实现过程

个应用系统要完成各项功能,首先必须有较完善的硬件作保证。同时还必须得到相应设计合理的软件的支持,尤其是微机应用高速发展的今天,许多由硬件完成的工作,都可通过软件编程而代替。甚至有些必须采用很复杂的硬件电路才能完成的工作,用软件编和有时会变得很简单。因此充分利用其内部丰富的硬件资源和软件资源。

程序设计语言有三种:机器语言、汇编语言、高级语言。本系统运用的是高级语言所编写,也就是C语言。所用到的开发平台为ubuntu系统。

4.1 交叉编译工具的安装

(1)考虑到现今Linux平台发展,交叉编译平台编统一为arm-linux-gcc-4.4.3(2)在windows系统下,建立一个共享目录,如:e:/linux_file(3)将光盘目录linux中的arm-linux-gcc-4.4.3.tar.gz 复制到e:/linux_file(4)注意在进行虚拟机设置时使共享目录的有效,并添加共享目录e:/linux_file(5)进入linux操作系统,root目录下建立一个Armcode的子目录,将共享目录下的文件arm-linux-gcc-4.4.3.tar.gz复制到该目录(6)然后进入到该目录,执行解压命令:#cd /root/Armcode;#tar xvzf arm-linux-gcc-4.4.3.tgz –C /;注意:C 后面有个空格,并且C 是大写的,它是英文单词“Change”的第一个字母,在此是改变目录的意思。(7)执行

令,将

arm-linux-gcc

到/opt/FriendlyARM/toolschain /4.4.3/bin 目录。

(8)把编译器路径加入系统环境变量,运行命令:#gedit /root/.bashrc 编辑/root/.bashrc 文件,在最后一行添加:export PATH=$PATH: /opt/FriendlyARM/toolschain/4.4.3/bin(9)重新登录系统(不必重启机器,开始->logout 即可),使以上设置生效,在命令行输入:arm-linux-gcc –v,会出现如下信息,这说明交叉编译环境已经成功安装。

4.2 客户端模块的设计

用户界面的显示:

void interface_print(char *temp){ system(“clear”);printf(“e[31m*******************2016梧*********************e[0mn”);printf(“e[31m*

*e[0mn”);printf(“e[31m*e[0m e[32m点亮LED1: on1

on2e[0me[31m

*e[0mn”);printf(“e[31m*e[0m e[33m关闭LED1: off1

off2e[0me[31m

*e[0mn”);printf(“e[31m*e[0m e[34m开蜂鸣器: onb

songe[0me[31m

*e[0mn”);printf(“e[31m*e[0m e[35m获取温度: get

e[31m *e[0mn”,temp);printf(“e[31m*e[0m e[36m退

出: e[0me[31m

*e[0mn”);printf(“e[31m*

*e[0mn”);printf(“e[31m******************未

来**********************e[0mn”);}

发送命令给服务器:

/*5.调用I/O函数(read/write)与客户端通讯。*/ int i = 5;int pos;while(1){

ret = poll(pfd,2,-1);

if(ret > 0){

if(pfd[0].revents == POLLIN){

interface_print(temp);

/*从终端读取数据*/

memset(buf,0,sizeof(buf));

ret = read(pfd[0].fd,buf,sizeof(buf)-1);7

州学院

|

点亮LED2:

|

关闭LED2:

|

播放音乐:

|

温度:[%s]e[0m quit

|

的大

} if(ret > 0){

}

/*发送数据给服务器*/ write(sockfd,buf,ret);

接受服务器传输的数据:

if(pfd[1].revents == POLLIN){

if(!strncmp(buf,“get”,3)){

/*接收服务器发送的信息*/

memset(temp,0,sizeof(temp));

ret = read(pfd[1].fd,temp,sizeof(temp)-1);

if(ret > 0){

temp[ret-1] = '';

/*把信息显示到终端*/

interface_print(temp);

}

} } 4.3 服务器模块

接收客户端发送的命令:

/*读取客户端信息*/

memset(buf,0,sizeof(buf));

ret = read(newfd,buf,sizeof(buf)-1);

if(ret > 0){

把命令转发给硬件:

/*发送命令给硬件*/

if(!strncasecmp(buf,“on1”,3)){

cmd = LED_ON;

val = 3;

}else if(!strncasecmp(buf,“on2”,3)){

cmd = LED_ON;

val = 4;

}else if(!strncasecmp(buf,“off1”,4)){

cmd = LED_OFF;

val = 3;

}else if(!strncasecmp(buf,“off2”,4)){

cmd = LED_OFF;

}

val = 4;

}else if(!strncasecmp(buf,“onb”,3)){

pwm_on();

}else if(!strncasecmp(buf,“song”,4)){

pwm_music_fun();

}

if(ioctl(fd_led,cmd,(unsigned long)val)< 0){

perror(“ioctl failedn”);

exit(1);

} } } return(void *)0;

获取硬件处理所得的数据:

void *do_temp(void *arg){ int newfd = *(int *)arg;char buf[100];int dev_fd;unsigned int temp[2];float tempvalue=0;unsigned pos;

dev_fd = open(“/dev/fs210_gpio”,O_RDWR | O_NONBLOCK);if(dev_fd < 0){

perror(“open”);

exit(1);}

while(1){

temp[1]= ioctl(dev_fd,GPIO_ON,temp);

/*

temp[1]&=0xffff;

tempvalue=(float)(temp[1])*0.0625;

*/

if(temp[1]&0x8000)

{

temp[1]= ~temp[1]+1;

temp[1]&=0xffff;

tempvalue=(float)(temp[1])*0.0625;

} } else {

temp[1]&=0xffff;

tempvalue=(float)(temp[1])*0.0625;} memset(buf,0,sizeof(buf));sprintf(buf,“%f”,tempvalue);strcat(buf,“n”);write(newfd,buf,strlen(buf));memset(buf,0,sizeof(buf));sleep(1);} return(void *)0;4.4 LED点亮模块

/*参考内核,采用静态的方式实现点灯和灭灯*/ void led_on(unsigned long val){ printk(“ %ld %sn”,val,__func__);gpio_set_value(S5PV210_GPC0(val),1);}

void led_off(unsigned long val){ printk(“ %ld %sn”,val,__func__);gpio_set_value(S5PV210_GPC0(val),0);}

long test_ioctl(struct file *file, unsigned int cmd, unsigned long data){ unsigned long val = data;switch(cmd){

case LED_ON:

led_on(val);

break;

case LED_OFF:

led_off(val);

break;

default:

break;

}

} return 0;/*向系统注册申请设备号*/ ret = register_chrdev(LED_MAJOR,LED_NAME,&led_fops);if(ret){ printk(“register chrdev failed!n”);errno =-EBUSY;

goto err1;}

/*创建一个设备类*/ led_dev->led_class = class_create(THIS_MODULE, LED_MODULE);if(IS_ERR(led_dev->led_class)){ printk(“class create failedn”);errno = PTR_ERR(led_dev->led_class);goto err2;} /*创建一个设备文件,之后系统会自动在/dev目录下自动创建一个设备文件*/ led_dev->led_device = device_create(led_dev->led_class,NULL,MKDEV(LED_MAJOR,0),NULL,“led”);if(IS_ERR(led_dev->led_device)){

printk(“class create failedn”);

errno = PTR_ERR(led_dev->led_device);

goto err3;} led_init();

return 0;

4.5 温度感应模块

static void WriteOneChar(unsigned char dat){ unsigned char i=0;

writel((readl(gph1con)& 0xFFFFFFF0)| 0x1, gph1con);//gph1_0,output spin_lock(&lock);for(i=0;i<8;i++){

writel(readl(gph1dat)&(0xFFFFFFFE), gph1dat);

__udelay(15);

if(dat&0x01){

writel(readl(gph1dat)| 0x1 , gph1dat);

}

else{

writel(readl(gph1dat)&(0xFFFFFFFE), gph1dat);

}

__udelay(45);

writel(readl(gph1dat)| 0x1 , gph1dat);

__udelay(1);

dat>>=1;} spin_unlock(&lock);}

static unsigned int ReadTemp(void){ unsigned char T_h=0;unsigned char T_l=0;unsigned int temp=0;

writel((readl(gph1pud)& 0xFFFc)| 0x02, gph1pud);//gph1_0,pull-up enabled

spin_lock(&lock);Init_DS18B2O();spin_unlock(&lock);__udelay(400);writel((readl(gph1con)& 0xFFFFFFF0)| 0x1, gph1con);//gph1_0,output writel(readl(gph1dat)| 0x1 , gph1dat);WriteOneChar(0xcc);WriteOneChar(0x44);mdelay(100);spin_lock(&lock);Init_DS18B2O();spin_unlock(&lock);__udelay(400);writel((readl(gph1con)& 0xFFFFFFF0)| 0x1, gph1con);//gph1_0,output writel(readl(gph1dat)| 0x1 , gph1dat);WriteOneChar(0xcc);WriteOneChar(0xBE);T_l=ReadOneChar();//L T_h=ReadOneChar();//H

temp=(unsigned int)(((unsigned int)T_h<<8)|T_l);

printk(“temp=%xrn”,temp);

return temp;}

第五章5.1 各模块运行的效果

客户端:

测试结果分析13

图2 客户端运行效果

服务器:

图3 服务器运行效果

开发板:

图4 开发板的显示效果

5.2 可扩展功能

本项目的只是完成其中的一些功能,其可扩展性强,对进行加强完善,还可作如下扩展:

1.拓展成温度报警器,设定一个上限值和下下限值,当温度达到某个值时,如低于20摄氏度时,LED灯亮,高于40摄氏度时,蜂鸣器发出报警提示音。

2.可使开发板的核心板链接生活中的物件,如台灯,或者房间的灯,从而控制生活中物件的开关。

3.找到家庭电器中的接口,连接相应接口可实现远程控制家电。

第六章 总结与展望

通过这次的课程设计,让我受益匪浅,让我对智能硬件有了更深一层的了解,也体会了智能化在现实生活中的重要性,也让我了解和掌握了一些编程思想。让

我把理论知识用在实践中,实现了理论和实践相结合,从中更懂得理论的是实践的基础,实践有能检验理论的正确性,更激发了我对专业知识的渴求,这些对我以后参加工作或者继续学习都会有很大的帮助和影响。通过这次课程设计,让我意识到了自己的一些不足,从而让我认识到了学习的重要性。

虽然这次实训是那么短暂的1周时间,但是这几天我所学到的还是很多的,通过此次培训学生运用本专业所学的理论知识和专业知识来分析解决实际问题的重要教学环节,是对三年所学知识的复习和巩固。同时通过这次培训让我明白了一个很深刻的道理,让我意识到了团队合作的重要性,一个人不能完成的事情,团队能完成。团队精神有利于提高组织整体效能,只有通过发扬团队精神,才能取得更好的成绩。

因时间及精力有限,系统做的还不是很完善,还是有不足的地方,如果时间充足的话,还可以做得更完善,对其进行功能扩展。

以上这些收获对我来说是非常有帮助的,让我受益匪浅,它也是我人生中一笔宝贵的财富。

参考文献

[1] 李勇, 艾竹君, 刘巧云等.一种新型温度测量系统的设计[J].低温与超导, 2007, 35(5):451-454 [2] 马净, 李晓光,宁伟.几种常用温度传感器的原理及发展[J].中国仪器仪表, 2004,(6):1

[3] 曹忠明, 程姚根.从实践中学嵌入式Linux操作系统[M].北京:电子工业出版社, 2014:8-9 [4] 陈刚 , 冯利美.从实践中学嵌入式Linux应用程序开发[M].北京:电子工业出版社, 2012:193-192

第五篇:音视频编解码器AT2042的linux设备驱动程序设计讲解

科 技 论 坛

中国科技信息2006年第1期

CHINA SCIENCE AND TECHNOLOGY INFORMATION Jan.2006

音视频编解码器AT2042的linux设备驱动程序设计 张菁1 周德新1 郝福珍2

(1,桂林电子工业学院通信与信息工程系 541004; 2,华北计算技术研究所通信工程室 100083)

摘 要:论文在分析各种多媒体压缩标准的基础上,详细介绍了Pentamicro公司的2通道A/V编解码器AT2042的功能结构和主要特点,提出了一种基于AT2042芯片的网络视频服务器的硬件设计方案,给出了Linux系统下AT2042设备驱动程序的详细设计。关键词:视频压缩;MPEG-4;网络视频服务器;设备驱动程序

引言

在数字多媒体压缩领域,ITU,ISO等组织制定了许多成功的编码标准,如以JPEG和JPEG2000为代表的静止图像压缩标准,以MPEG-1和MPEG-2为代表的中高码率多媒体数据编码标准,以H.261,H.263,H.263+,H.263++等为代表的低码率、甚低码率运动图像压缩标准,以及覆盖范围更宽面向对象应用的MPEG-4。这些标准之间在码率、图像质量、实现复杂度、差错控制能力及可编辑性上有着很大差别,满足了各种数字图像应用的不同需要。

与传统的基于像素的视频压缩标准不同,MPEG-4采用基于对象的视频编码方法,它不仅可以实现对视频图像数据的高效压缩,还可以提供基于内容的交互功能。此外,为了使压缩后的码流具有对于信道传输的鲁棒性,MPEG-4还提供了用于误码检测和恢复的一系列工具,这样采用MPEG-4标准压缩的视频数据可应用于带宽受限、易发生误码的网络环境中。

韩国Pentamicro公司的2通道MPEG-4 A/V编解码器AT2042,以其多种音视频压缩标准、专用运动侦测算法、代码转换和速率转换功

能、实时数字水印等技术优势,广泛应用于各种高可靠性和高性价比的嵌入式网络视频监控系统中。

(4)视频采用ITU-R 656 / ITU-R 601接口标准,音频采用PCM,I2S商用接口标准;(5)内置ARM946E核,在系统上电/复位时,AT2042的固件程序可由外部主机载入AT2042外挂的SDRAM;

(6)外部主CPU通过AT2042的两个寄存器和四个FIFO与AT2042通信,编解码数据的输入输出可用中断方式。

2.基于AT2042的网络视频服务器的 硬件设计

网络视频服务器是一种内置Web服务器的嵌入式数字远程监控系统,集视频采集、实时压缩和网络传输功能为一体,广泛应用于分布式的安全监控、视频会议和可视电话等领域。网络视频服务器有自己的IP地址和网络接口,可直接接入网络,用户用普通的Web浏览器作为客户端可以实时观看视频服务器发送的图像。图2是基于AT2042的网络视频服务器的硬件原理图。

1.AT2042的功能结构及主要特点

AT2042是一个内置微控制器ARM946E的2通道A/V CODEC芯片,主要完成对视频和语音数据的编码和解码,支持多种音视频编解码标准,可直接与IBM、Motorola、ARM、Xscale和Axis等多种CPU接口,无需其它附加电路。AT2042的内部结构如图1所示。

图1 AT2042的内部结构

AT2042内部主要有以下四个部分:

(1)接口部分,主要包括音视频数据I/O接口、控制接口和内存接口;

(2)视频编解码部分,包括MotionEstimation/Prediction、DCT/QIQ/IDCT和VLC/VLD;

(3)音频编解码部分Audio Codec;(4)内置微控制器ARM946E。AT2042有以下主要特点:

(1)支持MPEG-1、MPEG-2、MPEG-4、H.263和Motion-JPEG等多种视频压缩标准,以及ADPCM、MPEG-1 Layer-Ⅱ和Layer-Ⅲ等音频压缩标准;

(2)支持多种图像分辨率和帧速率,支持CBR和VBR两种码率控制方式;

(3)运动侦测功能,侦测区域和灵敏度可选; 图2 基于AT2042的网络视频服务器的 硬件原理图

图中,视频编解码电路是模拟视频信号和AT2042之间的接口电路,负责视频数据的模/数和数/模转换以及数字视频信号格式转换,输入的模拟视频信号先经过视频编解码电路进行前端处理,产生符合AT2042视频接口标准的8比特ITU-R BT.656数字视频信号。输入的模拟音频信号经过模拟音频ADC电路产生符合AT2042音频接口标准的I2S数字音频信号。之后,在外部主CPU的控制下,该数字音视频数据经过压缩/解压芯片AT2042进行硬件压缩编码,产生的压缩编码数据流通过芯片内部集成的MuxFIFO接口输出。

网络视频服务器的解压缩编码是压缩编码的逆过程,需要解压的数据流经过AT2042内部集成的Demux FIFO接口输入,解压缩编码的基本原理类似于压缩编码,不再赘述。

3.Linux系统下AT2042设备

驱动程序设计

系统调用是操作系统内核和应用程序之间的接口,设备驱动程序则是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作。设备驱动程序主要完成以下的功能:

(1)对设备初始化和释放;

(2)把数据从内核传送到设备和从设备读取数据;

(3)读取应用程序传送给设备文件的数据和回送应用程序请求的数据;(4)检测和处理设备出现的错误。

基于AT2042的网络视频服务器系统的主控操作系统为Linux实时操作系统,将AT2042定义为Linux系统中一个标准字符设备,对AT2042的驱动是编写Linux系统下的芯片级设备驱动程序。设备驱动程序可以包含在Linux内核中,但为了升级和修改方便,我们将其作为一个独立的模块,待系统启动后再动态加载到内核中。

AT2042设备驱动程序工作于内核模式,完成对AT2042的初始化、编解码数据的读写以及编解码功能参数的设置。它提供了AT2042和上层应用程序之间的接口,向下通过芯片接口实现对AT2042芯片的直接控制,向上则为应用程序提供驱动程序接口。AT2042设备驱动程序包含的功能函数主要有模块入口函数、设备操作函数集合和中断服务程序。

3.1模块入口函数

模块入口函数即模块加载/卸载的入口点,它向内核注册和取消注册AT2042设备的驱动程序,提供两个函数:模块加载函数init_module()和模块卸载函数cleanup_module()。加载函数init_module()向内核注册了AT2042设备驱动程序模块所能提供的所有功能,它

调用内核函数register_chrdev()获得AT2042设备的驱动号,将设备登记到相应的设备数组,并返回设备的主驱动号;卸载函数cleanup_module()仅当模块被卸载时才调用,它通过调用内核函数unregister_chrdev(),取消了在init_module()中所完成的注册。

3.2设备操作函数集合

用户进程通过设备文件同硬件打交道,对设备文件的操作就是系统调用,把系统调用和设备驱动程序关联起来的是一个非常关键的数据结构file_operations,定义如下:

struct file_operations {

int(*seek)(struct inode *,struct file *,off_t,int);

int(*read)(struct inode *,struct file *,char,int);

int(*write)(struct inode *,struct file *,off_t,int);

int(*readdir)(struct inode *,struct file*,struct dirent *,int);

int(*select)(struct inode *,struct file *,int,select_table *);

int(*ioctl)(struct inode *,struct file *,unsined int,unsigned long);

int(*mmap)(struct inode *,struct file *,struct vm_area_struct *);

(下转第44页)-33- 科 技 论 坛

中国科技信息2006年第1期

CHINA SCIENCE AND TECHNOLOGY INFORMATION Jan.2006

向上收费的可能性就会大大增加。

另外中国市场,是海外频道一直想进入的,只是苦于落地上受到相关限制,如果有这么好的一个工具和既定的用户群,可以实现目的,他们也必然非常乐意。而这也是可以作为收费频道的来源。2、赢利模式的探索之道

作者认为在短期内P2P流媒体的发展还是属于投入期,绝不能拿短期效益来衡量其投入产出比。在短期内的重点是发展用户,把市场做起来,而不是片面强调盈利。用户数就是他的最大回报和增值基础。

P2P流媒体的可能赢利点在于广告收入、收费频道和向上收费。其中,广告收入随时可以做,但其收入不足以构成赢利的主要来源。而且收入多少是和用户规模成正比。

收费频道和向上收费是P2P流媒体运营的主要收入。以免费频道来吸引用户,以收费频道来获取利润;通过规模用户来向上和内容提供商实施分成,这一切的可行之道的前提就在于用户的规模化,但这需要时间来酝酿。

盈利模式的形成绝非一朝一夕的事,还需要积累、探索和不断总结,而在这过程中,政策的监管又将是一大难题。3、监管的应对之法

监管是必然的,也是产业发展的有序保证。只是在产业还未完全明晰之前,监管对于企业的影响还是很大的,甚至会导致困局。

从目前来看,监管主要体现在以下二个方面:运营商的监管、国家政策部门的监管。

1)运营商的监管

运营商的监管主要分手段和本质两方面,从本质角度,相关产业政策的引导是必需的,这是产业发展秩序的必然,而目前业界讨论最多的则是监管的手段问题。

P2P流媒体的诞生其实是最大化的利用了网络的分发特性,而分发和网络的通达性正是互联网络的特性,只是由于国内的网络运用一直是维持着过剩的态势,突然出现的喷涌,使运营商一下子无法适应,在调整期不得不采用了一些封、限等手段,但这些方法并不是根本解决之道,只是现阶段的应变之法。

应该说,P2P流媒体技术融入下一代互联网是必然的,而运营商只是鉴于对网络现状的担忧,所采取的行动更多的是为了保证在现有条件下网络的正常化。先

稳定再发展。所以,目前运营商所采用的监管手段是暂时的、保护性的。又爱又恨是运营商对于P2P流媒体的写照。

2)国家政策部门的监管(1)海外影响力:P2P流媒体的用户群里有不少来源于海外,其广泛应用有助于推动国内节目文化的海外影响力,而2008“科技奥运”的口号则正好为P2P流媒体展示魅力搭建了大好舞台,以P2P流媒体的方式为全球各地更多的用户提供国内的奥运比赛,这对扩大奥运的海外推广是有重大作用的。从这个角度出发,P2P流媒体赶上了一个好机会,为奥运提供服务的技术优势及海外影响力有可能使他获得一个相对宽松的政策环境。

(2)规模的力量:以P2P流媒体为代表的网络新媒体的趋势是不可逆转的,但网络的自由不代表彻底的放开,产业的前行需要新的秩序引导,P2P流媒体作为新事物,必然有其两面性,如何引导是关键,这其中网民的力量又会对发展起着推动

作用。所以现在,需要的是形成这股力量,使

其成为监管者不可忽视的部分,从而使民众为自己在政策上争取有利的地位。

四、结语

但万事开头难,P2P流媒体目前还处于发展前期,还有很多问题需要解决。产业利益是属于大家的,而群体的力量更甚于个人,P2P流媒体能否继续风生水起更在于业界的共同努力,而作为一个正在运行中的新事物,生存和发展是它不断努力向前的目标。而无论如何P2P流媒体的广泛应用,使得IPTV在实现技术的突破而走出困境,IPTV离我们正越来越近。

参考文献:

1、齐德昱.IPTV发展展望.《计算机世界》.2005.10 2、网络电视发展现状.《每周电脑》.2005.11.07,第41期

3、P2P流媒体技术应用.《通信世界》.2005.09 作者简介:

1、郭长庚 男,汉族,1962年生,本科学历,副教授,中国计算机学会高级会员,中国电子学会高级会员,任许昌职业技术学院信息工程系主任。

2、连智锋 男,汉族,1966年生,本科学历,讲师,中国计算机学会会员,任许昌职业技术学院信息工程系教研室主任。

-44-

下载基于嵌入式Linux的设备驱动程序设计word格式文档
下载基于嵌入式Linux的设备驱动程序设计.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    嵌入式linux驱动学习总结

    调用gcc: export PATH=$PATH:/usr/local/arm/3.4.1/bin 用gcc编译:arm-linux-gcc –o run adc.c 查看gcc: arm-linux-gcc –v 配置NFS 安装NFS Ubuntu上默认是没有安装NFS服务......

    嵌入式课程设计之触摸屏程序设计

    嵌入式课程设计 设计题目:触摸屏驱动程序设计 班级: 学号: 姓名: 指导老师: 设计时间:2010年12月25日--12月28日 目录 第一部分 要求 ................................................

    如何在嵌入式LINUX中增加自己的设备驱动

    如何在嵌入式LINUX中增加自己的设备驱动程序 北京邮电大学电子工程学院 强磊 ------------------ 驱动程序的使用可以按照两种方式编译,一种是静态编译进内核,另一种是编译......

    嵌入式软件工程师底层驱动内核工程师

    嵌入式软件工程师 嵌入式软件工程师嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机......

    嵌入式Linux底层驱动软件工程师岗位职责

    1.负责按照总体设计完成模块详细设计说明书。2.完成模块代码编写、内部测试工作。3.协助硬件设计人员及应用软件设计人员进行系统开发与调试。4.根据技术支持需求进行软件代......

    嵌入式实验6交叉编译及Linux简单程序设计实验

    实验六交叉编译及Linux简单程序设计实验的实验报告 一实验目的 1、了解和掌握交叉编译模式和方法; 2、熟悉和掌握Linux简单程序设计。 二实验环境 预装Fedora10_A8_Linux的pc......

    嵌入式系统语音采集与播放程序设计

    ARM9嵌入式系统课程设计 --嵌入式系统语音采集与播放程序设计 班级: 学号: 姓名:指导老师: 课程设计时间:2011.6.29---2011.7.8 江苏大学 目录第一章 引言 .........................

    VB程序设计课程任务驱动教学方法研究

    VB程序设计课程任务驱动教学方法的研究 邓丽萍 福建农林职业技术学院,福州 3501191 摘要:“任务驱动” 教学法非常适合V B这门实践性要求很强的课程教学。在教学过程中,创设问......