mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-05-30 18:06:39 +08:00
Inital commit of NXPhlite-v1
This commit is contained in:
committed by
Daniel Agar
parent
ec11b943a8
commit
c1812af45e
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"board_id": 28,
|
||||||
|
"magic": "PX4FWv1",
|
||||||
|
"description": "Firmware for the NXPHLITEv1 board",
|
||||||
|
"image": "",
|
||||||
|
"build_time": 0,
|
||||||
|
"summary": "NXPHLITEv1",
|
||||||
|
"version": "0.1",
|
||||||
|
"image_size": 0,
|
||||||
|
"git_identity": "",
|
||||||
|
"board_revision": 0
|
||||||
|
}
|
||||||
@@ -0,0 +1,218 @@
|
|||||||
|
include(nuttx/px4_impl_nuttx)
|
||||||
|
|
||||||
|
px4_nuttx_configure(HWCLASS m4 CONFIG nsh ROMFS y ROMFSROOT px4fmu_common)
|
||||||
|
|
||||||
|
set(CMAKE_TOOLCHAIN_FILE ${PX4_SOURCE_DIR}/cmake/toolchains/Toolchain-arm-none-eabi.cmake)
|
||||||
|
|
||||||
|
set(config_uavcan_num_ifaces 1)
|
||||||
|
|
||||||
|
set(config_module_list
|
||||||
|
#
|
||||||
|
# Board support modules
|
||||||
|
#
|
||||||
|
drivers/device
|
||||||
|
drivers/kinetis
|
||||||
|
drivers/kinetis/adc
|
||||||
|
drivers/kinetis/tone_alarm
|
||||||
|
drivers/led
|
||||||
|
drivers/px4fmu
|
||||||
|
drivers/boards/nxphlite-v1
|
||||||
|
drivers/rgbled
|
||||||
|
drivers/mpu6000
|
||||||
|
drivers/mpu9250
|
||||||
|
drivers/hmc5883
|
||||||
|
drivers/ms5611
|
||||||
|
drivers/mb12xx
|
||||||
|
drivers/srf02
|
||||||
|
drivers/sf0x
|
||||||
|
drivers/sf1xx
|
||||||
|
drivers/ll40ls
|
||||||
|
drivers/trone
|
||||||
|
drivers/gps
|
||||||
|
drivers/pwm_out_sim
|
||||||
|
drivers/hott
|
||||||
|
drivers/hott/hott_telemetry
|
||||||
|
drivers/hott/hott_sensors
|
||||||
|
drivers/blinkm
|
||||||
|
drivers/airspeed
|
||||||
|
drivers/ets_airspeed
|
||||||
|
drivers/meas_airspeed
|
||||||
|
drivers/frsky_telemetry
|
||||||
|
modules/sensors
|
||||||
|
drivers/mkblctrl
|
||||||
|
drivers/px4flow
|
||||||
|
drivers/oreoled
|
||||||
|
drivers/vmount
|
||||||
|
# NOT Portable YET drivers/pwm_input
|
||||||
|
drivers/camera_trigger
|
||||||
|
drivers/bst
|
||||||
|
drivers/snapdragon_rc_pwm
|
||||||
|
drivers/lis3mdl
|
||||||
|
drivers/bmp280
|
||||||
|
#No External SPI drivers/bma180
|
||||||
|
#No External SPI drivers/bmi160
|
||||||
|
drivers/tap_esc
|
||||||
|
|
||||||
|
#
|
||||||
|
# System commands
|
||||||
|
#
|
||||||
|
systemcmds/bl_update
|
||||||
|
systemcmds/mixer
|
||||||
|
systemcmds/param
|
||||||
|
systemcmds/perf
|
||||||
|
systemcmds/pwm
|
||||||
|
systemcmds/esc_calib
|
||||||
|
## Needs bbsrm systemcmds/hardfault_log
|
||||||
|
systemcmds/reboot
|
||||||
|
systemcmds/topic_listener
|
||||||
|
systemcmds/top
|
||||||
|
systemcmds/config
|
||||||
|
systemcmds/nshterm
|
||||||
|
systemcmds/mtd
|
||||||
|
systemcmds/dumpfile
|
||||||
|
systemcmds/ver
|
||||||
|
systemcmds/sd_bench
|
||||||
|
systemcmds/motor_ramp
|
||||||
|
|
||||||
|
#
|
||||||
|
# Testing
|
||||||
|
#
|
||||||
|
drivers/sf0x/sf0x_tests
|
||||||
|
### NOT Portable YET drivers/test_ppm
|
||||||
|
modules/commander/commander_tests
|
||||||
|
modules/controllib_test
|
||||||
|
modules/mavlink/mavlink_tests
|
||||||
|
modules/unit_test
|
||||||
|
modules/uORB/uORB_tests
|
||||||
|
systemcmds/tests
|
||||||
|
|
||||||
|
#
|
||||||
|
# General system control
|
||||||
|
#
|
||||||
|
modules/commander
|
||||||
|
modules/load_mon
|
||||||
|
modules/navigator
|
||||||
|
modules/mavlink
|
||||||
|
modules/gpio_led
|
||||||
|
## modules/uavcan
|
||||||
|
modules/land_detector
|
||||||
|
|
||||||
|
#
|
||||||
|
# Estimation modules (EKF/ SO3 / other filters)
|
||||||
|
#
|
||||||
|
modules/attitude_estimator_q
|
||||||
|
modules/position_estimator_inav
|
||||||
|
modules/ekf2
|
||||||
|
modules/local_position_estimator
|
||||||
|
|
||||||
|
#
|
||||||
|
# Vehicle Control
|
||||||
|
#
|
||||||
|
# modules/segway # XXX Needs GCC 4.7 fix
|
||||||
|
modules/fw_pos_control_l1
|
||||||
|
modules/fw_att_control
|
||||||
|
modules/mc_att_control
|
||||||
|
modules/mc_pos_control
|
||||||
|
modules/vtol_att_control
|
||||||
|
|
||||||
|
#
|
||||||
|
# Logging
|
||||||
|
#
|
||||||
|
modules/sdlog2
|
||||||
|
modules/logger
|
||||||
|
|
||||||
|
#
|
||||||
|
# Library modules
|
||||||
|
#
|
||||||
|
modules/param
|
||||||
|
modules/systemlib
|
||||||
|
modules/systemlib/mixer
|
||||||
|
modules/uORB
|
||||||
|
modules/dataman
|
||||||
|
|
||||||
|
#
|
||||||
|
# Libraries
|
||||||
|
#
|
||||||
|
lib/controllib
|
||||||
|
lib/mathlib
|
||||||
|
lib/mathlib/math/filter
|
||||||
|
lib/rc
|
||||||
|
lib/ecl
|
||||||
|
lib/external_lgpl
|
||||||
|
lib/geo
|
||||||
|
lib/geo_lookup
|
||||||
|
lib/conversion
|
||||||
|
lib/launchdetection
|
||||||
|
lib/terrain_estimation
|
||||||
|
lib/runway_takeoff
|
||||||
|
lib/tailsitter_recovery
|
||||||
|
lib/DriverFramework/framework
|
||||||
|
platforms/nuttx
|
||||||
|
|
||||||
|
# had to add for cmake, not sure why wasn't in original config
|
||||||
|
platforms/common
|
||||||
|
platforms/nuttx/px4_layer
|
||||||
|
|
||||||
|
#
|
||||||
|
# OBC challenge
|
||||||
|
#
|
||||||
|
modules/bottle_drop
|
||||||
|
|
||||||
|
#
|
||||||
|
# Rover apps
|
||||||
|
#
|
||||||
|
examples/rover_steering_control
|
||||||
|
|
||||||
|
#
|
||||||
|
# Demo apps
|
||||||
|
#
|
||||||
|
#examples/math_demo
|
||||||
|
# Tutorial code from
|
||||||
|
# https://px4.io/dev/px4_simple_app
|
||||||
|
examples/px4_simple_app
|
||||||
|
|
||||||
|
# Tutorial code from
|
||||||
|
# https://px4.io/dev/daemon
|
||||||
|
#examples/px4_daemon_app
|
||||||
|
|
||||||
|
# Tutorial code from
|
||||||
|
# https://px4.io/dev/debug_values
|
||||||
|
#examples/px4_mavlink_debug
|
||||||
|
|
||||||
|
# Tutorial code from
|
||||||
|
# https://px4.io/dev/example_fixedwing_control
|
||||||
|
#examples/fixedwing_control
|
||||||
|
|
||||||
|
# Hardware test
|
||||||
|
#examples/hwtest
|
||||||
|
|
||||||
|
# EKF
|
||||||
|
examples/ekf_att_pos_estimator
|
||||||
|
)
|
||||||
|
|
||||||
|
set(config_extra_builtin_cmds
|
||||||
|
serdis
|
||||||
|
sercon
|
||||||
|
)
|
||||||
|
|
||||||
|
set(config_extra_libs
|
||||||
|
# uavcan
|
||||||
|
# uavcan_stm32_driver
|
||||||
|
)
|
||||||
|
|
||||||
|
set(config_io_extra_libs
|
||||||
|
)
|
||||||
|
|
||||||
|
add_custom_target(sercon)
|
||||||
|
set_target_properties(sercon PROPERTIES
|
||||||
|
PRIORITY "SCHED_PRIORITY_DEFAULT"
|
||||||
|
MAIN "sercon"
|
||||||
|
STACK_MAIN "2048"
|
||||||
|
COMPILE_FLAGS "-Os")
|
||||||
|
|
||||||
|
add_custom_target(serdis)
|
||||||
|
set_target_properties(serdis PROPERTIES
|
||||||
|
PRIORITY "SCHED_PRIORITY_DEFAULT"
|
||||||
|
MAIN "serdis"
|
||||||
|
STACK_MAIN "2048"
|
||||||
|
COMPILE_FLAGS "-Os")
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
#
|
||||||
|
# For a description of the syntax of this configuration file,
|
||||||
|
# see misc/tools/kconfig-language.txt.
|
||||||
|
#
|
||||||
|
|
||||||
|
if ARCH_BOARD_NXPHLITE_V1
|
||||||
|
|
||||||
|
config BOARD_HAS_PROBES
|
||||||
|
bool "Board provides GPIO or other Hardware for signaling to timing analyze."
|
||||||
|
default y
|
||||||
|
---help---
|
||||||
|
This board provides GPIO FMU-CH1-6 as PROBE_1-6 to provide timing signals from selected drivers.
|
||||||
|
|
||||||
|
config BOARD_USE_PROBES
|
||||||
|
bool "Enable the use the board provided GPIO FMU-CH1-6 as PROBE_1-6 to provide timing signals from selected drivers"
|
||||||
|
default n
|
||||||
|
depends on BOARD_HAS_PROBES
|
||||||
|
|
||||||
|
---help---
|
||||||
|
Select to use GPIO FMU-CH1-6 to provide timing signals from selected drivers.
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -0,0 +1,344 @@
|
|||||||
|
/************************************************************************************
|
||||||
|
* configs/freedom-k64f/include/board.h
|
||||||
|
*
|
||||||
|
* Copyright (C) 2016 Gregory Nutt. All rights reserved.
|
||||||
|
* Authors: Gregory Nutt <gnutt@nuttx.org>
|
||||||
|
* Jordan MacIntyre
|
||||||
|
* David Sidrane <david_s5@nscdg.com>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 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 __CONFIG_NXPHLITE_V1_INCLUDE_BOARD_H
|
||||||
|
#define __CONFIG_NXPHLITE_V1_INCLUDE_BOARD_H
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Included Files
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
#ifndef __ASSEMBLY__
|
||||||
|
# include <stdint.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Pre-processor Definitions
|
||||||
|
************************************************************************************/
|
||||||
|
/*
|
||||||
|
* The NXPHlite-v1 is populated with a MK64FX512VLQ12 has 512 KiB of FLASH and
|
||||||
|
* 192KiB of SRAM.
|
||||||
|
*/
|
||||||
|
/* Clocking *************************************************************************/
|
||||||
|
/* The NXPHlite-v1 uses a 16MHz external Oscillator. The Kinetis MCU startup from an
|
||||||
|
* internal digitally-controlled oscillator (DCO). Nuttx will enable the main external
|
||||||
|
* oscillator (EXTAL0/XTAL0). The external oscillator/resonator can range from
|
||||||
|
* 32.768 KHz up to 50 MHz. The default external source for the MCG oscillator inputs
|
||||||
|
* EXTAL.
|
||||||
|
*
|
||||||
|
* Y1 a High-frequency, low-power Xtal
|
||||||
|
*/
|
||||||
|
#define BOARD_EXTAL_LP 1
|
||||||
|
#define BOARD_EXTAL_FREQ 16000000 /* 16MHz Oscillator Y1 */
|
||||||
|
#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 2-4 MHz reference clock to the PLL.
|
||||||
|
*
|
||||||
|
* PLL Input frequency: PLLIN = REFCLK / PRDIV = 16 MHz / 4 = 4 MHz
|
||||||
|
* PLL Output frequency: PLLOUT = PLLIN * VDIV = 4 MHz * 30 = 120 MHz
|
||||||
|
* MCG Frequency: PLLOUT = 120 MHz
|
||||||
|
*
|
||||||
|
* PRDIV register value is the divider minus one. So 4 -> 3
|
||||||
|
* VDIV register value is offset by 24. So 30 -> 6
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define BOARD_PRDIV 4 /* PLL External Reference Divider */
|
||||||
|
#define BOARD_VDIV 30 /* 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
|
||||||
|
|
||||||
|
/* SIM CLKDIV1 dividers */
|
||||||
|
|
||||||
|
#define BOARD_OUTDIV1 1 /* Core = MCG, 120 MHz */
|
||||||
|
#define BOARD_OUTDIV2 2 /* Bus = MCG / 2, 60 MHz */
|
||||||
|
#define BOARD_OUTDIV3 2 /* FlexBus = MCG / 2, 60 MHz */
|
||||||
|
#define BOARD_OUTDIV4 5 /* Flash clock = MCG / 5, 24 MHz */
|
||||||
|
|
||||||
|
#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. Possible values for presscaler and divisor are:
|
||||||
|
*
|
||||||
|
* SDCLKFS: {2, 4, 8, 16, 32, 63, 128, 256}
|
||||||
|
* DVS: {1..16}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Identification mode: Optimal 400KHz, Actual 120MHz / (32 * 10) = 375 KHz */
|
||||||
|
|
||||||
|
#define BOARD_SDHC_IDMODE_PRESCALER SDHC_SYSCTL_SDCLKFS_DIV32
|
||||||
|
#define BOARD_SDHC_IDMODE_DIVISOR SDHC_SYSCTL_DVS_DIV(10)
|
||||||
|
|
||||||
|
/* MMC normal mode: Optimal 20MHz, Actual 120MHz / (2 * 3) = 20 MHz */
|
||||||
|
|
||||||
|
#define BOARD_SDHC_MMCMODE_PRESCALER SDHC_SYSCTL_SDCLKFS_DIV2
|
||||||
|
#define BOARD_SDHC_MMCMODE_DIVISOR SDHC_SYSCTL_DVS_DIV(3)
|
||||||
|
|
||||||
|
/* SD normal mode (1-bit): Optimal 20MHz, Actual 120MHz / (2 * 3) = 20 MHz */
|
||||||
|
|
||||||
|
#define BOARD_SDHC_SD1MODE_PRESCALER SDHC_SYSCTL_SDCLKFS_DIV2
|
||||||
|
#define BOARD_SDHC_SD1MODE_DIVISOR SDHC_SYSCTL_DVS_DIV(3)
|
||||||
|
|
||||||
|
/* SD normal mode (4-bit): Optimal 25MHz, Actual 120MHz / (2 * 3) = 20 MHz (with DMA)
|
||||||
|
* SD normal mode (4-bit): Optimal 20MHz, Actual 120MHz / (2 * 3) = 20 MHz (no DMA)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#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_DIV2
|
||||||
|
# define BOARD_SDHC_SD4MODE_DIVISOR SDHC_SYSCTL_DVS_DIV(3)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* LED definitions ******************************************************************/
|
||||||
|
/* The NXPHlite-v1 has a separate Red, Green and Blue LEDs driven by the K64F as
|
||||||
|
* follows:
|
||||||
|
*
|
||||||
|
* LED K64
|
||||||
|
* ------ -------------------------------------------------------
|
||||||
|
* RED FB_CS3_b/ FB_BE7_0_BLS31_24_b/ FB_TA_b/ ENET0_1588_TMR3/ UART3_CTS_b/ PTC19
|
||||||
|
* GREEN LLWU_P12/ FB_CS1_b/ FB_TS_b/ FB_ALE/ FTM3_CH0/ UART2_RTS_b/ SPI0_PCS0/ PTD0
|
||||||
|
* BLUE FB_CS0_b/ FTM3_CH1/ UART2_CTS_b/ SPI0_SCK/ ADC0_SE5b/ PTD1
|
||||||
|
*
|
||||||
|
* If CONFIG_ARCH_LEDS is not defined, then the user can control the LEDs in any
|
||||||
|
* way. The following definitions are used to access individual LEDs.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* LED index values for use with board_userled() */
|
||||||
|
|
||||||
|
#define BOARD_LED_R 0
|
||||||
|
#define BOARD_LED_G 1
|
||||||
|
#define BOARD_LED_B 2
|
||||||
|
#define BOARD_NLEDS 3
|
||||||
|
|
||||||
|
/* LED bits for use with board_userled_all() */
|
||||||
|
|
||||||
|
#define BOARD_LED_R_BIT (1 << BOARD_LED_R)
|
||||||
|
#define BOARD_LED_G_BIT (1 << BOARD_LED_G)
|
||||||
|
#define BOARD_LED_B_BIT (1 << BOARD_LED_B)
|
||||||
|
|
||||||
|
/* If CONFIG_ARCH_LEDs is defined, then NuttX will control the LED on board
|
||||||
|
* the NXPHlite-v1. The following definitions describe how NuttX controls
|
||||||
|
* the LEDs:
|
||||||
|
*
|
||||||
|
* SYMBOL Meaning LED state
|
||||||
|
* RED GREEN BLUE
|
||||||
|
* ------------------- ---------------------------- ----------------- */
|
||||||
|
#define LED_STARTED 1 /* NuttX has been started OFF OFF OFF */
|
||||||
|
#define LED_HEAPALLOCATE 2 /* Heap has been allocated OFF OFF ON */
|
||||||
|
#define LED_IRQSENABLED 0 /* Interrupts enabled OFF OFF ON */
|
||||||
|
#define LED_STACKCREATED 3 /* Idle stack created OFF ON OFF */
|
||||||
|
#define LED_INIRQ 0 /* In an interrupt (no change) */
|
||||||
|
#define LED_SIGNAL 0 /* In a signal handler (no change) */
|
||||||
|
#define LED_ASSERTION 0 /* An assertion failed (no change) */
|
||||||
|
#define LED_PANIC 4 /* The system has crashed FLASH OFF OFF */
|
||||||
|
#undef LED_IDLE /* K64 is in sleep mode (Not used) */
|
||||||
|
|
||||||
|
/* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* CAN
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#define PIN_CAN0_RX PIN_CAN0_RX_2
|
||||||
|
#define PIN_CAN0_TX PIN_CAN0_TX_2
|
||||||
|
|
||||||
|
/* 12C
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* I2C0 MPL3115A2 Pressure Sensor */
|
||||||
|
|
||||||
|
#define PIN_I2C0_SCL PIN_I2C0_SCL_4 /* PTE24 P_SCL */
|
||||||
|
#define PIN_I2C0_SDA PIN_I2C0_SDA_4 /* PTE25 P_SDA */
|
||||||
|
|
||||||
|
/* I2C1 NFC Connector */
|
||||||
|
|
||||||
|
#define PIN_I2C1_SCL PIN_I2C1_SCL_1 /* PTC10 NFC_SCL P2-2 */
|
||||||
|
#define PIN_I2C1_SDA PIN_I2C1_SDA_1 /* PTC11 NFC_SDA P2-3 */
|
||||||
|
|
||||||
|
|
||||||
|
/* PWM
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* PWM Channels */
|
||||||
|
|
||||||
|
#define GPIO_FTM3_CH0OUT PIN_FTM3_CH0_2 /* PTE5 PWM1 P4-34 */
|
||||||
|
#define GPIO_FTM3_CH1OUT PIN_FTM3_CH1_2 /* PTE6 PWM2 P4-31 */
|
||||||
|
#define GPIO_FTM3_CH2OUT PIN_FTM3_CH2_2 /* PTE7 PWM3 P4-28 */
|
||||||
|
#define GPIO_FTM3_CH3OUT PIN_FTM3_CH3_2 /* PTE8 PWM4 P4-25 */
|
||||||
|
#define GPIO_FTM3_CH4OUT PIN_FTM3_CH4_2 /* PTE9 PWM5 P4-22 */
|
||||||
|
#define GPIO_FTM3_CH5OUT PIN_FTM3_CH5_2 /* PTE10 PWM6 P4-29 */
|
||||||
|
#define GPIO_FTM3_CH6OUT PIN_FTM3_CH6_2 /* PTE11 PWM7 P4-26 */
|
||||||
|
#define GPIO_FTM3_CH7OUT PIN_FTM3_CH7_2 /* PTE12 PWM8 P4-13 */
|
||||||
|
|
||||||
|
#define GPIO_FTM0_CH4OUT PIN_FTM0_CH4_3 /* PTD4 PWM0 P4-46 */
|
||||||
|
#define GPIO_FTM0_CH5OUT PIN_FTM0_CH5_3 /* PTD5 PWM10 P4-43 */
|
||||||
|
#define GPIO_FTM0_CH6OUT PIN_FTM0_CH6_2 /* PTD6 PWM11 P4-40 */
|
||||||
|
#define GPIO_FTM0_CH7OUT PIN_FTM0_CH7_2 /* PTD7 PWM12 P4-37 */
|
||||||
|
|
||||||
|
#define GPIO_FTM0_CH3OUT PIN_FTM0_CH3_1 /* PTA6 PWM13 P4-7 */
|
||||||
|
#define GPIO_FTM0_CH2OUT PIN_FTM0_CH2_2 /* PTC3 PWM14 P4-10 */
|
||||||
|
|
||||||
|
//todo:This is a Guess on timer utilisation
|
||||||
|
#define GPIO_FTM3_CH0IN PIN_FTM3_CH0_2 /* PTE5 PWM1 P4-34 */
|
||||||
|
#define GPIO_FTM3_CH1IN PIN_FTM3_CH1_2 /* PTE6 PWM2 P4-31 */
|
||||||
|
#define GPIO_FTM3_CH2IN PIN_FTM3_CH2_2 /* PTE7 PWM3 P4-28 */
|
||||||
|
#define GPIO_FTM3_CH3IN PIN_FTM3_CH3_2 /* PTE8 PWM4 P4-25 */
|
||||||
|
#define GPIO_FTM3_CH4IN PIN_FTM3_CH4_2 /* PTE9 PWM5 P4-22 */
|
||||||
|
#define GPIO_FTM3_CH5IN PIN_FTM3_CH5_2 /* PTE10 PWM6 P4-29 */
|
||||||
|
#define GPIO_FTM3_CH6IN PIN_FTM3_CH6_2 /* PTE11 PWM7 P4-26 */
|
||||||
|
#define GPIO_FTM3_CH7IN PIN_FTM3_CH7_2 /* PTE12 PWM8 P4-13 */
|
||||||
|
|
||||||
|
#define GPIO_FTM0_CH4IN PIN_FTM0_CH4_3 /* PTD4 PWM0 P4-46 */
|
||||||
|
#define GPIO_FTM0_CH5IN PIN_FTM0_CH5_3 /* PTD5 PWM10 P4-43 */
|
||||||
|
#define GPIO_FTM0_CH6IN PIN_FTM0_CH6_2 /* PTD6 PWM11 P4-40 */
|
||||||
|
#define GPIO_FTM0_CH7IN PIN_FTM0_CH7_2 /* PTD7 PWM12 P4-37 */
|
||||||
|
|
||||||
|
#define GPIO_FTM0_CH3IN PIN_FTM0_CH3_1 /* PTA6 PWM13 P4-7 */
|
||||||
|
#define GPIO_FTM0_CH2IN PIN_FTM0_CH2_2 /* PTC3 PWM14 P4-10 */
|
||||||
|
|
||||||
|
/* SPI
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* SPI0 SD Card */
|
||||||
|
|
||||||
|
#define PIN_SPI0_PCS0 PIN_SPI0_PCS0_2 /* PTC4 SPI_CS SD1-2 */
|
||||||
|
#define PIN_SPI0_SCK PIN_SPI0_SCK_2 /* PTC5 SPI_CLK SD1-5 */
|
||||||
|
#define PIN_SPI0_OUT PIN_SPI0_SOUT_2 /* PTC6 SPI_OUT SD1-3 */
|
||||||
|
#define PIN_SPI0_SIN PIN_SPI0_SIN_2 /* PTC7 SPI_IN SD1-5 */
|
||||||
|
|
||||||
|
/* SPI1 FXOS8700CQ Accelerometer */
|
||||||
|
|
||||||
|
#define PIN_SPI1_PCS0 PIN_SPI1_PCS0_1 /* PTB10 A_CS */
|
||||||
|
#define PIN_SPI1_SCK PIN_SPI1_SCK_1 /* PTB11 A_SCLK */
|
||||||
|
#define PIN_SPI1_OUT PIN_SPI1_SOUT_1 /* PTB16 A_MOSI */
|
||||||
|
#define PIN_SPI1_SIN PIN_SPI1_SIN_1 /* PTB17 A_MISO */
|
||||||
|
|
||||||
|
/* SPI2 FXAS21002CQ Gyroscope */
|
||||||
|
|
||||||
|
#define PIN_SPI2_PCS0 PIN_SPI2_PCS0_1 /* PTB20 GM_CS */
|
||||||
|
#define PIN_SPI2_SCK PIN_SPI2_SCK_1 /* PTB21 GM_SCLK */
|
||||||
|
#define PIN_SPI2_OUT PIN_SPI2_SOUT_1 /* PTB22 GM_MOSI */
|
||||||
|
#define PIN_SPI2_SIN PIN_SPI2_SIN_1 /* PTB23 GM_MISO */
|
||||||
|
|
||||||
|
/* UART
|
||||||
|
*
|
||||||
|
* NuttX Will use UART4 as the Console
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define PIN_UART0_RX PIN_UART0_RX_4 /* PTD6 P4-40 PWM11 */
|
||||||
|
#define PIN_UART0_TX PIN_UART0_TX_4 /* PTD7 P4-37 PWM12 */
|
||||||
|
|
||||||
|
#define PIN_UART1_RX PIN_UART1_RX_2 /* PTE1 UART P14-3 */
|
||||||
|
#define PIN_UART1_TX PIN_UART1_TX_2 /* PTE0 UART P14-2 */
|
||||||
|
|
||||||
|
/* No Alternative pins for UART2
|
||||||
|
* PD2 BL P1-5
|
||||||
|
* PD3 BL P1-4
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define PIN_UART3_RX PIN_UART3_RX_2 /* PTC16 GPS P3-3 */
|
||||||
|
#define PIN_UART3_TX PIN_UART3_TX_2 /* PTC17 GPS P3-2 */
|
||||||
|
|
||||||
|
#define PIN_UART4_RX PIN_UART4_RX_1 /* PTC14 UART P10-3 */
|
||||||
|
#define PIN_UART4_TX PIN_UART4_TX_1 /* PTC15 UART P10-2 */
|
||||||
|
|
||||||
|
/* UART5 is not connected on V1
|
||||||
|
*/
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
void kinetis_boardinitialize(void);
|
||||||
|
|
||||||
|
#undef EXTERN
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __ASSEMBLY__ */
|
||||||
|
#endif /* __CONFIG_NXPHLITE_V1_INCLUDE_BOARD_H */
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2016 PX4 Development Team. All rights reserved.
|
||||||
|
*
|
||||||
|
* 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 PX4 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* nsh_romfsetc.h
|
||||||
|
*
|
||||||
|
* This file is a stub for 'make export' purposes; the actual ROMFS
|
||||||
|
* must be supplied by the library client.
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern unsigned char romfs_img[];
|
||||||
|
extern unsigned int romfs_img_len;
|
||||||
@@ -0,0 +1,163 @@
|
|||||||
|
############################################################################
|
||||||
|
# nuttx-configs/nxphlite-v1/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)/PX4_Warnings.mk
|
||||||
|
include $(TOPDIR)/PX4_Config.mk
|
||||||
|
|
||||||
|
#
|
||||||
|
# We only support building with the ARM bare-metal toolchain from
|
||||||
|
# https://launchpad.net/gcc-arm-embedded on Windows, Linux or Mac OS.
|
||||||
|
#
|
||||||
|
CONFIG_ARMV7M_TOOLCHAIN := GNU_EABI${HOST_OS_FIRST_LETTER}
|
||||||
|
|
||||||
|
include ${TOPDIR}/arch/arm/src/armv7-m/Toolchain.defs
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
MAXOPTIMIZATION =-Os
|
||||||
|
ARCHCPUFLAGS = -mcpu=cortex-m4 \
|
||||||
|
-mthumb \
|
||||||
|
-march=armv7e-m \
|
||||||
|
-mfpu=fpv4-sp-d16 \
|
||||||
|
-mfloat-abi=hard
|
||||||
|
|
||||||
|
# Enable precise stack overflow tracking
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_ARMV7M_STACKCHECK),y)
|
||||||
|
INSTRUMENTATIONDEFINES = -finstrument-functions -ffixed-r10
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Pull in *just* libm from the toolchain ... this is grody
|
||||||
|
LIBM = "${shell $(CC) $(ARCHCPUFLAGS) -print-file-name=libm.a}"
|
||||||
|
EXTRA_LIBS += $(LIBM)
|
||||||
|
|
||||||
|
# Use our linker script
|
||||||
|
|
||||||
|
LDSCRIPT = ld.script
|
||||||
|
|
||||||
|
ifeq ($(WINTOOL),y)
|
||||||
|
# Windows-native toolchains
|
||||||
|
DIRLINK = $(TOPDIR)/tools/copydir.sh
|
||||||
|
DIRUNLINK = $(TOPDIR)/tools/unlink.sh
|
||||||
|
MKDEP = $(TOPDIR)/tools/mknulldeps.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/$(LDSCRIPT)}"
|
||||||
|
else
|
||||||
|
ifeq ($(PX4_WINTOOL),y)
|
||||||
|
# Windows-native toolchains (MSYS)
|
||||||
|
DIRLINK = $(TOPDIR)/tools/copydir.sh
|
||||||
|
DIRUNLINK = $(TOPDIR)/tools/unlink.sh
|
||||||
|
MKDEP = $(TOPDIR)/tools/mknulldeps.sh
|
||||||
|
ARCHINCLUDES = -I. -isystem $(TOPDIR)/include
|
||||||
|
ARCHXXINCLUDES = -I. -isystem $(TOPDIR)/include -isystem $(TOPDIR)/include/cxx
|
||||||
|
ARCHSCRIPT = -T$(TOPDIR)/configs/$(CONFIG_ARCH_BOARD)/scripts/$(LDSCRIPT)
|
||||||
|
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/$(LDSCRIPT)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Tool versions
|
||||||
|
|
||||||
|
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}
|
||||||
|
|
||||||
|
# Optimization flags
|
||||||
|
|
||||||
|
ARCHOPTIMIZATION = $(MAXOPTIMIZATION) \
|
||||||
|
-fno-strict-aliasing \
|
||||||
|
-fno-strength-reduce \
|
||||||
|
-fomit-frame-pointer \
|
||||||
|
-funsafe-math-optimizations \
|
||||||
|
-fno-builtin-printf \
|
||||||
|
-ffunction-sections \
|
||||||
|
-fdata-sections
|
||||||
|
|
||||||
|
ifeq ("${CONFIG_DEBUG_SYMBOLS}","y")
|
||||||
|
ARCHOPTIMIZATION += -g
|
||||||
|
endif
|
||||||
|
|
||||||
|
ARCHCFLAGS = -std=gnu99
|
||||||
|
ARCHCXXFLAGS = -fno-exceptions -fno-rtti -std=gnu++0x
|
||||||
|
ARCHWARNINGS = $(PX4_ARCHWARNINGS)
|
||||||
|
ARCHCWARNINGS = $(PX4_ARCHWARNINGS) $(PX4_ARCHCWARNINGS)
|
||||||
|
ARCHWARNINGSXX = $(ARCHWARNINGS) $(PX4_ARCHWARNINGSXX)
|
||||||
|
ARCHDEFINES =
|
||||||
|
ARCHPICFLAGS = -fpic -msingle-pic-base -mpic-register=r10
|
||||||
|
|
||||||
|
# This seems to be the only way to add linker flags
|
||||||
|
|
||||||
|
EXTRA_LIBS += --warn-common \
|
||||||
|
--gc-sections
|
||||||
|
|
||||||
|
CFLAGS = $(ARCHCFLAGS) $(ARCHCWARNINGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHINCLUDES) $(INSTRUMENTATIONDEFINES) $(ARCHDEFINES) $(EXTRADEFINES) -pipe -fno-common
|
||||||
|
CPICFLAGS = $(ARCHPICFLAGS) $(CFLAGS)
|
||||||
|
CXXFLAGS = $(ARCHCXXFLAGS) $(ARCHWARNINGSXX) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHXXINCLUDES) $(INSTRUMENTATIONDEFINES) $(ARCHDEFINES) $(EXTRADEFINES) -pipe
|
||||||
|
CXXPICFLAGS = $(ARCHPICFLAGS) $(CXXFLAGS)
|
||||||
|
CPPFLAGS = $(ARCHINCLUDES) $(INSTRUMENTATIONDEFINES) $(ARCHDEFINES) $(EXTRADEFINES)
|
||||||
|
AFLAGS = $(CFLAGS) -D__ASSEMBLY__
|
||||||
|
|
||||||
|
NXFLATLDFLAGS1 = -r -d -warn-common
|
||||||
|
NXFLATLDFLAGS2 = $(NXFLATLDFLAGS1) -T$(TOPDIR)/binfmt/libnxflat/gnu-nxflat.ld -no-check-sections
|
||||||
|
LDNXFLATFLAGS = -e main -s 2048
|
||||||
|
|
||||||
|
OBJEXT = .o
|
||||||
|
LIBEXT = .a
|
||||||
|
EXEEXT =
|
||||||
|
|
||||||
|
# Produce partially-linked $1 from files in $2
|
||||||
|
|
||||||
|
define PRELINK
|
||||||
|
@echo "PRELINK: $1"
|
||||||
|
$(Q) $(LD) -Ur -o $1 $2 && $(OBJCOPY) --localize-hidden $1
|
||||||
|
endef
|
||||||
|
|
||||||
|
HOSTCC = gcc
|
||||||
|
HOSTINCLUDES = -I.
|
||||||
|
HOSTCFLAGS = -Wall -Wstrict-prototypes -Wshadow -g -pipe
|
||||||
|
HOSTLDFLAGS =
|
||||||
File diff suppressed because it is too large
Load Diff
Executable
+75
@@ -0,0 +1,75 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# nuttx-configs/nxphlite-v1/nsh/setenv.sh
|
||||||
|
#
|
||||||
|
# Copyright (C) 2013 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 RIDE
|
||||||
|
# toolchain under windows. You will also have to edit this if you install
|
||||||
|
# the RIDE toolchain in any other location
|
||||||
|
#export TOOLCHAIN_BIN="/cygdrive/c/Program Files (x86)/Raisonance/Ride/arm-gcc/bin"
|
||||||
|
|
||||||
|
# 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"
|
||||||
|
|
||||||
|
# These are the Cygwin paths to the locations where I installed the Atollic
|
||||||
|
# toolchain under windows. You will also have to edit this if you install
|
||||||
|
# the Atollic toolchain in any other location. /usr/bin is added before
|
||||||
|
# the Atollic bin path because there is are binaries named gcc.exe and g++.exe
|
||||||
|
# at those locations as well.
|
||||||
|
#export TOOLCHAIN_BIN="/usr/bin:/cygdrive/c/Program Files (x86)/Atollic/TrueSTUDIO for ARM Pro 2.3.0/ARMTools/bin"
|
||||||
|
#export TOOLCHAIN_BIN="/usr/bin:/cygdrive/c/Program Files (x86)/Atollic/TrueSTUDIO for STMicroelectronics STM32 Lite 2.3.0/ARMTools/bin"
|
||||||
|
|
||||||
|
# This is the Cygwin path to the location where I build the buildroot
|
||||||
|
# toolchain.
|
||||||
|
#export TOOLCHAIN_BIN="${WD}/../misc/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,159 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* configs/nxphlite-v1/scripts/flash.ld
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* The MK64FX512VLQ12 has 512 KiB of FLASH beginning at address 0x0000:0000 and
|
||||||
|
* 192KiB of SRAM beginning at address 0x1ffe:0000- (SRAM_L) and 0x2000:000
|
||||||
|
* (SRAM_U).
|
||||||
|
*
|
||||||
|
* 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 = 0x00000410, LENGTH = 512K - (1K + 16)
|
||||||
|
datasram (rwx) : ORIGIN = 0x1fff0000, LENGTH = 192K
|
||||||
|
}
|
||||||
|
|
||||||
|
OUTPUT_ARCH(arm)
|
||||||
|
ENTRY(__start)
|
||||||
|
EXTERN(__flashconfigbytes)
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
.vectors : {
|
||||||
|
_svectors = ABSOLUTE(.);
|
||||||
|
KEEP(*(.vectors))
|
||||||
|
_evectors = ABSOLUTE(.);
|
||||||
|
} > vectflash
|
||||||
|
|
||||||
|
.cfmprotect : {
|
||||||
|
KEEP(*(.cfmconfig))
|
||||||
|
} > cfmprotect
|
||||||
|
|
||||||
|
.text : {
|
||||||
|
_stext = ABSOLUTE(.);
|
||||||
|
*(.text .text.*)
|
||||||
|
*(.fixup)
|
||||||
|
*(.gnu.warning)
|
||||||
|
*(.rodata .rodata.*)
|
||||||
|
*(.gnu.linkonce.t.*)
|
||||||
|
*(.got)
|
||||||
|
*(.gcc_except_table)
|
||||||
|
*(.gnu.linkonce.r.*)
|
||||||
|
_etext = ABSOLUTE(.);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is a hack to make the newlib libm __errno() call
|
||||||
|
* use the NuttX get_errno_ptr() function.
|
||||||
|
*/
|
||||||
|
__errno = get_errno_ptr;
|
||||||
|
} > progflash
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Init functions (static constructors and the like)
|
||||||
|
*/
|
||||||
|
|
||||||
|
.init_section : {
|
||||||
|
_sinit = ABSOLUTE(.);
|
||||||
|
KEEP(*(.init_array .init_array.*))
|
||||||
|
_einit = ABSOLUTE(.);
|
||||||
|
} > progflash
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Construction data for parameters.
|
||||||
|
*/
|
||||||
|
__param ALIGN(4): {
|
||||||
|
__param_start = ABSOLUTE(.);
|
||||||
|
KEEP(*(__param*))
|
||||||
|
__param_end = ABSOLUTE(.);
|
||||||
|
} > progflash
|
||||||
|
|
||||||
|
.ARM.extab : {
|
||||||
|
*(.ARM.extab*)
|
||||||
|
} > progflash
|
||||||
|
|
||||||
|
__exidx_start = ABSOLUTE(.);
|
||||||
|
.ARM.exidx : {
|
||||||
|
*(.ARM.exidx*)
|
||||||
|
} > progflash
|
||||||
|
__exidx_end = ABSOLUTE(.);
|
||||||
|
|
||||||
|
_eronly = ABSOLUTE(.);
|
||||||
|
|
||||||
|
.data : {
|
||||||
|
_sdata = ABSOLUTE(.);
|
||||||
|
*(.data .data.*)
|
||||||
|
*(.gnu.linkonce.d.*)
|
||||||
|
CONSTRUCTORS
|
||||||
|
_edata = ABSOLUTE(.);
|
||||||
|
} > datasram AT > progflash
|
||||||
|
|
||||||
|
.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,86 @@
|
|||||||
|
############################################################################
|
||||||
|
#
|
||||||
|
# Copyright (C) 2013 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
|
||||||
|
|
||||||
|
CFLAGS += -I$(TOPDIR)/sched
|
||||||
|
|
||||||
|
ASRCS =
|
||||||
|
AOBJS = $(ASRCS:.S=$(OBJEXT))
|
||||||
|
|
||||||
|
CSRCS = empty.c
|
||||||
|
COBJS = $(CSRCS:.c=$(OBJEXT))
|
||||||
|
|
||||||
|
SRCS = $(ASRCS) $(CSRCS)
|
||||||
|
OBJS = $(AOBJS) $(COBJS)
|
||||||
|
|
||||||
|
ARCH_SRCDIR = $(TOPDIR)/arch/$(CONFIG_ARCH)/src
|
||||||
|
ifeq ($(WINTOOL),y)
|
||||||
|
CFLAGS += -I "${shell cygpath -w $(ARCH_SRCDIR)/chip}" \
|
||||||
|
-I "${shell cygpath -w $(ARCH_SRCDIR)/common}" \
|
||||||
|
-I "${shell cygpath -w $(ARCH_SRCDIR)/armv7-m}"
|
||||||
|
else
|
||||||
|
CFLAGS += -I$(ARCH_SRCDIR)/chip -I$(ARCH_SRCDIR)/common -I$(ARCH_SRCDIR)/armv7-m
|
||||||
|
endif
|
||||||
|
|
||||||
|
all: libboard$(LIBEXT)
|
||||||
|
|
||||||
|
$(AOBJS): %$(OBJEXT): %.S
|
||||||
|
$(call ASSEMBLE, $<, $@)
|
||||||
|
|
||||||
|
$(COBJS) $(LINKOBJS): %$(OBJEXT): %.c
|
||||||
|
$(call COMPILE, $<, $@)
|
||||||
|
|
||||||
|
libboard$(LIBEXT): $(OBJS)
|
||||||
|
$(call ARCHIVE, $@, $(OBJS))
|
||||||
|
|
||||||
|
.depend: Makefile $(SRCS)
|
||||||
|
$(Q) $(MKDEP) $(CC) -- $(CFLAGS) -- $(SRCS) >Make.dep
|
||||||
|
$(Q) touch $@
|
||||||
|
|
||||||
|
depend: .depend
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$(call DELFILE, libboard$(LIBEXT))
|
||||||
|
$(call CLEAN)
|
||||||
|
|
||||||
|
distclean: clean
|
||||||
|
$(call DELFILE, Make.dep)
|
||||||
|
$(call DELFILE, .depend)
|
||||||
|
|
||||||
|
ifneq ($(BOARD_CONTEXT),y)
|
||||||
|
context:
|
||||||
|
endif
|
||||||
|
|
||||||
|
-include Make.dep
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
/*
|
||||||
|
* There are no source files here, but libboard.a can't be empty, so
|
||||||
|
* we have this empty source file to keep it company.
|
||||||
|
*/
|
||||||
@@ -63,7 +63,8 @@ CONFIG_ARCH_ARM=y
|
|||||||
# CONFIG_ARCH_MIPS is not set
|
# CONFIG_ARCH_MIPS is not set
|
||||||
# CONFIG_ARCH_RGMP is not set
|
# CONFIG_ARCH_RGMP is not set
|
||||||
# CONFIG_ARCH_SH is not set
|
# CONFIG_ARCH_SH is not set
|
||||||
# CONFIG_ARCH_SIM is not set
|
# CONFIG_ARCH_SIM is not setMMSC
|
||||||
|
|
||||||
# CONFIG_ARCH_X86 is not set
|
# CONFIG_ARCH_X86 is not set
|
||||||
# CONFIG_ARCH_Z16 is not set
|
# CONFIG_ARCH_Z16 is not set
|
||||||
# CONFIG_ARCH_Z80 is not set
|
# CONFIG_ARCH_Z80 is not set
|
||||||
|
|||||||
@@ -0,0 +1,73 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2017 PX4 Development Team. All rights reserved.
|
||||||
|
* Author: @author David Sidrane <david_s5@nscdg.com>
|
||||||
|
*
|
||||||
|
* 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 PX4 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file board_reset.c
|
||||||
|
* Implementation of kinetis based Board RESET API
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <px4_config.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <nuttx/board.h>
|
||||||
|
|
||||||
|
|
||||||
|
int board_set_bootload_mode(board_reset_e mode)
|
||||||
|
{
|
||||||
|
uint32_t regvalue = 0;
|
||||||
|
|
||||||
|
switch (mode) {
|
||||||
|
case board_reset_normal:
|
||||||
|
case board_reset_extended:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case board_reset_enter_bootloader:
|
||||||
|
regvalue = 0xb007b007;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// todo: Add a way to enter bootloader
|
||||||
|
UNUSED(regvalue);
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void board_system_reset(int status)
|
||||||
|
{
|
||||||
|
board_reset(status);
|
||||||
|
|
||||||
|
while (1);
|
||||||
|
}
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
############################################################################
|
||||||
|
#
|
||||||
|
# Copyright (c) 2016 PX4 Development Team. All rights reserved.
|
||||||
|
#
|
||||||
|
# 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 PX4 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.
|
||||||
|
#
|
||||||
|
############################################################################
|
||||||
|
px4_add_module(
|
||||||
|
MODULE drivers__boards__nxphlite-v1
|
||||||
|
COMPILE_FLAGS
|
||||||
|
SRCS
|
||||||
|
../common/kinetis/board_reset.c
|
||||||
|
../common/board_crashdump.c
|
||||||
|
../common/board_dma_alloc.c
|
||||||
|
nxphlite_autoleds.c
|
||||||
|
nxphlite_automount.c
|
||||||
|
nxphlite_bringup.c
|
||||||
|
nxphlite_can.c
|
||||||
|
nxphlite_init.c
|
||||||
|
nxphlite_led.c
|
||||||
|
nxphlite_pwm.c
|
||||||
|
nxphlite_sdhc.c
|
||||||
|
nxphlite_sdio.c
|
||||||
|
nxphlite_spi.c
|
||||||
|
nxphlite_timer_config.c
|
||||||
|
nxphlite_usb.c
|
||||||
|
DEPENDS
|
||||||
|
platforms__common
|
||||||
|
)
|
||||||
|
# vim: set noet ft=cmake fenc=utf-8 ff=unix :
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,164 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2016 Gregory Nutt. All rights reserved.
|
||||||
|
* Authors: Gregory Nutt <gnutt@nuttx.org>
|
||||||
|
* David Sidrane <david_s5@nscdg.com>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 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 module shaol be used during board bring up of Nuttx.
|
||||||
|
*
|
||||||
|
* The NXPHlite-v1 has a separate Red, Green and Blue LEDs driven by the K64F
|
||||||
|
* as follows:
|
||||||
|
*
|
||||||
|
* LED K64
|
||||||
|
* ------ -------------------------------------------------------
|
||||||
|
* RED FB_CS3_b/ FB_BE7_0_BLS31_24_b/ FB_TA_b/ ENET0_1588_TMR3/ UART3_CTS_b/ PTC19
|
||||||
|
* GREEN LLWU_P12/ FB_CS1_b/ FB_TS_b/ FB_ALE/ FTM3_CH0/ UART2_RTS_b/ SPI0_PCS0/ PTD0
|
||||||
|
* BLUE FB_CS0_b/ FTM3_CH1/ UART2_CTS_b/ SPI0_SCK/ ADC0_SE5b/ PTD1
|
||||||
|
*
|
||||||
|
* If CONFIG_ARCH_LEDs is defined, then NuttX will control the LED on board
|
||||||
|
* the Freedom K64F. The following definitions describe how NuttX controls
|
||||||
|
* the LEDs:
|
||||||
|
*
|
||||||
|
* SYMBOL Meaning LED state
|
||||||
|
* RED GREEN BLUE
|
||||||
|
* ------------------- ----------------------- -----------------
|
||||||
|
* LED_STARTED NuttX has been started OFF OFF OFF
|
||||||
|
* LED_HEAPALLOCATE Heap has been allocated OFF OFF ON
|
||||||
|
* LED_IRQSENABLED Interrupts enabled OFF OFF ON
|
||||||
|
* LED_STACKCREATED Idle stack created OFF ON OFF
|
||||||
|
* LED_INIRQ In an interrupt (no change)
|
||||||
|
* LED_SIGNAL In a signal handler (no change)
|
||||||
|
* LED_ASSERTION An assertion failed (no change)
|
||||||
|
* LED_PANIC The system has crashed FLASH OFF OFF
|
||||||
|
* LED_IDLE K64 is in sleep mode (Optional, not used)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <px4_config.h>
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
#include <nuttx/board.h>
|
||||||
|
#include <arch/board/board.h>
|
||||||
|
|
||||||
|
#include "chip.h"
|
||||||
|
#include "kinetis.h"
|
||||||
|
#include "board_config.h"
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARCH_LEDS
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Pre-processor Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* Summary of all possible settings */
|
||||||
|
|
||||||
|
#define LED_NOCHANGE 0 /* LED_IRQSENABLED, LED_INIRQ, LED_SIGNAL, LED_ASSERTION */
|
||||||
|
#define LED_OFF_OFF_OFF 1 /* LED_STARTED */
|
||||||
|
#define LED_OFF_OFF_ON 2 /* LED_HEAPALLOCATE */
|
||||||
|
#define LED_OFF_ON_OFF 3 /* LED_STACKCREATED */
|
||||||
|
#define LED_ON_OFF_OFF 4 /* LED_PANIC */
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: board_autoled_initialize
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Initialize the on-board LED
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void board_autoled_initialize(void)
|
||||||
|
{
|
||||||
|
kinetis_pinconfig(GPIO_LED_R);
|
||||||
|
kinetis_pinconfig(GPIO_LED_G);
|
||||||
|
kinetis_pinconfig(GPIO_LED_B);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: board_autoled_on
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void board_autoled_on(int led)
|
||||||
|
{
|
||||||
|
if (led != LED_NOCHANGE) {
|
||||||
|
bool redoff = true;
|
||||||
|
bool greenoff = true;
|
||||||
|
bool blueoff = true;
|
||||||
|
|
||||||
|
switch (led) {
|
||||||
|
default:
|
||||||
|
case LED_OFF_OFF_OFF:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LED_OFF_OFF_ON:
|
||||||
|
blueoff = false;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LED_OFF_ON_OFF:
|
||||||
|
greenoff = false;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LED_ON_OFF_OFF:
|
||||||
|
redoff = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
kinetis_gpiowrite(GPIO_LED_R, redoff);
|
||||||
|
kinetis_gpiowrite(GPIO_LED_G, greenoff);
|
||||||
|
kinetis_gpiowrite(GPIO_LED_B, blueoff);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: board_autoled_off
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void board_autoled_off(int led)
|
||||||
|
{
|
||||||
|
if (led == LED_ON_OFF_OFF) {
|
||||||
|
kinetis_gpiowrite(GPIO_LED_R, true);
|
||||||
|
kinetis_gpiowrite(GPIO_LED_G, true);
|
||||||
|
kinetis_gpiowrite(GPIO_LED_B, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_ARCH_LEDS */
|
||||||
@@ -0,0 +1,314 @@
|
|||||||
|
/************************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2016 Gregory Nutt. All rights reserved.
|
||||||
|
* Authors: Gregory Nutt <gnutt@nuttx.org>
|
||||||
|
* David Sidrane <david_s5@nscdg.com>
|
||||||
|
*
|
||||||
|
* 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 <px4_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 "board_config.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_AUTOMOUNTER
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Pre-processor Definitions
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
#ifndef NULL
|
||||||
|
# define NULL (FAR void *)0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef OK
|
||||||
|
# define OK 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Private Types
|
||||||
|
************************************************************************************/
|
||||||
|
/* This structure represents the changeable state of the automounter */
|
||||||
|
|
||||||
|
struct nxphlite_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 nxphlite_automount_config_s {
|
||||||
|
/* This must be first thing in structure so that we can simply cast from struct
|
||||||
|
* automount_lower_s to struct nxphlite_automount_config_s
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct automount_lower_s lower; /* Publicly visible part */
|
||||||
|
FAR struct nxphlite_automount_state_s *state; /* Changeable state */
|
||||||
|
};
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Private Function Prototypes
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
static int nxphlite_attach(FAR const struct automount_lower_s *lower,
|
||||||
|
automount_handler_t isr, FAR void *arg);
|
||||||
|
static void nxphlite_enable(FAR const struct automount_lower_s *lower, bool enable);
|
||||||
|
static bool nxphlite_inserted(FAR const struct automount_lower_s *lower);
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Private Data
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
static struct nxphlite_automount_state_s g_sdhc_state;
|
||||||
|
static const struct nxphlite_automount_config_s g_sdhc_config = {
|
||||||
|
.lower =
|
||||||
|
{
|
||||||
|
.fstype = CONFIG_NXPHLITE_SDHC_AUTOMOUNT_FSTYPE,
|
||||||
|
.blockdev = CONFIG_NXPHLITE_SDHC_AUTOMOUNT_BLKDEV,
|
||||||
|
.mountpoint = CONFIG_NXPHLITE_SDHC_AUTOMOUNT_MOUNTPOINT,
|
||||||
|
.ddelay = MSEC2TICK(CONFIG_NXPHLITE_SDHC_AUTOMOUNT_DDELAY),
|
||||||
|
.udelay = MSEC2TICK(CONFIG_NXPHLITE_SDHC_AUTOMOUNT_UDELAY),
|
||||||
|
.attach = nxphlite_attach,
|
||||||
|
.enable = nxphlite_enable,
|
||||||
|
.inserted = nxphlite_inserted
|
||||||
|
},
|
||||||
|
.state = &g_sdhc_state
|
||||||
|
};
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Name: nxphlite_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 nxphlite_attach(FAR const struct automount_lower_s *lower,
|
||||||
|
automount_handler_t isr, FAR void *arg)
|
||||||
|
{
|
||||||
|
FAR const struct nxphlite_automount_config_s *config;
|
||||||
|
FAR struct nxphlite_automount_state_s *state;
|
||||||
|
|
||||||
|
/* Recover references to our structure */
|
||||||
|
|
||||||
|
config = (FAR struct nxphlite_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: nxphlite_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 nxphlite_enable(FAR const struct automount_lower_s *lower, bool enable)
|
||||||
|
{
|
||||||
|
FAR const struct nxphlite_automount_config_s *config;
|
||||||
|
FAR struct nxphlite_automount_state_s *state;
|
||||||
|
irqstate_t flags;
|
||||||
|
|
||||||
|
/* Recover references to our structure */
|
||||||
|
|
||||||
|
config = (FAR struct nxphlite_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 = nxphlite_cardinserted();
|
||||||
|
(void)state->handler(&config->lower, state->arg, inserted);
|
||||||
|
}
|
||||||
|
|
||||||
|
state->pending = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
leave_critical_section(flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Name: nxphlite_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 nxphlite_inserted(FAR const struct automount_lower_s *lower)
|
||||||
|
{
|
||||||
|
return nxphlite_cardinserted();
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Name: nxphlite_automount_initialize
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Configure auto-mounters for each enable and so configured SDHC
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* None
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* None
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
void nxphlite_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: nxphlite_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 nxphlite_automount_event(bool inserted)
|
||||||
|
{
|
||||||
|
FAR const struct nxphlite_automount_config_s *config = &g_sdhc_config;
|
||||||
|
FAR struct nxphlite_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,123 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2016 Gregory Nutt. All rights reserved.
|
||||||
|
* Authors: Gregory Nutt <gnutt@nuttx.org>
|
||||||
|
* David Sidrane <david_s5@nscdg.com>
|
||||||
|
*
|
||||||
|
* 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 <px4_config.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/mount.h>
|
||||||
|
#include <syslog.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
#include "board_config.h"
|
||||||
|
|
||||||
|
#if defined(CONFIG_LIB_BOARDCTL) || defined(CONFIG_BOARD_INITIALIZE)
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: nxphlite_bringup
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Bring up board features
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
int nxphlite_bringup(void)
|
||||||
|
{
|
||||||
|
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 SDHC driver */
|
||||||
|
|
||||||
|
ret = nxphlite_sdhc_initialize();
|
||||||
|
|
||||||
|
if (ret < 0) {
|
||||||
|
mcerr("ERROR: nxphlite_sdhc_initialize() failed: %d\n", ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_NXPHLITE_SDHC_MOUNT
|
||||||
|
|
||||||
|
else {
|
||||||
|
/* REVISIT: A delay seems to be required here or the mount will fail. */
|
||||||
|
/* Mount the volume on HSMCI0 */
|
||||||
|
|
||||||
|
ret = mount(CONFIG_NXPHLITE_SDHC_MOUNT_BLKDEV,
|
||||||
|
CONFIG_NXPHLITE_SDHC_MOUNT_MOUNTPOINT,
|
||||||
|
CONFIG_NXPHLITE_SDHC_MOUNT_FSTYPE,
|
||||||
|
0, NULL);
|
||||||
|
|
||||||
|
if (ret < 0) {
|
||||||
|
mcerr("ERROR: Failed to mount %s: %d\n",
|
||||||
|
CONFIG_NXPHLITE_SDHC_MOUNT_MOUNTPOINT, errno);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_NXPHLITE_SDHC_MOUNT */
|
||||||
|
#endif /* HAVE_MMCSD */
|
||||||
|
|
||||||
|
#ifdef HAVE_AUTOMOUNTER
|
||||||
|
/* Initialize the auto-mounter */
|
||||||
|
|
||||||
|
nxphlite_automount_initialize();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
UNUSED(ret);
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_LIB_BOARDCTL CONFIG_BOARD_INITIALIZE */
|
||||||
@@ -0,0 +1,129 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2016 PX4 Development Team. All rights reserved.
|
||||||
|
*
|
||||||
|
* 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 PX4 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file nxphlite_can.c
|
||||||
|
*
|
||||||
|
* Board-specific CAN functions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Included Files
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
#include <px4_config.h>
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
#include <nuttx/drivers/can.h>
|
||||||
|
#include <arch/board/board.h>
|
||||||
|
|
||||||
|
#include <chip.h>
|
||||||
|
#include <kinetis.h>
|
||||||
|
#include "up_arch.h"
|
||||||
|
|
||||||
|
#include "board_config.h"
|
||||||
|
|
||||||
|
#ifdef CONFIG_CAN
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Pre-processor Definitions
|
||||||
|
************************************************************************************/
|
||||||
|
/* Configuration ********************************************************************/
|
||||||
|
|
||||||
|
#if defined(KINETIS_FLEXCAN0) && defined(KINETIS_FLEXCAN1)
|
||||||
|
# warning "Both CAN0 and CAN1 are enabled. Assuming only CAN0."
|
||||||
|
# undef KINETIS_FLEXCAN0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef KINETIS_FLEXCAN0
|
||||||
|
# define CAN_PORT 1
|
||||||
|
#else
|
||||||
|
# define CAN_PORT 2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
************************************************************************************/
|
||||||
|
int can_devinit(void);
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Name: can_devinit
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* All architectures must provide the following interface to work with
|
||||||
|
* examples/can.
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
int can_devinit(void)
|
||||||
|
{
|
||||||
|
static bool initialized = false;
|
||||||
|
struct can_dev_s *can;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
/* Check if we have already initialized */
|
||||||
|
|
||||||
|
if (!initialized) {
|
||||||
|
/* Call kinetis_caninitialize() to get an instance of the CAN interface */
|
||||||
|
|
||||||
|
can = kinetis_caninitialize(CAN_PORT);
|
||||||
|
|
||||||
|
if (can == NULL) {
|
||||||
|
canerr("ERROR: Failed to get CAN interface\n");
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Register the CAN driver at "/dev/can0" */
|
||||||
|
|
||||||
|
ret = can_register("/dev/can0", can);
|
||||||
|
|
||||||
|
if (ret < 0) {
|
||||||
|
canerr("ERROR: can_register failed: %d\n", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now we are initialized */
|
||||||
|
|
||||||
|
initialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,479 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (c) 2016 PX4 Development Team. All rights reserved.
|
||||||
|
*
|
||||||
|
* 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 PX4 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file nxphlite_init.c
|
||||||
|
*
|
||||||
|
* NXPHLITEV1v2-specific early startup code. This file implements the
|
||||||
|
* board_app_initialize() function that is called early by nsh during startup.
|
||||||
|
*
|
||||||
|
* Code here is run before the rcS script is invoked; it should start required
|
||||||
|
* subsystems and perform board-specific initialization.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <px4_config.h>
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <debug.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include <nuttx/arch.h>
|
||||||
|
#include <nuttx/board.h>
|
||||||
|
#include <nuttx/spi/spi.h>
|
||||||
|
#include <nuttx/i2c/i2c_master.h>
|
||||||
|
#include <nuttx/sdio.h>
|
||||||
|
#include <nuttx/mmcsd.h>
|
||||||
|
#include <nuttx/analog/adc.h>
|
||||||
|
|
||||||
|
#include <kinetis.h>
|
||||||
|
#include "board_config.h"
|
||||||
|
|
||||||
|
#include <arch/board/board.h>
|
||||||
|
|
||||||
|
#include <drivers/drv_hrt.h>
|
||||||
|
#include <drivers/drv_led.h>
|
||||||
|
|
||||||
|
#include <systemlib/px4_macros.h>
|
||||||
|
#include <systemlib/cpuload.h>
|
||||||
|
#include <systemlib/perf_counter.h>
|
||||||
|
#include <systemlib/err.h>
|
||||||
|
|
||||||
|
#if defined(CONFIG_KINETIS_BBSRAM) //fixme:Need BBSRAM
|
||||||
|
#include <systemlib/hardfault_log.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <systemlib/systemlib.h>
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Pre-Processor Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* Configuration ************************************************************/
|
||||||
|
|
||||||
|
/* Debug ********************************************************************/
|
||||||
|
|
||||||
|
#ifdef CONFIG_CPP_HAVE_VARARGS
|
||||||
|
# ifdef CONFIG_DEBUG
|
||||||
|
# define message(...) syslog(__VA_ARGS__)
|
||||||
|
# else
|
||||||
|
# define message(...) printf(__VA_ARGS__)
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# ifdef CONFIG_DEBUG
|
||||||
|
# define message syslog
|
||||||
|
# else
|
||||||
|
# define message printf
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Ideally we'd be able to get these from up_internal.h,
|
||||||
|
* but since we want to be able to disable the NuttX use
|
||||||
|
* of leds for system indication at will and there is no
|
||||||
|
* separate switch, we need to build independent of the
|
||||||
|
* CONFIG_ARCH_LEDS configuration switch.
|
||||||
|
*/
|
||||||
|
__BEGIN_DECLS
|
||||||
|
extern void led_init(void);
|
||||||
|
extern void led_on(int led);
|
||||||
|
extern void led_off(int led);
|
||||||
|
__END_DECLS
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Protected Functions
|
||||||
|
****************************************************************************/
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
/************************************************************************************
|
||||||
|
* Name: board_peripheral_reset
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
__EXPORT void board_peripheral_reset(int ms)
|
||||||
|
{
|
||||||
|
/* set the peripheral rails off */
|
||||||
|
|
||||||
|
/* wait for the peripheral rail to reach GND */
|
||||||
|
usleep(ms * 1000);
|
||||||
|
warnx("reset done, %d ms", ms);
|
||||||
|
|
||||||
|
/* re-enable power */
|
||||||
|
|
||||||
|
/* switch the peripheral rail back on */
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Name: stm32_boardinitialize
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* All Kinetis 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.
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
__EXPORT void
|
||||||
|
kinetis_boardinitialize(void)
|
||||||
|
{
|
||||||
|
/* configure LEDs */
|
||||||
|
board_autoled_initialize();
|
||||||
|
|
||||||
|
/* configure ADC pins */
|
||||||
|
#if defined(GPIO_ADC1_IN2)
|
||||||
|
kinetis_pinconfig(GPIO_ADC1_IN2); /* BATT_VOLTAGE_SENS */
|
||||||
|
kinetis_pinconfig(GPIO_ADC1_IN3); /* BATT_CURRENT_SENS */
|
||||||
|
kinetis_pinconfig(GPIO_ADC1_IN4); /* VDD_5V_SENS */
|
||||||
|
kinetis_pinconfig(GPIO_ADC1_IN13); /* FMU_AUX_ADC_1 */
|
||||||
|
kinetis_pinconfig(GPIO_ADC1_IN14); /* FMU_AUX_ADC_2 */
|
||||||
|
kinetis_pinconfig(GPIO_ADC1_IN15); /* PRESSURE_SENS */
|
||||||
|
#endif
|
||||||
|
#if defined(GPIO_VDD_5V_PERIPH_EN)
|
||||||
|
/* configure power supply control/sense pins */
|
||||||
|
kinetis_pinconfig(GPIO_VDD_5V_PERIPH_EN);
|
||||||
|
kinetis_pinconfig(GPIO_VDD_3V3_SENSORS_EN);
|
||||||
|
kinetis_pinconfig(GPIO_VDD_BRICK_VALID);
|
||||||
|
kinetis_pinconfig(GPIO_VDD_SERVO_VALID);
|
||||||
|
kinetis_pinconfig(GPIO_VDD_5V_HIPOWER_OC);
|
||||||
|
kinetis_pinconfig(GPIO_VDD_5V_PERIPH_OC);
|
||||||
|
#endif
|
||||||
|
/* configure the GPIO pins to outputs and keep them low */
|
||||||
|
kinetis_pinconfig(GPIO_GPIO0_OUTPUT);
|
||||||
|
kinetis_pinconfig(GPIO_GPIO1_OUTPUT);
|
||||||
|
kinetis_pinconfig(GPIO_GPIO2_OUTPUT);
|
||||||
|
kinetis_pinconfig(GPIO_GPIO3_OUTPUT);
|
||||||
|
kinetis_pinconfig(GPIO_GPIO4_OUTPUT);
|
||||||
|
kinetis_pinconfig(GPIO_GPIO5_OUTPUT);
|
||||||
|
kinetis_pinconfig(GPIO_GPIO6_OUTPUT);
|
||||||
|
kinetis_pinconfig(GPIO_GPIO7_OUTPUT);
|
||||||
|
kinetis_pinconfig(GPIO_GPIO8_OUTPUT);
|
||||||
|
kinetis_pinconfig(GPIO_GPIO9_OUTPUT);
|
||||||
|
kinetis_pinconfig(GPIO_GPIO10_OUTPUT);
|
||||||
|
kinetis_pinconfig(GPIO_GPIO11_OUTPUT);
|
||||||
|
kinetis_pinconfig(GPIO_GPIO12_OUTPUT);
|
||||||
|
kinetis_pinconfig(GPIO_GPIO13_OUTPUT);
|
||||||
|
|
||||||
|
/* configure SPI interfaces */
|
||||||
|
nxphlite_spidev_initialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME:STUBS
|
||||||
|
#include <termios.h>
|
||||||
|
|
||||||
|
int cfsetspeed(FAR struct termios *termiosp, speed_t speed);
|
||||||
|
int cfsetspeed(FAR struct termios *termiosp, speed_t speed)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int up_rtc_getdatetime(FAR struct tm *tp);
|
||||||
|
int up_rtc_getdatetime(FAR struct tm *tp)
|
||||||
|
{
|
||||||
|
tp->tm_sec = 0;
|
||||||
|
tp->tm_min = 0;
|
||||||
|
tp->tm_hour = 0;
|
||||||
|
tp->tm_mday = 30;
|
||||||
|
tp->tm_mon = 10;
|
||||||
|
tp->tm_year = 116;
|
||||||
|
tp->tm_wday = 1; /* Day of the week (0-6) */
|
||||||
|
tp->tm_yday = 0; /* Day of the year (0-365) */
|
||||||
|
tp->tm_isdst = 0; /* Non-0 if daylight savings time is in effect */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
FAR struct spi_dev_s *kinetis_spibus_initialize(int bus);
|
||||||
|
FAR struct spi_dev_s *kinetis_spibus_initialize(int bus)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
static void kinetis_serial_dma_poll(void)
|
||||||
|
{
|
||||||
|
// todo:Stubbed
|
||||||
|
}
|
||||||
|
struct termios;
|
||||||
|
int tcgetattr(int fd, FAR struct termios *termiosp);
|
||||||
|
int tcsetattr(int fd, int options, FAR const struct termios *termiosp);
|
||||||
|
int tcgetattr(int fd, FAR struct termios *termiosp)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int tcsetattr(int fd, int options, FAR const struct termios *termiosp)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
__EXPORT int board_app_initialize(uintptr_t arg)
|
||||||
|
{
|
||||||
|
#if defined(CONFIG_HAVE_CXX) && defined(CONFIG_HAVE_CXXINITIALIZE)
|
||||||
|
|
||||||
|
/* run C++ ctors before we go any further */
|
||||||
|
|
||||||
|
up_cxxinitialize();
|
||||||
|
|
||||||
|
# if defined(CONFIG_EXAMPLES_NSH_CXXINITIALIZE)
|
||||||
|
# error CONFIG_EXAMPLES_NSH_CXXINITIALIZE Must not be defined! Use CONFIG_HAVE_CXX and CONFIG_HAVE_CXXINITIALIZE.
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#else
|
||||||
|
# error platform is dependent on c++ both CONFIG_HAVE_CXX and CONFIG_HAVE_CXXINITIALIZE must be defined.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* configure the high-resolution time/callout interface */
|
||||||
|
hrt_init();
|
||||||
|
|
||||||
|
/* configure the DMA allocator */
|
||||||
|
|
||||||
|
if (board_dma_alloc_init() < 0) {
|
||||||
|
message("DMA alloc FAILED");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* configure CPU load estimation */
|
||||||
|
#ifdef CONFIG_SCHED_INSTRUMENTATION
|
||||||
|
cpuload_initialize_once();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* set up the serial DMA polling */
|
||||||
|
static struct hrt_call serial_dma_call;
|
||||||
|
struct timespec ts;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Poll at 1ms intervals for received bytes that have not triggered
|
||||||
|
* a DMA event.
|
||||||
|
*/
|
||||||
|
ts.tv_sec = 0;
|
||||||
|
ts.tv_nsec = 1000000;
|
||||||
|
|
||||||
|
hrt_call_every(&serial_dma_call,
|
||||||
|
ts_to_abstime(&ts),
|
||||||
|
ts_to_abstime(&ts),
|
||||||
|
(hrt_callout)kinetis_serial_dma_poll,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
#if defined(CONFIG_KINETIS_BBSRAM)
|
||||||
|
|
||||||
|
/* NB. the use of the console requires the hrt running
|
||||||
|
* to poll the DMA
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Using Battery Backed Up SRAM */
|
||||||
|
|
||||||
|
int filesizes[CONFIG_KINETIS_BBSRAM_FILES + 1] = BSRAM_FILE_SIZES;
|
||||||
|
|
||||||
|
stm32_bbsraminitialize(BBSRAM_PATH, filesizes);
|
||||||
|
|
||||||
|
#if defined(CONFIG_KINETIS_SAVE_CRASHDUMP)
|
||||||
|
|
||||||
|
/* Panic Logging in Battery Backed Up Files */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* In an ideal world, if a fault happens in flight the
|
||||||
|
* system save it to BBSRAM will then reboot. Upon
|
||||||
|
* rebooting, the system will log the fault to disk, recover
|
||||||
|
* the flight state and continue to fly. But if there is
|
||||||
|
* a fault on the bench or in the air that prohibit the recovery
|
||||||
|
* or committing the log to disk, the things are too broken to
|
||||||
|
* fly. So the question is:
|
||||||
|
*
|
||||||
|
* Did we have a hard fault and not make it far enough
|
||||||
|
* through the boot sequence to commit the fault data to
|
||||||
|
* the SD card?
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Do we have an uncommitted hard fault in BBSRAM?
|
||||||
|
* - this will be reset after a successful commit to SD
|
||||||
|
*/
|
||||||
|
int hadCrash = hardfault_check_status("boot");
|
||||||
|
|
||||||
|
if (hadCrash == OK) {
|
||||||
|
|
||||||
|
message("[boot] There is a hard fault logged. Hold down the SPACE BAR," \
|
||||||
|
" while booting to halt the system!\n");
|
||||||
|
|
||||||
|
/* Yes. So add one to the boot count - this will be reset after a successful
|
||||||
|
* commit to SD
|
||||||
|
*/
|
||||||
|
|
||||||
|
int reboots = hardfault_increment_reboot("boot", false);
|
||||||
|
|
||||||
|
/* Also end the misery for a user that holds for a key down on the console */
|
||||||
|
|
||||||
|
int bytesWaiting;
|
||||||
|
ioctl(fileno(stdin), FIONREAD, (unsigned long)((uintptr_t) &bytesWaiting));
|
||||||
|
|
||||||
|
if (reboots > 2 || bytesWaiting != 0) {
|
||||||
|
|
||||||
|
/* Since we can not commit the fault dump to disk. Display it
|
||||||
|
* to the console.
|
||||||
|
*/
|
||||||
|
|
||||||
|
hardfault_write("boot", fileno(stdout), HARDFAULT_DISPLAY_FORMAT, false);
|
||||||
|
|
||||||
|
message("[boot] There were %d reboots with Hard fault that were not committed to disk - System halted %s\n",
|
||||||
|
reboots,
|
||||||
|
(bytesWaiting == 0 ? "" : " Due to Key Press\n"));
|
||||||
|
|
||||||
|
|
||||||
|
/* For those of you with a debugger set a break point on up_assert and
|
||||||
|
* then set dbgContinue = 1 and go.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Clear any key press that got us here */
|
||||||
|
|
||||||
|
static volatile bool dbgContinue = false;
|
||||||
|
int c = '>';
|
||||||
|
|
||||||
|
while (!dbgContinue) {
|
||||||
|
|
||||||
|
switch (c) {
|
||||||
|
|
||||||
|
case EOF:
|
||||||
|
|
||||||
|
|
||||||
|
case '\n':
|
||||||
|
case '\r':
|
||||||
|
case ' ':
|
||||||
|
continue;
|
||||||
|
|
||||||
|
default:
|
||||||
|
|
||||||
|
putchar(c);
|
||||||
|
putchar('\n');
|
||||||
|
|
||||||
|
switch (c) {
|
||||||
|
|
||||||
|
case 'D':
|
||||||
|
case 'd':
|
||||||
|
hardfault_write("boot", fileno(stdout), HARDFAULT_DISPLAY_FORMAT, false);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'C':
|
||||||
|
case 'c':
|
||||||
|
hardfault_rearm("boot");
|
||||||
|
hardfault_increment_reboot("boot", true);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'B':
|
||||||
|
case 'b':
|
||||||
|
dbgContinue = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
} // Inner Switch
|
||||||
|
|
||||||
|
message("\nEnter B - Continue booting\n" \
|
||||||
|
"Enter C - Clear the fault log\n" \
|
||||||
|
"Enter D - Dump fault log\n\n?>");
|
||||||
|
fflush(stdout);
|
||||||
|
|
||||||
|
if (!dbgContinue) {
|
||||||
|
c = getchar();
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
} // outer switch
|
||||||
|
} // for
|
||||||
|
|
||||||
|
} // inner if
|
||||||
|
} // outer if
|
||||||
|
|
||||||
|
#endif // CONFIG_KINETIS_SAVE_CRASHDUMP
|
||||||
|
#endif // CONFIG_KINETIS_BBSRAM
|
||||||
|
|
||||||
|
/* initial LED state */
|
||||||
|
drv_led_start();
|
||||||
|
led_off(LED_RED);
|
||||||
|
led_off(LED_GREEN);
|
||||||
|
led_off(LED_BLUE);
|
||||||
|
|
||||||
|
/* Configure SPI-based devices */
|
||||||
|
|
||||||
|
#ifdef CONFIG_SPI
|
||||||
|
int ret = nxphlite_spi_bus_initialize();
|
||||||
|
|
||||||
|
if (ret != OK) {
|
||||||
|
board_autoled_on(LED_RED);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_MMCSD
|
||||||
|
ret = nxphlite_sdio_initialize();
|
||||||
|
|
||||||
|
if (ret != OK) {
|
||||||
|
board_autoled_on(LED_RED);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
nxphlite_usbinitialize();
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
@@ -0,0 +1,107 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (c) 2016 PX4 Development Team. All rights reserved.
|
||||||
|
*
|
||||||
|
* 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 PX4 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file nxphlite_led.c
|
||||||
|
*
|
||||||
|
* NXPHLITEV1 LED backend.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <px4_config.h>
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#include "kinetis.h"
|
||||||
|
#include "chip.h"
|
||||||
|
#include "board_config.h"
|
||||||
|
|
||||||
|
#include <arch/board/board.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Ideally we'd be able to get these from up_internal.h,
|
||||||
|
* but since we want to be able to disable the NuttX use
|
||||||
|
* of leds for system indication at will and there is no
|
||||||
|
* separate switch, we need to build independent of the
|
||||||
|
* CONFIG_ARCH_LEDS configuration switch.
|
||||||
|
*/
|
||||||
|
__BEGIN_DECLS
|
||||||
|
extern void led_init(void);
|
||||||
|
extern void led_on(int led);
|
||||||
|
extern void led_off(int led);
|
||||||
|
extern void led_toggle(int led);
|
||||||
|
__END_DECLS
|
||||||
|
|
||||||
|
|
||||||
|
static uint32_t g_ledmap[] = {
|
||||||
|
GPIO_LED_B, // Indexed by LED_BLUE
|
||||||
|
GPIO_LED_R, // Indexed by LED_RED, LED_AMBER
|
||||||
|
GPIO_LED_SAFETY, // Indexed by LED_SAFETY
|
||||||
|
GPIO_LED_G, // Indexed by LED_GREEN
|
||||||
|
};
|
||||||
|
|
||||||
|
__EXPORT void led_init(void)
|
||||||
|
{
|
||||||
|
/* Configure LED GPIOs for output */
|
||||||
|
for (size_t l = 0; l < (sizeof(g_ledmap) / sizeof(g_ledmap[0])); l++) {
|
||||||
|
kinetis_pinconfig(g_ledmap[l]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void phy_set_led(int led, bool state)
|
||||||
|
{
|
||||||
|
/* Drive High to switch on */
|
||||||
|
|
||||||
|
kinetis_gpiowrite(g_ledmap[led], state);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool phy_get_led(int led)
|
||||||
|
{
|
||||||
|
|
||||||
|
return kinetis_gpioread(g_ledmap[led]);
|
||||||
|
}
|
||||||
|
|
||||||
|
__EXPORT void led_on(int led)
|
||||||
|
{
|
||||||
|
phy_set_led(led, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
__EXPORT void led_off(int led)
|
||||||
|
{
|
||||||
|
phy_set_led(led, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
__EXPORT void led_toggle(int led)
|
||||||
|
{
|
||||||
|
|
||||||
|
phy_set_led(led, !phy_get_led(led));
|
||||||
|
}
|
||||||
@@ -0,0 +1,106 @@
|
|||||||
|
/************************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2013, 2015, 2016 Gregory Nutt. All rights reserved.
|
||||||
|
* Authors: Gregory Nutt <gnutt@nuttx.org>
|
||||||
|
* Jordan MacIntyre <jordanroymax@gmail.com>
|
||||||
|
* David Sidrane <david_s5@nscdg.com>
|
||||||
|
*
|
||||||
|
* 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 <px4_config.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
#include <nuttx/board.h>
|
||||||
|
#include <nuttx/drivers/pwm.h>
|
||||||
|
|
||||||
|
#include <arch/board/board.h>
|
||||||
|
|
||||||
|
#include "chip.h"
|
||||||
|
#include "up_arch.h"
|
||||||
|
#include "kinetis_pwm.h"
|
||||||
|
|
||||||
|
#ifdef CONFIG_PWM
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Name: board_pwm_setup
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* All Kinetis K architectures must provide the following interface to work with
|
||||||
|
* examples/pwm.
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
int board_pwm_setup(void)
|
||||||
|
{
|
||||||
|
FAR struct pwm_lowerhalf_s *pwm;
|
||||||
|
static bool initialized = false;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
/* Have we already initialized? */
|
||||||
|
|
||||||
|
if (!initialized) {
|
||||||
|
/* Call nxphlite_pwminitialize() to get an instance of the PWM interface */
|
||||||
|
|
||||||
|
pwm = kinetis_pwminitialize(0);
|
||||||
|
|
||||||
|
if (!pwm) {
|
||||||
|
aerr("ERROR: Failed to get the kinetis PWM lower half\n");
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Register the PWM driver at "/dev/pwm0" */
|
||||||
|
|
||||||
|
ret = pwm_register("/dev/pwm0", pwm);
|
||||||
|
|
||||||
|
if (ret < 0) {
|
||||||
|
aerr("ERROR: pwm_register failed: %d\n", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now we are initialized */
|
||||||
|
|
||||||
|
initialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_PWM */
|
||||||
@@ -0,0 +1,249 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2016 Gregory Nutt. All rights reserved.
|
||||||
|
* Authors: Gregory Nutt <gnutt@nuttx.org>
|
||||||
|
* David Sidrane <david_s5@nscdg.com>
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
// TODO:Not used on V1 HW
|
||||||
|
/* 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 <px4_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 "board_config.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_MMCSD
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Pre-processor Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Types
|
||||||
|
****************************************************************************/
|
||||||
|
/* This structure holds static information unique to one SDHC peripheral */
|
||||||
|
|
||||||
|
struct nxphlite_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 nxphlite_sdhc_state_s g_sdhc;
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: nxphlite_mediachange
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static void nxphlite_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_NXPHLITE_SDHC_AUTOMOUNT
|
||||||
|
/* Let the automounter know about the insertion event */
|
||||||
|
|
||||||
|
nxphlite_automount_event(nxphlite_cardinserted());
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: nxphlite_cdinterrupt
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static int nxphlite_cdinterrupt(int irq, FAR void *context)
|
||||||
|
{
|
||||||
|
/* All of the work is done by nxphlite_mediachange() */
|
||||||
|
|
||||||
|
nxphlite_mediachange();
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: nxphlite_sdhc_initialize
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Inititialize the SDHC SD card slot
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
int nxphlite_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, nxphlite_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 */
|
||||||
|
|
||||||
|
nxphlite_mediachange();
|
||||||
|
|
||||||
|
/* Enable CD interrupts to handle subsequent media changes */
|
||||||
|
|
||||||
|
kinetis_pinirqenable(GPIO_SD_CARDDETECT);
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: nxphlite_cardinserted
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Check if a card is inserted into the SDHC slot
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef HAVE_AUTOMOUNTER
|
||||||
|
bool nxphlite_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: nxphlite_writeprotected
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Check if a card is inserted into the SDHC slot
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef HAVE_AUTOMOUNTER
|
||||||
|
bool nxphlite_writeprotected(void)
|
||||||
|
{
|
||||||
|
/* There are no write protect pins */
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* HAVE_MMCSD */
|
||||||
@@ -0,0 +1,120 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (c) 2016 PX4 Development Team. All rights reserved.
|
||||||
|
* Author: David Sidrane <david_s5@nscdg.com>
|
||||||
|
*
|
||||||
|
* 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 PX4 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file nxphlite-v1_sdio.c
|
||||||
|
*
|
||||||
|
* Board-specific SDIO functions.
|
||||||
|
* V1 of the hardware is ussing SPI for SD card access
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Included Files
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
#include <px4_config.h>
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <debug.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include <nuttx/spi/spi.h>
|
||||||
|
#include <nuttx/mmcsd.h>
|
||||||
|
#include <arch/board/board.h>
|
||||||
|
|
||||||
|
#include "up_arch.h"
|
||||||
|
#include "chip.h"
|
||||||
|
#include "kinetis.h"
|
||||||
|
#include "board_config.h"
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Pre-Processor Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
#ifdef CONFIG_CPP_HAVE_VARARGS
|
||||||
|
# ifdef CONFIG_DEBUG
|
||||||
|
# define message(...) syslog(__VA_ARGS__)
|
||||||
|
# else
|
||||||
|
# define message(...) printf(__VA_ARGS__)
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# ifdef CONFIG_DEBUG
|
||||||
|
# define message syslog
|
||||||
|
# else
|
||||||
|
# define message printf
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Configuration ************************************************************/
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Private Data
|
||||||
|
************************************************************************************/
|
||||||
|
static struct spi_dev_s *spi;
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Name: board_sdio_initialize
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Called to configure SDIO.
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
__EXPORT int nxphlite_sdio_initialize(void)
|
||||||
|
{
|
||||||
|
/* Get the SPI port for the microSD slot */
|
||||||
|
|
||||||
|
spi = kinetis_spibus_initialize(PX4_SPI_BUS_SDCARD);
|
||||||
|
|
||||||
|
if (!spi) {
|
||||||
|
message("[boot] FAILED to initialize SPI port %d\n", PX4_SPI_BUS_SDCARD);
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now bind the SPI interface to the MMCSD driver */
|
||||||
|
int result = mmcsd_spislotinitialize(CONFIG_NSH_MMCSDMINOR, CONFIG_NSH_MMCSDSLOTNO, spi);
|
||||||
|
|
||||||
|
if (result != OK) {
|
||||||
|
message("[boot] FAILED to bind SPI port %d to the MMCSD driver\n", PX4_SPI_BUS_SDCARD);
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
@@ -0,0 +1,286 @@
|
|||||||
|
/************************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2016 Gregory Nutt. All rights reserved.
|
||||||
|
* Authors: Gregory Nutt <gnutt@nuttx.org>
|
||||||
|
* David Sidrane <david_s5@nscdg.com>
|
||||||
|
*
|
||||||
|
* 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 <px4_config.h>
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <debug.h>
|
||||||
|
//#include <unistd.h>
|
||||||
|
|
||||||
|
#include <nuttx/spi/spi.h>
|
||||||
|
#include <arch/board/board.h>
|
||||||
|
|
||||||
|
#include "up_arch.h"
|
||||||
|
#include "chip.h"
|
||||||
|
#include <kinetis.h>
|
||||||
|
#include "board_config.h"
|
||||||
|
#include <systemlib/err.h>
|
||||||
|
#include <systemlib/px4_macros.h>
|
||||||
|
|
||||||
|
#if defined(CONFIG_KINETIS_SPI0) || defined(CONFIG_KINETIS_SPI1) || \
|
||||||
|
defined(CONFIG_KINETIS_SPI2)
|
||||||
|
|
||||||
|
#ifdef CONFIG_CPP_HAVE_VARARGS
|
||||||
|
# ifdef CONFIG_DEBUG
|
||||||
|
# define message(...) syslog(__VA_ARGS__)
|
||||||
|
# else
|
||||||
|
# define message(...) printf(__VA_ARGS__)
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# ifdef CONFIG_DEBUG
|
||||||
|
# define message syslog
|
||||||
|
# else
|
||||||
|
# define message printf
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
__EXPORT void board_spi_reset(int ms)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Name: nxphlite_spidev_initialize
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Called to configure SPI chip select GPIO pins for the NXPhlite-v1 board.
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
void nxphlite_spidev_initialize(void)
|
||||||
|
{
|
||||||
|
kinetis_pinconfig(GPIO_SPI_CS_SDCARD);
|
||||||
|
kinetis_pinconfig(GPIO_SPI_CS_FXOS8700CQ_ACCEL_MAG);
|
||||||
|
kinetis_pinconfig(GPIO_SPI_CS_FXAS21002CQ_GYRO);
|
||||||
|
|
||||||
|
kinetis_pinconfig(GPIO_GM_RST);
|
||||||
|
kinetis_pinconfig(GPIO_A_RST);
|
||||||
|
|
||||||
|
kinetis_pinconfig(GPIO_EXTI_GYRO_INT1);
|
||||||
|
kinetis_pinconfig(GPIO_EXTI_GYRO_INT2);
|
||||||
|
kinetis_pinconfig(GPIO_EXTI_ACCEL_MAG_INT1);
|
||||||
|
kinetis_pinconfig(GPIO_EXTI_ACCEL_MAG_INT2);
|
||||||
|
kinetis_pinconfig(GPIO_EXTI_BARO_INT1);
|
||||||
|
kinetis_pinconfig(GPIO_EXTI_BARO_INT2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Name: kinetis_spi_bus_initialize
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Called to configure SPI chip select GPIO pins for the NXPHLITEV1 board.
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
static struct spi_dev_s *spi_accel_mag;
|
||||||
|
static struct spi_dev_s *spi_baro;
|
||||||
|
|
||||||
|
__EXPORT int nxphlite_spi_bus_initialize(void)
|
||||||
|
{
|
||||||
|
/* Configure SPI-based devices */
|
||||||
|
|
||||||
|
spi_accel_mag = kinetis_spibus_initialize(PX4_SPI_BUS_ACCEL_MAG);
|
||||||
|
|
||||||
|
if (!spi_accel_mag) {
|
||||||
|
message("[boot] FAILED to initialize SPI port %d\n", PX4_SPI_BUS_ACCEL_MAG);
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Default PX4_SPI_BUS_ACCEL_MAG to 1MHz and de-assert the known chip selects.
|
||||||
|
*/
|
||||||
|
|
||||||
|
SPI_SETFREQUENCY(spi_accel_mag, 1 * 1000 * 1000);
|
||||||
|
SPI_SETBITS(spi_accel_mag, 8);
|
||||||
|
SPI_SETMODE(spi_accel_mag, SPIDEV_MODE3);
|
||||||
|
|
||||||
|
for (int cs = PX4_ACCEL_MAG_BUS_FIRST_CS; cs <= PX4_ACCEL_MAG_BUS_LAST_CS; cs++) {
|
||||||
|
SPI_SELECT(spi_accel_mag, cs, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the SPI port for the GYRO */
|
||||||
|
|
||||||
|
spi_baro = kinetis_spibus_initialize(PX4_SPI_BUS_GYRO);
|
||||||
|
|
||||||
|
if (!spi_baro) {
|
||||||
|
message("[boot] FAILED to initialize SPI port %d\n", PX4_SPI_BUS_GYRO);
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* FXAS21002CQ has max SPI clock speed of 2MHz and uses MODE 0 (CPOL = 0, and CPHA = 0)
|
||||||
|
*/
|
||||||
|
|
||||||
|
SPI_SETFREQUENCY(spi_baro, 2 * 1000 * 1000);
|
||||||
|
SPI_SETBITS(spi_baro, 8);
|
||||||
|
SPI_SETMODE(spi_baro, SPIDEV_MODE0);
|
||||||
|
|
||||||
|
for (int cs = PX4_GYRO_BUS_FIRST_CS; cs <= PX4_GYRO_BUS_LAST_CS; cs++) {
|
||||||
|
SPI_SELECT(spi_baro, cs, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Name: kinetis_spi[n]select, kinetis_spi[n]status, and kinetis_spi[n]cmddata
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* These external functions must be provided by board-specific logic. They are
|
||||||
|
* implementations of the select, status, and cmddata methods of the SPI interface
|
||||||
|
* defined by struct spi_ops_s (see include/nuttx/spi/spi.h). All other methods
|
||||||
|
* including kinetis_spibus_initialize()) are provided by common Kinetis logic.
|
||||||
|
* To use this common SPI logic on your board:
|
||||||
|
*
|
||||||
|
* 1. Provide logic in kinetis_boardinitialize() to configure SPI chip select
|
||||||
|
* pins.
|
||||||
|
* 2. Provide kinetis_spi[n]select() and kinetis_spi[n]status() functions
|
||||||
|
* in your board-specific logic. These functions will perform chip selection
|
||||||
|
* and status operations using GPIOs in the way your board is configured.
|
||||||
|
* 2. If CONFIG_SPI_CMDDATA is defined in the NuttX configuration, provide
|
||||||
|
* kinetis_spi[n]cmddata() functions in your board-specific logic. These
|
||||||
|
* functions will perform cmd/data selection operations using GPIOs in the way
|
||||||
|
* your board is configured.
|
||||||
|
* 3. Add a call to kinetis_spibus_initialize() in your low level application
|
||||||
|
* initialization logic
|
||||||
|
* 4. The handle returned by kinetis_spibus_initialize() may then be used to bind the
|
||||||
|
* SPI driver to higher level logic (e.g., calling
|
||||||
|
* mmcsd_spislotinitialize(), for example, will bind the SPI driver to
|
||||||
|
* the SPI MMC/SD driver).
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
static const uint32_t spi0selects_gpio[] = PX4_SDCARD_BUS_CS_GPIO;
|
||||||
|
|
||||||
|
void kinetis_spi0select(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool selected)
|
||||||
|
{
|
||||||
|
spiinfo("devid: %d CS: %s\n", (int)devid, selected ? "assert" : "de-assert");
|
||||||
|
|
||||||
|
/* SPI select is active low, so write !selected to select the device */
|
||||||
|
|
||||||
|
int sel = (int) devid;
|
||||||
|
ASSERT(PX4_SPI_BUS_ID(sel) == PX4_SPI_BUS_SDCARD);
|
||||||
|
|
||||||
|
/* Making sure the other peripherals are not selected */
|
||||||
|
|
||||||
|
for (int cs = 0; arraySize(spi0selects_gpio) > 1 && cs < arraySize(spi0selects_gpio); cs++) {
|
||||||
|
if (spi0selects_gpio[cs] != 0) {
|
||||||
|
kinetis_gpiowrite(spi0selects_gpio[cs], 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t gpio = spi0selects_gpio[PX4_SPI_DEV_ID(sel)];
|
||||||
|
|
||||||
|
if (gpio) {
|
||||||
|
kinetis_gpiowrite(gpio, !selected);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t kinetis_spi0status(FAR struct spi_dev_s *dev, enum spi_dev_e devid)
|
||||||
|
{
|
||||||
|
return SPI_STATUS_PRESENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const uint32_t spi1selects_gpio[] = PX4_ACCEL_MAG_BUS_CS_GPIO;
|
||||||
|
|
||||||
|
void kinetis_spi1select(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool selected)
|
||||||
|
{
|
||||||
|
spiinfo("devid: %d CS: %s\n", (int)devid, selected ? "assert" : "de-assert");
|
||||||
|
|
||||||
|
/* SPI select is active low, so write !selected to select the device */
|
||||||
|
|
||||||
|
int sel = (int) devid;
|
||||||
|
ASSERT(PX4_SPI_BUS_ID(sel) == PX4_SPI_BUS_ACCEL_MAG);
|
||||||
|
|
||||||
|
/* Making sure the other peripherals are not selected */
|
||||||
|
|
||||||
|
for (int cs = 0; arraySize(spi1selects_gpio) > 1 && cs < arraySize(spi1selects_gpio); cs++) {
|
||||||
|
if (spi1selects_gpio[cs] != 0) {
|
||||||
|
kinetis_gpiowrite(spi1selects_gpio[cs], 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t gpio = spi1selects_gpio[PX4_SPI_DEV_ID(sel)];
|
||||||
|
|
||||||
|
if (gpio) {
|
||||||
|
kinetis_gpiowrite(gpio, !selected);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t kinetis_spi1status(FAR struct spi_dev_s *dev, enum spi_dev_e devid)
|
||||||
|
{
|
||||||
|
return SPI_STATUS_PRESENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const uint32_t spi2selects_gpio[] = PX4_GYRO_BUS_CS_GPIO;
|
||||||
|
|
||||||
|
void kinetis_spi2select(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool selected)
|
||||||
|
{
|
||||||
|
spiinfo("devid: %d CS: %s\n", (int)devid, selected ? "assert" : "de-assert");
|
||||||
|
|
||||||
|
/* SPI select is active low, so write !selected to select the device */
|
||||||
|
|
||||||
|
int sel = (int) devid;
|
||||||
|
ASSERT(PX4_SPI_BUS_ID(sel) == PX4_SPI_BUS_GYRO);
|
||||||
|
|
||||||
|
/* Making sure the other peripherals are not selected */
|
||||||
|
|
||||||
|
for (int cs = 0; arraySize(spi2selects_gpio) > 1 && cs < arraySize(spi2selects_gpio); cs++) {
|
||||||
|
if (spi2selects_gpio[cs] != 0) {
|
||||||
|
kinetis_gpiowrite(spi2selects_gpio[cs], 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t gpio = spi2selects_gpio[PX4_SPI_DEV_ID(sel)];
|
||||||
|
|
||||||
|
if (gpio) {
|
||||||
|
kinetis_gpiowrite(gpio, !selected);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t kinetis_spi2status(FAR struct spi_dev_s *dev, enum spi_dev_e devid)
|
||||||
|
{
|
||||||
|
return SPI_STATUS_PRESENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* CONFIG_KINETIS_SPI0 || CONFIG_KINETIS_SPI1 || CONFIG_KINETIS_SPI2 */
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2016 PX4 Development Team. All rights reserved.
|
||||||
|
*
|
||||||
|
* 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 PX4 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @file nxphlite_timer_config.c
|
||||||
|
*
|
||||||
|
* Configuration data for the kinetis pwm_servo, input capture and pwm input driver.
|
||||||
|
*
|
||||||
|
* Note that these arrays must always be fully-sized.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// TODO:Stubbed out for now
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include <kinetis.h>
|
||||||
|
//#include <kinetis_ftm.h>
|
||||||
|
//#include <stm32.h> // TODO:Stubbed in for now
|
||||||
|
//#include <stm32_gpio.h>
|
||||||
|
//#include <stm32_tim.h>
|
||||||
|
|
||||||
|
#include <drivers/drv_pwm_output.h>
|
||||||
|
#include <drivers/kinetis/drv_io_timer.h>
|
||||||
|
|
||||||
|
#include "board_config.h"
|
||||||
|
|
||||||
|
__EXPORT const io_timers_t io_timers[MAX_IO_TIMERS] = {
|
||||||
|
};
|
||||||
|
|
||||||
|
__EXPORT const timer_io_channels_t timer_io_channels[MAX_TIMER_IO_CHANNELS] = {
|
||||||
|
};
|
||||||
@@ -0,0 +1,118 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2016 PX4 Development Team. All rights reserved.
|
||||||
|
*
|
||||||
|
* 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 PX4 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file nxphlite_usb.c
|
||||||
|
*
|
||||||
|
* Board-specific USB functions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Included Files
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
#include <px4_config.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
#include <nuttx/usb/usbdev.h>
|
||||||
|
#include <nuttx/usb/usbdev_trace.h>
|
||||||
|
|
||||||
|
#include <up_arch.h>
|
||||||
|
#include <kinetis.h>
|
||||||
|
#include <kinetis_usbotg.h>
|
||||||
|
#include "board_config.h"
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Definitions
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Name: nxphlite_usbinitialize
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Called to setup USB-related GPIO pins for the NXPhlite-v1 board.
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
__EXPORT
|
||||||
|
void nxphlite_usbinitialize(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Name: kinetis_usbpullup
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* If USB is supported and the board supports a pullup via GPIO (for USB software
|
||||||
|
* connect and disconnect), then the board software must provide kinetis_usbpullup.
|
||||||
|
* See include/nuttx/usb/usbdev.h for additional description of this method.
|
||||||
|
* Alternatively, if no pull-up GPIO the following EXTERN can be redefined to be
|
||||||
|
* NULL.
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
__EXPORT
|
||||||
|
int kinetis_usbpullup(FAR struct usbdev_s *dev, bool enable)
|
||||||
|
{
|
||||||
|
usbtrace(TRACE_DEVPULLUP, (uint16_t)enable);
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Name: kinetis_usbsuspend
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Board logic must provide the kinetis_usbsuspend logic if the USBDEV driver is
|
||||||
|
* used. This function is called whenever the USB enters or leaves suspend mode.
|
||||||
|
* This is an opportunity for the board logic to shutdown clocks, power, etc.
|
||||||
|
* while the USB is suspended.
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
__EXPORT
|
||||||
|
void kinetis_usbsuspend(FAR struct usbdev_s *dev, bool resume)
|
||||||
|
{
|
||||||
|
uinfo("resume: %d\n", resume);
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
############################################################################
|
||||||
|
#
|
||||||
|
# Copyright (c) 2016 PX4 Development Team. All rights reserved.
|
||||||
|
#
|
||||||
|
# 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 PX4 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.
|
||||||
|
#
|
||||||
|
############################################################################
|
||||||
|
px4_add_module(
|
||||||
|
MODULE drivers__kinetis
|
||||||
|
COMPILE_FLAGS
|
||||||
|
SRCS
|
||||||
|
drv_hrt.c
|
||||||
|
drv_io_timer.c
|
||||||
|
drv_pwm_servo.c
|
||||||
|
drv_input_capture.c
|
||||||
|
drv_led_pwm.cpp
|
||||||
|
DEPENDS
|
||||||
|
platforms__common
|
||||||
|
)
|
||||||
|
# vim: set noet ft=cmake fenc=utf-8 ff=unix :
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
############################################################################
|
||||||
|
#
|
||||||
|
# Copyright (c) 2016 PX4 Development Team. All rights reserved.
|
||||||
|
#
|
||||||
|
# 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 PX4 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.
|
||||||
|
#
|
||||||
|
############################################################################
|
||||||
|
px4_add_module(
|
||||||
|
MODULE drivers__kinetis__adc
|
||||||
|
MAIN adc
|
||||||
|
COMPILE_FLAGS
|
||||||
|
SRCS
|
||||||
|
adc.cpp
|
||||||
|
DEPENDS
|
||||||
|
platforms__common
|
||||||
|
)
|
||||||
|
# vim: set noet ft=cmake fenc=utf-8 ff=unix :
|
||||||
@@ -0,0 +1,492 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2016 PX4 Development Team. All rights reserved.
|
||||||
|
*
|
||||||
|
* 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 PX4 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file adc.cpp
|
||||||
|
*
|
||||||
|
* TODO:This is stubbed out leving the code intact to document the needed
|
||||||
|
* mechinsm for porting.
|
||||||
|
*
|
||||||
|
* Driver for the Kinetis ADC.
|
||||||
|
*
|
||||||
|
* This is a low-rate driver, designed for sampling things like voltages
|
||||||
|
* and so forth. It avoids the gross complexity of the NuttX ADC driver.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <px4_config.h>
|
||||||
|
#include <board_config.h>
|
||||||
|
#include <drivers/device/device.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <arch/board/board.h>
|
||||||
|
#include <drivers/drv_hrt.h>
|
||||||
|
#include <drivers/drv_adc.h>
|
||||||
|
|
||||||
|
#include <kinetis.h>
|
||||||
|
#include <nuttx/analog/adc.h>
|
||||||
|
//#include <kinetis_adc.h>
|
||||||
|
|
||||||
|
#include <systemlib/err.h>
|
||||||
|
#include <systemlib/perf_counter.h>
|
||||||
|
|
||||||
|
#include <uORB/topics/system_power.h>
|
||||||
|
#include <uORB/topics/adc_report.h>
|
||||||
|
|
||||||
|
#if defined(ADC_CHANNELS)
|
||||||
|
/*
|
||||||
|
* Register accessors.
|
||||||
|
* For now, no reason not to just use ADC1.
|
||||||
|
*/
|
||||||
|
static volatile uint32_t dummy[21];
|
||||||
|
#define REG(_reg) (*(volatile uint32_t *)(&dummy[(_reg)]))
|
||||||
|
|
||||||
|
#define ADC_CR2_ADON 0
|
||||||
|
#define ADC_CR2_SWSTART 0
|
||||||
|
#define ADC_SR_EOC 0
|
||||||
|
|
||||||
|
#define rSR REG(0)
|
||||||
|
#define rCR1 REG(1)
|
||||||
|
#define rCR2 REG(2)
|
||||||
|
#define rSMPR1 REG(3)
|
||||||
|
#define rSMPR2 REG(4)
|
||||||
|
#define rJOFR1 REG(5)
|
||||||
|
#define rJOFR2 REG(6)
|
||||||
|
#define rJOFR3 REG(7)
|
||||||
|
#define rJOFR4 REG(8)
|
||||||
|
#define rHTR REG(9)
|
||||||
|
#define rLTR REG(10)
|
||||||
|
#define rSQR1 REG(11)
|
||||||
|
#define rSQR2 REG(12)
|
||||||
|
#define rSQR3 REG(13)
|
||||||
|
#define rJSQR REG(14)
|
||||||
|
#define rJDR1 REG(15)
|
||||||
|
#define rJDR2 REG(16)
|
||||||
|
#define rJDR3 REG(17)
|
||||||
|
#define rJDR4 REG(18)
|
||||||
|
#define rDR REG(19)
|
||||||
|
# define rCCR REG(20)
|
||||||
|
|
||||||
|
class ADC : public device::CDev
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ADC(uint32_t channels);
|
||||||
|
~ADC();
|
||||||
|
|
||||||
|
virtual int init();
|
||||||
|
|
||||||
|
virtual int ioctl(file *filp, int cmd, unsigned long arg);
|
||||||
|
virtual ssize_t read(file *filp, char *buffer, size_t len);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual int open_first(struct file *filp);
|
||||||
|
virtual int close_last(struct file *filp);
|
||||||
|
|
||||||
|
private:
|
||||||
|
static const hrt_abstime _tickrate = 10000; /**< 100Hz base rate */
|
||||||
|
|
||||||
|
hrt_call _call;
|
||||||
|
perf_counter_t _sample_perf;
|
||||||
|
|
||||||
|
unsigned _channel_count;
|
||||||
|
adc_msg_s *_samples; /**< sample buffer */
|
||||||
|
|
||||||
|
orb_advert_t _to_system_power;
|
||||||
|
orb_advert_t _to_adc_report;
|
||||||
|
|
||||||
|
/** work trampoline */
|
||||||
|
static void _tick_trampoline(void *arg);
|
||||||
|
|
||||||
|
/** worker function */
|
||||||
|
void _tick();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sample a single channel and return the measured value.
|
||||||
|
*
|
||||||
|
* @param channel The channel to sample.
|
||||||
|
* @return The sampled value, or 0xffff if
|
||||||
|
* sampling failed.
|
||||||
|
*/
|
||||||
|
uint16_t _sample(unsigned channel);
|
||||||
|
|
||||||
|
// update system_power ORB topic, only on FMUv2
|
||||||
|
void update_system_power(hrt_abstime now);
|
||||||
|
|
||||||
|
void update_adc_report(hrt_abstime now);
|
||||||
|
};
|
||||||
|
|
||||||
|
ADC::ADC(uint32_t channels) :
|
||||||
|
CDev("adc", ADC0_DEVICE_PATH),
|
||||||
|
_sample_perf(perf_alloc(PC_ELAPSED, "adc_samples")),
|
||||||
|
_channel_count(0),
|
||||||
|
_samples(nullptr),
|
||||||
|
_to_system_power(nullptr),
|
||||||
|
_to_adc_report(nullptr)
|
||||||
|
{
|
||||||
|
_debug_enabled = true;
|
||||||
|
|
||||||
|
/* always enable the temperature sensor */
|
||||||
|
channels |= 1 << 16;
|
||||||
|
|
||||||
|
/* allocate the sample array */
|
||||||
|
for (unsigned i = 0; i < 32; i++) {
|
||||||
|
if (channels & (1 << i)) {
|
||||||
|
_channel_count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_samples = new adc_msg_s[_channel_count];
|
||||||
|
|
||||||
|
/* prefill the channel numbers in the sample array */
|
||||||
|
if (_samples != nullptr) {
|
||||||
|
unsigned index = 0;
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < 32; i++) {
|
||||||
|
if (channels & (1 << i)) {
|
||||||
|
_samples[index].am_channel = i;
|
||||||
|
_samples[index].am_data = 0;
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ADC::~ADC()
|
||||||
|
{
|
||||||
|
if (_samples != nullptr) {
|
||||||
|
delete _samples;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ADC::init()
|
||||||
|
{
|
||||||
|
/* do calibration if supported */
|
||||||
|
#ifdef ADC_CR2_CAL
|
||||||
|
rCR2 |= ADC_CR2_CAL;
|
||||||
|
usleep(100);
|
||||||
|
|
||||||
|
if (rCR2 & ADC_CR2_CAL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* arbitrarily configure all channels for 55 cycle sample time */
|
||||||
|
rSMPR1 = 0b00000011011011011011011011011011;
|
||||||
|
rSMPR2 = 0b00011011011011011011011011011011;
|
||||||
|
|
||||||
|
/* XXX for F2/4, might want to select 12-bit mode? */
|
||||||
|
rCR1 = 0;
|
||||||
|
|
||||||
|
/* enable the temperature sensor / Vrefint channel if supported*/
|
||||||
|
rCR2 =
|
||||||
|
#ifdef ADC_CR2_TSVREFE
|
||||||
|
/* enable the temperature sensor in CR2 */
|
||||||
|
ADC_CR2_TSVREFE |
|
||||||
|
#endif
|
||||||
|
0;
|
||||||
|
|
||||||
|
#ifdef ADC_CCR_TSVREFE
|
||||||
|
/* enable temperature sensor in CCR */
|
||||||
|
rCCR = ADC_CCR_TSVREFE;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* configure for a single-channel sequence */
|
||||||
|
rSQR1 = 0;
|
||||||
|
rSQR2 = 0;
|
||||||
|
rSQR3 = 0; /* will be updated with the channel each tick */
|
||||||
|
|
||||||
|
/* power-cycle the ADC and turn it on */
|
||||||
|
rCR2 &= ~ADC_CR2_ADON;
|
||||||
|
usleep(10);
|
||||||
|
rCR2 |= ADC_CR2_ADON;
|
||||||
|
usleep(10);
|
||||||
|
rCR2 |= ADC_CR2_ADON;
|
||||||
|
usleep(10);
|
||||||
|
|
||||||
|
/* kick off a sample and wait for it to complete */
|
||||||
|
hrt_abstime now = hrt_absolute_time();
|
||||||
|
rCR2 |= ADC_CR2_SWSTART;
|
||||||
|
|
||||||
|
while (!(rSR & ADC_SR_EOC)) {
|
||||||
|
|
||||||
|
/* don't wait for more than 500us, since that means something broke - should reset here if we see this */
|
||||||
|
if ((hrt_absolute_time() - now) > 500) {
|
||||||
|
DEVICE_LOG("sample timeout");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* create the device node */
|
||||||
|
return CDev::init();
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ADC::ioctl(file *filp, int cmd, unsigned long arg)
|
||||||
|
{
|
||||||
|
return -ENOTTY;
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t
|
||||||
|
ADC::read(file *filp, char *buffer, size_t len)
|
||||||
|
{
|
||||||
|
const size_t maxsize = sizeof(adc_msg_s) * _channel_count;
|
||||||
|
|
||||||
|
if (len > maxsize) {
|
||||||
|
len = maxsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* block interrupts while copying samples to avoid racing with an update */
|
||||||
|
irqstate_t flags = px4_enter_critical_section();
|
||||||
|
memcpy(buffer, _samples, len);
|
||||||
|
px4_leave_critical_section(flags);
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ADC::open_first(struct file *filp)
|
||||||
|
{
|
||||||
|
/* get fresh data */
|
||||||
|
_tick();
|
||||||
|
|
||||||
|
/* and schedule regular updates */
|
||||||
|
hrt_call_every(&_call, _tickrate, _tickrate, _tick_trampoline, this);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ADC::close_last(struct file *filp)
|
||||||
|
{
|
||||||
|
hrt_cancel(&_call);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ADC::_tick_trampoline(void *arg)
|
||||||
|
{
|
||||||
|
(reinterpret_cast<ADC *>(arg))->_tick();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ADC::_tick()
|
||||||
|
{
|
||||||
|
hrt_abstime now = hrt_absolute_time();
|
||||||
|
|
||||||
|
/* scan the channel set and sample each */
|
||||||
|
for (unsigned i = 0; i < _channel_count; i++) {
|
||||||
|
_samples[i].am_data = _sample(_samples[i].am_channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
update_adc_report(now);
|
||||||
|
update_system_power(now);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ADC::update_adc_report(hrt_abstime now)
|
||||||
|
{
|
||||||
|
adc_report_s adc = {};
|
||||||
|
adc.timestamp = now;
|
||||||
|
|
||||||
|
unsigned max_num = _channel_count;
|
||||||
|
|
||||||
|
if (max_num > (sizeof(adc.channel_id) / sizeof(adc.channel_id[0]))) {
|
||||||
|
max_num = (sizeof(adc.channel_id) / sizeof(adc.channel_id[0]));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < max_num; i++) {
|
||||||
|
adc.channel_id[i] = _samples[i].am_channel;
|
||||||
|
adc.channel_value[i] = _samples[i].am_data * 3.3f / 4096.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
int instance;
|
||||||
|
orb_publish_auto(ORB_ID(adc_report), &_to_adc_report, &adc, &instance, ORB_PRIO_HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ADC::update_system_power(hrt_abstime now)
|
||||||
|
{
|
||||||
|
#if defined (BOARD_ADC_USB_CONNECTED)
|
||||||
|
system_power_s system_power = {};
|
||||||
|
system_power.timestamp = now;
|
||||||
|
|
||||||
|
system_power.voltage5V_v = 0;
|
||||||
|
|
||||||
|
#if defined(ADC_5V_RAIL_SENSE)
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < _channel_count; i++) {
|
||||||
|
if (_samples[i].am_channel == ADC_5V_RAIL_SENSE) {
|
||||||
|
// it is 2:1 scaled
|
||||||
|
system_power.voltage5V_v = _samples[i].am_data * (6.6f / 4096);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Note once the board_config.h provides BOARD_ADC_USB_CONNECTED,
|
||||||
|
* It must provide the true logic GPIO BOARD_ADC_xxxx macros.
|
||||||
|
*/
|
||||||
|
// these are not ADC related, but it is convenient to
|
||||||
|
// publish these to the same topic
|
||||||
|
|
||||||
|
system_power.usb_connected = BOARD_ADC_USB_CONNECTED;
|
||||||
|
|
||||||
|
system_power.brick_valid = BOARD_ADC_BRICK_VALID;
|
||||||
|
system_power.servo_valid = BOARD_ADC_SERVO_VALID;
|
||||||
|
|
||||||
|
// OC pins are active low
|
||||||
|
system_power.periph_5V_OC = BOARD_ADC_PERIPH_5V_OC;
|
||||||
|
system_power.hipower_5V_OC = BOARD_ADC_HIPOWER_5V_OC;
|
||||||
|
|
||||||
|
/* lazily publish */
|
||||||
|
if (_to_system_power != nullptr) {
|
||||||
|
orb_publish(ORB_ID(system_power), _to_system_power, &system_power);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
_to_system_power = orb_advertise(ORB_ID(system_power), &system_power);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // BOARD_ADC_USB_CONNECTED
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t
|
||||||
|
ADC::_sample(unsigned channel)
|
||||||
|
{
|
||||||
|
perf_begin(_sample_perf);
|
||||||
|
|
||||||
|
/* clear any previous EOC */
|
||||||
|
if (rSR & ADC_SR_EOC) {
|
||||||
|
rSR &= ~ADC_SR_EOC;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* run a single conversion right now - should take about 60 cycles (a few microseconds) max */
|
||||||
|
rSQR3 = channel;
|
||||||
|
rCR2 |= ADC_CR2_SWSTART;
|
||||||
|
|
||||||
|
/* wait for the conversion to complete */
|
||||||
|
hrt_abstime now = hrt_absolute_time();
|
||||||
|
|
||||||
|
while (!(rSR & ADC_SR_EOC)) {
|
||||||
|
|
||||||
|
/* don't wait for more than 50us, since that means something broke - should reset here if we see this */
|
||||||
|
if ((hrt_absolute_time() - now) > 50) {
|
||||||
|
DEVICE_LOG("sample timeout");
|
||||||
|
return 0xffff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* read the result and clear EOC */
|
||||||
|
uint16_t result = rDR;
|
||||||
|
|
||||||
|
perf_end(_sample_perf);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Driver 'main' command.
|
||||||
|
*/
|
||||||
|
extern "C" __EXPORT int adc_main(int argc, char *argv[]);
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
ADC *g_adc;
|
||||||
|
|
||||||
|
void
|
||||||
|
test(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
int fd = open(ADC0_DEVICE_PATH, O_RDONLY);
|
||||||
|
|
||||||
|
if (fd < 0) {
|
||||||
|
err(1, "can't open ADC device");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < 50; i++) {
|
||||||
|
adc_msg_s data[12];
|
||||||
|
ssize_t count = read(fd, data, sizeof(data));
|
||||||
|
|
||||||
|
if (count < 0) {
|
||||||
|
errx(1, "read error");
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned channels = count / sizeof(data[0]);
|
||||||
|
|
||||||
|
for (unsigned j = 0; j < channels; j++) {
|
||||||
|
printf("%d: %u ", data[j].am_channel, data[j].am_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("\n");
|
||||||
|
usleep(500000);
|
||||||
|
}
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
adc_main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
if (g_adc == nullptr) {
|
||||||
|
/* XXX this hardcodes the default channel set for the board in board_config.h - should be configurable */
|
||||||
|
g_adc = new ADC(ADC_CHANNELS);
|
||||||
|
|
||||||
|
if (g_adc == nullptr) {
|
||||||
|
errx(1, "couldn't allocate the ADC driver");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_adc->init() != OK) {
|
||||||
|
delete g_adc;
|
||||||
|
errx(1, "ADC init failed");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argc > 1) {
|
||||||
|
if (!strcmp(argv[1], "test")) {
|
||||||
|
test();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,42 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2012-2016 PX4 Development Team. All rights reserved.
|
||||||
|
*
|
||||||
|
* 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 PX4 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file drv_input_capture.h
|
||||||
|
*
|
||||||
|
* stm32-specific input capture data.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <drivers/drv_input_capture.h>
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,121 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2012 PX4 Development Team. All rights reserved.
|
||||||
|
*
|
||||||
|
* 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 PX4 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file drv_io_timer.h
|
||||||
|
*
|
||||||
|
* stm32-specific PWM output data.
|
||||||
|
*/
|
||||||
|
#include <px4_config.h>
|
||||||
|
#include <nuttx/arch.h>
|
||||||
|
#include <nuttx/irq.h>
|
||||||
|
|
||||||
|
#include <drivers/drv_hrt.h>
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
__BEGIN_DECLS
|
||||||
|
/* configuration limits */
|
||||||
|
#define MAX_IO_TIMERS 4
|
||||||
|
#define MAX_TIMER_IO_CHANNELS 8
|
||||||
|
|
||||||
|
#define MAX_LED_TIMERS 1
|
||||||
|
#define MAX_TIMER_LED_CHANNELS 3
|
||||||
|
|
||||||
|
#define IO_TIMER_ALL_MODES_CHANNELS 0
|
||||||
|
|
||||||
|
typedef enum io_timer_channel_mode_t {
|
||||||
|
IOTimerChanMode_NotUsed = 0,
|
||||||
|
IOTimerChanMode_PWMOut = 1,
|
||||||
|
IOTimerChanMode_PWMIn = 2,
|
||||||
|
IOTimerChanMode_Capture = 3,
|
||||||
|
IOTimerChanModeSize
|
||||||
|
} io_timer_channel_mode_t;
|
||||||
|
|
||||||
|
typedef uint8_t io_timer_channel_allocation_t; /* big enough to hold MAX_TIMER_IO_CHANNELS */
|
||||||
|
|
||||||
|
/* array of timers dedicated to PWM in and out and capture use */
|
||||||
|
typedef struct io_timers_t {
|
||||||
|
uint32_t base;
|
||||||
|
uint32_t clock_register;
|
||||||
|
uint32_t clock_bit;
|
||||||
|
uint32_t clock_freq;
|
||||||
|
uint32_t vectorno;
|
||||||
|
uint32_t first_channel_index;
|
||||||
|
uint32_t last_channel_index;
|
||||||
|
xcpt_t handler;
|
||||||
|
} io_timers_t;
|
||||||
|
|
||||||
|
/* array of channels in logical order */
|
||||||
|
typedef struct timer_io_channels_t {
|
||||||
|
uint32_t gpio_out;
|
||||||
|
uint32_t gpio_in;
|
||||||
|
uint8_t timer_index;
|
||||||
|
uint8_t timer_channel;
|
||||||
|
uint16_t masks;
|
||||||
|
uint8_t ccr_offset;
|
||||||
|
} timer_io_channels_t;
|
||||||
|
|
||||||
|
|
||||||
|
typedef void (*channel_handler_t)(void *context, const io_timers_t *timer, uint32_t chan_index,
|
||||||
|
const timer_io_channels_t *chan,
|
||||||
|
hrt_abstime isrs_time, uint16_t isrs_rcnt);
|
||||||
|
|
||||||
|
|
||||||
|
/* supplied by board-specific code */
|
||||||
|
__EXPORT extern const io_timers_t io_timers[MAX_IO_TIMERS];
|
||||||
|
__EXPORT extern const timer_io_channels_t timer_io_channels[MAX_TIMER_IO_CHANNELS];
|
||||||
|
|
||||||
|
__EXPORT extern const io_timers_t led_pwm_timers[MAX_LED_TIMERS];
|
||||||
|
__EXPORT extern const timer_io_channels_t led_pwm_channels[MAX_TIMER_LED_CHANNELS];
|
||||||
|
|
||||||
|
__EXPORT extern io_timer_channel_allocation_t allocations[IOTimerChanModeSize];
|
||||||
|
__EXPORT int io_timer_handler0(int irq, void *context);
|
||||||
|
__EXPORT int io_timer_handler1(int irq, void *context);
|
||||||
|
__EXPORT int io_timer_handler2(int irq, void *context);
|
||||||
|
__EXPORT int io_timer_handler3(int irq, void *context);
|
||||||
|
|
||||||
|
__EXPORT int io_timer_channel_init(unsigned channel, io_timer_channel_mode_t mode,
|
||||||
|
channel_handler_t channel_handler, void *context);
|
||||||
|
__EXPORT int io_timer_set_rate(unsigned timer, unsigned rate);
|
||||||
|
__EXPORT int io_timer_set_enable(bool state, io_timer_channel_mode_t mode,
|
||||||
|
io_timer_channel_allocation_t masks);
|
||||||
|
__EXPORT int io_timer_set_rate(unsigned timer, unsigned rate);
|
||||||
|
__EXPORT uint16_t io_channel_get_ccr(unsigned channel);
|
||||||
|
__EXPORT int io_timer_set_ccr(unsigned channel, uint16_t value);
|
||||||
|
__EXPORT uint32_t io_timer_get_group(unsigned timer);
|
||||||
|
__EXPORT int io_timer_validate_channel_index(unsigned channel);
|
||||||
|
__EXPORT int io_timer_is_channel_free(unsigned channel);
|
||||||
|
__EXPORT int io_timer_free_channel(unsigned channel);
|
||||||
|
__EXPORT int io_timer_get_channel_mode(unsigned channel);
|
||||||
|
__EXPORT int io_timer_get_mode_channels(io_timer_channel_mode_t mode);
|
||||||
|
__END_DECLS
|
||||||
@@ -0,0 +1,318 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015, 2016 Airmind Development Team. All rights reserved.
|
||||||
|
*
|
||||||
|
* 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 Airmind 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file drv_led_pwm.cpp
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include <systemlib/perf_counter.h>
|
||||||
|
#include <systemlib/err.h>
|
||||||
|
#include <systemlib/systemlib.h>
|
||||||
|
#include <systemlib/px4_macros.h>
|
||||||
|
|
||||||
|
#include <drivers/drv_pwm_output.h>
|
||||||
|
#include <drivers/stm32/drv_io_timer.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include <board_config.h>
|
||||||
|
|
||||||
|
#if defined(BOARD_HAS_LED_PWM)
|
||||||
|
#define REG(_tmr, _reg) (*(volatile uint32_t *)(led_pwm_timers[_tmr].base + _reg))
|
||||||
|
|
||||||
|
#define rCR1(_tmr) REG(_tmr, STM32_GTIM_CR1_OFFSET)
|
||||||
|
#define rCR2(_tmr) REG(_tmr, STM32_GTIM_CR2_OFFSET)
|
||||||
|
#define rSMCR(_tmr) REG(_tmr, STM32_GTIM_SMCR_OFFSET)
|
||||||
|
#define rDIER(_tmr) REG(_tmr, STM32_GTIM_DIER_OFFSET)
|
||||||
|
#define rSR(_tmr) REG(_tmr, STM32_GTIM_SR_OFFSET)
|
||||||
|
#define rEGR(_tmr) REG(_tmr, STM32_GTIM_EGR_OFFSET)
|
||||||
|
#define rCCMR1(_tmr) REG(_tmr, STM32_GTIM_CCMR1_OFFSET)
|
||||||
|
#define rCCMR2(_tmr) REG(_tmr, STM32_GTIM_CCMR2_OFFSET)
|
||||||
|
#define rCCER(_tmr) REG(_tmr, STM32_GTIM_CCER_OFFSET)
|
||||||
|
#define rCNT(_tmr) REG(_tmr, STM32_GTIM_CNT_OFFSET)
|
||||||
|
#define rPSC(_tmr) REG(_tmr, STM32_GTIM_PSC_OFFSET)
|
||||||
|
#define rARR(_tmr) REG(_tmr, STM32_GTIM_ARR_OFFSET)
|
||||||
|
#define rCCR1(_tmr) REG(_tmr, STM32_GTIM_CCR1_OFFSET)
|
||||||
|
#define rCCR2(_tmr) REG(_tmr, STM32_GTIM_CCR2_OFFSET)
|
||||||
|
#define rCCR3(_tmr) REG(_tmr, STM32_GTIM_CCR3_OFFSET)
|
||||||
|
#define rCCR4(_tmr) REG(_tmr, STM32_GTIM_CCR4_OFFSET)
|
||||||
|
#define rDCR(_tmr) REG(_tmr, STM32_GTIM_DCR_OFFSET)
|
||||||
|
#define rDMAR(_tmr) REG(_tmr, STM32_GTIM_DMAR_OFFSET)
|
||||||
|
#define rBDTR(_tmr) REG(_tmr, STM32_ATIM_BDTR_OFFSET)
|
||||||
|
|
||||||
|
static void led_pwm_timer_init(unsigned timer);
|
||||||
|
static void led_pwm_timer_set_rate(unsigned timer, unsigned rate);
|
||||||
|
static void led_pwm_channel_init(unsigned channel);
|
||||||
|
|
||||||
|
int led_pwm_servo_set(unsigned channel, uint8_t value);
|
||||||
|
unsigned led_pwm_servo_get(unsigned channel);
|
||||||
|
int led_pwm_servo_init(void);
|
||||||
|
void led_pwm_servo_deinit(void);
|
||||||
|
void led_pwm_servo_arm(bool armed);
|
||||||
|
unsigned led_pwm_timer_get_period(unsigned timer);
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
led_pwm_timer_init(unsigned timer)
|
||||||
|
{
|
||||||
|
/* valid Timer */
|
||||||
|
|
||||||
|
if (led_pwm_timers[timer].base != 0) {
|
||||||
|
|
||||||
|
/* enable the timer clock before we try to talk to it */
|
||||||
|
|
||||||
|
modifyreg32(led_pwm_timers[timer].clock_register, 0, led_pwm_timers[timer].clock_bit);
|
||||||
|
|
||||||
|
/* disable and configure the timer */
|
||||||
|
rCR1(timer) = 0;
|
||||||
|
rCR2(timer) = 0;
|
||||||
|
rSMCR(timer) = 0;
|
||||||
|
rDIER(timer) = 0;
|
||||||
|
rCCER(timer) = 0;
|
||||||
|
rCCMR1(timer) = 0;
|
||||||
|
rCCMR2(timer) = 0;
|
||||||
|
rCCER(timer) = 0;
|
||||||
|
rDCR(timer) = 0;
|
||||||
|
|
||||||
|
if ((led_pwm_timers[timer].base == STM32_TIM1_BASE) || (led_pwm_timers[timer].base == STM32_TIM8_BASE)) {
|
||||||
|
/* master output enable = on */
|
||||||
|
rBDTR(timer) = ATIM_BDTR_MOE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* configure the timer to free-run at 1MHz */
|
||||||
|
rPSC(timer) = (led_pwm_timers[timer].clock_freq / 1000000) - 1;
|
||||||
|
|
||||||
|
/* default to updating at 50Hz */
|
||||||
|
led_pwm_timer_set_rate(timer, 50);
|
||||||
|
|
||||||
|
/* note that the timer is left disabled - arming is performed separately */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
unsigned
|
||||||
|
led_pwm_timer_get_period(unsigned timer)
|
||||||
|
{
|
||||||
|
return (rARR(timer));
|
||||||
|
}
|
||||||
|
static void
|
||||||
|
led_pwm_timer_set_rate(unsigned timer, unsigned rate)
|
||||||
|
{
|
||||||
|
/* configure the timer to update at the desired rate */
|
||||||
|
rARR(timer) = 1000000 / rate;
|
||||||
|
|
||||||
|
/* generate an update event; reloads the counter and all registers */
|
||||||
|
rEGR(timer) = GTIM_EGR_UG;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
led_pwm_channel_init(unsigned channel)
|
||||||
|
{
|
||||||
|
unsigned timer = led_pwm_channels[channel].timer_index;
|
||||||
|
|
||||||
|
/* configure the GPIO first */
|
||||||
|
|
||||||
|
px4_arch_configgpio(led_pwm_channels[channel].gpio_out);
|
||||||
|
|
||||||
|
/* configure the channel */
|
||||||
|
switch (led_pwm_channels[channel].timer_channel) {
|
||||||
|
case 1:
|
||||||
|
rCCMR1(timer) |= (GTIM_CCMR_MODE_PWM1 << GTIM_CCMR1_OC1M_SHIFT) | GTIM_CCMR1_OC1PE;
|
||||||
|
rCCER(timer) |= GTIM_CCER_CC1E;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
rCCMR1(timer) |= (GTIM_CCMR_MODE_PWM1 << GTIM_CCMR1_OC2M_SHIFT) | GTIM_CCMR1_OC2PE;
|
||||||
|
rCCER(timer) |= GTIM_CCER_CC2E;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
rCCMR2(timer) |= (GTIM_CCMR_MODE_PWM1 << GTIM_CCMR2_OC3M_SHIFT) | GTIM_CCMR2_OC3PE;
|
||||||
|
rCCER(timer) |= GTIM_CCER_CC3E;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
rCCMR2(timer) |= (GTIM_CCMR_MODE_PWM1 << GTIM_CCMR2_OC4M_SHIFT) | GTIM_CCMR2_OC4PE;
|
||||||
|
rCCER(timer) |= GTIM_CCER_CC4E;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
led_pwm_servo_set(unsigned channel, uint8_t cvalue)
|
||||||
|
{
|
||||||
|
if (channel >= arraySize(led_pwm_channels)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned timer = led_pwm_channels[channel].timer_index;
|
||||||
|
|
||||||
|
/* test timer for validity */
|
||||||
|
if ((led_pwm_timers[timer].base == 0) ||
|
||||||
|
(led_pwm_channels[channel].gpio_out == 0)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned period = led_pwm_timer_get_period(timer);
|
||||||
|
|
||||||
|
#if defined(BOARD_LED_PWM_DRIVE_ACTIVE_LOW)
|
||||||
|
unsigned value = period - (unsigned)cvalue * period / 255;
|
||||||
|
#else
|
||||||
|
unsigned value = (unsigned)cvalue * period / 255;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* configure the channel */
|
||||||
|
if (value > 0) {
|
||||||
|
value--;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
switch (led_pwm_channels[channel].timer_channel) {
|
||||||
|
case 1:
|
||||||
|
rCCR1(timer) = value;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
rCCR2(timer) = value;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
rCCR3(timer) = value;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
rCCR4(timer) = value;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
unsigned
|
||||||
|
led_pwm_servo_get(unsigned channel)
|
||||||
|
{
|
||||||
|
if (channel >= 3) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned timer = led_pwm_channels[channel].timer_index;
|
||||||
|
servo_position_t value = 0;
|
||||||
|
|
||||||
|
/* test timer for validity */
|
||||||
|
if ((led_pwm_timers[timer].base == 0) ||
|
||||||
|
(led_pwm_channels[channel].timer_channel == 0)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* configure the channel */
|
||||||
|
switch (led_pwm_channels[channel].timer_channel) {
|
||||||
|
case 1:
|
||||||
|
value = rCCR1(timer);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
value = rCCR2(timer);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
value = rCCR3(timer);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
value = rCCR4(timer);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned period = led_pwm_timer_get_period(timer);
|
||||||
|
return ((value + 1) * 255 / period);
|
||||||
|
}
|
||||||
|
int
|
||||||
|
led_pwm_servo_init(void)
|
||||||
|
{
|
||||||
|
/* do basic timer initialisation first */
|
||||||
|
for (unsigned i = 0; i < arraySize(led_pwm_timers); i++) {
|
||||||
|
led_pwm_timer_init(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* now init channels */
|
||||||
|
for (unsigned i = 0; i < arraySize(led_pwm_channels); i++) {
|
||||||
|
led_pwm_channel_init(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
led_pwm_servo_arm(true);
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
led_pwm_servo_deinit(void)
|
||||||
|
{
|
||||||
|
/* disable the timers */
|
||||||
|
led_pwm_servo_arm(false);
|
||||||
|
}
|
||||||
|
void
|
||||||
|
led_pwm_servo_arm(bool armed)
|
||||||
|
{
|
||||||
|
/* iterate timers and arm/disarm appropriately */
|
||||||
|
for (unsigned i = 0; i < arraySize(led_pwm_timers); i++) {
|
||||||
|
if (led_pwm_timers[i].base != 0) {
|
||||||
|
if (armed) {
|
||||||
|
/* force an update to preload all registers */
|
||||||
|
rEGR(i) = GTIM_EGR_UG;
|
||||||
|
|
||||||
|
/* arm requires the timer be enabled */
|
||||||
|
rCR1(i) |= GTIM_CR1_CEN | GTIM_CR1_ARPE;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
rCR1(i) = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // BOARD_HAS_LED_PWM
|
||||||
@@ -0,0 +1,153 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2012 PX4 Development Team. All rights reserved.
|
||||||
|
*
|
||||||
|
* 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 PX4 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @file drv_pwm_servo.c
|
||||||
|
*
|
||||||
|
* Servo driver supporting PWM servos connected to STM32 timer blocks.
|
||||||
|
*
|
||||||
|
* Works with any of the 'generic' or 'advanced' STM32 timers that
|
||||||
|
* have output pins, does not require an interrupt.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <px4_config.h>
|
||||||
|
#include <nuttx/arch.h>
|
||||||
|
#include <nuttx/irq.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <debug.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <queue.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include <arch/board/board.h>
|
||||||
|
#include <drivers/drv_pwm_output.h>
|
||||||
|
|
||||||
|
#include "drv_io_timer.h"
|
||||||
|
#include "drv_pwm_servo.h"
|
||||||
|
|
||||||
|
#include <kinetis.h>
|
||||||
|
|
||||||
|
int up_pwm_servo_set(unsigned channel, servo_position_t value)
|
||||||
|
{
|
||||||
|
return io_timer_set_ccr(channel, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
servo_position_t up_pwm_servo_get(unsigned channel)
|
||||||
|
{
|
||||||
|
return io_channel_get_ccr(channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
int up_pwm_servo_init(uint32_t channel_mask)
|
||||||
|
{
|
||||||
|
/* Init channels */
|
||||||
|
uint32_t current = io_timer_get_mode_channels(IOTimerChanMode_PWMOut);
|
||||||
|
|
||||||
|
// First free the current set of PWMs
|
||||||
|
|
||||||
|
for (unsigned channel = 0; current != 0 && channel < MAX_TIMER_IO_CHANNELS; channel++) {
|
||||||
|
if (current & (1 << channel)) {
|
||||||
|
io_timer_free_channel(channel);
|
||||||
|
current &= ~(1 << channel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now allocate the new set
|
||||||
|
|
||||||
|
for (unsigned channel = 0; channel_mask != 0 && channel < MAX_TIMER_IO_CHANNELS; channel++) {
|
||||||
|
if (channel_mask & (1 << channel)) {
|
||||||
|
|
||||||
|
// First free any that were not PWM mode before
|
||||||
|
|
||||||
|
if (-EBUSY == io_timer_is_channel_free(channel)) {
|
||||||
|
io_timer_free_channel(channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
io_timer_channel_init(channel, IOTimerChanMode_PWMOut, NULL, NULL);
|
||||||
|
channel_mask &= ~(1 << channel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void up_pwm_servo_deinit(void)
|
||||||
|
{
|
||||||
|
/* disable the timers */
|
||||||
|
up_pwm_servo_arm(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
int up_pwm_servo_set_rate_group_update(unsigned group, unsigned rate)
|
||||||
|
{
|
||||||
|
/* limit update rate to 1..10000Hz; somewhat arbitrary but safe */
|
||||||
|
if (rate < 1) {
|
||||||
|
return -ERANGE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rate > 10000) {
|
||||||
|
return -ERANGE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((group >= MAX_IO_TIMERS) || (io_timers[group].base == 0)) {
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
io_timer_set_rate(group, rate);
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int up_pwm_servo_set_rate(unsigned rate)
|
||||||
|
{
|
||||||
|
for (unsigned i = 0; i < MAX_IO_TIMERS; i++) {
|
||||||
|
up_pwm_servo_set_rate_group_update(i, rate);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t up_pwm_servo_get_rate_group(unsigned group)
|
||||||
|
{
|
||||||
|
return io_timer_get_group(group);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
up_pwm_servo_arm(bool armed)
|
||||||
|
{
|
||||||
|
io_timer_set_enable(armed, IOTimerChanMode_PWMOut, IO_TIMER_ALL_MODES_CHANNELS);
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2012 PX4 Development Team. All rights reserved.
|
||||||
|
*
|
||||||
|
* 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 PX4 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.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file drv_pwm_servo.h
|
||||||
|
*
|
||||||
|
* stm32-specific PWM output data.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <drivers/drv_pwm_output.h>
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
############################################################################
|
||||||
|
#
|
||||||
|
# Copyright (c) 2016 PX4 Development Team. All rights reserved.
|
||||||
|
#
|
||||||
|
# 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 PX4 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.
|
||||||
|
#
|
||||||
|
############################################################################
|
||||||
|
px4_add_module(
|
||||||
|
MODULE drivers__kinetis__tone_alarm
|
||||||
|
MAIN tone_alarm
|
||||||
|
COMPILE_FLAGS
|
||||||
|
SRCS
|
||||||
|
tone_alarm.cpp
|
||||||
|
DEPENDS
|
||||||
|
platforms__common
|
||||||
|
)
|
||||||
|
# vim: set noet ft=cmake fenc=utf-8 ff=unix :
|
||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user