// This method configures the pins to be used for this I2C bus.
HRESULT BtI2cControllerClass::configurePins(ULONG sdaPin, ULONG sclPin)
{
    HRESULT hr = S_OK;

    // Record the pins this I2C controller is using.
    m_sdaPin = sdaPin;
    m_sclPin = sclPin;
 
    // Set the MUXes for external I2C use.
    hr = g_pins.verifyPinFunction(sclPin, FUNC_I2C, BoardPinsClass::LOCK_FUNCTION);

    if (SUCCEEDED(hr))
    {
        hr = g_pins.verifyPinFunction(sdaPin, FUNC_I2C, BoardPinsClass::LOCK_FUNCTION);
    }

    // If we did not succssfully configure the pins, return them to GPIO mode on a
    // best effort basis.
    if (FAILED(hr))
    {
        revertPinsToGpio();
    }

    return hr;
}
/**
\param[in] misoPin The pin number of the MISO signal.
\param[in] mosiPin The pin number of the MOSI signal.
\param[in] sckPin The pin number of the SCK signal
\return HRESULT success or error code.
*/
HRESULT BcmSpiControllerClass::configurePins(ULONG misoPin, ULONG mosiPin, ULONG sckPin)
{
    HRESULT hr = S_OK;

    // Save the pin numbers.
    m_sckPin = sckPin;
    m_mosiPin = mosiPin;
    m_misoPin = misoPin;

    //
    // Set SCK and MOSI as SPI pins.
    //
    hr = g_pins.verifyPinFunction(m_sckPin, FUNC_SPI, BoardPinsClass::LOCK_FUNCTION);

    if (SUCCEEDED(hr))
    {
        hr = g_pins.verifyPinFunction(m_mosiPin, FUNC_SPI, BoardPinsClass::LOCK_FUNCTION);
    }

    //
    // Set MISO as an SPI pin.
    //
    if (SUCCEEDED(hr))
    {
        hr = g_pins.verifyPinFunction(m_misoPin, FUNC_SPI, BoardPinsClass::LOCK_FUNCTION);
    }

    //
    // If this method failed, set all the pins back to digital I/O (ignoring any errors
    // that occur in the process.)
    //
    if (FAILED(hr))
    {
        revertPinsToGpio();
    }

    return hr;
}
/**
\param[in] misoPin The pin number of the MISO signal.
\param[in] mosiPin The pin number of the MOSI signal.
\param[in] sckPin The pin number of the SCK signal
\return HRESULT success or error code.
*/
HRESULT QuarkSpiControllerClass::configurePins(ULONG misoPin, ULONG mosiPin, ULONG sckPin)
{
    HRESULT hr = S_OK;

    // Save the pin numbers.
    m_sckPin = sckPin;
    m_mosiPin = mosiPin;
    m_misoPin = misoPin;

    //
    // Set SCK and MOSI as outputs dedicated to SPI, and pulled LOW.
    //
    hr = g_pins.setPinMode(m_sckPin, DIRECTION_OUT, FALSE);

    if (SUCCEEDED(hr))
    {
        hr = g_pins.setPinState(m_sckPin, LOW);
    }

    if (SUCCEEDED(hr))
    {
        hr = g_pins.verifyPinFunction(m_sckPin, FUNC_SPI, BoardPinsClass::LOCK_FUNCTION);
    }

    if (SUCCEEDED(hr))
    {
        hr = g_pins.setPinMode(m_mosiPin, DIRECTION_OUT, FALSE);
    }

    if (SUCCEEDED(hr))
    {
        hr = g_pins.setPinState(m_mosiPin, LOW);
    }

    if (SUCCEEDED(hr))
    {
        hr = g_pins.verifyPinFunction(m_mosiPin, FUNC_SPI, BoardPinsClass::LOCK_FUNCTION);
    }

    //
    // Set MISO as an input dedicated to SPI.
    //
    if (SUCCEEDED(hr))
    {
        hr = g_pins.setPinMode(m_misoPin, DIRECTION_IN, FALSE);
    }

    if (SUCCEEDED(hr))
    {
        hr = g_pins.verifyPinFunction(m_misoPin, FUNC_SPI, BoardPinsClass::LOCK_FUNCTION);
    }

    //
    // If this method failed, set all the pins back to digital I/O (ignoring any errors
    // that occur in the process.)
    //
    if (FAILED(hr))
    {
        revertPinsToGpio();
    }

    return hr;
}