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

📄 menelaus.cpp

📁 Windows CE 6.0 BSP for the Beagle Board.
💻 CPP
📖 第 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.
//
//
// Copyright (c) Intrinsyc Software International.  All rights reserved.
//
//
//------------------------------------------------------------------------------
//
//  File: menelaus.cpp
//
//  Configuration:  
//  Slot 1 : Slot Not powered or enabled until card has been inserted
//  Slot 2: Slot is powered, but not enabled.  When Dat1 Interrupt is triggered, slot is enabled.

//#pragma optimize("", off)         // debug

#include <windows.h>
#include <winuser.h>
#include <winuserm.h>
#include <nkintr.h>
#include <ceddk.h>
#include <ceddkex.h>
#include <i2c.h>            // i2c interface
#include <omap2420.h>
#include <bsp_menelaus.h>
#include <oal_intr.h>

#include "menelaus.h"

const GUID DEVICE_IFC_I2C_GUID;

#ifdef DEBUG

#define SDCARD_ZONE_FUNC       DEBUGZONE(11)
#define SDCARD_ZONE_INFO       DEBUGZONE(12)
#define SDCARD_ZONE_INIT       DEBUGZONE(13)
#define SDCARD_ZONE_WARN       DEBUGZONE(14)
#define SDCARD_ZONE_ERROR      DEBUGZONE(15)

#endif

/* ******************************************************* */
/*                                   Object Life Cycle                                  */
/* ******************************************************* */
//------------------------------------------------------------------------------
//  Function:  ctor
//
//  Default Constuctor, create an instance to the i2c bus
//
CMenelaus::CMenelaus(LPCWSTR devicename, DWORD i2cAddress, DWORD i2cAddrSize)
:   m_hI2C(NULL)
,   m_lpsI2CDeviceName(devicename)
,   m_dwI2CMenelausAddress(i2cAddress)
,   m_dwI2CMenelausAddrSize(i2cAddrSize)
,   m_bSlot1(FALSE)
,   m_bSlot2(FALSE)
{
    DEBUGMSG(SDCARD_ZONE_FUNC, (L"ctor CMenelaus(%s, 0x%08x, 0x%08x)\r\n", 
        m_lpsI2CDeviceName, 
        m_dwI2CMenelausAddress, 
        m_dwI2CMenelausAddrSize));

}


//------------------------------------------------------------------------------
//  Function:  dtor
//
//  Default Constuctor
//
CMenelaus::~CMenelaus()
{
    DEBUGMSG(SDCARD_ZONE_FUNC, (L"dtor CMenelaus\r\n"));
    MenelausDeinit();
}

/* ******************************************************* */
/*                           Public Methods                                              */
/* ******************************************************* */

//------------------------------------------------------------------------------
//  Function:  MenelausInit
//
BOOL 
CMenelaus::MenelausInit()
{
    BOOL rc = FALSE;
    DEBUGMSG(SDCARD_ZONE_FUNC, (L"CMenelaus::MenelausInit: "
        L"Initialize Hardware & Interrupts\r\n"
    ));

    // open I2C bus
    m_hI2C = I2COpen(m_lpsI2CDeviceName);

    if (m_hI2C == NULL) {
        DEBUGMSG(SDCARD_ZONE_ERROR, (L"CMenelaus::MenelausInit: "
            L"Failed open I2C device %s\r\n", m_lpsI2CDeviceName
        ));
        goto cleanUp;
    }

    if (!I2CSetSlaveAddress(m_hI2C,
                            m_dwI2CMenelausAddrSize,
                            m_dwI2CMenelausAddress)) {
        
        DEBUGMSG(SDCARD_ZONE_ERROR, (L"CMenelaus::MenelausInit: "
            L"Failed to set I2C Slave address 0x%08x, size 0x%08x)\r\n", m_dwI2CMenelausAddress, m_dwI2CMenelausAddrSize
        ));

        goto cleanUp;
    }

    // Setup Menelaus Chip
    UCHAR pData = 0x00;
    
    // Clear & Mask MTC Menelaus Interrupts
    if ( !ClearMenelausIrq(IRQ_MENELAUS_CD1) || !MaskMenelausIrq(IRQ_MENELAUS_CD1) ||
         !ClearMenelausIrq(IRQ_MENELAUS_CD2) || !MaskMenelausIrq(IRQ_MENELAUS_CD2) ||
         !ClearMenelausIrq(IRQ_MENELAUS_DL1) || !MaskMenelausIrq(IRQ_MENELAUS_DL1) ||
         !ClearMenelausIrq(IRQ_MENELAUS_DL2) || !MaskMenelausIrq(IRQ_MENELAUS_DL2))
     {
        goto cleanUp;
     }
    
    // confgure VMMC (Power Supply Slot1) for 3.2V
    if (ReadData(MENELAUS_LD0CTRL1_OFFSET, &pData))
    {
        pData &= ~(VMCC_VOLT);  // clear bits
        pData |= VMMC_VOLT32;   // set bits
        
        if (!WriteData(MENELAUS_LD0CTRL1_OFFSET, pData) ||
            !WriteData(MENELAUS_LD0CTRL7_OFFSET, (VMMC_MODE_ON)))
        {
            goto cleanUp;
        }
    }
    else
    {
        goto cleanUp;
    }

    // configure DCDC3 (Power Supply Slot2) for 3.2V
    // turn on DCDC3 suppply to Slot2
    if (ReadData(MENELAUS_DCDCCTRL1_OFFSET, &pData))
    {
        pData &= ~(DCDC3_VOLT);  // clear bits
        pData |= DCDC3_VOLT32;   // set bits
        
        if (!WriteData(MENELAUS_DCDCCTRL1_OFFSET, pData) || 
            !WriteData(MENELAUS_DCDCCTRL3_OFFSET, (DCDC3_MODE_ONPWM)))
        {
            goto cleanUp;
        }
    }
    else
    {
        goto cleanUp;
    }

    // Configure Slots
    // MCT Control Reg 3
    // Slots 1 and slot 2 Auto Power Supply Shutoff Disabled.

    // MCT Control Reg 2
    // DCDC3 Power Supply for Slot2 Selected, buffers and debounce enabled
    // CD1, CD2 buffer enabled
    // S1Dat1, S2Dat1 Buffer enabled (note must be enabled only after power applied to slot)

    // MCT Control Reg 1
    // Push-Pull Buffer
    // Normally Open  Switch
    if (!WriteData(MENELAUS_MCTCTRL3_OFFSET, 0x00) || 
        !WriteData(MENELAUS_MCTCTRL2_OFFSET, (S2D1_BUFEN | S1D1_BUFEN | S2CD_BUFEN | S1CD_BUFEN | VS2_DCDC3)) || 
        !WriteData(MENELAUS_MCTCTRL1_OFFSET, (S2CD_SWNO | S1CD_SWNO)))
    {
        goto cleanUp;
    }
    
    // Unmask Desired Menelaus Interrupts
    UnMaskMenelausIrq(IRQ_MENELAUS_CD1);
    UnMaskMenelausIrq(IRQ_MENELAUS_CD2);
    UnMaskMenelausIrq(IRQ_MENELAUS_DL1);
    UnMaskMenelausIrq(IRQ_MENELAUS_DL2);

#ifdef DEBUG
    DEBUGMSG(SDCARD_ZONE_INFO, (L"Dump Menelaus Configuration! \r\n")); 
    ReadData(MENELAUS_VCORECTRL1_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"VCORECTRL1 0x%02X \r\n", pData));
    ReadData(MENELAUS_VCORECTRL2_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"VCORECTRL2 0x%02X \r\n", pData));
    ReadData(MENELAUS_VCORECTRL3_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"VCORECTRL3 0x%02X \r\n", pData));
    ReadData(MENELAUS_VCORECTRL4_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"VCORECTRL4 0x%02X \r\n", pData));
    ReadData(MENELAUS_VCORECTRL5_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"VCORECTRL5 0x%02X \r\n", pData));
    ReadData(MENELAUS_DCDCCTRL1_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"DCDCCTRL1 0x%02X \r\n", pData));
    ReadData(MENELAUS_DCDCCTRL2_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"DCDCCTRL2 0x%02X \r\n", pData));
    ReadData(MENELAUS_DCDCCTRL3_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"DCDCCTRL3 0x%02X \r\n", pData));
    ReadData(MENELAUS_LD0CTRL1_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"LD0CTRL1 0x%02X \r\n", pData));
    ReadData(MENELAUS_LD0CTRL2_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"LD0CTRL2 0x%02X \r\n", pData));
    ReadData(MENELAUS_LD0CTRL3_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"LD0CTRL3 0x%02X \r\n", pData));
    ReadData(MENELAUS_LD0CTRL4_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"LD0CTRL4 0x%02X \r\n", pData));
    ReadData(MENELAUS_LD0CTRL5_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"LD0CTRL5 0x%02X \r\n", pData));
    ReadData(MENELAUS_LD0CTRL6_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"LD0CTRL6 0x%02X \r\n", pData));
    ReadData(MENELAUS_LD0CTRL7_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"LD0CTRL7 0x%02X \r\n", pData));
    ReadData(MENELAUS_LD0CTRL8_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"LD0CTRL8 0x%02X \r\n", pData));
    ReadData(MENELAUS_SLEEPCTRL1_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"SLEEPCTRL1 0x%02X \r\n", pData));
    ReadData(MENELAUS_SLEEPCTRL2_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"SLEEPCTRL2 0x%02X \r\n", pData));
    ReadData(MENELAUS_DEVICEOFF_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"DEVICEOFF 0x%02X \r\n", pData));
    ReadData(MENELAUS_OSCCTRL_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"OSCCTRL 0x%02X \r\n", pData));
    ReadData(MENELAUS_DETECTCTRL_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"DETECTCTRL 0x%02X \r\n", pData));
    ReadData(MENELAUS_INTMASK1_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"INTMASK1 0x%02X \r\n", pData));
    ReadData(MENELAUS_INTMASK2_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"INTMASK2 0x%02X \r\n", pData));
    ReadData(MENELAUS_INTSTATUS1_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"INTSTATUS1 0x%02X \r\n", pData));
    ReadData(MENELAUS_INTSTATUS2_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"INTSTATUS2 0x%02X \r\n", pData));
    ReadData(MENELAUS_INTACK1_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"INTACK1 0x%02X \r\n", pData));
    ReadData(MENELAUS_INTACK2_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"INTACK2 0x%02X \r\n", pData));
    ReadData(MENELAUS_GPIOCTRL_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"GPIOCTRL 0x%02X \r\n", pData));
    ReadData(MENELAUS_GPIOIN_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"GPIOIN 0x%02X \r\n", pData));
    ReadData(MENELAUS_GPIOOUT_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"GPIOOUT1 0x%02X \r\n", pData));
    ReadData(MENELAUS_BBSMS_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"BBSMS 0x%02X \r\n", pData));
    ReadData(MENELAUS_RTCCTRL_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"RTCCTRL 0x%02X \r\n", pData));
    ReadData(MENELAUS_RTCUPDATE_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"RTCUPDATE 0x%02X \r\n", pData));
    ReadData(MENELAUS_RTCSEC_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"RTCSEC 0x%02X \r\n", pData));
    ReadData(MENELAUS_RTCMIN_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"RTCMIN 0x%02X \r\n", pData));
    ReadData(MENELAUS_RTCHR_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"RTCHR 0x%02X \r\n", pData));
    ReadData(MENELAUS_RTCDAY_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"RTCDAY 0x%02X \r\n", pData));
    ReadData(MENELAUS_RTCMON_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"RTCMON 0x%02X \r\n", pData));
    ReadData(MENELAUS_RTCYR_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"RTCYR 0x%02X \r\n", pData));
    ReadData(MENELAUS_RTCWKDAY_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"RTCWKDAY 0x%02X \r\n", pData));
    ReadData(MENELAUS_RTCALSEC_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"RTCALSEC 0x%02X \r\n", pData));
    ReadData(MENELAUS_RTCALMIN_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"RTCALMIN 0x%02X \r\n", pData));
    ReadData(MENELAUS_RTCALHR_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"RTCALHR 0x%02X \r\n", pData));
    ReadData(MENELAUS_RTCALDAY_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"RTCALDAY 0x%02X \r\n", pData));
    ReadData(MENELAUS_RTCALMON_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"RTCALMON 0x%02X \r\n", pData));
    ReadData(MENELAUS_RTCALYR_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"RTCALYR 0x%02X \r\n", pData));
    ReadData(MENELAUS_RTCCOMPMSB_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"RTCCOMPMSB 0x%02X \r\n", pData));
    ReadData(MENELAUS_RTCCOMPLSB_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"RTCCOMPLSB 0x%02X \r\n", pData));
    ReadData(MENELAUS_S1PULLEN_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"S1PULLEN 0x%02X \r\n", pData));
    ReadData(MENELAUS_S1PULLDIR_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"S1PULLDIR 0x%02X \r\n", pData));
    ReadData(MENELAUS_S2PULLEN_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"S2PULLEN 0x%02X \r\n", pData));
    ReadData(MENELAUS_S2PULLDIR_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"S2PULLDIR 0x%02X \r\n", pData));
    ReadData(MENELAUS_MCTCTRL1_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"MCTCTRL1 0x%02X \r\n", pData));
    ReadData(MENELAUS_MCTCTRL2_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"MCTCTRL2 0x%02X \r\n", pData));
    ReadData(MENELAUS_MCTCTRL3_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"MCTCTRL3 0x%02X \r\n", pData));
    ReadData(MENELAUS_MCTPINST_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"MCTPINST 0x%02X \r\n", pData));
    ReadData(MENELAUS_DEBOUNCE_OFFSET, &pData); DEBUGMSG(SDCARD_ZONE_INFO, (L"DEBOUNCE 0x%02X \r\n", pData)); 
    DEBUGMSG(SDCARD_ZONE_INFO, (L"End Dump Menelaus Configuration! \r\n")); 
#endif

    rc = TRUE;

cleanUp:
    if(!rc) {
        // Handle error specific 
        MenelausDeinit();
    }
    return rc;
}

//------------------------------------------------------------------------------
//
//  Function:  MenelausDeinit
//
BOOL 
CMenelaus::MenelausDeinit()
{
    if (m_hI2C != NULL)
    {
        DEBUGMSG(SDCARD_ZONE_FUNC, (L"CMenelaus::MenelausDeinit: "
            L"De-Initialize Hardware & Interrupts\r\n"
        ));

        // turn off power to slots
        WriteData(MENELAUS_DCDCCTRL3_OFFSET, (DCDC3_MODE_OFF));
        WriteData(MENELAUS_LD0CTRL7_OFFSET, (VMMC_MODE_OFF));
        
        // MCT Control Reg 3
        // disable slots 1 & 2
        WriteData(MENELAUS_MCTCTRL3_OFFSET, 0x00);

        // Clear & Mask MTC Menelaus Interrupts
        ClearMenelausIrq(IRQ_MENELAUS_CD1);
        MaskMenelausIrq(IRQ_MENELAUS_CD1);
        ClearMenelausIrq(IRQ_MENELAUS_CD2);
        MaskMenelausIrq(IRQ_MENELAUS_CD2);
        ClearMenelausIrq(IRQ_MENELAUS_DL1);
        MaskMenelausIrq(IRQ_MENELAUS_DL1);
        ClearMenelausIrq(IRQ_MENELAUS_DL2);
        MaskMenelausIrq(IRQ_MENELAUS_DL2);

        I2CClose(m_hI2C);
        m_hI2C = NULL;

        return TRUE;
    }

    return FALSE;
}

//------------------------------------------------------------------------------
//
//  Function:  SlotsEnabled
//
BOOL 
CMenelaus::SlotsEnabled()
{
    DEBUGMSG(SDCARD_ZONE_FUNC, (L"+CMenelaus::SlotsEnabled\r\n"));

    // de-select both slots
    if (!WriteData(MENELAUS_MCTCTRL3_OFFSET, 0x00) ||
        !UnMaskMenelausIrq(IRQ_MENELAUS_CD1) ||
        !UnMaskMenelausIrq(IRQ_MENELAUS_CD2) ||
        !UnMaskMenelausIrq(IRQ_MENELAUS_DL1) ||
        !UnMaskMenelausIrq(IRQ_MENELAUS_DL2))
    {
        DEBUGMSG(SDCARD_ZONE_ERROR, (L"CMenelaus::SlotsEnabled: "
            L"Failed SlotsEnabled \r\n"
        ));
        return FALSE;
    }

#ifdef DEBUG

⌨️ 快捷键说明

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