1、Introduction

本章讨论和基于VxBus驱动程序模型的VxWorks设备驱动程序的相关核心概念,并特别剖析了VxBus设备驱动程序框架,主要包括以下信息:

  • 设备驱动程序相关的文件和目录结构
  • VxBus方法
  • VxBus设备驱动程序的生命周期

除此之外,本章还包括了在SMP环境下开发设备驱动程序的guidline。本章解释的一些概念通常适用于所有的Device-Specific Driver。

2、驱动程序类别

关于设备和管理设备的驱动程序最基本的信息就是:这个设备有哪些功能。不同设备可以执行不同的任务,有用于读写磁盘或者其他不易失数据存储器的设备,有用于打印文本或者图形到视频显示器的设备,也有其他用于控制机器人手臂等用途的设备。

对于每一种功能,可能会有多种设备能够实现这一的功能,比如在显示器上显示信息这个功能,显示控制器可以是VGA,也可以是PCIe总线上的有几MRAM buffers的现代显示控制器。但是,不管是哪一种设备,其潜在的目的都是一样的。但是由于功能的相似性,设备驱动程序可以根据设备执行的任务来分为几类,以下是风河公司定义的几种设备驱动程序类别。

2.1 串行设备驱动程序

串行设备驱动程序管理面向终端和使用串行接口(RS232,RS422)的设备,这些设备都被连接到VxWorks的IO系统,并可以在控制台中进行配置,软件可以使用open,read,write,ioctl,close等标准接口来访问这些设备,在VxBus的框架下,串行设备驱动程序的安装目录在:

installDir/vxworks-6.x/target/src/hwif/sio

2.2 存储设备驱动程序

存储设备驱动程序当然是管理那些面向磁盘、磁带、移动闪存和在板闪存的接口,这些设备的一些通用特性有:

本文根据VxWorks系统启动的流程,分文件来梳理了启动过程中执行的函数,对了解VxWorks的启动流程有比较大的帮助。

一、romInit.s -> romInit()

/* romInit - entry point for VxWorks in ROM */

1. initialize CPU and memory

2. copy bootrom to ROM_TEXT_ADRS

3. initialize STACK

4. lock INTERRUPT

5. jump to romStart()

二、romStart.c->romStart()

/* this is the first C code after reset */

1. clear memory

2. copy vxWorks ROM image to RAM

3. uncompress if necessary

4. jump to the object code ENTRY after uncompress

  • usrEntry - entry point for vxWorks_romCompress, vxWorks_rom and bootrom
  • sysInit() for vxWorks in RAM(Uncompress)

三、sysALib.s->sysInit()

概述:

本文简单介绍PowerPC MPC8247的VxWorks软件使用方法

Bootloader:

MPC8247上使用的Bootloader是u-boot,基本操作如下:

1:启动

PowerPC MPC8247 uboot

从启动画面可以看出:

u-boot的版本是1.1.1

CPU工作在400MHz的频率

Flash的大小是16M

2:设置环境变量

VxBus是风河公司新的设备驱动程序架构,是VxWorks新增的特性,它是在VxWorks6.2及以后版本被增加到VxWorks中的。本文结合基于PCI2040数据采集卡驱动的开发过程,分析了VxBus架构下驱动的设计实现。

VxBus简介

VxBus是指在VxWorks中用于支持设备驱动的特有的架构,这种架构包含对minimal BSP的支持。它包括以下功能:

  • 允许设备驱动匹配对应设备;
  • 提供驱动程序访问硬件的机制;
  • 软件其他部分访问设备功能;
  • 在VxWorks系统中,实现设备驱动的模块化。

VxBus在总线控制器驱动程序服务的支持下,能在总线上发现设备,并执行一些初始化工作,使驱动与硬件设备之间正常的通讯。

VxWorks VxBus Demonstration

图1是VxBus 在整个系统中的位置示意图。从图1中可以看到,VxBus起到了辅助总线的作用,提供了对总线控制驱动的支持。

在VxWorks6.2版本发布前,设备驱动并不能被集成到VxWorks工程配置当中,为了添加或移出设备驱动,需要有丰富的BSP和驱动开发相关的知识。作为VxWorks系统组件的一部分,VxBus消除了上面遇到的一些难题,各种驱动和支持组件的添加与删除完全可以在Workbench工程中进行,不需要BSP和驱动相关的知识,也不会在添加或者删除驱动时增加管理VxWorks工程的额外工作。

vxBus下对设备管理做了更为详细的划分,简单说来,硬件称为device,软件叫做driver。如果一个device出现在硬件列表中,启动时需要到driver的队列中去找相应的driver,如果找到,二者结合成一个instance,否则在vxBusShow里可以看到一个orphan。使用vxBusShow可以比较清晰的看到driver列表和device列表以及orphan列表。

如果需要增加一个设备,首先要修改的是hcfDeviceList,这是hwconf.c中的一个数组,这个数组中列有本系统中所有需要初始化的硬件设备。例如:

下面是VxWorks for PowerPC的内存分配图

VxWorks RAM

专业术语解释:

  • Interrupt Vector Table. Table of exception/interrupt vectors.
  • SM Anchor. Anchor for the shared memory network and VxMP shared memory objects(if there is shared memory on the board).
  • Boot Line. ASCII string of boot parameters.
  • Exception Message. ASCII string of the fatal exception message.
  • Initial Stack. Initial stack for usrInit(), until usrRoot() is allocated a stack.
  • System Image. The VxWorks system image itself(three sections: text, data, and bss). The entry point for VxWorks is at the start of this region, which is BSP dependent(see BSP-specific documentation).
  • Host Memory Pool. Memory allocated by host tools. The size depends on the macro
  • WDB_POOL_SIZE. Modify WDB_POOL_SIZE under INCLUDE_WDB.
  • Interrupt Stack. Size is defined by ISR_STACK_SIZE under INCLUDE_KERNEL. Location depends on system image size.
  • System Memory Pool. Size depends on the size of the system image. The sysMemTop() routine returns the address of the end of the free memory pool.

PowerPC体系结构的内存结构包括5大部分,分别为系统映像(System Image)之前的系统启动相关的低端内存,系统映像,Host Memory Pool,中断堆栈以及系统内存池(System Memory Pool)。下面就各部分进行介绍。