⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bus.c

📁 Windows CE 6.0 BSP for the Beagle Board.
💻 C
📖 第 1 页 / 共 2 页
字号:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this sample source code is subject to the terms of the Microsoft
// license agreement under which you licensed this sample source code. If
// you did not accept the terms of the license agreement, you are not
// authorized to use this sample source code. For the terms of the license,
// please see the license agreement between you and Microsoft or, if applicable,
// see the LICENSE.RTF on your install media or the root of your tools installation.
// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES.
//
//------------------------------------------------------------------------------
//
#include <windows.h>
#include <types.h>
#include <ceddk.h>
#include <devload.h>
#include <pm.h>
#include <cebus.h>
#include <CeBusCfg.h>

//------------------------------------------------------------------------------
//  Local Definitions

#define BUS_ACCESS_COOKIE       'Asub'

//------------------------------------------------------------------------------

typedef struct {
    DWORD cookie;
    HANDLE hRefBus;             // Parent bus device manager handler
    HANDLE hBus;                // Parent bus I/O handler
    LPWSTR pszDeviceName;       // Device bus name
} PARENT_BUS_ACCESS;

//------------------------------------------------------------------------------

HANDLE CreateBusAccessHandle(LPCTSTR szActivePath)
{
    BOOL rc = FALSE;
    PARENT_BUS_ACCESS *pBusAccess = NULL;
    HANDLE hDevice;
    DEVMGR_DEVICE_INFORMATION di;
    DWORD length;

    // Get device handle
    hDevice = GetDeviceHandleFromContext(szActivePath);
    if (hDevice == NULL) goto clean;

    // Get device name and parent bus device manager handler
    memset(&di, 0, sizeof(di));
    di.dwSize = sizeof(di);
    if (!GetDeviceInformationByDeviceHandle(hDevice, &di)) goto clean;

    // Allocate internal structure
    pBusAccess = LocalAlloc(LPTR, sizeof(PARENT_BUS_ACCESS));
    if (pBusAccess == NULL) goto clean;

    // Set cookie & hBus
    pBusAccess->cookie = BUS_ACCESS_COOKIE;
    pBusAccess->hBus = INVALID_HANDLE_VALUE;

    // Save parent bus handler
    pBusAccess->hRefBus = di.hParentDevice;

    // Save device bus name
    length = (wcslen(di.szBusName) + 1) * sizeof(WCHAR);
    pBusAccess->pszDeviceName = LocalAlloc(LPTR, length);
    if (pBusAccess->pszDeviceName == NULL) goto clean;
    memcpy(pBusAccess->pszDeviceName, di.szBusName, length);

    // Get parent bus info when there is one
    if (pBusAccess->hRefBus != NULL) {
        // Get parent bus device information
        memset(&di, 0, sizeof(di));
        di.dwSize = sizeof(di);
        if (!GetDeviceInformationByDeviceHandle(pBusAccess->hRefBus, &di)) {
            goto clean;
        }
        // Open bus for later calls
        pBusAccess->hBus = CreateFile(
            di.szBusName, GENERIC_READ|GENERIC_WRITE,
            FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL
        );
    }        

    // Done
    rc = TRUE;

clean:
    if (!rc && pBusAccess != NULL) {
        if (pBusAccess->hBus != INVALID_HANDLE_VALUE) {
            CloseHandle(pBusAccess->hBus);
        }            
        if (pBusAccess->pszDeviceName != NULL) {
            LocalFree(pBusAccess->pszDeviceName);
        }
        LocalFree(pBusAccess);
        pBusAccess = NULL;
    }
    return pBusAccess;
}

//------------------------------------------------------------------------------

VOID CloseBusAccessHandle(HANDLE hBusAccess)
{
    PARENT_BUS_ACCESS *pBusAccess = (PARENT_BUS_ACCESS *)hBusAccess;

    if (pBusAccess == NULL || pBusAccess->cookie != BUS_ACCESS_COOKIE) {
        SetLastError(ERROR_INVALID_HANDLE);
        goto clean;
    }

    if (pBusAccess->hBus != INVALID_HANDLE_VALUE) CloseHandle(pBusAccess->hBus);
    if (pBusAccess->pszDeviceName != NULL) LocalFree(pBusAccess->pszDeviceName);
    LocalFree(pBusAccess);

clean:
    return;
}

//------------------------------------------------------------------------------

BOOL SetDevicePowerState(
    HANDLE hBusAccess, CEDEVICE_POWER_STATE powerState, VOID *pReserved
) {
    BOOL rc = FALSE;
    PARENT_BUS_ACCESS *pBusAccess = (PARENT_BUS_ACCESS *)hBusAccess;
    CE_BUS_POWER_STATE ps;

    // Check passed handler
    if (pBusAccess == NULL || pBusAccess->cookie != BUS_ACCESS_COOKIE) {
        SetLastError(ERROR_INVALID_HANDLE);
        goto clean;
    }

    // Call parent device
    if (pBusAccess->hBus != INVALID_HANDLE_VALUE) {
        ps.lpDeviceBusName = pBusAccess->pszDeviceName;
        ps.lpceDevicePowerState = &powerState;
        ps.lpReserved = pReserved;
        rc = DeviceIoControl(
            pBusAccess->hBus, IOCTL_BUS_SET_POWER_STATE, &ps, sizeof(ps),
            NULL, 0, NULL, 0
        );
    }

clean:
    return rc;
}

//------------------------------------------------------------------------------

BOOL GetDevicePowerState(
    HANDLE hBusAccess, CEDEVICE_POWER_STATE *pPowerState, VOID *pReserved
) {
    BOOL rc = FALSE;
    PARENT_BUS_ACCESS *pBusAccess = (PARENT_BUS_ACCESS *)hBusAccess;
    CE_BUS_POWER_STATE ps;

    // Check passed handler
    if (pBusAccess == NULL || pBusAccess->cookie != BUS_ACCESS_COOKIE) {
        SetLastError(ERROR_INVALID_HANDLE);
        goto clean;
    }

    // Call parent device
    if (pBusAccess->hBus != INVALID_HANDLE_VALUE) {
        ps.lpDeviceBusName = pBusAccess->pszDeviceName;
        ps.lpceDevicePowerState = pPowerState;
        ps.lpReserved = pReserved;
        rc = DeviceIoControl(
            pBusAccess->hBus, IOCTL_BUS_GET_POWER_STATE, &ps, sizeof(ps),
            NULL, 0, NULL, 0
        );
    }

clean:
    return rc;
}

//------------------------------------------------------------------------------

BOOL TranslateBusAddr(
    HANDLE hBusAccess, INTERFACE_TYPE interfaceType, ULONG busNumber,
    PHYSICAL_ADDRESS busAddress, ULONG *pAddressSpace,
    PHYSICAL_ADDRESS *pTranslatedAddress
) {
    BOOL rc = FALSE;
    PARENT_BUS_ACCESS *pBusAccess = (PARENT_BUS_ACCESS *)hBusAccess;
    CE_BUS_TRANSLATE_BUS_ADDR busTranslate;

    // Check passed handler
    if (pBusAccess == NULL || pBusAccess->cookie != BUS_ACCESS_COOKIE) {
        SetLastError(ERROR_INVALID_HANDLE);
        goto clean;
    }

    if (pBusAccess->hBus != INVALID_HANDLE_VALUE) {
        // Call parent device bus
        busTranslate.lpDeviceBusName = pBusAccess->pszDeviceName;
        busTranslate.InterfaceType = interfaceType;
        busTranslate.BusNumber = busNumber;
        busTranslate.BusAddress = busAddress;
        busTranslate.AddressSpace = pAddressSpace;
        busTranslate.TranslatedAddress = pTranslatedAddress;
        rc = DeviceIoControl(
            pBusAccess->hBus, IOCTL_BUS_TRANSLATE_BUS_ADDRESS, &busTranslate,
            sizeof(busTranslate), NULL, 0, NULL, 0
        );
    } else {
        // Call HAL
        rc = HalTranslateBusAddress(
            interfaceType, busNumber, busAddress, pAddressSpace, 
            pTranslatedAddress
        );
    }
    
clean:
    return rc;
}

//------------------------------------------------------------------------------

BOOL TranslateSystemAddr(
    HANDLE hBusAccess, INTERFACE_TYPE interfaceType, ULONG busNumber,
    PHYSICAL_ADDRESS systemAddress, PHYSICAL_ADDRESS *pTranslatedAddress
) {
    BOOL rc = FALSE;
    PARENT_BUS_ACCESS *pBusAccess = (PARENT_BUS_ACCESS *)hBusAccess;
    CE_BUS_TRANSLATE_SYSTEM_ADDR systemTranslate;


    // Check passed handler
    if (pBusAccess == NULL || pBusAccess->cookie != BUS_ACCESS_COOKIE) {
        SetLastError(ERROR_INVALID_HANDLE);
        goto clean;
    }

    if (pBusAccess->hBus != INVALID_HANDLE_VALUE) {
        // Call parent device bus
        systemTranslate.lpDeviceBusName = pBusAccess->pszDeviceName;
        systemTranslate.InterfaceType =  interfaceType;
        systemTranslate.BusNumber = busNumber;
        systemTranslate.SystemAddress = systemAddress;
        systemTranslate.TranslatedAddress = pTranslatedAddress;
        rc = DeviceIoControl(
            pBusAccess->hBus, IOCTL_BUS_TRANSLATE_SYSTEM_ADDRESS,
            &systemTranslate, sizeof(systemTranslate), NULL, 0, NULL, 0
        );
    }  else {
        // Call HAL
        rc = HalTranslateSystemAddress(
            interfaceType, busNumber, systemAddress, pTranslatedAddress
        );
    }

clean:
    return rc;
}

//------------------------------------------------------------------------------

ULONG SetDeviceConfigurationData(
    HANDLE hBusAccess, DWORD space, DWORD busNumber, DWORD slotNumber,
    DWORD offset, DWORD length, VOID *pBuffer
) {
    ULONG rc = 0;
    PARENT_BUS_ACCESS *pBusAccess = (PARENT_BUS_ACCESS *)hBusAccess;
    CE_BUS_DEVICE_CONFIGURATION_DATA deviceConfigData;


    // Check passed handler
    if (pBusAccess == NULL || pBusAccess->cookie != BUS_ACCESS_COOKIE) {
        SetLastError(ERROR_INVALID_HANDLE);
        goto clean;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -