VxBus設備驅動模型

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();這個函數完成的工作就是創建所有的設備驅動,通過閱讀源碼就可以知道,其實僅僅是創建了設備節點而已。

後續會繼續更新相關細節。

發佈了77 篇原創文章 · 獲贊 23 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章