1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-13 11:29:51 +03:00
[X10] New radio supported!
This commit is contained in:
Bertrand Songis 2017-02-04 10:42:50 +01:00 committed by GitHub
parent ebee591990
commit 40ece81de2
79 changed files with 1947 additions and 1370 deletions

View file

@ -38,7 +38,8 @@ env:
# - FLAVOR=X9D
# - FLAVOR=X9D+
# - FLAVOR=X9E
- FLAVOR=X12
- FLAVOR=HORUS
# - FLAVOR=X10
# - FLAVOR=X12Sr10
# - FLAVOR=X12S

View file

@ -39,7 +39,8 @@ namespace Board {
BOARD_TARANIS_X9DP,
BOARD_TARANIS_X9E,
BOARD_FLAMENCO,
BOARD_HORUS,
BOARD_X12S,
BOARD_X10,
BOARD_UNKNOWN = -1
};
@ -115,7 +116,9 @@ Board::SwitchInfo getSwitchInfo(Board::Type board, unsigned index);
#define IS_TARANIS_PLUS(board) (board==Board::BOARD_TARANIS_X9DP || board==Board::BOARD_TARANIS_X9E)
#define IS_TARANIS_X9E(board) (board==Board::BOARD_TARANIS_X9E)
#define IS_TARANIS(board) (IS_TARANIS_X9(board) || IS_TARANIS_X7(board))
#define IS_HORUS(board) (board==Board::BOARD_HORUS)
#define IS_HORUS_X12S(board) (board==Board::BOARD_X12S)
#define IS_HORUS_X10(board) (board==Board::BOARD_X10)
#define IS_HORUS(board) (IS_HORUS_X12S(board) || IS_HORUS_X10(board))
#define IS_HORUS_OR_TARANIS(board) (IS_HORUS(board) || IS_TARANIS(board))
#define IS_FLAMENCO(board) (board==Board::BOARD_FLAMENCO)
#define IS_STM32(board) (IS_TARANIS(board) || IS_HORUS(board) || IS_FLAMENCO(board))

View file

@ -1745,8 +1745,10 @@ QString getBoardName(Board::Type board)
return "9XR-PRO";
case Board::BOARD_AR9X:
return "AR9X";
case Board::BOARD_HORUS:
case Board::BOARD_X12S:
return "Horus";
case Board::BOARD_X10:
return "X10";
default:
return "Unknown";
}
@ -1772,7 +1774,8 @@ const int Firmware::getFlashSize()
case Board::BOARD_TARANIS_X9E:
case Board::BOARD_FLAMENCO:
return FSIZE_TARANIS;
case Board::BOARD_HORUS:
case Board::BOARD_X12S:
case Board::BOARD_X10:
return FSIZE_HORUS;
default:
return 0;

View file

@ -3037,7 +3037,7 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, Board::Type board, unsig
eepromImportDebug() << QString("OpenTxModelData::OpenTxModelData(name: %1, board: %2, ver: %3, var: %4)").arg(name).arg(board).arg(version).arg(variant);
if (board == BOARD_HORUS)
if (IS_HORUS(board))
internalField.Append(new ZCharField<15>(modelData.name, "Model name"));
else if (HAS_LARGE_LCD(board))
internalField.Append(new ZCharField<12>(modelData.name, "Model name"));

View file

@ -86,8 +86,10 @@ const char * OpenTxEepromInterface::getName()
return "OpenTX for ar9x board / 9X";
case BOARD_FLAMENCO:
return "OpenTX for Flamenco experimental";
case BOARD_HORUS:
case BOARD_X12S:
return "OpenTX for FrSky Horus";
case BOARD_X10:
return "OpenTX for FrSky X10";
default:
return "OpenTX for an unknown board";
}
@ -96,7 +98,8 @@ const char * OpenTxEepromInterface::getName()
uint32_t OpenTxEepromInterface::getFourCC()
{
switch (board) {
case BOARD_HORUS:
case BOARD_X12S:
case BOARD_X10:
return 0x3478746F;
case BOARD_TARANIS_X7:
return 0x3678746F;
@ -1267,11 +1270,18 @@ void registerOpenTxFirmwares()
registerOpenTxFirmware(firmware);
/* FrSky Horus board */
firmware = new OpenTxFirmware("opentx-horus", QObject::tr("FrSky Horus"), BOARD_HORUS);
firmware = new OpenTxFirmware("opentx-x12s", QObject::tr("FrSky Horus"), BOARD_X12S);
addOpenTxFrskyOptions(firmware);
firmware->addOption("pcbdev", QObject::tr("Use ONLY with first DEV pcb version"));
registerOpenTxFirmware(firmware);
/* FrSky X10 board */
/* Disabled for now
firmware = new OpenTxFirmware("opentx-x10", QObject::tr("FrSky X10"), BOARD_X10);
addOpenTxFrskyOptions(firmware);
registerOpenTxFirmware(firmware);
*/
/* 9XR-Pro */
firmware = new OpenTxFirmware("opentx-9xrpro", QObject::tr("Turnigy 9XR-PRO"), BOARD_9XRPRO);
firmware->addOption("heli", QObject::tr("Enable HELI menu and cyclic mix support"));

View file

@ -681,7 +681,7 @@ void MdiChild::setCurrentFile(const QString & fileName)
void MdiChild::writeEeprom() // write to Tx
{
Board::Type board = getCurrentBoard();
if (board == Board::BOARD_HORUS) {
if (IS_HORUS(board)) {
QString radioPath = findMassstoragePath("RADIO", true);
qDebug() << "Searching for SD card, found" << radioPath;
if (radioPath.isEmpty()) {

View file

@ -103,7 +103,7 @@ void RadioData::convert(Board::Type before, Board::Type after)
}
}
if (after == Board::BOARD_HORUS) {
if (IS_HORUS(after)) {
fixModelFilenames();
}
}

View file

@ -426,15 +426,16 @@ void SimulatorDialog::setupUi()
setWindowTitle(windowName);
switch(m_board) {
case Board::BOARD_TARANIS_X7 :
case Board::BOARD_TARANIS_X7:
radioUiWidget = new SimulatedUIWidgetX7(simulator, this);
break;
case Board::BOARD_TARANIS_X9D :
case Board::BOARD_TARANIS_X9DP :
case Board::BOARD_TARANIS_X9E :
case Board::BOARD_TARANIS_X9D:
case Board::BOARD_TARANIS_X9DP:
case Board::BOARD_TARANIS_X9E:
radioUiWidget = new SimulatedUIWidgetX9(simulator, this);
break;
case Board::BOARD_HORUS :
case Board::BOARD_X12S:
case Board::BOARD_X10:
radioUiWidget = new SimulatedUIWidgetX12(simulator, this);
break;
default:

View file

@ -86,7 +86,7 @@ void SimulatorStartupDialog::changeEvent(QEvent *e)
// FIXME : need a better way to check for this
bool SimulatorStartupDialog::usesCategorizedStorage(const QString & name)
{
return name.contains("horus", Qt::CaseInsensitive);
return name.contains("x12s", Qt::CaseInsensitive) || name.contains("x10", Qt::CaseInsensitive);
}
bool SimulatorStartupDialog::usesCategorizedStorage()

View file

@ -1,7 +1,7 @@
include(CMakeForceCompiler)
include(Bitmaps)
set(PCB_TYPES X9D X9D+ X9E X7 HORUS 9X 9XR 9X128 9XR128 SKY9X 9XRPRO AR9X 9X2561 GRUVIN9X MEGA2560)
set(PCB_TYPES X7 X9D X9D+ X9E X10 X12S 9X 9XR 9X128 9XR128 9X2561 GRUVIN9X MEGA2560 SKY9X 9XRPRO AR9X)
set(GUI_LANGUAGES CZ DE EN ES FR IT PT SK SE PL HU NL)
set(TTS_LANGUAGES CZ DE EN ES FR IT PT SK SE PL HU)
@ -27,6 +27,7 @@ option(DANGEROUS_MODULE_FUNCTIONS "Dangerous module functions (RangeCheck / Bind
option(FAI "Competition mode (no telemetry)" OFF)
option(AUTOSOURCE "Automatic source detection in menus" ON)
option(AUTOSWITCH "Automatic switch detection in menus" ON)
option(SEMIHOSTING "Enable debugger semihosting" OFF)
option(JITTER_MEASURE "Enable ADC jitter measurement" OFF)
option(WATCHDOG_DISABLED "Disable hardware Watchdog" OFF)
if(SDL_FOUND)
@ -81,7 +82,7 @@ set(FATFS_SRC
${FATFS_DIR}/option/ccsbcs.c
)
if(PCB STREQUAL HORUS)
if(PCB STREQUAL X12S OR PCB STREQUAL X10)
include(targets/horus/CMakeLists.txt)
elseif(PCB STREQUAL X9E OR PCB STREQUAL X9D+ OR PCB STREQUAL X9D OR PCB STREQUAL X7)
include(targets/taranis/CMakeLists.txt)
@ -165,7 +166,7 @@ else()
add_definitions(-DEEPROM -DEEPROM_RAW)
endif()
if(ARCH STREQUAL ARM AND NOT PCB STREQUAL HORUS AND NOT PCB STREQUAL FLAMENCO)
if(ARCH STREQUAL ARM AND NOT PCB STREQUAL X12S AND NOT PCB STREQUAL X10 AND NOT PCB STREQUAL FLAMENCO)
set(SRC ${SRC} storage/eeprom_conversions.cpp)
endif()
@ -204,7 +205,7 @@ if(NOT LUA STREQUAL NO)
set(GUI_SRC ${GUI_SRC} model_custom_scripts.cpp)
endif()
set(SRC ${SRC} lua/interface.cpp lua/api_general.cpp lua/api_lcd.cpp lua/api_model.cpp)
if(PCB STREQUAL HORUS)
if(PCB STREQUAL X12S OR PCB STREQUAL X10)
set(SRC ${SRC} lua/widgets.cpp)
endif()
set(LUA_SRC lapi.c lcode.c lctype.c ldebug.c ldo.c ldump.c lfunc.c lgc.c llex.c lmem.c lobject.c lopcodes.c lparser.c
@ -433,6 +434,10 @@ if(NOT MSVC)
# these are in addition to CMAKE_CXX_FLAGS
set(CMAKE_EXE_LINKER_FLAGS "-lm -T${RADIO_SRC_DIRECTORY}/${LINKER_SCRIPT} -Wl,-Map=firmware.map,--cref,--no-warn-mismatch,--gc-sections")
if(SEMIHOSTING)
add_definitions(-DSEMIHOSTING)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --specs=rdimon.specs")
endif()
if(PCB STREQUAL X9D OR PCB STREQUAL X9D+ OR PCB STREQUAL X9E OR PCB STREQUAL X7)
add_subdirectory(targets/${TARGET_DIR}/bootloader)

View file

@ -74,7 +74,7 @@ template <unsigned int NUM_BITS> class BitField {
#if defined(SIMU) && defined(SIMU_AUDIO)
#define AUDIO_BUFFER_COUNT (10) // simulator needs more buffers for smooth audio
#elif defined(PCBHORUS)
#elif defined(PCBX12S)
#define AUDIO_BUFFER_COUNT (2) // smaller than Taranis since there is also a buffer on the ADC chip
#else
#define AUDIO_BUFFER_COUNT (3)
@ -101,7 +101,7 @@ enum AudioBufferState
#define AUDIO_DATA_MIN 0
#define AUDIO_DATA_MAX 0xffff
#define AUDIO_BITS_PER_SAMPLE 16
#elif defined(PCBHORUS)
#elif defined(PCBX12S)
typedef int16_t audio_data_t;
#define AUDIO_DATA_SILENCE 0
#define AUDIO_DATA_MIN INT16_MIN

View file

@ -1,12 +1,27 @@
add_bitmaps_target(horus_bitmaps "${RADIO_SRC_DIRECTORY}/bitmaps/480x272/bmp_*.png" 480 5/6/5)
add_bitmaps_target(horus_calibration_bitmaps "${RADIO_SRC_DIRECTORY}/bitmaps/480x272/calibration/bmp_*.png" 480 5/6/5)
add_bitmaps_target(horus_button_bitmaps "${RADIO_SRC_DIRECTORY}/bitmaps/480x272/button/alpha_*.png" 480 4/4/4/4)
add_bitmaps_target(horus_alpha_bitmaps "${RADIO_SRC_DIRECTORY}/bitmaps/480x272/alpha_*.png" 480 4/4/4/4)
add_bitmaps_target(horus_alpha_calibration_bitmaps "${RADIO_SRC_DIRECTORY}/bitmaps/480x272/calibration/alpha_*.png" 480 4/4/4/4)
add_bitmaps_target(horus_masks ${RADIO_SRC_DIRECTORY}/bitmaps/480x272/mask_*.png 480 8bits)
add_bitmaps_target(horus_slider_masks "${RADIO_SRC_DIRECTORY}/bitmaps/480x272/slider/*.png" 480 8bits)
add_bitmaps_target(horus_layouts_masks "${RADIO_SRC_DIRECTORY}/gui/480x272/layouts/*.png" 480 8bits)
add_bitmaps_target(horus_themes_bitmaps "${RADIO_SRC_DIRECTORY}/gui/480x272/themes/*.png" 480 5/6/5)
add_bitmaps_target(horus_fonts ${RADIO_SRC_DIRECTORY}/fonts/480x272/*.png 480 8bits)
add_bitmaps_target(horus_volume_masks ${RADIO_SRC_DIRECTORY}/bitmaps/480x272/volume/*.png 480 8bits)
add_dependencies(horus_bitmaps horus_calibration_bitmaps horus_button_bitmaps horus_alpha_bitmaps horus_alpha_calibration_bitmaps horus_masks horus_slider_masks horus_layouts_masks horus_themes_bitmaps horus_fonts horus_volume_masks)
if(PCB STREQUAL X12S)
add_bitmaps_target(x12s_bitmaps "${RADIO_SRC_DIRECTORY}/bitmaps/480x272/bmp_*.png" 480 5/6/5)
add_bitmaps_target(x12s_calibration_bitmaps "${RADIO_SRC_DIRECTORY}/bitmaps/480x272/calibration/bmp_*.png" 480 5/6/5)
add_bitmaps_target(x12s_button_bitmaps "${RADIO_SRC_DIRECTORY}/bitmaps/480x272/button/alpha_*.png" 480 4/4/4/4)
add_bitmaps_target(x12s_alpha_bitmaps "${RADIO_SRC_DIRECTORY}/bitmaps/480x272/alpha_*.png" 480 4/4/4/4)
add_bitmaps_target(x12s_alpha_calibration_bitmaps "${RADIO_SRC_DIRECTORY}/bitmaps/480x272/calibration/alpha_*.png" 480 4/4/4/4)
add_bitmaps_target(x12s_masks ${RADIO_SRC_DIRECTORY}/bitmaps/480x272/mask_*.png 480 8bits)
add_bitmaps_target(x12s_slider_masks "${RADIO_SRC_DIRECTORY}/bitmaps/480x272/slider/*.png" 480 8bits)
add_bitmaps_target(x12s_layouts_masks "${RADIO_SRC_DIRECTORY}/gui/480x272/layouts/*.png" 480 8bits)
add_bitmaps_target(x12s_themes_bitmaps "${RADIO_SRC_DIRECTORY}/gui/480x272/themes/*.png" 480 5/6/5)
add_bitmaps_target(x12s_fonts ${RADIO_SRC_DIRECTORY}/fonts/480x272/*.png 480 8bits)
add_bitmaps_target(x12s_volume_masks ${RADIO_SRC_DIRECTORY}/bitmaps/480x272/volume/*.png 480 8bits)
add_dependencies(x12s_bitmaps x12s_calibration_bitmaps x12s_button_bitmaps x12s_alpha_bitmaps x12s_alpha_calibration_bitmaps x12s_masks x12s_slider_masks x12s_layouts_masks x12s_themes_bitmaps x12s_fonts x12s_volume_masks)
else()
add_bitmaps_target(x10_bitmaps "${RADIO_SRC_DIRECTORY}/bitmaps/480x272/bmp_*.png" 480 5/6/5-R)
add_bitmaps_target(x10_calibration_bitmaps "${RADIO_SRC_DIRECTORY}/bitmaps/480x272/calibration/bmp_*.png" 480 5/6/5-R)
add_bitmaps_target(x10_button_bitmaps "${RADIO_SRC_DIRECTORY}/bitmaps/480x272/button/alpha_*.png" 480 4/4/4/4-R)
add_bitmaps_target(x10_alpha_bitmaps "${RADIO_SRC_DIRECTORY}/bitmaps/480x272/alpha_*.png" 480 4/4/4/4-R)
add_bitmaps_target(x10_alpha_calibration_bitmaps "${RADIO_SRC_DIRECTORY}/bitmaps/480x272/calibration/alpha_*.png" 480 4/4/4/4-R)
add_bitmaps_target(x10_masks ${RADIO_SRC_DIRECTORY}/bitmaps/480x272/mask_*.png 480 8bits)
add_bitmaps_target(x10_slider_masks "${RADIO_SRC_DIRECTORY}/bitmaps/480x272/slider/*.png" 480 8bits)
add_bitmaps_target(x10_layouts_masks "${RADIO_SRC_DIRECTORY}/gui/480x272/layouts/*.png" 480 8bits)
add_bitmaps_target(x10_themes_bitmaps "${RADIO_SRC_DIRECTORY}/gui/480x272/themes/*.png" 480 5/6/5-R)
add_bitmaps_target(x10_fonts ${RADIO_SRC_DIRECTORY}/fonts/480x272/*.png 480 8bits)
add_bitmaps_target(x10_volume_masks ${RADIO_SRC_DIRECTORY}/bitmaps/480x272/volume/*.png 480 8bits)
add_dependencies(x10_bitmaps x10_calibration_bitmaps x10_button_bitmaps x10_alpha_bitmaps x10_alpha_calibration_bitmaps x10_masks x10_slider_masks x10_layouts_masks x10_themes_bitmaps x10_fonts x10_volume_masks)
endif()

View file

@ -681,7 +681,7 @@ int cliDisplay(const char ** argv)
}
}
else if (!strcmp(argv[1], "adc")) {
for (int i=0; i<NUMBER_ANALOG; i++) {
for (int i=0; i<NUM_ANALOGS; i++) {
serialPrint("adc[%d] = %04X", i, (int)adcValues[i]);
}
}
@ -859,7 +859,7 @@ int cliRepeat(const char ** argv)
int cliShowJitter(const char ** argv)
{
serialPrint( "# anaIn rawJ avgJ");
for (int i=0; i<NUMBER_ANALOG; i++) {
for (int i=0; i<NUM_ANALOGS; i++) {
serialPrint("A%02d %04X %04X %3d %3d", i, getAnalogValue(i), anaIn(i), rawJitter[i].get(), avgJitter[i].get());
if (IS_POT_MULTIPOS(i)) {
StepsCalibData * calib = (StepsCalibData *) &g_eeGeneral.calib[i];
@ -897,7 +897,7 @@ int cliGps(const char ** argv)
}
#endif
#if defined(PCBX9E) || defined(PCBHORUS)
#if defined(BLUETOOTH)
int cliBlueTooth(const char ** argv)
{
int baudrate = 0;
@ -964,7 +964,7 @@ const CliCommand cliCommands[] = {
#if defined(INTERNAL_GPS)
{ "gps", cliGps, "<baudrate>|$<command>|trace" },
#endif
#if defined(PCBX9E) || defined(PCBHORUS)
#if defined(BLUETOOTH)
{ "bt", cliBlueTooth, "<baudrate>|$<command>|read" },
#endif
{ NULL, NULL, NULL } /* sentinel */

View file

@ -215,12 +215,18 @@ enum CurveType {
#define NUM_ROTARY_ENCODERS 0
#endif
#if defined(PCBHORUS)
#if defined(PCBX10)
#define NUM_AUX_TRIMS 2
#define NUM_MOUSE_ANALOGS 2
#define NUM_DUMMY_ANAS 2
#elif defined(PCBHORUS)
#define NUM_AUX_TRIMS 2
#define NUM_MOUSE_ANALOGS 2
#define NUM_DUMMY_ANAS 0
#else
#define NUM_AUX_TRIMS 0
#define NUM_MOUSE_ANALOGS 0
#define NUM_DUMMY_ANAS 0
#endif
#if defined(COLORLCD)

View file

@ -776,8 +776,10 @@ PACK(struct CustomScreenData {
// TODO other boards could have their custom screens here as well
#endif
#if defined(PCBHORUS)
#if defined(PCBX12S)
#define MODELDATA_EXTRA NOBACKUP(uint8_t spare:3); NOBACKUP(uint8_t trainerMode:3); NOBACKUP(uint8_t potsWarnMode:2); ModuleData moduleData[NUM_MODULES+1]; NOBACKUP(ScriptData scriptsData[MAX_SCRIPTS]); NOBACKUP(char inputNames[MAX_INPUTS][LEN_INPUT_NAME]); NOBACKUP(uint8_t potsWarnEnabled); NOBACKUP(int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]);
#elif defined(PCBX10)
#define MODELDATA_EXTRA NOBACKUP(uint8_t spare:3); NOBACKUP(uint8_t trainerMode:3); NOBACKUP(uint8_t potsWarnMode:2); ModuleData moduleData[NUM_MODULES+1]; NOBACKUP(ScriptData scriptsData[MAX_SCRIPTS]); NOBACKUP(char inputNames[MAX_INPUTS][LEN_INPUT_NAME]); NOBACKUP(uint8_t potsWarnEnabled); NOBACKUP(int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]); NOBACKUP(uint8_t potsWarnSpares[NUM_DUMMY_ANAS]);
#elif defined(PCBFLAMENCO)
#define MODELDATA_EXTRA uint8_t spare:3; uint8_t trainerMode:3; uint8_t potsWarnMode:2; ModuleData moduleData[NUM_MODULES+1]; ScriptData scriptsData[MAX_SCRIPTS]; char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; uint8_t potsWarnEnabled; int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS];
#elif defined(PCBTARANIS)
@ -905,7 +907,7 @@ PACK(struct TrainerData {
uint32_t switchConfig; \
uint8_t potsConfig; /* two bits per pot */ \
NOBACKUP(char switchNames[NUM_SWITCHES][LEN_SWITCH_NAME]); \
NOBACKUP(char anaNames[NUM_STICKS+NUM_POTS+NUM_SLIDERS][LEN_ANA_NAME]); \
NOBACKUP(char anaNames[NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_DUMMY_ANAS][LEN_ANA_NAME]); \
NOBACKUP(char currModelFilename[LEN_MODEL_FILENAME+1]); \
NOBACKUP(uint8_t bluetoothEnable:1); \
NOBACKUP(uint8_t blOffBright:7); \
@ -977,7 +979,7 @@ PACK(struct TrainerData {
PACK(struct RadioData {
NOBACKUP(uint8_t version);
NOBACKUP(uint16_t variant);
CalibData calib[NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_MOUSE_ANALOGS];
CalibData calib[NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_MOUSE_ANALOGS+NUM_DUMMY_ANAS];
NOBACKUP(uint16_t chkSum);
N_HORUS_FIELD(int8_t currModel);
N_HORUS_FIELD(uint8_t contrast);
@ -1095,7 +1097,6 @@ static inline void check_struct()
CHKSIZE(FrSkyTelemetryData, 106);
CHKSIZE(ModelHeader, 24);
CHKSIZE(CurveData, 4);
#if defined(PCBX9E)
CHKSIZE(RadioData, 952);
CHKSIZE(ModelData, 6520);

View file

@ -38,6 +38,9 @@ extern "C" {
typedef void (*traceCallbackFunc)(const char * text);
extern traceCallbackFunc traceCallback;
void debugPrintf(const char * format, ...);
#elif defined(SEMIHOSTING)
#include <stdio.h>
#define debugPrintf(...) printf(__VA_ARGS__)
#elif defined(DEBUG) && defined(CLI) && defined(USB_SERIAL)
#define debugPrintf(...) do { if (cliTracesEnabled) serialPrintf(__VA_ARGS__); } while(0)
#elif defined(DEBUG) && defined(CLI)

View file

@ -304,7 +304,7 @@ void menuModelExpoOne(event_t event)
drawFunction(expoFn);
int16_t x512 = calibratedStick[ed->chn];
int16_t x512 = calibratedAnalogs[ed->chn];
lcdDrawNumber(LCD_W-8, 6*FH, calcRESXto100(x512), 0);
int16_t y512 = expoFn(x512);
lcdDrawNumber(LCD_W-8-6*FW, 1*FH, calcRESXto100(y512), 0);

View file

@ -805,26 +805,26 @@ void check(event_t event, uint8_t curr, const MenuHandlerFunc *menuTab, uint8_t
// check pot 1 - if changed -> scroll values
static int16_t p1val;
static int16_t p1valprev;
p1valdiff = (p1val-calibratedStick[6]) / SCROLL_POT1_TH;
p1valdiff = (p1val-calibratedAnalogs[CALIBRATED_POT1]) / SCROLL_POT1_TH;
if (p1valdiff) {
p1valdiff = (p1valprev-calibratedStick[6]) / 2;
p1val = calibratedStick[6];
p1valdiff = (p1valprev-calibratedAnalogs[CALIBRATED_POT1]) / 2;
p1val = calibratedAnalogs[CALIBRATED_POT1];
}
p1valprev = calibratedStick[6];
p1valprev = calibratedAnalogs[CALIBRATED_POT1];
#endif
#if defined(NAVIGATION_POT2)
// check pot 2 - if changed -> scroll menu
static int16_t p2valprev;
p2valdiff = (p2valprev-calibratedStick[4]) / SCROLL_TH;
if (p2valdiff) p2valprev = calibratedStick[4];
p2valdiff = (p2valprev-calibratedAnalogs[CALIBRATED_POT2]) / SCROLL_TH;
if (p2valdiff) p2valprev = calibratedAnalogs[CALIBRATED_POT2];
#endif
#if defined(NAVIGATION_POT3)
// check pot 3 if changed -> cursor down/up
static int16_t p3valprev;
int8_t scrollUD = (p3valprev-calibratedStick[5]) / SCROLL_TH;
if (scrollUD) p3valprev = calibratedStick[5];
int8_t scrollUD = (p3valprev-calibratedAnalogs[CALIBRATED_POT3]) / SCROLL_TH;
if (scrollUD) p3valprev = calibratedAnalogs[CALIBRATED_POT3];
#else
#define scrollUD 0
#endif

View file

@ -50,9 +50,9 @@ void menuRadioDiagAnalogs(event_t event)
#endif
lcdDrawHexNumber(x+3*FW-1, y, anaIn(i));
#if defined(CPUARM)
lcdDrawNumber(x+10*FW-1, y, (int16_t)calibratedStick[CONVERT_MODE(i)]*25/256, RIGHT);
lcdDrawNumber(x+10*FW-1, y, (int16_t)calibratedAnalogs[CONVERT_MODE(i)]*25/256, RIGHT);
#else
lcdDraw8bitsNumber(x+10*FW-1, y, (int16_t)calibratedStick[CONVERT_MODE(i)]*25/256);
lcdDraw8bitsNumber(x+10*FW-1, y, (int16_t)calibratedAnalogs[CONVERT_MODE(i)]*25/256);
#endif
}

View file

@ -51,7 +51,7 @@ void drawPotsBars()
// Optimization by Mike Blandford
for (uint8_t x=LCD_W/2 - (NUM_POTS+NUM_SLIDERS-1) * 5 / 2, i=NUM_STICKS; i<NUM_STICKS+NUM_POTS+NUM_SLIDERS; x+=5, i++) {
if (IS_POT_SLIDER_AVAILABLE(i)) {
uint8_t len = ((calibratedStick[i]+RESX)*BAR_HEIGHT/(RESX*2))+1l; // calculate once per loop
uint8_t len = ((calibratedAnalogs[i]+RESX)*BAR_HEIGHT/(RESX*2))+1l; // calculate once per loop
V_BAR(x, LCD_H-8, len);
}
}
@ -59,15 +59,15 @@ void drawPotsBars()
void doMainScreenGraphics()
{
int16_t calibStickVert = calibratedStick[CONVERT_MODE(1)];
int16_t calibStickVert = calibratedAnalogs[CONVERT_MODE(1)];
if (g_model.throttleReversed && CONVERT_MODE(1) == THR_STICK)
calibStickVert = -calibStickVert;
drawStick(LBOX_CENTERX, calibratedStick[CONVERT_MODE(0)], calibStickVert);
drawStick(LBOX_CENTERX, calibratedAnalogs[CONVERT_MODE(0)], calibStickVert);
calibStickVert = calibratedStick[CONVERT_MODE(2)];
calibStickVert = calibratedAnalogs[CONVERT_MODE(2)];
if (g_model.throttleReversed && CONVERT_MODE(2) == THR_STICK)
calibStickVert = -calibStickVert;
drawStick(RBOX_CENTERX, calibratedStick[CONVERT_MODE(3)], calibStickVert);
drawStick(RBOX_CENTERX, calibratedAnalogs[CONVERT_MODE(3)], calibStickVert);
drawPotsBars();
}

View file

@ -38,7 +38,7 @@ void drawPotsBars()
// Optimization by Mike Blandford
for (uint8_t x=LCD_W/2-(NUM_POTS+NUM_SLIDERS)/2*BAR_SPACING+BAR_SPACING/2, i=NUM_STICKS; i<NUM_STICKS+NUM_POTS+NUM_SLIDERS; x+=BAR_SPACING, i++) {
if (IS_POT_SLIDER_AVAILABLE(i)) {
uint8_t len = ((calibratedStick[i]+RESX)*BAR_HEIGHT/(RESX*2))+1l; // calculate once per loop
uint8_t len = ((calibratedAnalogs[i]+RESX)*BAR_HEIGHT/(RESX*2))+1l; // calculate once per loop
V_BAR(x, LCD_H-8, len);
putsStickName(x-2, LCD_H-6, i, TINSIZE);
}

View file

@ -35,9 +35,9 @@ void menuRadioDiagAnalogs(event_t event)
#if defined(JITTER_MEASURE)
lcdDrawNumber(x+10*FW-1, y, rawJitter[i].get(), RIGHT);
lcdDrawNumber(x+13*FW-1, y, avgJitter[i].get(), RIGHT);
lcdDrawNumber(x+17*FW-1, y, (int16_t)calibratedStick[CONVERT_MODE(i)]*25/256, RIGHT);
lcdDrawNumber(x+17*FW-1, y, (int16_t)calibratedAnalogs[CONVERT_MODE(i)]*25/256, RIGHT);
#else
lcdDrawNumber(x+10*FW-1, y, (int16_t)calibratedStick[CONVERT_MODE(i)]*25/256, RIGHT);
lcdDrawNumber(x+10*FW-1, y, (int16_t)calibratedAnalogs[CONVERT_MODE(i)]*25/256, RIGHT);
#endif
}

View file

@ -72,15 +72,15 @@ const pm_uchar icons[] PROGMEM = {
void doMainScreenGraphics()
{
int16_t calibStickVert = calibratedStick[CONVERT_MODE(1)];
int16_t calibStickVert = calibratedAnalogs[CONVERT_MODE(1)];
if (g_model.throttleReversed && CONVERT_MODE(1) == THR_STICK)
calibStickVert = -calibStickVert;
drawStick(LBOX_CENTERX, calibratedStick[CONVERT_MODE(0)], calibStickVert);
drawStick(LBOX_CENTERX, calibratedAnalogs[CONVERT_MODE(0)], calibStickVert);
calibStickVert = calibratedStick[CONVERT_MODE(2)];
calibStickVert = calibratedAnalogs[CONVERT_MODE(2)];
if (g_model.throttleReversed && CONVERT_MODE(2) == THR_STICK)
calibStickVert = -calibStickVert;
drawStick(RBOX_CENTERX, calibratedStick[CONVERT_MODE(3)], calibStickVert);
drawStick(RBOX_CENTERX, calibratedAnalogs[CONVERT_MODE(3)], calibStickVert);
}
void displayTrims(uint8_t phase)
@ -174,7 +174,7 @@ void drawSliders()
lcdDrawSolidVerticalLine(x, y, LCD_H/2-2);
lcdDrawSolidVerticalLine(x+1, y, LCD_H/2-2);
y += LCD_H/2-4;
y -= ((calibratedStick[i]+RESX)*(LCD_H/2-4)/(RESX*2)); // calculate once per loop
y -= ((calibratedAnalogs[i]+RESX)*(LCD_H/2-4)/(RESX*2)); // calculate once per loop
lcdDrawSolidVerticalLine(x-1, y, 2);
lcdDrawSolidVerticalLine(x+2, y, 2);
}

View file

@ -49,7 +49,7 @@ void BitmapBuffer::drawHorizontalLine(coord_t x, coord_t y, coord_t w, uint8_t p
if (pat == SOLID) {
while (w--) {
drawAlphaPixel(p, opacity, color);
p++;
MOVE_TO_NEXT_RIGHT_PIXEL(p);
}
}
else {
@ -61,7 +61,7 @@ void BitmapBuffer::drawHorizontalLine(coord_t x, coord_t y, coord_t w, uint8_t p
else {
pat = pat >> 1;
}
p++;
MOVE_TO_NEXT_RIGHT_PIXEL(p);
}
}
}
@ -130,7 +130,8 @@ void BitmapBuffer::invertRect(coord_t x, coord_t y, coord_t w, coord_t h, LcdFla
for (int j=0; j<w; j++) {
// TODO ASSERT_IN_DISPLAY(p);
RGB_SPLIT(*p, bgRed, bgGreen, bgBlue);
drawPixel(p++, RGB_JOIN(0x1F + red - bgRed, 0x3F + green - bgGreen, 0x1F + blue - bgBlue));
drawPixel(p, RGB_JOIN(0x1F + red - bgRed, 0x3F + green - bgGreen, 0x1F + blue - bgBlue));
MOVE_TO_NEXT_RIGHT_PIXEL(p);
}
}
}
@ -256,7 +257,8 @@ void BitmapBuffer::drawMask(coord_t x, coord_t y, BitmapBuffer * mask, LcdFlags
display_t * q = mask->getPixelPtr(offset, row);
for (coord_t col=0; col<width; col++) {
drawAlphaPixel(p, *((uint8_t *)q), color);
p++; q++;
MOVE_TO_NEXT_RIGHT_PIXEL(p);
MOVE_TO_NEXT_RIGHT_PIXEL(q);
}
}
}
@ -489,10 +491,10 @@ BitmapBuffer * BitmapBuffer::loadMask(const char * filename)
{
BitmapBuffer * bitmap = BitmapBuffer::load(filename);
if (bitmap) {
display_t * p = bitmap->getData();
display_t * p = bitmap->getPixelPtr(0, 0);
for (int i = bitmap->getWidth() * bitmap->getHeight(); i > 0; i--) {
*((uint8_t *)p) = OPACITY_MAX - ((*p) >> 12);
p++;
MOVE_TO_NEXT_RIGHT_PIXEL(p);
}
}
return bitmap;
@ -624,14 +626,13 @@ BitmapBuffer * BitmapBuffer::load_bmp(const char * filename)
return NULL;
}
uint16_t * dest = bmp->getData();
uint32_t rowSize;
bool hasAlpha = false;
switch (depth) {
case 32:
for (int i=h-1; i>=0; i--) {
uint8_t * dst = ((uint8_t *)dest) + i*w*2;
display_t * dst = bmp->getPixelPtr(0, i);
for (unsigned int j=0; j<w; j++) {
uint32_t pixel;
result = f_read(&imgFile, (uint8_t *)&pixel, 4, &read);
@ -641,23 +642,23 @@ BitmapBuffer * BitmapBuffer::load_bmp(const char * filename)
return NULL;
}
if (hasAlpha) {
*((uint16_t *)dst) = ARGB(pixel & 0xff, (pixel >> 24) & 0xff, (pixel >> 16) & 0xff, (pixel >> 8) & 0xff);
*dst = ARGB(pixel & 0xff, (pixel >> 24) & 0xff, (pixel >> 16) & 0xff, (pixel >> 8) & 0xff);
}
else {
if ((pixel & 0xff) == 0xff) {
*((uint16_t *)dst) = RGB(pixel >> 24, (pixel >> 16) & 0xff, (pixel >> 8) & 0xff);
*dst = RGB(pixel >> 24, (pixel >> 16) & 0xff, (pixel >> 8) & 0xff);
}
else {
hasAlpha = true;
bmp->setFormat(BMP_ARGB4444);
for (uint16_t * p = dest + i*w; p<dest + h*w; p++) {
uint16_t tmp = *p;
for (display_t * p = bmp->getPixelPtr(j, i); p != bmp->getPixelPtr(0, h); MOVE_TO_NEXT_RIGHT_PIXEL(p)) {
display_t tmp = *p;
*p = ((tmp >> 1) & 0x0f) + (((tmp >> 7) & 0x0f) << 4) + (((tmp >> 12) & 0x0f) << 8);
}
*((uint16_t *)dst) = ARGB(pixel & 0xff, (pixel >> 24) & 0xff, (pixel >> 16) & 0xff, (pixel >> 8) & 0xff);
*dst = ARGB(pixel & 0xff, (pixel >> 24) & 0xff, (pixel >> 16) & 0xff, (pixel >> 8) & 0xff);
}
}
dst += 2;
MOVE_TO_NEXT_RIGHT_PIXEL(dst);
}
}
break;
@ -674,12 +675,12 @@ BitmapBuffer * BitmapBuffer::load_bmp(const char * filename)
delete bmp;
return NULL;
}
uint8_t * dst = ((uint8_t *)dest) + i*w*2;
display_t * dst = bmp->getPixelPtr(0, i);
for (uint32_t j=0; j<w; j++) {
uint8_t index = (buf[j/2] >> ((j & 1) ? 0 : 4)) & 0x0F;
uint8_t val = palette[index];
*((uint16_t *)dst) = RGB(val, val, val);
dst += 2;
*dst = RGB(val, val, val);
MOVE_TO_NEXT_RIGHT_PIXEL(dst);
}
}
break;
@ -792,22 +793,22 @@ BitmapBuffer * BitmapBuffer::load_stb(const char * filename)
#if 0
DMABitmapConvert(bmp->data, img, w, h, n == 4 ? DMA2D_ARGB4444 : DMA2D_RGB565);
#else
uint16_t * dest = bmp->getData();
display_t * dest = bmp->getPixelPtr(0, 0);
const uint8_t * p = img;
if (n == 4) {
for(int row = 0; row < h; ++row) {
for(int col = 0; col < w; ++col) {
for (int row = 0; row < h; ++row) {
for (int col = 0; col < w; ++col) {
*dest = ARGB(p[3], p[0], p[1], p[2]);
++dest;
MOVE_TO_NEXT_RIGHT_PIXEL(dest);
p += 4;
}
}
}
else {
for(int row = 0; row < h; ++row) {
for(int col = 0; col < w; ++col) {
for (int row = 0; row < h; ++row) {
for (int col = 0; col < w; ++col) {
*dest = RGB(p[0], p[1], p[2]);
++dest;
MOVE_TO_NEXT_RIGHT_PIXEL(dest);
p += 4;
}
}

View file

@ -24,6 +24,15 @@
#include <inttypes.h>
#include "colors.h"
#if defined(PCBX10)
#define MOVE_PIXEL_RIGHT(p, count) p -= count
#else
#define MOVE_PIXEL_RIGHT(p, count) p += count
#endif
#define MOVE_TO_NEXT_RIGHT_PIXEL(p) MOVE_PIXEL_RIGHT(p, 1)
#define USE_STB
// TODO should go to lcd.h again
@ -70,6 +79,15 @@ class BitmapBufferBase
return data;
}
inline const display_t * getPixelPtr(coord_t x, coord_t y) const
{
#if defined(PCBX10)
x = width - x - 1;
y = height - y - 1;
#endif
return &data[y*width + x];
}
protected:
uint8_t format;
uint16_t width;
@ -140,8 +158,21 @@ class BitmapBuffer: public BitmapBufferBase<uint16_t>
#endif
}
inline const display_t * getPixelPtr(coord_t x, coord_t y) const
{
#if defined(PCBX10)
x = width - x - 1;
y = height - y - 1;
#endif
return &data[y*width + x];
}
inline display_t * getPixelPtr(coord_t x, coord_t y)
{
#if defined(PCBX10)
x = width - x - 1;
y = height - y - 1;
#endif
return &data[y*width + x];
}
@ -180,7 +211,7 @@ class BitmapBuffer: public BitmapBufferBase<uint16_t>
if (!data || h==0 || w==0) return;
if (h<0) { y+=h; h=-h; }
if (w<0) { x+=w; w=-w; }
DMAFillRect(data, width, x, y, w, h, lcdColorTable[COLOR_IDX(flags)]);
DMAFillRect(data, width, height, x, y, w, h, lcdColorTable[COLOR_IDX(flags)]);
}
void drawFilledRect(coord_t x, coord_t y, coord_t w, coord_t h, uint8_t pat, LcdFlags att);
@ -242,10 +273,10 @@ class BitmapBuffer: public BitmapBufferBase<uint16_t>
h = height - y;
}
if (bmp->getFormat() == BMP_ARGB4444) {
DMACopyAlphaBitmap(data, this->width, x, y, bmp->getData(), srcw, srcx, srcy, w, h);
DMACopyAlphaBitmap(data, width, height, x, y, bmp->getData(), srcw, srch, srcx, srcy, w, h);
}
else {
DMACopyBitmap(data, width, x, y, bmp->getData(), srcw, srcx, srcy, w, h);
DMACopyBitmap(data, width, height, x, y, bmp->getData(), srcw, srch, srcx, srcy, w, h);
}
}
else {
@ -258,10 +289,11 @@ class BitmapBuffer: public BitmapBufferBase<uint16_t>
scaledh = height - y;
for (int i = 0; i < scaledh; i++) {
uint16_t * p = &data[(y + i) * width + x];
const uint16_t * qstart = &bmp->getData()[(srcy + int(i / scale)) * bmp->getWidth() + srcx];
display_t * p = getPixelPtr(x, y + i);
const display_t * qstart = bmp->getPixelPtr(srcx, srcy + int(i / scale));
for (int j = 0; j < scaledw; j++) {
const uint16_t * q = qstart + int(j / scale);
const display_t * q = qstart;
MOVE_PIXEL_RIGHT(q, int(j / scale));
if (bmp->getFormat() == BMP_ARGB4444) {
ARGB_SPLIT(*q, a, r, g, b);
drawAlphaPixel(p, a, RGB_JOIN(r<<1, g<<2, b<<1));
@ -269,7 +301,7 @@ class BitmapBuffer: public BitmapBufferBase<uint16_t>
else {
drawPixel(p, *q);
}
p++;
MOVE_TO_NEXT_RIGHT_PIXEL(p);
}
}
}

View file

@ -411,8 +411,13 @@ void lcdDrawBlackOverlay()
BitmapBuffer _lcd(BMP_RGB565, LCD_W, LCD_H, displayBuf);
BitmapBuffer * lcd = &_lcd;
void DMAFillRect(uint16_t * dest, uint16_t destw, uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color)
void DMAFillRect(uint16_t * dest, uint16_t destw, uint16_t desth, uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color)
{
#if defined(PCBX10)
x = destw - (x + w);
y = desth - (y + h);
#endif
for (int i=0; i<h; i++) {
for (int j=0; j<w; j++) {
dest[(y+i)*destw+x+j] = color;
@ -420,15 +425,29 @@ void DMAFillRect(uint16_t * dest, uint16_t destw, uint16_t x, uint16_t y, uint16
}
}
void DMACopyBitmap(uint16_t * dest, uint16_t destw, uint16_t x, uint16_t y, const uint16_t * src, uint16_t srcw, uint16_t srcx, uint16_t srcy, uint16_t w, uint16_t h)
void DMACopyBitmap(uint16_t * dest, uint16_t destw, uint16_t desth, uint16_t x, uint16_t y, const uint16_t * src, uint16_t srcw, uint16_t srch, uint16_t srcx, uint16_t srcy, uint16_t w, uint16_t h)
{
#if defined(PCBX10)
x = destw - (x + w);
y = desth - (y + h);
srcx = srcw - (srcx + w);
srcy = srch - (srcy + h);
#endif
for (int i=0; i<h; i++) {
memcpy(dest+(y+i)*destw+x, src+(srcy+i)*srcw+srcx, 2*w);
}
}
void DMACopyAlphaBitmap(uint16_t * dest, uint16_t destw, uint16_t x, uint16_t y, const uint16_t * src, uint16_t srcw, uint16_t srcx, uint16_t srcy, uint16_t w, uint16_t h)
void DMACopyAlphaBitmap(uint16_t * dest, uint16_t destw, uint16_t desth, uint16_t x, uint16_t y, const uint16_t * src, uint16_t srcw, uint16_t srch, uint16_t srcx, uint16_t srcy, uint16_t w, uint16_t h)
{
#if defined(PCBX10)
x = destw - (x + w);
y = desth - (y + h);
srcx = srcw - (srcx + w);
srcy = srch - (srcy + h);
#endif
for (coord_t line=0; line<h; line++) {
uint16_t * p = dest + (y+line)*destw + x;
const uint16_t * q = src + (srcy+line)*srcw + srcx;

View file

@ -363,6 +363,9 @@ bool menuModelSelect(event_t event)
break;
case EVT_KEY_FIRST(KEY_PGUP):
#if defined(PCBX10)
case EVT_KEY_LONG(KEY_PGDN):
#endif
if (selectMode == MODE_SELECT_MODEL) {
if (categoriesVerticalPosition == 0)
categoriesVerticalPosition = modelslist.categories.size() - 1;
@ -378,9 +381,14 @@ bool menuModelSelect(event_t event)
modelslist.moveModel(model, previous_category, currentCategory);
setCurrentModel(currentCategory->size()-1);
}
killEvents(event);
break;
#if defined(PCBX12S)
case EVT_KEY_FIRST(KEY_PGDN):
#elif defined(PCBX10)
case EVT_KEY_BREAK(KEY_PGDN):
#endif
if (selectMode == MODE_SELECT_MODEL) {
categoriesVerticalPosition += 1;
if (categoriesVerticalPosition >= modelslist.categories.size())

View file

@ -352,14 +352,22 @@ bool check(event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, uint8_t
if (menuTab && !menuCalibrationState) {
int cc = curr;
switch (event) {
#if defined(PCBX12S)
case EVT_KEY_FIRST(KEY_PGDN):
#elif defined(PCBX10)
case EVT_KEY_BREAK(KEY_PGDN):
#endif
if (++cc == menuTabSize)
cc = 0;
break;
case EVT_KEY_FIRST(KEY_PGUP):
#if defined(PCBX10)
case EVT_KEY_LONG(KEY_PGDN):
#endif
if (cc-- == 0)
cc = menuTabSize-1;
killEvents(event);
break;
}

View file

@ -45,15 +45,15 @@ void drawStick(coord_t x, coord_t y, const BitmapBuffer * background, int16_t xv
void drawSticks()
{
int16_t calibStickVert = calibratedStick[CONVERT_MODE(1)];
int16_t calibStickVert = calibratedAnalogs[CONVERT_MODE(1)];
if (g_model.throttleReversed && CONVERT_MODE(1) == THR_STICK)
calibStickVert = -calibStickVert;
drawStick(STICK_LEFT_X, STICKS_Y, calibStickBackground, calibratedStick[CONVERT_MODE(0)], calibStickVert);
drawStick(STICK_LEFT_X, STICKS_Y, calibStickBackground, calibratedAnalogs[CONVERT_MODE(0)], calibStickVert);
calibStickVert = calibratedStick[CONVERT_MODE(2)];
calibStickVert = calibratedAnalogs[CONVERT_MODE(2)];
if (g_model.throttleReversed && CONVERT_MODE(2) == THR_STICK)
calibStickVert = -calibStickVert;
drawStick(STICK_RIGHT_X, STICKS_Y, calibStickBackground, calibratedStick[CONVERT_MODE(3)], calibStickVert);
drawStick(STICK_RIGHT_X, STICKS_Y, calibStickBackground, calibratedAnalogs[CONVERT_MODE(3)], calibStickVert);
}
void drawPots()
@ -62,17 +62,19 @@ void drawPots()
extern void drawMainPots();
drawMainPots();
#if defined(PCBX12S)
// The 2 main front sliders
drawVerticalSlider(125, 120, 120, calibratedStick[7], -RESX, RESX, 40, OPTION_SLIDER_TICKS | OPTION_SLIDER_BIG_TICKS |
OPTION_SLIDER_SQUARE_BUTTON);
drawVerticalSlider(LCD_W-125-12, 120, 120, calibratedStick[8], -RESX, RESX, 40, OPTION_SLIDER_TICKS | OPTION_SLIDER_BIG_TICKS |
OPTION_SLIDER_SQUARE_BUTTON);
drawVerticalSlider(125, 120, 120, calibratedAnalogs[CALIBRATED_SLIDER_FRONT_LEFT], -RESX, RESX, 40, OPTION_SLIDER_TICKS | OPTION_SLIDER_BIG_TICKS | OPTION_SLIDER_SQUARE_BUTTON);
drawVerticalSlider(LCD_W-125-12, 120, 120, calibratedAnalogs[CALIBRATED_SLIDER_FRONT_RIGHT], -RESX, RESX, 40, OPTION_SLIDER_TICKS | OPTION_SLIDER_BIG_TICKS | OPTION_SLIDER_SQUARE_BUTTON);
#endif
}
#if defined(PCBX12S)
void drawMouse()
{
drawStick(STICK_LEFT_X, STICKS_Y+100, calibTrackpBackground, calibratedStick[11], calibratedStick[12]);
drawStick(STICK_LEFT_X, STICKS_Y+100, calibTrackpBackground, calibratedAnalogs[CALIBRATED_MOUSE1], calibratedAnalogs[CALIBRATED_MOUSE2]);
}
#endif
bool menuCommonCalib(event_t event)
{
@ -213,7 +215,10 @@ bool menuCommonCalib(event_t event)
drawSticks();
drawPots();
#if defined(PCBX12S)
drawMouse();
#endif
return true;
}

View file

@ -33,8 +33,10 @@ enum MenuRadioHardwareItems {
ITEM_RADIO_HARDWARE_POT3,
ITEM_RADIO_HARDWARE_LS,
ITEM_RADIO_HARDWARE_RS,
#if defined(PCBX12S)
ITEM_RADIO_HARDWARE_LS2,
ITEM_RADIO_HARDWARE_RS2,
#endif
ITEM_RADIO_HARDWARE_LABEL_SWITCHES,
ITEM_RADIO_HARDWARE_SA,
ITEM_RADIO_HARDWARE_SB,
@ -54,14 +56,18 @@ enum MenuRadioHardwareItems {
};
#define HW_SETTINGS_COLUMN 150
#if defined(PCBX10)
#define POTS_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1
#else
#define POTS_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1
#endif
#define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1
#define BLUETOOTH_ROWS 1,
#define SWITCH_TYPE_MAX(sw) ((MIXSRC_SF-MIXSRC_FIRST_SWITCH == sw || MIXSRC_SH-MIXSRC_FIRST_SWITCH == sw) ? SWITCH_2POS : SWITCH_3POS)
bool menuRadioHardware(event_t event)
{
MENU(STR_HARDWARE, RADIO_ICONS, menuTabGeneral, MENU_RADIO_HARDWARE, ITEM_RADIO_HARDWARE_MAX, { 0, LABEL(Sticks), 0, 0, 0, 0, LABEL(Pots), POTS_ROWS, LABEL(Switches), SWITCHES_ROWS, BLUETOOTH_ROWS 0 });
MENU(STR_HARDWARE, RADIO_ICONS, menuTabGeneral, MENU_RADIO_HARDWARE, ITEM_RADIO_HARDWARE_MAX, { 0, LABEL(Sticks), 0, 0, 0, 0, LABEL(Pots), POTS_ROWS, LABEL(Switches), SWITCHES_ROWS, BLUETOOTH_ROWS 0, 0, 0 });
uint8_t sub = menuVerticalPosition;
@ -93,8 +99,10 @@ bool menuRadioHardware(event_t event)
case ITEM_RADIO_HARDWARE_LS:
case ITEM_RADIO_HARDWARE_RS:
#if defined(PCBX12S)
case ITEM_RADIO_HARDWARE_LS2:
case ITEM_RADIO_HARDWARE_RS2:
#endif
{
int idx = k - ITEM_RADIO_HARDWARE_LS;
uint8_t mask = (0x01 << idx);

View file

@ -48,13 +48,21 @@ bool menuAboutView(event_t event)
screenIndex = 0;
greyIndex = 0;
break;
#if defined(PCBX12S)
case EVT_KEY_FIRST(KEY_PGDN):
#elif defined(PCBX10)
case EVT_KEY_BREAK(KEY_PGDN):
#endif
screenIndex < ABOUT_PARENTS ? screenIndex++ : screenIndex = ABOUT_OPENTX;
greyIndex = 0;
break;
case EVT_KEY_FIRST(KEY_PGUP):
#if defined(PCBX10)
case EVT_KEY_LONG(KEY_PGDN):
#endif
screenIndex > ABOUT_OPENTX ? screenIndex-- : screenIndex = ABOUT_PARENTS;
greyIndex = 0;
killEvents(event);
break;
case EVT_KEY_FIRST(KEY_EXIT):
chainMenu(menuMainView);

View file

@ -35,13 +35,13 @@ Topbar * topbar;
void drawMainPots()
{
// The 3 pots
drawHorizontalSlider(TRIM_LH_X, POTS_LINE_Y, 160, calibratedStick[4], -RESX, RESX, 40, OPTION_SLIDER_TICKS | OPTION_SLIDER_BIG_TICKS | OPTION_SLIDER_SQUARE_BUTTON);
drawHorizontalSlider(TRIM_LH_X, POTS_LINE_Y, 160, calibratedAnalogs[CALIBRATED_POT1], -RESX, RESX, 40, OPTION_SLIDER_TICKS | OPTION_SLIDER_BIG_TICKS | OPTION_SLIDER_SQUARE_BUTTON);
drawHorizontalSlider(LCD_W/2-20, POTS_LINE_Y, XPOTS_MULTIPOS_COUNT*5, 1 + (potsPos[1] & 0x0f), 1, XPOTS_MULTIPOS_COUNT + 1, XPOTS_MULTIPOS_COUNT, OPTION_SLIDER_TICKS | OPTION_SLIDER_BIG_TICKS | OPTION_SLIDER_NUMBER_BUTTON);
drawHorizontalSlider(TRIM_RH_X, POTS_LINE_Y, 160, calibratedStick[6], -RESX, RESX, 40, OPTION_SLIDER_TICKS | OPTION_SLIDER_BIG_TICKS | OPTION_SLIDER_SQUARE_BUTTON);
drawHorizontalSlider(TRIM_RH_X, POTS_LINE_Y, 160, calibratedAnalogs[CALIBRATED_POT3], -RESX, RESX, 40, OPTION_SLIDER_TICKS | OPTION_SLIDER_BIG_TICKS | OPTION_SLIDER_SQUARE_BUTTON);
// The 2 rear sliders
drawVerticalSlider(6, TRIM_V_Y, 160, calibratedStick[9], -RESX, RESX, 40, OPTION_SLIDER_TICKS | OPTION_SLIDER_BIG_TICKS | OPTION_SLIDER_SQUARE_BUTTON);
drawVerticalSlider(LCD_W-18, TRIM_V_Y, 160, calibratedStick[10], -RESX, RESX, 40, OPTION_SLIDER_TICKS | OPTION_SLIDER_BIG_TICKS | OPTION_SLIDER_SQUARE_BUTTON);
drawVerticalSlider(6, TRIM_V_Y, 160, calibratedAnalogs[CALIBRATED_SLIDER_REAR_LEFT], -RESX, RESX, 40, OPTION_SLIDER_TICKS | OPTION_SLIDER_BIG_TICKS | OPTION_SLIDER_SQUARE_BUTTON);
drawVerticalSlider(LCD_W-18, TRIM_V_Y, 160, calibratedAnalogs[CALIBRATED_SLIDER_REAR_RIGHT], -RESX, RESX, 40, OPTION_SLIDER_TICKS | OPTION_SLIDER_BIG_TICKS | OPTION_SLIDER_SQUARE_BUTTON);
}
void drawTrims(uint8_t flightMode)
@ -175,12 +175,19 @@ bool menuMainView(event_t event)
pushMenu(menuTabScreensSetup[1]);
return false;
#if defined(PCBX12S)
case EVT_KEY_FIRST(KEY_PGDN):
#elif defined(PCBX10)
case EVT_KEY_BREAK(KEY_PGDN):
#endif
storageDirty(EE_GENERAL);
g_model.view = circularIncDec(g_model.view, +1, 0, getMainViewsCount()-1);
break;
case EVT_KEY_FIRST(KEY_PGUP):
#if defined(PCBX10)
case EVT_KEY_LONG(KEY_PGDN):
#endif
killEvents(event);
storageDirty(EE_GENERAL);
g_model.view = circularIncDec(g_model.view, -1, 0, getMainViewsCount()-1);

View file

@ -150,7 +150,7 @@ bool menuStatsAnalogs(event_t event)
{
MENU("Analogs", STATS_ICONS, menuTabStats, e_StatsAnalogs, 0, { 0 });
for (uint8_t i=0; i<NUMBER_ANALOG; i++) {
for (uint8_t i=0; i<NUM_ANALOGS; i++) {
coord_t y = MENU_CONTENT_TOP + (i/2)*FH;
coord_t x = MENUS_MARGIN_LEFT + (i & 1 ? LCD_W/2 : 0);
lcdDrawNumber(x, y, i+1, LEADING0|LEFT, 2, NULL, ":");
@ -158,12 +158,12 @@ bool menuStatsAnalogs(event_t event)
#if defined(JITTER_MEASURE)
lcdDrawNumber(x+100, y, rawJitter[i].get());
lcdDrawNumber(x+140, y, avgJitter[i].get());
lcdDrawNumber(x+180, y, (int16_t)calibratedStick[CONVERT_MODE(i)]*250/256, PREC1);
lcdDrawNumber(x+180, y, (int16_t)calibratedAnalogs[CONVERT_MODE(i)]*250/256, PREC1);
#else
if (i < NUM_STICKS+NUM_POTS+NUM_SLIDERS)
lcdDrawNumber(x+100, y, (int16_t)calibratedStick[CONVERT_MODE(i)]*25/256);
lcdDrawNumber(x+100, y, (int16_t)calibratedAnalogs[CONVERT_MODE(i)]*25/256);
else if (i >= MOUSE1)
lcdDrawNumber(x+100, y, (int16_t)calibratedStick[NUM_STICKS+NUM_POTS+NUM_SLIDERS+i-MOUSE1]*25/256);
lcdDrawNumber(x+100, y, (int16_t)calibratedAnalogs[CALIBRATED_MOUSE1+i-MOUSE1]*25/256);
#endif
}

View file

@ -60,7 +60,7 @@ if(ARCH STREQUAL ARM)
)
endif()
if(PCB STREQUAL FLAMENCO OR PCB STREQUAL HORUS)
if(PCB STREQUAL FLAMENCO OR PCB STREQUAL X12S OR PCB STREQUAL X10)
if(HELI)
set(HELI_SRC gui/common/colorlcd/model_heli.cpp)
endif()

View file

@ -148,6 +148,11 @@ bool isSourceAvailable(int source)
return IS_POT_SLIDER_AVAILABLE(POT1+source-MIXSRC_FIRST_POT);
}
#if defined(PCBX10)
if ((source>=MIXSRC_S3 && source<=MIXSRC_S4) || (source>=MIXSRC_MOUSE1 && source<=MIXSRC_MOUSE2))
return false;
#endif
if (source>=MIXSRC_FIRST_SWITCH && source<=MIXSRC_LAST_SWITCH) {
return SWITCH_EXISTS(source-MIXSRC_FIRST_SWITCH);
}

View file

@ -339,7 +339,7 @@ void logsWrite()
#endif
for (uint8_t i=0; i<NUM_STICKS+NUM_POTS+NUM_SLIDERS; i++) {
f_printf(&g_oLogFile, "%d,", calibratedStick[i]);
f_printf(&g_oLogFile, "%d,", calibratedAnalogs[i]);
}
#if defined(PCBFLAMENCO)

View file

@ -46,4 +46,5 @@ set(LUA_INCLUDES_STM32F4
add_lua_export_target(x7 ${LUA_INCLUDES_STM32F2} -DPCBTARANIS -DPCBX7)
add_lua_export_target(x9d ${LUA_INCLUDES_STM32F2} -DPCBTARANIS -DPCBX9D)
add_lua_export_target(x9e ${LUA_INCLUDES_STM32F4} -DPCBTARANIS -DPCBX9E -DSTM32F40_41xxx)
add_lua_export_target(horus ${LUA_INCLUDES_STM32F4} -DPCBHORUS -DSTM32F40_41xxx)
add_lua_export_target(x10 ${LUA_INCLUDES_STM32F4} -DPCBHORUS -DPCBX10 -DSTM32F40_41xxx)
add_lua_export_target(x12s ${LUA_INCLUDES_STM32F4} -DPCBHORUS -DPCBX12S -DSTM32F40_41xxx)

View file

@ -25,8 +25,10 @@
#include "lua/lua_api.h"
#include "telemetry/frsky.h"
#if defined(PCBHORUS)
#include "lua/lua_exports_horus.inc" // this line must be after lua headers
#if defined(PCBX12S)
#include "lua/lua_exports_x12s.inc" // this line must be after lua headers
#elif defined(PCBX10)
#include "lua/lua_exports_x10.inc"
#elif defined(PCBFLAMENCO)
#include "lua/lua_exports_flamenco.inc"
#elif defined(PCBX9E)

View file

@ -463,7 +463,7 @@ void perMain()
toplcdRefreshEnd();
#endif
#if (defined(PCBX9E) || defined(PCBHORUS)) && !defined(SIMU)
#if defined(BLUETOOTH) && !defined(SIMU)
bluetoothWakeup();
#endif

View file

@ -41,7 +41,7 @@ uint8_t mixWarning;
uint8_t startupWarningState;
#endif
int16_t calibratedStick[NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_MOUSE_ANALOGS];
int16_t calibratedAnalogs[NUM_CALIBRATED_ANALOGS];
int16_t channelOutputs[MAX_OUTPUT_CHANNELS] = {0};
int16_t ex_chans[MAX_OUTPUT_CHANNELS] = {0}; // Outputs (before LIMITS) of the last perMain;
@ -254,11 +254,11 @@ getvalue_t getValue(mixsrc_t i)
#if defined(LUA_INPUTS)
else if (i <= MIXSRC_LAST_POT+NUM_MOUSE_ANALOGS) {
return calibratedStick[i-MIXSRC_Rud];
return calibratedAnalogs[i-MIXSRC_Rud];
}
#else
else if (i>=MIXSRC_FIRST_STICK && i<=MIXSRC_LAST_POT+NUM_MOUSE_ANALOGS) {
return calibratedStick[i-MIXSRC_Rud];
return calibratedAnalogs[i-MIXSRC_Rud];
}
#endif
@ -414,7 +414,7 @@ void evalInputs(uint8_t mode)
#if defined(HELI) && !defined(VIRTUAL_INPUTS)
uint16_t d = 0;
if (g_model.swashR.value) {
uint32_t v = (int32_t(calibratedStick[ELE_STICK])*calibratedStick[ELE_STICK] + int32_t(calibratedStick[AIL_STICK])*calibratedStick[AIL_STICK]);
uint32_t v = (int32_t(calibratedAnalogs[ELE_STICK])*calibratedAnalogs[ELE_STICK] + int32_t(calibratedAnalogs[AIL_STICK])*calibratedAnalogs[AIL_STICK]);
uint32_t q = calc100toRESX(g_model.swashR.value);
q *= q;
if (v > q) {
@ -455,7 +455,7 @@ void evalInputs(uint8_t mode)
BeepANACenter mask = (BeepANACenter)1 << ch;
calibratedStick[ch] = v; // for show in expo
calibratedAnalogs[ch] = v; // for show in expo
// filtering for center beep
uint8_t tmp = (uint16_t)abs(v) / 16;
@ -503,7 +503,7 @@ void evalInputs(uint8_t mode)
}
#if defined(VIRTUAL_INPUTS)
calibratedStick[ch] = v;
calibratedAnalogs[ch] = v;
#else
#if defined(HELI)
if (d && (ch==ELE_STICK || ch==AIL_STICK)) {
@ -533,7 +533,7 @@ void evalInputs(uint8_t mode)
v = v * (int32_t) RESX / (max((int16_t) 100, (v > 0 ? calib->spanPos : calib->spanNeg)));
if (v < -RESX) v = -RESX;
if (v > RESX) v = RESX;
calibratedStick[ch] = v;
calibratedAnalogs[ch] = v;
}
#endif

View file

@ -520,7 +520,7 @@ int8_t getMovedSource(GET_MOVED_SOURCE_PARAMS)
static int16_t sourcesStates[NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_MOUSE_ANALOGS];
if (result == 0) {
for (uint8_t i=0; i<NUM_STICKS+NUM_POTS+NUM_SLIDERS; i++) {
if (abs(calibratedStick[i] - sourcesStates[i]) > 512) {
if (abs(calibratedAnalogs[i] - sourcesStates[i]) > 512) {
result = MIXSRC_Rud+i;
break;
}
@ -536,7 +536,7 @@ int8_t getMovedSource(GET_MOVED_SOURCE_PARAMS)
#if defined(VIRTUAL_INPUTS)
memcpy(inputsStates, anas, sizeof(inputsStates));
#endif
memcpy(sourcesStates, calibratedStick, sizeof(sourcesStates));
memcpy(sourcesStates, calibratedAnalogs, sizeof(sourcesStates));
}
s_move_last_time = get_tmr10ms();
@ -1116,15 +1116,15 @@ void checkTHR()
// no other information available at the moment, and good enough to my option (otherwise too much exceptions...)
#if defined(MODULE_ALWAYS_SEND_PULSES)
int16_t v = calibratedStick[thrchn];
int16_t v = calibratedAnalogs[thrchn];
if (v<=THRCHK_DEADBAND-1024 || g_model.disableThrottleWarning || pwrCheck()==e_power_off || keyDown()) {
startupWarningState = STARTUP_WARNING_THROTTLE+1;
}
else {
calibratedStick[thrchn] = -1024;
calibratedAnalogs[thrchn] = -1024;
#if !defined(VIRTUAL_INPUTS)
if (thrchn < NUM_STICKS) {
rawAnas[thrchn] = anas[thrchn] = calibratedStick[thrchn];
rawAnas[thrchn] = anas[thrchn] = calibratedAnalogs[thrchn];
}
#endif
RAISE_ALERT(STR_THROTTLEWARN, STR_THROTTLENOTIDLE, STR_PRESSANYKEYTOSKIP, AU_THROTTLE_ALERT);
@ -1138,7 +1138,7 @@ void checkTHR()
evalInputs(e_perout_mode_notrainer); // let do evalInputs do the job
int16_t v = calibratedStick[thrchn];
int16_t v = calibratedAnalogs[thrchn];
if (v <= THRCHK_DEADBAND-1024) {
return; // prevent warning if throttle input OK
}
@ -1157,7 +1157,7 @@ void checkTHR()
evalInputs(e_perout_mode_notrainer); // let do evalInputs do the job
v = calibratedStick[thrchn];
v = calibratedAnalogs[thrchn];
#if defined(PWR_BUTTON_DELAY)
uint32_t pwr_check = pwrCheck();
@ -1371,7 +1371,7 @@ uint8_t checkTrim(event_t event)
}
#if !defined(SIMU)
uint16_t s_anaFilt[NUMBER_ANALOG];
uint16_t s_anaFilt[NUM_ANALOGS];
#endif
#if defined(SIMU)
@ -1387,8 +1387,8 @@ uint16_t BandGap;
#endif
#if defined(JITTER_MEASURE)
JitterMeter<uint16_t> rawJitter[NUMBER_ANALOG];
JitterMeter<uint16_t> avgJitter[NUMBER_ANALOG];
JitterMeter<uint16_t> rawJitter[NUM_ANALOGS];
JitterMeter<uint16_t> avgJitter[NUM_ANALOGS];
tmr10ms_t jitterResetTime = 0;
#endif
@ -1440,7 +1440,7 @@ void getADC()
#if defined(JITTER_MEASURE)
if (JITTER_MEASURE_ACTIVE() && jitterResetTime < get_tmr10ms()) {
// reset jitter measurement every second
for (uint32_t x=0; x<NUMBER_ANALOG; x++) {
for (uint32_t x=0; x<NUM_ANALOGS; x++) {
rawJitter[x].reset();
avgJitter[x].reset();
}
@ -1452,7 +1452,7 @@ void getADC()
adcRead();
DEBUG_TIMER_STOP(debugTimerAdcRead);
for (uint8_t x=0; x<NUMBER_ANALOG; x++) {
for (uint8_t x=0; x<NUM_ANALOGS; x++) {
uint16_t v = getAnalogValue(x) >> (1 - ANALOG_SCALE);
#if defined(VIRTUAL_INPUTS)
@ -1706,9 +1706,9 @@ void doMixerCalculations()
}
else {
#if defined(VIRTUAL_INPUTS)
val = RESX + calibratedStick[g_model.thrTraceSrc == 0 ? THR_STICK : g_model.thrTraceSrc+NUM_STICKS-1];
val = RESX + calibratedAnalogs[g_model.thrTraceSrc == 0 ? THR_STICK : g_model.thrTraceSrc+NUM_STICKS-1];
#else
val = RESX + (g_model.thrTraceSrc == 0 ? rawAnas[THR_STICK] : calibratedStick[g_model.thrTraceSrc+NUM_STICKS-1]);
val = RESX + (g_model.thrTraceSrc == 0 ? rawAnas[THR_STICK] : calibratedAnalogs[g_model.thrTraceSrc+NUM_STICKS-1]);
#endif
}
@ -1822,7 +1822,7 @@ uint8_t calcStickScroll( uint8_t index )
if ( ( g_eeGeneral.stickMode & 1 ) == 0 )
index ^= 3;
value = calibratedStick[index] / 128;
value = calibratedAnalogs[index] / 128;
direction = value > 0 ? 0x80 : 0;
if (value < 0)
value = -value; // (abs)
@ -2522,7 +2522,7 @@ void opentxInit(OPENTX_INIT_ARGS)
setSticksGain(g_eeGeneral.sticksGain);
#endif
#if defined(BLUETOOTH)
#if defined(PCBSKY9X) && defined(BLUETOOTH)
btInit();
#endif
@ -2531,7 +2531,10 @@ void opentxInit(OPENTX_INIT_ARGS)
loadFontCache();
#endif
if (g_eeGeneral.backlightMode != e_backlight_mode_off) backlightOn(); // on Tx start turn the light on
if (g_eeGeneral.backlightMode != e_backlight_mode_off) {
// on Tx start turn the light on
backlightOn();
}
if (!unexpectedShutdown) {
opentxStart();

View file

@ -1065,7 +1065,8 @@ int16_t applyLimits(uint8_t channel, int32_t value);
void evalInputs(uint8_t mode);
uint16_t anaIn(uint8_t chan);
extern int16_t calibratedStick[NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_MOUSE_ANALOGS];
extern int16_t calibratedAnalogs[NUM_CALIBRATED_ANALOGS];
#define FLASH_DURATION 20 /*200ms*/
@ -1667,12 +1668,12 @@ extern Clipboard clipboard;
#endif
#if !defined(SIMU)
extern uint16_t s_anaFilt[NUMBER_ANALOG];
extern uint16_t s_anaFilt[NUM_ANALOGS];
#endif
#if defined(JITTER_MEASURE)
extern JitterMeter<uint16_t> rawJitter[NUMBER_ANALOG];
extern JitterMeter<uint16_t> avgJitter[NUMBER_ANALOG];
extern JitterMeter<uint16_t> rawJitter[NUM_ANALOGS];
extern JitterMeter<uint16_t> avgJitter[NUM_ANALOGS];
#if defined(PCBHORUS)
#define JITTER_MEASURE_ACTIVE() (menuHandlers[menuLevel] == menuStatsAnalogs)
#elif defined(PCBTARANIS)

View file

@ -18,42 +18,18 @@
* GNU General Public License for more details.
*/
/**
* \file syscalls.c
*
* Implementation of newlib syscall.
*
*/
/*----------------------------------------------------------------------------
* Headers
*----------------------------------------------------------------------------*/
// #include "board.h"
#include <stdio.h>
#include <stdarg.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include "debug.h"
/*----------------------------------------------------------------------------
* Exported variables
*----------------------------------------------------------------------------*/
#undef errno
extern int errno;
extern int _end;
extern int _heap_end;
/*----------------------------------------------------------------------------
* Exported functions
*----------------------------------------------------------------------------*/
// extern void _exit( int status ) ;
// extern void _kill( int pid, int sig ) ;
// extern int _getpid ( void ) ;
unsigned char * heap = (unsigned char *)&_end;
extern caddr_t _sbrk(int nbytes)
@ -69,6 +45,7 @@ extern caddr_t _sbrk(int nbytes)
}
}
#if !defined(SEMIHOSTING)
extern int _gettimeofday(void *p1, void *p2)
{
return 0;
@ -135,4 +112,5 @@ extern int _getpid()
{
return -1 ;
}
#endif

View file

@ -109,9 +109,7 @@ set(TARGET_SRC
${TARGET_SRC}
pulses_driver.cpp
keys_driver.cpp
adc_driver.cpp
trainer_driver.cpp
audio_driver.cpp
telemetry_driver.cpp
)
set(FIRMWARE_SRC

View file

@ -0,0 +1,206 @@
/*
* Copyright (C) OpenTX
*
* Based on code named
* th9x - http://code.google.com/p/th9x
* er9x - http://code.google.com/p/er9x
* gruvin9x - http://code.google.com/p/gruvin9x
*
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include "opentx.h"
#if defined(SIMU)
// not needed
#elif defined(PCBX10)
const int8_t ana_direction[NUM_ANALOGS] = {1,-1,1,-1, -1,-1,-1, -1,1,1,1, -1};
#elif defined(PCBX9E) && defined(HORUS_STICKS)
const int8_t ana_direction[NUM_ANALOGS] = {1,-1,1,-1, -1,-1,-1,1, -1,1,1,1, -1};
#elif defined(PCBX9E)
const int8_t ana_direction[NUM_ANALOGS] = {1,1,-1,-1, -1,-1,-1,1, -1,1,1,1, -1};
const uint8_t ana_mapping[NUM_ANALOGS] = { 0 /*STICK1*/, 1 /*STICK2*/, 2 /*STICK3*/, 3 /*STICK4*/,
10 /*POT1*/, 4 /*POT2*/, 5 /*POT3*/, 6 /*POT4*/,
11 /*SLIDER1*/, 12 /*SLIDER2*/, 7 /*SLIDER3*/, 8 /*SLIDER4*/,
9 /*TX_VOLTAGE*/ };
#elif defined(PCBX9DP)
const int8_t ana_direction[NUM_ANALOGS] = {1,-1,1,-1, -1,1,-1, -1,1, 1};
#elif defined(PCBX7)
const int8_t ana_direction[NUM_ANALOGS] = {-1,1,-1,1, 1,1, 1};
#elif defined(REV4a)
const int8_t ana_direction[NUM_ANALOGS] = {1,-1,1,-1, -1,-1,0, -1,1, 1};
#else
const int8_t ana_direction[NUM_ANALOGS] = {1,-1,1,-1, -1,1,0, -1,1, 1};
#endif
#if defined(PCBX9E)
#define NUM_ANALOGS_ADC 10
#define NUM_ANALOGS_ADC_EXT (NUM_ANALOGS - 10)
#else
#define NUM_ANALOGS_ADC NUM_ANALOGS
#endif
uint16_t adcValues[NUM_ANALOGS] __DMA;
void adcInit()
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
#if defined(ADC_GPIOA_PINS)
GPIO_InitStructure.GPIO_Pin = ADC_GPIOA_PINS;
GPIO_Init(GPIOA, &GPIO_InitStructure);
#endif
#if defined(ADC_GPIOB_PINS)
GPIO_InitStructure.GPIO_Pin = ADC_GPIOB_PINS;
GPIO_Init(GPIOB, &GPIO_InitStructure);
#endif
#if defined(ADC_GPIOC_PINS)
GPIO_InitStructure.GPIO_Pin = ADC_GPIOC_PINS;
GPIO_Init(GPIOC, &GPIO_InitStructure);
#endif
#if defined(ADC_GPIOF_PINS)
GPIO_InitStructure.GPIO_Pin = ADC_GPIOF_PINS;
GPIO_Init(GPIOF, &GPIO_InitStructure);
#endif
ADC_MAIN->CR1 = ADC_CR1_SCAN;
ADC_MAIN->CR2 = ADC_CR2_ADON | ADC_CR2_DMA | ADC_CR2_DDS;
ADC_MAIN->SQR1 = (NUM_ANALOGS_ADC-1) << 20; // bits 23:20 = number of conversions
#if defined(PCBX10)
ADC_MAIN->SQR2 = (ADC_CHANNEL_POT3<<0) + (ADC_CHANNEL_SLIDER1<<5) + (ADC_CHANNEL_SLIDER2<<10) + (ADC_CHANNEL_BATT<<15) + (ADC_CHANNEL_EXT1<<20) + (ADC_CHANNEL_EXT2<<25); // conversions 7 and more
ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH<<0) + (ADC_CHANNEL_STICK_LV<<5) + (ADC_CHANNEL_STICK_RV<<10) + (ADC_CHANNEL_STICK_RH<<15) + (ADC_CHANNEL_POT1<<20) + (ADC_CHANNEL_POT2<<25); // conversions 1 to 6
#elif defined(PCBX9E)
ADC_MAIN->SQR2 = (ADC_CHANNEL_POT4<<0) + (ADC_CHANNEL_SLIDER3<<5) + (ADC_CHANNEL_SLIDER4<<10) + (ADC_CHANNEL_BATT<<15); // conversions 7 and more
ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH<<0) + (ADC_CHANNEL_STICK_LV<<5) + (ADC_CHANNEL_STICK_RV<<10) + (ADC_CHANNEL_STICK_RH<<15) + (ADC_CHANNEL_POT2<<20) + (ADC_CHANNEL_POT3<<25); // conversions 1 to 6
#elif defined(PCBX7)
ADC_MAIN->SQR2 = (ADC_CHANNEL_BATT<<0); // conversions 7 and more
ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH<<0) + (ADC_CHANNEL_STICK_LV<<5) + (ADC_CHANNEL_STICK_RV<<10) + (ADC_CHANNEL_STICK_RH<<15) + (ADC_CHANNEL_POT1<<25) + (ADC_CHANNEL_POT2<<20); // conversions 1 to 6
#else
ADC_MAIN->SQR2 = (ADC_CHANNEL_POT3<<0) + (ADC_CHANNEL_SLIDER1<<5) + (ADC_CHANNEL_SLIDER2<<10) + (ADC_CHANNEL_BATT<<15); // conversions 7 and more
ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH<<0) + (ADC_CHANNEL_STICK_LV<<5) + (ADC_CHANNEL_STICK_RV<<10) + (ADC_CHANNEL_STICK_RH<<15) + (ADC_CHANNEL_POT1<<20) + (ADC_CHANNEL_POT2<<25); // conversions 1 to 6
#endif
ADC_MAIN->SMPR1 = ADC_SAMPTIME + (ADC_SAMPTIME<<3) + (ADC_SAMPTIME<<6) + (ADC_SAMPTIME<<9) + (ADC_SAMPTIME<<12) + (ADC_SAMPTIME<<15) + (ADC_SAMPTIME<<18) + (ADC_SAMPTIME<<21) + (ADC_SAMPTIME<<24);
ADC_MAIN->SMPR2 = ADC_SAMPTIME + (ADC_SAMPTIME<<3) + (ADC_SAMPTIME<<6) + (ADC_SAMPTIME<<9) + (ADC_SAMPTIME<<12) + (ADC_SAMPTIME<<15) + (ADC_SAMPTIME<<18) + (ADC_SAMPTIME<<21) + (ADC_SAMPTIME<<24) + (ADC_SAMPTIME<<27);
ADC->CCR = 0;
ADC_DMA_Stream->CR = DMA_SxCR_PL | ADC_DMA_SxCR_CHSEL | DMA_SxCR_MSIZE_0 | DMA_SxCR_PSIZE_0 | DMA_SxCR_MINC;
ADC_DMA_Stream->PAR = CONVERT_PTR_UINT(&ADC_MAIN->DR);
ADC_DMA_Stream->M0AR = CONVERT_PTR_UINT(adcValues);
ADC_DMA_Stream->NDTR = NUM_ANALOGS_ADC;
ADC_DMA_Stream->FCR = DMA_SxFCR_DMDIS | DMA_SxFCR_FTH_0;
#if defined(PCBX9E)
ADC_EXT->CR1 = ADC_CR1_SCAN;
ADC_EXT->CR2 = ADC_CR2_ADON | ADC_CR2_DMA | ADC_CR2_DDS;
ADC_EXT->SQR1 = (NUM_ANALOGS_ADC_EXT-1) << 20;
ADC_EXT->SQR2 = 0;
ADC_EXT->SQR3 = (ADC_CHANNEL_POT1<<0) + (ADC_CHANNEL_SLIDER1<<5) + (ADC_CHANNEL_SLIDER2<<10); // conversions 1 to 3
ADC_EXT->SMPR1 = 0;
ADC_EXT->SMPR2 = (ADC_EXT_SAMPTIME<<(3*ADC_CHANNEL_POT1)) + (ADC_EXT_SAMPTIME<<(3*ADC_CHANNEL_SLIDER1)) + (ADC_EXT_SAMPTIME<<(3*ADC_CHANNEL_SLIDER2));
ADC_EXT_DMA_Stream->CR = DMA_SxCR_PL | DMA_SxCR_CHSEL_1 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PSIZE_0 | DMA_SxCR_MINC;
ADC_EXT_DMA_Stream->PAR = CONVERT_PTR_UINT(&ADC_EXT->DR);
ADC_EXT_DMA_Stream->M0AR = CONVERT_PTR_UINT(adcValues + NUM_ANALOGS_ADC);
ADC_EXT_DMA_Stream->NDTR = NUM_ANALOGS_ADC_EXT;
ADC_EXT_DMA_Stream->FCR = DMA_SxFCR_DMDIS | DMA_SxFCR_FTH_0;
#endif
}
void adcSingleRead()
{
ADC_DMA_Stream->CR &= ~DMA_SxCR_EN; // Disable DMA
ADC_MAIN->SR &= ~(uint32_t)(ADC_SR_EOC | ADC_SR_STRT | ADC_SR_OVR);
ADC_SET_DMA_FLAGS();
ADC_DMA_Stream->CR |= DMA_SxCR_EN; // Enable DMA
ADC_MAIN->CR2 |= (uint32_t) ADC_CR2_SWSTART;
#if defined(PCBX9E)
ADC_EXT_DMA_Stream->CR &= ~DMA_SxCR_EN; // Disable DMA
ADC_EXT->SR &= ~(uint32_t) ( ADC_SR_EOC | ADC_SR_STRT | ADC_SR_OVR );
ADC_EXT_SET_DMA_FLAGS();
ADC_EXT_DMA_Stream->CR |= DMA_SxCR_EN; // Enable DMA
ADC_EXT->CR2 |= (uint32_t)ADC_CR2_SWSTART;
#endif
#if defined(PCBX9E)
for (unsigned int i=0; i<10000; i++) {
if (ADC_TRANSFER_COMPLETE() && ADC_EXT_TRANSFER_COMPLETE()) {
break;
}
}
ADC_DMA_Stream->CR &= ~DMA_SxCR_EN; // Disable DMA
ADC_EXT_DMA_Stream->CR &= ~DMA_SxCR_EN; // Disable DMA
#else
for (unsigned int i = 0; i < 10000; i++) {
if (ADC_TRANSFER_COMPLETE()) {
break;
}
}
ADC_DMA_Stream->CR &= ~DMA_SxCR_EN; // Disable DMA
#endif
}
void adcRead()
{
uint16_t temp[NUM_ANALOGS] = { 0 };
for (int i=0; i<4; i++) {
adcSingleRead();
for (uint8_t x=0; x<NUM_ANALOGS; x++) {
uint16_t val = adcValues[x];
#if defined(JITTER_MEASURE)
if (JITTER_MEASURE_ACTIVE()) {
rawJitter[x].measure(val);
}
#endif
temp[x] += val;
}
}
for (uint8_t x=0; x<NUM_ANALOGS; x++) {
adcValues[x] = temp[x] >> 2;
}
}
// TODO
void adcStop()
{
}
#if !defined(SIMU)
uint16_t getAnalogValue(uint8_t index)
{
if (IS_POT(index) && !IS_POT_SLIDER_AVAILABLE(index)) {
// Use fixed analog value for non-existing and/or non-connected pots.
// Non-connected analog inputs will slightly follow the adjacent connected analog inputs,
// which produces ghost readings on these inputs.
return 0;
}
#if defined(PCBX9E)
index = ana_mapping[index];
#endif
if (ana_direction[index] < 0)
return 4095 - adcValues[index];
else
return adcValues[index];
}
#endif // #if !defined(SIMU)

View file

@ -92,7 +92,6 @@ void audioConsumeCurrentBuffer()
DAC->CR |= DAC_CR_EN1 | DAC_CR_DMAEN1 ; // Enable DAC
}
}
}
void dacStart()
@ -128,7 +127,7 @@ extern "C" void AUDIO_TIM_IRQHandler()
{
DEBUG_INTERRUPT(INT_AUDIO);
DAC->CR &= ~DAC_CR_DMAEN1 ; // Stop DMA requests
#if !defined(PCBX9E)
#if defined(STM32F2)
DAC->CR &= ~DAC_CR_DMAUDRIE1 ; // Stop underrun interrupt
#endif
DAC->SR = DAC_SR_DMAUDR1 ; // Write 1 to clear flag

View file

@ -22,12 +22,14 @@
#define NUM_POTS 3
#define NUM_SLIDERS 0
#define NUM_XPOTS 0
enum Analogs {
STICK1,
STICK2,
STICK3,
STICK4,
POT1,
POT_FIRST,
POT1 = POT_FIRST,
POT2,
POT3,
POT_LAST = POT3,
@ -41,8 +43,22 @@ enum Analogs {
X14051,
#endif
TX_VOLTAGE,
NUMBER_ANALOG
NUM_ANALOGS
};
enum CalibratedAnalogs {
CALIBRATED_STICK1,
CALIBRATED_STICK2,
CALIBRATED_STICK3,
CALIBRATED_STICK4,
CALIBRATED_POT_FIRST,
CALIBRATED_POT1 = CALIBRATED_POT_FIRST,
CALIBRATED_POT2,
CALIBRATED_POT3,
CALIBRATED_POT_LAST = CALIBRATED_POT3,
NUM_CALIBRATED_ANALOGS
};
void adcInit();
void adcPrepareBandgap();
void getADC();

View file

@ -1,15 +1,6 @@
set(PCBREV "13" CACHE STRING "PCB Revision")
set(INTERNAL_GPS_BAUDRATE "9600" CACHE STRING "Baud rate for internal GPS")
option(DISK_CACHE "Enable SD card disk cache" YES)
if(${PCBREV} GREATER 10)
option(INTERNAL_GPS "Internal GPS installed" YES)
else()
option(INTERNAL_GPS "Internal GPS installed" NO)
if(NOT INTERNAL_GPS)
message("Horus: Internal GPS is optional, use INTERNAL_GPS=YES option to enable it")
endif()
endif()
option(BLUETOOTH_CLI_PASSTHROUGH "Enable direct communicaton with Bluetooth module from CLI" NO)
option(PWR_BUTTON_DISABLED "Disable the Power Button (for debugging with JTAG)" NO)
set(CPU_TYPE STM32F4)
set(HSE_VALUE 12000000)
@ -19,9 +10,6 @@ set(HAPTIC YES)
set(GUI_DIR 480x272)
set(TARGET_DIR horus)
set(LINKER_SCRIPT targets/horus/stm32f4_flash.ld)
set(FIRMWARE_DEPENDENCIES ${FIRMWARE_DEPENDENCIES} horus_bitmaps)
set(LUA_EXPORT lua_export_horus)
set(FLAVOUR horus)
set(RAMBACKUP YES)
set(LUA YES)
set(PPM_LIMITS_SYMETRICAL YES)
@ -33,7 +21,46 @@ if(SPLASH STREQUAL OFF)
message(FATAL_ERROR "Option SPLASH=OFF not supported on Horus")
endif()
add_definitions(-DPCBHORUS -DPCBREV=${PCBREV} -DSTM32F429_439xx -DSDRAM -DCOLORLCD -DPPM_PIN_UART -DPPM_PIN_TIMER)
if(PWR_BUTTON_DISABLED)
add_definitions(-DPWR_BUTTON_DISABLED)
endif()
if (PCB STREQUAL X10)
set(FLAVOUR x10)
add_definitions(-DPCBX10)
add_definitions(-DSOFTWARE_VOLUME)
set(TARGET_SRC
${TARGET_SRC}
../common/arm/stm32/audio_dac_driver.cpp
../common/arm/stm32/adc_driver.cpp
)
set(FIRMWARE_DEPENDENCIES ${FIRMWARE_DEPENDENCIES} x10_bitmaps)
set(LUA_EXPORT lua_export_x10)
elseif (PCB STREQUAL X12S)
set(FLAVOUR x12s)
set(PCBREV "13" CACHE STRING "PCB Revision")
if(${PCBREV} GREATER 10)
option(INTERNAL_GPS "Internal GPS installed" YES)
else()
option(INTERNAL_GPS "Internal GPS installed" NO)
if(NOT INTERNAL_GPS)
message("Horus: Internal GPS is optional, use INTERNAL_GPS=YES option to enable it")
endif()
endif()
set(INTERNAL_GPS_BAUDRATE "9600" CACHE STRING "Baud rate for internal GPS")
add_definitions(-DPCBX12S)
set(TARGET_SRC
${TARGET_SRC}
audio_spi_driver.cpp
adc_driver.cpp
gps_driver.cpp
)
set(FIRMWARE_DEPENDENCIES ${FIRMWARE_DEPENDENCIES} x12s_bitmaps)
set(LUA_EXPORT lua_export_x12s)
add_definitions(-DPCBREV=${PCBREV})
endif()
add_definitions(-DPCBHORUS -DSTM32F429_439xx -DSDRAM -DCOLORLCD -DPPM_PIN_UART -DPPM_PIN_TIMER)
add_definitions(-DEEPROM_VARIANT=0 -DAUDIO -DVOICE -DRTCLOCK)
add_definitions(-DGPS_USART_BAUDRATE=${INTERNAL_GPS_BAUDRATE})
@ -81,18 +108,23 @@ set(TARGET_SRC
board.cpp
led_driver.cpp
extmodule_driver.cpp
gps_driver.cpp
)
set(FIRMWARE_TARGET_SRC
${FIRMWARE_TARGET_SRC}
sdio_sd.c
lcd_driver.cpp
backlight_driver.cpp
bluetooth_driver.cpp
pwr_driver.cpp
sdram_driver.c
startup_stm32f40_41xxx.s
)
if(PCB STREQUAL X12S)
set(FIRMWARE_TARGET_SRC
${FIRMWARE_TARGET_SRC}
bluetooth_driver.cpp
)
add_definitions(-DBLUETOOTH)
endif()
if(BLUETOOTH_CLI_PASSTHROUGH)
add_definitions(-DBLUETOOTH_CLI_PASSTHROUGH)
message("Horus: Bluetooth pass-trough enabled")

View file

@ -20,6 +20,8 @@
#include "opentx.h"
uint16_t adcValues[NUM_ANALOGS] __DMA;
#define ADC_CS_HIGH() (ADC_SPI_GPIO->BSRRL = ADC_SPI_PIN_CS)
#define ADC_CS_LOW() (ADC_SPI_GPIO->BSRRH = ADC_SPI_PIN_CS)
@ -40,8 +42,6 @@
#define SAMPTIME 2 // sample time = 28 cycles
uint16_t adcValues[NUMBER_ANALOG] __DMA;
uint16_t SPIx_ReadWriteByte(uint16_t value)
{
while (SPI_I2S_GetFlagStatus(ADC_SPI, SPI_I2S_FLAG_TXE) == RESET);
@ -115,7 +115,7 @@ void adcInit()
ADC3->CR1 = ADC_CR1_SCAN;
ADC3->CR2 = ADC_CR2_ADON | ADC_CR2_DMA | ADC_CR2_DDS;
ADC3->SQR1 = (2-1) << 20; // NUMBER_ANALOG Channels
ADC3->SQR1 = (2-1) << 20;
ADC3->SQR2 = 0;
ADC3->SQR3 = ADC_IN_MOUSE1 + (ADC_IN_MOUSE2<<5);
ADC3->SMPR1 = 0;
@ -212,7 +212,7 @@ bool adcOnChipReadFinished()
void adcRead()
{
uint16_t temp[NUMBER_ANALOG-MOUSE1] = { 0 };
uint16_t temp[NUM_ANALOGS-MOUSE1] = { 0 };
uint8_t noInternalReads = 0;
adcOnChipReadStart();
@ -221,7 +221,7 @@ void adcRead()
for (uint32_t index=0; index<MOUSE1; index++) {
adcValues[index] = adcReadNextSPIChannel(index);
if (noInternalReads < 4 && adcOnChipReadFinished()) {
for (uint8_t x=0; x<NUMBER_ANALOG-MOUSE1; x++) {
for (uint8_t x=0; x<NUM_ANALOGS-MOUSE1; x++) {
uint16_t val = adcValues[MOUSE1+x];
#if defined(JITTER_MEASURE)
if (JITTER_MEASURE_ACTIVE()) {
@ -242,13 +242,13 @@ void adcRead()
}
#endif
for (uint8_t x=0; x<NUMBER_ANALOG-MOUSE1; x++) {
for (uint8_t x=0; x<NUM_ANALOGS-MOUSE1; x++) {
adcValues[MOUSE1+x] = temp[x] >> 2;
}
}
#if !defined(SIMU)
const int8_t ana_direction[NUMBER_ANALOG] = {1,-1,1,-1, -1,1,-1, -1,-1, -1,1, 0,0,0};
const int8_t ana_direction[NUM_ANALOGS] = {1,-1,1,-1, -1,1,-1, -1,-1, -1,1, 0,0,0};
uint16_t getAnalogValue(uint8_t index)
{

View file

@ -24,45 +24,45 @@ void backlightInit()
{
// PIN init
GPIO_InitTypeDef GPIO_InitStructure;
if (IS_HORUS_PROD()) {
GPIO_InitStructure.GPIO_Pin = PROD_BL_GPIO_PIN;
GPIO_InitStructure.GPIO_Pin = BL_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(BL_GPIO, &GPIO_InitStructure);
GPIO_PinAFConfig(BL_GPIO, PROD_BL_GPIO_PinSource, PROD_BL_GPIO_AF);
}
else {
GPIO_InitStructure.GPIO_Pin = BETA_BL_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(BL_GPIO, &GPIO_InitStructure);
GPIO_PinAFConfig(BL_GPIO, BETA_BL_GPIO_PinSource, BETA_BL_GPIO_AF);
}
GPIO_PinAFConfig(BL_GPIO, BL_GPIO_PinSource, BL_GPIO_AF);
// TIMER init
#if defined(PCBX12S)
if (IS_HORUS_PROD()) {
PROD_BL_TIMER->ARR = 100;
PROD_BL_TIMER->PSC = PROD_BL_TIMER_FREQ / 10000 - 1; // 1kHz
PROD_BL_TIMER->CCMR2 = TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2; // PWM
PROD_BL_TIMER->CCER = TIM_CCER_CC4E;
PROD_BL_TIMER->CCR4 = 0;
PROD_BL_TIMER->EGR = 0;
PROD_BL_TIMER->CR1 = TIM_CR1_CEN; // Counter enable
BL_TIMER->ARR = 100;
BL_TIMER->PSC = BL_TIMER_FREQ / 10000 - 1; // 1kHz
BL_TIMER->CCMR2 = TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2; // PWM
BL_TIMER->CCER = TIM_CCER_CC4E;
BL_TIMER->CCR4 = 0;
BL_TIMER->EGR = 0;
BL_TIMER->CR1 = TIM_CR1_CEN; // Counter enable
}
else {
BETA_BL_TIMER->ARR = 100;
BETA_BL_TIMER->PSC = BETA_BL_TIMER_FREQ / 10000 - 1; // 1kHz
BETA_BL_TIMER->CCMR1 = TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2; // PWM
BETA_BL_TIMER->CCER = TIM_CCER_CC1E | TIM_CCER_CC1NE;
BETA_BL_TIMER->CCR1 = 100;
BETA_BL_TIMER->EGR = 1;
BETA_BL_TIMER->CR1 |= TIM_CR1_CEN; // Counter enable
BETA_BL_TIMER->BDTR |= TIM_BDTR_MOE;
BL_TIMER->ARR = 100;
BL_TIMER->PSC = BL_TIMER_FREQ / 10000 - 1; // 1kHz
BL_TIMER->CCMR1 = TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2; // PWM
BL_TIMER->CCER = TIM_CCER_CC1E | TIM_CCER_CC1NE;
BL_TIMER->CCR1 = 100;
BL_TIMER->EGR = 1;
BL_TIMER->CR1 |= TIM_CR1_CEN; // Counter enable
BL_TIMER->BDTR |= TIM_BDTR_MOE;
}
#elif defined(PCBX10)
BL_TIMER->ARR = 100;
BL_TIMER->PSC = BL_TIMER_FREQ / 10000 - 1; // 1kHz
BL_TIMER->CCMR2 = TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2 | TIM_CCMR2_OC3PE; // PWM mode 1
BL_TIMER->CCER = TIM_CCER_CC3E | TIM_CCER_CC3NE;
BL_TIMER->CCR3 = 100;
BL_TIMER->EGR = TIM_EGR_UG;
BL_TIMER->CR1 |= TIM_CR1_CEN; // Counter enable
BL_TIMER->BDTR |= TIM_BDTR_MOE;
#endif
}
void backlightEnable(uint8_t dutyCycle)
@ -71,10 +71,14 @@ void backlightEnable(uint8_t dutyCycle)
dutyCycle = 5;
}
#if defined(PCBX12S)
if (IS_HORUS_PROD()) {
PROD_BL_TIMER->CCR4 = dutyCycle;
BL_TIMER->CCR4 = dutyCycle;
}
else {
BETA_BL_TIMER->CCR1 = (100 - dutyCycle);
BL_TIMER->CCR1 = (100 - dutyCycle);
}
#elif defined(PCBX10)
BL_TIMER->CCR3 = (100 - dutyCycle);
#endif
}

View file

@ -96,8 +96,16 @@ extern "C" void INTERRUPT_1MS_IRQHandler()
DEBUG_INTERRUPT(INT_1MS);
}
#if defined(SEMIHOSTING)
extern "C" void initialise_monitor_handles();
#endif
void boardInit()
{
#if defined(SEMIHOSTING)
initialise_monitor_handles();
#endif
#if !defined(SIMU)
RCC_AHB1PeriphClockCmd(PWR_RCC_AHB1Periph |
PCBREV_RCC_AHB1Periph |
@ -115,7 +123,8 @@ void boardInit()
HAPTIC_RCC_AHB1Periph |
INTMODULE_RCC_AHB1Periph |
EXTMODULE_RCC_AHB1Periph |
GPS_RCC_AHB1Periph,
GPS_RCC_AHB1Periph |
BL_RCC_AHB1Periph,
ENABLE);
RCC_APB1PeriphClockCmd(INTERRUPT_1MS_RCC_APB1Periph |
@ -127,23 +136,18 @@ void boardInit()
AUDIO_RCC_APB1Periph |
INTMODULE_RCC_APB1Periph |
EXTMODULE_RCC_APB1Periph |
GPS_RCC_APB1Periph,
GPS_RCC_APB1Periph |
BL_RCC_APB1Periph,
ENABLE);
RCC_APB2PeriphClockCmd(LCD_RCC_APB2Periph |
ADC_RCC_APB2Periph |
HAPTIC_RCC_APB2Periph |
INTMODULE_RCC_APB2Periph |
EXTMODULE_RCC_APB2Periph,
EXTMODULE_RCC_APB2Periph |
BL_RCC_APB2Periph,
ENABLE);
pwrInit();
// must be called after pwrInit() because the PCBREV GPIO is initialized there
if (IS_HORUS_PROD())
RCC_APB1PeriphClockCmd(PROD_BL_RCC_APB1Periph,ENABLE);
else
RCC_APB2PeriphClockCmd(BETA_BL_RCC_APB2Periph,ENABLE);
delaysInit();
// FrSky removed the volume chip in latest board, that's why it doesn't answer!
@ -172,13 +176,23 @@ void boardInit()
init1msTimer();
usbInit();
hapticInit();
#if defined(BLUETOOTH)
bluetoothInit(BLUETOOTH_FACTORY_BAUDRATE);
#endif
#if defined(PCBX12S)
gpsInit(GPS_USART_BAUDRATE);
#endif
#if defined(DEBUG)
DBGMCU_APB1PeriphConfig(DBGMCU_IWDG_STOP|DBGMCU_TIM1_STOP|DBGMCU_TIM2_STOP|DBGMCU_TIM3_STOP|DBGMCU_TIM4_STOP|DBGMCU_TIM5_STOP|DBGMCU_TIM6_STOP|DBGMCU_TIM7_STOP|DBGMCU_TIM8_STOP|DBGMCU_TIM9_STOP|DBGMCU_TIM10_STOP|DBGMCU_TIM11_STOP|DBGMCU_TIM12_STOP|DBGMCU_TIM13_STOP|DBGMCU_TIM14_STOP, ENABLE);
#endif
#if defined(PCBX10)
ledInit();
#endif
ledBlue();
#endif
}

View file

@ -50,7 +50,13 @@ extern "C" {
#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_fmc.h"
#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_tim.h"
#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_dma2d.h"
#if defined(PCBX10)
#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_adc.h"
#endif
#include "STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/STM32F4xx_StdPeriph_Driver/inc/misc.h"
#if __clang__
// Restore warnings about registers
#pragma clang diagnostic pop
@ -109,7 +115,7 @@ void delay_ms(uint32_t ms);
// PCBREV driver
#define IS_HORUS_PROD() GPIO_ReadInputDataBit(PCBREV_GPIO, PCBREV_GPIO_PIN)
#if defined(SIMU)
#if defined(SIMU) || defined(PCBX10)
#define IS_FIRMWARE_COMPATIBLE_WITH_BOARD() true
#elif PCBREV >= 13
#define IS_FIRMWARE_COMPATIBLE_WITH_BOARD() IS_HORUS_PROD()
@ -311,8 +317,12 @@ void watchdogInit(unsigned int duration);
// ADC driver
#define NUM_POTS 3
#define NUM_SLIDERS 4
#define NUM_XPOTS 3
#define NUM_XPOTS NUM_POTS
#if defined(PCBX10)
#define NUM_SLIDERS 2
#else
#define NUM_SLIDERS 4
#endif
enum Analogs {
STICK1,
STICK2,
@ -323,18 +333,50 @@ enum Analogs {
POT2,
POT3,
POT_LAST = POT3,
SLIDER1,
SLIDER_FIRST,
SLIDER1 = SLIDER_FIRST,
SLIDER2,
SLIDER3,
SLIDER4,
#if defined(PCBX12S)
SLIDER_FRONT_LEFT = SLIDER_FIRST,
SLIDER_FRONT_RIGHT,
SLIDER_REAR_LEFT,
SLIDER_REAR_RIGHT,
#else
SLIDER_REAR_LEFT,
SLIDER_REAR_RIGHT,
#endif
SLIDER_LAST = SLIDER_FIRST + NUM_SLIDERS - 1,
TX_VOLTAGE,
MOUSE1,
MOUSE2,
NUMBER_ANALOG
NUM_ANALOGS
};
enum CalibratedAnalogs {
CALIBRATED_STICK1,
CALIBRATED_STICK2,
CALIBRATED_STICK3,
CALIBRATED_STICK4,
CALIBRATED_POT1,
CALIBRATED_POT2,
CALIBRATED_POT3,
#if defined(PCBX12S)
CALIBRATED_SLIDER_FRONT_LEFT,
CALIBRATED_SLIDER_FRONT_RIGHT,
CALIBRATED_SLIDER_REAR_LEFT,
CALIBRATED_SLIDER_REAR_RIGHT,
#else
CALIBRATED_SLIDER_REAR_LEFT,
CALIBRATED_SLIDER_REAR_RIGHT,
#endif
CALIBRATED_MOUSE1,
CALIBRATED_MOUSE2,
NUM_CALIBRATED_ANALOGS
};
#define IS_POT(x) ((x)>=POT_FIRST && (x)<=POT_LAST)
#define IS_SLIDER(x) ((x)>=SLIDER1 && (x)<=SLIDER4)
extern uint16_t adcValues[NUMBER_ANALOG];
#define IS_SLIDER(x) ((x)>=SLIDER_FIRST && (x)<=SLIDER_LAST)
extern uint16_t adcValues[NUM_ANALOGS];
void adcInit(void);
void adcRead(void);
uint16_t getAnalogValue(uint8_t index);
@ -360,9 +402,13 @@ uint32_t pwrPressedDuration(void);
#endif
// Led driver
void ledInit(void);
void ledOff(void);
void ledRed(void);
void ledBlue(void);
#if defined(PCBX10)
void ledGreen();
#endif
// LCD driver
#define LCD_W 480
@ -370,9 +416,9 @@ void ledBlue(void);
#define LCD_DEPTH 16
void lcdInit(void);
void lcdRefresh(void);
void DMAFillRect(uint16_t * dest, uint16_t destw, uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color);
void DMACopyBitmap(uint16_t * dest, uint16_t destw, uint16_t x, uint16_t y, const uint16_t * src, uint16_t srcw, uint16_t srcx, uint16_t srcy, uint16_t w, uint16_t h);
void DMACopyAlphaBitmap(uint16_t * dest, uint16_t destw, uint16_t x, uint16_t y, const uint16_t * src, uint16_t srcw, uint16_t srcx, uint16_t srcy, uint16_t w, uint16_t h);
void DMAFillRect(uint16_t * dest, uint16_t destw, uint16_t desth, uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color);
void DMACopyBitmap(uint16_t * dest, uint16_t destw, uint16_t desth, uint16_t x, uint16_t y, const uint16_t * src, uint16_t srcw, uint16_t srch, uint16_t srcx, uint16_t srcy, uint16_t w, uint16_t h);
void DMACopyAlphaBitmap(uint16_t * dest, uint16_t destw, uint16_t desth, uint16_t x, uint16_t y, const uint16_t * src, uint16_t srcw, uint16_t srch, uint16_t srcx, uint16_t srcy, uint16_t w, uint16_t h);
void DMABitmapConvert(uint16_t * dest, const uint8_t * src, uint16_t w, uint16_t h, uint32_t format);
void lcdStoreBackupBuffer(void);
int lcdRestoreBackupBuffer(void);
@ -398,9 +444,15 @@ void usbInit(void);
void usbStart(void);
void usbStop(void);
void usbSerialPutc(uint8_t c);
#define USB_NAME "FrSky Horus"
#define USB_MANUFACTURER 'F', 'r', 'S', 'k', 'y', ' ', ' ', ' ' /* 8 bytes */
#define USB_PRODUCT 'H', 'o', 'r', 'u', 's', ' ', ' ', ' ' /* 8 Bytes */
#if defined(PCBX12S)
#define USB_NAME "FrSky Horus"
#define USB_MANUFACTURER 'F', 'r', 'S', 'k', 'y', ' ', ' ', ' ' /* 8 bytes */
#define USB_PRODUCT 'H', 'o', 'r', 'u', 's', ' ', ' ', ' ' /* 8 Bytes */
#elif defined(PCBX10)
#define USB_NAME "FrSky HX10"
#define USB_MANUFACTURER 'F', 'r', 'S', 'k', 'y', ' ', ' ', ' ' /* 8 bytes */
#define USB_PRODUCT 'X', '1', '0', ' ', ' ', ' ', ' ', ' ' /* 8 Bytes */
#endif
#if defined(__cplusplus) && !defined(SIMU)
}
@ -411,7 +463,11 @@ void audioInit(void);
void audioConsumeCurrentBuffer(void);
#define audioDisableIrq() // interrupts must stay enabled on Horus
#define audioEnableIrq() // interrupts must stay enabled on Horus
#if defined(PCBX12S)
#define setSampleRate(freq)
#else
void setSampleRate(uint32_t frequency);
#endif
void setScaledVolume(uint8_t volume);
void setVolume(uint8_t volume);
int32_t getVolume(void);

View file

@ -23,20 +23,35 @@
// Keys
#define KEYS_RCC_AHB1Periph_GPIO (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOG | RCC_AHB1Periph_GPIOH | RCC_AHB1Periph_GPIOI | RCC_AHB1Periph_GPIOJ)
#define KEYS_GPIO_REG_MENU GPIOC->IDR
#define KEYS_GPIO_PIN_MENU GPIO_Pin_13 // PC.13
#define KEYS_GPIO_REG_EXIT GPIOI->IDR
#define KEYS_GPIO_PIN_EXIT GPIO_Pin_8 // PI.08
#define KEYS_GPIO_REG_LEFT GPIOI->IDR
#define KEYS_GPIO_PIN_LEFT GPIO_Pin_7 // PI.07
#define KEYS_GPIO_REG_ENTER GPIOC->IDR
#define KEYS_GPIO_PIN_ENTER GPIO_Pin_1 // PC.01
#define KEYS_GPIO_REG_UP GPIOG->IDR
#define KEYS_GPIO_PIN_UP GPIO_Pin_13 // PG.13
#define KEYS_GPIO_REG_DOWN GPIOI->IDR
#define KEYS_GPIO_PIN_DOWN GPIO_Pin_6 // PI.06
#define KEYS_GPIO_REG_RIGHT GPIOC->IDR
#define KEYS_GPIO_PIN_RIGHT GPIO_Pin_4 // PC.04
#if defined(PCBX12S)
#define KEYS_GPIO_REG_PGUP GPIOC->IDR
#define KEYS_GPIO_PIN_PGUP GPIO_Pin_13 // PC.13
#define KEYS_GPIO_REG_PGDN GPIOI->IDR
#define KEYS_GPIO_PIN_PGDN GPIO_Pin_8 // PI.08
#define KEYS_GPIO_REG_LEFT GPIOI->IDR
#define KEYS_GPIO_PIN_LEFT GPIO_Pin_7 // PI.07
#define KEYS_GPIO_REG_ENTER GPIOC->IDR
#define KEYS_GPIO_PIN_ENTER GPIO_Pin_1 // PC.01
#define KEYS_GPIO_REG_UP GPIOG->IDR
#define KEYS_GPIO_PIN_UP GPIO_Pin_13 // PG.13
#define KEYS_GPIO_REG_DOWN GPIOI->IDR
#define KEYS_GPIO_PIN_DOWN GPIO_Pin_6 // PI.06
#define KEYS_GPIO_REG_RIGHT GPIOC->IDR
#define KEYS_GPIO_PIN_RIGHT GPIO_Pin_4 // PC.04
#elif defined(PCBX10)
#define KEYS_GPIO_REG_PGDN GPIOI->IDR
#define KEYS_GPIO_PIN_PGDN GPIO_Pin_11 // PI.11
#define KEYS_GPIO_REG_LEFT GPIOI->IDR
#define KEYS_GPIO_PIN_LEFT GPIO_Pin_7 // PI.07
#define KEYS_GPIO_REG_ENTER GPIOI->IDR
#define KEYS_GPIO_PIN_ENTER GPIO_Pin_8 // PI.08
#define KEYS_GPIO_REG_UP GPIOI->IDR
#define KEYS_GPIO_PIN_UP GPIO_Pin_4 // PI.04
#define KEYS_GPIO_REG_DOWN GPIOI->IDR
#define KEYS_GPIO_PIN_DOWN GPIO_Pin_6 // PI.06
#define KEYS_GPIO_REG_RIGHT GPIOI->IDR
#define KEYS_GPIO_PIN_RIGHT GPIO_Pin_5 // PI.05
#endif
// Rotary Encoder
#define ROTARY_ENCODER_GPIO GPIOH
@ -74,63 +89,147 @@
#define SWITCHES_GPIO_REG_H GPIOG->IDR
#define SWITCHES_GPIO_PIN_H GPIO_Pin_7 // PG.07
#if defined(PCBX10)
#define SWITCHES_GPIO_REG_GMBL GPIOH->IDR
#define SWITCHES_GPIO_PIN_GMBL GPIO_Pin_14
#define SWITCHES_GPIO_REG_GMBR GPIOH->IDR
#define SWITCHES_GPIO_PIN_GMBR GPIO_Pin_15
#endif
// Trims
#define TRIMS_GPIO_REG_RHL GPIOC->IDR
#define TRIMS_GPIO_PIN_RHL GPIO_Pin_0 // PC.00
#define TRIMS_GPIO_REG_RHR GPIOI->IDR
#define TRIMS_GPIO_PIN_RHR GPIO_Pin_4 // PI.04
#define TRIMS_GPIO_REG_RVD GPIOG->IDR
#define TRIMS_GPIO_PIN_RVD GPIO_Pin_12 // PG.12
#define TRIMS_GPIO_REG_RVU GPIOJ->IDR
#define TRIMS_GPIO_PIN_RVU GPIO_Pin_14 // PJ.14
#define TRIMS_GPIO_REG_LVD GPIOJ->IDR
#define TRIMS_GPIO_PIN_LVD GPIO_Pin_13 // PJ.13
#define TRIMS_GPIO_REG_LHL GPIOD->IDR
#define TRIMS_GPIO_PIN_LHL GPIO_Pin_3 // PD.03
#define TRIMS_GPIO_REG_LVU GPIOJ->IDR
#define TRIMS_GPIO_PIN_LVU GPIO_Pin_12 // PJ.12
#define TRIMS_GPIO_REG_LHR GPIOD->IDR
#define TRIMS_GPIO_PIN_LHR GPIO_Pin_7 // PD.07
#define TRIMS_GPIO_REG_RSD GPIOJ->IDR
#define TRIMS_GPIO_PIN_RSD GPIO_Pin_8 // PJ.08
#define TRIMS_GPIO_REG_RSU GPIOD->IDR
#define TRIMS_GPIO_PIN_RSU GPIO_Pin_13 // PD.13
#define TRIMS_GPIO_REG_LSD GPIOB->IDR
#define TRIMS_GPIO_PIN_LSD GPIO_Pin_14 // PB.14
#define TRIMS_GPIO_REG_LSU GPIOB->IDR
#define TRIMS_GPIO_PIN_LSU GPIO_Pin_13 // PB.13
#if defined(PCBX12S)
#define TRIMS_GPIO_REG_RHL GPIOC->IDR
#define TRIMS_GPIO_PIN_RHL GPIO_Pin_0 // PC.00
#define TRIMS_GPIO_REG_RHR GPIOI->IDR
#define TRIMS_GPIO_PIN_RHR GPIO_Pin_4 // PI.04
#define TRIMS_GPIO_REG_RVD GPIOG->IDR
#define TRIMS_GPIO_PIN_RVD GPIO_Pin_12 // PG.12
#define TRIMS_GPIO_REG_RVU GPIOJ->IDR
#define TRIMS_GPIO_PIN_RVU GPIO_Pin_14 // PJ.14
#define TRIMS_GPIO_REG_LVD GPIOJ->IDR
#define TRIMS_GPIO_PIN_LVD GPIO_Pin_13 // PJ.13
#define TRIMS_GPIO_REG_LHL GPIOD->IDR
#define TRIMS_GPIO_PIN_LHL GPIO_Pin_3 // PD.03
#define TRIMS_GPIO_REG_LVU GPIOJ->IDR
#define TRIMS_GPIO_PIN_LVU GPIO_Pin_12 // PJ.12
#define TRIMS_GPIO_REG_LHR GPIOD->IDR
#define TRIMS_GPIO_PIN_LHR GPIO_Pin_7 // PD.07
#define TRIMS_GPIO_REG_RSD GPIOJ->IDR
#define TRIMS_GPIO_PIN_RSD GPIO_Pin_8 // PJ.08
#define TRIMS_GPIO_REG_RSU GPIOD->IDR
#define TRIMS_GPIO_PIN_RSU GPIO_Pin_13 // PD.13
#define TRIMS_GPIO_REG_LSD GPIOB->IDR
#define TRIMS_GPIO_PIN_LSD GPIO_Pin_14 // PB.14
#define TRIMS_GPIO_REG_LSU GPIOB->IDR
#define TRIMS_GPIO_PIN_LSU GPIO_Pin_13 // PB.13
#elif defined(PCBX10)
#define TRIMS_GPIO_REG_LHL GPIOB->IDR
#define TRIMS_GPIO_PIN_LHL GPIO_Pin_8 // PB.08
#define TRIMS_GPIO_REG_LHR GPIOB->IDR
#define TRIMS_GPIO_PIN_LHR GPIO_Pin_9 // PB.09
#define TRIMS_GPIO_REG_LVD GPIOG->IDR
#define TRIMS_GPIO_PIN_LVD GPIO_Pin_12 // PG.12
#define TRIMS_GPIO_REG_LVU GPIOJ->IDR
#define TRIMS_GPIO_PIN_LVU GPIO_Pin_14 // PJ.14
#define TRIMS_GPIO_REG_RVD GPIOJ->IDR
#define TRIMS_GPIO_PIN_RVD GPIO_Pin_13 // PJ.13
#define TRIMS_GPIO_REG_RHL GPIOD->IDR
#define TRIMS_GPIO_PIN_RHL GPIO_Pin_3 // PD.03
#define TRIMS_GPIO_REG_RVU GPIOJ->IDR
#define TRIMS_GPIO_PIN_RVU GPIO_Pin_12 // PJ.12
#define TRIMS_GPIO_REG_RHR GPIOD->IDR
#define TRIMS_GPIO_PIN_RHR GPIO_Pin_7 // PD.07
#define TRIMS_GPIO_REG_LSU GPIOJ->IDR
#define TRIMS_GPIO_PIN_LSU GPIO_Pin_8 // PJ.08
#define TRIMS_GPIO_REG_LSD GPIOD->IDR
#define TRIMS_GPIO_PIN_LSD GPIO_Pin_13 // PD.13
#define TRIMS_GPIO_REG_RSU GPIOB->IDR
#define TRIMS_GPIO_PIN_RSU GPIO_Pin_14 // PB.14
#define TRIMS_GPIO_REG_RSD GPIOB->IDR
#define TRIMS_GPIO_PIN_RSD GPIO_Pin_13 // PB.13
#endif
// Index of all keys
#define KEYS_GPIOB_PINS (SWITCHES_GPIO_PIN_B_L | SWITCHES_GPIO_PIN_C_L | TRIMS_GPIO_PIN_LSD | TRIMS_GPIO_PIN_LSU)
#define KEYS_GPIOC_PINS (KEYS_GPIO_PIN_MENU | KEYS_GPIO_PIN_ENTER | KEYS_GPIO_PIN_RIGHT | TRIMS_GPIO_PIN_RHL)
#define KEYS_GPIOD_PINS (SWITCHES_GPIO_PIN_C_H | TRIMS_GPIO_PIN_LHL | TRIMS_GPIO_PIN_LHR | TRIMS_GPIO_PIN_RSU)
#define KEYS_GPIOE_PINS (SWITCHES_GPIO_PIN_E_L)
#define KEYS_GPIOG_PINS (KEYS_GPIO_PIN_UP | SWITCHES_GPIO_PIN_D_L | SWITCHES_GPIO_PIN_G_H | SWITCHES_GPIO_PIN_G_L | SWITCHES_GPIO_PIN_H | TRIMS_GPIO_PIN_RVD)
#define KEYS_GPIOH_PINS (SWITCHES_GPIO_PIN_A_H | SWITCHES_GPIO_PIN_B_H | SWITCHES_GPIO_PIN_E_H | SWITCHES_GPIO_PIN_F | ROTARY_ENCODER_GPIO_PIN_A | ROTARY_ENCODER_GPIO_PIN_B)
#define KEYS_GPIOI_PINS (KEYS_GPIO_PIN_EXIT | KEYS_GPIO_PIN_LEFT | KEYS_GPIO_PIN_DOWN | SWITCHES_GPIO_PIN_A_L | TRIMS_GPIO_PIN_RHR)
#define KEYS_GPIOJ_PINS (SWITCHES_GPIO_PIN_D_H | TRIMS_GPIO_PIN_RVU | TRIMS_GPIO_PIN_LVD | TRIMS_GPIO_PIN_LVU | TRIMS_GPIO_PIN_RSD)
#if defined(PCBX12S)
#define KEYS_GPIOB_PINS (SWITCHES_GPIO_PIN_B_L | SWITCHES_GPIO_PIN_C_L | TRIMS_GPIO_PIN_LSD | TRIMS_GPIO_PIN_LSU)
#define KEYS_GPIOC_PINS (KEYS_GPIO_PIN_PGUP | KEYS_GPIO_PIN_ENTER | KEYS_GPIO_PIN_RIGHT | TRIMS_GPIO_PIN_RHL)
#define KEYS_GPIOD_PINS (SWITCHES_GPIO_PIN_C_H | TRIMS_GPIO_PIN_LHL | TRIMS_GPIO_PIN_LHR | TRIMS_GPIO_PIN_RSU)
#define KEYS_GPIOE_PINS (SWITCHES_GPIO_PIN_E_L)
#define KEYS_GPIOG_PINS (KEYS_GPIO_PIN_UP | SWITCHES_GPIO_PIN_D_L | SWITCHES_GPIO_PIN_G_H | SWITCHES_GPIO_PIN_G_L | SWITCHES_GPIO_PIN_H | TRIMS_GPIO_PIN_RVD)
#define KEYS_GPIOH_PINS (SWITCHES_GPIO_PIN_A_H | SWITCHES_GPIO_PIN_B_H | SWITCHES_GPIO_PIN_E_H | SWITCHES_GPIO_PIN_F | ROTARY_ENCODER_GPIO_PIN_A | ROTARY_ENCODER_GPIO_PIN_B)
#define KEYS_GPIOI_PINS (KEYS_GPIO_PIN_PGDN | KEYS_GPIO_PIN_LEFT | KEYS_GPIO_PIN_DOWN | SWITCHES_GPIO_PIN_A_L | TRIMS_GPIO_PIN_RHR)
#define KEYS_GPIOJ_PINS (SWITCHES_GPIO_PIN_D_H | TRIMS_GPIO_PIN_RVU | TRIMS_GPIO_PIN_LVD | TRIMS_GPIO_PIN_LVU | TRIMS_GPIO_PIN_RSD)
#elif defined(PCBX10)
#define KEYS_GPIOB_PINS (SWITCHES_GPIO_PIN_B_L | SWITCHES_GPIO_PIN_C_L | TRIMS_GPIO_PIN_RSU | TRIMS_GPIO_PIN_RSD | TRIMS_GPIO_PIN_LHL | TRIMS_GPIO_PIN_LHR)
#define KEYS_GPIOC_PINS (TRIMS_GPIO_PIN_LHL)
#define KEYS_GPIOD_PINS (SWITCHES_GPIO_PIN_C_H | TRIMS_GPIO_PIN_RHL | TRIMS_GPIO_PIN_RHR | TRIMS_GPIO_PIN_LSD)
#define KEYS_GPIOE_PINS (SWITCHES_GPIO_PIN_E_L)
#define KEYS_GPIOG_PINS (SWITCHES_GPIO_PIN_D_L | SWITCHES_GPIO_PIN_G_H | SWITCHES_GPIO_PIN_G_L | SWITCHES_GPIO_PIN_H | TRIMS_GPIO_PIN_LVD)
#define KEYS_GPIOH_PINS (SWITCHES_GPIO_PIN_A_H | SWITCHES_GPIO_PIN_B_H | SWITCHES_GPIO_PIN_E_H | SWITCHES_GPIO_PIN_F | ROTARY_ENCODER_GPIO_PIN_A | ROTARY_ENCODER_GPIO_PIN_B | SWITCHES_GPIO_PIN_GMBR | SWITCHES_GPIO_PIN_GMBL)
#define KEYS_GPIOI_PINS (KEYS_GPIO_PIN_RIGHT | KEYS_GPIO_PIN_UP | KEYS_GPIO_PIN_ENTER | KEYS_GPIO_PIN_PGDN | KEYS_GPIO_PIN_LEFT | KEYS_GPIO_PIN_DOWN | SWITCHES_GPIO_PIN_A_L)
#define KEYS_GPIOJ_PINS (SWITCHES_GPIO_PIN_D_H | TRIMS_GPIO_PIN_LVU | TRIMS_GPIO_PIN_RVD | TRIMS_GPIO_PIN_RVU | TRIMS_GPIO_PIN_LSU)
#endif
// ADC
#define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_DMA2)
#define ADC_RCC_APB2Periph (RCC_APB2Periph_SPI4 | RCC_APB2Periph_ADC3)
#define ADC_SPI SPI4
#define ADC_GPIO_AF GPIO_AF_SPI4
#define ADC_SPI_GPIO GPIOE
#define ADC_SPI_PIN_SCK GPIO_Pin_2 // PE.02
#define ADC_SPI_PIN_CS GPIO_Pin_4 // PE.04
#define ADC_SPI_PIN_MOSI GPIO_Pin_6 // PE.06
#define ADC_SPI_PIN_MISO GPIO_Pin_5 // PE.05
#define ADC_SPI_PinSource_SCK GPIO_PinSource2
#define ADC_SPI_PinSource_MISO GPIO_PinSource5
#define ADC_SPI_PinSource_MOSI GPIO_PinSource6
#define ADC_GPIO_PIN_MOUSE1 GPIO_Pin_8 // PF.08 ADC3_IN6 J5 MOUSE_X
#define ADC_GPIO_PIN_MOUSE2 GPIO_Pin_9 // PF.09 ADC3_IN7 J6 MOUSE_Y
#define ADC_GPIO_MOUSE GPIOF
#define ADC_IN_MOUSE1 6
#define ADC_IN_MOUSE2 7
#define ADC_DMA DMA2
#define ADC_DMA_Stream DMA2_Stream0
#define ADC_SAMPTIME 3
#if defined(PCBX12S)
#define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_DMA2)
#define ADC_RCC_APB2Periph (RCC_APB2Periph_SPI4 | RCC_APB2Periph_ADC3)
#define ADC_SPI SPI4
#define ADC_GPIO_AF GPIO_AF_SPI4
#define ADC_SPI_GPIO GPIOE
#define ADC_SPI_PIN_SCK GPIO_Pin_2 // PE.02
#define ADC_SPI_PIN_CS GPIO_Pin_4 // PE.04
#define ADC_SPI_PIN_MOSI GPIO_Pin_6 // PE.06
#define ADC_SPI_PIN_MISO GPIO_Pin_5 // PE.05
#define ADC_SPI_PinSource_SCK GPIO_PinSource2
#define ADC_SPI_PinSource_MISO GPIO_PinSource5
#define ADC_SPI_PinSource_MOSI GPIO_PinSource6
#define ADC_GPIO_PIN_MOUSE1 GPIO_Pin_8 // PF.08 ADC3_IN6 J5 MOUSE_X
#define ADC_GPIO_PIN_MOUSE2 GPIO_Pin_9 // PF.09 ADC3_IN7 J6 MOUSE_Y
#define ADC_GPIO_MOUSE GPIOF
#define ADC_IN_MOUSE1 6
#define ADC_IN_MOUSE2 7
#define ADC_DMA DMA2
#define ADC_DMA_Stream DMA2_Stream0
#define ADC_SAMPTIME 3
#elif defined(PCBX10)
#define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_DMA2)
#define ADC_RCC_APB2Periph (RCC_APB2Periph_ADC3)
#define ADC_GPIO_PIN_STICK_LH GPIO_Pin_0 // PC.00
#define ADC_GPIO_PIN_STICK_LV GPIO_Pin_1 // PC.01
#define ADC_GPIO_PIN_STICK_RH GPIO_Pin_2 // PC.02
#define ADC_GPIO_PIN_STICK_RV GPIO_Pin_3 // PC.03
#define ADC_GPIO_PIN_SLIDER1 GPIO_Pin_6 // PF.06
#define ADC_GPIO_PIN_SLIDER2 GPIO_Pin_3 // PA.03
#define ADC_GPIO_PIN_BATT GPIO_Pin_7 // PF.07
#define ADC_GPIO_PIN_POT3 GPIO_Pin_0 // PA.00
#define ADC_GPIO_PIN_POT1 GPIO_Pin_2 // PA.02
#define ADC_GPIO_PIN_POT2 GPIO_Pin_1 // PA.01
#define ADC_GPIO_PIN_EXT1 GPIO_Pin_8 // PF.08
#define ADC_GPIO_PIN_EXT2 GPIO_Pin_9 // PF.09
#define ADC_GPIOA_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3)
#define ADC_GPIOC_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3)
#define ADC_GPIOF_PINS (GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9)
#define ADC_CHANNEL_STICK_LH ADC_Channel_10 // ADC1_IN10
#define ADC_CHANNEL_STICK_LV ADC_Channel_11 // ADC1_IN11
#define ADC_CHANNEL_STICK_RH ADC_Channel_12 // ADC1_IN12
#define ADC_CHANNEL_STICK_RV ADC_Channel_13 // ADC1_IN13
#define ADC_CHANNEL_SLIDER1 ADC_Channel_4 // ADC1_IN4
#define ADC_CHANNEL_SLIDER2 ADC_Channel_3 // ADC1_IN3
#define ADC_CHANNEL_BATT ADC_Channel_5 // ADC1_IN5
#define ADC_CHANNEL_POT3 ADC_Channel_0 // ADC1_IN0
#define ADC_CHANNEL_POT1 ADC_Channel_2 // ADC1_IN2
#define ADC_CHANNEL_POT2 ADC_Channel_1 // ADC1_IN1
#define ADC_CHANNEL_EXT1 ADC_Channel_6 // ADC1_IN6
#define ADC_CHANNEL_EXT2 ADC_Channel_7 // ADC1_IN7
#define ADC_MAIN ADC3
#define ADC_SAMPTIME 3
#define ADC_DMA DMA2
#define ADC_DMA_SxCR_CHSEL DMA_SxCR_CHSEL_1
#define ADC_DMA_Stream DMA2_Stream0
#define ADC_SET_DMA_FLAGS() ADC_DMA->LIFCR = (DMA_LIFCR_CTCIF0 | DMA_LIFCR_CHTIF0 | DMA_LIFCR_CTEIF0 | DMA_LIFCR_CDMEIF0 | DMA_LIFCR_CFEIF0)
#define ADC_TRANSFER_COMPLETE() (ADC_DMA->LISR & DMA_LISR_TCIF0)
#endif
// Power
#define PWR_RCC_AHB1Periph RCC_AHB1Periph_GPIOJ
@ -138,15 +237,30 @@
#define PWR_ON_GPIO_PIN GPIO_Pin_1 // PJ.01
#define PWR_SWITCH_GPIO_PIN GPIO_Pin_0 // PJ.00
#if defined(PCBX10)
#define SPORT_PWR_RCC_AHB1Periph RCC_AHB1Periph_GPIOH
#define SPORT_PWR_GPIO GPIOH
#define SPORT_PWR_GPIO_PIN GPIO_Pin_13 // PH.13
#endif
// PCBREV
#define PCBREV_RCC_AHB1Periph RCC_AHB1Periph_GPIOI
#define PCBREV_GPIO GPIOI
#define PCBREV_GPIO_PIN GPIO_Pin_11 // PI.11
// Led
#define LED_RCC_AHB1Periph RCC_AHB1Periph_GPIOI
#define LED_GPIO GPIOI
#define LED_GPIO_PIN GPIO_Pin_5 // PI.05
#if defined(PCBX12S)
#define LED_RCC_AHB1Periph RCC_AHB1Periph_GPIOI
#define LED_GPIO GPIOI
#define LED_GPIO_PIN GPIO_Pin_5 // PI.05
#elif defined(PCBX10)
#define LED_RCC_AHB1Periph RCC_AHB1Periph_GPIOE
#define LED_GPIO GPIOE
#define LED_RED_GPIO_PIN GPIO_Pin_5
#define LED_GREEN_GPIO_PIN GPIO_Pin_4
#define LED_BLUE_GPIO_PIN GPIO_Pin_6
#define LED_GPIO_PIN (LED_RED_GPIO_PIN | LED_GREEN_GPIO_PIN | LED_BLUE_GPIO_PIN)
#endif
// Serial Port (DEBUG)
#define SERIAL_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA1)
@ -175,8 +289,10 @@
#define TELEMETRY_GPIO_PinSource_RX GPIO_PinSource6
#define TELEMETRY_GPIO_AF GPIO_AF_USART2
#define TELEMETRY_USART USART2
#if defined(PCBX12S)
#define TELEMETRY_DMA_Stream_RX DMA1_Stream5
#define TELEMETRY_DMA_Channel_RX DMA_Channel_4
#endif
#define TELEMETRY_DMA_Stream_TX DMA1_Stream6
#define TELEMETRY_DMA_Channel_TX DMA_Channel_4
#define TELEMETRY_DMA_TX_Stream_IRQ DMA1_Stream6_IRQn
@ -198,30 +314,48 @@
// LCD
#define LCD_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_GPIOI | RCC_AHB1Periph_GPIOJ | RCC_AHB1Periph_GPIOK | RCC_AHB1Periph_DMA2D)
#define LCD_RCC_APB2Periph RCC_APB2Periph_LTDC
#define LCD_GPIO_NRST GPIOF
#define LCD_GPIO_PIN_NRST GPIO_Pin_10 // PF.10
#if defined(PCBX12S)
#define LCD_GPIO_NRST GPIOF
#define LCD_GPIO_PIN_NRST GPIO_Pin_10 // PF.10
#elif defined(PCBX10)
#define LCD_GPIO_NRST GPIOI
#define LCD_GPIO_PIN_NRST GPIO_Pin_10 // PI.10
#endif
#define LTDC_IRQ_PRIO 4
#define DMA_SCREEN_IRQ_PRIO 6
// Backlight
#define BL_RCC_AHB1Periph RCC_AHB1Periph_GPIOA
#define BL_GPIO GPIOA
// Production board
#define PROD_BL_TIMER TIM5
#define PROD_BL_GPIO_PIN GPIO_Pin_3 // PA.03
#define PROD_BL_GPIO_PinSource GPIO_PinSource3
#define PROD_BL_RCC_APB1Periph RCC_APB1Periph_TIM5
#define PROD_BL_RCC_APB2Periph 0
#define PROD_BL_GPIO_AF GPIO_AF_TIM5
#define PROD_BL_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1)
// Beta board
#define BETA_BL_TIMER TIM8
#define BETA_BL_GPIO_PIN GPIO_Pin_5 // PA.05
#define BETA_BL_GPIO_PinSource GPIO_PinSource5
#define BETA_BL_RCC_APB1Periph 0
#define BETA_BL_RCC_APB2Periph RCC_APB2Periph_TIM8
#define BETA_BL_GPIO_AF GPIO_AF_TIM8
#define BETA_BL_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
#if defined(PCBX12S)
#define BL_RCC_AHB1Periph RCC_AHB1Periph_GPIOA
#define BL_GPIO GPIOA
#if PCBREV >= 13
#define BL_TIMER TIM5
#define BL_GPIO_PIN GPIO_Pin_3 // PA.03
#define BL_GPIO_PinSource GPIO_PinSource3
#define BL_RCC_APB1Periph RCC_APB1Periph_TIM5
#define BL_RCC_APB2Periph 0
#define BL_GPIO_AF GPIO_AF_TIM5
#define BL_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1)
#else
#define BL_TIMER TIM8
#define BL_GPIO_PIN GPIO_Pin_5 // PA.05
#define BL_GPIO_PinSource GPIO_PinSource5
#define BL_RCC_APB1Periph 0
#define BL_RCC_APB2Periph RCC_APB2Periph_TIM8
#define BL_GPIO_AF GPIO_AF_TIM8
#define BL_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
#endif
#elif defined(PCBX10)
#define BL_RCC_AHB1Periph RCC_AHB1Periph_GPIOB
#define BL_GPIO GPIOB
#define BL_TIMER TIM8
#define BL_GPIO_PIN GPIO_Pin_1 // PB.01
#define BL_GPIO_PinSource GPIO_PinSource1
#define BL_RCC_APB1Periph 0
#define BL_RCC_APB2Periph RCC_APB2Periph_TIM8
#define BL_GPIO_AF GPIO_AF_TIM8
#define BL_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
#endif
// SD
#define SD_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2)
@ -242,46 +376,78 @@
#define SD_SDIO_TRANSFER_CLK_DIV SD_SDIO_CLK_DIV(24000000)
// EEPROM
#if PCBREV >= 13
#define EEPROM_RCC_AHB1Periph RCC_AHB1Periph_GPIOA
#define EEPROM_RCC_APB1Periph RCC_APB1Periph_SPI1
#define EEPROM_SPI_CS_GPIO GPIOA
#define EEPROM_SPI_CS_GPIO_PIN GPIO_Pin_15 // PA.15
#define EEPROM_SPI_SCK_GPIO GPIOA
#define EEPROM_SPI_SCK_GPIO_PIN GPIO_Pin_5 // PA.05
#define EEPROM_SPI_SCK_GPIO_PinSource GPIO_PinSource5
#define EEPROM_SPI_MISO_GPIO GPIOA
#define EEPROM_SPI_MISO_GPIO_PIN GPIO_Pin_6 // PA.06
#define EEPROM_SPI_MISO_GPIO_PinSource GPIO_PinSource6
#define EEPROM_SPI_MOSI_GPIO GPIOA
#define EEPROM_SPI_MOSI_GPIO_PIN GPIO_Pin_7 // PA.07
#define EEPROM_SPI_MOSI_GPIO_PinSource GPIO_PinSource7
#if defined(PCBX12S) && PCBREV >= 13
#define EEPROM_RCC_AHB1Periph RCC_AHB1Periph_GPIOA
#define EEPROM_RCC_APB1Periph RCC_APB1Periph_SPI1
#define EEPROM_SPI_CS_GPIO GPIOA
#define EEPROM_SPI_CS_GPIO_PIN GPIO_Pin_15 // PA.15
#define EEPROM_SPI_SCK_GPIO GPIOA
#define EEPROM_SPI_SCK_GPIO_PIN GPIO_Pin_5 // PA.05
#define EEPROM_SPI_SCK_GPIO_PinSource GPIO_PinSource5
#define EEPROM_SPI_MISO_GPIO GPIOA
#define EEPROM_SPI_MISO_GPIO_PIN GPIO_Pin_6 // PA.06
#define EEPROM_SPI_MISO_GPIO_PinSource GPIO_PinSource6
#define EEPROM_SPI_MOSI_GPIO GPIOA
#define EEPROM_SPI_MOSI_GPIO_PIN GPIO_Pin_7 // PA.07
#define EEPROM_SPI_MOSI_GPIO_PinSource GPIO_PinSource7
#elif defined(PCBX10)
#define EEPROM_RCC_AHB1Periph RCC_AHB1Periph_GPIOI
#define EEPROM_RCC_APB1Periph RCC_APB1Periph_SPI2
#define EEPROM_SPI_CS_GPIO GPIOI
#define EEPROM_SPI_CS_GPIO_PIN GPIO_Pin_0 // PI.00
#define EEPROM_SPI_SCK_GPIO GPIOI
#define EEPROM_SPI_SCK_GPIO_PIN GPIO_Pin_1 // PI.01
#define EEPROM_SPI_SCK_GPIO_PinSource GPIO_PinSource1
#define EEPROM_SPI_MISO_GPIO GPIOI
#define EEPROM_SPI_MISO_GPIO_PIN GPIO_Pin_2 // PI.02
#define EEPROM_SPI_MISO_GPIO_PinSource GPIO_PinSource2
#define EEPROM_SPI_MOSI_GPIO GPIOI
#define EEPROM_SPI_MOSI_GPIO_PIN GPIO_Pin_3 // PI.03
#define EEPROM_SPI_MOSI_GPIO_PinSource GPIO_PinSource3
#endif
// Audio
#define AUDIO_RCC_AHB1Periph (RCC_AHB1Periph_GPIOI | RCC_AHB1Periph_GPIOH)
#define AUDIO_RCC_APB1Periph RCC_APB1Periph_SPI2
#define AUDIO_SHUTDOWN_GPIO GPIOI
#define AUDIO_SHUTDOWN_GPIO_PIN GPIO_Pin_9 // PI.09
#define AUDIO_XDCS_GPIO GPIOI
#define AUDIO_XDCS_GPIO_PIN GPIO_Pin_0 // PI.00
#define AUDIO_CS_GPIO GPIOH
#define AUDIO_CS_GPIO_PIN GPIO_Pin_13 // PH.13
#define AUDIO_DREQ_GPIO GPIOH
#define AUDIO_DREQ_GPIO_PIN GPIO_Pin_14 // PH.14
#define AUDIO_RST_GPIO GPIOH
#define AUDIO_RST_GPIO_PIN GPIO_Pin_15 // PH.15
#define AUDIO_SPI SPI2
#define AUDIO_SPI_GPIO_AF GPIO_AF_SPI2
#define AUDIO_SPI_SCK_GPIO GPIOI
#define AUDIO_SPI_SCK_GPIO_PIN GPIO_Pin_1 // PI.01
#define AUDIO_SPI_SCK_GPIO_PinSource GPIO_PinSource1
#define AUDIO_SPI_MISO_GPIO GPIOI
#define AUDIO_SPI_MISO_GPIO_PIN GPIO_Pin_2 // PI.02
#define AUDIO_SPI_MISO_GPIO_PinSource GPIO_PinSource2
#define AUDIO_SPI_MOSI_GPIO GPIOI
#define AUDIO_SPI_MOSI_GPIO_PIN GPIO_Pin_3 // PI.03
#define AUDIO_SPI_MOSI_GPIO_PinSource GPIO_PinSource3
#if defined(PCBX12S)
#define AUDIO_RCC_AHB1Periph (RCC_AHB1Periph_GPIOI | RCC_AHB1Periph_GPIOH)
#define AUDIO_RCC_APB1Periph RCC_APB1Periph_SPI2
#define AUDIO_SHUTDOWN_GPIO GPIOI
#define AUDIO_SHUTDOWN_GPIO_PIN GPIO_Pin_9 // PI.09
#define AUDIO_XDCS_GPIO GPIOI
#define AUDIO_XDCS_GPIO_PIN GPIO_Pin_0 // PI.00
#define AUDIO_CS_GPIO GPIOH
#define AUDIO_CS_GPIO_PIN GPIO_Pin_13 // PH.13
#define AUDIO_DREQ_GPIO GPIOH
#define AUDIO_DREQ_GPIO_PIN GPIO_Pin_14 // PH.14
#define AUDIO_RST_GPIO GPIOH
#define AUDIO_RST_GPIO_PIN GPIO_Pin_15 // PH.15
#define AUDIO_SPI SPI2
#define AUDIO_SPI_GPIO_AF GPIO_AF_SPI2
#define AUDIO_SPI_SCK_GPIO GPIOI
#define AUDIO_SPI_SCK_GPIO_PIN GPIO_Pin_1 // PI.01
#define AUDIO_SPI_SCK_GPIO_PinSource GPIO_PinSource1
#define AUDIO_SPI_MISO_GPIO GPIOI
#define AUDIO_SPI_MISO_GPIO_PIN GPIO_Pin_2 // PI.02
#define AUDIO_SPI_MISO_GPIO_PinSource GPIO_PinSource2
#define AUDIO_SPI_MOSI_GPIO GPIOI
#define AUDIO_SPI_MOSI_GPIO_PIN GPIO_Pin_3 // PI.03
#define AUDIO_SPI_MOSI_GPIO_PinSource GPIO_PinSource3
#elif defined (PCBX10)
#define AUDIO_RCC_APB1Periph (RCC_APB1Periph_TIM6 | RCC_APB1Periph_DAC)
#define AUDIO_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_DMA1)
#define AUDIO_MUTE_GPIO GPIOA
#define AUDIO_MUTE_GPIO_PIN GPIO_Pin_7 // PA.07
#define AUDIO_OUTPUT_GPIO GPIOA
#define AUDIO_OUTPUT_GPIO_PIN GPIO_Pin_4 // PA.04
#define AUDIO_GPIO_AF GPIO_AF_DAC1
#define AUDIO_GPIO_PinSource GPIO_PinSource4
#define AUDIO_DMA_Stream DMA1_Stream5
#define AUDIO_DMA_Stream_IRQn DMA1_Stream5_IRQn
#define AUDIO_TIM_IRQn TIM6_DAC_IRQn
#define AUDIO_TIM_IRQHandler TIM6_DAC_IRQHandler
#define AUDIO_DMA_Stream_IRQHandler DMA1_Stream5_IRQHandler
#define AUDIO_TIMER TIM6
#define AUDIO_DMA DMA1
#endif
// I2C Bus
#define I2C_RCC_AHB1Periph RCC_AHB1Periph_GPIOB
@ -296,13 +462,23 @@
#define I2C_SPEED 400000
// Haptic
#define HAPTIC_RCC_AHB1Periph RCC_AHB1Periph_GPIOA
#define HAPTIC_RCC_APB2Periph RCC_APB2ENR_TIM9EN
#define HAPTIC_GPIO GPIOA
#define HAPTIC_GPIO_PIN GPIO_Pin_2
#define HAPTIC_GPIO_TIMER TIM9
#define HAPTIC_GPIO_AF GPIO_AF_TIM9
#define HAPTIC_GPIO_PinSource GPIO_PinSource2
#if defined(PCBX12S)
#define HAPTIC_RCC_AHB1Periph RCC_AHB1Periph_GPIOA
#define HAPTIC_RCC_APB2Periph RCC_APB2ENR_TIM9EN
#define HAPTIC_GPIO GPIOA
#define HAPTIC_GPIO_PIN GPIO_Pin_2
#define HAPTIC_GPIO_TIMER TIM9
#define HAPTIC_GPIO_AF GPIO_AF_TIM9
#define HAPTIC_GPIO_PinSource GPIO_PinSource2
#elif defined(PCBX10)
#define HAPTIC_RCC_AHB1Periph RCC_AHB1Periph_GPIOB
#define HAPTIC_RCC_APB2Periph RCC_APB2ENR_TIM8EN
#define HAPTIC_GPIO GPIOB
#define HAPTIC_GPIO_PIN GPIO_Pin_0 // PB.00
#define HAPTIC_GPIO_TIMER TIM8
#define HAPTIC_GPIO_AF GPIO_AF_TIM8
#define HAPTIC_GPIO_PinSource GPIO_PinSource0
#endif
// Internal Module
#define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA2)
@ -323,58 +499,58 @@
#define INTMODULE_DMA_FLAG_TC DMA_IT_TCIF7
#define INTMODULE_DMA_CHANNEL DMA_Channel_4
#if PCBREV >= 13
#define INTMODULE_RCC_APB1Periph RCC_APB1Periph_TIM2
#define INTMODULE_RCC_APB2Periph RCC_APB2Periph_USART1
#define INTMODULE_TIMER TIM2
#define INTMODULE_TIMER_IRQn TIM2_IRQn
#define INTMODULE_TIMER_IRQHandler TIM2_IRQHandler
#define INTMODULE_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1)
#define INTMODULE_RCC_APB1Periph RCC_APB1Periph_TIM2
#define INTMODULE_RCC_APB2Periph RCC_APB2Periph_USART1
#define INTMODULE_TIMER TIM2
#define INTMODULE_TIMER_IRQn TIM2_IRQn
#define INTMODULE_TIMER_IRQHandler TIM2_IRQHandler
#define INTMODULE_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1)
#else
#define INTMODULE_RCC_APB1Periph 0
#define INTMODULE_RCC_APB2Periph (RCC_APB2Periph_TIM1 | RCC_APB2Periph_USART1)
#define INTMODULE_TIMER TIM1
#define INTMODULE_TIMER_IRQn TIM1_CC_IRQn
#define INTMODULE_TIMER_IRQHandler TIM1_CC_IRQHandler
#define INTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
#define INTMODULE_RCC_APB1Periph 0
#define INTMODULE_RCC_APB2Periph (RCC_APB2Periph_TIM1 | RCC_APB2Periph_USART1)
#define INTMODULE_TIMER TIM1
#define INTMODULE_TIMER_IRQn TIM1_CC_IRQn
#define INTMODULE_TIMER_IRQHandler TIM1_CC_IRQHandler
#define INTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
#endif
// External Module
#define EXTMODULE_PWR_GPIO GPIOB
#define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_3 // PB.03
#if PCBREV >= 13
#define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA2)
#define EXTMODULE_RCC_APB1Periph 0
#define EXTMODULE_RCC_APB2Periph RCC_APB2Periph_TIM1
#define EXTMODULE_PPM_GPIO GPIOA
#define EXTMODULE_PPM_GPIO_PIN GPIO_Pin_10 // PA.10
#define EXTMODULE_PPM_GPIO_PinSource GPIO_PinSource10
#define EXTMODULE_PPM_GPIO_AF GPIO_AF_TIM1
#define EXTMODULE_TIMER TIM1
#define EXTMODULE_TIMER_IRQn TIM1_CC_IRQn
#define EXTMODULE_TIMER_IRQHandler TIM1_CC_IRQHandler
#define EXTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
#define EXTMODULE_DMA_CHANNEL DMA_Channel_6
#define EXTMODULE_DMA_STREAM DMA2_Stream5
#define EXTMODULE_DMA_IRQn DMA2_Stream5_IRQn
#define EXTMODULE_DMA_IRQHandler DMA2_Stream5_IRQHandler
#define EXTMODULE_DMA_FLAG_TC DMA_IT_TCIF5
#define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA2)
#define EXTMODULE_RCC_APB1Periph 0
#define EXTMODULE_RCC_APB2Periph RCC_APB2Periph_TIM1
#define EXTMODULE_PPM_GPIO GPIOA
#define EXTMODULE_PPM_GPIO_PIN GPIO_Pin_10 // PA.10
#define EXTMODULE_PPM_GPIO_PinSource GPIO_PinSource10
#define EXTMODULE_PPM_GPIO_AF GPIO_AF_TIM1
#define EXTMODULE_TIMER TIM1
#define EXTMODULE_TIMER_IRQn TIM1_CC_IRQn
#define EXTMODULE_TIMER_IRQHandler TIM1_CC_IRQHandler
#define EXTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
#define EXTMODULE_DMA_CHANNEL DMA_Channel_6
#define EXTMODULE_DMA_STREAM DMA2_Stream5
#define EXTMODULE_DMA_IRQn DMA2_Stream5_IRQn
#define EXTMODULE_DMA_IRQHandler DMA2_Stream5_IRQHandler
#define EXTMODULE_DMA_FLAG_TC DMA_IT_TCIF5
#else
#define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA1)
#define EXTMODULE_RCC_APB1Periph RCC_APB1Periph_TIM2
#define EXTMODULE_RCC_APB2Periph 0
#define EXTMODULE_PPM_GPIO GPIOA
#define EXTMODULE_PPM_GPIO_PIN GPIO_Pin_15 // PA.15
#define EXTMODULE_PPM_GPIO_PinSource GPIO_PinSource15
#define EXTMODULE_PPM_GPIO_AF GPIO_AF_TIM2
#define EXTMODULE_TIMER TIM2
#define EXTMODULE_TIMER_IRQn TIM2_IRQn
#define EXTMODULE_TIMER_IRQHandler TIM2_IRQHandler
#define EXTMODULE_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1)
#define EXTMODULE_DMA_CHANNEL DMA_Channel_3
#define EXTMODULE_DMA_STREAM DMA1_Stream7
#define EXTMODULE_DMA_IRQn DMA1_Stream7_IRQn
#define EXTMODULE_DMA_IRQHandler DMA1_Stream7_IRQHandler
#define EXTMODULE_DMA_FLAG_TC DMA_IT_TCIF7
#define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA1)
#define EXTMODULE_RCC_APB1Periph RCC_APB1Periph_TIM2
#define EXTMODULE_RCC_APB2Periph 0
#define EXTMODULE_PPM_GPIO GPIOA
#define EXTMODULE_PPM_GPIO_PIN GPIO_Pin_15 // PA.15
#define EXTMODULE_PPM_GPIO_PinSource GPIO_PinSource15
#define EXTMODULE_PPM_GPIO_AF GPIO_AF_TIM2
#define EXTMODULE_TIMER TIM2
#define EXTMODULE_TIMER_IRQn TIM2_IRQn
#define EXTMODULE_TIMER_IRQHandler TIM2_IRQHandler
#define EXTMODULE_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1)
#define EXTMODULE_DMA_CHANNEL DMA_Channel_3
#define EXTMODULE_DMA_STREAM DMA1_Stream7
#define EXTMODULE_DMA_IRQn DMA1_Stream7_IRQn
#define EXTMODULE_DMA_IRQHandler DMA1_Stream7_IRQHandler
#define EXTMODULE_DMA_FLAG_TC DMA_IT_TCIF7
#endif
// Trainer Port
@ -410,28 +586,30 @@
#define TIMER_2MHz_TIMER TIM7
// Bluetooth
#define BT_RCC_APB2Periph RCC_APB2Periph_USART6
#define BT_USART USART6
#define BT_GPIO_AF GPIO_AF_USART6
#define BT_USART_IRQn USART6_IRQn
#define BT_GPIO_TXRX GPIOG
#define BT_TX_GPIO_PIN GPIO_Pin_14 // PG.14
#define BT_RX_GPIO_PIN GPIO_Pin_9 // PG.09
#if PCBREV >= 13
#define BT_RCC_AHB1Periph (RCC_AHB1Periph_GPIOI | RCC_AHB1Periph_GPIOG)
#define BT_EN_GPIO GPIOI
#define BT_EN_GPIO_PIN GPIO_Pin_10 // PI.10
#else
#define BT_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOG)
#define BT_EN_GPIO GPIOA
#define BT_EN_GPIO_PIN GPIO_Pin_6 // PA.06
#if defined(PCBX12S)
#define BT_RCC_APB2Periph RCC_APB2Periph_USART6
#define BT_USART USART6
#define BT_GPIO_AF GPIO_AF_USART6
#define BT_USART_IRQn USART6_IRQn
#define BT_GPIO_TXRX GPIOG
#define BT_TX_GPIO_PIN GPIO_Pin_14 // PG.14
#define BT_RX_GPIO_PIN GPIO_Pin_9 // PG.09
#if PCBREV >= 13
#define BT_RCC_AHB1Periph (RCC_AHB1Periph_GPIOI | RCC_AHB1Periph_GPIOG)
#define BT_EN_GPIO GPIOI
#define BT_EN_GPIO_PIN GPIO_Pin_10 // PI.10
#else
#define BT_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOG)
#define BT_EN_GPIO GPIOA
#define BT_EN_GPIO_PIN GPIO_Pin_6 // PA.06
#endif
#define BT_BRTS_GPIO GPIOG
#define BT_BRTS_GPIO_PIN GPIO_Pin_10 // PG.10
#define BT_BCTS_GPIO GPIOG
#define BT_BCTS_GPIO_PIN GPIO_Pin_11 // PG.11
#define BT_TX_GPIO_PinSource GPIO_PinSource14
#define BT_RX_GPIO_PinSource GPIO_PinSource9
#endif
#define BT_BRTS_GPIO GPIOG
#define BT_BRTS_GPIO_PIN GPIO_Pin_10 // PG.10
#define BT_BCTS_GPIO GPIOG
#define BT_BCTS_GPIO_PIN GPIO_Pin_11 // PG.11
#define BT_TX_GPIO_PinSource GPIO_PinSource14
#define BT_RX_GPIO_PinSource GPIO_PinSource9
// GPS
#define GPS_RCC_AHB1Periph RCC_AHB1Periph_GPIOA

View file

@ -26,9 +26,11 @@ uint32_t readKeys()
{
uint32_t result = 0;
if (~KEYS_GPIO_REG_MENU & KEYS_GPIO_PIN_MENU)
#if defined(PCBX12S)
if (~KEYS_GPIO_REG_PGUP & KEYS_GPIO_PIN_PGUP)
result |= 1 << KEY_PGUP;
if (~KEYS_GPIO_REG_EXIT & KEYS_GPIO_PIN_EXIT)
#endif
if (~KEYS_GPIO_REG_PGDN & KEYS_GPIO_PIN_PGDN)
result |= 1 << KEY_PGDN;
if (~KEYS_GPIO_REG_ENTER & KEYS_GPIO_PIN_ENTER)
result |= 1 << KEY_ENTER;

View file

@ -376,8 +376,13 @@ void lcdInit(void)
LCD_SetTransparency(255);
}
void DMAFillRect(uint16_t * dest, uint16_t destw, uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color)
void DMAFillRect(uint16_t * dest, uint16_t destw, uint16_t desth, uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color)
{
#if defined(PCBX10)
x = destw - (x + w);
y = desth - (y + h);
#endif
DMA2D_DeInit();
DMA2D_InitTypeDef DMA2D_InitStruct;
@ -400,8 +405,15 @@ void DMAFillRect(uint16_t * dest, uint16_t destw, uint16_t x, uint16_t y, uint16
while (DMA2D_GetFlagStatus(DMA2D_FLAG_TC) == RESET);
}
void DMACopyBitmap(uint16_t * dest, uint16_t destw, uint16_t x, uint16_t y, const uint16_t * src, uint16_t srcw, uint16_t srcx, uint16_t srcy, uint16_t w, uint16_t h)
void DMACopyBitmap(uint16_t * dest, uint16_t destw, uint16_t desth, uint16_t x, uint16_t y, const uint16_t * src, uint16_t srcw, uint16_t srch, uint16_t srcx, uint16_t srcy, uint16_t w, uint16_t h)
{
#if defined(PCBX10)
x = destw - (x + w);
y = desth - (y + h);
srcx = srcw - (srcx + w);
srcy = srch - (srcy + h);
#endif
DMA2D_DeInit();
DMA2D_InitTypeDef DMA2D_InitStruct;
@ -433,8 +445,15 @@ void DMACopyBitmap(uint16_t * dest, uint16_t destw, uint16_t x, uint16_t y, cons
while (DMA2D_GetFlagStatus(DMA2D_FLAG_TC) == RESET);
}
void DMACopyAlphaBitmap(uint16_t * dest, uint16_t destw, uint16_t x, uint16_t y, const uint16_t * src, uint16_t srcw, uint16_t srcx, uint16_t srcy, uint16_t w, uint16_t h)
void DMACopyAlphaBitmap(uint16_t * dest, uint16_t destw, uint16_t desth, uint16_t x, uint16_t y, const uint16_t * src, uint16_t srcw, uint16_t srch, uint16_t srcx, uint16_t srcy, uint16_t w, uint16_t h)
{
#if defined(PCBX10)
x = destw - (x + w);
y = desth - (y + h);
srcx = srcw - (srcx + w);
srcy = srch - (srcy + h);
#endif
DMA2D_DeInit();
DMA2D_InitTypeDef DMA2D_InitStruct;

View file

@ -20,7 +20,7 @@
#include "opentx.h"
void ledOn()
void ledInit()
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = LED_GPIO_PIN;
@ -31,6 +31,7 @@ void ledOn()
GPIO_Init(LED_GPIO, &GPIO_InitStructure);
}
#if defined(PCBX12S)
void ledOff()
{
GPIO_InitTypeDef GPIO_InitStructure;
@ -44,12 +45,36 @@ void ledOff()
void ledRed()
{
ledOn();
ledInit();
GPIO_SetBits(LED_GPIO, LED_GPIO_PIN);
}
void ledBlue()
{
ledOn();
ledInit();
GPIO_ResetBits(LED_GPIO, LED_GPIO_PIN);
}
#elif defined(PCBX10)
void ledOff()
{
GPIO_ResetBits(LED_GPIO, LED_GPIO_PIN);
}
void ledRed()
{
ledOff();
GPIO_SetBits(LED_GPIO, LED_RED_GPIO_PIN);
}
void ledGreen()
{
ledOff();
GPIO_SetBits(LED_GPIO, LED_GREEN_GPIO_PIN);
}
void ledBlue()
{
ledOff();
GPIO_SetBits(LED_GPIO, LED_BLUE_GPIO_PIN);
}
#endif

View file

@ -35,28 +35,34 @@ void pwrInit()
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(PWR_GPIO, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = PWR_SWITCH_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_Init(PWR_GPIO, &GPIO_InitStructure);
#if defined(PCBX12S)
// TODO should not be here!
// TODO and X10 code missing
GPIO_InitStructure.GPIO_Pin = AUDIO_SHUTDOWN_GPIO_PIN;
GPIO_Init(AUDIO_SHUTDOWN_GPIO, &GPIO_InitStructure);
#endif
// Init Module PWR
GPIO_ResetBits(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN);
GPIO_InitStructure.GPIO_Pin = INTMODULE_PWR_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_Init(INTMODULE_PWR_GPIO, &GPIO_InitStructure);
GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN);
GPIO_InitStructure.GPIO_Pin = EXTMODULE_PWR_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_Init(EXTMODULE_PWR_GPIO, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
#if !defined(PWR_BUTTON_DISABLED)
// Init PWR SWITCH PIN
GPIO_InitStructure.GPIO_Pin = PWR_SWITCH_GPIO_PIN;
GPIO_Init(PWR_GPIO, &GPIO_InitStructure);
#endif
// Init PCBREV PIN
// TODO to be removed on X10?
GPIO_ResetBits(PCBREV_GPIO, PCBREV_GPIO_PIN);
GPIO_InitStructure.GPIO_Pin = PCBREV_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_Init(PCBREV_GPIO, &GPIO_InitStructure);
// Init SD-DETECT PIN
@ -80,6 +86,7 @@ void pwrOn()
void pwrOff()
{
#if defined(PCBX12S)
// Shutdown the Audio amp
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = AUDIO_SHUTDOWN_GPIO_PIN;
@ -89,6 +96,7 @@ void pwrOff()
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(AUDIO_SHUTDOWN_GPIO, &GPIO_InitStructure);
GPIO_ResetBits(AUDIO_SHUTDOWN_GPIO, AUDIO_SHUTDOWN_GPIO_PIN);
#endif
// Shutdown the Haptic
hapticDone();
@ -100,7 +108,11 @@ void pwrOff()
uint32_t pwrPressed()
{
#if defined(PWR_BUTTON_DISABLED)
return false;
#else
return GPIO_ReadInputDataBit(PWR_GPIO, PWR_SWITCH_GPIO_PIN) == Bit_RESET;
#endif
}
void pwrResetHandler()

View file

@ -20,11 +20,14 @@
#include "opentx.h"
DMAFifo<TELEMETRY_FIFO_SIZE> telemetryDMAFifo __DMA (TELEMETRY_DMA_Stream_RX);
Fifo<uint8_t, TELEMETRY_FIFO_SIZE> telemetryNoDMAFifo;
uint8_t telemetryFifoMode;
uint32_t telemetryErrors = 0;
#if defined(PCBX12S)
DMAFifo<TELEMETRY_FIFO_SIZE> telemetryDMAFifo __DMA (TELEMETRY_DMA_Stream_RX);
uint8_t telemetryFifoMode;
#endif
void telemetryPortInit(uint32_t baudrate, uint8_t mode)
{
if (baudrate == 0) {
@ -73,6 +76,7 @@ void telemetryPortInit(uint32_t baudrate, uint8_t mode)
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
USART_Init(TELEMETRY_USART, &USART_InitStructure);
#if defined(PCBX12S)
telemetryFifoMode = mode;
if (mode & TELEMETRY_SERIAL_WITHOUT_DMA) {
@ -110,6 +114,12 @@ void telemetryPortInit(uint32_t baudrate, uint8_t mode)
USART_Cmd(TELEMETRY_USART, ENABLE);
DMA_Cmd(TELEMETRY_DMA_Stream_RX, ENABLE);
}
#else
USART_Cmd(TELEMETRY_USART, ENABLE);
USART_ITConfig(TELEMETRY_USART, USART_IT_RXNE, ENABLE);
NVIC_SetPriority(TELEMETRY_USART_IRQn, 6);
NVIC_EnableIRQ(TELEMETRY_USART_IRQn);
#endif
}
void telemetryPortSetDirectionOutput()
@ -207,8 +217,12 @@ extern "C" void TELEMETRY_USART_IRQHandler(void)
// TODO we should have telemetry in an higher layer, functions above should move to a sport_driver.cpp
uint8_t telemetryGetByte(uint8_t * byte)
{
#if defined(PCBX12S)
if (telemetryFifoMode & TELEMETRY_SERIAL_WITHOUT_DMA)
return telemetryNoDMAFifo.pop(*byte);
else
return telemetryDMAFifo.pop(*byte);
#else
return telemetryNoDMAFifo.pop(*byte);
#endif
}

View file

@ -256,8 +256,10 @@ class OpenTxSimulatorFactory: public SimulatorFactory
virtual Board::Type type()
{
#if defined(PCBHORUS)
return Board::BOARD_HORUS;
#if defined(PCBX12S)
return Board::BOARD_X12S;
#elif defined(PCBX10)
return Board::BOARD_X10;
#elif defined(PCBFLAMENCO)
return Board::BOARD_FLAMENCO;
#elif defined(PCBX7)

View file

@ -167,9 +167,17 @@ void simuSetKey(uint8_t key, bool state)
KEY_CASE(KEY_MENU, KEYS_GPIO_REG_MENU, KEYS_GPIO_PIN_MENU)
KEY_CASE(KEY_EXIT, KEYS_GPIO_REG_EXIT, KEYS_GPIO_PIN_EXIT)
#endif
#if defined(PCBHORUS)
KEY_CASE(KEY_PGUP, KEYS_GPIO_REG_MENU, KEYS_GPIO_PIN_MENU)
KEY_CASE(KEY_PGDN, KEYS_GPIO_REG_EXIT, KEYS_GPIO_PIN_EXIT)
#if defined(PCBX12S)
KEY_CASE(KEY_PGUP, KEYS_GPIO_REG_PGUP, KEYS_GPIO_PIN_PGUP)
KEY_CASE(KEY_PGDN, KEYS_GPIO_REG_PGDN, KEYS_GPIO_PIN_PGDN)
KEY_CASE(KEY_ENTER, KEYS_GPIO_REG_ENTER, KEYS_GPIO_PIN_ENTER)
KEY_CASE(KEY_TELEM, KEYS_GPIO_REG_RIGHT, KEYS_GPIO_PIN_RIGHT)
KEY_CASE(KEY_RADIO, KEYS_GPIO_REG_LEFT, KEYS_GPIO_PIN_LEFT)
KEY_CASE(KEY_MODEL, KEYS_GPIO_REG_UP, KEYS_GPIO_PIN_UP)
KEY_CASE(KEY_EXIT, KEYS_GPIO_REG_DOWN, KEYS_GPIO_PIN_DOWN)
#elif defined(PCBX10)
// KEY_CASE(KEY_PGUP, KEYS_GPIO_REG_MENU, KEYS_GPIO_PIN_MENU)
// KEY_CASE(KEY_PGDN, KEYS_GPIO_REG_EXIT, KEYS_GPIO_PIN_EXIT)
KEY_CASE(KEY_ENTER, KEYS_GPIO_REG_ENTER, KEYS_GPIO_PIN_ENTER)
KEY_CASE(KEY_TELEM, KEYS_GPIO_REG_RIGHT, KEYS_GPIO_PIN_RIGHT)
KEY_CASE(KEY_RADIO, KEYS_GPIO_REG_LEFT, KEYS_GPIO_PIN_LEFT)

View file

@ -106,6 +106,7 @@ set(TARGET_SRC
sdcard_driver.cpp
massstorage.cpp
serial2_driver.cpp
audio_driver.cpp
)
set(FIRMWARE_SRC

View file

@ -20,10 +20,10 @@
#include "opentx.h"
uint16_t adcValues[NUMBER_ANALOG];
uint16_t adcValues[NUM_ANALOGS];
#if defined(FRSKY_STICKS)
const char ana_direction[NUMBER_ANALOG] = {1, 1, 0, 1 ,0 ,1 ,0, 0, 0};
const char ana_direction[NUM_ANALOGS] = {1, 1, 0, 1 ,0 ,1 ,0, 0, 0};
#endif
@ -72,7 +72,7 @@ void adcSingleRead()
for (uint8_t i=0; i<4; i++)
padc = ADC;
y = padc->ADC_ISR; // Clear EOC flags
for (y = NUMBER_ANALOG+1; --y > 0;) {
for (y = NUM_ANALOGS+1; --y > 0;) {
padc->ADC_CR = 2; // Start conversion
x = 0;
while ((padc->ADC_ISR & 0x01000000) == 0) {
@ -105,7 +105,7 @@ void adcSingleRead()
// adc direction correct
#if defined(FRSKY_STICKS)
uint32_t i ;
for (i=0; i<NUMBER_ANALOG; i++) {
for (i=0; i<NUM_ANALOGS; i++) {
if (ana_direction[i]) {
adcValues[i] = 4096-adcValues[i];
}
@ -115,11 +115,11 @@ void adcSingleRead()
void adcRead()
{
uint16_t temp[NUMBER_ANALOG] = { 0 };
uint16_t temp[NUM_ANALOGS] = { 0 };
for (int i=0; i<4; i++) {
adcSingleRead();
for (uint8_t x=0; x<NUMBER_ANALOG; x++) {
for (uint8_t x=0; x<NUM_ANALOGS; x++) {
uint16_t val = adcValues[x];
#if defined(JITTER_MEASURE)
if (JITTER_MEASURE_ACTIVE()) {
@ -130,7 +130,7 @@ void adcRead()
}
}
for (uint8_t x=0; x<NUMBER_ANALOG; x++) {
for (uint8_t x=0; x<NUM_ANALOGS; x++) {
adcValues[x] = temp[x] >> 2;
}
}

View file

@ -314,7 +314,19 @@ enum Analogs {
#if !defined(REVA)
TX_CURRENT,
#endif
NUMBER_ANALOG
NUM_ANALOGS
};
enum CalibratedAnalogs {
CALIBRATED_STICK1,
CALIBRATED_STICK2,
CALIBRATED_STICK3,
CALIBRATED_STICK4,
CALIBRATED_POT_FIRST,
CALIBRATED_POT1 = CALIBRATED_POT_FIRST,
CALIBRATED_POT2,
CALIBRATED_POT3,
CALIBRATED_POT_LAST = CALIBRATED_POT3,
NUM_CALIBRATED_ANALOGS
};
#define IS_POT(x) ((x)>=POT_FIRST && (x)<=POT_LAST)
#define IS_SLIDER(x) false

View file

@ -12,6 +12,7 @@ if(PCB STREQUAL X9E)
set(FLAVOUR x9e)
add_definitions(-DSTM32F40_41xxx -DPCBX9E)
add_definitions(-DEEPROM_VARIANT=0x8000)
add_definitions(-DBLUETOOTH)
set(FIRMWARE_TARGET_SRC
${FIRMWARE_TARGET_SRC}
top_lcd_driver.cpp
@ -111,6 +112,8 @@ set(TARGET_SRC
${LED_DRIVER}
backlight_driver.cpp
extmodule_driver.cpp
../common/arm/stm32/audio_dac_driver.cpp
../common/arm/stm32/adc_driver.cpp
)
set(FIRMWARE_SRC

View file

@ -1,199 +0,0 @@
/*
* Copyright (C) OpenTX
*
* Based on code named
* th9x - http://code.google.com/p/th9x
* er9x - http://code.google.com/p/er9x
* gruvin9x - http://code.google.com/p/gruvin9x
*
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include "opentx.h"
// Sample time should exceed 1uS
#define SAMPTIME 2 // sample time = 28 cycles
#define SAMPTIME_LONG 3 // sample time = 56 cycles
#if !defined(SIMU)
#if defined(PCBX9E) && defined(HORUS_STICKS)
const int8_t ana_direction[NUMBER_ANALOG] = {1,-1,1,-1, -1,-1,-1,1, -1,1,1,1, -1};
#elif defined(PCBX9E)
const int8_t ana_direction[NUMBER_ANALOG] = {1,1,-1,-1, -1,-1,-1,1, -1,1,1,1, -1};
#elif defined(PCBX9DP)
const int8_t ana_direction[NUMBER_ANALOG] = {1,-1,1,-1, -1,1,-1, -1,1, 1};
#elif defined(PCBX7)
const int8_t ana_direction[NUMBER_ANALOG] = {-1,1,-1,1, 1,1, 1};
#elif defined(REV4a)
const int8_t ana_direction[NUMBER_ANALOG] = {1,-1,1,-1, -1,-1,0, -1,1, 1};
#else
const int8_t ana_direction[NUMBER_ANALOG] = {1,-1,1,-1, -1,1,0, -1,1, 1};
#endif
#endif // #if !defined(SIMU)
#if defined(PCBX9E)
#define NUMBER_ANALOG_ADC1 10
#define NUMBER_ANALOG_ADC3 (NUMBER_ANALOG - 10)
#if !defined(SIMU)
// mapping from adcValues order to enum Analogs
const uint8_t ana_mapping[NUMBER_ANALOG] = { 0 /*STICK1*/, 1 /*STICK2*/, 2 /*STICK3*/, 3 /*STICK4*/,
10 /*POT1*/, 4 /*POT2*/, 5 /*POT3*/, 6 /*POT4*/,
11 /*SLIDER1*/, 12 /*SLIDER2*/, 7 /*SLIDER3*/, 8 /*SLIDER4*/,
9 /*TX_VOLTAGE*/ };
#endif // !defined(SIMU)
#else
#define NUMBER_ANALOG_ADC1 NUMBER_ANALOG
#endif
uint16_t adcValues[NUMBER_ANALOG] __DMA;
void adcInit()
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = ADC_GPIOA_PINS;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = ADC_GPIOB_PINS;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = ADC_GPIOC_PINS;
GPIO_Init(GPIOC, &GPIO_InitStructure);
#if defined(PCBX9E)
GPIO_InitStructure.GPIO_Pin = ADC_GPIOF_PINS;
GPIO_Init(GPIOF, &GPIO_InitStructure);
#endif
ADC1->CR1 = ADC_CR1_SCAN;
ADC1->CR2 = ADC_CR2_ADON | ADC_CR2_DMA | ADC_CR2_DDS;
ADC1->SQR1 = (NUMBER_ANALOG_ADC1-1) << 20; // bits 23:20 = number of conversions
#if defined(PCBX9E)
ADC1->SQR2 = (ADC_CHANNEL_POT4<<0) + (ADC_CHANNEL_SLIDER3<<5) + (ADC_CHANNEL_SLIDER4<<10) + (ADC_CHANNEL_BATT<<15); // conversions 7 and more
ADC1->SQR3 = (ADC_CHANNEL_STICK_LH<<0) + (ADC_CHANNEL_STICK_LV<<5) + (ADC_CHANNEL_STICK_RV<<10) + (ADC_CHANNEL_STICK_RH<<15) + (ADC_CHANNEL_POT2<<20) + (ADC_CHANNEL_POT3<<25); // conversions 1 to 6
#elif defined(PCBX7)
ADC1->SQR2 = (ADC_CHANNEL_BATT<<0); // conversions 7 and more
ADC1->SQR3 = (ADC_CHANNEL_STICK_LH<<0) + (ADC_CHANNEL_STICK_LV<<5) + (ADC_CHANNEL_STICK_RV<<10) + (ADC_CHANNEL_STICK_RH<<15) + (ADC_CHANNEL_POT1<<25) + (ADC_CHANNEL_POT2<<20); // conversions 1 to 6
#else
ADC1->SQR2 = (ADC_CHANNEL_POT3<<0) + (ADC_CHANNEL_SLIDER1<<5) + (ADC_CHANNEL_SLIDER2<<10) + (ADC_CHANNEL_BATT<<15); // conversions 7 and more
ADC1->SQR3 = (ADC_CHANNEL_STICK_LH<<0) + (ADC_CHANNEL_STICK_LV<<5) + (ADC_CHANNEL_STICK_RV<<10) + (ADC_CHANNEL_STICK_RH<<15) + (ADC_CHANNEL_POT1<<20) + (ADC_CHANNEL_POT2<<25); // conversions 1 to 6
#endif
ADC1->SMPR1 = SAMPTIME + (SAMPTIME<<3) + (SAMPTIME<<6) + (SAMPTIME<<9) + (SAMPTIME<<12) + (SAMPTIME<<15) + (SAMPTIME<<18) + (SAMPTIME<<21) + (SAMPTIME<<24);
ADC1->SMPR2 = SAMPTIME + (SAMPTIME<<3) + (SAMPTIME<<6) + (SAMPTIME<<9) + (SAMPTIME<<12) + (SAMPTIME<<15) + (SAMPTIME<<18) + (SAMPTIME<<21) + (SAMPTIME<<24) + (SAMPTIME<<27);
ADC->CCR = 0;
ADC1_DMA_Stream->CR = DMA_SxCR_PL | DMA_SxCR_MSIZE_0 | DMA_SxCR_PSIZE_0 | DMA_SxCR_MINC;
ADC1_DMA_Stream->PAR = CONVERT_PTR_UINT(&ADC1->DR);
ADC1_DMA_Stream->M0AR = CONVERT_PTR_UINT(adcValues);
ADC1_DMA_Stream->NDTR = NUMBER_ANALOG_ADC1;
ADC1_DMA_Stream->FCR = DMA_SxFCR_DMDIS | DMA_SxFCR_FTH_0;
#if defined(PCBX9E)
ADC3->CR1 = ADC_CR1_SCAN;
ADC3->CR2 = ADC_CR2_ADON | ADC_CR2_DMA | ADC_CR2_DDS;
ADC3->SQR1 = (NUMBER_ANALOG_ADC3-1) << 20; // NUMBER_ANALOG Channels
ADC3->SQR2 = 0;
ADC3->SQR3 = (ADC_CHANNEL_POT1<<0) + (ADC_CHANNEL_SLIDER1<<5) + (ADC_CHANNEL_SLIDER2<<10); // conversions 1 to 3
ADC3->SMPR1 = 0;
ADC3->SMPR2 = (SAMPTIME_LONG<<(3*ADC_CHANNEL_POT1)) + (SAMPTIME_LONG<<(3*ADC_CHANNEL_SLIDER1)) + (SAMPTIME_LONG<<(3*ADC_CHANNEL_SLIDER2));
ADC3_DMA_Stream->CR = DMA_SxCR_PL | DMA_SxCR_CHSEL_1 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PSIZE_0 | DMA_SxCR_MINC;
ADC3_DMA_Stream->PAR = CONVERT_PTR_UINT(&ADC3->DR);
ADC3_DMA_Stream->M0AR = CONVERT_PTR_UINT(adcValues + NUMBER_ANALOG_ADC1);
ADC3_DMA_Stream->NDTR = NUMBER_ANALOG_ADC3;
ADC3_DMA_Stream->FCR = DMA_SxFCR_DMDIS | DMA_SxFCR_FTH_0;
#endif
}
void adcSingleRead()
{
ADC1_DMA_Stream->CR &= ~DMA_SxCR_EN; // Disable DMA
ADC1->SR &= ~(uint32_t)(ADC_SR_EOC | ADC_SR_STRT | ADC_SR_OVR);
ADC1_DMA->HIFCR = ADC1_DMA_FLAGS; // Write ones to clear bits
ADC1_DMA_Stream->CR |= DMA_SxCR_EN; // Enable DMA
ADC1->CR2 |= (uint32_t) ADC_CR2_SWSTART;
#if defined(PCBX9E)
ADC3_DMA_Stream->CR &= ~DMA_SxCR_EN; // Disable DMA
ADC3->SR &= ~(uint32_t) ( ADC_SR_EOC | ADC_SR_STRT | ADC_SR_OVR );
ADC3_DMA->LIFCR = ADC3_DMA_FLAGS; // Write ones to clear bits
ADC3_DMA_Stream->CR |= DMA_SxCR_EN; // Enable DMA
ADC3->CR2 |= (uint32_t)ADC_CR2_SWSTART;
#endif
#if defined(PCBX9E)
for (unsigned int i=0; i<10000; i++) {
if ((ADC1_DMA->HISR & ADC1_DMA_FLAG_TC) && (ADC3_DMA->LISR & ADC3_DMA_FLAG_TC)) {
break;
}
}
ADC1_DMA_Stream->CR &= ~DMA_SxCR_EN; // Disable DMA
ADC3_DMA_Stream->CR &= ~DMA_SxCR_EN; // Disable DMA
#else
for (unsigned int i = 0; i < 10000; i++) {
if (ADC1_DMA->HISR & ADC1_DMA_FLAG_TC) {
break;
}
}
ADC1_DMA_Stream->CR &= ~DMA_SxCR_EN; // Disable DMA
#endif
}
void adcRead()
{
uint16_t temp[NUMBER_ANALOG] = { 0 };
for (int i=0; i<4; i++) {
adcSingleRead();
for (uint8_t x=0; x<NUMBER_ANALOG; x++) {
uint16_t val = adcValues[x];
#if defined(JITTER_MEASURE)
if (JITTER_MEASURE_ACTIVE()) {
rawJitter[x].measure(val);
}
#endif
temp[x] += val;
}
}
for (uint8_t x=0; x<NUMBER_ANALOG; x++) {
adcValues[x] = temp[x] >> 2;
}
}
// TODO
void adcStop()
{
}
#if !defined(SIMU)
uint16_t getAnalogValue(uint8_t index)
{
if (IS_POT(index) && !IS_POT_SLIDER_AVAILABLE(index)) {
// Use fixed analog value for non-existing and/or non-connected pots.
// Non-connected analog inputs will slightly follow the adjacent connected analog inputs,
// which produces ghost readings on these inputs.
return 0;
}
#if defined(PCBX9E)
index = ana_mapping[index];
#endif
if (ana_direction[index] < 0)
return 4095 - adcValues[index];
else
return adcValues[index];
}
#endif // #if !defined(SIMU)

View file

@ -373,11 +373,25 @@ enum Analogs {
SLIDER2,
#endif
TX_VOLTAGE,
NUMBER_ANALOG
NUM_ANALOGS
};
#define NUM_POTS (POT_LAST-POT_FIRST+1)
#define NUM_SLIDERS (TX_VOLTAGE-POT_LAST-1)
#define NUM_XPOTS NUM_POTS
#define NUM_SLIDERS (TX_VOLTAGE-POT_LAST-1)
enum CalibratedAnalogs {
CALIBRATED_STICK1,
CALIBRATED_STICK2,
CALIBRATED_STICK3,
CALIBRATED_STICK4,
CALIBRATED_POT_FIRST,
CALIBRATED_POT_LAST = CALIBRATED_POT_FIRST + NUM_POTS - 1,
CALIBRATED_SLIDER_FIRST,
CALIBRATED_SLIDER_LAST = CALIBRATED_SLIDER_FIRST + NUM_SLIDERS - 1,
NUM_CALIBRATED_ANALOGS
};
#if defined(PCBX9D)
#define IS_POT(x) ((x)>=POT_FIRST && (x)<=POT2) // POT3 is only defined in software
#else
@ -386,7 +400,7 @@ enum Analogs {
#define IS_SLIDER(x) ((x)>POT_LAST && (x)<TX_VOLTAGE)
void adcInit(void);
void adcRead(void);
extern uint16_t adcValues[NUMBER_ANALOG];
extern uint16_t adcValues[NUM_ANALOGS];
uint16_t getAnalogValue(uint8_t index);
uint16_t getBatteryVoltage(); // returns current battery voltage in 10mV steps
@ -412,7 +426,12 @@ uint32_t pwrPressedDuration(void);
#else
uint32_t pwroffPressed(void);
#endif
#if defined(SIMU)
#define UNEXPECTED_SHUTDOWN() false
#else
#define UNEXPECTED_SHUTDOWN() (WAS_RESET_BY_WATCHDOG() || g_eeGeneral.unexpectedShutdown)
#endif
// Backlight driver
void backlightInit(void);

View file

@ -348,10 +348,14 @@
#endif
#define ADC_CHANNEL_STICK_RV ADC_Channel_0 // ADC1_IN0
#define ADC_CHANNEL_STICK_RH ADC_Channel_1 // ADC1_IN1
#define ADC1_DMA DMA2
#define ADC1_DMA_Stream DMA2_Stream4
#define ADC1_DMA_FLAGS (DMA_HIFCR_CTCIF4 | DMA_HIFCR_CHTIF4 | DMA_HIFCR_CTEIF4 | DMA_HIFCR_CDMEIF4 | DMA_HIFCR_CFEIF4)
#define ADC1_DMA_FLAG_TC DMA_HISR_TCIF4
#define ADC_MAIN ADC1
#define ADC_DMA DMA2
#define ADC_DMA_SxCR_CHSEL 0
#define ADC_DMA_Stream DMA2_Stream4
#define ADC_SET_DMA_FLAGS() ADC_DMA->HIFCR = (DMA_HIFCR_CTCIF4 | DMA_HIFCR_CHTIF4 | DMA_HIFCR_CTEIF4 | DMA_HIFCR_CDMEIF4 | DMA_HIFCR_CFEIF4)
#define ADC_TRANSFER_COMPLETE() (ADC_DMA->HISR & DMA_HISR_TCIF4)
#define ADC_SAMPTIME 2 // sample time = 28 cycles
#if defined(PCBX9E)
#define ADC_GPIO_PIN_POT1 GPIO_Pin_8 // PF.08
#define ADC_GPIO_PIN_POT2 GPIO_Pin_0 // PB.00
@ -375,10 +379,12 @@
#define ADC_CHANNEL_SLIDER3 ADC_Channel_6 // ADC1_IN6
#define ADC_CHANNEL_SLIDER4 ADC_Channel_9 // ADC1_IN9
#define ADC_CHANNEL_BATT ADC_Channel_10 // ADC1_IN10
#define ADC3_DMA DMA2
#define ADC3_DMA_Stream DMA2_Stream0
#define ADC3_DMA_FLAGS (DMA_LIFCR_CTCIF0 | DMA_LIFCR_CHTIF0 | DMA_LIFCR_CTEIF0 | DMA_LIFCR_CDMEIF0 | DMA_LIFCR_CFEIF0)
#define ADC3_DMA_FLAG_TC DMA_LISR_TCIF0
#define ADC_EXT ADC3
#define ADC_EXT_DMA DMA2
#define ADC_EXT_DMA_Stream DMA2_Stream0
#define ADC_EXT_SET_DMA_FLAGS() ADC_DMA->LIFCR = (DMA_LIFCR_CTCIF0 | DMA_LIFCR_CHTIF0 | DMA_LIFCR_CTEIF0 | DMA_LIFCR_CDMEIF0 | DMA_LIFCR_CFEIF0)
#define ADC_EXT_TRANSFER_COMPLETE() (ADC_DMA->LISR & DMA_LISR_TCIF0)
#define ADC_EXT_SAMPTIME 3 // sample time = 56 cycles
#elif defined(PCBX9DP)
#define ADC_GPIO_PIN_POT1 GPIO_Pin_6 // PA.06
#define ADC_GPIO_PIN_POT2 GPIO_Pin_0 // PB.00

View file

@ -258,7 +258,7 @@ void tasksStart()
cliStart();
#endif
#if defined(BLUETOOTH)
#if defined(BLUETOOTH) && defined(PCBSKY9X)
btTaskId = CoCreateTask(btTask, NULL, 15, &bluetoothStack.stack[BLUETOOTH_STACK_SIZE-1], BLUETOOTH_STACK_SIZE);
#endif

View file

@ -52,7 +52,7 @@ NOINLINE void processFrskyTelemetryData(uint8_t data)
{
static uint8_t dataState = STATE_DATA_IDLE;
#if defined(BLUETOOTH)
#if defined(PCBSKY9X) && defined(BLUETOOTH)
// TODO if (g_model.bt_telemetry)
btPushByte(data);
#endif

View file

@ -272,7 +272,9 @@ PACK(struct FrskyTelemetryData {
#endif
#endif
#if defined(PCBX9DP) || defined(PCBX9E)
#if defined(PCBX10)
#define IS_SWR_VALUE_VALID() (false)
#elif defined(PCBX9DP) || defined(PCBX9E)
#define IS_SWR_VALUE_VALID() (telemetryData.xjtVersion != 0 && telemetryData.xjtVersion != 0xff)
#else
#define IS_SWR_VALUE_VALID() (true)

View file

@ -3,7 +3,7 @@ foreach(translation ${translations})
get_filename_component(language ${translation} NAME_WE)
get_filename_component(path ${translation} DIRECTORY)
set(target ${language}.h)
if(NOT(PCB STREQUAL HORUS) AND language STREQUAL "cz")
if(NOT(PCB STREQUAL X12S OR PCB STREQUAL X10) AND language STREQUAL "cz")
set(language cz_reduced)
endif()
if(PYTHONINTERP_FOUND)

View file

@ -518,9 +518,12 @@
#define TR_TRIMS_VSRCRAW "TrmR""TrmE""TrmT""TrmA"
#endif
#if defined(PCBHORUS)
#if defined(PCBX12S)
#define TR_POTS_VSRCRAW "\310S1\0""\3106P\0""\310S2\0""\313L1\0""\313L2\0""\311LS\0""\311RS\0""\310JSx""\310JSy"
#define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0"
#elif defined(PCBX10)
#define TR_POTS_VSRCRAW "\310S1\0""\3106P\0""\310S2\0""\311LS\0""\311RS\0""None""None""\310EX1""\310EX2"
#define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0"
#elif defined(PCBFLAMENCO)
#define TR_POTS_VSRCRAW "SD\0 ""LS\0 ""RS\0 "
#define TR_SW_VSRCRAW "SA\0 ""SB\0 ""SC\0 ""SE\0 ""SF\0 "

View file

@ -1,42 +0,0 @@
SET SRCDIR=%~dp0%\..\..
cd %SRCDIR%
git fetch
git checkout next
git reset --hard origin/next
cd ..
rmdir build /s /q
mkdir build
cd build
SET COMMON_OPTIONS=-DCMAKE_PREFIX_PATH=C:\Qt\5.6\msvc2015 -DALLOW_NIGHTLY_BUILDS=YES -DVERSION_SUFFIX=%1 -DGVARS=YES -DHELI=YES
SET STM32_OPTIONS=%COMMON_OPTIONS% -DLUA=YES
cmake %COMMON_OPTIONS% -DPCB=9X %SRCDIR%
"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\libsimulator.vcxproj /t:Rebuild /p:Configuration=Release
cmake %COMMON_OPTIONS% -DPCB=GRUVIN9X %SRCDIR%
"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\libsimulator.vcxproj /t:Rebuild /p:Configuration=Release
cmake %COMMON_OPTIONS% -DPCB=MEGA2560 %SRCDIR%
"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\libsimulator.vcxproj /t:Rebuild /p:Configuration=Release
cmake %COMMON_OPTIONS% -DPCB=SKY9X %SRCDIR%
"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\libsimulator.vcxproj /t:Rebuild /p:Configuration=Release
cmake %COMMON_OPTIONS% -DPCB=9XRPRO %SRCDIR%
"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\libsimulator.vcxproj /t:Rebuild /p:Configuration=Release
cmake %STM32_OPTIONS% -DPCB=TARANIS %SRCDIR%
"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\libsimulator.vcxproj /t:Rebuild /p:Configuration=Release
cmake %STM32_OPTIONS% -DPCB=TARANIS -DPCBREV=REVPLUS %SRCDIR%
"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\libsimulator.vcxproj /t:Rebuild /p:Configuration=Release
cmake %STM32_OPTIONS% -DPCB=TARANIS -DPCBREV=REV9E %SRCDIR%
"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\libsimulator.vcxproj /t:Rebuild /p:Configuration=Release
cmake %STM32_OPTIONS% -DPCB=HORUS %SRCDIR%
"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" radio\src\targets\simu\libsimulator.vcxproj /t:Rebuild /p:Configuration=Release
"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" companion\src\installer.vcxproj /t:Rebuild /p:Configuration=Release

View file

@ -123,9 +123,15 @@ elif options[optcount] == "x9e":
maxsize = 65536 * 8
board = BOARD_TARANIS
board_family = BOARD_FAMILY_ARM
elif options[optcount] == "horus":
command_options["PCB"] = "HORUS"
firmware_options = options_horus
elif options[optcount] == "x10":
command_options["PCB"] = "X10"
firmware_options = options_x10
maxsize = 2 * 1024 * 1024
board = BOARD_HORUS
board_family = BOARD_FAMILY_ARM
elif options[optcount] == "x12s":
command_options["PCB"] = "X12S"
firmware_options = options_x12s
maxsize = 2 * 1024 * 1024
board = BOARD_HORUS
board_family = BOARD_FAMILY_ARM

View file

@ -292,7 +292,7 @@ options_taranisx9e = {
"multimodule": ("MULTIMODULE", "YES", "NO")
}
options_horus = {
options_x12s = {
"noheli": ("HELI", "NO", "YES"),
"ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"),
"lua": ("LUA", "YES", "NO_MODEL_SCRIPTS"),
@ -307,3 +307,18 @@ options_horus = {
"multimodule": ("MULTIMODULE", "YES", "NO"),
"pcbdev": ("PCBREV", "10", None),
}
options_x10 = {
"noheli": ("HELI", "NO", "YES"),
"ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"),
"lua": ("LUA", "YES", "NO_MODEL_SCRIPTS"),
"luac": ("LUA_COMPILER", "YES", "NO"),
"nogvars": ("GVARS", "NO", "YES"),
"faimode": ("FAI", "YES", None),
"faichoice": ("FAI", "CHOICE", None),
"nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"),
"massstorage": ("USB", "MASSSTORAGE", None),
"cli": ("USB", "SERIAL", None),
"eu": ("SUPPORT_D16_EU_ONLY", "YES", "NO"),
"multimodule": ("MULTIMODULE", "YES", "NO"),
}

View file

@ -53,6 +53,16 @@ with open(sys.argv[2], "w") as f:
values.append(str(val))
f.write("const uint16_t __%s[] __ALIGNED = { %s };\n" % (constant, ",".join(values)))
f.write("const Bitmap %s(BMP_ARGB4444, %d, %d, __%s);\n" % (constant, width, height, constant))
elif what == "4/4/4/4-R":
constant = sys.argv[2].upper()[:-4]
values = []
for y in range(height):
for x in range(width):
pixel = image.pixel(width-x-1, height-y-1)
val = ((Qt.qAlpha(pixel) // 16) << 12) + ((Qt.qRed(pixel) // 16) << 8) + ((Qt.qGreen(pixel) // 16) << 4) + ((Qt.qBlue(pixel) // 16) << 0)
values.append(str(val))
f.write("const uint16_t __%s[] __ALIGNED = { %s };\n" % (constant, ",".join(values)))
f.write("const Bitmap %s(BMP_ARGB4444, %d, %d, __%s);\n" % (constant, width, height, constant))
elif what == "5/6/5":
constant = sys.argv[2].upper()[:-4]
values = []
@ -63,6 +73,16 @@ with open(sys.argv[2], "w") as f:
values.append(str(val))
f.write("const uint16_t __%s[] __ALIGNED = { %s };\n" % (constant, ",".join(values)))
f.write("const Bitmap %s(BMP_RGB565, %d, %d, __%s);\n" % (constant, width, height, constant))
elif what == "5/6/5-R":
constant = sys.argv[2].upper()[:-4]
values = []
for y in range(height):
for x in range(width):
pixel = image.pixel(width-x-1, height-y-1)
val = ((Qt.qRed(pixel) >> 3) << 11) + ((Qt.qGreen(pixel) >> 2) << 5) + ((Qt.qBlue(pixel) >> 3) << 0)
values.append(str(val))
f.write("const uint16_t __%s[] __ALIGNED = { %s };\n" % (constant, ",".join(values)))
f.write("const Bitmap %s(BMP_RGB565, %d, %d, __%s);\n" % (constant, width, height, constant))
elif what == "5/6/5/8":
colors = []
writeSize(f, width, height)

View file

@ -68,7 +68,10 @@ make -j${JOBS} libsimulator
cmake ${STM32_OPTIONS} -DPCB=X9E ${SRCDIR}
make -j${JOBS} libsimulator
cmake ${STM32_OPTIONS} -DPCB=HORUS ${SRCDIR}
cmake ${STM32_OPTIONS} -DPCB=X10 ${SRCDIR}
make -j${JOBS} libsimulator
cmake ${STM32_OPTIONS} -DPCB=X12S ${SRCDIR}
make -j${JOBS} libsimulator
make -j${JOBS} package

View file

@ -162,19 +162,28 @@ if [[ " X9E X9 ALL " =~ " ${FLAVOR} " ]] ; then
make -j${CORES} gtests ; ./gtests ${TEST_OPTIONS}
fi
if [[ " X12Sr10 X12 ALL " =~ " ${FLAVOR} " ]] ; then
# OpenTX on Horus beta boards
if [[ " X10 HORUS ALL " =~ " ${FLAVOR} " ]] ; then
# OpenTX on X10 boards
rm -rf *
cmake ${COMMON_OPTIONS} -DPCB=HORUS -DPCBREV=10 -DHELI=YES -DLUA=YES -DGVARS=YES ${SRCDIR}
cmake ${COMMON_OPTIONS} -DPCB=X10 -DHELI=YES -DLUA=YES -DGVARS=YES ${SRCDIR}
make -j${CORES} ${FIRMARE_TARGET}
make -j${CORES} simu
make -j${CORES} gtests ; ./gtests ${TEST_OPTIONS}
fi
if [[ " X12S X12 ALL " =~ " ${FLAVOR} " ]] ; then
if [[ " X12Sr10 HORUS ALL " =~ " ${FLAVOR} " ]] ; then
# OpenTX on Horus beta boards
rm -rf *
cmake ${COMMON_OPTIONS} -DPCB=X12S -DPCBREV=10 -DHELI=YES -DLUA=YES -DGVARS=YES ${SRCDIR}
make -j${CORES} ${FIRMARE_TARGET}
make -j${CORES} simu
make -j${CORES} gtests ; ./gtests ${TEST_OPTIONS}
fi
if [[ " X12S HORUS ALL " =~ " ${FLAVOR} " ]] ; then
# OpenTX on Horus
rm -rf *
cmake ${COMMON_OPTIONS} -DPCB=HORUS -DHELI=YES -DLUA=YES -DGVARS=YES ${SRCDIR}
cmake ${COMMON_OPTIONS} -DPCB=X12S -DHELI=YES -DLUA=YES -DGVARS=YES ${SRCDIR}
make -j${CORES} ${FIRMARE_TARGET}
make -j${CORES} simu
make -j${CORES} gtests ; ./gtests ${TEST_OPTIONS}