Skip to content

Commit

Permalink
ext/hal/nxp/imx: Import the nxp imx7 freertos bsp
Browse files Browse the repository at this point in the history
This code component is used to add Zephyr support on iMX7 processors,
exclusively on Cortex M4 core, and to speed up the development process
it was decided to have it based on NXP FreeRTOS BSP implementation.

The source code was imported from the following folders:
    FreeRTOS_BSP_1.0.1_iMX7D/platform/drivers
    FreeRTOS_BSP_1.0.1_iMX7D/platform/devices

This source code depends on headers and sources from zephyr:
    ext/hal/cmsis

Origin: iMX7D NXP FreeRTOS BSP Peripheral Driver
License: BSD 3-Clause
URL: https://www.nxp.com/webapp/Download?colCode=FreeRTOS_iMX7D_1.0.1_LINUX&appType=license
commit: no commit hash
Purpose: The peripheral driver wraps the H/W for i.MX7 M4 core
Maintained-by: External

Signed-off-by: Diego Sueiro <[email protected]>
  • Loading branch information
diegosueiro authored and MaureenHelm committed Apr 11, 2018
1 parent ece38da commit 5e87277
Show file tree
Hide file tree
Showing 41 changed files with 56,018 additions and 0 deletions.
5 changes: 5 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,8 @@ add_subdirectory_ifdef(
CONFIG_HAS_MCUX
mcux
)

add_subdirectory_ifdef(
CONFIG_HAS_IMX_HAL
imx
)
9 changes: 9 additions & 0 deletions imx/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Translate the SoC name and part number into the imx device and cpu
# name respectively.
string(TOUPPER ${CONFIG_SOC} IMX_DEVICE)

zephyr_include_directories(devices/${IMX_DEVICE})

# Build imx drivers and utilities that can be used for multiple SoC's.
add_subdirectory(drivers)
add_subdirectory(devices/${IMX_DEVICE})
28 changes: 28 additions & 0 deletions imx/Kconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Kconfig - IMX M4 Core SDK
#
# Copyright (c) 2018, NXP
#
# SPDX-License-Identifier: Apache-2.0
#


config HAS_IMX_HAL
bool
select HAS_CMSIS
depends on SOC_FAMILY_IMX

if HAS_IMX_HAL

config HAS_IMX_RDC
bool
default n
help
Set if the RDC module is present in the SoC.

config HAS_IMX_CCM
bool
default n
help
Set if the CCM module is present in the SoC.

endif # HAS_IMX_HAL
41 changes: 41 additions & 0 deletions imx/README
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
iMX7D Port
#####################

Origin:
iMX7D NXP FreeRTOS BSP Peripheral Driver
https://www.nxp.com/webapp/Download?colCode=FreeRTOS_iMX7D_1.0.1_LINUX&appType=license


Status:
FreeRTOS_iMX7D_1.0.1

Purpose:
The peripheral driver wrap the H/W

Description:
This code component is used to add Zephyr support on iMX7 processors,
exclusively on Cortex M4 core, and to speed up the development process
it was decided to have it based on NXP FreeRTOS BSP implementation.

The source code was imported from the following folders:
FreeRTOS_BSP_1.0.1_iMX7D/platform/drivers
FreeRTOS_BSP_1.0.1_iMX7D/platform/devices

Dependencies:
This source code depends on headers and sources from zephyr:
ext/hal/cmsis

URL:
https://www.nxp.com/products/processors-and-microcontrollers/applications-processors/i.mx-applications-processors/i.mx-7-processors/i.mx-7dual-processors-heterogeneous-processing-with-dual-arm-cortex-a7-cores-and-cortex-m4-core:i.MX7D?tab=Design_Tools_Tab

commit:
No commit hash

Maintained-by:
External

License:
BSD-3-Clause

License Link:
https://www.nxp.com/webapp/sps/download/license.jsp?colCode=FreeRTOS_iMX7D_1.0.1_LINUX&appType=file1&DOWNLOAD_ID=null
2 changes: 2 additions & 0 deletions imx/devices/MCIMX7D/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
zephyr_include_directories(.)
zephyr_sources(clock_freq.c)
44,765 changes: 44,765 additions & 0 deletions imx/devices/MCIMX7D/MCIMX7D_M4.h

Large diffs are not rendered by default.

243 changes: 243 additions & 0 deletions imx/devices/MCIMX7D/clock_freq.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,243 @@
/*
* Copyright (c) 2015, Freescale Semiconductor, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* o Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* o Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* o Neither the name of Freescale Semiconductor, Inc. nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/

#include "clock_freq.h"
#include "ccm_imx7d.h"
#include "ccm_analog_imx7d.h"

/*FUNCTION**********************************************************************
*
* Function Name : get_gpt_clock_freq
* Description : Get clock frequency applies to the GPT module
*
*END**************************************************************************/
uint32_t get_gpt_clock_freq(GPT_Type *base)
{
uint32_t root;
uint32_t hz;
uint32_t pre, post;

switch ((uint32_t)base) {
case GPT3_BASE:
root = CCM_GetRootMux(CCM, ccmRootGpt3);
CCM_GetRootDivider(CCM, ccmRootGpt3, &pre, &post);
break;
case GPT4_BASE:
root = CCM_GetRootMux(CCM, ccmRootGpt4);
CCM_GetRootDivider(CCM, ccmRootGpt4, &pre, &post);
break;
default:
return 0;
}

switch (root) {
case ccmRootmuxGptOsc24m:
hz = 24000000;
break;
case ccmRootmuxGptSysPllPfd0:
hz = CCM_ANALOG_GetPfdFreq(CCM_ANALOG, ccmAnalogPfd0Frac);
break;
default:
return 0;
}

return hz / (pre + 1) / (post + 1);
}

/*FUNCTION**********************************************************************
*
* Function Name : get_ecspi_clock_freq
* Description : Get clock frequency applys to the ECSPI module
*
*END**************************************************************************/
uint32_t get_ecspi_clock_freq(ECSPI_Type *base)
{
uint32_t root;
uint32_t hz;
uint32_t pre, post;

switch ((uint32_t)base) {
case ECSPI1_BASE:
root = CCM_GetRootMux(CCM, ccmRootEcspi1);
CCM_GetRootDivider(CCM, ccmRootEcspi1, &pre, &post);
break;
case ECSPI2_BASE:
root = CCM_GetRootMux(CCM, ccmRootEcspi2);
CCM_GetRootDivider(CCM, ccmRootEcspi2, &pre, &post);
break;
default:
return 0;
}

switch (root) {
case ccmRootmuxEcspiOsc24m:
hz = 24000000;
break;
case ccmRootmuxEcspiSysPllPfd4:
hz = CCM_ANALOG_GetPfdFreq(CCM_ANALOG, ccmAnalogPfd4Frac);
break;
default:
return 0;
}

return hz / (pre + 1) / (post + 1);
}

/*FUNCTION**********************************************************************
*
* Function Name : get_flexcan_clock_freq
* Description : Get clock frequency applys to the FLEXCAN module
*
*END**************************************************************************/
uint32_t get_flexcan_clock_freq(CAN_Type *base)
{
uint32_t root;
uint32_t hz;
uint32_t pre, post;

switch ((uint32_t)base) {
case CAN1_BASE:
root = CCM_GetRootMux(CCM, ccmRootCan1);
CCM_GetRootDivider(CCM, ccmRootCan1, &pre, &post);
break;
case CAN2_BASE:
root = CCM_GetRootMux(CCM, ccmRootCan2);
CCM_GetRootDivider(CCM, ccmRootCan2, &pre, &post);
break;
default:
return 0;
}

switch (root) {
case ccmRootmuxCanOsc24m:
hz = 24000000;
break;
case ccmRootmuxCanSysPllDiv4:
hz = CCM_ANALOG_GetSysPllFreq(CCM_ANALOG) >> 2;
break;
case ccmRootmuxCanSysPllDiv1:
hz = CCM_ANALOG_GetSysPllFreq(CCM_ANALOG);
break;
default:
return 0;
}

return hz / (pre + 1) / (post + 1);
}

/*FUNCTION**********************************************************************
*
* Function Name : get_I2C_clock_freq
* Description : Get clock frequency applys to the I2C module
*
*END**************************************************************************/
uint32_t get_i2c_clock_freq(I2C_Type *base)
{
uint32_t root;
uint32_t hz;
uint32_t pre, post;

switch ((uint32_t)base) {
case I2C1_BASE:
root = CCM_GetRootMux(CCM, ccmRootI2c1);
CCM_GetRootDivider(CCM, ccmRootI2c1, &pre, &post);
break;
case I2C2_BASE:
root = CCM_GetRootMux(CCM, ccmRootI2c2);
CCM_GetRootDivider(CCM, ccmRootI2c2, &pre, &post);
break;
case I2C3_BASE:
root = CCM_GetRootMux(CCM, ccmRootI2c3);
CCM_GetRootDivider(CCM, ccmRootI2c3, &pre, &post);
break;
case I2C4_BASE:
root = CCM_GetRootMux(CCM, ccmRootI2c4);
CCM_GetRootDivider(CCM, ccmRootI2c4, &pre, &post);
break;
default:
return 0;
}

switch (root) {
case ccmRootmuxI2cOsc24m:
hz = 24000000;
break;
case ccmRootmuxI2cSysPllDiv4:
hz = CCM_ANALOG_GetSysPllFreq(CCM_ANALOG) >> 2;
break;
default:
return 0;
}

return hz / (pre + 1) / (post + 1);
}

/*FUNCTION**********************************************************************
*
* Function Name : get_uart_clock_freq
* Description : Get clock frequency applys to the UART module
*
*END**************************************************************************/
uint32_t get_uart_clock_freq(UART_Type *base)
{
uint32_t root;
uint32_t hz;
uint32_t pre, post;

switch ((uint32_t)base) {
case UART2_BASE:
root = CCM_GetRootMux(CCM, ccmRootUart2);
CCM_GetRootDivider(CCM, ccmRootUart2, &pre, &post);
break;
default:
return 0;
}

switch (root) {
case ccmRootmuxUartOsc24m:
hz = 24000000;
break;
case ccmRootmuxUartSysPllDiv2:
hz = CCM_ANALOG_GetSysPllFreq(CCM_ANALOG) >> 1;
break;
case ccmRootmuxUartSysPllDiv1:
hz = CCM_ANALOG_GetSysPllFreq(CCM_ANALOG);
break;
default:
return 0;
}

return hz / (pre + 1) / (post + 1);
}

/*******************************************************************************
* EOF
******************************************************************************/
Loading

0 comments on commit 5e87277

Please sign in to comment.