/* * Copyright (C) 2016 The Android Open Source Project * * 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 <hostIntf.h> #include <hostIntf_priv.h> #include <variant/inc/variant.h> #include <plat/inc/bl.h> #include <plat/inc/cmsis.h> #include <plat/inc/spi.h> const struct HostIntfComm *platHostIntfInit() { uint32_t priorityGroup = NVIC_GetPriorityGrouping(); uint32_t priority, preemptPriority, subPriority; enum IRQn rx, tx; const struct HostIntfComm *ret = NULL; #if defined(PLATFORM_HOST_INTF_I2C_BUS) ret = hostIntfI2cInit(PLATFORM_HOST_INTF_I2C_BUS); #elif defined(PLATFORM_HOST_INTF_SPI_BUS) ret = hostIntfSpiInit(PLATFORM_HOST_INTF_SPI_BUS); /* get the rx and tx irq numbers used by the host spi bus */ ret->request(); rx = spiRxIrq(PLATFORM_HOST_INTF_SPI_BUS); tx = spiTxIrq(PLATFORM_HOST_INTF_SPI_BUS); ret->release(); /* make the tx and rx dma isrs execute before other isrs when multiple interrupts are pending (if avaliable subpriority bits). We do not change the preempt priority */ priority = NVIC_GetPriority(rx); NVIC_DecodePriority (priority, priorityGroup, &preemptPriority, &subPriority); if (&subPriority > 0) subPriority --; NVIC_SetPriority(rx, NVIC_EncodePriority(priorityGroup, preemptPriority, subPriority)); priority = NVIC_GetPriority(tx); NVIC_DecodePriority (priority, priorityGroup, &preemptPriority, &subPriority); if (&subPriority > 0) subPriority --; NVIC_SetPriority(tx, NVIC_EncodePriority(priorityGroup, preemptPriority, subPriority)); #else #error "No host interface bus specified" #endif return ret; } uint16_t platHwType(void) { return PLATFORM_HW_TYPE; } uint16_t platHwVer(void) { return PLATFORM_HW_VER; } uint16_t platBlVer() { return BL.blGetVersion(); }