显卡驱动程序设计论文

2024-05-09

显卡驱动程序设计论文(通用12篇)

显卡驱动程序设计论文 篇1

串口驱动程序编写应该是所有外围器件驱动中较为容易的一类, 因为一般串行设备控制寄存器较少, 所以思路较易理清, 代码编写上较为容易。设备驱动程序编程都遵循一种约定, 即系统提供中间层 (对底层驱动而言, 即系

统提供回调函数) , 从而将底层驱动与上层 (一般为用户接口层) 隔离开来。这种隔离使得底层驱动程序员可以编写针对具体硬件的驱动程序并加入到内核中去, 这样的中间层一般被称为虚拟驱动层或者接口层。硬件驱动程序员需要清楚了解驱动程序与系统的接口所在。对系统接口层了解的越清楚, 编写出的驱动程序将更具健壮性和稳定性。

串口驱动既然作为底层驱动程序的一个方面, 系统不例外的也提供了其与上层的接口层。对于vxWorks操作系统而言, 这个接口层由ttyDrv, tyLib所代表。接口层本质上就是系统内核自定义的一套操作函数和数据结构, 底层设备驱动程序将使用其中某些函数和结构与接口层进行交互, 接口层经过进一步的处理后, 继续与上层进行交互。如上文所述, 所谓的上层一般即指用户接口层, 如I/O层。之间关系如图1所示。

ttyDrv和tyLib被称为虚拟驱动层, 二者协同工作共同管理设备驱动层。虚拟驱动层提供的功能主要有:

(1) 以字符设备的形式向上层 (I/O系统层) 注册其读写和控制函数。注册是在ttyDrv () 函数中完成的。而ttyDrv则调用iosDrvInstall完成其注册功能。其对上层注册的读写和控制函数如下: (以下所谓“对应上层XXX函数”是指上层XXX函数将针对tty设备进一步调用此处提供的函数, 如上层read函数针对tty设备将调用ttyRead函数进行进一步的处理)

ttyOpen:tty设备打开函数, 对应上层open函数。

ttyClose:tty设备关闭函数, 对应上层close函数。

tyRead, :tty设备字符读取函数, 对应上层read函数。

tyWrite:tty设备字符发送函数, 对应上层write函数。

ttyIoctl:tty设备控制函数, 对应上层ioctl函数。

(2) 向下层 (设备驱动层) 注册回调函数。作为对下层的接口, 针对是读还是写稍有不同。对于写而言, 在上层I/O层调用write函数写设备时, ttyWrite函数需要主动调用底层驱动程序相关函数发送字符。而对于读而言, ttyRead函数则直接从该层 (虚拟层) 读缓冲区中读取字符, 当缓冲区为空时, 等待 (阻塞方式) 或者立刻返回错误 (非阻塞方式) 。而此时读缓冲区的填充是由底层驱动主动进行的, 当底层驱动接受到一个字符时, 其调用虚拟层提供的机构函数将字符写入缓冲区中以供上层读取。

换句话说, 从虚拟层的角度:当写字符时, 在将字符填入写缓冲区后, 其需要直接调用底层驱动函数发送写缓冲区中的字符。

而当读字符时, 则不会直接调用底层驱动函数, 而只是检查读缓冲区是否有可读字符。读缓冲区中字符的填入是由底层驱动异步进行的。

从底层驱动的角度:对于写字符时, 如果发送完一个字符后, 其需要从写缓冲区中 (如果非空) 取下一个字符继续发送, 由于底层驱动不被允许操作虚拟层中的写缓冲区, 所以虚拟层即以回调函数形式提供一个函数 (tyITx) 供底层驱动从写缓冲区中取字符进行发送。当写缓冲区为空时 (即目前所有字符已被发送完) , 底层驱动将停止发送, 处于空闲状态。此时如果I/O层调用write函数, 继而到达虚拟层的ttyWrite函数, ttyWrite函数在将字符填入写缓冲区后, 其就需要启动底层驱动从空闲状态转入发送状态。这种启动即通过调用底层驱动的某个函数完成。而这个函数的地址在底层驱动程序初始化时将被提供给虚拟层。

对于读字符, 由于字符到达的随机性, 其不能等待上层调用write函数, 才进行接收, 而是只要有字符, 就进行接收, 并将接收到的字符上传给虚拟层, 至于如何对这些字符进行处理将由应用程序决定。此处底层驱动将接收到的字符上传给虚拟层即是通过虚拟层提供的回调函数 (tyIRd) 完成的。

综上, 虚拟层提供给底层驱动的回调函数有两个:①发送:底层驱动从写缓冲区中取字符函数:tyITx;②接收:底层驱动向读缓冲区中写字符函数:tyIRd。

(3) 完成其内部初始化 (如读写缓冲区分配) 和其他各种与硬件无关的辅助功能。

内部初始化主要有:①读写缓冲区分配;②互斥信号量分配;③重要变量和函数指针初始化。

作为底层驱动程序, 向上其与虚拟层交互, 向下其与具体硬件交互。所以其主要完成的功能也可以分为三个方面:

(1) 向上层提供回调函数。底层驱动需要提供一些函数供上层 (虚拟驱动层) 调用, 如启动发送函数, 硬件配置函数等等。一般虚拟层为了完成其功能, 对于其需要调用的底层功能实现函数会专门以一个数据结构的形式进行封装, 底层驱动程序需要对这个数据结构进行初始化后调用虚拟层提供的函数将信息通报给虚拟层。针对串口而言, 这个数据结构即为SIO_DRV_FUNCS结构, 该结构中所有成员均为函数指针, 底层驱动必须编写对应的完成相应功能的函数, 用这些函数地址对SIO_DRV_FUNCS结构进行初始化并通知给虚拟驱动层。

/*sioLib.h文件*/

typedef struct sio_drv_funcs SIO_DRV_FUNCS;

typedef struct sio_chan /*内核使用 SIO_CHAN结构表示一个串口设备*/

{

SIO_DRV_FUNCS * pDrvFuncs;

} SIO_CHAN;

struct sio_drv_funcs /*驱动函数指针定义 */

{

int (*ioctl) (SIO_CHAN *pSioChan, int cmd, void *arg) ;

int (*txStartup) (SIO_CHAN *pSioChan) ;

int (*callbackInstall) (SIO_CHAN *pSioChan, int callbackType,

STATUS (*callback) (void *, ...) , void *callbackArg) ;

int (*pollInput) (SIO_CHAN *pSioChan, char *inChar) ;

int (*pollOutput) (SIO_CHAN *pSioChan, char outChar) ;

};

vxWorks操作系统对每个串口用一个SIO_CHAN结构表示, SIO_DRV_FUNCS结构作为SIO_CHAN结构中一个字段而存在。串口驱动程序必须定义一个SIO_CHAN结构并对其进行初始化, 实际上即对SIO_DRV_FUNCS结构字段进行初始化。在实现上, 为了同时保存其它信息, 驱动程序定义一个自定制数据结构。如下所示。

/*底层设备驱动程序文件:arm926_uart.c*/

typedef struct _ARM926_CHAN{

/* SIO_CHAN类型字段必须是自定制结构的第一个成员 */

SIO_CHAN sio; /*内核定义的SIO_CHAN结构类型 */

…… /*其他信息定义*/

} ARM926_CHAN;

/*定义一个自定义ARM926_CHAN结构类型变量*/

ARM926_CHAN pChan;

/*初始化一个SIO_DRV_FUNCS结构*/

LOCAL SIO_DRV_FUNCS arm926UartDrvFuncs =

{

arm926UartIoctl,

arm926UartTxStartup

arm926UartCallbackInstall,

arm926UartPollInput,

arm926UartPollOutput,

};

/*在初始化函数中对SIO_CHAN结构字段进行初始化*/

void arm926UartDevInit (ARM926_CHAN * pChan)

{

……

pChan->sio.pDrvFuncs = &arm926UartDrvFuncs;

……

}

arm926UartTxStartup函数即是底层驱动提供的供虚拟层调用的发送启动函数。

arm926UartCallbackInstall函数也是由底层驱动程序提供, 虚拟层调用该函数向底层驱动注册tyITx, tyIRd函数地址, 即虚拟层提供给底层驱动的其 (虚拟层) 内部读写缓冲区操作函数, 也即前文中所述的虚拟层向下层提供的两个回调函数。之所以提供arm926UartCallbackInstall函数, 原因在于:①底层驱动并不知道虚拟层提供的回调函数究竟为何?②虚拟层并不清楚底层驱动将自己提供的回调函数安放在何处?

所以虚拟层提供另外一个函数指针callbackInstall, 由底层驱动实现, 虚拟层提供回调函数地址作为参数传入, 至于这些回调函数地址被保存在何处由底层驱动决定。

此处底层对callbackInstall 的具体实现为arm926UartCallbackInstall。对于串口, 网口, 一般存在两种工作模式:中断和查询。中断模式为硬件正常工作模式, 查询模式一般使用在系统调试时。由于查询模式需要明确的由上层进行控制何时进行接收和发送, 所以底层驱动程序必须提供对应的函数供上层调用, 而上层提供函数指针以获取函数地址, 这就是SIO_DRV_FUNCS结构中pollInput, pollOutput函数指针的目的所在。

(2) 控制下层硬件进行字符接收和发送及其他硬件配置工作。底层驱动程序完成的主要功能即控制具体硬件进行字符的接收和发送。在软件实现上, 也即读写相关硬件寄存器内容。正常方式下, 对于串口, 网口这样与外界进行数据交换的设备, 一般通过中断方式进行数据的接收和发送, 中断方式特别对于数据接收具有重要的意义, 因为数据接收时刻对于本设备而言完全不可知, 或者说具有相当的随机性, 内核或者应用程序无法预知何时有数据到达, 从而正好对其进行读取, 所以需要底层驱动程序的异步接收功能:即无论数据何时到达, 底层驱动都进行接收, 并上传给虚拟驱动层进行缓冲, 当应用程序需要读取数据时, 直接从缓冲区中读取即可。

而对于数据发送而言, 中断同样起着至关重要的作用, 通过中断, 底层驱动才可获知此次数据是否发送出去, 从而继续发送下一波数据。

总而言之, 无论是串口驱动还是网口驱动, 中断起着枢纽作用, 是中断将具体硬件与驱动软件联系起来。所以在软件架构上, 无论是串口还是网口, 其都是围绕一个中断处理程序而进行, 由中断处理程序再调用其他相关处理函数进行进一步的处理。

(3) 内部控制结构初始化和其他硬件相关辅助功能。对于驱动程序而言, 其必须维护一个自定义数据结构, 这个结构中将既包括上层需要的结构信息, 也包括对应硬件的具体信息, 如硬件控制寄存器基地址, 中断号等等。

至于其他辅助功能, 包括硬件的统计信息收集和其他一些辅助配置功能。

以上从层次上介绍了虚拟驱动层和设备驱动层的基本功能。了解层次关系对于下文中各层次之间的交互至关重要。下文即从串口初始化开始介绍串口驱动所关联的内核部分。

对于vxWorks而言, 串口初始化是在usrInit函数中 (定义在usrConfig.c文件中) 进行的, 调用路径如下: (以下采取“文件名:函数名”形式说明, 底层驱动程序文件名为arm926_uart.c, 该文件中定义的函数名均以arm926打头, 以与内核函数区分)

usrConfig.c:usrInitundefined:sysHwInitundefined: sysSerialHwInitundefined

arm926_uart.c: arm926UartDevInit ()

sysHwInit是对所有外围硬件进行初始化的函数, 对于串口而言, 具体的初始化函数在sysSerial.c文件sysSerialHwInit函数中进行。而sysSerialHwInit函数实现即与具体硬件平台相关, 对于某个具体的平台而言, 需要对sysSerialHwInit函数进行自实现, 该实现继续调用具体硬件驱动程序初始化函数, 如前文中对于ARM926EJS开发环境, 其对应初始化函数即为arm926UartDevInit。

此时进行的初始化只是底层驱动程序的初始化:

(1) 完成相关数据结构初始化, 包括虚拟层提供的相关结构的初始化从而提供给虚拟层相关回调函数地址。

(2) 完成相关硬件寄存器的配置。配置后硬件处于非工作状态, 但所有的硬件准备工作已经完成, 只是相关工作使能位尚未开启。

此时除了开启硬件正常进行工作, 已完成前文所述底层驱动程序所需完成的三个任务中所有方面。

内核相关初始化在usrRoot函数中完成。从代码实现看, 如果需要在内核中包括串口组件, 必须在config.h文件中定义如下常量:

#define INCLUDE_SERIAL

#define NUM_TTY N_SIO_CHANNELS /*串口通道数*/

#define CONSOLE_TTY 0

#define CONSOLE_BAUD_RATE 115200

INCLUDE_SERIAL变量作为控制是否包含串口设备的总开关。对于需要使用串口的平台, 必须定义该变量。

NUM_TTY为串口通道数, 这也是平台相关的。

CONSOLE_TTY表示控制终端使用的通道号, 一般定义为0。

CONSOLE_BAUD_RATE即控制终端所使用通道的波特率。

usrRoot函数种对串口组件初始化涉及到的关键函数有三:

(1) ttyDrv () 内核实现。该函数实现在前文中已给出。该函数主要完成的功能是虚拟驱动层向上层 (I/O层) 注册读写和控制函数:诸如ttyWrite, ttyRead, ttyIoctl等等, 以供上层调用。

(2) ttyDevCreate () 内核实现。该函数完成对下层相关函数的注册以及内核相关缓冲区和信号量等其它辅助功能初始化工作。

经过以上调用, 此时虚拟驱动层已完成前文中所述该层所需完成的三个主要任务, 内核串口组件已处于正常工作状态。

(3) sysSerialChanGet () 内核提供函数原型, 平台相关实现, 由底层设备驱动程序员完成编写, 与底层串口驱动数据结构相关。该函数的实现读者可参考templateARM目录下 (或者其它体系结构下对应的目录) sysSerial.c文件。

到此, 只剩下向内核注册中断程序 (调用intConnect函数完成) 和开启硬件使能位。这是在sysClkConnect函数中完成的。函数调用路径如下: (采用“文件名:函数名”方式说明, 底层串口驱动程序名为arm926_uart.c) 。

usrRoot:sysClkConnectundefined:sysHwInitundefined:sysSerialHwInitundefined

arm926_uart.c: arm926UartDevInit2 ()

arm926UartDevInit2函数的实现较为简单:①调用intConnect完成中断处理程序的注册。②调用intEnable使能该中断。③写具体硬件相关寄存器使能位开启硬件工作。

所有串口相关准备工作完成, 串口进行正常的数据接收和发送。

底层驱动程序框架总结如下:

(1) 自定义描述设备的数据结构, 形式如前文所述。

(2) 初始化一个虚拟驱动层定义的SIO_DRV_FUNCS结构, 如前文所述。

(3) 编写中断处理核心函数。具体函数架构可参考Wind River提供的串口驱动模版文件。

(4) 提供底层驱动初始化函数, 修改sysSerial.c中相关函数实现, 调用这些初始化函数。注意由sysSerial.c中相关初始化函数对底层驱动程序中初始化函数的调用通过修改sysSerial.c中相关函数实现完成的, 而对于sysSerial.c文件中初始化函数的调用是由内核自动完成, 这从前文的分析中也可看出。所以底层驱动程序员可以而且应该改变sysSerial.c文件中相关函数实现, 但一定不可修改该文件中函数定义的原型:函数名称和参数类型与个数均不可进行改变。

(5) 编写其他具体处理数据接收和发送函数以及其它硬件配置和控制函数, 这些函数由中断处理核心函数调用。

结束语

为使内核上层结构独立于具体底层驱动程序实现, 几乎所有的操作系统都会在设备驱动层之上提供接口层, 一般我们将该层称为虚拟驱动层。作为驱动程序编写者, 除了要了解具体硬件功能外, 还需要清楚了解底层驱动程序与虚拟驱动层之间的联系。本文以vxWorks下串口驱动程序为例, 详细阐述了串口驱动程序底层模块和虚拟驱动层模块的功能以及基本实现, 并从内核初始化代码进行分析, 了解内核模块和底层驱动模块的初始化过程。文章最后附以具体代码给出了一个串口驱动程序的架构。串口驱动程序虽然是所有外围器件驱动程序中较为容易的一类, 但要编写出一个稳定健壮的串口驱动程序还是需要清楚地了解其涉及的各个方面, 希望本文可以在此方面助你一臂之力。

摘要:串口驱动程序由于涉及硬件寄存器较少, 所以是外围器件驱动程序编写中相对较为容易的一类, 但其与内核操作系统的联系上和其它驱动程序都具有相同的层次结构。论文着重阐述了vxWorks操作系统下串口驱动程序与其上层虚拟驱动层的交互, 并详细解释了虚拟驱动层和串口驱动程序的功能以及初始化过程。论文最后结合代码示例给出了串口驱动程序的架构。

关键词:vxWorks,虚拟驱动层,串口驱动

参考文献

[1]Wind River Systems Inc.vxworks kernel programmers guide.2006.09

[2]Wind River Systems Inc.vxworks device driver developers guide.2006.09

[3]Wind River Systems Inc.内核示例源代码

[4]陈智育等.VxWorks程序开发实践.北京:人民邮电出版社, 2004.

[5]http://www.gd-emb.org/detail/id-31347.html, 2008.08

显卡驱动程序设计论文 篇2

如果你使用的是品牌电脑,硬件驱动程序通常都会在随机赠送的光盘或系统硬盘的Drivers目录之中,可是如果你没有光盘,硬盘上也找不到Drivers目录,又该怎么办呢?没关系,我们可以直接访问电脑厂商的网站来下载需要的驱动程序。

在电脑厂商的网站上查找驱动程序的步骤通常是这样的:访问电脑厂商网站,找到并进入页面上的“下载”或“支持”,然后按照提示分别选择电脑的型号、需要的驱动类型以及操作系统地版本等内容,即可搜索到需要的驱动程序了,我们只需要选择其中版本较高或更新日期较近的驱动程序下载回来进行安装即可,

如果你使用的不是品牌电脑,又该到什么地方下载驱动程序呢?这样的话,我们就需要知道需要驱动程序的硬件的具体型号了。比如你知道你的显卡是华硕品牌的某个型号,那么就可以按照上面查找品牌电脑驱动的步骤到华硕公司的网站上搜索驱动程序。

双向驱动,渠道怎样设计? 篇3

现在,企业的渠道设计原则受到来自产品与消费者不同方向力的冲击,不得不进行变通。

“消费行为”驱动渠道设计

市场竞争的不断加剧,使个业与企业之间的竞争变成了企业价值链之间的竞争,而影响渠道价值链效能的两大关键因素就是处于价值链前端的企业和后端的消费者。

更进一步,企业的利润区是出现在现代价值链即以消费需求为主导的价值链上的(陈春花《争夺价值链》)。对于大多数企业而言,其整条价值链的经济价值能否最终实现,有赖于最终消费者的需求能否得以有效满足。本质上讲,消费者的消费行为决定了营销渠道的结构。

传统渠道设计以“正向模式”进行,从企业出发选择一级经销商、次级经销商,逐级管理;而从价值链视角来看,以“逆向模式”进行营销渠道的设计,能更准确地体现市场的消费需求。它是从营销渠道的末端开始,根据消费行为,向上考虑整条渠道的选择(图2)。

渠道之所以有价值,在于其能够满足消费者对营销渠道服务水平的不同要求。根据消费者对营销渠道服务水平的要求,进行渠道设计时可以从五个方面进行考虑。

1.覆盖驱动型。

能满足消费者对空间便利的需求,体现为消费者购买产品提供的方便程度。如社区购物中心、邻近超市、便利店、自动售货机和加油站,都是为满足消费者空间便利性要求而设计的。

2.成本驱动型。

能满足消费者对低价格的需求。例如,作为目前世界最大的家居用品零售商,“宜家”的运作处处都体现出“成本领先”的思路,成为消费者选择“有价值的低价格”家具的首选之地。

3.产品品种驱动型。

能满足消费者对较宽的产品花色品种的需求。渠道为顾客选购提供的产品花色品种越多,消费者选择的余地就越大,但就有更多的机会达到消费者的预期,使其满意。例如,沃尔玛、家乐福、百佳等大型卖场,丰富的商品常常吸引顾客进行一站式购物。

4.认知价值驱动型。

能满足消费者对某些特定的产品特征或特定服务的需求。例如,香港屈臣氏连锁店就有别于百佳,以提供高品质的商品为主。亚洲糖果市场上崛起的命莎巧克力在进军竞争激烈的香港市场时,就选择服务对象为高品质、高品位的高消费人士的屈臣氏为主渠道,而没有选择百佳。

5.批量规模驱动型。

能满足消费者对批量购买的需求。例如,在购买文具时,机构组织偏好能人批量购买的渠道,如文具批发商;而对个人来讲,则想要那种允许购买少量的渠道。

因此,我们有必要从门标消费者开始,以“逆向模式”进行渠道设计。

首先,渠道以目标顾客为导向策略。要了解目标顾客的消费行为,细分能满足目标顾客需求的渠道类型。

其次,渠道多元化策略。一个企业往往经营不同的产品线,不同的日标顾客导致对渠道服务要求的差异性,使企业有必要选择不同的渠道乃至可能实现的潜在渠道。例如,惠普在全球范围内推出三种优化渠道模式:用户主导的大客户直销(认知价值驱动型渠道)、惠普在线商店的销售(成本驱动型渠道)和经销合作伙伴主导渠道销售(覆盖驱动型渠道),以满足不同顾客的差异化需求。

再次,渠道“柔性化”策略。市场环境的急剧变化导致消费行为改变,进而对渠道提出调整的要求。渠道“柔性化”策略要求企业在进行渠道设计时,要充分把握渠道发展的动态趋势,并在渠道的建设中采取必要的措施保持渠道的柔性。比如手机零售,最早的手机零售只能在电信部门的营业厅进行,电信销售市场放开之后,大量的个体手机零售商涌向市场,并形成了很多电信城(由众多以租赁经营为主的手机零售柜台组成),随后出现了全国性的手机销售连锁店、大型商场手机专柜以及营业面积上千平方米、装修高档的“手机商场”。这就要求企业的渠道设计要有适应性,可变性,并且易调整。

“渠道提供”驱动渠道设计

从产业价值链来看,企业所用的营销渠道往往对企业怎样构造其自身价值链和现有的纵向联系具有重要影响。而且,渠道还可以反映重要的成本驱动因素,如订货规模、运输规模和交货时间等。

从“价值链”视角进行的渠道设计是双向驱动的,在考虑到消费者行为以后,还要考虑企业进行“渠道提供”的能力,也就是渠道增值能力(图3)。

宝洁与沃尔玛成功合作,一个重要的原因是宝洁有能力满足沃尔玛对供应链管理的要求。这种由制造商向分销商提供的、吸引分销商更多销售本公司产品的种种便利条件,我们称之为渠道提供。渠道提供可以主要分为两部分:核心要素和能力建设项目。

1.核心要素,即制造商必须满足分销商的五个基本条件,包括财务收入、产品质量、有党争力的价格和可靠的配送系统、良好的信誉。

制造商必须以合适的价格向分销商提供最终顾客所需要的产品,以使得分销商能够从中获利;拥有良好的声誉可以拉动分销商更积极地与制造商进行交易。此外,制造商还必须具有可靠的配送系统使分销商能够把正确的产品最快地传送给顾客。

2.能力建设项目,是制造商用来建立所期望的分销商的能力,从而产生预期的市场绩效。通过这种能力建设所提高的分销商的能力并不会直接传递到生产相同产品的其他供应商那里。一些关键的能力建设项目如下:促销支持、技术/服务援助、反应系统、渠道培训或市场调研等等。

例如,通用电气消费者金融集团为消费者、零售商和汽车经销商提供多样性的信贷服务,包括汽车贷款和租赁、抵押及信用卡、个人贷款、信用保险等。这种服务支持的能力建设,极大地促进了通用汽车业务的发展。

可见,所设计渠道对企业“渠道提供”能力的要求还是很高的。

首先,辨别“渠道提供”内容的差异性。不同类型的渠道对“渠道提供”会有不同的要求。例如,成本驱动型渠道对促销支持有较高的要求;而认知价值驱动型渠道则对服务支持、渠道培训有较高的要求。企业要努力辨别渠道成功所需的关键性提供。

其次,提高“渠道提供”能力。“渠道提供”的能力形成并非一朝一夕之间,在进行渠道设计时,就要对相应的“渠道提供”能力的培养和发展进行规划。要有意识地在企业经营发展之中提高“渠道提供”的能力,特别是对一些关键性要素的提供。

比如,通过给分销商提供最好技术援助而建立持续渠道合作的制造商,有可能确立的核心“渠道

提供”定位是“技术支持型领导”;而通过给分销商提供各种促销活动来建立持续合作优势的制造商,所确立的核心“渠道提供”定位则应该是“促销支持型领导”。

再次,“渠道提供”能力的匹配性。当企业的“渠道提供“能力无法与最佳选择的营销渠道相匹配时,应该转而寻求能与“渠道提供”能力相匹配的渠道类型。

“提供”与需求的匹配性

我们看到,来自企业的“渠道提供”和来自消费者的“消费需求”其实是价值链上不同方向的两种力,共同作用于渠道设计及相关模式选择。那么,我们在实际操作中到底应孰先孰后、孰主孰次?如何协调和平衡呢?

比如,A公司现在准备引进国外一个高档的化妆品品牌。这种高档的化妆品主要来满足某些特定目标消费群体的需求。公司通过对这些目标消费群“消费行为”的具体分析得出结论:该高档化妆品的营销需要的是坠知价值驱动型渠道,应该将“高级百货公司中的专柜销售”设计为优级渠道,“专业的高级美容院及发廊”设计为次优级渠道,“专卖店销售”则为符合级渠道。

接着,该公司要认真考虑自身的“渠道提供”能力,认为自身对渠道支持的专长是“渠道培训”。出于优级渠道——“高级百贷公司中专柜销售”需要高强度的品牌宣传,而这恰恰是A公司的弱项,所以他们最终确定次优级“专业高级美容院及发廊”为主要建设渠道。

从“价值链”视角进行渠道设计,首先要求企业从目标顾客的“消费行为”出发,根据其对营销渠道服务水平的要水,判断产品销售所需营销渠道的驱动类型。同时,将现有或潜在的满足该驱动类型的营销渠道一一罗列出来,按照重要性进行优级、次优级、符合级排序。

其次,要求企业充分考虑自身对营销渠道的“渠道提供”能力。在所确定的优级、次优级、符合级渠道中,选择与企业的“渠道提供”能力相匹配的渠道,即建设自己有能力做好的营销渠道。

当然,这只是一个非常简单的说明。在现实中,营销渠道更为复杂多样,其设计也会受到更多变量的影响。但是无论如何,换个视角,在“消费行为”和“渠道提供”的双向驱动中来进行渠道设计,都更容易揭开渠道的面纱,提高企业的“渠道价值链”效能。

显卡驱动程序设计论文 篇4

一、结合课程教学特点, 明确问题驱动目标

新课程背景下, 高中数学概念课教学活动需要摒弃满堂“灌输”的课堂教学模式, 教师需要结合《普通高中数学课程标准》中的相关教学内容, 明确课堂教学指导目标, 基于高中学生认知能力的数学概念课教学设计, 能够在充分激发学生数学学习兴趣的基础上, 使学生更好的理解数学概念, 为学生数学知识的深入学习奠定良好的基础.

以问导课, 设计驱动教学中, 教师需要可以将三维教学目标融入于其中, 关注学生学习的过程, 关注学生情感的体验. 例如在指导学生学习“曲线与方程”这一项内容中, 教师可以将课堂教学内容划分为四个层次, 其一为指导学生学习并理解曲线方程, 明确曲线方程的概念, 掌握特殊曲线和方程之间的互为表示关系. 其二为指导学生明确求曲线方程的基础步骤, 学会自主解答问题. 其三为通过不同的平面直角坐标系, 对同一曲线方程的影响进行分析, 能够合理建立平面直角坐标系. 其四为能够自主分析一些简单的曲线方程, 学会利用坐标法解答数学问题.

二、灵活设计数学问题, 组织学生合作探究

正所谓“兴趣是最好的老师”, 学生对所学习的数学概念产生兴趣, 便能够积极、主动的参与到课堂探究活动中, 使高中数学概念课教学产生“事半功倍”的教学效果.“以问导课, 设计驱动”问题驱动理念下的高中数学概念课教学设计, 可以结合学生的性格特点, 灵活设计数学问题, 教师可以将学生划分为若干个小组并为学生布置探究任务, 使学生能够通过小组合作探究的方式进行学习, 在营造良好课堂教学氛围的基础上, 也能够有效提升高中数学概念课教学的质量.

教师可以将前后座的4 名学生分为一个小组, 为学生布置各式各样的问题, 引导学生进行合作探究. 例如教师可以结合学生的实际生活提出问题, 如“你想邀请朋友到 × ×餐厅吃饭, 餐厅位置在兴华街北二路左侧20 米, 你该怎样叙述呢?”等问题, 学生可以通过建立直角坐标系的方式进行解答, 用点与坐标的对应关系来研究曲线与方程的关系.

再如教师也可以为学生布置“画出两坐标轴所成角在第一、三象限中的平分线m, 并写出方程; 画出函数y = 2x2 ( - 1≤x≤2) 的图像c”. 教师可以借助多媒体等信息技术软件, 为学生进行图像展示, 并组织学生借助信息技术进行操作或者在组内借助纸笔进行绘制 ( 详见图) . 在学生画完图像之后, 教师可以提出“对照抛物线的一部分C和方程, 如果符合某种条件的集合M与C分别和其他方程之间存在着怎样的联系?”学生可以与小组成员之间可以相互讨论和分析, 得出“如果M ( x0, y0) 是m上的任意一点, 那么它到两个坐标轴的距离是相等的, 即为x0= y0, 它的坐标 ( x0, y0) 即为方程x - y = 0 的解. 但是如果 ( x0, y0) 是方程x - y = 0 的解, 即为 ( x0, y0) , 以此为解的坐标点到两坐标轴的距离相同, 它则在平分线m上, 则可以将直线m和方程x - y = 0 相互联系. ”

三、注重教学语言应用, 培养学生数学思维能力

数学概念教学过程中, 教师需要在指导学生关注概念形成的同时, 指导学生重视知识之间的普遍联系, 培养学生形成一定的数学逻辑思维能力.

多种多样的数学问题有助于学生思维的启发, 在充分调动学生数学概念探究欲望的基础上, 教师可以通过适当的引申, 使学生能够感受到数学概念与数学概念之间的联系, 并能够逐渐形成较为完整的数学知识框架结构.

与此同时, 教师需要特别注重课堂教学中自身教学语言的应用. 相关心理学研究证明, 教师课堂教学中的语言将会直接影响学生的听课质量. 所以在高中数学概念教学活动中, 教师需要密切关注学生的表情变化, 给与学生更多的支持和鼓励, 教师需要多采用“请”、“谢谢”等话语, 尊重学生、关心学生.

结束语

新课程背景下, 高中数学概念课教学活动可以通过结合课程教学特点, 明确问题驱动目标; 灵活设计数学问题, 组织学生合作探究以及注重教学语言应用, 培养学生数学思维能力等方式, 不断提升高中数学课堂教学的质量, 促进学生多元智能的发展.

摘要:基于问题驱动理念下的高中数学概念课教学设计是高中数学教学模式创新的重要表现, 文章主要提出结合课程教学特点, 明确问题驱动目标;灵活设计数学问题, 组织学生合作探究以及注重教学语言应用, 培养学生数学思维能力等相关教学策略, 旨在不断提升高中数学概念课教学质量.

关键词:以问导课,问题驱动理念,高中数学概念课,教学设计

参考文献

[1]尹丽文.问题驱动理念下的高中数学概念课教学设计探析——以《曲线与方程》课为例[J].学周刊, 2013, 14:144-146.

[2]邵敏亚.提出一个问题, 生成一个平台究给出一串问题, 创设“生动”课堂[D].重庆师范大学, 2012.

linux驱动程序实验报告 篇5

院系名称

学生姓名学号专业名称班

级时间

实验报告

****年**月**日 至

月 日

: : : : : :

实验题目 字符设备驱动程序

一、实验目的

通过编写一个简单的C语言字符设备驱动程序,来加深对上次的内存管理实验的复习,以及对本次学习的字符设备驱动的应用。

二、实验内容

编写一个字符设备驱动程序,以内核模块的形式插入内核,编译方法与内核编译方法一致。创建设备节点,然后通过编写一个测试程序,输出“hello world!”。

三、实验步骤

用C语言编写一个字符设备驱动程序;

编译,链接,将程序插入内核模块中;

创建设备节点,编写测试程序,运行输出“hello world”。

四、调试以及运行过程

因为用的是学校的电脑,在运行时,就出现错误。开始是怎么都插不进去模块。最后发现原来是makefile文件开始用小写,后来改成Makefile,,竟然对了。虽然最后显示内核模块插入了,但是无法进行编译,总是显示,无法正常运行。最后,把代码拷进同学电脑里,对了。才发现,有时要相信自己,换一个位置去试,就会发现惊喜。

五、心得体会

对于程序,我们要多练,才能懂得其真正的用处在哪里。没有编写程序运行前只知道一点皮毛,真正操作后才会受益匪浅。通过编写字符设备驱动程序,我知道了当我们不会写代码时,可以先试着把别人的类似代码敲一遍,然后找出那种属于自己的感觉,理解清楚别人的思想,然后根据需要编写属于自己的代码。

六、源代码

1.字符设备驱动程序

#include #include #include #include #include MODULE_LICENSE(“GPL”);MODULE_AUTHOR(“Helight”);//定义主设备号与次设备号

#define DP_MAJOR 250 #define DP_MINOR 0 //定义变量

static int char_read(struct file *filp,char __user *buffer,size_t,loff_t *);static int char_open(struct inode *,struct file *);static int char_write(struct file *filp,const char __user *buffer,size_t ,loff_t*);static int char_release(struct inode *,struct file *);static int chropen;struct cdev *chardev;static int len;//file_operations结构中的每个函数都对应一个具体的功能,也就是对设备的不同操作 static const struct file_operations char_ops = {.read = char_read,.write = char_write,.open = char_open,.release = char_release, };//设备驱动模块加载函数

static int __init char_init(void){ dev_t dev;printk(KERN_ALERT“Initing......n”);dev=MKDEV(DP_MAJOR,DP_MINOR);chardev = cdev_alloc();if(chardev==NULL){ return-1;} if(register_chrdev_region(dev,10,“chardev”)){ printk(KERN_ALERT“Register char dev errorn”);return-1;} chropen=0;len=0;cdev_init(chardev,&char_ops);if(cdev_add(chardev,dev,1)){ printk(KERN_ALERT“Add char dev errorn”);} return 0;} //文件打开函数会在设备结构体指针赋值给私有数据

static int char_open(struct inode *inode,struct file *file){ if(chropen==0)chropen++;Else { printk(KERN_ALERT“Another process open the char devicen”);return-1;} try_module_get(THIS_MODULE);return 0;} //释放函数

static int char_release(struct inode *inode,struct file *file){ chropen--;module_put(THIS_MODULE);return 0;} //读函数

static int char_read(struct file *filp,char __user *buffer,size_t length,loff_t *offset){ if(length<12){ if(!copy_to_user(buffer,“hello world!”,length)){ return 0;} } else { if(!copy_to_user(buffer,“hello world!”,strlen(hello,world!“"))){ return 0;} } return-1;} //写函数

static int char_write(struct file *filp,const char __user *buffer,size_t length,loff_t *offset){ return 0;} //设备驱动模块卸载函数

驱动程序更新与推荐 篇6

Bye bye老显卡,催化剂9.4正式发布

ATi在前不久公布了最新的催化剂驱动程序包,版本号为9.4。这款驱动程序包首次放弃了对DX9显卡的支持,看来是到了和老显卡说再见的时候了。此外,催化剂9.4驱动程序包添加了最新的ATi OverDrive调整程序。不过该版本的ATi OverDrive是“专供”Radeon HD 4000系列显卡的,ATi官方并不建议RadeonHD 3000和Radeon HD 2000系列显卡的用户使用(当然,真要使用也是可以的^_^)!

下载地址:http://www.drivethelife.com/2009/a94x.htm(For WinXP)

http://www.drivethelife.com/2009/a94v.htm(For Vista & Win7)

AMD催化剂9.4相关配套驱动程序合集

新版本的“催化剂”推出后,官方提供新的配套驱动程序合集。大家不妨试试看。

下载地址:h t t p : // s u p p o r t . a m d . c o m / u s / P a g e s /AMDSupportHub.aspx

nVIDIA PhysX物理驱动程序9.04.08版

《雪域危机:沉睡之谜》的“特供”版驱动程序,想玩该游戏的N卡用户千万别错过哦!

下载地址:http://www.drivethelife.com/2009/nvpxv.htm(For Win XP & Vista)

Intel迅驰无线网卡驱动程序12.4.0.21

使用迅驰笔记本电脑的用户,请记得升级哦!这一款最新的驱动程序,能够让你的无线网卡如虎添翼。

下载地址:http://www.drivethelife.com/2009/ilx.htm(For WinXP)http://www.drivethelife.com/2009/ilv.htm(For Vista)

昂达2款MP4播放器固件更新

与电脑硬件不同,数码播放器的固件就是它的驱动程序。笔者在这里提供了两款固件的下载地址,刷新固件之后,可以让你的VX545HD和VX767HD更稳定。

下载地址:http://w w w.drivethelife.com/2009/ov x54.htm(ForVX545HD)

http://www.drivethelife.com/2009/ovx76.htm(For VX767HD)

Intel G41、G43、G45显卡驱动程序15.13.1.1688

该驱动程序主要修正了全屏播放Flash视频时,会导致Flash插件出错,并关闭浏览器的问题。

显卡驱动程序设计论文 篇7

1 液晶显示器

1.1 电子信息技术对于显示器发展的意义

从早期的纸质显示器到现在的3D液晶显示器,经历了时代的变迁和技术的改革。电子信息技术的出现对于多媒体时代的显示器改革具有重要意义,电子信息系统是社会多媒体化出现的基础,多媒体主要需要的技术是数字技术、计算机网络技术以及人机界面技术,主要功能是保证信息的双向传递。液晶显示器的出现加速了多媒体化进程,确保了适应多种多媒体应用需求,并且保证了无论什么时间、什么地点、什么人都可以使用。

1.2 STN LCD显示原理

STN LCD是超扭转式向列场效应的简称,显示原理与TN相似,不同的是,STN LCD对于光线的旋转角度不是90°,而是旋转180°~270°,并且改进了TN技术,通过添加彩色滤光片,使STN LCD可以显示红绿蓝三原色,从而通过其不用配比,可以显示不同色彩效果,使液晶显示屏显示画面变得更加多姿多彩。并且STN LCD对TN LCD的对比度不足问题也进行了改进。

2 STN LCD多行寻址驱动算法分析

2.1 液晶显示及其驱动特点

(1)液晶在显示时间上具有极大优势,可以达到几毫秒至几百毫秒,但是由于在液晶显示屏中,不能保证在电压变化时,液晶分子改变排列形式,所以在液晶显示的响应中,一般采用电压均平方根的平均值来进行比对。

(2)液晶不可以长时间暴露在直流偏压情况下,否则液晶的扭转结构将不可能还原到起始位置,所以,在对液晶两侧电极进行施压时,要确保在每一个电压脉冲的时间内,其平均值为零。

2.2 液晶显示行驱动算法发展

(1)静态驱动法。最初的液晶显示行驱动算法是静态驱动法,这种驱动法主要是对每一个液晶点进行布线工作,并且对每一个布线点进行施压工作,从而进行驱动计算。但是,实现难度较大,并不适用于液晶显示快速发展的今天。

(2)逐行扫描法。由于液晶显示器的响应是与电压均平方根的平均值保持一致的,所以,驱动电极是可以进行时分复用的,这也就促使了逐行扫描法的出现,并且这种算法极大增加了液晶显示器的显示信息容量。

2.3 STN LCD矩阵显示原理

STN LCD是一种被动式矩阵的液晶显示器,在显示过程中,通过把电极排列成矩阵的模式,来进行显示工作。在矩阵中,排列成一行的像素电极被称为行电极,排列成一列的像素电极被称为列电极,在使用中,通过像素的行电极和列电极间的电压变换,就可以对显示屏上的某点像素进行显示。

2.4 多行寻址驱动算法分析

多行寻址驱动算法可以决定驱动波形的矩阵是N×N的单位矩阵,在矩阵中,每一行代表COM电极,每一列代表在等宽时的间隔时常,以一个8×8的矩阵为例,在行电极中,选通用“1”来表示,反之不选通就用“0”来表示。在第一个等宽的时间间隔内,选择第一行的某一个COM电极选通,其他电极不选通,然后在下一个时间间隔内选择第二行的某一个COM电极进行选通,其他不选通,以此规律进行变化,直到在最后一个等宽的时间间隔内,选择最后一行的一个COM电极进行选通,其他进行不选通操作。所以,整个过程就可以用这个8×8的矩阵来进行对应表示。并且在显示数据中用“-1”来表示亮点,用“+1”来表示暗点,以一个行矩阵进行表示,将数据显示行矩阵与数据矩阵相乘,就可以得到列矩阵。具体公式如下:

多行寻址驱动技术的计算是基于上述的矩阵运算规律,并且是一种主动寻址的矩阵运算方式。在多行寻址算法中,会同时选中所有行,并且由于行矩阵中只有“-1”和“+1”两种模式,所以,就可以应用上述原理进行运算,得到相应的列矩阵。并且多行寻址算法将主动寻址技术与逐行扫描技术相结合,减少了主动寻址在显示器尺寸增大后的运算难度,并且提升了驱动运算性能。

在多行寻址的驱动算法中,可以对一个N×M大小的矩阵进行显示,将N行分为S组,并且在一组内进行主动寻址的运算,再对N/S组进行逐一扫描运算,最后将所有组的运算结果相结合,得出最终行和列的不同驱动的波形。

2.5 多行寻址驱动算法优势分析

多行寻址驱动算法对于功耗的消耗相较于其他驱动算法更低,并且由于多行寻址驱动算法是同时选中多行电极的算法,在选通脉冲的时间保持一致的情况下,可以有效缩短选通脉冲之间的时间间隔,在降低选通的脉冲电压上也有很大的作用,从而有效降低了驱动的电量消耗。

3 STN LCD驱动芯片

STN LCD驱动芯片,是CPU和液晶显示器中间的重要媒介,可以依据CPU发出的命令,使显示屏显示不同行列驱动信息,从而使显示器画面出现变化,是整个液晶显示结构中的重点组成部分。其主要是由ASIC设计完成的MPUIF、显示模块以及由非ASIC设计完成的模拟模块共同组成,其中MPUIF以及显示模块功能如下。

3.1 MPUIF模块

MPUIF在驱动芯片中的主要功能是配置控制寄存器、读取驱动芯片内部的寄存器状态,并且满足外部MPU对于芯片的访问需求。驱动芯片中的MPUIF部分要支持多种类型的接口,以确保外部链接的正常。

3.2 显示模块

显示模块主要是为了保证驱动芯片工作中扫描顺序的准确性,并且依据CPU指令进行极性的扭转工作,同时保障驱动芯片中的信号和显示同步。显示模块对于整个STN LCD具有重要意义,确保其设计的先进性,可以更好地扩展STN LCD的应用范围,并且有效降低运行过程中的能量损耗。

4 基于多行寻址技术的驱动控制器显示电路设计

4.1 驱动算法选择

本文主要选择了3线多行寻址驱动算法进行STN LCD驱动控制器的设计,选择3线多行寻址驱动算法的原因主要是:其在降低COM电压上具有很大优势,并且可以有效抑制串扰现象出现。3线多行寻址算法主要运算模式是将N×M的矩阵分为N/3组,然后对每一组进行逐组扫描,从而得出行和列的波形变化。

4.2 矩阵控制电路设计

Walsh作为最常使用的行矩阵,其形式如下:

Walsh行矩阵经过变换矩阵的列向量寻址变化,就可以形成许多衍生矩阵,在没有进行极性的转变时,行矩阵就算变化也不会对显示造成影响,但是,如果在寻址变化时,经过了极性反转,显示就会发生变化,所以,可以通过这种变化来对显示中的正负压电路间的负载进行调节。列向量进行寻址的主要方式有两种,分别如下。

(1)列向量进行寻址反转的最基本方式是,交换Walsh行矩阵中的R2和R3。经过这两个数据的交换,就可以实现寻址的变化,R2、R3对调是通过VEC寄存器进行的,在调换过程中,如定义VEC为0,则列向量的寻址变化方式是由R1开始,经过R2、R3、R4最后返回R1,以此模式进行循环寻址;但是,如果VEC定义为1,则在寻址中以从R1开始,经过R3后,再经过R2、R4,之后回归R1的模式进行循环寻址工作。

(2)另一种寻址的方式是通过单元递增的方式进行寻址工作,主要是通过INC寄存器完成单元递增寻址工作,在实际应用中,如果设定INC为0,则列向量在寻址的过程中按照每一个子块进行递增寻址;如果设定INC为1,则按照每一个子帧进行递增寻址。并且在INC和VEC变换同时存在时,要先进行VEC的寻址,之后在进行INC的寻址。

4.3 COM时序设计

COM时序在设计时要依据显示的不同要求进行不同设计方案的选择,在3线多行寻址驱动算法中,COM时序扫描主要是以每一块为基础进行工作。在设计中主要从RAM的芯片管脚入手,可以通过改变RAM映射的地址来实现COM时序设计,也可以通过改变RAM芯片管脚映射的地址来进行COM时序设计。

4.4 极性反转设计

如果想要增加STN LCD的使用寿命,就要定期对显示电路进行极性反转。主要原因是对于STN LCD的模组来说,如果长时间保持两端电压方向一致,很可能给STN LCD模组造成很大负担,使模组提前出现老化现象。所以,在显示电路中要重视极性反转的设计,针对液晶显示器的液晶不同,确定反转周期,可以直接对行电压极性取反来实现极性的反转,并且通过寄存器来进行反转周期的设定。

5 结语

随着液晶显示技术的发展,其在各行业的应用比例越来越高,在汽车、电梯、电脑、手机等的应用效果也越来越好,多媒体的环境实现了液晶显示技术的应用,液晶显示技术也使得多媒体时代更好发展。在液晶显示屏的使用中,以TFT LCD(薄膜晶体管液晶显示器)的使用居多,但是,STN LCD的价格经济,能源消耗更低,所以,在电子通信设备中的应用优势也极其明显。相信随着电子信息技术的进步,驱动控制器设计技术的更新换代,STN LCD的应用会越来越广泛。

参考文献

[1]李永忠,纪伟丰,周炎宏.STN LCD残影显示的原理分析及实验研究[J].液晶与显示,2011(6):733-740.

LED驱动电源设计 篇8

1 LED驱动电源结构

LED驱动电源可以对电压进行调整, 确保LED灯内为直流低电压。LED驱动电源能够满足当前的电气需求,可以确保LED灯达到最理想的发光效果,降低可能出现的电网污染及电网影响,提升光源的质量。

1.1 LED驱动电源的结构选取

LED驱动电源主要包括交流供电方式与直流供电方式两种。直流供电LED驱动电源主要是电池、电瓶等,该电源在设计的过程中主要是依照直流电源特征选取的拓扑及控制结构为恒流电源。交流供电LED驱动电源主要是将交流电源转换成LED需要的直流电源,具有非常高的稳定性、安全性,可以明显提升电源的使用效率及使用质量。

1.2 PFC电路拓扑及控制方式

PFC指功率因数校正。该电路拓扑结构在使用的过程中要对储能元件进行合理应用, 通过对其自身的大电容及电感进行合理设置,加强对谐波的抑制效果。该种方法在使用的过程中要对有源开关及AC/DC整流电路正弦波状况进行控制,减少谐波成分。PFC电路拓扑在使用的过程中主要是输出稳定的直流电压,提升了变换器之后的变换效率。PFC装置在使用的过程中具有非常小的体积,控制精度较高。但是该种方法在使用的过程中无法适用于大功率场合。当前PFC电路拓扑主要包括以下几种变换器结构。

2开关电源原理

2.1 DC-DC转换电路拓扑结构及原理

当前DC-DC转换电路拓扑结构主要包括升压、降压及升降压三种变换器形式,可以依照电路要求及实际应用完成调节控制。

降压变换器又被成为三端开关型降压稳压器,主要通过串联方式进行开关电路控制,由晶体管与直流电源串联形成的稳定电源。升压型变换器又被成为三端开关型升压稳压器,主要是通过并联方式进行开关电路控制,由晶体管及电源之间并联形成的稳定电源。该变压器升降压型变换器是由升压型变压器与降压型变压器联合简化形成,可以有效改善当前电压电源稳定状况。该变换器在使用的过程中需要对二极管连接方式进行正反向转变,因此又被称为反号变换器。

2.2变换器工作原理

降压变换器在使用的过程中主要依照开关对控制模块、振荡器信号进行控制,完成开关导通及闭合控制。当基准电容电压达到规定值时,开关触发振荡器电路,完成导通操作。当电流达到峰值是完成触发动作,保持晶体开关管处于断开状态,完成降压变换操作。升压变换器在使用的过程中与降压变换器主体一致,也是依照上述原理完成控制操作。但是在该控制的过程中当电流达到峰值是要启动比较器电路,保证晶体管开关处于闭合状态。

升降压变换器控制模块可以明显加强导通控制。上述控制过程中,触发振荡器可以明显将电路启动进行合理控制,完成开关管导通信号传输。当达到峰值定值时,升降压变换器可以触发比较器电路, 完成晶体管的闭合控制,达到对脉宽调制控制功能。

3电路结构设计

3.1主电路结构

3.1.1开关电源

开关电源设计要对开关二极管、有源开关、电感、电容器进行合理使用。主电路电源设计时要合理应用半桥式转换器、单端正激式变换器等装置,依照设计要求选取主要原器件,通过脉冲宽度频率调制、 脉冲频率调制或脉冲宽度调制完成脉冲频率的调制及控制。

3.1.2反激电路

反激电路在设计的过程中要对电网中的输入电流进行控制,要对直流电压及电路保护形式进行全面分析。当前反激式电路主要包括幵关频率振荡电路、脉宽调制电路、驱动电路、比较放大电路、过压保护电路几部分。主要通过降低输出电压、 导通时间、高输出端口电压等控制因素或操作,完成储能补偿。

3.2电感、电容的计算值

在对电感、电容进行计算处理的过程中要对核心电路进行明确,依照电感线圈及电容状况,对电流比率及平滑直流回路电流状况进行明确。计算数据中显示但电感值越大,控制效果越好。

当电流在持续状态下为电感临界值时,设电网电压经过整流电路后电压在270~340V范围内,当输出电压最低为270V时,电感为7.59m H,电容为6.2u F。

4控制电路设计

电流反馈、电压反馈、PMN反馈及输出电压组成是当前控制电路的主要组成部分。上述内容在应用的过程中主要是通过对脉宽调节控制实现电压调节。其主要控制结构见图2

控制电路在设计的过程中要对以下几方面功能进行完善。第一,对控制电路进行设计,提升电压可控制输出效果。电路工作过程中要调节两个晶体管驱动脉冲宽度一致,保证正向与反向磁通量相同,防止产生偏离现象。要对限制脉冲宽度即软起动周期变化进行控制,降低直通。第二,要对输入信号及输出信号进行隔离,确保电压稳定性,完成各项电路的主体控制效果。

5总结

显卡驱动程序设计论文 篇9

USB协议是1994年底由康柏、IBM、英特尔等几家公司联合提出来的外部总线接口协议。USB就是英文中Universal Serial Bus (通用串行总线) 的缩写。USB总线具有其他总线所不具备的如:热插拔、数据传输可靠、扩展方便、成本低等一系列特点, 因此在嵌入式系统中被广泛使用。

一个USB系统一般是由一个USB主机控制器、一个或多个USB集线器和一个或多个USB设备节点组成。USB系统的物理连接具有层次性。USB总线连接USB设备和USB主机, 是一种星型拓扑结构。USB的拓扑结构如图1所示。

在一个USB系统传输数据的过程中有两个非常重要的概念, 就是USB传输模式和USB描述符。USB传输模式是指USB设备传输数据的形式。USB设备支持四种传输模式:控制传输模式、同步传输模式、中断传输模式和批量传输模式。控制传输模式是用来处理USB主端口到USB从端口的数据传输, 主要是设备控制指令、设备查询状态指令和确认指令。同步传输模式是指传输和时间关系密切的信息所使用的一种传输方式, 是一种周期的、连续的单向传输方式。中断传输模式这类传输模式主要用于传输非周期性的、自然发生的、数据量很小的信息, 这类数据传输的方向是从设备到主机, 适用于键盘、鼠标、操纵杆等设备上。最后一种是批量传输模式, 该模式适用于大量的、对时间没有要求的数据传输, 如U盘或者移动硬盘等设备。

USB设备在逻辑上分为几个层次, 分别是设备层 (Device) 、配置层 (Config) 、接口层 (Interface) 、端点层 (Endpoint) 。各个层次都有与之相对的描述符, 分别是设备描述符、配置描述符、接口描述符和端点描述符。

2 Linux下的USB驱动框架

USB设备的设备描述符在Linux系统中用usb_device_descriptor结构体表示, 它描述了USB设备的一般信息。配置描述符用usb_config_descriptor结构体表示, 它给出了USB设备的配置信息。接口驱动程序是在一个配置内给出一个接口信息, 它在Linux中由usb_interface_descriptor结构体表示。端口描述符被主机用来决定每个端口的带宽需求, 它在Linux系统中由usb_endpoint_descriptor结构体表示。

编写一个USB驱动程序, 是从usb_drive结构体开始的。Linux中模块加载函数调用usb_register () 和usb_unregister () 从而对usb_driver结构体进行加载与卸载。如果某个设备信息与该驱动中usb_device_id usb_mouse_id_table结构体的信息相一致, 则会调用usb_driver中探测成员函数probe () , 将初始化USB断点信息, 并对设备做一些初始化工作, 分配urb结构体, 准备数据传输。其urb处理大致框架结构如图2所示。

当鼠标设备在用户空间打开时, 将提交probe函数构建的urb请求块, urb将开始为传送数据而忙碌了。urb请求块就像一个装东西的“袋子”, USB驱动程序把“空袋子”提交给USB core, 然后再交给主控制器, 主控制器把数据放入这个“袋子”后再将装满数据的“袋子”通过USB core交还给USB驱动程序, 这样一次数据传输就完成了。

3 结束语

由于USB简单方便快捷等优点, 许多外接设备会越来越青睐USB接口, 这是一种发展的趋势。Linux系统具有开源、安全等特性, 用户也在急剧增加。届时, 会有越来越多的USB驱动加入Linux内核之中。

摘要:在现代生活中, 由于USB接口方便快捷, 人们对USB设备的依赖感也越来越强。许多操作系统中也都包含了大量USB设备驱动。Linux系统几乎支持各种各样的USB设备, 包括鼠标、键盘、摄像头、游戏杆等各种各样的USB设备。在主机控制器方面, Linux内核不仅支持USB1.1协议的UHCI与OHCI, 还支持USB2.0协议的EHCI。本文详细的描述了USB设备的框架结构以及Linux系统下的USB驱动的框架结构。

关键词:USB,设备驱动,Linux

参考文献

[1]Jonathan Corbet, Alessandro Rubini, Greg Kroah-Hartman等.LINUX设备驱动程序[M].北京:中国电力出版社, 2006.

[2]Universal Serial Bus Specification Compaq, Intel, Mi—crosoft, NEC Revision 1.1.September 23, 1998.

[3]温卡特斯瓦兰.精通Linux驱动程序开发[M].北京:人民邮电出版, 2009.

USB设备接口驱动程序设计开发 篇10

1芯片概述

接口芯片与上位机通信并提供对外围CPU接口, 使得开发者无须去关心复杂的USB协议。 根据所设计产品的需求, 选择CYPRESS半导体公司的CY7C63001A USB控制器作为接口芯片。 CY7C63001A是符合低速USB低成本的一种解决方案, 它支持2个端点和1个设备地址。 CY7C63001A是一个高性能的8位RISC微控制器, 具有128字节的片内RAM, 4K字节的EPROM。 有12个通用I/O引脚[2]。

2硬件设计

该USB设备的硬件设计以CY7C63001A芯片为中心, 所连接的存储器是ATMEL公司的AT24C02, 接口兼容I2C总线规范, 通过一对串行时钟、 数据线对片内存储单元进行读写。 其电路原理图如图1所示。 按照USB规范的要求, 将微控制器第13引脚 (D-) 通过一个7.5K上拉电阻 连接到+5V的VBUS。 微控制器 第5引脚 ( P1.0) 连接24C02的第7脚 (WP, 写保护 ) , 控制24C02的写操作功能 。 WP为高电平读取24C02的内容; WP为低电平时可进行读、 写操作。 微控制器第1脚 (P0.0) 连接24C02的第6脚 (SCL, 串行时钟),为控制24C02的读写操 作提供时 钟 ; 微控制器 的第2脚 (P0.1) 接24C02的第5脚 (SDA, 串行数据 、 地址 ), 作为读写24C02的数据、 地址信号线。 微控制器通过这3根信号线完成对24C02的读写操作。

3编写驱动程序

系统内核与硬件之间设备通信要通过驱动程序, 它屏蔽了应用程序与硬件之间的细节。 Linux设备驱动分为3类: 字符设备、 网络设备与块设备。 USB设备一般都作为字符设备来进行处理, 这是是通过串行通信来读写数据, 在此所编写驱动即为字符设备驱动。 下面则结合该设备代码来介绍Linux下USB驱动的开发。

3.1注册与注销驱动

Linux下USB驱动程序在USB子系统里注册并提供一些信息。

这是USB驱动框架数据结构。 name是驱动程序模块的名字。 probe函数是在驱动向USB系统注册后当插入一个USB设备时将自动处理的函数。 disconnect函数在拔掉设备后自动运行。 fops是驱动提供的文件操作的接口结构, 通过这样注册一个file_operations函数指针, 使得可与用户空间实现方便的交互。

USB驱动程序初始化模块函数中通过调用usb_register进行注册, 传入刚才定义的驱动框架结构。

相应地在卸载模块函数中通过调用usb_unregister函数注销USB子系统。

在probe函数中, 驱动程序通常首先确认插入的设备是否可被接受, 即USB硬件的厂商号和设备号是否和驱动相匹配, 若相符则在devfs子系统中注册设备, 允许devfs用户通过fops定义的文件操作接口来访问该设备。

当拔掉USB设备时, 会调用disconnect函数, 驱动程序需要从devfs上注销。

3.2数据处理函数

当USB驱动与设备绑定好后, 任何用户 通过file_operations结构所定义的函数即可操作此设备 。

首先, open设备后即可对设备进行操作。 MODULE_INC_ USE_COUNT宏在open函数中起到计数的作用 , 计数器在用户态程序打开一个设备后就加1。 若以模块方式加入一个驱动且计数器不为零, 则说明该驱动属于使用状态, 是不可以通过rmmod命令卸载驱动模块的。

当open完设备完成后, read、 write函数就可以发送和接收数据了。

在usb_read函数中 , 我们采用 中断方式 传输 , 用FILL_INT_URB宏建立一个urb, 调用usb_submit_urb函数来提交urb。

由于设备没有中断OUT端点, 因此需要采用Set_Repor标准请求来从主机接收数据。 所以write函数没有用urb传送数据, 而是用usb_set_report函数代替, 这个函数可以发送数据给设备, 并且不需要创建urb和操作urb函数。

4结语

USB设备由于其低价和高性能 , 在近几年内得到迅速的普及。 采用CY7C63001A开发出的低速通信设备, 满足了价格和性能这两方面的要求。 已投放市场经过了实际的 检验 , 证实了该系统设计方案的可行性。

参考文献

[1]杨辉,等.数字化教学资源保护系统的设计[J].山东水利职业学院院刊,2006,(3).

[2]徐增祥.USB软件狗的设计及反破解技术[J].电子技术应用,2012,(8).

[3]罗予东.一种USB软件狗的设计及防解密研究[J].计算机时代,2009,(8).

显卡驱动程序设计论文 篇11

据SolidWorks大中国区总经理吴俊杰介绍,SolidWorks 2012 在成型过程中汇集了众多优点,比如通过在装配和绘图功能、内置仿真、设计成本计算、布线、图像和动画创作以及产品数据管理等方面进行各种改进,为设计团队的日常工作提供积极帮助。

“我们的设计原则是软件必须为用户服务,而不是倒过来,因此我们在整个软件开发的过程中始终倾听用户的声音。SolidWorks中90%以上的功能都是直接来自用户的需求。”DS SolidWorks首席执行官Bertrand Sicot在演讲中表示,“同时,所有的插件也都保持同样的风格和用户体验,以尽量简化软件的学习成本。”

SolidWorks 2012 中新增的功能包括成本计算工具、大型设计审阅、搜索、运动优化、可持续性管理以及与企业PDM数据的集成等。另外,还有200 多项功能增强,这些新增和改进的功能能大幅提高创新和设计团队的效率。比如,帮助设计人员使最常使用的设计功能实现自动化;为更精简的工作流程提高性能和质量;从根本上改变产品开发过程以加快产品设计;为协作和团队合作提供扩展支持,以提高创造力和效率。

显卡驱动程序设计论文 篇12

随着电子技术的快速发展, 特别是大规模集成电路的产生而出现的微型机, 使现代科学研究得到了质的飞跃, 而嵌入式微控制器技术的出现则是给现代工业控制领域带来了一次新的技术革命。嵌入式Linux 在近几年发展迅速, 它没有昂贵的版权费, 完全开放源代码, 具有可裁减性与可移植性, 是开发嵌入式产品的优秀操作系统平台。设备驱动程序是Linux内核的重要组成部分, 运行在Linux内核底层, 在内核源代码中占有很大比例, 驱动程序开发逐渐成为嵌入式软件开发中一项重要的工作。应项目设计的需要, 我们完成了嵌入式Linux下的信号发生模块的驱动程序设计。

2 Linux下设备驱动程序

驱动程序从字面上可以理解为一类程序, 这类程序的目的一般是驱动硬件正常工作, 所以通常所说的驱动程序都是针对特定的硬件来编写的。Linux设备驱动程序是为特定的硬件提供给用户程序的一组标准化接口, 它隐藏了设备工作的细节。设备驱动程序从总体上看分为两部分:驱动程序与操作系统内核的接口、驱动程序与设备的接口。其代码结构大致可以分为如下几个部分:驱动程序的注册与注销、设备的打开与释放、设备的读写操作、设备的控制操作、设备的中断和轮询处理。Linux系统中, 用户对设备的操作需要Linux系统中虚拟文件系统的支持, 用户采用标准的文件操作访问设备, 虚拟文件系统将用户的这种文件访问转化成对驱动程序的调用。为了实现这种用户文件操作到设备操作的转换, 虚拟文件系统为设备驱动提供了一个标准化的文件操作实现接口, 并由file_operations结构定义。

Linux系统的设备分为三种类型, 即字符设备、块设备和网络设备。本文所介绍的信号发生模块驱动属于字符型设备驱动程序。在对字符设备发出读、写请求时, 实际的硬件I/O一般就紧接着发生了。应用程序可以用与存取文件相同的系统调用来打开、读写及关闭。字符设备驱动程序一般要包含open、close、read、write等几个系统调用。

Linux下, 设备文件使用主设备号和次设备号来标识。主设备号指明对应哪些设备驱动, 次设备号区分被一个设备驱动控制下的某个独立的设备。在启动设备驱动程序之前, 需要先注册到内核上, Linux下注册设备驱动程序就是在内核上注册file_operations结构体的变量。为了在内核上注册或注销file_operations结构体, 一般使用下面两个函数。注册函数定义为:

类似地, 字符设备注销函数定义为:

int unregister_chrdev (unsigned int major, const char *name)

其中, major是主设备号, name是设备名称, 设备是以文件的形式存在的, 设备注册时需要使用文件结构struct file_operations定义。

3 信号发生模块驱动程序设计

3.1 信号发生模块硬件电路

信号发生模块的核心器件是12位四路电压输出数模转换器DAC7725U。在计算机的测控系统中, 常要用到模拟输出, 数模转换器 (DAC) 就是一种将数字信号转换成模拟电信号的器件。DAC根据输入数据的格式一般分为并行和串行两种, 并行的DAC通常有8位、10位、12位和16位等。DAC7725U为并行的12位数模转换器, 输出电压范围为-10~+10 V, 可输出四路电压。它还支持双缓冲数据输入, 使数据输入更加快速。DAC7725U的运行是由主处理器OMAP-L137控制的, 它们之间的电路连接关系如图1所示。

在项目设计里需要产生一个能让整个系统稳定有序运行的控制信号, 这就需要由信号发生模块驱动程序来实现。当核心处理器OMAP-L137收到一个由键盘模块发送来的开始命令后, 系统软件会自动做出反应, 启动系统内的一个信号发生程序。该程序完成一系列必要的初始化动作后, 通过调用DAC7725U驱动的相关操作, 使DAC7725U芯片输出一个方波, 该方波的占空比和幅度都可通过应用程序根据算法需求加以控制调节。

3.2 信号发生模块驱动程序的设计与实现

信号发生电路主要是由数模转换芯片DAC7725U发出模拟信号, 控制激光器按照一定规律工作。因此, 要控制信号发生电路, 其实就是控制DAC7725U芯片。本驱动的功能就是要实现OMAP-L137主处理器对DAC7725U芯片的基本控制并为上层应用程序提供接口。

3.2.1 信号发生模块驱动程序的文件操作

在信号发生模块的驱动程序里, 对struct file_operation结构声明如下所示:

3.2.2 信号发生模块驱动程序的加载

驱动程序的加载方式有两种:一种是将其作为内核的一部分, 直接编译到内核中, 即静态编译;另外一种是单独作为一个模块编译, 在需要时再动态地把它加载入内核, 不需要时从内核中删除, 即动态连接。在这里我们采用加载模块的方式进行。

信号发生模块驱动程序的模块加载功能由模块加载函数和模块卸载函数来完成, 其中模块加载函数负责调用SM_init () 函数, 并根据返回值判断调用情况, 模块卸载函数则负责卸载信号发生模块的驱动程序, 并使D/A转换器输出最小值。代码如下:

SM_init () 在模块加载函数中被调用, 该函数主要完成信号发生模块驱动程序的系统注册、设备号申请、文件操作结构声明等工作。此外, 它还通过ioremap () 函数实现I/O地址的映射, 使嵌入式处理器可以方便地控制D/A转换器。

3.2.3 信号发生模块的写模块

由于信号发生模块的输入数据是从嵌入式处理器一端取得, 经过转换后输出模拟信号, 所以对应的驱动程序仅需实现写函数, 将需要转换的数字信号 (二进制码) 传入D/A转换器中。

3.2.4 信号发生模块的打开、退出模块

信号发生模块的打开、退出模块用于打开和关闭驱动程序。SM_open所做的工作非常简单, 就是增加模块使用的计数值;当调用信号发生模块的关闭函数时, 驱动程序向D/A转换设备发送数据0x0000, 使D/A转换输出最小值零, 并将模块使用计数值减一, 表明使用结束。

4 信号发生模块的测试程序设计

信号发生模块的驱动程序就是让嵌入式处理器将数字信号按照一定的时序规律发送给D/A转换器, 并得到正确的数/模转换结果。为了检验驱动程序的正确性, 就需要设计相应的测试程序。信号发生器的转换中经常使用方波信号和正弦波信号, 由于在工程项目中, 需要输出方波信号, 在本文中就以输出方波信号作为例子。其流程如图2所示:

其中, main () 函数首先调用open () 函数, 完成设备文件的打开, 然后调用信号发生模块的功能函数, 来完成用户期望D/A的操作, 在完成D/A转换功能后, 程序再返回该主函数关闭设备文件;功能函数sm_func () 是完成对方波生成函数的调用;功能打印函数主要负责实现人机交互功能, 通过打印功能选择界面, 让用户根据自己的实际需求选择D/A转换操作, 并调用对应的D/A转换函数;方波生成函数先定义方波信号的高电平二进制码0xfffe, 然后将该数字信号写入信号发生模块, 延时一段时间后, 定义方波信号的低电平0x0000, 再将数字信号写入信号发生模块, 周期性地重复此过程就可以在模拟输出端得到方波信号, 其代码如下:

运行测试程序, 连接示波器到信号发生电路的输出端, 可以看到所要求的方波波形 (如图3所示) , 通过结果分析, 完成了信号发生模块驱动程序的设计要求。

5 结束语

在编写完驱动程序后, 我们将该驱动程序以加载模块的方式进行编译, 在检查相关硬件完好后, 正确连接相关器件, 将编译好的信号发生模块的设备驱动下载到目标板上, 通过测试设备驱动的应用程序, 实现了设备的打开、关闭、内存映射和写等具体的操作。通过本次驱动程序的设计与实现, 完成了信号发生模块的输出, 编译此程序后在目标板上运行, 在示波器上显示输出了所需要的方波波形。这就完成了驱动程序的设计要求, 为接下来的开发奠定了基础。

通过本文, 我们了解了嵌入式Linux下的设备驱动程序设计的基本框架和步骤, 并学习了信号发生模块的设备驱动在Linux内核中的具体实现, 通过分析Linux下信号发生模块的驱动程序的设计与测试, 我们可以对Linux的驱动程序的结构、编写以及测试有一定的了解, 为以后更进一步地学习奠定了基础。

参考文献

[1]李亚峰, 欧文盛.ARM嵌入式Linux系统开发从入门到精通[M].北京:清华大学出版社, 2007.

[2]李新峰, 何广生, 赵秀文.基于ARM9的嵌入式Linux开发技术[M].北京:电子工业出版社, 2008.

[3]孙天泽, 袁文菊.嵌入式设计及Linux驱动开发指南[M].第2版.北京:电子工业出版社, 2007.

[4]冯国进.嵌入式Linux驱动程序设计从入门到精通[M].北京:清华大学出版社, 2008.

上一篇:低渗透裂缝性油藏下一篇:生物开放性实验教学