VxBus设备驱动模型

VxBus简介

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

它包括以下功能:

  • ①允许设备驱动匹配对应设备;
  • ②提供驱动程序访问硬件的机制;
  • ③软件其他部分访问设备功能;
  • ④在VxWorks系统中,实现设备驱动的模块化。
  • VxBus在总线控制器驱动程序服务的支持下,能在总线上发现设备,并执行一些初始化工作,使驱动与硬件设备之间正常的通讯。

    
    LOCAL struct vxbPlbRegister windmlGraphicsPlbDevRegistration =  
    {  
    {  
    NULL,                 /* register next driver */  
    VXB_DEVID_BUSCTRL,    /* bus controller */  
    VXB_BUSID_PLB,        /* bus id - PCI Bus Type */  
    VXB_VER_4_0_0,        /* vxBus version Id */  
    "graphics",           /* drv name */  
    &windmlvxbFuncs,      /* pDrvBusFuncs */  
    NULL,                 /* pMethods */  
    windmlGraphicsProbe,  /* probe routine */  
    NULL                  /* vxbParams */  
    }  
    };  
      
    LOCAL struct vxbPciRegister windmlGraphicsPciDevRegistration =  
    {  
    /* b */  
    {  
    (DRIVER_REGISTRATION *)(&windmlGraphicsPlbDevRegistration),                 /* pNext */  
    VXB_DEVID_DEVICE,     /* devID */  
    VXB_BUSID_PCI,        /* busID = PCI */  
    VXB_VER_4_0_0,        /* vxbVersion */  
    "graphics",           /* drvName */  
    &windmlvxbFuncs,      /* pDrvBusFuncs */  
    NULL,                 /* pMethods */  
    windmlGraphicsProbe,  /* devProbe */  
    NULL,  
    },  
    NELEMENTS(windmlPciDevIDList),  
    &windmlPciDevIDList[0],  
    };  
    
    

    这个结构就是用于描述一个需要注册的驱动。驱动的初始化的入口函数都需要放在windmlvxbFuncs中。

      
    //通过这个数据结构,可以向系统注册一些设备初始化函数  
    LOCAL struct drvBusFuncs windmlvxbFuncs =  
    {  
    windmlStub,       /* devInstanceInit */  
    windmlStub,       /* devInstanceInit2 */  
    windmlStub        /* devConnect */  
    };
    
    

    上述代码中把这些函数都设置为了空。这里对三个初始化阶段函数简单介绍一下。devInstanceInit是在vxworks内核启动之前预初始化时调用,完成的主要是关闭设备的中断。然后内核启动初始化,调用init2,这时候就会完成设备驱动内存的初始化,如果驱动初始过程需要使用内核的一些基础设施,那么都可以放到这时候。devInstanceConnect用于设备的连接,通常可以不使用,但如果它依赖于其他设备,则可以把启动代码放在这里。

    另外,还需要注意到的一个就是windmlGraphicsProbe,这是一个设备探测函数,用于探测所有驱动所驱动的设备,并加入到设备列表中。

    windmlGraphicsPciDevRegistration 是通过usrWindMlInit中的vxbDevRegister函数,完成每个被wind media所支持的设备类型的驱动注册。

      
    vxbDevRegister((struct vxbDevRegInfo *)&windmlGraphicsPciDevRegistration);  
    vxbDevRegister((struct vxbDevRegInfo *)&windmlKeyboardDevRegistration);  
    vxbDevRegister((struct vxbDevRegInfo *)&windmlMouseDevRegistration);  
    vxbDevRegister((struct vxbDevRegInfo *)&windmlAudioPciDevRegistration);  
    
    

    然后调用uglODrvInit();这个函数完成的工作就是创建所有的设备驱动,通过阅读源码就可以知道,其实仅仅是创建了设备节点而已。

下一篇
« Prev Post
上一篇
Next Post »