新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于TMS320DM642驱动模型的驱动程序开发

基于TMS320DM642驱动模型的驱动程序开发

——
作者:武汉大学 金朝辉 时间:2007-01-26 来源:《单片机与嵌入式系统应用》 收藏

随着新技术不断涌现和dsp实时系统日趋复杂,不同类型的外部设备越来越多,为这些外部设备编写设备驱动程序已成为依赖操作系统管理硬件的内在要求。但是,由于内存引脚、响应时间和电源管理等条件的限制,为一个给定的dsp系统编写设备驱动程序有时会很困难。针对设备驱动程序开发者遇到的上述难题,ti公司为c64x系列dsp的开发者提供了一种"类/微型驱动模型(class/mini-driver model)",该模型在功能上将设备驱动程序分为依赖硬件层和不依赖硬件层,两层之间使用通用接口。实践结果表明,采用类/微型驱动模型进行设计后,应用软件可以复用绝大部分相似设备的驱动程序,从而提高驱动程序的开发效率。

1 类/微型驱动模型简介

在类/微型驱动模型中,类驱动通常用于实现多线程i/o请求的序列化和同步功能;同时对设备实例进行管理。在包括视频系统i/o和异步i/o的典型实时系统中,只有少数的类驱动需要表示出外部设备的类型。

类驱动通过每个外部设备独有的微型驱动对该设备进行操作,微型驱动则通过控制外设的寄存器、内存和中断资源来实现对外部设备的控制,微型驱动程序必须将特定的外部设备有效地表示给类驱动。例如:视频显示设备存在一些不同的帧存,应用软件会根据不同的i/o操作进行帧存的分配,此时微型驱动必须映射视频显存,使得类驱动可对不连续的内存(分别存放rgb或yuv分量)设计特定的i/o请求,类/微型驱动模型允许发送由开发者定义数据结构的i/o请求包给微型驱动来控制外部设备,此分层结构使设备驱动的复用能力得到加强,并且丰富了发送给微型驱动i/o请求包的结构。

类/微型驱动模型的结构如图1所示,上层应用程序并非直接控制微型驱动,而是使用一个或一个以上的类驱动对其进行控制。每个类驱动在应用程序代码中表现为一个api函数,并且通过微型驱动的接口iom与微型驱动进行通信,类驱动使用dsp/bios的中的api函数来实现诸如同步等系统服务(dsp/bios是ti公司推出的一种实时操作系统,实际上它是一组可重复调用系统模块的abi函数集合)。到目前为止dsp/bios共定义了3种类驱动:流输入输出管理模块(sio/dio)、管道管理模块(pip/pio)和通用输入输出模块(gio)。在pip/pio和sio/pio类驱动中,调用的api函数已存在于dsp/bios的pip和sio模块中,这些api函数将参数传给相应的适配模块(adapter),适配模块再与微型驱动交换数据。在gio类驱动中,调用的api函数直接与微型驱动通信(需在ccs2.2以上)。

本文引用地址:https://www.eepw.com.cn/article/21200.htm

每个微型驱动都为类驱动和dsp/ bios设备驱动管理提供了标准接口,微型驱动采用芯片支持库(chip support library)管理外围设备的寄存器,内存和中断资源。

2 类驱动的编写

流输入输出管理模块和管道管理模块是dsp/bios提供的两个接口模块,用于支持dsp和外设之间的数据交换。这两种模块的数据传输都可通过类驱动中的适配模块和微型驱动的iom连接。sio的适配模块称为dio:pip的称为pio。类/微型驱动模型还可使用第三种接口模块--通用输入输出模块,其传输模块是基于流输入输出模式的同步i/o模式,更适合文件系统i/o。在编写类驱动时,可以直接调用gio的读写api函数,这些函数的接口已内置于微型驱动的iom中。

2.1 流输入输出管理模块和sio的适配模块

dsp/bios中的流输入输出管理模块为每个dsp/bios线程提供了一种独立的i/o机制,它支持动态创建。流输入输出管理模块有自己的驱动模型,称为dev。dev程序和微型驱动的编写方法相似,都要实现函数表中的打开,关闭和缓存管理等函数,然而结构比较复杂,相比之下,sio的适配模块可以简化流输入输出模块和iom之间的连接,使得通信和同步变得更简单。

2.2 管道管理模块和pip的适配模块

dsp/bios中的管道管理模块提供了管理异步i/o的"数据管道",每个管道对象都拥有一块同样大小的缓存,这些缓存分为同样数量且等长的小块;小块的数量和长度在dsp/bios中设置。虽然小块的长度是固定的,但应用程序可把小于这个长度的数据放入缓存小块中,一个管道有两个结束状态:写完缓存和读完缓存。通常,无论是哪个结束状态都会激活i/o设备。数据通知函数用来执行读/写同步任务以及通知pip缓存填满或清空。写数据时,pip_alloc函数用来获得缓存,pip_put函数用于将数据写入缓存;写完后,读数据通知函数notifyreader将被调用。当读数据时,pip_get函数用来接收缓存中的数据,pip_free函数在数据不再被使用时将缓存清空,清空完后,写数据通知函数notifywriter将被调用。

2.3 通用输入输出模块

通用输入输出模块在提供必要的同步读/写api函数及其扩展函数的同时,将代码和使用数据缓存的大小尽量简化。如图2所示,应用程序可以调用gio的api函数直接与微型驱动的iom交换数据,这些api函数使得gio成为第三种类驱动。

函数表指针是应用程序和微型驱动函数表(fxns)的接口;创建模式包括输入(iom_input)、输出(iom_output)和双向(iom_inout);iom_packet在类驱动和微型驱动间执行异步操作时使用,同步对象地址指向特定通道的同步信号,通道实例地址则指向微型驱动创建的通道实例。

3 微型驱动的设计和实现

类/微型驱动模型中的微型驱动直接控制外部硬件设备。只要微型驱动创建了规定的函数,应用程序就可以方便地通过dio适配模块、pio适配模块或(和)gio类驱动调用。规定的函数包括:通道绑定函数(mdbinddev)、通道创建/删除函数(mdcreatechan/mddeletechan)、i/o请求发送函数(mdsubmitchan)、中断服务函数(isrs)和设备控制函数(mdcontrolchan)。这些规定的函数将放入微型驱动的函数接口表(iom_fxns)中的相应位置,供应用程序通过适配模块或gio类驱动调用。函数接口表的结构如下:


微型驱动支持的控制代码和控制操作,特别要注明该代码的针对对象(针对通道实例还是设备实例)。例如,改变外设波特率的控制代码,必须注明是针对某个通道还是所有通道的,否则容易给应用程序带来错误。

4 用minidriver实现视频数据的输入和输出

如图3所示,从视频采集芯片采集来的视频数据通过edma从视频接口(video port)传输到缓存中,此过程可以通过minidriver实现,本设计在minidriver中通过判断视频接口是否有完整的帧数据来实现帧缓存的管理和edma的重装载及清零更新;在清零后minidriver通知上层类驱动有空帧缓存可以使用。这样就实现了数据的连续传送。

数据输出时,使用下文设计的pci minidriver实现。

4.1 微型驱动的设计与编写




isrs为和mdcontrolchan的结构与mdsubmitchan的结构类似,本文不再做叙述。

4.2 在dsp/bios中注册微型驱动

打开dsp/bios配置工具,如图4所示,首先右击user-defined devices图标,选择插入选项,并重新命名为pcichan;然后右击pcichan,选择属性选项,如图5所示进行注册。


4.3 编写类驱动

本例的类驱动使用通用输入输出模块,首先右击图4中的gio-general input/output manager,选择"启动gio",在应用程序中,gio_create函数使用微型驱动pcichan来创建通道实例;通过调用gio_submit函数来完成应用程序对pci设备的读/写操作等,源代码如下:


通过上述3个步骤,pci设备的dsp/bios驱动设计就基本上完成了,应用程序可以通过使用类驱动来复用pci设备,这样极大地提高了驱动的工作效率,也大大简化了对pci外设的控制。



关键词:

评论


相关推荐

技术专区

关闭