mirror of https://github.com/ARMmbed/mbed-os.git
82 lines
2.3 KiB
C
82 lines
2.3 KiB
C
/****************************************************************************
|
|
*
|
|
* Copyright 2020 Samsung Electronics All Rights Reserved.
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing,
|
|
* software distributed under the License is distributed on an
|
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
|
|
* either express or implied. See the License for the specific
|
|
* language governing permissions and limitations under the License.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#include "cmsis.h"
|
|
#include "mbed_assert.h"
|
|
#include "pinmap.h"
|
|
#include "mbed_error.h"
|
|
#include "PeripheralPins.h"
|
|
|
|
void set_alt(uint8_t port, uint8_t pin, uint8_t alt)
|
|
{
|
|
switch (alt) {
|
|
case ALT0 :
|
|
case ALT1 :
|
|
modifyreg32(GPIO_PORT_BASE(port) + GPIO_ALTFUNCSET_OFFSET,
|
|
0x01 << pin, 0x01 << pin);
|
|
modifyreg32(GPIO_PORT_BASE(port) + GPIO_ALTFUNCSEL_OFFSET,
|
|
0x01 << pin, 0x01 << pin);
|
|
modifyreg32(GPIO_PORT_BASE(port) + GPIO_ALTFUNCSEL_OFFSET,
|
|
0x1 << (pin), alt << (pin));
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void set_pullup(uint8_t port, uint8_t pin, uint8_t pullup)
|
|
{
|
|
if (pullup == PullNone) {
|
|
return;
|
|
}
|
|
|
|
uint8_t idx = port * 4 + pin / 4 + 2;
|
|
uint8_t bit = (pin << 3) % 32;
|
|
|
|
modifyreg32(&BP_SYSCON->IOCFG[idx], 0x1C << bit, pullup << bit);
|
|
}
|
|
|
|
void set_drvstr(uint8_t port, uint8_t pin, uint8_t str)
|
|
{
|
|
modifyreg32(&BP_SYSCON->IOCFG_GENERAL, 0x3, str);
|
|
}
|
|
|
|
void pin_function(PinName pin, int function)
|
|
{
|
|
uint8_t port_n = BP6A_PORT_IDX(pin);
|
|
uint8_t pin_n = BP6A_PIN_IDX(pin);
|
|
|
|
MBED_ASSERT(port_n < 3 && pin_n < 16);
|
|
|
|
bp6a_set_pin_config(port_n, pin_n, GET_PIN_DIR(function));
|
|
set_alt(port_n, pin_n, GET_PIN_SEL(function));
|
|
set_pullup(port_n, pin_n, GET_PIN_MODE(function));
|
|
|
|
}
|
|
|
|
void pin_mode(PinName pin, PinMode mode)
|
|
{
|
|
MBED_ASSERT(pin != (PinName)NC);
|
|
|
|
uint8_t port_n = BP6A_PORT_IDX(pin);
|
|
uint8_t pin_n = BP6A_PIN_IDX(pin);
|
|
|
|
set_pullup(port_n, pin_n, mode);
|
|
}
|