mirror of
https://github.com/apache/nuttx.git
synced 2026-05-29 04:19:37 +08:00
Merged in mrechte/nuttx-twrk64 (pull request #216)
Add twr-k64f120m config and fix some ENET related problems Approved-by: Gregory Nutt
This commit is contained in:
@@ -197,8 +197,8 @@
|
|||||||
# define CONFIG_ENET_PHYADDR 1
|
# define CONFIG_ENET_PHYADDR 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef CONFIG_ENET_NETHIFS
|
#ifndef CONFIG_ENETNETHIFS
|
||||||
# define CONFIG_ENET_NETHIFS 1
|
# define CONFIG_ENETNETHIFS 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* EMAC Default Interrupt Priorities */
|
/* EMAC Default Interrupt Priorities */
|
||||||
|
|||||||
@@ -156,34 +156,30 @@
|
|||||||
# define BOARD_PHYID1 MII_PHYID1_KSZ8041
|
# define BOARD_PHYID1 MII_PHYID1_KSZ8041
|
||||||
# define BOARD_PHYID2 MII_PHYID2_KSZ8041
|
# define BOARD_PHYID2 MII_PHYID2_KSZ8041
|
||||||
# define BOARD_PHY_STATUS MII_KSZ8041_PHYCTRL2
|
# define BOARD_PHY_STATUS MII_KSZ8041_PHYCTRL2
|
||||||
# define BOARD_PHY_ISDUPLEX(s) (((s) & (4 << MII_PHYCTRL2_MODE_SHIFT)) != 0)
|
|
||||||
# define BOARD_PHY_10BASET(s) (((s) & (1 << MII_PHYCTRL2_MODE_SHIFT)) != 0)
|
|
||||||
# define BOARD_PHY_100BASET(s) (((s) & (2 << MII_PHYCTRL2_MODE_SHIFT)) != 0)
|
|
||||||
#elif defined(CONFIG_ETH0_PHY_KSZ8081)
|
#elif defined(CONFIG_ETH0_PHY_KSZ8081)
|
||||||
# define BOARD_PHY_NAME "KSZ8081"
|
# define BOARD_PHY_NAME "KSZ8081"
|
||||||
# define BOARD_PHYID1 MII_PHYID1_KSZ8081
|
# define BOARD_PHYID1 MII_PHYID1_KSZ8081
|
||||||
# define BOARD_PHYID2 MII_PHYID2_KSZ8081
|
# define BOARD_PHYID2 MII_PHYID2_KSZ8081
|
||||||
# define BOARD_PHY_STATUS MII_KSZ8081_PHYCTRL2
|
# define BOARD_PHY_STATUS MII_KSZ8081_PHYCTRL2
|
||||||
# define BOARD_PHY_ISDUPLEX(s) (((s) & (4 << MII_PHYCTRL2_MODE_SHIFT)) != 0)
|
|
||||||
# define BOARD_PHY_10BASET(s) (((s) & (1 << MII_PHYCTRL2_MODE_SHIFT)) != 0)
|
|
||||||
# define BOARD_PHY_100BASET(s) (((s) & (2 << MII_PHYCTRL2_MODE_SHIFT)) != 0)
|
|
||||||
#else
|
#else
|
||||||
# error "Unrecognized or missing PHY selection"
|
# error "Unrecognized or missing PHY selection"
|
||||||
#endif
|
#endif
|
||||||
|
#define BOARD_PHY_10BASET(s) (((s) & (1 << MII_PHYCTRL2_MODE_SHIFT)) != 0)
|
||||||
|
#define BOARD_PHY_100BASET(s) (((s) & (2 << MII_PHYCTRL2_MODE_SHIFT)) != 0)
|
||||||
|
#define BOARD_PHY_ISDUPLEX(s) (((s) & (4 << MII_PHYCTRL2_MODE_SHIFT)) != 0)
|
||||||
|
|
||||||
/* Estimate the hold time to use based on the peripheral (bus) clock:
|
/* Estimate the MII_SPEED in order to get an MDC close to 2.5MHz,
|
||||||
|
based on the internal module (ENET) clock:
|
||||||
*
|
*
|
||||||
* HOLD_TIME = (2*BUS_FREQ_MHZ)/5 + 1
|
* MII_SPEED = ENET_FREQ/5000000 -1
|
||||||
* = (BUS_FREQ)/2500000 + 1
|
|
||||||
*
|
*
|
||||||
* For example, if BUS_FREQ_MHZ=48 (MHz):
|
* For example, if ENET_FREQ_MHZ=120 (MHz):
|
||||||
*
|
*
|
||||||
* HOLD_TIME = 48Mhz, hold time clocks
|
* MII_SPEED = 120000000/5000000 -1
|
||||||
* = 48000000/2500000 + 1
|
* = 23
|
||||||
* = 20
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define KINETIS_MII_SPEED (BOARD_BUS_FREQ/2500000 + 1)
|
#define KINETIS_MII_SPEED (BOARD_CORECLK_FREQ/5000000 - 1)
|
||||||
#if KINETIS_MII_SPEED > 63
|
#if KINETIS_MII_SPEED > 63
|
||||||
# error "KINETIS_MII_SPEED is out-of-range"
|
# error "KINETIS_MII_SPEED is out-of-range"
|
||||||
#endif
|
#endif
|
||||||
@@ -1602,7 +1598,7 @@ static int kinetis_writemii(struct kinetis_driver_s *priv, uint8_t phyaddr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Function: kinetis_writemii
|
* Function: kinetis_reademii
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Read a 16-bit value from a PHY register.
|
* Read a 16-bit value from a PHY register.
|
||||||
@@ -1765,11 +1761,10 @@ static inline int kinetis_initphy(struct kinetis_driver_s *priv)
|
|||||||
kinetis_writemii(priv, phyaddr, MII_MCR,
|
kinetis_writemii(priv, phyaddr, MII_MCR,
|
||||||
(MII_MCR_ANRESTART | MII_MCR_ANENABLE));
|
(MII_MCR_ANRESTART | MII_MCR_ANENABLE));
|
||||||
|
|
||||||
/* Wait (potentially forever) for auto negotiation to complete */
|
/* Wait for auto negotiation to complete */
|
||||||
|
|
||||||
do
|
for (retries = 0; retries < 10; retries++)
|
||||||
{
|
{
|
||||||
usleep(LINK_WAITUS);
|
|
||||||
ret = kinetis_readmii(priv, phyaddr, MII_MSR, &phydata);
|
ret = kinetis_readmii(priv, phyaddr, MII_MSR, &phydata);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
@@ -1777,19 +1772,39 @@ static inline int kinetis_initphy(struct kinetis_driver_s *priv)
|
|||||||
BOARD_PHY_NAME, ret);
|
BOARD_PHY_NAME, ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
if (phydata & MII_MSR_ANEGCOMPLETE)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
usleep(LINK_WAITUS);
|
||||||
}
|
}
|
||||||
while ((phydata & MII_MSR_ANEGCOMPLETE) == 0);
|
|
||||||
|
|
||||||
ninfo("%s: Autonegotiation complete\n", BOARD_PHY_NAME);
|
if (phydata & MII_MSR_ANEGCOMPLETE)
|
||||||
ninfo("%s: MII_MSR: %04x\n", BOARD_PHY_NAME, phydata);
|
{
|
||||||
|
ninfo("%s: Autonegotiation complete\n", BOARD_PHY_NAME);
|
||||||
|
ninfo("%s: MII_MSR: %04x\n", BOARD_PHY_NAME, phydata);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* TODO: autonegotitation has right now failed. Maybe the Eth cable is not connected.
|
||||||
|
PHY chip have mechanisms to configure link OK. We should leave autconf on,
|
||||||
|
and find a way to re-configure MCU whenever the link is ready. */
|
||||||
|
|
||||||
/* When we get here we have a link - Find the negotiated speed and duplex. */
|
ninfo("%s: Autonegotiation failed (is cable plugged-in ?), default to 10Mbs mode\n", \
|
||||||
|
BOARD_PHY_NAME);
|
||||||
|
|
||||||
|
/* Stop auto negociation */
|
||||||
|
|
||||||
|
kinetis_writemii(priv, phyaddr, MII_MCR, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* When we get here we have a (negotiated) speed and duplex. */
|
||||||
|
|
||||||
phydata = 0;
|
phydata = 0;
|
||||||
ret = kinetis_readmii(priv, phyaddr, BOARD_PHY_STATUS, &phydata);
|
ret = kinetis_readmii(priv, phyaddr, BOARD_PHY_STATUS, &phydata);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
nerr("ERROR: Failed to read %s BOARD_PHY_STATUS{%02x]: %d\n",
|
nerr("ERROR: Failed to read %s BOARD_PHY_STATUS[%02x]: %d\n",
|
||||||
BOARD_PHY_NAME, BOARD_PHY_STATUS, ret);
|
BOARD_PHY_NAME, BOARD_PHY_STATUS, ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -1802,7 +1817,7 @@ static inline int kinetis_initphy(struct kinetis_driver_s *priv)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef CONFIG_KINETIS_ENETUSEMII
|
#ifdef CONFIG_KINETIS_ENETUSEMII
|
||||||
rcr = ENET_RCR_MII_MODE | ENET_RCR_CRCFWD |
|
rcr = ENET_RCR_CRCFWD |
|
||||||
CONFIG_NET_ETH_MTU << ENET_RCR_MAX_FL_SHIFT |
|
CONFIG_NET_ETH_MTU << ENET_RCR_MAX_FL_SHIFT |
|
||||||
ENET_RCR_MII_MODE;
|
ENET_RCR_MII_MODE;
|
||||||
#else
|
#else
|
||||||
@@ -1839,7 +1854,7 @@ static inline int kinetis_initphy(struct kinetis_driver_s *priv)
|
|||||||
ninfo("%s: 10 Base-T\n", BOARD_PHY_NAME);
|
ninfo("%s: 10 Base-T\n", BOARD_PHY_NAME);
|
||||||
rcr |= ENET_RCR_RMII_10T;
|
rcr |= ENET_RCR_RMII_10T;
|
||||||
}
|
}
|
||||||
else if (!BOARD_PHY_100BASET(phydata))
|
else if (BOARD_PHY_100BASET(phydata))
|
||||||
{
|
{
|
||||||
/* 100 Mbps */
|
/* 100 Mbps */
|
||||||
|
|
||||||
@@ -2134,6 +2149,26 @@ int kinetis_netinitialize(int intf)
|
|||||||
priv->txpoll = wd_create(); /* Create periodic poll timer */
|
priv->txpoll = wd_create(); /* Create periodic poll timer */
|
||||||
priv->txtimeout = wd_create(); /* Create TX timeout timer */
|
priv->txtimeout = wd_create(); /* Create TX timeout timer */
|
||||||
|
|
||||||
|
#ifdef CONFIG_NET_ETHERNET
|
||||||
|
/* Determine a semi-unique MAC address from MCU UID
|
||||||
|
We use UID Low and Mid Low registers to get 64 bits, from which we keep 48 bits.
|
||||||
|
We then force unicast and locally administered bits (b0 and b1, 1st octet) */
|
||||||
|
|
||||||
|
uint32_t uidl = getreg32(KINETIS_SIM_UIDL);
|
||||||
|
uint32_t uidml = getreg32(KINETIS_SIM_UIDML);
|
||||||
|
uint8_t *mac = priv->dev.d_mac.ether_addr_octet;
|
||||||
|
|
||||||
|
uidml |= 0x00000200;
|
||||||
|
uidml &= 0x0000FEFF;
|
||||||
|
|
||||||
|
mac[0] = (uidml & 0x0000ff00) >> 8;
|
||||||
|
mac[1] = (uidml & 0x000000ff);
|
||||||
|
mac[2] = (uidl & 0xff000000) >> 24;
|
||||||
|
mac[3] = (uidl & 0x00ff0000) >> 16;
|
||||||
|
mac[4] = (uidl & 0x0000ff00) >> 8;
|
||||||
|
mac[5] = (uidl & 0x000000ff);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Put the interface in the down state. This usually amounts to resetting
|
/* Put the interface in the down state. This usually amounts to resetting
|
||||||
* the device and/or calling kinetis_ifdown().
|
* the device and/or calling kinetis_ifdown().
|
||||||
*/
|
*/
|
||||||
|
|||||||
+15
-1
@@ -1180,7 +1180,7 @@ config ARCH_BOARD_CC3200_LAUNCHPAD
|
|||||||
Tiva CC3200 Launchpad.
|
Tiva CC3200 Launchpad.
|
||||||
|
|
||||||
config ARCH_BOARD_TWR_K60N512
|
config ARCH_BOARD_TWR_K60N512
|
||||||
bool "FreeScale TWR-K60N512d evelopment board"
|
bool "FreeScale TWR-K60N512 development board"
|
||||||
depends on ARCH_CHIP_MK60N512VMD100
|
depends on ARCH_CHIP_MK60N512VMD100
|
||||||
select ARCH_HAVE_LEDS
|
select ARCH_HAVE_LEDS
|
||||||
select ARCH_HAVE_BUTTONS
|
select ARCH_HAVE_BUTTONS
|
||||||
@@ -1189,6 +1189,16 @@ config ARCH_BOARD_TWR_K60N512
|
|||||||
Kinetis K60 Cortex-M4 MCU. This port uses the FreeScale TWR-K60N512
|
Kinetis K60 Cortex-M4 MCU. This port uses the FreeScale TWR-K60N512
|
||||||
development board.
|
development board.
|
||||||
|
|
||||||
|
config ARCH_BOARD_TWR_K64F120M
|
||||||
|
bool "Freescale TWR-K64F120M development board"
|
||||||
|
depends on ARCH_CHIP_MK64FN1M0VMD12
|
||||||
|
select ARCH_HAVE_LEDS
|
||||||
|
select ARCH_HAVE_BUTTONS
|
||||||
|
select ARCH_HAVE_IRQBUTTONS
|
||||||
|
---help---
|
||||||
|
Kinetis K64 Cortex-M4 MCU. This port uses the Freescale TWR-K64F120M
|
||||||
|
development board.
|
||||||
|
|
||||||
config ARCH_BOARD_U_BLOX_C027
|
config ARCH_BOARD_U_BLOX_C027
|
||||||
bool "u-blox C027"
|
bool "u-blox C027"
|
||||||
depends on ARCH_CHIP_LPC1768
|
depends on ARCH_CHIP_LPC1768
|
||||||
@@ -1484,6 +1494,7 @@ config ARCH_BOARD
|
|||||||
default "tm4c1294-launchpad" if ARCH_BOARD_TM4C1294_LAUNCHPAD
|
default "tm4c1294-launchpad" if ARCH_BOARD_TM4C1294_LAUNCHPAD
|
||||||
default "cc3200-launchpad" if ARCH_BOARD_CC3200_LAUNCHPAD
|
default "cc3200-launchpad" if ARCH_BOARD_CC3200_LAUNCHPAD
|
||||||
default "twr-k60n512" if ARCH_BOARD_TWR_K60N512
|
default "twr-k60n512" if ARCH_BOARD_TWR_K60N512
|
||||||
|
default "twr-k64f120m" if ARCH_BOARD_TWR_K64F120M
|
||||||
default "u-blox-c027" if ARCH_BOARD_U_BLOX_C027
|
default "u-blox-c027" if ARCH_BOARD_U_BLOX_C027
|
||||||
default "ubw32" if ARCH_BOARD_UBW32
|
default "ubw32" if ARCH_BOARD_UBW32
|
||||||
default "us7032evb1" if ARCH_BOARD_US7032EVB1
|
default "us7032evb1" if ARCH_BOARD_US7032EVB1
|
||||||
@@ -1872,6 +1883,9 @@ endif
|
|||||||
if ARCH_BOARD_TWR_K60N512
|
if ARCH_BOARD_TWR_K60N512
|
||||||
source "configs/twr-k60n512/Kconfig"
|
source "configs/twr-k60n512/Kconfig"
|
||||||
endif
|
endif
|
||||||
|
if ARCH_BOARD_TWR_K64F120M
|
||||||
|
source "configs/twr-k64f120m/Kconfig"
|
||||||
|
endif
|
||||||
if ARCH_BOARD_U_BLOX_C027
|
if ARCH_BOARD_U_BLOX_C027
|
||||||
source "configs/u-blox-c027/Kconfig"
|
source "configs/u-blox-c027/Kconfig"
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -0,0 +1,37 @@
|
|||||||
|
#
|
||||||
|
# For a description of the syntax of this configuration file,
|
||||||
|
# see the file kconfig-language.txt in the NuttX tools repository.
|
||||||
|
#
|
||||||
|
|
||||||
|
if ARCH_BOARD_TWR_K64F120M
|
||||||
|
|
||||||
|
config TWR_K64F120M_SDHC_AUTOMOUNT
|
||||||
|
bool "SDHC automounter"
|
||||||
|
default n
|
||||||
|
depends on FS_AUTOMOUNTER && KINETIS_SDHC
|
||||||
|
|
||||||
|
if TWR_K64F120M_SDHC_AUTOMOUNT
|
||||||
|
|
||||||
|
config TWR_K64F120M_SDHC_AUTOMOUNT_FSTYPE
|
||||||
|
string "SDHC file system type"
|
||||||
|
default "vfat"
|
||||||
|
|
||||||
|
config TWR_K64F120M_SDHC_AUTOMOUNT_BLKDEV
|
||||||
|
string "SDHC block device"
|
||||||
|
default "/dev/mmcsd0"
|
||||||
|
|
||||||
|
config TWR_K64F120M_SDHC_AUTOMOUNT_MOUNTPOINT
|
||||||
|
string "SDHC mount point"
|
||||||
|
default "/mnt/sdcard"
|
||||||
|
|
||||||
|
config TWR_K64F120M_SDHC_AUTOMOUNT_DDELAY
|
||||||
|
int "SDHC debounce delay (milliseconds)"
|
||||||
|
default 1000
|
||||||
|
|
||||||
|
config TWR_K64F120M_SDHC_AUTOMOUNT_UDELAY
|
||||||
|
int "SDHC unmount retry delay (milliseconds)"
|
||||||
|
default 2000
|
||||||
|
|
||||||
|
endif # TWR_K64F120M_SDHC_AUTOMOUNT
|
||||||
|
|
||||||
|
endif
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,198 @@
|
|||||||
|
/************************************************************************************
|
||||||
|
* configs/twr-k60n512/include/board.h
|
||||||
|
* include/arch/board/board.h
|
||||||
|
*
|
||||||
|
* Copyright (C) 2011 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. 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.
|
||||||
|
* 3. Neither the name NuttX 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 OWNER 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.
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
#ifndef __ARCH_BOARD_BOARD_H
|
||||||
|
#define __ARCH_BOARD_BOARD_H
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Included Files
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
#ifndef __ASSEMBLY__
|
||||||
|
# include <stdint.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Pre-processor Definitions
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
/* Clocking *************************************************************************/
|
||||||
|
/* The K64 tower board uses a 50MHz external clock */
|
||||||
|
|
||||||
|
#define BOARD_EXTCLOCK 1 /* External clock */
|
||||||
|
#define BOARD_EXTAL_FREQ 50000000 /* 50MHz Oscillator */
|
||||||
|
#define BOARD_XTAL32_FREQ 32768 /* 32KHz RTC Oscillator */
|
||||||
|
|
||||||
|
/* PLL Configuration. Either the external clock or crystal frequency is used to
|
||||||
|
* select the PRDIV value. Only reference clock frequencies are supported that will
|
||||||
|
* produce a range 2MHz-4MHz reference clock to the PLL.
|
||||||
|
*
|
||||||
|
* PLL Input frequency: PLLIN = REFCLK/PRDIV = 50MHz/20 = 2.5 MHz
|
||||||
|
* PLL Output frequency: PLLOUT = PLLIN*VDIV = 2.5Mhz*48 = 120MHz
|
||||||
|
* MCG Frequency: PLLOUT = 120 Mhz
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define BOARD_PRDIV 20 /* PLL External Reference Divider */
|
||||||
|
#define BOARD_VDIV 48 /* PLL VCO Divider (frequency multiplier) */
|
||||||
|
|
||||||
|
#define BOARD_PLLIN_FREQ (BOARD_EXTAL_FREQ / BOARD_PRDIV)
|
||||||
|
#define BOARD_PLLOUT_FREQ (BOARD_PLLIN_FREQ * BOARD_VDIV)
|
||||||
|
#define BOARD_MCG_FREQ BOARD_PLLOUT_FREQ
|
||||||
|
|
||||||
|
/* Define additional MCG_C2 Setting */
|
||||||
|
|
||||||
|
#define BOARD_MCG_C2_FCFTRIM 0 /* Do not enable FCFTRIM */
|
||||||
|
#define BOARD_MCG_C2_LOCRE0 MCG_C2_LOCRE0 /* Enable reset on loss of clock */
|
||||||
|
|
||||||
|
/* SIM CLKDIV1 dividers */
|
||||||
|
|
||||||
|
#define BOARD_OUTDIV1 1 /* Core = MCG, 120MHz */
|
||||||
|
#define BOARD_OUTDIV2 2 /* Bus = MCG/2, 60MHz */
|
||||||
|
#define BOARD_OUTDIV3 2 /* FlexBus = MCG/2, 60MHz */
|
||||||
|
#define BOARD_OUTDIV4 5 /* Flash clock = MCG/5, 24MHz */
|
||||||
|
|
||||||
|
#define BOARD_CORECLK_FREQ (BOARD_MCG_FREQ / BOARD_OUTDIV1)
|
||||||
|
#define BOARD_BUS_FREQ (BOARD_MCG_FREQ / BOARD_OUTDIV2)
|
||||||
|
#define BOARD_FLEXBUS_FREQ (BOARD_MCG_FREQ / BOARD_OUTDIV3)
|
||||||
|
#define BOARD_FLASHCLK_FREQ (BOARD_MCG_FREQ / BOARD_OUTDIV4)
|
||||||
|
|
||||||
|
/* SDHC clocking ********************************************************************/
|
||||||
|
|
||||||
|
/* SDCLK configurations corresponding to various modes of operation. Formula is:
|
||||||
|
*
|
||||||
|
* SDCLK frequency = (base clock) / (prescaler * divisor)
|
||||||
|
*
|
||||||
|
* The SDHC module is always configure configured so that the core clock is the base
|
||||||
|
* clock.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Identification mode: 375KHz = 120MHz / ( 64 * 5) <= 400 KHz */
|
||||||
|
|
||||||
|
#define BOARD_SDHC_IDMODE_PRESCALER SDHC_SYSCTL_SDCLKFS_DIV64
|
||||||
|
#define BOARD_SDHC_IDMODE_DIVISOR SDHC_SYSCTL_DVS_DIV(5)
|
||||||
|
|
||||||
|
/* MMC normal mode: 15MHz = 120MHz / (8 * 1) <= 16 MHz*/
|
||||||
|
|
||||||
|
#define BOARD_SDHC_MMCMODE_PRESCALER SDHC_SYSCTL_SDCLKFS_DIV8
|
||||||
|
#define BOARD_SDHC_MMCMODE_DIVISOR SDHC_SYSCTL_DVS_DIV(1)
|
||||||
|
|
||||||
|
/* SD normal mode (1-bit): 15MHz = 120MHz / (8 * 1) <= 16 MHz*/
|
||||||
|
|
||||||
|
#define BOARD_SDHC_SD1MODE_PRESCALER SDHC_SYSCTL_SDCLKFS_DIV8
|
||||||
|
#define BOARD_SDHC_SD1MODE_DIVISOR SDHC_SYSCTL_DVS_DIV(1)
|
||||||
|
|
||||||
|
/* SD normal mode (4-bit): 20MHz = 120MHz / (2 * 3) (with DMA) <= 24MHz
|
||||||
|
* SD normal mode (4-bit): 15MHz = 120MHz / (8 * 1) (no DMA) <= 16MHz
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef CONFIG_SDIO_DMA
|
||||||
|
# define BOARD_SDHC_SD4MODE_PRESCALER SDHC_SYSCTL_SDCLKFS_DIV2
|
||||||
|
# define BOARD_SDHC_SD4MODE_DIVISOR SDHC_SYSCTL_DVS_DIV(3)
|
||||||
|
#else
|
||||||
|
# define BOARD_SDHC_SD4MODE_PRESCALER SDHC_SYSCTL_SDCLKFS_DIV8
|
||||||
|
# define BOARD_SDHC_SD4MODE_DIVISOR SDHC_SYSCTL_DVS_DIV(1)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* LED definitions ******************************************************************/
|
||||||
|
/* The TWR-K64F120M has four LEDs:
|
||||||
|
*
|
||||||
|
* 1. D5 / Green LED PTE6
|
||||||
|
* 2. D6 / Yellow LED PTE7
|
||||||
|
* 3. D7 / Orange LED PTE8
|
||||||
|
* 4 D9 / Blue LED PTE9
|
||||||
|
*
|
||||||
|
* LED4 is reservered for user.
|
||||||
|
* The 3 first LEDs are encoded as follows:
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define LED_STARTED 0 /* N/A */
|
||||||
|
#define LED_HEAPALLOCATE 1 /* N/A */
|
||||||
|
#define LED_IRQSENABLED 2 /* N/A */
|
||||||
|
#define LED_STACKCREATED 3 /* LED1 - OS is started */
|
||||||
|
#define LED_INIRQ 4 /* LED2 */
|
||||||
|
#define LED_SIGNAL 5 /* LED3 */
|
||||||
|
#define LED_ASSERTION 6 /* LED1 + LED2 + LED3 */
|
||||||
|
#define LED_PANIC 7 /* LED1 (blink) */
|
||||||
|
|
||||||
|
|
||||||
|
/* Open SDA serial link */
|
||||||
|
#define PIN_UART1_RX PIN_UART1_RX_1
|
||||||
|
#define PIN_UART1_TX PIN_UART1_TX_1
|
||||||
|
|
||||||
|
|
||||||
|
/* Ethernet */
|
||||||
|
#ifdef CONFIG_KINETIS_ENET
|
||||||
|
# define CONFIG_KINETIS_NENET 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Public Data
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
|
#undef EXTERN
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
#define EXTERN extern "C"
|
||||||
|
extern "C" {
|
||||||
|
#else
|
||||||
|
#define EXTERN extern
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Public Function Prototypes
|
||||||
|
************************************************************************************/
|
||||||
|
/************************************************************************************
|
||||||
|
* Name: kinetis_boardinitialize
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* All STM32 architectures must provide the following entry point. This entry point
|
||||||
|
* is called early in the intitialization -- after all memory has been configured
|
||||||
|
* and mapped but before any devices have been initialized.
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
EXTERN void kinetis_boardinitialize(void);
|
||||||
|
|
||||||
|
#undef EXTERN
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __ASSEMBLY__ */
|
||||||
|
#endif /* __ARCH_BOARD_BOARD_H */
|
||||||
@@ -0,0 +1,111 @@
|
|||||||
|
############################################################################
|
||||||
|
# configs/twr-k64f120m/netnsh/Make.defs
|
||||||
|
#
|
||||||
|
# Copyright (C) 2011 Gregory Nutt. All rights reserved.
|
||||||
|
# Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions
|
||||||
|
# are met:
|
||||||
|
#
|
||||||
|
# 1. Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# 2. 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.
|
||||||
|
# 3. Neither the name NuttX 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 OWNER 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 ${TOPDIR}/.config
|
||||||
|
include ${TOPDIR}/tools/Config.mk
|
||||||
|
include ${TOPDIR}/arch/arm/src/armv7-m/Toolchain.defs
|
||||||
|
|
||||||
|
ifeq ($(WINTOOL),y)
|
||||||
|
# Windows-native toolchains
|
||||||
|
DIRLINK = $(TOPDIR)/tools/copydir.sh
|
||||||
|
DIRUNLINK = $(TOPDIR)/tools/unlink.sh
|
||||||
|
MKDEP = $(TOPDIR)/tools/mkwindeps.sh
|
||||||
|
ARCHINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}"
|
||||||
|
ARCHXXINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}" -isystem "${shell cygpath -w $(TOPDIR)/include/cxx}"
|
||||||
|
ARCHSCRIPT = -T "${shell cygpath -w $(TOPDIR)/configs/$(CONFIG_ARCH_BOARD)/scripts/ld.script}"
|
||||||
|
else
|
||||||
|
# Linux/Cygwin-native toolchain
|
||||||
|
MKDEP = $(TOPDIR)/tools/mkdeps$(HOSTEXEEXT)
|
||||||
|
ARCHINCLUDES = -I. -isystem $(TOPDIR)/include
|
||||||
|
ARCHXXINCLUDES = -I. -isystem $(TOPDIR)/include -isystem $(TOPDIR)/include/cxx
|
||||||
|
ARCHSCRIPT = -T$(TOPDIR)/configs/$(CONFIG_ARCH_BOARD)/scripts/ld.script
|
||||||
|
endif
|
||||||
|
|
||||||
|
CC = $(CROSSDEV)gcc
|
||||||
|
CXX = $(CROSSDEV)g++
|
||||||
|
CPP = $(CROSSDEV)gcc -E
|
||||||
|
LD = $(CROSSDEV)ld
|
||||||
|
AR = $(CROSSDEV)ar rcs
|
||||||
|
NM = $(CROSSDEV)nm
|
||||||
|
OBJCOPY = $(CROSSDEV)objcopy
|
||||||
|
OBJDUMP = $(CROSSDEV)objdump
|
||||||
|
|
||||||
|
ARCHCCVERSION = ${shell $(CC) -v 2>&1 | sed -n '/^gcc version/p' | sed -e 's/^gcc version \([0-9\.]\)/\1/g' -e 's/[-\ ].*//g' -e '1q'}
|
||||||
|
ARCHCCMAJOR = ${shell echo $(ARCHCCVERSION) | cut -d'.' -f1}
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_DEBUG_SYMBOLS),y)
|
||||||
|
ARCHOPTIMIZATION = -g
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifneq ($(CONFIG_DEBUG_NOOPT),y)
|
||||||
|
ARCHOPTIMIZATION += $(MAXOPTIMIZATION) -fno-strict-aliasing -fno-strength-reduce -fomit-frame-pointer
|
||||||
|
endif
|
||||||
|
|
||||||
|
ARCHCFLAGS = -fno-builtin
|
||||||
|
ARCHCXXFLAGS = -fno-builtin -fno-exceptions -fcheck-new
|
||||||
|
ARCHWARNINGS = -Wall -Wstrict-prototypes -Wshadow -Wundef
|
||||||
|
ARCHWARNINGSXX = -Wall -Wshadow -Wundef
|
||||||
|
ARCHDEFINES =
|
||||||
|
ARCHPICFLAGS = -fpic -msingle-pic-base -mpic-register=r10
|
||||||
|
|
||||||
|
CFLAGS = $(ARCHCFLAGS) $(ARCHWARNINGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRADEFINES) -pipe
|
||||||
|
CPICFLAGS = $(ARCHPICFLAGS) $(CFLAGS)
|
||||||
|
CXXFLAGS = $(ARCHCXXFLAGS) $(ARCHWARNINGSXX) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHXXINCLUDES) $(ARCHDEFINES) $(EXTRADEFINES) -pipe
|
||||||
|
CXXPICFLAGS = $(ARCHPICFLAGS) $(CXXFLAGS)
|
||||||
|
CPPFLAGS = $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRADEFINES)
|
||||||
|
AFLAGS = $(CFLAGS) -D__ASSEMBLY__
|
||||||
|
|
||||||
|
NXFLATLDFLAGS1 = -r -d -warn-common
|
||||||
|
NXFLATLDFLAGS2 = $(NXFLATLDFLAGS1) -T$(TOPDIR)/binfmt/libnxflat/gnu-nxflat-pcrel.ld -no-check-sections
|
||||||
|
LDNXFLATFLAGS = -e main -s 2048
|
||||||
|
|
||||||
|
ASMEXT = .S
|
||||||
|
OBJEXT = .o
|
||||||
|
LIBEXT = .a
|
||||||
|
EXEEXT =
|
||||||
|
|
||||||
|
ifneq ($(CROSSDEV),arm-nuttx-elf-)
|
||||||
|
LDFLAGS += -nostartfiles -nodefaultlibs
|
||||||
|
endif
|
||||||
|
ifeq ($(CONFIG_DEBUG_SYMBOLS),y)
|
||||||
|
LDFLAGS += -g
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
HOSTCC = gcc
|
||||||
|
HOSTINCLUDES = -I.
|
||||||
|
HOSTCFLAGS = -Wall -Wstrict-prototypes -Wshadow -Wundef -g -pipe
|
||||||
|
HOSTLDFLAGS =
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
Executable
+61
@@ -0,0 +1,61 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# configs/twr-k64f120m/netnsh/setenv.sh
|
||||||
|
#
|
||||||
|
# Copyright (C) 2011 Gregory Nutt. All rights reserved.
|
||||||
|
# Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions
|
||||||
|
# are met:
|
||||||
|
#
|
||||||
|
# 1. Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# 2. 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.
|
||||||
|
# 3. Neither the name NuttX 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 OWNER 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.
|
||||||
|
#
|
||||||
|
|
||||||
|
if [ "$_" = "$0" ] ; then
|
||||||
|
echo "You must source this script, not run it!" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
WD=`pwd`
|
||||||
|
if [ ! -x "setenv.sh" ]; then
|
||||||
|
echo "This script must be executed from the top-level NuttX build directory"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "${PATH_ORIG}" ]; then
|
||||||
|
export PATH_ORIG="${PATH}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# This is the Cygwin path to the location where I installed the CodeSourcery
|
||||||
|
# toolchain under windows. You will also have to edit this if you install
|
||||||
|
# the CodeSourcery toolchain in any other location
|
||||||
|
#export TOOLCHAIN_BIN="/cygdrive/c/Program Files (x86)/CodeSourcery/Sourcery G++ Lite/bin"
|
||||||
|
|
||||||
|
# This is the Cygwin path to the location where I build the buildroot
|
||||||
|
# toolchain.
|
||||||
|
export TOOLCHAIN_BIN="${WD}/../buildroot/build_arm_nofpu/staging_dir/bin"
|
||||||
|
|
||||||
|
# Add the path to the toolchain to the PATH varialble
|
||||||
|
export PATH="${TOOLCHAIN_BIN}:/sbin:/usr/sbin:${PATH_ORIG}"
|
||||||
|
echo "PATH : ${PATH}"
|
||||||
@@ -0,0 +1,111 @@
|
|||||||
|
############################################################################
|
||||||
|
# configs/twr-k64f120m/nsh/Make.defs
|
||||||
|
#
|
||||||
|
# Copyright (C) 2011 Gregory Nutt. All rights reserved.
|
||||||
|
# Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions
|
||||||
|
# are met:
|
||||||
|
#
|
||||||
|
# 1. Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# 2. 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.
|
||||||
|
# 3. Neither the name NuttX 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 OWNER 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 ${TOPDIR}/.config
|
||||||
|
include ${TOPDIR}/tools/Config.mk
|
||||||
|
include ${TOPDIR}/arch/arm/src/armv7-m/Toolchain.defs
|
||||||
|
|
||||||
|
ifeq ($(WINTOOL),y)
|
||||||
|
# Windows-native toolchains
|
||||||
|
DIRLINK = $(TOPDIR)/tools/copydir.sh
|
||||||
|
DIRUNLINK = $(TOPDIR)/tools/unlink.sh
|
||||||
|
MKDEP = $(TOPDIR)/tools/mkwindeps.sh
|
||||||
|
ARCHINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}"
|
||||||
|
ARCHXXINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}" -isystem "${shell cygpath -w $(TOPDIR)/include/cxx}"
|
||||||
|
ARCHSCRIPT = -T "${shell cygpath -w $(TOPDIR)/configs/$(CONFIG_ARCH_BOARD)/scripts/ld.script}"
|
||||||
|
else
|
||||||
|
# Linux/Cygwin-native toolchain
|
||||||
|
MKDEP = $(TOPDIR)/tools/mkdeps$(HOSTEXEEXT)
|
||||||
|
ARCHINCLUDES = -I. -isystem $(TOPDIR)/include
|
||||||
|
ARCHXXINCLUDES = -I. -isystem $(TOPDIR)/include -isystem $(TOPDIR)/include/cxx
|
||||||
|
ARCHSCRIPT = -T$(TOPDIR)/configs/$(CONFIG_ARCH_BOARD)/scripts/ld.script
|
||||||
|
endif
|
||||||
|
|
||||||
|
CC = $(CROSSDEV)gcc
|
||||||
|
CXX = $(CROSSDEV)g++
|
||||||
|
CPP = $(CROSSDEV)gcc -E
|
||||||
|
LD = $(CROSSDEV)ld
|
||||||
|
AR = $(CROSSDEV)ar rcs
|
||||||
|
NM = $(CROSSDEV)nm
|
||||||
|
OBJCOPY = $(CROSSDEV)objcopy
|
||||||
|
OBJDUMP = $(CROSSDEV)objdump
|
||||||
|
|
||||||
|
ARCHCCVERSION = ${shell $(CC) -v 2>&1 | sed -n '/^gcc version/p' | sed -e 's/^gcc version \([0-9\.]\)/\1/g' -e 's/[-\ ].*//g' -e '1q'}
|
||||||
|
ARCHCCMAJOR = ${shell echo $(ARCHCCVERSION) | cut -d'.' -f1}
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_DEBUG_SYMBOLS),y)
|
||||||
|
ARCHOPTIMIZATION = -g
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifneq ($(CONFIG_DEBUG_NOOPT),y)
|
||||||
|
ARCHOPTIMIZATION += $(MAXOPTIMIZATION) -fno-strict-aliasing -fno-strength-reduce -fomit-frame-pointer
|
||||||
|
endif
|
||||||
|
|
||||||
|
ARCHCFLAGS = -fno-builtin
|
||||||
|
ARCHCXXFLAGS = -fno-builtin -fno-exceptions -fcheck-new
|
||||||
|
ARCHWARNINGS = -Wall -Wstrict-prototypes -Wshadow -Wundef
|
||||||
|
ARCHWARNINGSXX = -Wall -Wshadow -Wundef
|
||||||
|
ARCHDEFINES =
|
||||||
|
ARCHPICFLAGS = -fpic -msingle-pic-base -mpic-register=r10
|
||||||
|
|
||||||
|
CFLAGS = $(ARCHCFLAGS) $(ARCHWARNINGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRADEFINES) -pipe
|
||||||
|
CPICFLAGS = $(ARCHPICFLAGS) $(CFLAGS)
|
||||||
|
CXXFLAGS = $(ARCHCXXFLAGS) $(ARCHWARNINGSXX) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHXXINCLUDES) $(ARCHDEFINES) $(EXTRADEFINES) -pipe
|
||||||
|
CXXPICFLAGS = $(ARCHPICFLAGS) $(CXXFLAGS)
|
||||||
|
CPPFLAGS = $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRADEFINES)
|
||||||
|
AFLAGS = $(CFLAGS) -D__ASSEMBLY__
|
||||||
|
|
||||||
|
NXFLATLDFLAGS1 = -r -d -warn-common
|
||||||
|
NXFLATLDFLAGS2 = $(NXFLATLDFLAGS1) -T$(TOPDIR)/binfmt/libnxflat/gnu-nxflat-pcrel.ld -no-check-sections
|
||||||
|
LDNXFLATFLAGS = -e main -s 2048
|
||||||
|
|
||||||
|
ASMEXT = .S
|
||||||
|
OBJEXT = .o
|
||||||
|
LIBEXT = .a
|
||||||
|
EXEEXT =
|
||||||
|
|
||||||
|
ifneq ($(CROSSDEV),arm-nuttx-elf-)
|
||||||
|
LDFLAGS += -nostartfiles -nodefaultlibs
|
||||||
|
endif
|
||||||
|
ifeq ($(CONFIG_DEBUG_SYMBOLS),y)
|
||||||
|
LDFLAGS += -g
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
HOSTCC = gcc
|
||||||
|
HOSTINCLUDES = -I.
|
||||||
|
HOSTCFLAGS = -Wall -Wstrict-prototypes -Wshadow -Wundef -g -pipe
|
||||||
|
HOSTLDFLAGS =
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
Executable
+61
@@ -0,0 +1,61 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# configs/twr-k64f120m/nsh/setenv.sh
|
||||||
|
#
|
||||||
|
# Copyright (C) 2011 Gregory Nutt. All rights reserved.
|
||||||
|
# Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions
|
||||||
|
# are met:
|
||||||
|
#
|
||||||
|
# 1. Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# 2. 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.
|
||||||
|
# 3. Neither the name NuttX 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 OWNER 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.
|
||||||
|
#
|
||||||
|
|
||||||
|
if [ "$_" = "$0" ] ; then
|
||||||
|
echo "You must source this script, not run it!" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
WD=`pwd`
|
||||||
|
if [ ! -x "setenv.sh" ]; then
|
||||||
|
echo "This script must be executed from the top-level NuttX build directory"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "${PATH_ORIG}" ]; then
|
||||||
|
export PATH_ORIG="${PATH}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# This is the Cygwin path to the location where I installed the CodeSourcery
|
||||||
|
# toolchain under windows. You will also have to edit this if you install
|
||||||
|
# the CodeSourcery toolchain in any other location
|
||||||
|
#export TOOLCHAIN_BIN="/cygdrive/c/Program Files (x86)/CodeSourcery/Sourcery G++ Lite/bin"
|
||||||
|
|
||||||
|
# This is the Cygwin path to the location where I build the buildroot
|
||||||
|
# toolchain.
|
||||||
|
export TOOLCHAIN_BIN="${WD}/../buildroot/build_arm_nofpu/staging_dir/bin"
|
||||||
|
|
||||||
|
# Add the path to the toolchain to the PATH varialble
|
||||||
|
export PATH="${TOOLCHAIN_BIN}:/sbin:/usr/sbin:${PATH_ORIG}"
|
||||||
|
echo "PATH : ${PATH}"
|
||||||
@@ -0,0 +1,142 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* configs/twr-k64f120m/scripts/ld.script
|
||||||
|
*
|
||||||
|
* Copyright (C) 2011, 2015 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. 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.
|
||||||
|
* 3. Neither the name NuttX 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 OWNER 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* The MK64FN1M0VMD12 has 1MB of FLASH beginning at address 0x0000:0000 and
|
||||||
|
* 256KB of SRAM beginning at address 0x1fff:0000 (SRAM_L 64KB) and 0x2000:0000
|
||||||
|
* (SRAM_U 192KB).
|
||||||
|
*
|
||||||
|
* NOTE: that the first part of the K64 FLASH region is reserved for
|
||||||
|
* interrupt vectflash and, following that, is a region from 0x0000:0400
|
||||||
|
* to 0x0000:040f that is reserved for the FLASH control fields (FCF).
|
||||||
|
*
|
||||||
|
* NOTE: The on-chip RAM is split evenly among SRAM_L and SRAM_U. The RAM is
|
||||||
|
* also implemented such that the SRAM_L and SRAM_U ranges form a
|
||||||
|
* contiguous block in the memory map.
|
||||||
|
*/
|
||||||
|
|
||||||
|
MEMORY
|
||||||
|
{
|
||||||
|
vectflash (rx) : ORIGIN = 0x00000000, LENGTH = 1K
|
||||||
|
cfmprotect (rx) : ORIGIN = 0x00000400, LENGTH = 16
|
||||||
|
progflash (rx) : ORIGIN = 0x00000800, LENGTH = 1M - 2K
|
||||||
|
datasram (rwx) : ORIGIN = 0x1fff0000, LENGTH = 256K
|
||||||
|
}
|
||||||
|
|
||||||
|
OUTPUT_ARCH(arm)
|
||||||
|
ENTRY(_stext)
|
||||||
|
EXTERN(__flashconfigbytes)
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
.vectors : {
|
||||||
|
_svectors = ABSOLUTE(.);
|
||||||
|
*(.vectors)
|
||||||
|
_evectors = ABSOLUTE(.);
|
||||||
|
} > vectflash
|
||||||
|
|
||||||
|
.cfmprotect : {
|
||||||
|
KEEP(*(.cfmconfig))
|
||||||
|
} > cfmprotect
|
||||||
|
|
||||||
|
.text : {
|
||||||
|
_stext = ABSOLUTE(.);
|
||||||
|
*(.text .text.*)
|
||||||
|
*(.fixup)
|
||||||
|
*(.gnu.warning)
|
||||||
|
*(.rodata .rodata.*)
|
||||||
|
*(.gnu.linkonce.t.*)
|
||||||
|
*(.glue_7)
|
||||||
|
*(.glue_7t)
|
||||||
|
*(.got)
|
||||||
|
*(.gcc_except_table)
|
||||||
|
*(.gnu.linkonce.r.*)
|
||||||
|
_etext = ABSOLUTE(.);
|
||||||
|
} > progflash
|
||||||
|
|
||||||
|
.init_section : {
|
||||||
|
_sinit = ABSOLUTE(.);
|
||||||
|
*(.init_array .init_array.*)
|
||||||
|
_einit = ABSOLUTE(.);
|
||||||
|
} > progflash
|
||||||
|
|
||||||
|
.ARM.extab : {
|
||||||
|
*(.ARM.extab*)
|
||||||
|
} > progflash
|
||||||
|
|
||||||
|
__exidx_start = ABSOLUTE(.);
|
||||||
|
.ARM.exidx : {
|
||||||
|
*(.ARM.exidx*)
|
||||||
|
} > progflash
|
||||||
|
__exidx_end = ABSOLUTE(.);
|
||||||
|
|
||||||
|
.data : {
|
||||||
|
_sdata = ABSOLUTE(.);
|
||||||
|
*(.data .data.*)
|
||||||
|
*(.gnu.linkonce.d.*)
|
||||||
|
CONSTRUCTORS
|
||||||
|
_edata = ABSOLUTE(.);
|
||||||
|
} > datasram AT > progflash
|
||||||
|
|
||||||
|
_eronly = LOADADDR(.data);
|
||||||
|
|
||||||
|
.ramfunc ALIGN(4): {
|
||||||
|
_sramfuncs = ABSOLUTE(.);
|
||||||
|
*(.ramfunc .ramfunc.*)
|
||||||
|
_eramfuncs = ABSOLUTE(.);
|
||||||
|
} > datasram AT > progflash
|
||||||
|
|
||||||
|
_framfuncs = LOADADDR(.ramfunc);
|
||||||
|
|
||||||
|
.bss : {
|
||||||
|
_sbss = ABSOLUTE(.);
|
||||||
|
*(.bss .bss.*)
|
||||||
|
*(.gnu.linkonce.b.*)
|
||||||
|
*(COMMON)
|
||||||
|
_ebss = ABSOLUTE(.);
|
||||||
|
} > datasram
|
||||||
|
|
||||||
|
/* Stabs debugging sections. */
|
||||||
|
.stab 0 : { *(.stab) }
|
||||||
|
.stabstr 0 : { *(.stabstr) }
|
||||||
|
.stab.excl 0 : { *(.stab.excl) }
|
||||||
|
.stab.exclstr 0 : { *(.stab.exclstr) }
|
||||||
|
.stab.index 0 : { *(.stab.index) }
|
||||||
|
.stab.indexstr 0 : { *(.stab.indexstr) }
|
||||||
|
.comment 0 : { *(.comment) }
|
||||||
|
.debug_abbrev 0 : { *(.debug_abbrev) }
|
||||||
|
.debug_info 0 : { *(.debug_info) }
|
||||||
|
.debug_line 0 : { *(.debug_line) }
|
||||||
|
.debug_pubnames 0 : { *(.debug_pubnames) }
|
||||||
|
.debug_aranges 0 : { *(.debug_aranges) }
|
||||||
|
}
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
############################################################################
|
||||||
|
# configs/twr-k64f120m/src/Makefile
|
||||||
|
#
|
||||||
|
# Copyright (C) 2011-2012 Gregory Nutt. All rights reserved.
|
||||||
|
# Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions
|
||||||
|
# are met:
|
||||||
|
#
|
||||||
|
# 1. Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# 2. 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.
|
||||||
|
# 3. Neither the name NuttX 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 OWNER 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 $(TOPDIR)/Make.defs
|
||||||
|
|
||||||
|
ASRCS =
|
||||||
|
#CSRCS = k60_boot.c k60_spi.c
|
||||||
|
CSRCS = k64_boot.c
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_ARCH_LEDS),y)
|
||||||
|
CSRCS += k64_leds.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_ARCH_BUTTONS),y)
|
||||||
|
#CSRCS += k60_buttons.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_LIB_BOARDCTL),y)
|
||||||
|
CSRCS += k64_appinit.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_KINETIS_SDHC),y)
|
||||||
|
CSRCS += k64_sdhc.c
|
||||||
|
ifeq ($(CONFIG_FS_AUTOMOUNTER),y)
|
||||||
|
CSRCS += k64_automount.c
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_USBDEV),y)
|
||||||
|
#CSRCS += k60_usbdev.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_USBMSC),y)
|
||||||
|
#CSRCS += k60_usbmsc.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
include $(TOPDIR)/configs/Board.mk
|
||||||
@@ -0,0 +1,132 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* config/twr-k64f120m/src/k64_appinit.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2011, 2016 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. 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.
|
||||||
|
* 3. Neither the name NuttX 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 OWNER 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <syslog.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/mount.h>
|
||||||
|
|
||||||
|
#include <nuttx/board.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_KINETIS_SDHC
|
||||||
|
# include <nuttx/sdio.h>
|
||||||
|
# include <nuttx/mmcsd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "kinetis.h"
|
||||||
|
#include "twrk64.h"
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Pre-processor Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
/* Configuration ************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Types
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: board_app_initialize
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Perform application specific initialization. This function is never
|
||||||
|
* called directly from application code, but only indirectly via the
|
||||||
|
* (non-standard) boardctl() interface using the command BOARDIOC_INIT.
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* arg - The boardctl() argument is passed to the board_app_initialize()
|
||||||
|
* implementation without modification. The argument has no
|
||||||
|
* meaning to NuttX; the meaning of the argument is a contract
|
||||||
|
* between the board-specific initalization logic and the the
|
||||||
|
* matching application logic. The value cold be such things as a
|
||||||
|
* mode enumeration value, a set of DIP switch switch settings, a
|
||||||
|
* pointer to configuration data read from a file or serial FLASH,
|
||||||
|
* or whatever you would like to do with it. Every implementation
|
||||||
|
* should accept zero/NULL as a default configuration.
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* Zero (OK) is returned on success; a negated errno value is returned on
|
||||||
|
* any failure to indicate the nature of the failure.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
int board_app_initialize(uintptr_t arg)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
#ifdef HAVE_PROC
|
||||||
|
/* Mount the proc filesystem */
|
||||||
|
|
||||||
|
syslog(LOG_INFO, "Mounting procfs to /proc\n");
|
||||||
|
|
||||||
|
ret = mount(NULL, PROCFS_MOUNTPOUNT, "procfs", 0, NULL);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
syslog(LOG_ERR,
|
||||||
|
"ERROR: Failed to mount the PROC filesystem: %d (%d)\n",
|
||||||
|
ret, errno);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef HAVE_MMCSD
|
||||||
|
/* Initialize the MMC/SD driver and possible automount */
|
||||||
|
return k64_sdhc_initialize();
|
||||||
|
#endif
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
@@ -0,0 +1,323 @@
|
|||||||
|
/************************************************************************************
|
||||||
|
* configs/twr-k64f120m/src/k64_automount.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2016 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. 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.
|
||||||
|
* 3. Neither the name NuttX 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 OWNER 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.
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Included Files
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
#if defined(CONFIG_FS_AUTOMOUNTER_DEBUG) && !defined(CONFIG_DEBUG_FS)
|
||||||
|
# define CONFIG_DEBUG_FS 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
#include <nuttx/irq.h>
|
||||||
|
#include <nuttx/clock.h>
|
||||||
|
#include <nuttx/fs/automount.h>
|
||||||
|
|
||||||
|
#include "twrk64.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_AUTOMOUNTER
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Pre-processor Definitions
|
||||||
|
************************************************************************************/
|
||||||
|
#if 0
|
||||||
|
#ifndef NULL
|
||||||
|
# define NULL (FAR void *)0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef OK
|
||||||
|
# define OK 0
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Private Types
|
||||||
|
************************************************************************************/
|
||||||
|
/* This structure represents the changeable state of the automounter */
|
||||||
|
|
||||||
|
struct k64_automount_state_s
|
||||||
|
{
|
||||||
|
volatile automount_handler_t handler; /* Upper half handler */
|
||||||
|
FAR void *arg; /* Handler argument */
|
||||||
|
bool enable; /* Fake interrupt enable */
|
||||||
|
bool pending; /* Set if there an event while disabled */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* This structure represents the static configuration of an automounter */
|
||||||
|
|
||||||
|
struct k64_automount_config_s
|
||||||
|
{
|
||||||
|
/* This must be first thing in structure so that we can simply cast from struct
|
||||||
|
* automount_lower_s to struct k64_automount_config_s
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct automount_lower_s lower; /* Publicly visible part */
|
||||||
|
FAR struct k64_automount_state_s *state; /* Changeable state */
|
||||||
|
};
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Private Function Prototypes
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
static int k64_attach(FAR const struct automount_lower_s *lower,
|
||||||
|
automount_handler_t isr, FAR void *arg);
|
||||||
|
static void k64_enable(FAR const struct automount_lower_s *lower, bool enable);
|
||||||
|
static bool k64_inserted(FAR const struct automount_lower_s *lower);
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Private Data
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
static struct k64_automount_state_s g_sdhc_state;
|
||||||
|
static const struct k64_automount_config_s g_sdhc_config =
|
||||||
|
{
|
||||||
|
.lower =
|
||||||
|
{
|
||||||
|
.fstype = CONFIG_TWR_K64F120M_SDHC_AUTOMOUNT_FSTYPE,
|
||||||
|
.blockdev = CONFIG_TWR_K64F120M_SDHC_AUTOMOUNT_BLKDEV,
|
||||||
|
.mountpoint = CONFIG_TWR_K64F120M_SDHC_AUTOMOUNT_MOUNTPOINT,
|
||||||
|
.ddelay = MSEC2TICK(CONFIG_TWR_K64F120M_SDHC_AUTOMOUNT_DDELAY),
|
||||||
|
.udelay = MSEC2TICK(CONFIG_TWR_K64F120M_SDHC_AUTOMOUNT_UDELAY),
|
||||||
|
.attach = k64_attach,
|
||||||
|
.enable = k64_enable,
|
||||||
|
.inserted = k64_inserted
|
||||||
|
},
|
||||||
|
.state = &g_sdhc_state
|
||||||
|
};
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Name: k64_attach
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Attach a new SDHC event handler
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* lower - An instance of the auto-mounter lower half state structure
|
||||||
|
* isr - The new event handler to be attach
|
||||||
|
* arg - Client data to be provided when the event handler is invoked.
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* Always returns OK
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
static int k64_attach(FAR const struct automount_lower_s *lower,
|
||||||
|
automount_handler_t isr, FAR void *arg)
|
||||||
|
{
|
||||||
|
FAR const struct k64_automount_config_s *config;
|
||||||
|
FAR struct k64_automount_state_s *state;
|
||||||
|
|
||||||
|
/* Recover references to our structure */
|
||||||
|
|
||||||
|
config = (FAR struct k64_automount_config_s *)lower;
|
||||||
|
DEBUGASSERT(config != NULL && config->state != NULL);
|
||||||
|
|
||||||
|
state = config->state;
|
||||||
|
|
||||||
|
/* Save the new handler info (clearing the handler first to eliminate race
|
||||||
|
* conditions).
|
||||||
|
*/
|
||||||
|
|
||||||
|
state->handler = NULL;
|
||||||
|
state->pending = false;
|
||||||
|
state->arg = arg;
|
||||||
|
state->handler = isr;
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Name: k64_enable
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Enable card insertion/removal event detection
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* lower - An instance of the auto-mounter lower half state structure
|
||||||
|
* enable - True: enable event detection; False: disable
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* None
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
static void k64_enable(FAR const struct automount_lower_s *lower, bool enable)
|
||||||
|
{
|
||||||
|
FAR const struct k64_automount_config_s *config;
|
||||||
|
FAR struct k64_automount_state_s *state;
|
||||||
|
irqstate_t flags;
|
||||||
|
|
||||||
|
/* Recover references to our structure */
|
||||||
|
|
||||||
|
config = (FAR struct k64_automount_config_s *)lower;
|
||||||
|
DEBUGASSERT(config != NULL && config->state != NULL);
|
||||||
|
|
||||||
|
state = config->state;
|
||||||
|
|
||||||
|
/* Save the fake enable setting */
|
||||||
|
|
||||||
|
flags = enter_critical_section();
|
||||||
|
state->enable = enable;
|
||||||
|
|
||||||
|
/* Did an interrupt occur while interrupts were disabled? */
|
||||||
|
|
||||||
|
if (enable && state->pending)
|
||||||
|
{
|
||||||
|
/* Yes.. perform the fake interrupt if the interrutp is attached */
|
||||||
|
|
||||||
|
if (state->handler)
|
||||||
|
{
|
||||||
|
bool inserted = k64_cardinserted();
|
||||||
|
(void)state->handler(&config->lower, state->arg, inserted);
|
||||||
|
}
|
||||||
|
|
||||||
|
state->pending = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
leave_critical_section(flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Name: k64_inserted
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Check if a card is inserted into the slot.
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* lower - An instance of the auto-mounter lower half state structure
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* True if the card is inserted; False otherwise
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
static bool k64_inserted(FAR const struct automount_lower_s *lower)
|
||||||
|
{
|
||||||
|
return k64_cardinserted();
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Name: k64_automount_initialize
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Configure auto-mounters for each enable and so configured SDHC
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* None
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* None
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
void k64_automount_initialize(void)
|
||||||
|
{
|
||||||
|
FAR void *handle;
|
||||||
|
|
||||||
|
finfo("Initializing automounter(s)\n");
|
||||||
|
|
||||||
|
/* Initialize the SDHC0 auto-mounter */
|
||||||
|
|
||||||
|
handle = automount_initialize(&g_sdhc_config.lower);
|
||||||
|
if (!handle)
|
||||||
|
{
|
||||||
|
ferr("ERROR: Failed to initialize auto-mounter for SDHC0\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Name: k64_automount_event
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* The SDHC card detection logic has detected an insertion or removal event. It
|
||||||
|
* has already scheduled the MMC/SD block driver operations. Now we need to
|
||||||
|
* schedule the auto-mount event which will occur with a substantial delay to make
|
||||||
|
* sure that everything has settle down.
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* slotno - Identifies the SDHC0 slot: SDHC0_SLOTNO or SDHC1_SLOTNO. There is a
|
||||||
|
* terminology problem here: Each SDHC supports two slots, slot A and slot B.
|
||||||
|
* Only slot A is used. So this is not a really a slot, but an HSCMI peripheral
|
||||||
|
* number.
|
||||||
|
* inserted - True if the card is inserted in the slot. False otherwise.
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* None
|
||||||
|
*
|
||||||
|
* Assumptions:
|
||||||
|
* Interrupts are disabled.
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
void k64_automount_event(bool inserted)
|
||||||
|
{
|
||||||
|
FAR const struct k64_automount_config_s *config = &g_sdhc_config;
|
||||||
|
FAR struct k64_automount_state_s *state = &g_sdhc_state;
|
||||||
|
|
||||||
|
/* Is the auto-mounter interrupt attached? */
|
||||||
|
|
||||||
|
if (state->handler)
|
||||||
|
{
|
||||||
|
/* Yes.. Have we been asked to hold off interrupts? */
|
||||||
|
|
||||||
|
if (!state->enable)
|
||||||
|
{
|
||||||
|
/* Yes.. just remember the there is a pending interrupt. We will
|
||||||
|
* deliver the interrupt when interrupts are "re-enabled."
|
||||||
|
*/
|
||||||
|
|
||||||
|
state->pending = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* No.. forward the event to the handler */
|
||||||
|
|
||||||
|
(void)state->handler(&config->lower, state->arg, inserted);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* HAVE_AUTOMOUNTER */
|
||||||
@@ -0,0 +1,102 @@
|
|||||||
|
/************************************************************************************
|
||||||
|
* configs/twr-k64f120m/src/k64_boot.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2011, 2015 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. 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.
|
||||||
|
* 3. Neither the name NuttX 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 OWNER 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.
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Included Files
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
#include <nuttx/board.h>
|
||||||
|
#include <arch/board/board.h>
|
||||||
|
|
||||||
|
#include "up_arch.h"
|
||||||
|
#include "twrk64.h"
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Pre-processor Definitions
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Name: kinetis_boardinitialize
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* All Kinetis architectures must provide the following entry point. This entry
|
||||||
|
* point is called early in the initialization -- after all memory has been
|
||||||
|
* configured and mapped but before any devices have been initialized.
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
void kinetis_boardinitialize(void)
|
||||||
|
{
|
||||||
|
/* Configure SPI chip selects if 1) SPI is not disabled, and 2) the weak function
|
||||||
|
* kinetis_spidev_initialize() has been brought into the link.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(CONFIG_KINETIS_SPI1) || defined(CONFIG_KINETIS_SPI2)
|
||||||
|
if (kinetis_spidev_initialize)
|
||||||
|
{
|
||||||
|
kinetis_spidev_initialize();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Initialize USB is 1) USBDEV is selected, 2) the USB controller is not
|
||||||
|
* disabled, and 3) the weak function kinetis_usbinitialize() has been brought
|
||||||
|
* into the build.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(CONFIG_USBDEV) && defined(CONFIG_KINETIS_USB)
|
||||||
|
if (kinetis_usbinitialize)
|
||||||
|
{
|
||||||
|
kinetis_usbinitialize();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Configure on-board LEDs if LED support has been selected. */
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARCH_LEDS
|
||||||
|
board_autoled_initialize();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
@@ -0,0 +1,249 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* configs/twr-k64f120m/src/k64_leds.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2011, 2013, 2015 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. 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.
|
||||||
|
* 3. Neither the name NuttX 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 OWNER 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
#include <nuttx/board.h>
|
||||||
|
|
||||||
|
#include "kinetis.h"
|
||||||
|
#include "twrk64.h"
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Pre-processor Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
/* The TWR-K64F120M has four LEDs:
|
||||||
|
*
|
||||||
|
* 1. D5 / Green LED PTE6
|
||||||
|
* 2. D6 / Yellow LED PTE7
|
||||||
|
* 3. D7 / Orange LED PTE8
|
||||||
|
* 4 D9 / Blue LED PTE9
|
||||||
|
*
|
||||||
|
* LED4 is reservered for user.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* The following definitions map the encoded LED setting to GPIO settings */
|
||||||
|
|
||||||
|
#define K64_LED1 (1 << 0)
|
||||||
|
#define K64_LED2 (1 << 1)
|
||||||
|
#define K64_LED3 (1 << 2)
|
||||||
|
// #define K64_LED4 (1 << 3)
|
||||||
|
|
||||||
|
#define ON_SETBITS_SHIFT (0)
|
||||||
|
#define ON_CLRBITS_SHIFT (4)
|
||||||
|
#define OFF_SETBITS_SHIFT (8)
|
||||||
|
#define OFF_CLRBITS_SHIFT (12)
|
||||||
|
|
||||||
|
#define ON_BITS(v) ((v) & 0xff)
|
||||||
|
#define OFF_BITS(v) (((v) >> 8) & 0x0ff)
|
||||||
|
#define SETBITS(b) ((b) & 0x0f)
|
||||||
|
#define CLRBITS(b) (((b) >> 4) & 0x0f)
|
||||||
|
|
||||||
|
#define ON_SETBITS(v) (SETBITS(ON_BITS(v))
|
||||||
|
#define ON_CLRBITS(v) (CLRBITS(ON_BITS(v))
|
||||||
|
#define OFF_SETBITS(v) (SETBITS(OFF_BITS(v))
|
||||||
|
#define OFF_CLRBITS(v) (CLRBITS(OFF_BITS(v))
|
||||||
|
|
||||||
|
#define LED_STARTED_ON_SETBITS (0 << ON_SETBITS_SHIFT)
|
||||||
|
#define LED_STARTED_ON_CLRBITS (0 << ON_CLRBITS_SHIFT)
|
||||||
|
#define LED_STARTED_OFF_SETBITS (0 << OFF_SETBITS_SHIFT)
|
||||||
|
#define LED_STARTED_OFF_CLRBITS (0 << OFF_CLRBITS_SHIFT)
|
||||||
|
|
||||||
|
#define LED_HEAPALLOCATE_ON_SETBITS (0 << ON_SETBITS_SHIFT)
|
||||||
|
#define LED_HEAPALLOCATE_ON_CLRBITS (0 << ON_CLRBITS_SHIFT)
|
||||||
|
#define LED_HEAPALLOCATE_OFF_SETBITS (0 << OFF_SETBITS_SHIFT)
|
||||||
|
#define LED_HEAPALLOCATE_OFF_CLRBITS (0 << OFF_CLRBITS_SHIFT)
|
||||||
|
|
||||||
|
#define LED_IRQSENABLED_ON_SETBITS (0 << ON_SETBITS_SHIFT)
|
||||||
|
#define LED_IRQSENABLED_ON_CLRBITS (0 << ON_CLRBITS_SHIFT)
|
||||||
|
#define LED_IRQSENABLED_OFF_SETBITS (0 << OFF_SETBITS_SHIFT)
|
||||||
|
#define LED_IRQSENABLED_OFF_CLRBITS (0 << OFF_CLRBITS_SHIFT)
|
||||||
|
|
||||||
|
#define LED_STACKCREATED_ON_SETBITS (K64_LED1 << ON_SETBITS_SHIFT)
|
||||||
|
#define LED_STACKCREATED_ON_CLRBITS (0 << ON_CLRBITS_SHIFT)
|
||||||
|
#define LED_STACKCREATED_OFF_SETBITS (0 << OFF_SETBITS_SHIFT)
|
||||||
|
#define LED_STACKCREATED_OFF_CLRBITS (0 << OFF_CLRBITS_SHIFT)
|
||||||
|
|
||||||
|
#define LED_INIRQ_ON_SETBITS (K64_LED2 << ON_SETBITS_SHIFT)
|
||||||
|
#define LED_INIRQ_ON_CLRBITS (0 << ON_CLRBITS_SHIFT)
|
||||||
|
#define LED_INIRQ_OFF_SETBITS (0 << OFF_SETBITS_SHIFT)
|
||||||
|
#define LED_INIRQ_OFF_CLRBITS (K64_LED2 << OFF_CLRBITS_SHIFT)
|
||||||
|
|
||||||
|
#define LED_SIGNAL_ON_SETBITS (K64_LED3 << ON_SETBITS_SHIFT)
|
||||||
|
#define LED_SIGNAL_ON_CLRBITS (0 << ON_CLRBITS_SHIFT)
|
||||||
|
#define LED_SIGNAL_OFF_SETBITS (0 << OFF_SETBITS_SHIFT)
|
||||||
|
#define LED_SIGNAL_OFF_CLRBITS (K64_LED3 << OFF_CLRBITS_SHIFT)
|
||||||
|
|
||||||
|
#define LED_ASSERTION_ON_SETBITS ((K64_LED1|K64_LED2|K64_LED3) << ON_SETBITS_SHIFT)
|
||||||
|
#define LED_ASSERTION_ON_CLRBITS (0 << ON_CLRBITS_SHIFT)
|
||||||
|
#define LED_ASSERTION_OFF_SETBITS (0 << OFF_SETBITS_SHIFT)
|
||||||
|
#define LED_ASSERTION_OFF_CLRBITS (0 << OFF_CLRBITS_SHIFT)
|
||||||
|
|
||||||
|
#define LED_PANIC_ON_SETBITS (K64_LED1 << ON_SETBITS_SHIFT)
|
||||||
|
#define LED_PANIC_ON_CLRBITS (0 << ON_CLRBITS_SHIFT)
|
||||||
|
#define LED_PANIC_OFF_SETBITS (0 << OFF_SETBITS_SHIFT)
|
||||||
|
#define LED_PANIC_OFF_CLRBITS (K64_LED1 << OFF_CLRBITS_SHIFT)
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static const uint16_t g_ledbits[8] =
|
||||||
|
{
|
||||||
|
(LED_STARTED_ON_SETBITS | LED_STARTED_ON_CLRBITS |
|
||||||
|
LED_STARTED_OFF_SETBITS | LED_STARTED_OFF_CLRBITS),
|
||||||
|
|
||||||
|
(LED_HEAPALLOCATE_ON_SETBITS | LED_HEAPALLOCATE_ON_CLRBITS |
|
||||||
|
LED_HEAPALLOCATE_OFF_SETBITS | LED_HEAPALLOCATE_OFF_CLRBITS),
|
||||||
|
|
||||||
|
(LED_IRQSENABLED_ON_SETBITS | LED_IRQSENABLED_ON_CLRBITS |
|
||||||
|
LED_IRQSENABLED_OFF_SETBITS | LED_IRQSENABLED_OFF_CLRBITS),
|
||||||
|
|
||||||
|
(LED_STACKCREATED_ON_SETBITS | LED_STACKCREATED_ON_CLRBITS |
|
||||||
|
LED_STACKCREATED_OFF_SETBITS | LED_STACKCREATED_OFF_CLRBITS),
|
||||||
|
|
||||||
|
(LED_INIRQ_ON_SETBITS | LED_INIRQ_ON_CLRBITS |
|
||||||
|
LED_INIRQ_OFF_SETBITS | LED_INIRQ_OFF_CLRBITS),
|
||||||
|
|
||||||
|
(LED_SIGNAL_ON_SETBITS | LED_SIGNAL_ON_CLRBITS |
|
||||||
|
LED_SIGNAL_OFF_SETBITS | LED_SIGNAL_OFF_CLRBITS),
|
||||||
|
|
||||||
|
(LED_ASSERTION_ON_SETBITS | LED_ASSERTION_ON_CLRBITS |
|
||||||
|
LED_ASSERTION_OFF_SETBITS | LED_ASSERTION_OFF_CLRBITS),
|
||||||
|
|
||||||
|
(LED_PANIC_ON_SETBITS | LED_PANIC_ON_CLRBITS |
|
||||||
|
LED_PANIC_OFF_SETBITS | LED_PANIC_OFF_CLRBITS)
|
||||||
|
};
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static inline void led_clrbits(unsigned int clrbits)
|
||||||
|
{
|
||||||
|
if ((clrbits & K64_LED1) != 0)
|
||||||
|
{
|
||||||
|
kinetis_gpiowrite(GPIO_LED1, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((clrbits & K64_LED2) != 0)
|
||||||
|
{
|
||||||
|
kinetis_gpiowrite(GPIO_LED2, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((clrbits & K64_LED3) != 0)
|
||||||
|
{
|
||||||
|
kinetis_gpiowrite(GPIO_LED3, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void led_setbits(unsigned int setbits)
|
||||||
|
{
|
||||||
|
if ((setbits & K64_LED1) != 0)
|
||||||
|
{
|
||||||
|
kinetis_gpiowrite(GPIO_LED1, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((setbits & K64_LED2) != 0)
|
||||||
|
{
|
||||||
|
kinetis_gpiowrite(GPIO_LED2, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((setbits & K64_LED3) != 0)
|
||||||
|
{
|
||||||
|
kinetis_gpiowrite(GPIO_LED3, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void led_setonoff(unsigned int bits)
|
||||||
|
{
|
||||||
|
led_clrbits(CLRBITS(bits));
|
||||||
|
led_setbits(SETBITS(bits));
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: board_autoled_initialize
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Initialize LED GPIOs so that LEDs can be controlled.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARCH_LEDS
|
||||||
|
void board_autoled_initialize(void)
|
||||||
|
{
|
||||||
|
/* Configure LED1-3 GPIOs for output */
|
||||||
|
|
||||||
|
kinetis_pinconfig(GPIO_LED1);
|
||||||
|
kinetis_pinconfig(GPIO_LED2);
|
||||||
|
kinetis_pinconfig(GPIO_LED3);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: board_autoled_on
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Puts on the relevants LEDs for one of the LED_condition (see board.h)
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void board_autoled_on(int led)
|
||||||
|
{
|
||||||
|
led_setonoff(ON_BITS(g_ledbits[led]));
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: board_autoled_off
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Puts off the relevants LEDs for one of the LED_condition (see board.h)
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void board_autoled_off(int led)
|
||||||
|
{
|
||||||
|
led_setonoff(OFF_BITS(g_ledbits[led]));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_ARCH_LEDS */
|
||||||
@@ -0,0 +1,258 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* config/twr-k64f120m/src/k64_sdhc.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2016 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. 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.
|
||||||
|
* 3. Neither the name NuttX 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 OWNER 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* A micro Secure Digital (SD) card slot is available on the FRDM-K64F connected to
|
||||||
|
* the SD Host Controller (SDHC) signals of the MCU. This slot will accept micro
|
||||||
|
* format SD memory cards. The SD card detect pin (PTE6) is an open switch that
|
||||||
|
* shorts with VDD when card is inserted.
|
||||||
|
*
|
||||||
|
* ------------ ------------- --------
|
||||||
|
* SD Card Slot Board Signal K64F Pin
|
||||||
|
* ------------ ------------- --------
|
||||||
|
* DAT0 SDHC0_D0 PTE0
|
||||||
|
* DAT1 SDHC0_D1 PTE1
|
||||||
|
* DAT2 SDHC0_D2 PTE5
|
||||||
|
* CD/DAT3 SDHC0_D3 PTE4
|
||||||
|
* CMD SDHC0_CMD PTE3
|
||||||
|
* CLK SDHC0_DCLK PTE2
|
||||||
|
* SWITCH D_CARD_DETECT PTE6
|
||||||
|
* ------------ ------------- --------
|
||||||
|
*
|
||||||
|
* There is no Write Protect pin available to the K64F.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <debug.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
#include <nuttx/sdio.h>
|
||||||
|
#include <nuttx/mmcsd.h>
|
||||||
|
|
||||||
|
#include "kinetis.h"
|
||||||
|
|
||||||
|
#include "twrk64.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef HAVE_MMCSD
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Pre-processor Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Types
|
||||||
|
****************************************************************************/
|
||||||
|
/* This structure holds static information unique to one SDHC peripheral */
|
||||||
|
|
||||||
|
struct k64_sdhc_state_s
|
||||||
|
{
|
||||||
|
struct sdio_dev_s *sdhc; /* R/W device handle */
|
||||||
|
bool inserted; /* TRUE: card is inserted */
|
||||||
|
};
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* HSCMI device state */
|
||||||
|
|
||||||
|
static struct k64_sdhc_state_s g_sdhc;
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: k64_mediachange
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static void k64_mediachange(void)
|
||||||
|
{
|
||||||
|
bool inserted;
|
||||||
|
|
||||||
|
/* Get the current value of the card detect pin. This pin is pulled up on
|
||||||
|
* board. So low means that a card is present.
|
||||||
|
*/
|
||||||
|
|
||||||
|
inserted = !kinetis_gpioread(GPIO_SD_CARDDETECT);
|
||||||
|
mcinfo("inserted: %s\n", inserted ? "Yes" : "No");
|
||||||
|
|
||||||
|
/* Has the pin changed state? */
|
||||||
|
|
||||||
|
if (inserted != g_sdhc.inserted)
|
||||||
|
{
|
||||||
|
mcinfo("Media change: %d->%d\n", g_sdhc.inserted, inserted);
|
||||||
|
|
||||||
|
/* Yes.. perform the appropriate action (this might need some debounce). */
|
||||||
|
|
||||||
|
g_sdhc.inserted = inserted;
|
||||||
|
sdhc_mediachange(g_sdhc.sdhc, inserted);
|
||||||
|
|
||||||
|
#ifdef CONFIG_TWR_K64F120M_SDHC_AUTOMOUNT
|
||||||
|
/* Let the automounter know about the insertion event */
|
||||||
|
|
||||||
|
k64_automount_event(k64_cardinserted());
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: k64_cdinterrupt
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static int k64_cdinterrupt(int irq, FAR void *context)
|
||||||
|
{
|
||||||
|
/* All of the work is done by k64_mediachange() */
|
||||||
|
|
||||||
|
k64_mediachange();
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: k64_sdhc_initialize
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Inititialize the SDHC SD card slot
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
int k64_sdhc_initialize(void)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
/* Configure GPIO pins */
|
||||||
|
|
||||||
|
kinetis_pinconfig(GPIO_SD_CARDDETECT);
|
||||||
|
|
||||||
|
/* Attached the card detect interrupt (but don't enable it yet) */
|
||||||
|
|
||||||
|
kinetis_pinirqattach(GPIO_SD_CARDDETECT, k64_cdinterrupt);
|
||||||
|
|
||||||
|
/* Configure the write protect GPIO -- None */
|
||||||
|
|
||||||
|
/* Mount the SDHC-based MMC/SD block driver */
|
||||||
|
/* First, get an instance of the SDHC interface */
|
||||||
|
|
||||||
|
mcinfo("Initializing SDHC slot %d\n", MMCSD_SLOTNO);
|
||||||
|
|
||||||
|
g_sdhc.sdhc = sdhc_initialize(MMCSD_SLOTNO);
|
||||||
|
if (!g_sdhc.sdhc)
|
||||||
|
{
|
||||||
|
mcerr("ERROR: Failed to initialize SDHC slot %d\n", MMCSD_SLOTNO);
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now bind the SDHC interface to the MMC/SD driver */
|
||||||
|
|
||||||
|
mcinfo("Bind SDHC to the MMC/SD driver, minor=%d\n", MMSCD_MINOR);
|
||||||
|
|
||||||
|
ret = mmcsd_slotinitialize(MMSCD_MINOR, g_sdhc.sdhc);
|
||||||
|
if (ret != OK)
|
||||||
|
{
|
||||||
|
syslog(LOG_ERR, "ERROR: Failed to bind SDHC to the MMC/SD driver: %d\n", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
syslog(LOG_INFO, "Successfully bound SDHC to the MMC/SD driver\n");
|
||||||
|
|
||||||
|
/* Handle the initial card state */
|
||||||
|
|
||||||
|
k64_mediachange();
|
||||||
|
|
||||||
|
/* Enable CD interrupts to handle subsequent media changes */
|
||||||
|
|
||||||
|
kinetis_pinirqenable(GPIO_SD_CARDDETECT);
|
||||||
|
|
||||||
|
/* Initialize automount system if configured */
|
||||||
|
#ifdef CONFIG_TWR_K64F120M_SDHC_AUTOMOUNT
|
||||||
|
k64_automount_initialize();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: k64_cardinserted
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Check if a card is inserted into the SDHC slot
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef HAVE_AUTOMOUNTER
|
||||||
|
bool k64_cardinserted(void)
|
||||||
|
{
|
||||||
|
bool inserted;
|
||||||
|
|
||||||
|
/* Get the current value of the card detect pin. This pin is pulled up on
|
||||||
|
* board. So low means that a card is present.
|
||||||
|
*/
|
||||||
|
|
||||||
|
inserted = !kinetis_gpioread(GPIO_SD_CARDDETECT);
|
||||||
|
mcinfo("inserted: %s\n", inserted ? "Yes" : "No");
|
||||||
|
return inserted;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: k64_writeprotected
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Check if a card is inserted into the SDHC slot
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef HAVE_AUTOMOUNTER
|
||||||
|
bool k64_writeprotected(void)
|
||||||
|
{
|
||||||
|
/* There are no write protect pins */
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* HAVE_MMCSD */
|
||||||
@@ -0,0 +1,392 @@
|
|||||||
|
/************************************************************************************
|
||||||
|
* configs/twr-k64f120m/src/twrk64.h
|
||||||
|
*
|
||||||
|
* Copyright (C) 2017 Gregory Nutt. All rights reserved.
|
||||||
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
|
* Marc Rechte <marc4@rechte.fr>
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. 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.
|
||||||
|
* 3. Neither the name NuttX 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 OWNER 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.
|
||||||
|
*
|
||||||
|
* This header file is only accessible from the src directory.
|
||||||
|
* For /arch/arm/src accessibilty use ../include/board.h instead.
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
#ifndef __CONFIGS_TWR_K64F120M_SRC_TWRK64_H
|
||||||
|
#define __CONFIGS_TWR_K64F120M_SRC_TWRK64_H
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Included Files
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
#include <nuttx/compiler.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <arch/kinetis/chip.h>
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Pre-processor Definitions
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
/* Assume we have everything */
|
||||||
|
|
||||||
|
#define HAVE_PROC 1
|
||||||
|
#define HAVE_MMCSD 1
|
||||||
|
#define HAVE_AUTOMOUNTER 1
|
||||||
|
#define HAVE_USBDEV 1
|
||||||
|
|
||||||
|
#if defined(CONFIG_KINETIS_RTC)
|
||||||
|
#define HAVE_RTC_DRIVER 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Automount procfs */
|
||||||
|
|
||||||
|
#if !defined(CONFIG_FS_PROCFS)
|
||||||
|
# undef HAVE_PROC
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(HAVE_PROC) && defined(CONFIG_DISABLE_MOUNTPOINT)
|
||||||
|
# warning Mountpoints disabled. No procfs support
|
||||||
|
# undef HAVE_PROC
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_NSH_PROC_MOUNTPOINT)
|
||||||
|
# define PROCFS_MOUNTPOUNT CONFIG_NSH_PROC_MOUNTPOINT
|
||||||
|
#else
|
||||||
|
# define PROCFS_MOUNTPOUNT "/proc"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* SD card support */
|
||||||
|
|
||||||
|
#define MMCSD_SLOTNO 0
|
||||||
|
|
||||||
|
/* Can't support MMC/SD features if mountpoints are disabled or if SDHC support
|
||||||
|
* is not enabled.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(CONFIG_DISABLE_MOUNTPOINT) || !defined(CONFIG_KINETIS_SDHC)
|
||||||
|
# undef HAVE_MMCSD
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_MMCSD
|
||||||
|
# if defined(CONFIG_NSH_MMCSDSLOTNO) && CONFIG_NSH_MMCSDSLOTNO != 0
|
||||||
|
# error Only one MMC/SD slot, slot 0
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifdef CONFIG_NSH_MMCSDMINOR
|
||||||
|
# define MMSCD_MINOR CONFIG_NSH_MMCSDMINOR
|
||||||
|
# else
|
||||||
|
# define MMSCD_MINOR 0
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* We expect to receive GPIO interrupts for card insertion events */
|
||||||
|
|
||||||
|
# ifndef CONFIG_KINETIS_GPIOIRQ
|
||||||
|
# error "CONFIG_KINETIS_GPIOIRQ required for card detect interrupt"
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef CONFIG_KINETIS_PORTBINTS
|
||||||
|
# error "CONFIG_KINETIS_PORTBINTS required for card detect interrupt"
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Automounter */
|
||||||
|
|
||||||
|
#if !defined(CONFIG_FS_AUTOMOUNTER) || !defined(HAVE_MMCSD)
|
||||||
|
# undef HAVE_AUTOMOUNTER
|
||||||
|
# undef CONFIG_TWR_K64F120M_SDHC_AUTOMOUNT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CONFIG_TWR_K64F120M_SDHC_AUTOMOUNT
|
||||||
|
# undef HAVE_AUTOMOUNTER
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Automounter defaults */
|
||||||
|
|
||||||
|
#ifdef HAVE_AUTOMOUNTER
|
||||||
|
|
||||||
|
# ifndef CONFIG_TWR_K64F120M_SDHC_AUTOMOUNT_FSTYPE
|
||||||
|
# define CONFIG_TWR_K64F120M_SDHC_AUTOMOUNT_FSTYPE "vfat"
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef CONFIG_TWR_K64F120M_SDHC_AUTOMOUNT_BLKDEV
|
||||||
|
# define CONFIG_TWR_K64F120M_SDHC_AUTOMOUNT_BLKDEV "/dev/mmcds0"
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef CONFIG_TWR_K64F120M_SDHC_AUTOMOUNT_MOUNTPOINT
|
||||||
|
# define CONFIG_TWR_K64F120M_SDHC_AUTOMOUNT_MOUNTPOINT "/mnt/sdcard"
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef CONFIG_TWR_K64F120M_SDHC_AUTOMOUNT_DDELAY
|
||||||
|
# define CONFIG_TWR_K64F120M_SDHC_AUTOMOUNT_DDELAY 1000
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef CONFIG_TWR_K64F120M_SDHC_AUTOMOUNT_UDELAY
|
||||||
|
# define CONFIG_TWR_K64F120M_SDHC_AUTOMOUNT_UDELAY 2000
|
||||||
|
# endif
|
||||||
|
#endif /* HAVE_AUTOMOUNTER */
|
||||||
|
|
||||||
|
/* Can't support USB features if USB is not enabled */
|
||||||
|
|
||||||
|
#ifndef CONFIG_USBDEV
|
||||||
|
# undef HAVE_USBDEV
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* How many SPI modules does this chip support? The LM3S6918 supports 2 SPI
|
||||||
|
* modules (others may support more -- in such case, the following must be
|
||||||
|
* expanded).
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if KINETIS_NSPI < 1
|
||||||
|
# undef CONFIG_KINETIS_SPI1
|
||||||
|
# undef CONFIG_KINETIS_SPI2
|
||||||
|
#elif KINETIS_NSPI < 2
|
||||||
|
# undef CONFIG_KINETIS_SPI2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Button definitions ***************************************************************/
|
||||||
|
/* The TWR-K64F120M has 2 user buttons (plus a reset button):
|
||||||
|
*
|
||||||
|
* 1. SW1 (IRQ?) PTC6
|
||||||
|
* 2. SW3 (IRQ?) PTA4
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define BUTTON_SW1 0
|
||||||
|
#define BUTTON_SW3 1
|
||||||
|
|
||||||
|
#define BUTTON_SW1_BIT (1 << BUTTON_SW1)
|
||||||
|
#define BUTTON_SW3_BIT (1 << BUTTON_SW3)
|
||||||
|
|
||||||
|
/* Alternative pin resolution *******************************************************/
|
||||||
|
/* If there are alternative configurations for various pins in the
|
||||||
|
* kinetis_k64pinmux.h header file, those alternative pins will be labeled with a
|
||||||
|
* suffix like _1, _2, etc. The logic in this file must select the correct pin
|
||||||
|
* configuration for the board by defining a pin configuration (with no suffix) that
|
||||||
|
* maps to the correct alternative.
|
||||||
|
* Please refer to board README for pin explanation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
#define PIN_I2C0_SDA PIN_I2C0_SDA_3
|
||||||
|
#define PIN_I2C0_SCL PIN_I2C0_SCL_3
|
||||||
|
|
||||||
|
/* Connections via the General Purpose Tower Plug-in (TWRPI) Socket
|
||||||
|
TODO See README
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define PIN_SPI2_SIN PIN_SPI2_SIN_2
|
||||||
|
#define PIN_SPI2_SOUT PIN_SPI2_SOUT_2
|
||||||
|
#define PIN_SPI2_SCK PIN_SPI2_SCK_2
|
||||||
|
|
||||||
|
/* Connections via the Tower Primary Connector Side A
|
||||||
|
TODO See README
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* PTE 26/27 */
|
||||||
|
|
||||||
|
#define PIN_UART3_RX PIN_UART3_RX_2
|
||||||
|
#define PIN_UART3_TX PIN_UART3_TX_2
|
||||||
|
|
||||||
|
/* PTE 24/25 */
|
||||||
|
|
||||||
|
#define PIN_UART4_RX PIN_UART4_RX_2
|
||||||
|
#define PIN_UART4_TX PIN_UART4_TX_2
|
||||||
|
|
||||||
|
/* Connections via the Tower Primary Connector Side B
|
||||||
|
TODO See README
|
||||||
|
*/
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* SDHC
|
||||||
|
important notice: on TWR-K64F120M, R521 (close to the SD card holder) is not placed,
|
||||||
|
hence WRPROTEC is always ON. Either place a 4.7KOhm resistor or change PIN config
|
||||||
|
to PULLDOWN, loosing Write Protect function */
|
||||||
|
|
||||||
|
#define GPIO_SD_CARDDETECT (GPIO_PULLUP | PIN_INT_BOTH | PIN_PORTB | PIN20)
|
||||||
|
#define GPIO_SD_WRPROTECT (GPIO_PULLUP | PIN_PORTB | PIN21)
|
||||||
|
|
||||||
|
/* SW */
|
||||||
|
|
||||||
|
#define GPIO_SW1 (GPIO_PULLUP | PIN_INT_BOTH | PIN_PORTC | PIN6)
|
||||||
|
#define GPIO_SW3 (GPIO_PULLUP | PIN_INT_BOTH | PIN_PORTA | PIN4)
|
||||||
|
|
||||||
|
/* LEDs. Note that LED1-3 are used by system, LED4 is for user defined apps. */
|
||||||
|
|
||||||
|
#define GPIO_LED1 (GPIO_LOWDRIVE | GPIO_OUTPUT_ZER0 | PIN_PORTE | PIN6)
|
||||||
|
#define GPIO_LED2 (GPIO_LOWDRIVE | GPIO_OUTPUT_ZER0 | PIN_PORTE | PIN7)
|
||||||
|
#define GPIO_LED3 (GPIO_LOWDRIVE | GPIO_OUTPUT_ZER0 | PIN_PORTE | PIN8)
|
||||||
|
#define GPIO_LED4 (GPIO_LOWDRIVE | GPIO_OUTPUT_ZER0 | PIN_PORTE | PIN9)
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Public Types
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Public data
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Name: k64_spidev_initialize
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Called to configure SPI chip select GPIO pins for the TWR-K64F120M board.
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
void weak_function k64_spidev_initialize(void);
|
||||||
|
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Name: k64_usbinitialize
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Called to setup USB-related GPIO pins for the TWR-K64F120M board.
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
void weak_function k64_usbinitialize(void);
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Name: k64_bringup
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Bring up board features
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
#if defined(CONFIG_LIB_BOARDCTL) || defined(CONFIG_BOARD_INITIALIZE)
|
||||||
|
int k64_bringup(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: k64_sdhc_initialize
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Inititialize the SDHC SD card slot
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef HAVE_MMCSD
|
||||||
|
int k64_sdhc_initialize(void);
|
||||||
|
#else
|
||||||
|
# define k64_sdhc_initialize() (OK)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Name: k64_cardinserted
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Check if a card is inserted into the SDHC slot
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
#ifdef HAVE_AUTOMOUNTER
|
||||||
|
bool k64_cardinserted(void);
|
||||||
|
#else
|
||||||
|
# define k64_cardinserted() (false)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Name: k64_writeprotected
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Check if the card in the MMC/SD slot is write protected
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
#ifdef HAVE_AUTOMOUNTER
|
||||||
|
bool k64_writeprotected(void);
|
||||||
|
#else
|
||||||
|
# define k64_writeprotected() (false)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Name: k64_automount_initialize
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Configure auto-mounter for the configured SDHC slot
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* None
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* None
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
#ifdef HAVE_AUTOMOUNTER
|
||||||
|
void k64_automount_initialize(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Name: k64_automount_event
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* The SDHC card detection logic has detected an insertion or removal event. It
|
||||||
|
* has already scheduled the MMC/SD block driver operations. Now we need to
|
||||||
|
* schedule the auto-mount event which will occur with a substantial delay to make
|
||||||
|
* sure that everything has settle down.
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* inserted - True if the card is inserted in the slot. False otherwise.
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* None
|
||||||
|
*
|
||||||
|
* Assumptions:
|
||||||
|
* Interrupts are disabled.
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
#ifdef HAVE_AUTOMOUNTER
|
||||||
|
void k64_automount_event(bool inserted);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Name: k64_pwm_setup
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Initialize PWM and register the PWM device.
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
#ifdef CONFIG_PWM
|
||||||
|
int k64_pwm_setup(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* __ASSEMBLY__ */
|
||||||
|
#endif /* __CONFIGS_TWR_K64F120M_SRC_TWRK64_H */
|
||||||
Reference in New Issue
Block a user