VxBus簡介
VxBus是指在VxWorks中用於支持設備驅動的特有的架構,這種架構包含對minimal BSP的支持。
它包括以下功能:①允許設備驅動匹配對應設備;②提供驅動程序訪問硬件的機制;③軟件其他部分訪問設備功能;④在VxWorks系統中,實現設備驅動的模塊化。
VxBus在總線控制器驅動程序服務的支持下,能在總線上發現設備,並執行一些初始化工作,使驅動與硬件設備之間正常的通訊。
OCAL 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();這個函數完成的工作就是創建所有的設備驅動,通過閱讀源碼就可以知道,其實僅僅是創建了設備節點而已。
後續會繼續更新相關細節。