mirror of https://github.com/ARMmbed/mbed-os.git
Merge pull request #4760 from ARMmbed/release-candidate
Release candidate for mbed-os-5.5.3pull/4909/merge mbed_lib_rev147
commit
ed9d1da9dd
|
@ -19,7 +19,7 @@ GCC_ARM|ARM|IAR
|
|||
**mbed-cli version:**
|
||||
(`mbed --version`)
|
||||
|
||||
**meed-os sha:**
|
||||
**mbed-os sha:**
|
||||
(`git log -n1 --oneline`)
|
||||
|
||||
**DAPLink version:**
|
||||
|
|
|
@ -16,91 +16,120 @@ limitations under the License.
|
|||
"""
|
||||
|
||||
from mbed_host_tests import BaseHostTest
|
||||
import time
|
||||
|
||||
|
||||
class TimingDriftTest(BaseHostTest):
|
||||
""" This test is reading single characters from stdio
|
||||
and measures time between their occurrences.
|
||||
class TimingDriftSync(BaseHostTest):
|
||||
"""
|
||||
This works as master-slave fashion
|
||||
1) Device says its booted up and ready to run the test, wait for host to respond
|
||||
2) Host sends the message to get the device current time i.e base time
|
||||
|
||||
#
|
||||
# *
|
||||
# * |
|
||||
#<---* DUT<- base_time | - round_trip_base_time ------
|
||||
# * | |
|
||||
# * - |
|
||||
# - |
|
||||
# | |
|
||||
# | |
|
||||
# | - measurement_stretch | - nominal_time
|
||||
# | |
|
||||
# | |
|
||||
# - |
|
||||
# * - |
|
||||
# * | |
|
||||
#<---* DUT <-final_time | - round_trip_final_time------
|
||||
# * |
|
||||
# * -
|
||||
#
|
||||
#
|
||||
# As we increase the measurement_stretch, the error because of transport delay diminishes.
|
||||
# The values of measurement_stretch is propotional to round_trip_base_time(transport delays)
|
||||
# by factor time_measurement_multiplier.This multiplier is used is 80 to tolerate 2 sec of
|
||||
# transport delay and test time ~ 180 secs
|
||||
#
|
||||
# Failure in timing can occur if we are ticking too fast or we are ticking too slow, hence we have
|
||||
# min_range and max_range. if we cross on either side tests would be marked fail. The range is a function of
|
||||
# tolerance/acceptable drift currently its 5%.
|
||||
#
|
||||
|
||||
"""
|
||||
__result = None
|
||||
|
||||
# This is calculated later: average_drift_max * number of tick events
|
||||
total_drift_max = None
|
||||
|
||||
average_drift_max = 0.05
|
||||
ticks = []
|
||||
start_time = None
|
||||
finish_time = None
|
||||
dut_seconds_passed = None
|
||||
total_time = None
|
||||
total_drift = None
|
||||
average_drift = None
|
||||
|
||||
def _callback_result(self, key, value, timestamp):
|
||||
# We should not see result data in this test
|
||||
self.__result = False
|
||||
mega = 1000000.0
|
||||
max_measurement_time = 180
|
||||
|
||||
def _callback_end(self, key, value, timestamp):
|
||||
""" {{end;%s}}} """
|
||||
self.log("Received end event, timestamp: %f" % timestamp)
|
||||
self.notify_complete(result=self.result(print_stats=True))
|
||||
# this value is obtained for measurements when there is 0 transport delay and we want accurancy of 5%
|
||||
time_measurement_multiplier = 80
|
||||
|
||||
def _callback_timing_drift_check_start(self, key, value, timestamp):
|
||||
self.round_trip_base_start = timestamp
|
||||
self.send_kv("base_time", 0)
|
||||
|
||||
def _callback_tick(self, key, value, timestamp):
|
||||
""" {{tick;%d}}} """
|
||||
self.log("tick! %f" % timestamp)
|
||||
self.ticks.append((key, value, timestamp))
|
||||
def _callback_base_time(self, key, value, timestamp):
|
||||
self.round_trip_base_end = timestamp
|
||||
self.device_time_base = float(value)
|
||||
self.round_trip_base_time = self.round_trip_base_end - self.round_trip_base_start
|
||||
|
||||
self.log("Device base time {}".format(value))
|
||||
measurement_stretch = (self.round_trip_base_time * self.time_measurement_multiplier) + 5
|
||||
|
||||
if measurement_stretch > self.max_measurement_time:
|
||||
self.log("Time required {} to determine device timer is too high due to transport delay, skipping".format(measurement_stretch))
|
||||
else:
|
||||
self.log("sleeping for {} to measure drift accurately".format(measurement_stretch))
|
||||
time.sleep(measurement_stretch)
|
||||
self.round_trip_final_start = time.time()
|
||||
self.send_kv("final_time", 0)
|
||||
|
||||
def _callback_final_time(self, key, value, timestamp):
|
||||
self.round_trip_final_end = timestamp
|
||||
self.device_time_final = float(value)
|
||||
self.round_trip_final_time = self.round_trip_final_end - self.round_trip_final_start
|
||||
self.log("Device final time {} ".format(value))
|
||||
|
||||
# compute the test results and send to device
|
||||
results = "pass" if self.compute_parameter() else "fail"
|
||||
self.send_kv(results, "0")
|
||||
|
||||
def setup(self):
|
||||
self.register_callback("end", self._callback_end)
|
||||
self.register_callback('tick', self._callback_tick)
|
||||
self.register_callback('timing_drift_check_start', self._callback_timing_drift_check_start)
|
||||
self.register_callback('base_time', self._callback_base_time)
|
||||
self.register_callback('final_time', self._callback_final_time)
|
||||
|
||||
def compute_parameter(self, failure_criteria=0.05):
|
||||
t_max = self.round_trip_final_end - self.round_trip_base_start
|
||||
t_min = self.round_trip_final_start - self.round_trip_base_end
|
||||
t_max_hi = t_max * (1 + failure_criteria)
|
||||
t_max_lo = t_max * (1 - failure_criteria)
|
||||
t_min_hi = t_min * (1 + failure_criteria)
|
||||
t_min_lo = t_min * (1 - failure_criteria)
|
||||
device_time = (self.device_time_final - self.device_time_base) / self.mega
|
||||
|
||||
def result(self, print_stats=True):
|
||||
self.dut_seconds_passed = len(self.ticks) - 1
|
||||
|
||||
if self.dut_seconds_passed < 1:
|
||||
if print_stats:
|
||||
self.log("FAIL: failed to receive at least two tick events")
|
||||
self.__result = False
|
||||
return self.__result
|
||||
self.log("Compute host events")
|
||||
self.log("Transport delay 0: {}".format(self.round_trip_base_time))
|
||||
self.log("Transport delay 1: {}".format(self.round_trip_final_time))
|
||||
self.log("DUT base time : {}".format(self.device_time_base))
|
||||
self.log("DUT end time : {}".format(self.device_time_final))
|
||||
|
||||
self.total_drift_max = self.dut_seconds_passed * self.average_drift_max
|
||||
self.log("min_pass : {} , max_pass : {} for {}%%".format(t_max_lo, t_min_hi, failure_criteria * 100))
|
||||
self.log("min_inconclusive : {} , max_inconclusive : {}".format(t_min_lo, t_max_hi))
|
||||
self.log("Time reported by device: {}".format(device_time))
|
||||
|
||||
self.start_time = self.ticks[0][2]
|
||||
self.finish_time = self.ticks[-1][2]
|
||||
self.total_time = self.finish_time - self.start_time
|
||||
self.total_drift = self.total_time - self.dut_seconds_passed
|
||||
self.average_drift = self.total_drift / self.dut_seconds_passed
|
||||
|
||||
if print_stats:
|
||||
self.log("Start: %f" % self.start_time)
|
||||
self.log("Finish: %f" % self.finish_time)
|
||||
self.log("Total time taken: %f" % self.total_time)
|
||||
|
||||
total_drift_ratio_string = "Total drift/Max total drift: %f/%f"
|
||||
self.log(total_drift_ratio_string % (self.total_drift,
|
||||
self.total_drift_max))
|
||||
|
||||
average_drift_ratio_string = "Average drift/Max average drift: %f/%f"
|
||||
self.log(average_drift_ratio_string % (self.average_drift,
|
||||
self.average_drift_max))
|
||||
|
||||
|
||||
if abs(self.total_drift) > self.total_drift_max:
|
||||
if print_stats:
|
||||
self.log("FAIL: Total drift exceeded max total drift")
|
||||
self.__result = False
|
||||
elif self.average_drift > self.average_drift_max:
|
||||
if print_stats:
|
||||
self.log("FAIL: Average drift exceeded max average drift")
|
||||
if t_max_lo <= device_time <= t_min_hi:
|
||||
self.log("Test passed !!!")
|
||||
self.__result = True
|
||||
elif t_min_lo <= device_time <= t_max_hi:
|
||||
self.log("Test inconclusive due to transport delay, retrying")
|
||||
self.__result = False
|
||||
else:
|
||||
self.__result = True
|
||||
|
||||
self.log("Time outside of passing range. Timing drift seems to be present !!!")
|
||||
self.__result = False
|
||||
return self.__result
|
||||
|
||||
def result(self):
|
||||
return self.__result
|
||||
|
||||
def teardown(self):
|
||||
pass
|
||||
pass
|
||||
|
|
|
@ -14,13 +14,31 @@
|
|||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Tests is to measure the accuracy of Ticker over a period of time
|
||||
*
|
||||
*
|
||||
* 1) DUT would start to update callback_trigger_count every milli sec, in 2x callback we use 2 tickers
|
||||
* to update the count alternatively.
|
||||
* 2) Host would query what is current count base_time, Device responds by the callback_trigger_count
|
||||
* 3) Host after waiting for measurement stretch. It will query for device time again final_time.
|
||||
* 4) Host computes the drift considering base_time, final_time, transport delay and measurement stretch
|
||||
* 5) Finally host send the results back to device pass/fail based on tolerance.
|
||||
* 6) More details on tests can be found in timing_drift_auto.py
|
||||
*/
|
||||
|
||||
#include "mbed.h"
|
||||
#include "greentea-client/test_env.h"
|
||||
#include "utest/utest.h"
|
||||
#include "unity/unity.h"
|
||||
|
||||
using namespace utest::v1;
|
||||
|
||||
static const int ONE_SECOND_MS = 1000;
|
||||
#define ONE_MILLI_SEC 1000
|
||||
volatile uint32_t callback_trigger_count = 0;
|
||||
static const int test_timeout = 240;
|
||||
static const int total_ticks = 10;
|
||||
|
||||
DigitalOut led1(LED1);
|
||||
|
@ -32,53 +50,37 @@ Ticker *ticker2;
|
|||
volatile int ticker_count = 0;
|
||||
volatile bool print_tick = false;
|
||||
|
||||
void send_kv_tick() {
|
||||
if (ticker_count <= total_ticks) {
|
||||
print_tick = true;
|
||||
}
|
||||
}
|
||||
void ticker_callback_1_switch_to_2(void);
|
||||
void ticker_callback_2_switch_to_1(void);
|
||||
|
||||
void ticker_callback_0(void) {
|
||||
static int fast_ticker_count = 0;
|
||||
if (fast_ticker_count >= ONE_SECOND_MS) {
|
||||
send_kv_tick();
|
||||
fast_ticker_count = 0;
|
||||
led1 = !led1;
|
||||
}
|
||||
fast_ticker_count++;
|
||||
++callback_trigger_count;
|
||||
}
|
||||
|
||||
void ticker_callback_1(void) {
|
||||
void ticker_callback_1_led(void) {
|
||||
led1 = !led1;
|
||||
send_kv_tick();
|
||||
}
|
||||
|
||||
void ticker_callback_2_led(void) {
|
||||
led2 = !led2;
|
||||
}
|
||||
|
||||
void ticker_callback_2(void) {
|
||||
ticker_callback_2_led();
|
||||
send_kv_tick();
|
||||
}
|
||||
|
||||
void ticker_callback_1_switch_to_2(void);
|
||||
void ticker_callback_2_switch_to_1(void);
|
||||
|
||||
void ticker_callback_1_switch_to_2(void) {
|
||||
++callback_trigger_count;
|
||||
ticker1->detach();
|
||||
ticker1->attach(ticker_callback_2_switch_to_1, 1.0);
|
||||
ticker_callback_1();
|
||||
ticker1->attach_us(ticker_callback_2_switch_to_1, ONE_MILLI_SEC);
|
||||
ticker_callback_1_led();
|
||||
}
|
||||
|
||||
void ticker_callback_2_switch_to_1(void) {
|
||||
++callback_trigger_count;
|
||||
ticker2->detach();
|
||||
ticker2->attach(ticker_callback_1_switch_to_2, 1.0);
|
||||
ticker_callback_2();
|
||||
ticker2->attach_us(ticker_callback_1_switch_to_2, ONE_MILLI_SEC);
|
||||
ticker_callback_2_led();
|
||||
}
|
||||
|
||||
void wait_and_print() {
|
||||
while(ticker_count <= total_ticks) {
|
||||
while (ticker_count <= total_ticks) {
|
||||
if (print_tick) {
|
||||
print_tick = false;
|
||||
greentea_send_kv("tick", ticker_count++);
|
||||
|
@ -87,61 +89,94 @@ void wait_and_print() {
|
|||
}
|
||||
|
||||
void test_case_1x_ticker() {
|
||||
led1 = 0;
|
||||
led2 = 0;
|
||||
ticker_count = 0;
|
||||
ticker1->attach_us(ticker_callback_0, ONE_SECOND_MS);
|
||||
wait_and_print();
|
||||
}
|
||||
|
||||
void test_case_2x_ticker() {
|
||||
led1 = 0;
|
||||
led2 = 0;
|
||||
ticker_count = 0;
|
||||
ticker1->attach(&ticker_callback_1, 1.0);
|
||||
ticker2->attach(&ticker_callback_2_led, 2.0);
|
||||
wait_and_print();
|
||||
char _key[11] = { };
|
||||
char _value[128] = { };
|
||||
uint8_t results_size = 0;
|
||||
int expected_key = 1;
|
||||
|
||||
greentea_send_kv("timing_drift_check_start", 0);
|
||||
ticker1->attach_us(&ticker_callback_0, ONE_MILLI_SEC);
|
||||
|
||||
// wait for 1st signal from host
|
||||
do {
|
||||
greentea_parse_kv(_key, _value, sizeof(_key), sizeof(_value));
|
||||
expected_key = strcmp(_key, "base_time");
|
||||
} while (expected_key);
|
||||
greentea_send_kv(_key, callback_trigger_count * ONE_MILLI_SEC);
|
||||
|
||||
// wait for 2nd signal from host
|
||||
greentea_parse_kv(_key, _value, sizeof(_key), sizeof(_value));
|
||||
greentea_send_kv(_key, callback_trigger_count * ONE_MILLI_SEC);
|
||||
|
||||
//get the results from host
|
||||
greentea_parse_kv(_key, _value, sizeof(_key), sizeof(_value));
|
||||
|
||||
TEST_ASSERT_EQUAL_STRING_MESSAGE("pass", _key,"Host side script reported a fail...");
|
||||
|
||||
}
|
||||
|
||||
void test_case_2x_callbacks() {
|
||||
char _key[11] = { };
|
||||
char _value[128] = { };
|
||||
uint8_t results_size = 0;
|
||||
int expected_key = 1;
|
||||
|
||||
led1 = 0;
|
||||
led2 = 0;
|
||||
ticker_count = 0;
|
||||
ticker1->attach(ticker_callback_1_switch_to_2, 1.0);
|
||||
wait_and_print();
|
||||
callback_trigger_count = 0;
|
||||
|
||||
greentea_send_kv("timing_drift_check_start", 0);
|
||||
ticker1->attach_us(ticker_callback_1_switch_to_2, ONE_MILLI_SEC);
|
||||
|
||||
// wait for 1st signal from host
|
||||
do {
|
||||
greentea_parse_kv(_key, _value, sizeof(_key), sizeof(_value));
|
||||
expected_key = strcmp(_key, "base_time");
|
||||
} while (expected_key);
|
||||
greentea_send_kv(_key, callback_trigger_count * ONE_MILLI_SEC);
|
||||
|
||||
// wait for 2nd signal from host
|
||||
greentea_parse_kv(_key, _value, sizeof(_key), sizeof(_value));
|
||||
greentea_send_kv(_key, callback_trigger_count * ONE_MILLI_SEC);
|
||||
|
||||
//get the results from host
|
||||
greentea_parse_kv(_key, _value, sizeof(_key), sizeof(_value));
|
||||
|
||||
TEST_ASSERT_EQUAL_STRING_MESSAGE("pass", _key,"Host side script reported a fail...");
|
||||
|
||||
}
|
||||
|
||||
utest::v1::status_t one_ticker_case_setup_handler_t(const Case *const source, const size_t index_of_case) {
|
||||
ticker1 = new Ticker();
|
||||
return greentea_case_setup_handler(source, index_of_case);
|
||||
ticker1 = new Ticker();
|
||||
return greentea_case_setup_handler(source, index_of_case);
|
||||
}
|
||||
|
||||
utest::v1::status_t two_ticker_case_setup_handler_t(const Case *const source, const size_t index_of_case) {
|
||||
ticker1 = new Ticker();
|
||||
ticker2 = new Ticker();
|
||||
return greentea_case_setup_handler(source, index_of_case);
|
||||
ticker1 = new Ticker();
|
||||
ticker2 = new Ticker();
|
||||
return greentea_case_setup_handler(source, index_of_case);
|
||||
}
|
||||
|
||||
utest::v1::status_t one_ticker_case_teardown_handler_t(const Case *const source, const size_t passed, const size_t failed, const failure_t reason) {
|
||||
delete ticker1;
|
||||
return greentea_case_teardown_handler(source, passed, failed, reason);
|
||||
delete ticker1;
|
||||
return greentea_case_teardown_handler(source, passed, failed, reason);
|
||||
}
|
||||
|
||||
utest::v1::status_t two_ticker_case_teardown_handler_t(const Case *const source, const size_t passed, const size_t failed, const failure_t reason) {
|
||||
delete ticker1;
|
||||
delete ticker2;
|
||||
return greentea_case_teardown_handler(source, passed, failed, reason);
|
||||
delete ticker1;
|
||||
delete ticker2;
|
||||
return greentea_case_teardown_handler(source, passed, failed, reason);
|
||||
}
|
||||
|
||||
// Test cases
|
||||
Case cases[] = {
|
||||
Case("Timers: 1x ticker", one_ticker_case_setup_handler_t, test_case_1x_ticker, one_ticker_case_teardown_handler_t),
|
||||
Case("Timers: 2x tickers", two_ticker_case_setup_handler_t, test_case_2x_ticker, two_ticker_case_teardown_handler_t),
|
||||
Case("Timers: 2x callbacks", two_ticker_case_setup_handler_t, test_case_2x_callbacks,two_ticker_case_teardown_handler_t),
|
||||
Case("Timers: 1x ticker", one_ticker_case_setup_handler_t,test_case_1x_ticker, one_ticker_case_teardown_handler_t),
|
||||
Case("Timers: 2x callbacks", two_ticker_case_setup_handler_t,test_case_2x_callbacks, two_ticker_case_teardown_handler_t),
|
||||
};
|
||||
|
||||
utest::v1::status_t greentea_test_setup(const size_t number_of_cases) {
|
||||
GREENTEA_SETUP((total_ticks + 5) * 3, "timing_drift_auto");
|
||||
GREENTEA_SETUP(test_timeout, "timing_drift_auto");
|
||||
return greentea_test_setup_handler(number_of_cases);
|
||||
}
|
||||
|
||||
|
|
|
@ -14,48 +14,73 @@
|
|||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Tests is to measure the accuracy of Timeout over a period of time
|
||||
*
|
||||
*
|
||||
* 1) DUT would start to update callback_trigger_count every milli sec
|
||||
* 2) Host would query what is current count base_time, Device responds by the callback_trigger_count
|
||||
* 3) Host after waiting for measurement stretch. It will query for device time again final_time.
|
||||
* 4) Host computes the drift considering base_time, final_time, transport delay and measurement stretch
|
||||
* 5) Finally host send the results back to device pass/fail based on tolerance.
|
||||
* 6) More details on tests can be found in timing_drift_auto.py
|
||||
*
|
||||
*/
|
||||
|
||||
#include "mbed.h"
|
||||
#include "greentea-client/test_env.h"
|
||||
#include "utest/utest.h"
|
||||
#include "unity/unity.h"
|
||||
|
||||
using namespace utest::v1;
|
||||
|
||||
Timeout timeout;
|
||||
DigitalOut led(LED1);
|
||||
#define ONE_MILLI_SEC 1000
|
||||
|
||||
volatile int ticker_count = 0;
|
||||
volatile bool print_tick = false;
|
||||
static const int total_ticks = 10;
|
||||
const int ONE_SECOND_US = 1000000;
|
||||
volatile uint32_t callback_trigger_count = 0;
|
||||
static const int test_timeout = 240;
|
||||
Timeout timeout;
|
||||
|
||||
void send_kv_tick() {
|
||||
if (ticker_count <= total_ticks) {
|
||||
timeout.attach_us(send_kv_tick, ONE_SECOND_US);
|
||||
print_tick = true;
|
||||
}
|
||||
void set_incremeant_count() {
|
||||
timeout.attach_us(set_incremeant_count, ONE_MILLI_SEC);
|
||||
++callback_trigger_count;
|
||||
}
|
||||
|
||||
void wait_and_print() {
|
||||
while(ticker_count <= total_ticks) {
|
||||
if (print_tick) {
|
||||
print_tick = false;
|
||||
greentea_send_kv("tick", ticker_count++);
|
||||
led = !led;
|
||||
}
|
||||
}
|
||||
void test_case_timeout() {
|
||||
|
||||
char _key[11] = { };
|
||||
char _value[128] = { };
|
||||
int expected_key = 1;
|
||||
uint8_t results_size = 0;
|
||||
|
||||
greentea_send_kv("timing_drift_check_start", 0);
|
||||
timeout.attach_us(set_incremeant_count, ONE_MILLI_SEC);
|
||||
|
||||
// wait for 1st signal from host
|
||||
do {
|
||||
greentea_parse_kv(_key, _value, sizeof(_key), sizeof(_value));
|
||||
expected_key = strcmp(_key, "base_time");
|
||||
} while (expected_key);
|
||||
|
||||
greentea_send_kv(_key, callback_trigger_count * ONE_MILLI_SEC);
|
||||
|
||||
// wait for 2nd signal from host
|
||||
greentea_parse_kv(_key, _value, sizeof(_key), sizeof(_value));
|
||||
greentea_send_kv(_key, callback_trigger_count * ONE_MILLI_SEC);
|
||||
|
||||
//get the results from host
|
||||
greentea_parse_kv(_key, _value, sizeof(_key), sizeof(_value));
|
||||
|
||||
TEST_ASSERT_EQUAL_STRING_MESSAGE("pass", _key,"Host side script reported a fail...");
|
||||
}
|
||||
|
||||
void test_case_ticker() {
|
||||
timeout.attach_us(send_kv_tick, ONE_SECOND_US);
|
||||
wait_and_print();
|
||||
}
|
||||
|
||||
// Test cases
|
||||
Case cases[] = {
|
||||
Case("Timers: toggle on/off", test_case_ticker),
|
||||
};
|
||||
// Test casess
|
||||
Case cases[] = { Case("Timers: toggle on/off", test_case_timeout), };
|
||||
|
||||
utest::v1::status_t greentea_test_setup(const size_t number_of_cases) {
|
||||
GREENTEA_SETUP(total_ticks + 5, "timing_drift_auto");
|
||||
GREENTEA_SETUP(test_timeout, "timing_drift_auto");
|
||||
return greentea_test_setup_handler(number_of_cases);
|
||||
}
|
||||
|
||||
|
@ -64,4 +89,3 @@ Specification specification(greentea_test_setup, cases, greentea_test_teardown_h
|
|||
int main() {
|
||||
Harness::run(specification);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,56 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2013-2016, ARM Limited, All Rights Reserved
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
* not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include "mbed.h"
|
||||
#include "greentea-client/test_env.h"
|
||||
#include "utest/utest.h"
|
||||
|
||||
/**
|
||||
NOTE: This test will have a bit of inherent drift due to it being
|
||||
single-threaded, so having a drift that is non-zero should be ok. However,
|
||||
it should still be well under the limit.
|
||||
**/
|
||||
|
||||
|
||||
using namespace utest::v1;
|
||||
|
||||
DigitalOut led(LED1);
|
||||
volatile bool print_tick = false;
|
||||
const int ONE_SECOND_US = 1000000;
|
||||
const int total_ticks = 10;
|
||||
|
||||
void test_case_ticker() {
|
||||
for (int i = 0; i <= total_ticks; i++) {
|
||||
wait_us(ONE_SECOND_US);
|
||||
greentea_send_kv("tick", i);
|
||||
}
|
||||
}
|
||||
|
||||
// Test cases
|
||||
Case cases[] = {
|
||||
Case("Timers: wait_us", test_case_ticker),
|
||||
};
|
||||
|
||||
utest::v1::status_t greentea_test_setup(const size_t number_of_cases) {
|
||||
GREENTEA_SETUP(total_ticks + 5, "timing_drift_auto");
|
||||
return greentea_test_setup_handler(number_of_cases);
|
||||
}
|
||||
|
||||
Specification specification(greentea_test_setup, cases, greentea_test_teardown_handler);
|
||||
|
||||
int main() {
|
||||
Harness::run(specification);
|
||||
}
|
|
@ -52,7 +52,48 @@ static void erase_range(flash_t *flash, uint32_t addr, uint32_t size)
|
|||
size = size > sector_size ? size - sector_size : 0;
|
||||
}
|
||||
}
|
||||
#ifdef __CC_ARM
|
||||
MBED_NOINLINE
|
||||
__asm static void delay_loop(uint32_t count)
|
||||
{
|
||||
1
|
||||
SUBS a1, a1, #1
|
||||
BCS %BT1
|
||||
BX lr
|
||||
}
|
||||
#elif defined (__ICCARM__)
|
||||
MBED_NOINLINE
|
||||
static void delay_loop(uint32_t count)
|
||||
{
|
||||
__asm volatile(
|
||||
"loop: \n"
|
||||
" SUBS %0, %0, #1 \n"
|
||||
" BCS.n loop\n"
|
||||
: "+r" (count)
|
||||
:
|
||||
: "cc"
|
||||
);
|
||||
}
|
||||
#else // GCC
|
||||
MBED_NOINLINE
|
||||
static void delay_loop(uint32_t count)
|
||||
{
|
||||
__asm__ volatile (
|
||||
"%=:\n\t"
|
||||
#if defined(__thumb__) && !defined(__thumb2__)
|
||||
"SUB %0, #1\n\t"
|
||||
#else
|
||||
"SUBS %0, %0, #1\n\t"
|
||||
#endif
|
||||
"BCS %=b\n\t"
|
||||
: "+l" (count)
|
||||
:
|
||||
: "cc"
|
||||
);
|
||||
}
|
||||
#endif
|
||||
|
||||
MBED_NOINLINE
|
||||
static int time_cpu_cycles(uint32_t cycles)
|
||||
{
|
||||
Timer timer;
|
||||
|
@ -60,9 +101,8 @@ static int time_cpu_cycles(uint32_t cycles)
|
|||
|
||||
int timer_start = timer.read_us();
|
||||
|
||||
volatile uint32_t delay = (volatile uint32_t)cycles;
|
||||
while (delay--);
|
||||
|
||||
uint32_t delay = cycles;
|
||||
delay_loop(delay);
|
||||
int timer_end = timer.read_us();
|
||||
|
||||
timer.stop();
|
||||
|
|
|
@ -1,38 +1,92 @@
|
|||
/*
|
||||
* Copyright (c) 2013-2017, ARM Limited, All Rights Reserved
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
* not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Tests is to measure the accuracy of Thread::wait() over a period of time
|
||||
*
|
||||
*
|
||||
* 1) DUT would start to update callback_trigger_count every milli sec
|
||||
* 2) Host would query what is current count base_time, Device responds by the callback_trigger_count
|
||||
* 3) Host after waiting for measurement stretch. It will query for device time again final_time.
|
||||
* 4) Host computes the drift considering base_time, final_time, transport delay and measurement stretch
|
||||
* 5) Finally host send the results back to device pass/fail based on tolerance.
|
||||
* 6) More details on tests can be found in timing_drift_auto.py
|
||||
*
|
||||
*/
|
||||
|
||||
#include "mbed.h"
|
||||
#include "greentea-client/test_env.h"
|
||||
#include "rtos.h"
|
||||
#include "unity/unity.h"
|
||||
|
||||
#if defined(MBED_RTOS_SINGLE_THREAD)
|
||||
#error [NOT_SUPPORTED] test not supported
|
||||
#error [NOT_SUPPORTED] test not supported
|
||||
#endif
|
||||
|
||||
#define TEST_STACK_SIZE 768
|
||||
#define TEST_STACK_SIZE 1024
|
||||
#define ONE_MILLI_SEC 1000
|
||||
|
||||
#define SIGNAL_PRINT_TICK 0x01
|
||||
volatile uint32_t callback_trigger_count = 0;
|
||||
|
||||
DigitalOut led1(LED1);
|
||||
static const int test_timeout = 240;
|
||||
bool test_result = false;
|
||||
|
||||
const int total_ticks = 10;
|
||||
void update_tick_thread() {
|
||||
while (true) {
|
||||
Thread::wait(1);
|
||||
++callback_trigger_count;
|
||||
}
|
||||
}
|
||||
|
||||
void print_tick_thread() {
|
||||
for (int i = 0; i <= total_ticks; i++) {
|
||||
Thread::signal_wait(SIGNAL_PRINT_TICK);
|
||||
greentea_send_kv("tick", i);
|
||||
led1 = !led1;
|
||||
void gt_comm_wait_thread() {
|
||||
char _key[11] = { };
|
||||
char _value[128] = { };
|
||||
int expected_key = 1;
|
||||
|
||||
greentea_send_kv("timing_drift_check_start", 0);
|
||||
|
||||
// wait for 1st signal from host
|
||||
do {
|
||||
greentea_parse_kv(_key, _value, sizeof(_key), sizeof(_value));
|
||||
expected_key = strcmp(_key, "base_time");
|
||||
} while (expected_key);
|
||||
greentea_send_kv(_key, callback_trigger_count * ONE_MILLI_SEC);
|
||||
|
||||
// wait for 2nd signal from host
|
||||
greentea_parse_kv(_key, _value, sizeof(_key), sizeof(_value));
|
||||
greentea_send_kv(_key, callback_trigger_count * ONE_MILLI_SEC);
|
||||
|
||||
//get the results from host
|
||||
greentea_parse_kv(_key, _value, sizeof(_key), sizeof(_value));
|
||||
|
||||
if (strcmp("pass", _key) == 0) {
|
||||
test_result = true;
|
||||
}
|
||||
}
|
||||
|
||||
int main() {
|
||||
GREENTEA_SETUP(total_ticks + 5, "timing_drift_auto");
|
||||
GREENTEA_SETUP(test_timeout, "timing_drift_auto");
|
||||
Thread tick_thread(osPriorityHigh, TEST_STACK_SIZE);
|
||||
Thread gt_conn_thread(osPriorityNormal, TEST_STACK_SIZE);
|
||||
|
||||
Thread tick_thread(osPriorityNormal, TEST_STACK_SIZE);
|
||||
tick_thread.start(print_tick_thread);
|
||||
tick_thread.start(update_tick_thread);
|
||||
gt_conn_thread.start(gt_comm_wait_thread);
|
||||
gt_conn_thread.join();
|
||||
|
||||
for (int i = 0; i <= total_ticks; i++) {
|
||||
Thread::wait(1000);
|
||||
tick_thread.signal_set(SIGNAL_PRINT_TICK);
|
||||
}
|
||||
|
||||
tick_thread.join();
|
||||
GREENTEA_TESTSUITE_RESULT(1);
|
||||
GREENTEA_TESTSUITE_RESULT(test_result);
|
||||
}
|
||||
|
|
|
@ -1,51 +0,0 @@
|
|||
#include "mbed.h"
|
||||
#include "greentea-client/test_env.h"
|
||||
#include "rtos.h"
|
||||
|
||||
#if defined(MBED_RTOS_SINGLE_THREAD)
|
||||
#error [NOT_SUPPORTED] test not supported
|
||||
#endif
|
||||
|
||||
int total_ticks = 10;
|
||||
volatile int current_tick = 0;
|
||||
|
||||
DigitalOut LEDs[4] = {
|
||||
DigitalOut(LED1), DigitalOut(LED2), DigitalOut(LED3), DigitalOut(LED4)
|
||||
};
|
||||
|
||||
void blink(void const *n) {
|
||||
static int blink_counter = 0;
|
||||
const int led_id = int(n);
|
||||
LEDs[led_id] = !LEDs[led_id];
|
||||
if (++blink_counter == 75 && current_tick <= total_ticks) {
|
||||
greentea_send_kv("tick", current_tick++);
|
||||
blink_counter = 0;
|
||||
}
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
GREENTEA_SETUP(total_ticks + 5, "timing_drift_auto");
|
||||
|
||||
RtosTimer led_1_timer(blink, osTimerPeriodic, (void *)0);
|
||||
RtosTimer led_2_timer(blink, osTimerPeriodic, (void *)1);
|
||||
RtosTimer led_3_timer(blink, osTimerPeriodic, (void *)2);
|
||||
RtosTimer led_4_timer(blink, osTimerPeriodic, (void *)3);
|
||||
|
||||
led_1_timer.start(200);
|
||||
led_2_timer.start(100);
|
||||
led_3_timer.start(50);
|
||||
led_4_timer.start(25);
|
||||
|
||||
while(current_tick <= total_ticks) {
|
||||
Thread::wait(10);
|
||||
}
|
||||
|
||||
led_4_timer.stop();
|
||||
led_3_timer.stop();
|
||||
led_2_timer.stop();
|
||||
led_1_timer.stop();
|
||||
|
||||
GREENTEA_TESTSUITE_RESULT(1);
|
||||
|
||||
Thread::wait(osWaitForever);
|
||||
}
|
|
@ -26,7 +26,7 @@ static void donothing() {}
|
|||
CAN::CAN(PinName rd, PinName td) : _can(), _irq() {
|
||||
// No lock needed in constructor
|
||||
|
||||
for (int i = 0; i < sizeof _irq / sizeof _irq[0]; i++) {
|
||||
for (size_t i = 0; i < sizeof _irq / sizeof _irq[0]; i++) {
|
||||
_irq[i] = callback(donothing);
|
||||
}
|
||||
|
||||
|
@ -37,7 +37,7 @@ CAN::CAN(PinName rd, PinName td) : _can(), _irq() {
|
|||
CAN::CAN(PinName rd, PinName td, int hz) : _can(), _irq() {
|
||||
// No lock needed in constructor
|
||||
|
||||
for (int i = 0; i < sizeof _irq / sizeof _irq[0]; i++) {
|
||||
for (size_t i = 0; i < sizeof _irq / sizeof _irq[0]; i++) {
|
||||
_irq[i].attach(donothing);
|
||||
}
|
||||
|
||||
|
|
|
@ -55,7 +55,7 @@ int FlashIAP::init()
|
|||
int ret = 0;
|
||||
_mutex->lock();
|
||||
if (flash_init(&_flash)) {
|
||||
ret = -1;
|
||||
ret = -1;
|
||||
}
|
||||
_mutex->unlock();
|
||||
return ret;
|
||||
|
@ -66,7 +66,7 @@ int FlashIAP::deinit()
|
|||
int ret = 0;
|
||||
_mutex->lock();
|
||||
if (flash_free(&_flash)) {
|
||||
ret = -1;
|
||||
ret = -1;
|
||||
}
|
||||
_mutex->unlock();
|
||||
return ret;
|
||||
|
@ -75,10 +75,11 @@ int FlashIAP::deinit()
|
|||
|
||||
int FlashIAP::read(void *buffer, uint32_t addr, uint32_t size)
|
||||
{
|
||||
int32_t ret = -1;
|
||||
_mutex->lock();
|
||||
memcpy(buffer, (const void *)addr, size);
|
||||
ret = flash_read(&_flash, addr, (uint8_t *) buffer, size);
|
||||
_mutex->unlock();
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
int FlashIAP::program(const void *buffer, uint32_t addr, uint32_t size)
|
||||
|
|
|
@ -36,23 +36,35 @@ SPI::SPI(PinName mosi, PinName miso, PinName sclk, PinName ssel) :
|
|||
// No lock needed in the constructor
|
||||
|
||||
spi_init(&_spi, mosi, miso, sclk, ssel);
|
||||
aquire();
|
||||
_acquire();
|
||||
}
|
||||
|
||||
void SPI::format(int bits, int mode) {
|
||||
lock();
|
||||
_bits = bits;
|
||||
_mode = mode;
|
||||
SPI::_owner = NULL; // Not that elegant, but works. rmeyer
|
||||
aquire();
|
||||
// If changing format while you are the owner than just
|
||||
// update format, but if owner is changed than even frequency should be
|
||||
// updated which is done by acquire.
|
||||
if (_owner == this) {
|
||||
spi_format(&_spi, _bits, _mode, 0);
|
||||
} else {
|
||||
_acquire();
|
||||
}
|
||||
unlock();
|
||||
}
|
||||
|
||||
void SPI::frequency(int hz) {
|
||||
lock();
|
||||
_hz = hz;
|
||||
SPI::_owner = NULL; // Not that elegant, but works. rmeyer
|
||||
aquire();
|
||||
// If changing format while you are the owner than just
|
||||
// update frequency, but if owner is changed than even frequency should be
|
||||
// updated which is done by acquire.
|
||||
if (_owner == this) {
|
||||
spi_frequency(&_spi, _hz);
|
||||
} else {
|
||||
_acquire();
|
||||
}
|
||||
unlock();
|
||||
}
|
||||
|
||||
|
@ -70,9 +82,18 @@ void SPI::aquire() {
|
|||
unlock();
|
||||
}
|
||||
|
||||
// Note: Private function with no locking
|
||||
void SPI::_acquire() {
|
||||
if (_owner != this) {
|
||||
spi_format(&_spi, _bits, _mode, 0);
|
||||
spi_frequency(&_spi, _hz);
|
||||
_owner = this;
|
||||
}
|
||||
}
|
||||
|
||||
int SPI::write(int value) {
|
||||
lock();
|
||||
aquire();
|
||||
_acquire();
|
||||
int ret = spi_master_write(&_spi, value);
|
||||
unlock();
|
||||
return ret;
|
||||
|
@ -80,7 +101,7 @@ int SPI::write(int value) {
|
|||
|
||||
int SPI::write(const char *tx_buffer, int tx_length, char *rx_buffer, int rx_length) {
|
||||
lock();
|
||||
aquire();
|
||||
_acquire();
|
||||
int ret = spi_master_block_write(&_spi, tx_buffer, tx_length, rx_buffer, rx_length);
|
||||
unlock();
|
||||
return ret;
|
||||
|
@ -167,7 +188,7 @@ int SPI::queue_transfer(const void *tx_buffer, int tx_length, void *rx_buffer, i
|
|||
|
||||
void SPI::start_transfer(const void *tx_buffer, int tx_length, void *rx_buffer, int rx_length, unsigned char bit_width, const event_callback_t& callback, int event)
|
||||
{
|
||||
aquire();
|
||||
_acquire();
|
||||
_callback = callback;
|
||||
_irq.callback(&SPI::irq_handler_asynch);
|
||||
spi_master_transfer(&_spi, tx_buffer, tx_length, rx_buffer, rx_length, bit_width, _irq.entry(), event , _usage);
|
||||
|
|
|
@ -271,6 +271,12 @@ protected:
|
|||
int _bits;
|
||||
int _mode;
|
||||
int _hz;
|
||||
|
||||
private:
|
||||
/* Private acquire function without locking/unlocking
|
||||
* Implemented in order to avoid duplicate locking and boost performance
|
||||
*/
|
||||
void _acquire(void);
|
||||
};
|
||||
|
||||
} // namespace mbed
|
||||
|
|
|
@ -34,6 +34,13 @@ SocketAddress udp_addr;
|
|||
Mutex iomutex;
|
||||
char uuid[GREENTEA_UUID_LENGTH] = {0};
|
||||
|
||||
// Thread safe printf macro
|
||||
#define TS_PRINTF(...) {\
|
||||
iomutex.lock();\
|
||||
printf(__VA_ARGS__);\
|
||||
iomutex.unlock();\
|
||||
}
|
||||
|
||||
// NOTE: assuming that "id" stays in the single digits
|
||||
//
|
||||
// Creates a buffer that first contains the thread's id.
|
||||
|
@ -64,7 +71,6 @@ void prep_buffer(unsigned int id, char *uuid, char *tx_buffer, size_t tx_size) {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
// Each echo class is in charge of one parallel transaction
|
||||
class Echo {
|
||||
private:
|
||||
|
@ -105,26 +111,18 @@ public:
|
|||
prep_buffer(id, uuid, tx_buffer, sizeof(tx_buffer));
|
||||
int ret = sock.sendto(udp_addr, tx_buffer, sizeof(tx_buffer));
|
||||
if (ret >= 0) {
|
||||
iomutex.lock();
|
||||
printf("[ID:%01u][%02u] sent %d bytes - %.*s \n", id, i, ret, ret, tx_buffer);
|
||||
iomutex.unlock();
|
||||
TS_PRINTF("[ID:%01u][%02u] sent %d bytes - %.*s \n", id, i, ret, ret, tx_buffer);
|
||||
} else {
|
||||
iomutex.lock();
|
||||
printf("[ID:%01u][%02u] Network error %d\n", id, i, ret);
|
||||
iomutex.unlock();
|
||||
TS_PRINTF("[ID:%01u][%02u] Network error %d\n", id, i, ret);
|
||||
continue;
|
||||
}
|
||||
|
||||
SocketAddress temp_addr;
|
||||
ret = sock.recvfrom(&temp_addr, rx_buffer, sizeof(rx_buffer));
|
||||
if (ret >= 0) {
|
||||
iomutex.lock();
|
||||
printf("[ID:%01u][%02u] recv %d bytes - %.*s \n", id, i, ret, ret, tx_buffer);
|
||||
iomutex.unlock();
|
||||
TS_PRINTF("[ID:%01u][%02u] recv %d bytes - %.*s \n", id, i, ret, ret, tx_buffer);
|
||||
} else {
|
||||
iomutex.lock();
|
||||
printf("[ID:%01u][%02u] Network error %d\n", id, i, ret);
|
||||
iomutex.unlock();
|
||||
TS_PRINTF("[ID:%01u][%02u] Network error %d\n", id, i, ret);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -132,9 +130,7 @@ public:
|
|||
ret == sizeof(tx_buffer) &&
|
||||
memcmp(rx_buffer, tx_buffer, sizeof(rx_buffer)) == 0)) {
|
||||
success += 1;
|
||||
iomutex.lock();
|
||||
printf("[ID:%01u][%02u] success #%d\n", id, i, success);
|
||||
iomutex.unlock();
|
||||
TS_PRINTF("[ID:%01u][%02u] success #%d\n", id, i, success);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -151,9 +147,15 @@ public:
|
|||
|
||||
result = success == ECHO_LOOPS;
|
||||
|
||||
if (result) {
|
||||
TS_PRINTF("[ID:%01u] Succeeded all %d times!\n", id, success);
|
||||
} else {
|
||||
TS_PRINTF("[ID:%01u] Only succeeded %d times out of a required %d.\n", id, success, ECHO_LOOPS);
|
||||
}
|
||||
|
||||
err = sock.close();
|
||||
printf("[ID:%01u] Failed to close socket!\n", id);
|
||||
if (err) {
|
||||
TS_PRINTF("[ID:%01u] Failed to close socket!\n", id);
|
||||
result = false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -192,7 +192,7 @@ static void lpc_rxqueue_pbuf(struct lpc_enetdata *lpc_enetif, struct pbuf *p)
|
|||
LPC_EMAC->RxConsumeIndex = idx;
|
||||
|
||||
LWIP_DEBUGF(UDP_LPC_EMAC | LWIP_DBG_TRACE,
|
||||
("lpc_rxqueue_pbuf: pbuf packet queued: %p (free desc=%d)\n", p,
|
||||
("lpc_rxqueue_pbuf: pbuf packet queued: %p (free desc=%"U32_F")\n", p,
|
||||
lpc_enetif->rx_free_descs));
|
||||
}
|
||||
|
||||
|
@ -215,7 +215,7 @@ s32_t lpc_rx_queue(struct netif *netif)
|
|||
p = pbuf_alloc(PBUF_RAW, (u16_t) EMAC_ETH_MAX_FLEN, PBUF_RAM);
|
||||
if (p == NULL) {
|
||||
LWIP_DEBUGF(UDP_LPC_EMAC | LWIP_DBG_TRACE,
|
||||
("lpc_rx_queue: could not allocate RX pbuf (free desc=%d)\n",
|
||||
("lpc_rx_queue: could not allocate RX pbuf (free desc=%"U32_F")\n",
|
||||
lpc_enetif->rx_free_descs));
|
||||
return queued;
|
||||
}
|
||||
|
@ -341,7 +341,7 @@ static struct pbuf *lpc_low_level_input(struct netif *netif)
|
|||
lpc_rxqueue_pbuf(lpc_enetif, p);
|
||||
|
||||
LWIP_DEBUGF(UDP_LPC_EMAC | LWIP_DBG_TRACE,
|
||||
("lpc_low_level_input: Packet dropped with errors (0x%x)\n",
|
||||
("lpc_low_level_input: Packet dropped with errors (%"X32_F")\n",
|
||||
lpc_enetif->prxs[idx].statusinfo));
|
||||
|
||||
p = NULL;
|
||||
|
@ -365,10 +365,10 @@ static struct pbuf *lpc_low_level_input(struct netif *netif)
|
|||
|
||||
/* Re-queue the pbuf for receive */
|
||||
p->len = origLength;
|
||||
lpc_rxqueue_pbuf(lpc_enetif, p);
|
||||
lpc_rxqueue_pbuf(lpc_enetif, p);
|
||||
|
||||
LWIP_DEBUGF(UDP_LPC_EMAC | LWIP_DBG_TRACE,
|
||||
("lpc_low_level_input: Packet index %d dropped for OOM\n",
|
||||
("lpc_low_level_input: Packet index %"U32_F" dropped for OOM\n",
|
||||
idx));
|
||||
|
||||
#ifdef LOCK_RX_THREAD
|
||||
|
@ -381,7 +381,7 @@ static struct pbuf *lpc_low_level_input(struct netif *netif)
|
|||
}
|
||||
|
||||
LWIP_DEBUGF(UDP_LPC_EMAC | LWIP_DBG_TRACE,
|
||||
("lpc_low_level_input: Packet received: %p, size %d (index=%d)\n",
|
||||
("lpc_low_level_input: Packet received: %p, size %"U32_F" (index=%"U32_F")\n",
|
||||
p, length, idx));
|
||||
|
||||
/* Save size */
|
||||
|
@ -479,7 +479,7 @@ static void lpc_tx_reclaim_st(struct lpc_enetdata *lpc_enetif, u32_t cidx)
|
|||
while (cidx != lpc_enetif->lpc_last_tx_idx) {
|
||||
if (lpc_enetif->txb[lpc_enetif->lpc_last_tx_idx] != NULL) {
|
||||
LWIP_DEBUGF(UDP_LPC_EMAC | LWIP_DBG_TRACE,
|
||||
("lpc_tx_reclaim_st: Freeing packet %p (index %d)\n",
|
||||
("lpc_tx_reclaim_st: Freeing packet %p (index %"U32_F")\n",
|
||||
lpc_enetif->txb[lpc_enetif->lpc_last_tx_idx],
|
||||
lpc_enetif->lpc_last_tx_idx));
|
||||
pbuf_free(lpc_enetif->txb[lpc_enetif->lpc_last_tx_idx]);
|
||||
|
@ -646,8 +646,8 @@ static err_t lpc_low_level_output(struct netif *netif, struct pbuf *p)
|
|||
}
|
||||
|
||||
LWIP_DEBUGF(UDP_LPC_EMAC | LWIP_DBG_TRACE,
|
||||
("lpc_low_level_output: pbuf packet(%p) sent, chain#=%d,"
|
||||
" size = %d (index=%d)\n", q->payload, dn, q->len, idx));
|
||||
("lpc_low_level_output: pbuf packet(%p) sent, chain#=%"S32_F","
|
||||
" size = %d (index=%"U32_F")\n", q->payload, dn, q->len, idx));
|
||||
|
||||
lpc_enetif->ptxd[idx].packet = (u32_t) q->payload;
|
||||
|
||||
|
|
|
@ -108,7 +108,7 @@
|
|||
|
||||
// Thread stack size for private PPP thread
|
||||
#ifndef MBED_CONF_LWIP_PPP_THREAD_STACKSIZE
|
||||
#define MBED_CONF_LWIP_PPP_THREAD_STACKSIZE 512
|
||||
#define MBED_CONF_LWIP_PPP_THREAD_STACKSIZE 768
|
||||
#endif
|
||||
|
||||
#if LWIP_DEBUG
|
||||
|
|
|
@ -68,7 +68,7 @@
|
|||
},
|
||||
"ppp-thread-stacksize": {
|
||||
"help": "Thread stack size for PPP",
|
||||
"value": 512
|
||||
"value": 768
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -71,6 +71,61 @@ static int fat_error_remap(FRESULT res)
|
|||
}
|
||||
}
|
||||
|
||||
// Helper class for deferring operations when variable falls out of scope
|
||||
template <typename T>
|
||||
class Deferred {
|
||||
public:
|
||||
T _t;
|
||||
Callback<void(T)> _ondefer;
|
||||
|
||||
Deferred(const Deferred&);
|
||||
Deferred &operator=(const Deferred&);
|
||||
|
||||
public:
|
||||
Deferred(T t, Callback<void(T)> ondefer = NULL)
|
||||
: _t(t), _ondefer(ondefer)
|
||||
{
|
||||
}
|
||||
|
||||
operator T()
|
||||
{
|
||||
return _t;
|
||||
}
|
||||
|
||||
~Deferred()
|
||||
{
|
||||
if (_ondefer) {
|
||||
_ondefer(_t);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
static void dodelete(const char *data)
|
||||
{
|
||||
delete[] data;
|
||||
}
|
||||
|
||||
// Adds prefix needed internally by fatfs, this can be avoided for the first fatfs
|
||||
// (id 0) otherwise a prefix of "id:/" is inserted in front of the string.
|
||||
static Deferred<const char*> fat_path_prefix(int id, const char *path)
|
||||
{
|
||||
// We can avoid dynamic allocation when only on fatfs is in use
|
||||
if (id == 0) {
|
||||
return path;
|
||||
}
|
||||
|
||||
// Prefix path with id, will look something like 2:/hi/hello/filehere.txt
|
||||
char *buffer = new char[strlen("0:/") + strlen(path) + 1];
|
||||
if (!buffer) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
buffer[0] = '0' + id;
|
||||
buffer[1] = ':';
|
||||
buffer[2] = '/';
|
||||
strcpy(buffer + strlen("0:/"), path);
|
||||
return Deferred<const char*>(buffer, dodelete);
|
||||
}
|
||||
|
||||
|
||||
////// Disk operations //////
|
||||
|
@ -164,8 +219,8 @@ DRESULT disk_ioctl(BYTE pdrv, BYTE cmd, void *buff)
|
|||
if (_ffs[pdrv] == NULL) {
|
||||
return RES_NOTRDY;
|
||||
} else {
|
||||
DWORD size = _ffs[pdrv]->get_erase_size();
|
||||
*((DWORD*)buff) = size;
|
||||
WORD size = _ffs[pdrv]->get_erase_size();
|
||||
*((WORD*)buff) = size;
|
||||
return RES_OK;
|
||||
}
|
||||
case GET_BLOCK_SIZE:
|
||||
|
@ -263,9 +318,11 @@ int FATFileSystem::format(BlockDevice *bd, int allocation_unit) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
int FATFileSystem::remove(const char *filename) {
|
||||
int FATFileSystem::remove(const char *path) {
|
||||
Deferred<const char*> fpath = fat_path_prefix(_id, path);
|
||||
|
||||
lock();
|
||||
FRESULT res = f_unlink(filename);
|
||||
FRESULT res = f_unlink(fpath);
|
||||
unlock();
|
||||
|
||||
if (res != FR_OK) {
|
||||
|
@ -274,9 +331,12 @@ int FATFileSystem::remove(const char *filename) {
|
|||
return fat_error_remap(res);
|
||||
}
|
||||
|
||||
int FATFileSystem::rename(const char *oldname, const char *newname) {
|
||||
int FATFileSystem::rename(const char *oldpath, const char *newpath) {
|
||||
Deferred<const char*> oldfpath = fat_path_prefix(_id, oldpath);
|
||||
Deferred<const char*> newfpath = fat_path_prefix(_id, newpath);
|
||||
|
||||
lock();
|
||||
FRESULT res = f_rename(oldname, newname);
|
||||
FRESULT res = f_rename(oldfpath, newfpath);
|
||||
unlock();
|
||||
|
||||
if (res != FR_OK) {
|
||||
|
@ -285,9 +345,11 @@ int FATFileSystem::rename(const char *oldname, const char *newname) {
|
|||
return fat_error_remap(res);
|
||||
}
|
||||
|
||||
int FATFileSystem::mkdir(const char *name, mode_t mode) {
|
||||
int FATFileSystem::mkdir(const char *path, mode_t mode) {
|
||||
Deferred<const char*> fpath = fat_path_prefix(_id, path);
|
||||
|
||||
lock();
|
||||
FRESULT res = f_mkdir(name);
|
||||
FRESULT res = f_mkdir(fpath);
|
||||
unlock();
|
||||
|
||||
if (res != FR_OK) {
|
||||
|
@ -296,12 +358,14 @@ int FATFileSystem::mkdir(const char *name, mode_t mode) {
|
|||
return fat_error_remap(res);
|
||||
}
|
||||
|
||||
int FATFileSystem::stat(const char *name, struct stat *st) {
|
||||
int FATFileSystem::stat(const char *path, struct stat *st) {
|
||||
Deferred<const char*> fpath = fat_path_prefix(_id, path);
|
||||
|
||||
lock();
|
||||
FILINFO f;
|
||||
memset(&f, 0, sizeof(f));
|
||||
|
||||
FRESULT res = f_stat(name, &f);
|
||||
FRESULT res = f_stat(fpath, &f);
|
||||
if (res != FR_OK) {
|
||||
unlock();
|
||||
return fat_error_remap(res);
|
||||
|
@ -332,13 +396,10 @@ void FATFileSystem::unlock() {
|
|||
|
||||
////// File operations //////
|
||||
int FATFileSystem::file_open(fs_file_t *file, const char *path, int flags) {
|
||||
debug_if(FFS_DBG, "open(%s) on filesystem [%s], drv [%s]\n", path, getName(), _fsid);
|
||||
debug_if(FFS_DBG, "open(%s) on filesystem [%s], drv [%s]\n", path, getName(), _id);
|
||||
|
||||
FIL *fh = new FIL;
|
||||
char *buffer = new char[strlen(_fsid) + strlen(path) + 3];
|
||||
strcpy(buffer, _fsid);
|
||||
strcat(buffer, "/");
|
||||
strcat(buffer, path);
|
||||
Deferred<const char*> fpath = fat_path_prefix(_id, path);
|
||||
|
||||
/* POSIX flags -> FatFS open mode */
|
||||
BYTE openmode;
|
||||
|
@ -358,12 +419,11 @@ int FATFileSystem::file_open(fs_file_t *file, const char *path, int flags) {
|
|||
}
|
||||
|
||||
lock();
|
||||
FRESULT res = f_open(fh, buffer, openmode);
|
||||
FRESULT res = f_open(fh, fpath, openmode);
|
||||
|
||||
if (res != FR_OK) {
|
||||
unlock();
|
||||
debug_if(FFS_DBG, "f_open('w') failed: %d\n", res);
|
||||
delete[] buffer;
|
||||
delete fh;
|
||||
return fat_error_remap(res);
|
||||
}
|
||||
|
@ -373,7 +433,6 @@ int FATFileSystem::file_open(fs_file_t *file, const char *path, int flags) {
|
|||
}
|
||||
unlock();
|
||||
|
||||
delete[] buffer;
|
||||
*file = fh;
|
||||
return 0;
|
||||
}
|
||||
|
@ -480,9 +539,10 @@ off_t FATFileSystem::file_size(fs_file_t file) {
|
|||
////// Dir operations //////
|
||||
int FATFileSystem::dir_open(fs_dir_t *dir, const char *path) {
|
||||
FATFS_DIR *dh = new FATFS_DIR;
|
||||
Deferred<const char*> fpath = fat_path_prefix(_id, path);
|
||||
|
||||
lock();
|
||||
FRESULT res = f_opendir(dh, path);
|
||||
FRESULT res = f_opendir(dh, fpath);
|
||||
unlock();
|
||||
|
||||
if (res != FR_OK) {
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
/*
|
||||
* mbedtls_device.h
|
||||
*******************************************************************************
|
||||
* Copyright (c) 2017, STMicroelectronics
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
* not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
#ifndef MBEDTLS_DEVICE_H
|
||||
#define MBEDTLS_DEVICE_H
|
||||
|
||||
#define MBEDTLS_AES_ALT
|
||||
|
||||
#endif /* MBEDTLS_DEVICE_H */
|
|
@ -23,22 +23,34 @@
|
|||
|
||||
#if defined(MBEDTLS_AES_ALT)
|
||||
|
||||
#if defined(TARGET_STM32L486xG)
|
||||
//the following defines are provided to maintain compatibility between STM32 families
|
||||
#define __HAL_RCC_CRYP_CLK_ENABLE __HAL_RCC_AES_CLK_ENABLE
|
||||
#define __HAL_RCC_CRYP_FORCE_RESET __HAL_RCC_AES_FORCE_RESET
|
||||
#define __HAL_RCC_CRYP_RELEASE_RESET __HAL_RCC_AES_RELEASE_RESET
|
||||
#define CRYP AES
|
||||
#endif
|
||||
|
||||
static int aes_set_key( mbedtls_aes_context *ctx, const unsigned char *key, unsigned int keybits )
|
||||
{
|
||||
switch( keybits )
|
||||
{
|
||||
switch( keybits ) {
|
||||
case 128:
|
||||
ctx->hcryp_aes.Init.KeySize = CRYP_KEYSIZE_128B;
|
||||
memcpy(ctx->aes_key, key, 16);
|
||||
break;
|
||||
ctx->hcryp_aes.Init.KeySize = CRYP_KEYSIZE_128B;
|
||||
memcpy(ctx->aes_key, key, 16);
|
||||
break;
|
||||
case 192:
|
||||
ctx->hcryp_aes.Init.KeySize = CRYP_KEYSIZE_192B;
|
||||
memcpy(ctx->aes_key, key, 24);
|
||||
break;
|
||||
#if defined (TARGET_STM32L486xG)
|
||||
return(MBEDTLS_ERR_AES_INVALID_KEY_LENGTH);
|
||||
#else
|
||||
ctx->hcryp_aes.Init.KeySize = CRYP_KEYSIZE_192B;
|
||||
memcpy(ctx->aes_key, key, 24);
|
||||
break;
|
||||
#endif
|
||||
|
||||
case 256:
|
||||
ctx->hcryp_aes.Init.KeySize = CRYP_KEYSIZE_256B;
|
||||
memcpy(ctx->aes_key, key, 32);
|
||||
break;
|
||||
ctx->hcryp_aes.Init.KeySize = CRYP_KEYSIZE_256B;
|
||||
memcpy(ctx->aes_key, key, 32);
|
||||
break;
|
||||
default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );
|
||||
}
|
||||
|
||||
|
@ -52,6 +64,9 @@ static int aes_set_key( mbedtls_aes_context *ctx, const unsigned char *key, unsi
|
|||
__HAL_RCC_CRYP_CLK_ENABLE();
|
||||
|
||||
ctx->hcryp_aes.Init.pKey = ctx->aes_key;
|
||||
#if defined (TARGET_STM32L486xG)
|
||||
ctx->hcryp_aes.Init.KeyWriteFlag = CRYP_KEY_WRITE_ENABLE;
|
||||
#endif
|
||||
if (HAL_CRYP_Init(&ctx->hcryp_aes) == HAL_ERROR)
|
||||
return (HAL_ERROR);
|
||||
|
||||
|
@ -62,7 +77,8 @@ static int aes_set_key( mbedtls_aes_context *ctx, const unsigned char *key, unsi
|
|||
}
|
||||
|
||||
/* Implementation that should never be optimized out by the compiler */
|
||||
static void mbedtls_zeroize( void *v, size_t n ) {
|
||||
static void mbedtls_zeroize( void *v, size_t n )
|
||||
{
|
||||
volatile unsigned char *p = (unsigned char*)v; while( n-- ) *p++ = 0;
|
||||
}
|
||||
|
||||
|
@ -114,14 +130,11 @@ int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx,
|
|||
/* allow multi-instance of CRYP use: restore context for CRYP hw module */
|
||||
ctx->hcryp_aes.Instance->CR = ctx->ctx_save_cr;
|
||||
|
||||
if(mode == MBEDTLS_AES_DECRYPT) /* AES decryption */
|
||||
{
|
||||
if(mode == MBEDTLS_AES_DECRYPT) { /* AES decryption */
|
||||
ctx->hcryp_aes.Init.DataType = CRYP_DATATYPE_8B;
|
||||
ctx->hcryp_aes.Init.pKey = ctx->aes_key;
|
||||
mbedtls_aes_decrypt( ctx, input, output );
|
||||
}
|
||||
else /* AES encryption */
|
||||
{
|
||||
} else { /* AES encryption */
|
||||
ctx->hcryp_aes.Init.DataType = CRYP_DATATYPE_8B;
|
||||
ctx->hcryp_aes.Init.pKey = ctx->aes_key;
|
||||
mbedtls_aes_encrypt( ctx, input, output );
|
||||
|
@ -133,6 +146,31 @@ int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx,
|
|||
}
|
||||
|
||||
#if defined(MBEDTLS_CIPHER_MODE_CBC)
|
||||
#if defined (TARGET_STM32L486xG)
|
||||
static int st_hal_cryp_cbc( mbedtls_aes_context *ctx, uint32_t opmode, size_t length,
|
||||
unsigned char iv[16], uint8_t *input, uint8_t *output)
|
||||
{
|
||||
int status = 0;
|
||||
ctx->hcryp_aes.Init.pInitVect = &iv[0]; // used in process, not in the init
|
||||
if ((ctx->hcryp_aes.Init.OperatingMode != opmode) || \
|
||||
(ctx->hcryp_aes.Init.ChainingMode != CRYP_CHAINMODE_AES_CBC) || \
|
||||
(ctx->hcryp_aes.Init.KeyWriteFlag != CRYP_KEY_WRITE_ENABLE)) {
|
||||
|
||||
/* Re-initialize AES IP with proper parameters */
|
||||
if (HAL_CRYP_DeInit(&ctx->hcryp_aes) != HAL_OK)
|
||||
return HAL_ERROR;
|
||||
ctx->hcryp_aes.Init.OperatingMode = opmode;
|
||||
ctx->hcryp_aes.Init.ChainingMode = CRYP_CHAINMODE_AES_CBC;
|
||||
ctx->hcryp_aes.Init.KeyWriteFlag = CRYP_KEY_WRITE_ENABLE;
|
||||
if (HAL_CRYP_Init(&ctx->hcryp_aes) != HAL_OK)
|
||||
return HAL_ERROR;
|
||||
}
|
||||
|
||||
status = HAL_CRYPEx_AES(&ctx->hcryp_aes, input, length, output, 10);
|
||||
|
||||
return status;
|
||||
}
|
||||
#endif /* TARGET_STM32L486xG */
|
||||
|
||||
int mbedtls_aes_crypt_cbc( mbedtls_aes_context *ctx,
|
||||
int mode,
|
||||
|
@ -141,22 +179,24 @@ int mbedtls_aes_crypt_cbc( mbedtls_aes_context *ctx,
|
|||
const unsigned char *input,
|
||||
unsigned char *output )
|
||||
{
|
||||
int status=0;
|
||||
int status = 0;
|
||||
if( length % 16 )
|
||||
return( MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH );
|
||||
|
||||
if( mode == MBEDTLS_AES_DECRYPT )
|
||||
{
|
||||
ctx->hcryp_aes.Init.pInitVect = &iv[0]; // used in process, not in the init
|
||||
|
||||
status = HAL_CRYP_AESCBC_Decrypt(&ctx->hcryp_aes, (uint8_t *)input, length, (uint8_t *)output, 10);
|
||||
#if defined (TARGET_STM32L486xG)
|
||||
if( mode == MBEDTLS_AES_DECRYPT ) {
|
||||
status = st_hal_cryp_cbc(ctx, CRYP_ALGOMODE_KEYDERIVATION_DECRYPT, length, iv, (uint8_t *)input, (uint8_t *)output);
|
||||
} else {
|
||||
status = st_hal_cryp_cbc(ctx, CRYP_ALGOMODE_ENCRYPT, length, iv, (uint8_t *)input, (uint8_t *)output);
|
||||
}
|
||||
else
|
||||
{
|
||||
ctx->hcryp_aes.Init.pInitVect = &iv[0]; // used in process, not in the init
|
||||
|
||||
#else
|
||||
ctx->hcryp_aes.Init.pInitVect = &iv[0];
|
||||
|
||||
if( mode == MBEDTLS_AES_DECRYPT ) {
|
||||
status = HAL_CRYP_AESCBC_Decrypt(&ctx->hcryp_aes, (uint8_t *)input, length, (uint8_t *)output, 10);
|
||||
} else {
|
||||
status = HAL_CRYP_AESCBC_Encrypt(&ctx->hcryp_aes, (uint8_t *)input, length, (uint8_t *)output, 10);
|
||||
}
|
||||
#endif
|
||||
return( status );
|
||||
}
|
||||
#endif /* MBEDTLS_CIPHER_MODE_CBC */
|
||||
|
@ -173,10 +213,8 @@ int mbedtls_aes_crypt_cfb128( mbedtls_aes_context *ctx,
|
|||
int c;
|
||||
size_t n = *iv_off;
|
||||
|
||||
if( mode == MBEDTLS_AES_DECRYPT )
|
||||
{
|
||||
while( length-- )
|
||||
{
|
||||
if( mode == MBEDTLS_AES_DECRYPT ) {
|
||||
while( length-- ) {
|
||||
if( n == 0 )
|
||||
mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
|
||||
|
||||
|
@ -186,11 +224,8 @@ int mbedtls_aes_crypt_cfb128( mbedtls_aes_context *ctx,
|
|||
|
||||
n = ( n + 1 ) & 0x0F;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
while( length-- )
|
||||
{
|
||||
} else {
|
||||
while( length-- ) {
|
||||
if( n == 0 )
|
||||
mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
|
||||
|
||||
|
@ -216,8 +251,7 @@ int mbedtls_aes_crypt_cfb8( mbedtls_aes_context *ctx,
|
|||
unsigned char c;
|
||||
unsigned char ov[17];
|
||||
|
||||
while( length-- )
|
||||
{
|
||||
while( length-- ) {
|
||||
memcpy( ov, iv, 16 );
|
||||
mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );
|
||||
|
||||
|
|
|
@ -39,7 +39,8 @@ int LoWPANNDInterface::connect()
|
|||
// Release mutex before blocking
|
||||
nanostack_unlock();
|
||||
|
||||
int32_t count = connect_semaphore.wait(30000);
|
||||
// wait connection for ever
|
||||
int32_t count = connect_semaphore.wait(osWaitForever);
|
||||
|
||||
if (count <= 0) {
|
||||
return NSAPI_ERROR_DHCP_FAILURE; // sort of...
|
||||
|
@ -124,4 +125,4 @@ bool LoWPANNDInterface::getRouterIpAddress(char *address, int8_t len)
|
|||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,69 @@
|
|||
/* mbed Microcontroller Library
|
||||
* Copyright (c) 2017 ARM Limited
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef MBED_OS_GMD_UT_CONFIG_HEADER_H_
|
||||
#define MBED_OS_GMD_UT_CONFIG_HEADER_H_
|
||||
|
||||
// The number of retries for UDP exchanges
|
||||
#define NUM_UDP_RETRIES 5
|
||||
|
||||
// How long to wait for stuff to travel in the async echo tests
|
||||
#define ASYNC_TEST_WAIT_TIME 10000
|
||||
|
||||
#define TEST_DATA "_____0000:0123456789012345678901234567890123456789" \
|
||||
"01234567890123456789012345678901234567890123456789" \
|
||||
"_____0100:0123456789012345678901234567890123456789" \
|
||||
"01234567890123456789012345678901234567890123456789" \
|
||||
"_____0200:0123456789012345678901234567890123456789" \
|
||||
"01234567890123456789012345678901234567890123456789" \
|
||||
"_____0300:0123456789012345678901234567890123456789" \
|
||||
"01234567890123456789012345678901234567890123456789" \
|
||||
"_____0400:0123456789012345678901234567890123456789" \
|
||||
"01234567890123456789012345678901234567890123456789" \
|
||||
"_____0500:0123456789012345678901234567890123456789" \
|
||||
"01234567890123456789012345678901234567890123456789" \
|
||||
"_____0600:0123456789012345678901234567890123456789" \
|
||||
"01234567890123456789012345678901234567890123456789" \
|
||||
"_____0700:0123456789012345678901234567890123456789" \
|
||||
"01234567890123456789012345678901234567890123456789" \
|
||||
"_____0800:0123456789012345678901234567890123456789" \
|
||||
"01234567890123456789012345678901234567890123456789" \
|
||||
"_____0900:0123456789012345678901234567890123456789" \
|
||||
"01234567890123456789012345678901234567890123456789" \
|
||||
"_____1000:0123456789012345678901234567890123456789" \
|
||||
"01234567890123456789012345678901234567890123456789" \
|
||||
"_____1100:0123456789012345678901234567890123456789" \
|
||||
"01234567890123456789012345678901234567890123456789" \
|
||||
"_____1200:0123456789012345678901234567890123456789" \
|
||||
"01234567890123456789012345678901234567890123456789" \
|
||||
"_____1300:0123456789012345678901234567890123456789" \
|
||||
"01234567890123456789012345678901234567890123456789" \
|
||||
"_____1400:0123456789012345678901234567890123456789" \
|
||||
"01234567890123456789012345678901234567890123456789" \
|
||||
"_____1500:0123456789012345678901234567890123456789" \
|
||||
"01234567890123456789012345678901234567890123456789" \
|
||||
"_____1600:0123456789012345678901234567890123456789" \
|
||||
"01234567890123456789012345678901234567890123456789" \
|
||||
"_____1700:0123456789012345678901234567890123456789" \
|
||||
"01234567890123456789012345678901234567890123456789" \
|
||||
"_____1800:0123456789012345678901234567890123456789" \
|
||||
"01234567890123456789012345678901234567890123456789" \
|
||||
"_____1900:0123456789012345678901234567890123456789" \
|
||||
"01234567890123456789012345678901234567890123456789" \
|
||||
"_____2000:0123456789012345678901234567890123456789" \
|
||||
"01234567890123456789012345678901234567890123456789";
|
||||
|
||||
#endif /* MBED_OS_GMD_UT_CONFIG_HEADER_H_ */
|
|
@ -0,0 +1,440 @@
|
|||
/* mbed Microcontroller Library
|
||||
* Copyright (c) 2017 ARM Limited
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#if !MODEM_ON_BOARD
|
||||
#error [NOT_SUPPORTED] MODEM_ON_BOARD should be set for this test to be functional
|
||||
#endif
|
||||
|
||||
#include "mbed.h"
|
||||
#include "gmd_ut_config_header.h"
|
||||
#include "greentea-client/test_env.h"
|
||||
#include "unity.h"
|
||||
#include "utest.h"
|
||||
//Add your driver's header file here
|
||||
#include "OnboardCellularInterface.h"
|
||||
#include "UDPSocket.h"
|
||||
#include "TCPSocket.h"
|
||||
#if defined(FEATURE_COMMON_PAL)
|
||||
#include "mbed_trace.h"
|
||||
#define TRACE_GROUP "TEST"
|
||||
#else
|
||||
#define tr_debug(...) (void(0)) //dummies if feature common pal is not added
|
||||
#define tr_info(...) (void(0)) //dummies if feature common pal is not added
|
||||
#define tr_error(...) (void(0)) //dummies if feature common pal is not added
|
||||
#endif //defined(FEATURE_COMMON_PAL)
|
||||
|
||||
using namespace utest::v1;
|
||||
|
||||
#if !defined(MBED_CONF_APP_DEFAULT_PIN)
|
||||
#error [NOT_SUPPORTED] A json configuration file is needed. Skipping this build.
|
||||
#endif
|
||||
|
||||
/** How to run port verification tests
|
||||
*
|
||||
* i) Copy this file in your implementation directory
|
||||
* e.g., netsocket/cellular/YOUR_IMPLEMENTATION/TESTS/unit_tests/default/
|
||||
* ii) Rename OnboardCellularInterface everywhere in this file with your Class
|
||||
* iii) Make an empty test application with the fork of mbed-os where your implementation resides
|
||||
* iv) Create a json file in the root directory of your application and copy the contents of
|
||||
* template_mbed_app.txt into it
|
||||
* v) Now from the root of your application, enter this command:
|
||||
* mbed test --compile-list
|
||||
* Look for the name of of your test suite matching to the directory path
|
||||
* vi) Run tests with the command:
|
||||
* mbed test -n YOUR_TEST_SUITE_NAME
|
||||
*
|
||||
* For more information on mbed-greentea testing suite, please visit:
|
||||
* https://docs.mbed.com/docs/mbed-os-handbook/en/latest/advanced/greentea/
|
||||
*/
|
||||
|
||||
// Lock for debug prints
|
||||
static Mutex mtx;
|
||||
|
||||
// An instance of the cellular driver
|
||||
// change this with the name of your driver
|
||||
static OnboardCellularInterface driver(true);
|
||||
|
||||
// Test data
|
||||
static const char test_data[] = TEST_DATA;
|
||||
|
||||
//Private Function prototypes
|
||||
static nsapi_error_t do_connect(OnboardCellularInterface *iface);
|
||||
static int fix(int size, int limit);
|
||||
static void do_udp_echo(UDPSocket *sock, SocketAddress *host_address, int size);
|
||||
static int send_all(TCPSocket *sock, const char *data, int size);
|
||||
static void async_cb(bool *callback_triggered);
|
||||
static void do_tcp_echo_async(TCPSocket *sock, int size, bool *callback_triggered);
|
||||
static void use_connection(OnboardCellularInterface *driver);
|
||||
static void drop_connection(OnboardCellularInterface *driver);
|
||||
static void lock();
|
||||
static void unlock();
|
||||
|
||||
/*
|
||||
* Verification tests for a successful porting
|
||||
* These tests must pass:
|
||||
*
|
||||
* test_udp_echo()
|
||||
* test_tcp_echo_async
|
||||
* test_connect_credentials
|
||||
* test_connect_preset_credentials
|
||||
*/
|
||||
|
||||
/**
|
||||
* Test UDP data exchange
|
||||
*/
|
||||
void test_udp_echo()
|
||||
{
|
||||
UDPSocket sock;
|
||||
SocketAddress host_address;
|
||||
int x;
|
||||
int size;
|
||||
|
||||
driver.disconnect();
|
||||
TEST_ASSERT(do_connect(&driver) == 0);
|
||||
|
||||
TEST_ASSERT(driver.gethostbyname(MBED_CONF_APP_ECHO_SERVER, &host_address) == 0);
|
||||
host_address.set_port(MBED_CONF_APP_ECHO_UDP_PORT);
|
||||
|
||||
tr_debug("UDP: Server %s address: %s on port %d.",
|
||||
MBED_CONF_APP_ECHO_SERVER, host_address.get_ip_address(),
|
||||
host_address.get_port());
|
||||
|
||||
TEST_ASSERT(sock.open(&driver) == 0)
|
||||
|
||||
sock.set_timeout(10000);
|
||||
|
||||
// Test min, max, and some random sizes in-between
|
||||
do_udp_echo(&sock, &host_address, 1);
|
||||
do_udp_echo(&sock, &host_address, MBED_CONF_APP_UDP_MAX_PACKET_SIZE);
|
||||
for (x = 0; x < 10; x++) {
|
||||
size = (rand() % MBED_CONF_APP_UDP_MAX_PACKET_SIZE) + 1;
|
||||
size = fix(size, MBED_CONF_APP_UDP_MAX_PACKET_SIZE + 1);
|
||||
do_udp_echo(&sock, &host_address, size);
|
||||
}
|
||||
|
||||
sock.close();
|
||||
|
||||
drop_connection(&driver);
|
||||
|
||||
tr_debug("%d UDP packets of size up to %d byte(s) echoed successfully.", x,
|
||||
MBED_CONF_APP_UDP_MAX_PACKET_SIZE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test TCP data exchange via the asynchronous sigio() mechanism
|
||||
*/
|
||||
void test_tcp_echo_async()
|
||||
{
|
||||
TCPSocket sock;
|
||||
SocketAddress host_address;
|
||||
bool callback_triggered = false;
|
||||
int x;
|
||||
int size;
|
||||
|
||||
driver.disconnect();
|
||||
TEST_ASSERT(do_connect(&driver) == 0);
|
||||
|
||||
TEST_ASSERT(
|
||||
driver.gethostbyname(MBED_CONF_APP_ECHO_SERVER, &host_address) == 0);
|
||||
host_address.set_port(MBED_CONF_APP_ECHO_TCP_PORT);
|
||||
|
||||
tr_debug("TCP: Server %s address: %s on port %d.",
|
||||
MBED_CONF_APP_ECHO_SERVER, host_address.get_ip_address(),
|
||||
host_address.get_port());
|
||||
|
||||
TEST_ASSERT(sock.open(&driver) == 0)
|
||||
|
||||
// Set up the async callback and set the timeout to zero
|
||||
sock.sigio(callback(async_cb, &callback_triggered));
|
||||
sock.set_timeout(0);
|
||||
|
||||
TEST_ASSERT(sock.connect(host_address) == 0);
|
||||
// Test min, max, and some random sizes in-between
|
||||
do_tcp_echo_async(&sock, 1, &callback_triggered);
|
||||
do_tcp_echo_async(&sock, MBED_CONF_APP_TCP_MAX_PACKET_SIZE,
|
||||
&callback_triggered);
|
||||
|
||||
sock.close();
|
||||
|
||||
drop_connection(&driver);
|
||||
|
||||
tr_debug("TCP packets of size up to %d byte(s) echoed asynchronously and successfully.",
|
||||
MBED_CONF_APP_TCP_MAX_PACKET_SIZE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Connect with credentials included in the connect request
|
||||
*/
|
||||
void test_connect_credentials()
|
||||
{
|
||||
|
||||
driver.disconnect();
|
||||
|
||||
TEST_ASSERT(do_connect(&driver) == 0);
|
||||
use_connection(&driver);
|
||||
drop_connection(&driver);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test with credentials preset
|
||||
*/
|
||||
void test_connect_preset_credentials()
|
||||
{
|
||||
driver.disconnect();
|
||||
driver.set_sim_pin(MBED_CONF_APP_DEFAULT_PIN);
|
||||
driver.set_credentials(MBED_CONF_APP_APN, MBED_CONF_APP_USERNAME,
|
||||
MBED_CONF_APP_PASSWORD);
|
||||
int num_retries = 0;
|
||||
nsapi_error_t err = NSAPI_ERROR_OK;
|
||||
while (!driver.is_connected()) {
|
||||
err = driver.connect();
|
||||
if (err == NSAPI_ERROR_OK || num_retries > MBED_CONF_APP_MAX_RETRIES) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
TEST_ASSERT(err == 0);
|
||||
use_connection(&driver);
|
||||
drop_connection(&driver);
|
||||
}
|
||||
|
||||
/**
|
||||
* Setup Test Environment
|
||||
*/
|
||||
utest::v1::status_t test_setup(const size_t number_of_cases)
|
||||
{
|
||||
// Setup Greentea with a timeout
|
||||
GREENTEA_SETUP(600, "default_auto");
|
||||
return verbose_test_setup_handler(number_of_cases);
|
||||
}
|
||||
|
||||
/**
|
||||
* Array defining test cases
|
||||
*/
|
||||
Case cases[] = { Case("UDP echo test", test_udp_echo),
|
||||
#if MBED_CONF_LWIP_TCP_ENABLED
|
||||
Case("TCP async echo test", test_tcp_echo_async),
|
||||
#endif
|
||||
Case("Connect with credentials", test_connect_credentials),
|
||||
Case("Connect with preset credentials", test_connect_preset_credentials) };
|
||||
|
||||
Specification specification(test_setup, cases);
|
||||
|
||||
/**
|
||||
* main test harness
|
||||
*/
|
||||
int main()
|
||||
{
|
||||
mbed_trace_init();
|
||||
|
||||
mbed_trace_mutex_wait_function_set(lock);
|
||||
mbed_trace_mutex_release_function_set(unlock);
|
||||
|
||||
// Run tests
|
||||
return !Harness::run(specification);
|
||||
}
|
||||
/**
|
||||
* connect to the network
|
||||
*/
|
||||
static nsapi_error_t do_connect(OnboardCellularInterface *iface)
|
||||
{
|
||||
int num_retries = 0;
|
||||
nsapi_error_t err = NSAPI_ERROR_OK;
|
||||
while (!iface->is_connected()) {
|
||||
err = driver.connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN,
|
||||
MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD);
|
||||
if (err == NSAPI_ERROR_OK || num_retries > MBED_CONF_APP_MAX_RETRIES) {
|
||||
break;
|
||||
}
|
||||
num_retries++;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a random size for the test packet
|
||||
*/
|
||||
static int fix(int size, int limit)
|
||||
{
|
||||
if (size <= 0) {
|
||||
size = limit / 2;
|
||||
} else if (size > limit) {
|
||||
size = limit;
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
||||
/**
|
||||
* Do a UDP socket echo test to a given host of a given packet size
|
||||
*/
|
||||
static void do_udp_echo(UDPSocket *sock, SocketAddress *host_address, int size)
|
||||
{
|
||||
bool success = false;
|
||||
void * recv_data = malloc(size);
|
||||
TEST_ASSERT(recv_data != NULL);
|
||||
|
||||
// Retry this a few times, don't want to fail due to a flaky link
|
||||
for (int x = 0; !success && (x < NUM_UDP_RETRIES); x++) {
|
||||
tr_debug("Echo testing UDP packet size %d byte(s), try %d.", size, x + 1);
|
||||
if ((sock->sendto(*host_address, (void*) test_data, size) == size)
|
||||
&& (sock->recvfrom(host_address, recv_data, size) == size)) {
|
||||
TEST_ASSERT(memcmp(test_data, recv_data, size) == 0);
|
||||
success = true;
|
||||
}
|
||||
}
|
||||
TEST_ASSERT(success);
|
||||
|
||||
free(recv_data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send an entire TCP data buffer until done
|
||||
*/
|
||||
static int send_all(TCPSocket *sock, const char *data, int size)
|
||||
{
|
||||
int x;
|
||||
int count = 0;
|
||||
Timer timer;
|
||||
|
||||
timer.start();
|
||||
while ((count < size) && (timer.read_ms() < ASYNC_TEST_WAIT_TIME)) {
|
||||
x = sock->send(data + count, size - count);
|
||||
if (x > 0) {
|
||||
count += x;
|
||||
tr_debug("%d byte(s) sent, %d left to send.", count, size - count);
|
||||
}
|
||||
wait_ms(10);
|
||||
}
|
||||
timer.stop();
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
/**
|
||||
* The asynchronous callback
|
||||
*/
|
||||
static void async_cb(bool *callback_triggered)
|
||||
{
|
||||
|
||||
TEST_ASSERT(callback_triggered != NULL);
|
||||
*callback_triggered = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Do a TCP echo using the asynchronous driver
|
||||
*/
|
||||
static void do_tcp_echo_async(TCPSocket *sock, int size,
|
||||
bool *callback_triggered)
|
||||
{
|
||||
void * recv_data = malloc(size);
|
||||
int recv_size = 0;
|
||||
int remaining_size;
|
||||
int x, y;
|
||||
Timer timer;
|
||||
TEST_ASSERT(recv_data != NULL);
|
||||
|
||||
*callback_triggered = false;
|
||||
tr_debug("Echo testing TCP packet size %d byte(s) async.", size);
|
||||
TEST_ASSERT(send_all(sock, test_data, size) == size);
|
||||
// Wait for all the echoed data to arrive
|
||||
timer.start();
|
||||
remaining_size = size;
|
||||
while ((recv_size < size) && (timer.read_ms() < ASYNC_TEST_WAIT_TIME)) {
|
||||
if (*callback_triggered) {
|
||||
*callback_triggered = false;
|
||||
x = sock->recv((char *) recv_data + recv_size, remaining_size);
|
||||
if (x > 0) {
|
||||
recv_size += x;
|
||||
remaining_size = size - recv_size;
|
||||
tr_debug("%d byte(s) echoed back so far, %d to go.", recv_size,
|
||||
remaining_size);
|
||||
}
|
||||
}
|
||||
wait_ms(10);
|
||||
}
|
||||
TEST_ASSERT(recv_size == size);
|
||||
y = memcmp(test_data, recv_data, size);
|
||||
if (y != 0) {
|
||||
tr_debug("Sent %d, |%*.*s|", size, size, size, test_data);
|
||||
tr_debug("Rcvd %d, |%*.*s|", size, size, size, (char * ) recv_data);
|
||||
// We do not assert a failure here because ublox TCP echo server doesn't send
|
||||
// back original data. It actually constructs a ublox message string. They need to fix it as
|
||||
// at the minute in case of TCP, their server is not behaving like a echo TCP server.
|
||||
//TEST_ASSERT(false);
|
||||
}
|
||||
timer.stop();
|
||||
free(recv_data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Use a connection, checking that it is good
|
||||
* Checks via doing an NTP transaction
|
||||
*/
|
||||
static void use_connection(OnboardCellularInterface *driver)
|
||||
{
|
||||
const char * ip_address = driver->get_ip_address();
|
||||
const char * net_mask = driver->get_netmask();
|
||||
const char * gateway = driver->get_gateway();
|
||||
|
||||
TEST_ASSERT(driver->is_connected());
|
||||
|
||||
TEST_ASSERT(ip_address != NULL);
|
||||
tr_debug("IP address %s.", ip_address);
|
||||
TEST_ASSERT(net_mask != NULL);
|
||||
tr_debug("Net mask %s.", net_mask);
|
||||
TEST_ASSERT(gateway != NULL);
|
||||
tr_debug("Gateway %s.", gateway);
|
||||
|
||||
UDPSocket sock;
|
||||
SocketAddress host_address;
|
||||
|
||||
TEST_ASSERT(driver->gethostbyname(MBED_CONF_APP_ECHO_SERVER, &host_address) == 0);
|
||||
host_address.set_port(MBED_CONF_APP_ECHO_UDP_PORT);
|
||||
|
||||
tr_debug("UDP: Server %s address: %s on port %d.",
|
||||
MBED_CONF_APP_ECHO_SERVER, host_address.get_ip_address(),
|
||||
host_address.get_port());
|
||||
|
||||
TEST_ASSERT(sock.open(driver) == 0)
|
||||
|
||||
sock.set_timeout(10000);
|
||||
do_udp_echo(&sock, &host_address, 1);
|
||||
|
||||
sock.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Drop a connection and check that it has dropped
|
||||
*/
|
||||
static void drop_connection(OnboardCellularInterface *driver)
|
||||
{
|
||||
TEST_ASSERT(driver->disconnect() == 0);
|
||||
TEST_ASSERT(!driver->is_connected());
|
||||
}
|
||||
|
||||
/**
|
||||
* Locks for debug prints
|
||||
*/
|
||||
static void lock()
|
||||
{
|
||||
mtx.lock();
|
||||
}
|
||||
|
||||
static void unlock()
|
||||
{
|
||||
mtx.unlock();
|
||||
}
|
|
@ -0,0 +1,69 @@
|
|||
{
|
||||
"config": {
|
||||
"platform": {
|
||||
"help": "The platform for the cellular feature, e.g. UBLOX or MTS_DRAGONFLY",
|
||||
"value": "UBLOX"
|
||||
},
|
||||
"max-retries": {
|
||||
"help": "Network can be intermittent, number of retries before giving up",
|
||||
"value": 3
|
||||
},
|
||||
"default-pin": {
|
||||
"help": "The current value of the SIM PIN as a string",
|
||||
"value": "\"1234\""
|
||||
},
|
||||
"apn": {
|
||||
"help": "The APN string to use for this SIM/network, set to 0 if none",
|
||||
"value": "\"internet\""
|
||||
},
|
||||
"username": {
|
||||
"help": "The user name string to use for this APN, set to zero if none",
|
||||
"value": 0
|
||||
},
|
||||
"password": {
|
||||
"help": "The password string to use for this APN, set to 0 if none",
|
||||
"value": 0
|
||||
},
|
||||
"echo-server": {
|
||||
"help": "The URL string of the UDP/TCP echo server to use during testing",
|
||||
"value": "\"echo.u-blox.com\""
|
||||
},
|
||||
"echo-udp-port": {
|
||||
"help": "The port to connect to on echo-server for UDP testing",
|
||||
"value": 7
|
||||
},
|
||||
"echo-tcp-port": {
|
||||
"help": "The port to connect to on echo-server for TCP testing",
|
||||
"value": 7
|
||||
},
|
||||
"ntp-server": {
|
||||
"help": "The URL string of the NTP server to use during testing",
|
||||
"value": "\"2.pool.ntp.org\""
|
||||
},
|
||||
"ntp-port": {
|
||||
"help": "The port to connect to on ntp-server",
|
||||
"value": 123
|
||||
},
|
||||
"udp-max-packet-size": {
|
||||
"help": "The maximum UDP packet size to use",
|
||||
"value": 508
|
||||
},
|
||||
"tcp-max-packet-size": {
|
||||
"help": "The maximum TCP packet size to use",
|
||||
"value": 1500
|
||||
}
|
||||
},
|
||||
"target_overrides": {
|
||||
"*": {
|
||||
"lwip.ipv4-enabled": true,
|
||||
"lwip.ethernet-enabled": false,
|
||||
"lwip.ppp-enabled": true,
|
||||
"lwip.tcp-enabled": true,
|
||||
"target.features_add": ["LWIP", "COMMON_PAL"],
|
||||
"platform.stdio-convert-newlines": true,
|
||||
"platform.stdio-baud-rate": 115200,
|
||||
"platform.default-serial-baud-rate": 115200,
|
||||
"mbed-trace.enable": 1
|
||||
}
|
||||
}
|
||||
}
|
|
@ -2392,7 +2392,7 @@ static int32_t cfstore_delete_ex(cfstore_area_hkvt_t* hkvt)
|
|||
memset(ctx->area_0_tail-kv_size, 0, kv_size);
|
||||
|
||||
/* The KV area has shrunk so a negative size_diff should be indicated to cfstore_file_update(). */
|
||||
ret = cfstore_file_update(hkvt->head, -1 * kv_size);
|
||||
ret = cfstore_file_update(hkvt->head, -1 *(int32_t)kv_size);
|
||||
if(ret < ARM_DRIVER_OK){
|
||||
CFSTORE_ERRLOG("%s:Error:file update failed\n", __func__);
|
||||
goto out0;
|
||||
|
|
|
@ -42,14 +42,14 @@ extern "C" {
|
|||
*/
|
||||
|
||||
/** Initialize the flash peripheral and the flash_t object
|
||||
*
|
||||
*
|
||||
* @param obj The flash object
|
||||
* @return 0 for success, -1 for error
|
||||
*/
|
||||
int32_t flash_init(flash_t *obj);
|
||||
|
||||
/** Uninitialize the flash peripheral and the flash_t object
|
||||
*
|
||||
*
|
||||
* @param obj The flash object
|
||||
* @return 0 for success, -1 for error
|
||||
*/
|
||||
|
@ -64,9 +64,20 @@ int32_t flash_free(flash_t *obj);
|
|||
*/
|
||||
int32_t flash_erase_sector(flash_t *obj, uint32_t address);
|
||||
|
||||
/** Read data starting at defined address
|
||||
*
|
||||
* This function has a WEAK implementation using memcpy for backwards compatibility.
|
||||
* @param obj The flash object
|
||||
* @param address Address to begin reading from
|
||||
* @param data The buffer to read data into
|
||||
* @param size The number of bytes to read
|
||||
* @return 0 for success, -1 for error
|
||||
*/
|
||||
int32_t flash_read(flash_t *obj, uint32_t address, uint8_t *data, uint32_t size);
|
||||
|
||||
/** Program one page starting at defined address
|
||||
*
|
||||
* The page should be at page boundary, should not cross multiple sectors.
|
||||
*
|
||||
* The page should be at page boundary, should not cross multiple sectors.
|
||||
* This function does not do any check for address alignments or if size is aligned to a page size.
|
||||
* @param obj The flash object
|
||||
* @param address The sector starting address
|
||||
|
@ -77,7 +88,7 @@ int32_t flash_erase_sector(flash_t *obj, uint32_t address);
|
|||
int32_t flash_program_page(flash_t *obj, uint32_t address, const uint8_t *data, uint32_t size);
|
||||
|
||||
/** Get sector size
|
||||
*
|
||||
*
|
||||
* @param obj The flash object
|
||||
* @param address The sector starting address
|
||||
* @return The size of a sector
|
||||
|
@ -85,7 +96,7 @@ int32_t flash_program_page(flash_t *obj, uint32_t address, const uint8_t *data,
|
|||
uint32_t flash_get_sector_size(const flash_t *obj, uint32_t address);
|
||||
|
||||
/** Get page size
|
||||
*
|
||||
*
|
||||
* @param obj The flash object
|
||||
* @param address The page starting address
|
||||
* @return The size of a page
|
||||
|
@ -93,14 +104,14 @@ uint32_t flash_get_sector_size(const flash_t *obj, uint32_t address);
|
|||
uint32_t flash_get_page_size(const flash_t *obj);
|
||||
|
||||
/** Get start address for the flash region
|
||||
*
|
||||
*
|
||||
* @param obj The flash object
|
||||
* @return The start address for the flash region
|
||||
*/
|
||||
uint32_t flash_get_start_address(const flash_t *obj);
|
||||
|
||||
/** Get the flash region size
|
||||
*
|
||||
*
|
||||
* @param obj The flash object
|
||||
* @return The flash region size
|
||||
*/
|
||||
|
|
|
@ -0,0 +1,30 @@
|
|||
/* mbed Microcontroller Library
|
||||
* Copyright (c) 2017 ARM Limited
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include "hal/flash_api.h"
|
||||
|
||||
#if DEVICE_FLASH
|
||||
|
||||
#include "platform/mbed_toolchain.h"
|
||||
#include <string.h>
|
||||
|
||||
MBED_WEAK int32_t flash_read(flash_t *obj, uint32_t address, uint8_t *data, uint32_t size)
|
||||
{
|
||||
memcpy(data, (const void *)address, size);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
4
mbed.h
4
mbed.h
|
@ -16,13 +16,13 @@
|
|||
#ifndef MBED_H
|
||||
#define MBED_H
|
||||
|
||||
#define MBED_LIBRARY_VERSION 146
|
||||
#define MBED_LIBRARY_VERSION 147
|
||||
|
||||
#if MBED_CONF_RTOS_PRESENT
|
||||
// RTOS present, this is valid only for mbed OS 5
|
||||
#define MBED_MAJOR_VERSION 5
|
||||
#define MBED_MINOR_VERSION 5
|
||||
#define MBED_PATCH_VERSION 2
|
||||
#define MBED_PATCH_VERSION 3
|
||||
|
||||
#else
|
||||
// mbed 2
|
||||
|
|
|
@ -105,7 +105,7 @@ time_t _rtc_mktime(const struct tm* time) {
|
|||
}
|
||||
|
||||
if (result > INT32_MAX) {
|
||||
return -1;
|
||||
return (time_t) -1;
|
||||
}
|
||||
|
||||
return result;
|
||||
|
|
|
@ -53,7 +53,7 @@ time_t time(time_t *timer)
|
|||
}
|
||||
}
|
||||
|
||||
time_t t = -1;
|
||||
time_t t = (time_t)-1;
|
||||
if (_rtc_read != NULL) {
|
||||
t = _rtc_read();
|
||||
}
|
||||
|
|
|
@ -137,6 +137,27 @@
|
|||
#endif
|
||||
#endif
|
||||
|
||||
/** MBED_NOINLINE
|
||||
* Declare a function that must not be inlined.
|
||||
*
|
||||
* @code
|
||||
* #include "mbed_toolchain.h"
|
||||
*
|
||||
* MBED_NOINLINE void foo() {
|
||||
*
|
||||
* }
|
||||
* @endcode
|
||||
*/
|
||||
#ifndef MBED_NOINLINE
|
||||
#if defined(__GNUC__) || defined(__clang__) || defined(__CC_ARM)
|
||||
#define MBED_NOINLINE __attribute__((noinline))
|
||||
#elif defined(__ICCARM__)
|
||||
#define MBED_NOINLINE _Pragma("inline=never")
|
||||
#else
|
||||
#define MBED_NOINLINE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/** MBED_FORCEINLINE
|
||||
* Declare a function that must always be inlined. Failure to inline
|
||||
* such a function will result in an error.
|
||||
|
|
|
@ -161,10 +161,10 @@ const char *svcRtxMutexGetName (osMutexId_t mutex_id) {
|
|||
/// \note API identical to osMutexAcquire
|
||||
osStatus_t svcRtxMutexAcquire (osMutexId_t mutex_id, uint32_t timeout) {
|
||||
os_mutex_t *mutex = (os_mutex_t *)mutex_id;
|
||||
os_thread_t *runnig_thread;
|
||||
os_thread_t *running_thread;
|
||||
|
||||
runnig_thread = osRtxThreadGetRunning();
|
||||
if (runnig_thread == NULL) {
|
||||
running_thread = osRtxThreadGetRunning();
|
||||
if (running_thread == NULL) {
|
||||
EvrRtxMutexError(mutex, osRtxErrorKernelNotRunning);
|
||||
return osError;
|
||||
}
|
||||
|
@ -184,20 +184,20 @@ osStatus_t svcRtxMutexAcquire (osMutexId_t mutex_id, uint32_t timeout) {
|
|||
// Check if Mutex is not locked
|
||||
if (mutex->lock == 0U) {
|
||||
// Acquire Mutex
|
||||
mutex->owner_thread = runnig_thread;
|
||||
mutex->owner_next = runnig_thread->mutex_list;
|
||||
mutex->owner_thread = running_thread;
|
||||
mutex->owner_next = running_thread->mutex_list;
|
||||
mutex->owner_prev = NULL;
|
||||
if (runnig_thread->mutex_list != NULL) {
|
||||
runnig_thread->mutex_list->owner_prev = mutex;
|
||||
if (running_thread->mutex_list != NULL) {
|
||||
running_thread->mutex_list->owner_prev = mutex;
|
||||
}
|
||||
runnig_thread->mutex_list = mutex;
|
||||
running_thread->mutex_list = mutex;
|
||||
mutex->lock = 1U;
|
||||
EvrRtxMutexAcquired(mutex, mutex->lock);
|
||||
return osOK;
|
||||
}
|
||||
|
||||
// Check if Mutex is recursive and running Thread is the owner
|
||||
if ((mutex->attr & osMutexRecursive) && (mutex->owner_thread == runnig_thread)) {
|
||||
if ((mutex->attr & osMutexRecursive) && (mutex->owner_thread == running_thread)) {
|
||||
// Increment lock counter
|
||||
if (mutex->lock == osRtxMutexLockLimit) {
|
||||
EvrRtxMutexError(mutex, osRtxErrorMutexLockLimit);
|
||||
|
@ -213,14 +213,14 @@ osStatus_t svcRtxMutexAcquire (osMutexId_t mutex_id, uint32_t timeout) {
|
|||
// Check if Priority inheritance protocol is enabled
|
||||
if (mutex->attr & osMutexPrioInherit) {
|
||||
// Raise priority of owner Thread if lower than priority of running Thread
|
||||
if (mutex->owner_thread->priority < runnig_thread->priority) {
|
||||
mutex->owner_thread->priority = runnig_thread->priority;
|
||||
if (mutex->owner_thread->priority < running_thread->priority) {
|
||||
mutex->owner_thread->priority = running_thread->priority;
|
||||
osRtxThreadListSort(mutex->owner_thread);
|
||||
}
|
||||
}
|
||||
EvrRtxMutexAcquirePending(mutex, timeout);
|
||||
// Suspend current Thread
|
||||
osRtxThreadListPut((os_object_t*)mutex, runnig_thread);
|
||||
osRtxThreadListPut((os_object_t*)mutex, running_thread);
|
||||
osRtxThreadWaitEnter(osRtxThreadWaitingMutex, timeout);
|
||||
return osErrorTimeout;
|
||||
}
|
||||
|
@ -237,11 +237,11 @@ osStatus_t svcRtxMutexRelease (osMutexId_t mutex_id) {
|
|||
os_mutex_t *mutex = (os_mutex_t *)mutex_id;
|
||||
os_mutex_t *mutex0;
|
||||
os_thread_t *thread;
|
||||
os_thread_t *runnig_thread;
|
||||
os_thread_t *running_thread;
|
||||
int8_t priority;
|
||||
|
||||
runnig_thread = osRtxThreadGetRunning();
|
||||
if (runnig_thread == NULL) {
|
||||
running_thread = osRtxThreadGetRunning();
|
||||
if (running_thread == NULL) {
|
||||
EvrRtxMutexError(mutex, osRtxErrorKernelNotRunning);
|
||||
return osError;
|
||||
}
|
||||
|
@ -259,7 +259,7 @@ osStatus_t svcRtxMutexRelease (osMutexId_t mutex_id) {
|
|||
}
|
||||
|
||||
// Check if running Thread is not the owner
|
||||
if (mutex->owner_thread != runnig_thread) {
|
||||
if (mutex->owner_thread != running_thread) {
|
||||
EvrRtxMutexError(mutex, osRtxErrorMutexNotOwned);
|
||||
return osErrorResource;
|
||||
}
|
||||
|
@ -286,13 +286,13 @@ osStatus_t svcRtxMutexRelease (osMutexId_t mutex_id) {
|
|||
if (mutex->owner_prev != NULL) {
|
||||
mutex->owner_prev->owner_next = mutex->owner_next;
|
||||
} else {
|
||||
runnig_thread->mutex_list = mutex->owner_next;
|
||||
running_thread->mutex_list = mutex->owner_next;
|
||||
}
|
||||
|
||||
// Restore running Thread priority
|
||||
if (mutex->attr & osMutexPrioInherit) {
|
||||
priority = runnig_thread->priority_base;
|
||||
mutex0 = runnig_thread->mutex_list;
|
||||
priority = running_thread->priority_base;
|
||||
mutex0 = running_thread->mutex_list;
|
||||
while (mutex0) {
|
||||
// Mutexes owned by running Thread
|
||||
if ((mutex0->thread_list != NULL) && (mutex0->thread_list->priority > priority)) {
|
||||
|
@ -301,7 +301,7 @@ osStatus_t svcRtxMutexRelease (osMutexId_t mutex_id) {
|
|||
}
|
||||
mutex0 = mutex0->owner_next;
|
||||
}
|
||||
runnig_thread->priority = priority;
|
||||
running_thread->priority = priority;
|
||||
}
|
||||
|
||||
// Check if Thread is waiting for a Mutex
|
||||
|
|
|
@ -402,7 +402,7 @@ static void (*callFlashCommonBitOperation)(FTFx_REG32_ACCESS_TYPE base,
|
|||
* @endcode
|
||||
* Note2: The binary code is generated by IAR 7.70.1
|
||||
*/
|
||||
const static uint16_t s_flashRunCommandFunctionCode[] = {
|
||||
static const uint16_t s_flashRunCommandFunctionCode[] = {
|
||||
0x2180, /* MOVS R1, #128 ; 0x80 */
|
||||
0x7001, /* STRB R1, [R0] */
|
||||
/* @4: */
|
||||
|
@ -432,7 +432,7 @@ const static uint16_t s_flashRunCommandFunctionCode[] = {
|
|||
* @endcode
|
||||
* Note2: The binary code is generated by IAR 7.70.1
|
||||
*/
|
||||
const static uint16_t s_flashCommonBitOperationFunctionCode[] = {
|
||||
static const uint16_t s_flashCommonBitOperationFunctionCode[] = {
|
||||
0xb510, /* PUSH {R4, LR} */
|
||||
0x2900, /* CMP R1, #0 */
|
||||
0xd005, /* BEQ.N @12 */
|
||||
|
@ -2734,11 +2734,12 @@ void flash_cache_clear(flash_config_t *config)
|
|||
__DSB();
|
||||
#endif /* FLASH_DRIVER_IS_FLASH_RESIDENT */
|
||||
}
|
||||
#if (defined(__GNUC__))
|
||||
/* #pragma GCC pop_options */
|
||||
#else
|
||||
#if (defined(__CC_ARM))
|
||||
#pragma pop
|
||||
#endif
|
||||
#if (defined(__GNUC__))
|
||||
/* #pragma GCC pop_options */
|
||||
#endif
|
||||
|
||||
#if FLASH_DRIVER_IS_FLASH_RESIDENT
|
||||
|
|
|
@ -158,4 +158,4 @@ void DisableDeepSleepIRQ(IRQn_Type interrupt)
|
|||
DisableIRQ(interrupt); /* also disable interrupt at NVIC */
|
||||
/* SYSCON->STARTERCLR[index] = 1u << intNumber; */
|
||||
}
|
||||
#endif /*CPU_QN908X */
|
||||
#endif /*CPU_QN908X */
|
||||
|
|
|
@ -316,9 +316,8 @@ void ENET_Init(ENET_Type *base,
|
|||
assert(bufferConfig->rxBufferAlign);
|
||||
assert(macAddr);
|
||||
|
||||
uint32_t instance = ENET_GetInstance(base);
|
||||
|
||||
#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
|
||||
uint32_t instance = ENET_GetInstance(base);
|
||||
/* Ungate ENET clock. */
|
||||
CLOCK_EnableClock(s_enetClock[instance]);
|
||||
#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
|
||||
|
@ -413,7 +412,7 @@ static void ENET_SetMacController(ENET_Type *base,
|
|||
uint32_t tcr = 0;
|
||||
uint32_t ecr = 0;
|
||||
uint32_t macSpecialConfig = config->macSpecialConfig;
|
||||
uint32_t instance = ENET_GetInstance(base);
|
||||
ENET_GetInstance(base);
|
||||
|
||||
/* Configures MAC receive controller with user configure structure. */
|
||||
rcr = ENET_RCR_NLC(!!(macSpecialConfig & kENET_ControlRxPayloadCheckEnable)) |
|
||||
|
|
|
@ -402,7 +402,7 @@ static void (*callFlashCommonBitOperation)(FTFx_REG32_ACCESS_TYPE base,
|
|||
* @endcode
|
||||
* Note2: The binary code is generated by IAR 7.70.1
|
||||
*/
|
||||
const static uint16_t s_flashRunCommandFunctionCode[] = {
|
||||
static const uint16_t s_flashRunCommandFunctionCode[] = {
|
||||
0x2180, /* MOVS R1, #128 ; 0x80 */
|
||||
0x7001, /* STRB R1, [R0] */
|
||||
/* @4: */
|
||||
|
@ -432,7 +432,7 @@ const static uint16_t s_flashRunCommandFunctionCode[] = {
|
|||
* @endcode
|
||||
* Note2: The binary code is generated by IAR 7.70.1
|
||||
*/
|
||||
const static uint16_t s_flashCommonBitOperationFunctionCode[] = {
|
||||
static const uint16_t s_flashCommonBitOperationFunctionCode[] = {
|
||||
0xb510, /* PUSH {R4, LR} */
|
||||
0x2900, /* CMP R1, #0 */
|
||||
0xd005, /* BEQ.N @12 */
|
||||
|
@ -2734,11 +2734,12 @@ void flash_cache_clear(flash_config_t *config)
|
|||
__DSB();
|
||||
#endif /* FLASH_DRIVER_IS_FLASH_RESIDENT */
|
||||
}
|
||||
#if (defined(__GNUC__))
|
||||
/* #pragma GCC pop_options */
|
||||
#else
|
||||
#if (defined(__CC_ARM))
|
||||
#pragma pop
|
||||
#endif
|
||||
#if (defined(__GNUC__))
|
||||
/* #pragma GCC pop_options */
|
||||
#endif
|
||||
|
||||
#if FLASH_DRIVER_IS_FLASH_RESIDENT
|
||||
|
|
|
@ -28,8 +28,11 @@ void hal_sleep(void)
|
|||
void hal_deepsleep(void)
|
||||
{
|
||||
#if (defined(FSL_FEATURE_SOC_MCG_COUNT) && FSL_FEATURE_SOC_MCG_COUNT)
|
||||
#if defined(kMCG_ModePEE)
|
||||
mcg_mode_t mode = CLOCK_GetMode();
|
||||
#endif
|
||||
#endif
|
||||
|
||||
SMC_SetPowerModeProtection(SMC, kSMC_AllowPowerModeAll);
|
||||
|
||||
SMC_SetPowerModeVlps(SMC);
|
||||
|
|
|
@ -77,7 +77,7 @@ typedef enum {
|
|||
LED1 = NINA_B1_GPIO_1, // Red
|
||||
LED2 = NINA_B1_GPIO_7, // Green/SW1
|
||||
LED3 = NINA_B1_GPIO_8, // Blue
|
||||
LED4 = NC,
|
||||
LED4 = NINA_B1_GPIO_8,
|
||||
SW1 = NINA_B1_GPIO_7,
|
||||
SW2 = NINA_B1_GPIO_18,
|
||||
D0 = NINA_B1_GPIO_23,
|
||||
|
|
|
@ -290,7 +290,9 @@ static void twi_clear_bus(twi_info_t *twi_info)
|
|||
|
||||
void i2c_init(i2c_t *obj, PinName sda, PinName scl)
|
||||
{
|
||||
ret_code_t ret;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < TWI_COUNT; ++i) {
|
||||
if (m_twi_info[i].initialized &&
|
||||
m_twi_info[i].pselsda == (uint32_t)sda &&
|
||||
|
@ -304,6 +306,13 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
|
|||
|
||||
for (i = 0; i < TWI_COUNT; ++i) {
|
||||
if (!m_twi_info[i].initialized) {
|
||||
ret = nrf_drv_common_per_res_acquire(m_twi_instances[i],
|
||||
m_twi_irq_handlers[i]);
|
||||
|
||||
if (ret != NRF_SUCCESS) {
|
||||
continue; /* the hw resource is busy - test another one */
|
||||
}
|
||||
|
||||
TWI_IDX(obj) = i;
|
||||
|
||||
twi_info_t *twi_info = TWI_INFO(obj);
|
||||
|
@ -324,8 +333,6 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
|
|||
i2c_reset(obj);
|
||||
|
||||
#if DEVICE_I2C_ASYNCH
|
||||
nrf_drv_common_per_res_acquire(m_twi_instances[i],
|
||||
m_twi_irq_handlers[i]);
|
||||
NVIC_SetVector(twi_handlers[i].IRQn, twi_handlers[i].vector);
|
||||
nrf_drv_common_irq_enable(twi_handlers[i].IRQn, TWI_IRQ_PRIORITY);
|
||||
#endif
|
||||
|
|
|
@ -277,9 +277,11 @@ void spi_init(spi_t *obj,
|
|||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < SPI_COUNT; ++i) {
|
||||
for (i = SPI_COUNT - 1; i >= 0; i--) {
|
||||
spi_info_t *p_spi_info = &m_spi_info[i];
|
||||
|
||||
if (!p_spi_info->initialized) {
|
||||
|
||||
p_spi_info->sck_pin = (uint8_t)sclk;
|
||||
p_spi_info->mosi_pin = (mosi != NC) ?
|
||||
(uint8_t)mosi : NRF_DRV_SPI_PIN_NOT_USED;
|
||||
|
@ -290,8 +292,6 @@ void spi_init(spi_t *obj,
|
|||
p_spi_info->spi_mode = (uint8_t)NRF_DRV_SPI_MODE_0;
|
||||
p_spi_info->frequency = NRF_DRV_SPI_FREQ_1M;
|
||||
|
||||
NVIC_SetVector(spi_handler_desc[i].IRQn, spi_handler_desc[i].vector);
|
||||
|
||||
// By default each SPI instance is initialized to work as a master.
|
||||
// Should the slave mode be used, the instance will be reconfigured
|
||||
// appropriately in 'spi_format'.
|
||||
|
@ -305,11 +305,11 @@ void spi_init(spi_t *obj,
|
|||
p_spi_info->initialized = true;
|
||||
p_spi_info->master = true;
|
||||
p_spi_info->flag.busy = false;
|
||||
#if DEVICE_SPI_ASYNCH
|
||||
#if DEVICE_SPI_ASYNCH
|
||||
p_spi_info->handler = 0;
|
||||
#endif
|
||||
#endif
|
||||
SPI_IDX(obj) = i;
|
||||
|
||||
NVIC_SetVector(spi_handler_desc[i].IRQn, spi_handler_desc[i].vector);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -303,22 +303,6 @@ static uint32_t os_rtc_period;
|
|||
static uint32_t frozen_sub_tick = 0;
|
||||
|
||||
|
||||
/*
|
||||
RTX provide the following definitions which are used by the tick code:
|
||||
* osRtxConfig.tick_freq: The RTX tick frequency.
|
||||
* osRtxInfo.kernel.tick: Count of RTX ticks.
|
||||
|
||||
* SysTick_Handler: The function which handle a tick event.
|
||||
This function is special because it never returns.
|
||||
Those definitions are used by the code which handle the os tick.
|
||||
To allow compilation of us_ticker programs without RTOS, those symbols are
|
||||
exported from this module as weak ones.
|
||||
*/
|
||||
MBED_WEAK void SysTick_Handler(void)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
#ifdef MBED_CONF_RTOS_PRESENT
|
||||
#include "rtx_os.h" //import osRtxInfo, SysTick_Handler()
|
||||
|
||||
|
|
|
@ -37,6 +37,8 @@
|
|||
#define INITIAL_SP (0x20010000UL)
|
||||
#endif
|
||||
|
||||
#define OS_IDLE_THREAD_STACK_SIZE 512
|
||||
|
||||
#elif defined(TARGET_MCU_NRF52840)
|
||||
|
||||
#ifndef INITIAL_SP
|
||||
|
|
|
@ -38,7 +38,7 @@ static int us_ticker_inited = 0;
|
|||
static void us_timer_init(void);
|
||||
|
||||
static uint32_t us_ticker_target = 0;
|
||||
static volatile uint32_t msb_counter = 0;
|
||||
static volatile uint16_t msb_counter = 0;
|
||||
|
||||
void us_ticker_init(void)
|
||||
{
|
||||
|
@ -55,7 +55,6 @@ void us_ticker_init(void)
|
|||
* which is why a software timer is required to get 32-bit word length.
|
||||
******************************************************************************/
|
||||
/* TODO - Need some sort of load value/prescale calculation for non-32MHz clock */
|
||||
/* TODO - Add msb_counter rollover protection at 16 bits count? */
|
||||
/* TODO - How is overflow handled? */
|
||||
|
||||
/* Timer 0 for free running time */
|
||||
|
@ -108,22 +107,21 @@ static void us_timer_init(void)
|
|||
/* Reads 32 bit timer's current value (16 bit s/w timer | 16 bit h/w timer) */
|
||||
uint32_t us_ticker_read()
|
||||
{
|
||||
uint32_t retval, tim0cval;
|
||||
|
||||
if (!us_ticker_inited) {
|
||||
us_timer_init();
|
||||
}
|
||||
|
||||
NVIC_DisableIRQ(Tim0_IRQn);
|
||||
uint32_t retval, tim0cval;
|
||||
/* Get the current tick from the hw and sw timers */
|
||||
tim0cval = TIM0REG->VALUE; /* read current time */
|
||||
retval = (0xFFFF - tim0cval); /* subtract down count */
|
||||
|
||||
NVIC_DisableIRQ(Tim0_IRQn);
|
||||
if (TIM0REG->CONTROL.BITS.INT) {
|
||||
TIM0REG->CLEAR = 0;
|
||||
msb_counter++;
|
||||
tim0cval = TIM0REG->VALUE; /* read current time again after interrupt */
|
||||
retval = (0xFFFF - tim0cval);
|
||||
us_timer_isr(); /* handle ISR again */
|
||||
NVIC_ClearPendingIRQ(Tim0_IRQn);
|
||||
retval = (0xFFFF - TIM0REG->VALUE);
|
||||
}
|
||||
retval |= msb_counter << 16; /* add software bits */
|
||||
NVIC_EnableIRQ(Tim0_IRQn);
|
||||
|
@ -168,25 +166,21 @@ extern void us_ticker_isr(void)
|
|||
/* Clear IRQ flag */
|
||||
TIM1REG->CLEAR = 0;
|
||||
|
||||
int32_t delta = us_ticker_target - us_ticker_read();
|
||||
if (delta <= 0) {
|
||||
TIM1REG->CONTROL.BITS.ENABLE = False;
|
||||
us_ticker_irq_handler();
|
||||
if (us_ticker_target > 0) {
|
||||
--us_ticker_target;
|
||||
ticker_set(0xFFFF);
|
||||
} else {
|
||||
// Clamp at max value of timer
|
||||
if (delta > 0xFFFF) {
|
||||
delta = 0xFFFF;
|
||||
}
|
||||
|
||||
ticker_set(delta);
|
||||
us_ticker_irq_handler();
|
||||
}
|
||||
}
|
||||
|
||||
/* Set timer 1 ticker interrupt */
|
||||
void us_ticker_set_interrupt(timestamp_t timestamp)
|
||||
{
|
||||
us_ticker_target = (uint32_t)timestamp;
|
||||
int32_t delta = us_ticker_target - us_ticker_read();
|
||||
int32_t delta = timestamp - us_ticker_read();
|
||||
// we got 16 bit timer, use upper 16bit as a simple counter how many times
|
||||
// we need to schedule full range ticker count
|
||||
us_ticker_target = (uint32_t)delta >> 16;
|
||||
|
||||
if (delta <= 0) {
|
||||
/* This event was in the past */
|
||||
|
@ -200,10 +194,6 @@ void us_ticker_set_interrupt(timestamp_t timestamp)
|
|||
return;
|
||||
}
|
||||
|
||||
// Clamp at max value of timer
|
||||
if (delta > 0xFFFF) {
|
||||
delta = 0xFFFF;
|
||||
}
|
||||
|
||||
ticker_set(delta);
|
||||
// we set the full reminder of 16 bit, the next ISR will do the upper part
|
||||
ticker_set(delta & 0xFFFF);
|
||||
}
|
||||
|
|
|
@ -85,12 +85,14 @@ static rtw_result_t scan_result_handler( rtw_scan_handler_result_t* malloced_sca
|
|||
return RTW_SUCCESS;
|
||||
}
|
||||
|
||||
RTWInterface::RTWInterface()
|
||||
RTWInterface::RTWInterface(bool debug)
|
||||
: _dhcp(true), _ip_address(), _netmask(), _gateway()
|
||||
{
|
||||
emac_interface_t *emac;
|
||||
int ret;
|
||||
extern u32 GlobalDebugEnable;
|
||||
|
||||
GlobalDebugEnable = debug?1:0;
|
||||
emac = wlan_emac_init_interface();
|
||||
if (!emac) {
|
||||
printf("Error init RTWInterface!\r\n");
|
||||
|
|
|
@ -34,7 +34,7 @@ class RTWInterface: public WiFiInterface
|
|||
public:
|
||||
/** RTWWlanInterface lifetime
|
||||
*/
|
||||
RTWInterface();
|
||||
RTWInterface(bool debug=false);
|
||||
~RTWInterface();
|
||||
|
||||
/** Set a static IP address
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -28,13 +28,10 @@
|
|||
#include "hal_diag.h"
|
||||
#include "hal_spi_flash.h"
|
||||
#include "rtl8195a_spi_flash.h"
|
||||
//#include "hal_timer.h"
|
||||
#include "hal_util.h"
|
||||
#include "hal_efuse.h"
|
||||
#include "hal_soc_ps_monitor.h"
|
||||
#include "diag.h"
|
||||
//#include "hal_common.h"
|
||||
//#include "hal_soc_ps_monitor.h"
|
||||
|
||||
|
||||
// from RDC team
|
||||
|
@ -153,7 +150,6 @@ __##name##_Disable(void) \
|
|||
#include "rtl8195a_clk.h"
|
||||
#include "rtl8195a_misc.h"
|
||||
#include "rtl8195a_sdio.h"
|
||||
//#include "rtl8195a_luart.h"
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -203,10 +199,6 @@ __##name##_Disable(void) \
|
|||
#include "rtl8195a_i2c.h"
|
||||
#endif
|
||||
|
||||
//#ifdef CONFIG_PCM_EN
|
||||
//#include "hal_pcm.h"
|
||||
//#include "rtl8195a_pcm.h"
|
||||
//#endif
|
||||
|
||||
#ifdef CONFIG_PWM_EN
|
||||
#include "hal_pwm.h"
|
||||
|
|
|
@ -30,6 +30,12 @@
|
|||
#if CONFIG_EXAMPLE_UART_ATCMD
|
||||
#include "at_cmd/atcmd_wifi.h"
|
||||
#endif
|
||||
extern u32 GlobalDebugEnable;
|
||||
#define WIFI_CONF_MSG(...) do {\
|
||||
if (GlobalDebugEnable) \
|
||||
printf("\r" __VA_ARGS__);\
|
||||
}while(0)
|
||||
|
||||
#if CONFIG_INIC_EN
|
||||
extern int inic_start(void);
|
||||
extern int inic_stop(void);
|
||||
|
@ -195,7 +201,7 @@ static int wifi_connect_local(rtw_network_info_t *pWifi)
|
|||
break;
|
||||
default:
|
||||
ret = -1;
|
||||
printf("\n\rWIFICONF: security type(0x%x) is not supported.\n\r", pWifi->security_type);
|
||||
WIFI_CONF_MSG("\n\rWIFICONF: security type(0x%x) is not supported.\n\r", pWifi->security_type);
|
||||
break;
|
||||
}
|
||||
if(ret == 0)
|
||||
|
@ -244,7 +250,7 @@ static int wifi_connect_bssid_local(rtw_network_info_t *pWifi)
|
|||
break;
|
||||
default:
|
||||
ret = -1;
|
||||
printf("\n\rWIFICONF: security type(0x%x) is not supported.\n\r", pWifi->security_type);
|
||||
WIFI_CONF_MSG("\n\rWIFICONF: security type(0x%x) is not supported.\n\r", pWifi->security_type);
|
||||
break;
|
||||
}
|
||||
if(ret == 0){
|
||||
|
@ -351,7 +357,7 @@ void restore_wifi_info_to_flash()
|
|||
|
||||
if(data_to_flash && p_write_reconnect_ptr){
|
||||
if(wifi_get_setting((const char*)ifname[0],&setting) || setting.mode == RTW_MODE_AP){
|
||||
printf("\r\n %s():wifi_get_setting fail or ap mode", __func__);
|
||||
WIFI_CONF_MSG("\r\n %s():wifi_get_setting fail or ap mode", __func__);
|
||||
return;
|
||||
}
|
||||
channel = setting.channel;
|
||||
|
@ -515,7 +521,7 @@ int wifi_connect(
|
|||
#ifdef CONFIG_ENABLE_EAP
|
||||
if(get_eap_phase()){
|
||||
if(rtw_down_timeout_sema( &join_result->join_sema, 60000 ) == RTW_FALSE) {
|
||||
printf("RTW API: Join bss timeout\r\n");
|
||||
WIFI_CONF_MSG("RTW API: Join bss timeout\r\n");
|
||||
if(password_len) {
|
||||
rtw_free(join_result->network_info.password);
|
||||
}
|
||||
|
@ -531,7 +537,7 @@ int wifi_connect(
|
|||
else
|
||||
#endif
|
||||
if(rtw_down_timeout_sema( &join_result->join_sema, RTW_JOIN_TIMEOUT ) == RTW_FALSE) {
|
||||
printf("RTW API: Join bss timeout\r\n");
|
||||
WIFI_CONF_MSG("RTW API: Join bss timeout\r\n");
|
||||
if(password_len) {
|
||||
rtw_free(join_result->network_info.password);
|
||||
}
|
||||
|
@ -641,7 +647,7 @@ int wifi_connect_bssid(
|
|||
|
||||
if(semaphore == NULL) {
|
||||
if(rtw_down_timeout_sema( &join_result->join_sema, RTW_JOIN_TIMEOUT ) == RTW_FALSE) {
|
||||
printf("RTW API: Join bss timeout\r\n");
|
||||
WIFI_CONF_MSG("RTW API: Join bss timeout\r\n");
|
||||
if(password_len) {
|
||||
rtw_free(join_result->network_info.password);
|
||||
}
|
||||
|
@ -685,7 +691,7 @@ int wifi_disconnect(void)
|
|||
const __u8 null_bssid[ETH_ALEN + 2] = {0, 0, 0, 0, 0, 1, 0, 0};
|
||||
|
||||
if (wext_set_bssid(WLAN0_NAME, null_bssid) < 0){
|
||||
printf("\n\rWEXT: Failed to set bogus BSSID to disconnect");
|
||||
WIFI_CONF_MSG("\n\rWEXT: Failed to set bogus BSSID to disconnect");
|
||||
ret = -1;
|
||||
}
|
||||
return ret;
|
||||
|
@ -918,7 +924,7 @@ int wifi_on(rtw_mode_t mode)
|
|||
static int event_init = 0;
|
||||
|
||||
if(rltk_wlan_running(WLAN0_IDX)) {
|
||||
printf("\n\rWIFI is already running");
|
||||
WIFI_CONF_MSG("\n\rWIFI is already running");
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -934,7 +940,7 @@ int wifi_on(rtw_mode_t mode)
|
|||
|
||||
// set wifi mib
|
||||
wifi_set_mib();
|
||||
printf("\n\rInitializing WIFI ...");
|
||||
WIFI_CONF_MSG("\n\rInitializing WIFI ...");
|
||||
for(idx=0;idx<devnum;idx++){
|
||||
ret = rltk_wlan_init(idx, mode);
|
||||
if(ret <0)
|
||||
|
@ -943,7 +949,7 @@ int wifi_on(rtw_mode_t mode)
|
|||
for(idx=0;idx<devnum;idx++){
|
||||
ret = rltk_wlan_start(idx);
|
||||
if(ret <0){
|
||||
printf("\n\rERROR: Start WIFI Failed!");
|
||||
WIFI_CONF_MSG("\n\rERROR: Start WIFI Failed!");
|
||||
rltk_wlan_deinit();
|
||||
return ret;
|
||||
}
|
||||
|
@ -951,7 +957,7 @@ int wifi_on(rtw_mode_t mode)
|
|||
|
||||
while(1) {
|
||||
if(rltk_wlan_running(devnum-1)) {
|
||||
printf("\n\rWIFI initialized\n");
|
||||
WIFI_CONF_MSG("\n\rWIFI initialized\n");
|
||||
|
||||
|
||||
/*
|
||||
|
@ -962,7 +968,7 @@ int wifi_on(rtw_mode_t mode)
|
|||
}
|
||||
|
||||
if(timeout == 0) {
|
||||
printf("\n\rERROR: Init WIFI timeout!");
|
||||
WIFI_CONF_MSG("\n\rERROR: Init WIFI timeout!");
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -994,7 +1000,7 @@ int wifi_off(void)
|
|||
|
||||
if((rltk_wlan_running(WLAN0_IDX) == 0) &&
|
||||
(rltk_wlan_running(WLAN1_IDX) == 0)) {
|
||||
printf("\n\rWIFI is not running");
|
||||
WIFI_CONF_MSG("\n\rWIFI is not running");
|
||||
return 0;
|
||||
}
|
||||
#if CONFIG_LWIP_LAYER
|
||||
|
@ -1011,18 +1017,18 @@ int wifi_off(void)
|
|||
if((wifi_mode == RTW_MODE_AP) || (wifi_mode == RTW_MODE_STA_AP))
|
||||
wpas_wps_deinit();
|
||||
#endif
|
||||
printf("\n\rDeinitializing WIFI ...");
|
||||
WIFI_CONF_MSG("\n\rDeinitializing WIFI ...");
|
||||
rltk_wlan_deinit();
|
||||
|
||||
while(1) {
|
||||
if((rltk_wlan_running(WLAN0_IDX) == 0) &&
|
||||
(rltk_wlan_running(WLAN1_IDX) == 0)) {
|
||||
printf("\n\rWIFI deinitialized");
|
||||
WIFI_CONF_MSG("\n\rWIFI deinitialized");
|
||||
break;
|
||||
}
|
||||
|
||||
if(timeout == 0) {
|
||||
printf("\n\rERROR: Deinit WIFI timeout!");
|
||||
WIFI_CONF_MSG("\n\rERROR: Deinit WIFI timeout!");
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1133,7 +1139,7 @@ int wifi_start_ap(
|
|||
break;
|
||||
default:
|
||||
ret = -1;
|
||||
printf("\n\rWIFICONF: security type is not supported");
|
||||
WIFI_CONF_MSG("\n\rWIFICONF: security type is not supported");
|
||||
break;
|
||||
}
|
||||
if(ret < 0) goto exit;
|
||||
|
@ -1184,7 +1190,7 @@ int wifi_start_ap_with_hidden_ssid(
|
|||
break;
|
||||
default:
|
||||
ret = -1;
|
||||
printf("\n\rWIFICONF: security type is not supported");
|
||||
WIFI_CONF_MSG("\n\rWIFICONF: security type is not supported");
|
||||
break;
|
||||
}
|
||||
if(ret < 0) goto exit;
|
||||
|
@ -1324,7 +1330,7 @@ int wifi_scan_networks_with_ssid(int (results_handler)(char*buf, int buflen, cha
|
|||
scan_buf.buf_len = scan_buflen;
|
||||
scan_buf.buf = (char*)rtw_malloc(scan_buf.buf_len);
|
||||
if(!scan_buf.buf){
|
||||
printf("\n\rERROR: Can't malloc memory(%d)", scan_buf.buf_len);
|
||||
WIFI_CONF_MSG("\n\rERROR: Can't malloc memory(%d)", scan_buf.buf_len);
|
||||
return RTW_NOMEM;
|
||||
}
|
||||
//set ssid
|
||||
|
@ -1334,7 +1340,7 @@ int wifi_scan_networks_with_ssid(int (results_handler)(char*buf, int buflen, cha
|
|||
|
||||
//Scan channel
|
||||
if(scan_cnt = (wifi_scan(RTW_SCAN_TYPE_ACTIVE, RTW_BSS_TYPE_ANY, &scan_buf)) < 0){
|
||||
printf("\n\rERROR: wifi scan failed");
|
||||
WIFI_CONF_MSG("\n\rERROR: wifi scan failed");
|
||||
ret = RTW_ERROR;
|
||||
}else{
|
||||
if(NULL == results_handler)
|
||||
|
@ -1432,7 +1438,7 @@ int wifi_scan_networks(rtw_scan_result_handler_t results_handler, void* user_dat
|
|||
count --;
|
||||
}
|
||||
if(count == 0){
|
||||
printf("\n\r[%d]WiFi: Scan is running. Wait 2s timeout.", rtw_get_current_time());
|
||||
WIFI_CONF_MSG("\n\r[%d]WiFi: Scan is running. Wait 2s timeout.", rtw_get_current_time());
|
||||
return RTW_TIMEOUT;
|
||||
}
|
||||
}
|
||||
|
@ -1715,7 +1721,7 @@ int wifi_restart_ap(
|
|||
}
|
||||
// start ap
|
||||
if(wifi_start_ap((char*)ssid, security_type, (char*)password, ssid_len, password_len, channel) < 0) {
|
||||
printf("\n\rERROR: Operation failed!");
|
||||
WIFI_CONF_MSG("\n\rERROR: Operation failed!");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -1776,7 +1782,7 @@ static void wifi_autoreconnect_thread(void *param)
|
|||
{
|
||||
int ret = RTW_ERROR;
|
||||
struct wifi_autoreconnect_param *reconnect_param = (struct wifi_autoreconnect_param *) param;
|
||||
printf("\n\rauto reconnect ...\n");
|
||||
WIFI_CONF_MSG("\n\rauto reconnect ...\n");
|
||||
ret = wifi_connect(reconnect_param->ssid, reconnect_param->security_type, reconnect_param->password,
|
||||
reconnect_param->ssid_len, reconnect_param->password_len, reconnect_param->key_id, NULL);
|
||||
#if DEVICE_EMAC
|
||||
|
@ -1797,7 +1803,7 @@ static void wifi_autoreconnect_thread(void *param)
|
|||
#if LWIP_AUTOIP
|
||||
uint8_t *ip = LwIP_GetIP(&xnetif[0]);
|
||||
if((ip[0] == 0) && (ip[1] == 0) && (ip[2] == 0) && (ip[3] == 0)) {
|
||||
printf("\n\nIPv4 AUTOIP ...");
|
||||
WIFI_CONF_MSG("\n\nIPv4 AUTOIP ...");
|
||||
LwIP_AUTOIP(&xnetif[0]);
|
||||
}
|
||||
#endif
|
||||
|
@ -1822,7 +1828,7 @@ void wifi_autoreconnect_hdl(rtw_security_t security_type,
|
|||
param.key_id = key_id;
|
||||
|
||||
if(!rtw_create_task(&g_wifi_auto_reconnect_task,"wifi_autoreconnect",512,TASK_PRORITY_IDEL+1,wifi_autoreconnect_thread, ¶m))
|
||||
printf("\n\rTCP ERROR: Create TCP server task failed.");
|
||||
WIFI_CONF_MSG("\n\rTCP ERROR: Create TCP server task failed.");
|
||||
}
|
||||
|
||||
int wifi_config_autoreconnect(__u8 mode, __u8 retry_times, __u16 timeout)
|
||||
|
|
|
@ -20,6 +20,12 @@
|
|||
#include <wifi/wifi_ind.h>
|
||||
#include <osdep_service.h>
|
||||
|
||||
extern u32 GlobalDebugEnable;
|
||||
#define WIFI_UTIL_MSG(...) do {\
|
||||
if (GlobalDebugEnable) \
|
||||
printf("\r" __VA_ARGS__);\
|
||||
}while(0)
|
||||
|
||||
int iw_ioctl(const char *ifname, unsigned long request, struct iwreq *pwrq)
|
||||
{
|
||||
memcpy(pwrq->ifr_name, ifname, 5);
|
||||
|
@ -36,7 +42,7 @@ int wext_get_ssid(const char *ifname, __u8 *ssid)
|
|||
iwr.u.essid.length = 32;
|
||||
|
||||
if (iw_ioctl(ifname, SIOCGIWESSID, &iwr) < 0) {
|
||||
printf("\n\rioctl[SIOCGIWESSID] ssid = NULL, not connected"); //do not use perror
|
||||
WIFI_UTIL_MSG("\n\rioctl[SIOCGIWESSID] ssid = NULL, not connected"); //do not use perror
|
||||
ret = -1;
|
||||
} else {
|
||||
ret = iwr.u.essid.length;
|
||||
|
@ -65,7 +71,7 @@ int wext_set_ssid(const char *ifname, const __u8 *ssid, __u16 ssid_len)
|
|||
iwr.u.essid.flags = (ssid_len != 0);
|
||||
|
||||
if (iw_ioctl(ifname, SIOCSIWESSID, &iwr) < 0) {
|
||||
printf("\n\rioctl[SIOCSIWESSID] error");
|
||||
WIFI_UTIL_MSG("\n\rioctl[SIOCSIWESSID] error");
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
|
@ -86,7 +92,7 @@ int wext_set_bssid(const char *ifname, const __u8 *bssid)
|
|||
}
|
||||
|
||||
if (iw_ioctl(ifname, SIOCSIWAP, &iwr) < 0) {
|
||||
printf("\n\rioctl[SIOCSIWAP] error");
|
||||
WIFI_UTIL_MSG("\n\rioctl[SIOCSIWAP] error");
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
|
@ -108,7 +114,7 @@ int wext_set_auth_param(const char *ifname, __u16 idx, __u32 value)
|
|||
iwr.u.param.value = value;
|
||||
|
||||
if (iw_ioctl(ifname, SIOCSIWAUTH, &iwr) < 0) {
|
||||
printf("\n\rWEXT: SIOCSIWAUTH(param %d value 0x%x) failed)", idx, value);
|
||||
WIFI_UTIL_MSG("\n\rWEXT: SIOCSIWAUTH(param %d value 0x%x) failed)", idx, value);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
@ -162,7 +168,7 @@ int wext_set_key_ext(const char *ifname, __u16 alg, const __u8 *addr, int key_id
|
|||
|
||||
if (iw_ioctl(ifname, SIOCSIWENCODEEXT, &iwr) < 0) {
|
||||
ret = -2;
|
||||
printf("\n\rioctl[SIOCSIWENCODEEXT] set key fail");
|
||||
WIFI_UTIL_MSG("\n\rioctl[SIOCSIWENCODEEXT] set key fail");
|
||||
}
|
||||
|
||||
rtw_free(ext);
|
||||
|
@ -184,7 +190,7 @@ int wext_get_enc_ext(const char *ifname, __u16 *alg, __u8 *key_idx, __u8 *passph
|
|||
iwr.u.encoding.pointer = ext;
|
||||
|
||||
if (iw_ioctl(ifname, SIOCGIWENCODEEXT, &iwr) < 0) {
|
||||
printf("\n\rioctl[SIOCGIWENCODEEXT] error");
|
||||
WIFI_UTIL_MSG("\n\rioctl[SIOCGIWENCODEEXT] error");
|
||||
ret = -1;
|
||||
}
|
||||
else
|
||||
|
@ -213,7 +219,7 @@ int wext_set_passphrase(const char *ifname, const __u8 *passphrase, __u16 passph
|
|||
iwr.u.passphrase.flags = (passphrase_len != 0);
|
||||
|
||||
if (iw_ioctl(ifname, SIOCSIWPRIVPASSPHRASE, &iwr) < 0) {
|
||||
printf("\n\rioctl[SIOCSIWESSID+0x1f] error");
|
||||
WIFI_UTIL_MSG("\n\rioctl[SIOCSIWESSID+0x1f] error");
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
|
@ -229,7 +235,7 @@ int wext_get_passphrase(const char *ifname, __u8 *passphrase)
|
|||
iwr.u.passphrase.pointer = (void *) passphrase;
|
||||
|
||||
if (iw_ioctl(ifname, SIOCGIWPRIVPASSPHRASE, &iwr) < 0) {
|
||||
printf("\n\rioctl[SIOCGIWPRIVPASSPHRASE] error");
|
||||
WIFI_UTIL_MSG("\n\rioctl[SIOCGIWPRIVPASSPHRASE] error");
|
||||
ret = -1;
|
||||
}
|
||||
else {
|
||||
|
@ -292,7 +298,7 @@ int wext_enable_powersave(const char *ifname, __u8 ips_mode, __u8 lps_mode)
|
|||
iwr.u.data.length = pindex;
|
||||
|
||||
if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) {
|
||||
printf("\n\rioctl[SIOCSIWPRIVAPESSID] error");
|
||||
WIFI_UTIL_MSG("\n\rioctl[SIOCSIWPRIVAPESSID] error");
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
|
@ -330,7 +336,7 @@ int wext_disable_powersave(const char *ifname)
|
|||
iwr.u.data.length = pindex;
|
||||
|
||||
if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) {
|
||||
printf("\n\rioctl[SIOCSIWPRIVAPESSID] error");
|
||||
WIFI_UTIL_MSG("\n\rioctl[SIOCSIWPRIVAPESSID] error");
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
|
@ -367,7 +373,7 @@ int wext_set_tdma_param(const char *ifname, __u8 slot_period, __u8 rfon_period_l
|
|||
iwr.u.data.length = pindex;
|
||||
|
||||
if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) {
|
||||
printf("\n\rioctl[SIOCSIWPRIVAPESSID] error");
|
||||
WIFI_UTIL_MSG("\n\rioctl[SIOCSIWPRIVAPESSID] error");
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
|
@ -400,7 +406,7 @@ int wext_set_lps_dtim(const char *ifname, __u8 lps_dtim)
|
|||
iwr.u.data.length = pindex;
|
||||
|
||||
if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) {
|
||||
printf("\n\rioctl[SIOCSIWPRIVAPESSID] error");
|
||||
WIFI_UTIL_MSG("\n\rioctl[SIOCSIWPRIVAPESSID] error");
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
|
@ -434,7 +440,7 @@ int wext_get_lps_dtim(const char *ifname, __u8 *lps_dtim)
|
|||
iwr.u.data.length = pindex;
|
||||
|
||||
if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) {
|
||||
printf("\n\rioctl[SIOCSIWPRIVAPESSID] error");
|
||||
WIFI_UTIL_MSG("\n\rioctl[SIOCSIWPRIVAPESSID] error");
|
||||
ret = -1;
|
||||
goto exit;
|
||||
}
|
||||
|
@ -443,7 +449,7 @@ int wext_get_lps_dtim(const char *ifname, __u8 *lps_dtim)
|
|||
if((para[0]==3)&&(para[1]==1))
|
||||
*lps_dtim = para[2];
|
||||
else
|
||||
printf("\n\r%s error", __func__);
|
||||
WIFI_UTIL_MSG("\n\r%s error", __func__);
|
||||
|
||||
exit:
|
||||
rtw_free(para);
|
||||
|
@ -492,7 +498,7 @@ int wext_set_tos_value(const char *ifname, __u8 *tos_value)
|
|||
iwr.u.data.length = cmd_len + 4;
|
||||
|
||||
if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) {
|
||||
printf("\n\rwext_set_tos_value():ioctl[SIOCDEVPRIVATE] error");
|
||||
WIFI_UTIL_MSG("\n\rwext_set_tos_value():ioctl[SIOCDEVPRIVATE] error");
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
|
@ -518,7 +524,7 @@ int wext_get_tx_power(const char *ifname, __u8 *poweridx)
|
|||
iwr.u.data.pointer = para;
|
||||
iwr.u.data.length = cmd_len + 20;
|
||||
if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) {
|
||||
printf("\n\rwext_get_tx_power():ioctl[SIOCDEVPRIVATE] error");
|
||||
WIFI_UTIL_MSG("\n\rwext_get_tx_power():ioctl[SIOCDEVPRIVATE] error");
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
|
@ -577,7 +583,7 @@ int wext_set_mode(const char *ifname, int mode)
|
|||
memset(&iwr, 0, sizeof(iwr));
|
||||
iwr.u.mode = mode;
|
||||
if (iw_ioctl(ifname, SIOCSIWMODE, &iwr) < 0) {
|
||||
printf("\n\rioctl[SIOCSIWMODE] error");
|
||||
WIFI_UTIL_MSG("\n\rioctl[SIOCSIWMODE] error");
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
|
@ -592,7 +598,7 @@ int wext_get_mode(const char *ifname, int *mode)
|
|||
memset(&iwr, 0, sizeof(iwr));
|
||||
|
||||
if (iw_ioctl(ifname, SIOCGIWMODE, &iwr) < 0) {
|
||||
printf("\n\rioctl[SIOCGIWMODE] error");
|
||||
WIFI_UTIL_MSG("\n\rioctl[SIOCGIWMODE] error");
|
||||
ret = -1;
|
||||
}
|
||||
else
|
||||
|
@ -612,7 +618,7 @@ int wext_set_ap_ssid(const char *ifname, const __u8 *ssid, __u16 ssid_len)
|
|||
iwr.u.essid.flags = (ssid_len != 0);
|
||||
|
||||
if (iw_ioctl(ifname, SIOCSIWPRIVAPESSID, &iwr) < 0) {
|
||||
printf("\n\rioctl[SIOCSIWPRIVAPESSID] error");
|
||||
WIFI_UTIL_MSG("\n\rioctl[SIOCSIWPRIVAPESSID] error");
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
|
@ -629,7 +635,7 @@ int wext_set_country(const char *ifname, rtw_country_code_t country_code)
|
|||
iwr.u.param.value = country_code;
|
||||
|
||||
if (iw_ioctl(ifname, SIOCSIWPRIVCOUNTRY, &iwr) < 0) {
|
||||
printf("\n\rioctl[SIOCSIWPRIVCOUNTRY] error");
|
||||
WIFI_UTIL_MSG("\n\rioctl[SIOCSIWPRIVCOUNTRY] error");
|
||||
ret = -1;
|
||||
}
|
||||
return ret;
|
||||
|
@ -643,7 +649,7 @@ int wext_get_rssi(const char *ifname, int *rssi)
|
|||
memset(&iwr, 0, sizeof(iwr));
|
||||
|
||||
if (iw_ioctl(ifname, SIOCGIWSENS, &iwr) < 0) {
|
||||
printf("\n\rioctl[SIOCGIWSENS] error");
|
||||
WIFI_UTIL_MSG("\n\rioctl[SIOCGIWSENS] error");
|
||||
ret = -1;
|
||||
} else {
|
||||
*rssi = 0 - iwr.u.sens.value;
|
||||
|
@ -675,7 +681,7 @@ int wext_set_pscan_channel(const char *ifname, __u8 *ch, __u8 *pscan_config, __u
|
|||
iwr.u.data.pointer = para;
|
||||
iwr.u.data.length = (length + length + 1) + 12;
|
||||
if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) {
|
||||
printf("\n\rwext_set_pscan_channel():ioctl[SIOCDEVPRIVATE] error");
|
||||
WIFI_UTIL_MSG("\n\rwext_set_pscan_channel():ioctl[SIOCDEVPRIVATE] error");
|
||||
ret = -1;
|
||||
}
|
||||
rtw_free(para);
|
||||
|
@ -692,7 +698,7 @@ int wext_set_channel(const char *ifname, __u8 ch)
|
|||
iwr.u.freq.i = ch;
|
||||
|
||||
if (iw_ioctl(ifname, SIOCSIWFREQ, &iwr) < 0) {
|
||||
printf("\n\rioctl[SIOCSIWFREQ] error");
|
||||
WIFI_UTIL_MSG("\n\rioctl[SIOCSIWFREQ] error");
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
|
@ -707,7 +713,7 @@ int wext_get_channel(const char *ifname, __u8 *ch)
|
|||
memset(&iwr, 0, sizeof(iwr));
|
||||
|
||||
if (iw_ioctl(ifname, SIOCGIWFREQ, &iwr) < 0) {
|
||||
printf("\n\rioctl[SIOCGIWFREQ] error");
|
||||
WIFI_UTIL_MSG("\n\rioctl[SIOCGIWFREQ] error");
|
||||
ret = -1;
|
||||
}
|
||||
else
|
||||
|
@ -754,7 +760,7 @@ int wext_set_scan(const char *ifname, char *buf, __u16 buf_len, __u16 flags)
|
|||
iwr.u.data.flags = flags;
|
||||
iwr.u.data.length = buf_len;
|
||||
if (iw_ioctl(ifname, SIOCSIWSCAN, &iwr) < 0) {
|
||||
printf("\n\rioctl[SIOCSIWSCAN] error");
|
||||
WIFI_UTIL_MSG("\n\rioctl[SIOCSIWSCAN] error");
|
||||
ret = -1;
|
||||
}
|
||||
return ret;
|
||||
|
@ -768,7 +774,7 @@ int wext_get_scan(const char *ifname, char *buf, __u16 buf_len)
|
|||
iwr.u.data.pointer = buf;
|
||||
iwr.u.data.length = buf_len;
|
||||
if (iw_ioctl(ifname, SIOCGIWSCAN, &iwr) < 0) {
|
||||
printf("\n\rioctl[SIOCGIWSCAN] error");
|
||||
WIFI_UTIL_MSG("\n\rioctl[SIOCGIWSCAN] error");
|
||||
ret = -1;
|
||||
}else
|
||||
ret = iwr.u.data.flags;
|
||||
|
@ -786,7 +792,7 @@ int wext_private_command_with_retval(const char *ifname, char *cmd, char *ret_bu
|
|||
buf_size = strlen(cmd) + 1; // 1 : '\0'
|
||||
buf = (char*)rtw_malloc(buf_size);
|
||||
if(!buf){
|
||||
printf("\n\rWEXT: Can't malloc memory");
|
||||
WIFI_UTIL_MSG("\n\rWEXT: Can't malloc memory");
|
||||
return -1;
|
||||
}
|
||||
memset(buf, 0, buf_size);
|
||||
|
@ -797,7 +803,7 @@ int wext_private_command_with_retval(const char *ifname, char *cmd, char *ret_bu
|
|||
iwr.u.data.flags = 0;
|
||||
|
||||
if ((ret = iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr)) < 0) {
|
||||
printf("\n\rioctl[SIOCDEVPRIVATE] error. ret=%d\n", ret);
|
||||
WIFI_UTIL_MSG("\n\rioctl[SIOCDEVPRIVATE] error. ret=%d\n", ret);
|
||||
}
|
||||
if(ret_buf){
|
||||
if(ret_len > iwr.u.data.length)
|
||||
|
@ -830,7 +836,7 @@ int wext_private_command(const char *ifname, char *cmd, int show_msg)
|
|||
buf_size = strlen(cmd) + 1; // 1 : '\0'
|
||||
buf = (char*)rtw_malloc(buf_size);
|
||||
if (!buf) {
|
||||
printf("\n\rWEXT: Can't malloc memory");
|
||||
WIFI_UTIL_MSG("\n\rWEXT: Can't malloc memory");
|
||||
return -1;
|
||||
}
|
||||
memset(buf, 0, buf_size);
|
||||
|
@ -841,12 +847,12 @@ int wext_private_command(const char *ifname, char *cmd, int show_msg)
|
|||
iwr.u.data.flags = 0;
|
||||
|
||||
if ((ret = iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr)) < 0) {
|
||||
printf("\n\rioctl[SIOCDEVPRIVATE] error. ret=%d\n", ret);
|
||||
WIFI_UTIL_MSG("\n\rioctl[SIOCDEVPRIVATE] error. ret=%d\n", ret);
|
||||
}
|
||||
if (show_msg && iwr.u.data.length) {
|
||||
if(iwr.u.data.length > buf_size)
|
||||
printf("\n\rWEXT: Malloc memory is not enough");
|
||||
printf("\n\rPrivate Message: %s", (char *) iwr.u.data.pointer);
|
||||
WIFI_UTIL_MSG("\n\rWEXT: Malloc memory is not enough");
|
||||
WIFI_UTIL_MSG("\n\rPrivate Message: %s", (char *) iwr.u.data.pointer);
|
||||
}
|
||||
rtw_free(buf);
|
||||
return ret;
|
||||
|
@ -924,7 +930,7 @@ int wext_send_eapol(const char *ifname, char *buf, __u16 buf_len, __u16 flags)
|
|||
iwr.u.data.length = buf_len;
|
||||
iwr.u.data.flags = flags;
|
||||
if (iw_ioctl(ifname, SIOCSIWEAPOLSEND, &iwr) < 0) {
|
||||
printf("\n\rioctl[SIOCSIWEAPOLSEND] error");
|
||||
WIFI_UTIL_MSG("\n\rioctl[SIOCSIWEAPOLSEND] error");
|
||||
ret = -1;
|
||||
}
|
||||
return ret;
|
||||
|
@ -940,7 +946,7 @@ int wext_send_mgnt(const char *ifname, char *buf, __u16 buf_len, __u16 flags)
|
|||
iwr.u.data.length = buf_len;
|
||||
iwr.u.data.flags = flags;
|
||||
if (iw_ioctl(ifname, SIOCSIWMGNTSEND, &iwr) < 0) {
|
||||
printf("\n\rioctl[SIOCSIWMGNTSEND] error");
|
||||
WIFI_UTIL_MSG("\n\rioctl[SIOCSIWMGNTSEND] error");
|
||||
ret = -1;
|
||||
}
|
||||
return ret;
|
||||
|
@ -956,7 +962,7 @@ int wext_set_gen_ie(const char *ifname, char *buf, __u16 buf_len, __u16 flags)
|
|||
iwr.u.data.length = buf_len;
|
||||
iwr.u.data.flags = flags;
|
||||
if (iw_ioctl(ifname, SIOCSIWGENIE, &iwr) < 0) {
|
||||
printf("\n\rioctl[SIOCSIWGENIE] error");
|
||||
WIFI_UTIL_MSG("\n\rioctl[SIOCSIWGENIE] error");
|
||||
ret = -1;
|
||||
}
|
||||
return ret;
|
||||
|
@ -984,7 +990,7 @@ int wext_set_autoreconnect(const char *ifname, __u8 mode, __u8 retry_times, __u1
|
|||
iwr.u.data.pointer = para;
|
||||
iwr.u.data.length = (4) + cmd_len;
|
||||
if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) {
|
||||
printf("\n\rwext_set_autoreconnect():ioctl[SIOCDEVPRIVATE] error");
|
||||
WIFI_UTIL_MSG("\n\rwext_set_autoreconnect():ioctl[SIOCDEVPRIVATE] error");
|
||||
ret = -1;
|
||||
}
|
||||
rtw_free(para);
|
||||
|
@ -1008,7 +1014,7 @@ int wext_get_autoreconnect(const char *ifname, __u8 *mode)
|
|||
iwr.u.data.pointer = para;
|
||||
iwr.u.data.length = cmd_len;
|
||||
if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) {
|
||||
printf("\n\rwext_get_autoreconnect():ioctl[SIOCDEVPRIVATE] error");
|
||||
WIFI_UTIL_MSG("\n\rwext_get_autoreconnect():ioctl[SIOCDEVPRIVATE] error");
|
||||
ret = -1;
|
||||
}
|
||||
*mode = *(__u8 *)(iwr.u.data.pointer);
|
||||
|
@ -1037,7 +1043,7 @@ int wext_add_custom_ie(const char *ifname, void *cus_ie, int ie_num)
|
|||
__u8 *para = NULL;
|
||||
int cmd_len = 0;
|
||||
if(ie_num <= 0 || !cus_ie){
|
||||
printf("\n\rwext_add_custom_ie():wrong parameter");
|
||||
WIFI_UTIL_MSG("\n\rwext_add_custom_ie():wrong parameter");
|
||||
ret = -1;
|
||||
return ret;
|
||||
}
|
||||
|
@ -1056,7 +1062,7 @@ int wext_add_custom_ie(const char *ifname, void *cus_ie, int ie_num)
|
|||
iwr.u.data.pointer = para;
|
||||
iwr.u.data.length = (4)* 2 + cmd_len;// 2 input
|
||||
if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) {
|
||||
printf("\n\rwext_add_custom_ie():ioctl[SIOCDEVPRIVATE] error");
|
||||
WIFI_UTIL_MSG("\n\rwext_add_custom_ie():ioctl[SIOCDEVPRIVATE] error");
|
||||
ret = -1;
|
||||
}
|
||||
rtw_free(para);
|
||||
|
@ -1071,7 +1077,7 @@ int wext_update_custom_ie(const char *ifname, void * cus_ie, int ie_index)
|
|||
__u8 *para = NULL;
|
||||
int cmd_len = 0;
|
||||
if(ie_index <= 0 || !cus_ie){
|
||||
printf("\n\rwext_update_custom_ie():wrong parameter");
|
||||
WIFI_UTIL_MSG("\n\rwext_update_custom_ie():wrong parameter");
|
||||
ret = -1;
|
||||
return ret;
|
||||
}
|
||||
|
@ -1090,7 +1096,7 @@ int wext_update_custom_ie(const char *ifname, void * cus_ie, int ie_index)
|
|||
iwr.u.data.pointer = para;
|
||||
iwr.u.data.length = (4)* 2 + cmd_len;// 2 input
|
||||
if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) {
|
||||
printf("\n\rwext_update_custom_ie():ioctl[SIOCDEVPRIVATE] error");
|
||||
WIFI_UTIL_MSG("\n\rwext_update_custom_ie():ioctl[SIOCDEVPRIVATE] error");
|
||||
ret = -1;
|
||||
}
|
||||
rtw_free(para);
|
||||
|
@ -1115,7 +1121,7 @@ int wext_del_custom_ie(const char *ifname)
|
|||
iwr.u.data.pointer = para;
|
||||
iwr.u.data.length = cmd_len;
|
||||
if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) {
|
||||
printf("\n\rwext_del_custom_ie():ioctl[SIOCDEVPRIVATE] error");
|
||||
WIFI_UTIL_MSG("\n\rwext_del_custom_ie():ioctl[SIOCDEVPRIVATE] error");
|
||||
ret = -1;
|
||||
}
|
||||
rtw_free(para);
|
||||
|
@ -1148,7 +1154,7 @@ int wext_enable_forwarding(const char *ifname)
|
|||
iwr.u.essid.length = cmd_len + 1;
|
||||
|
||||
if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) {
|
||||
printf("\n\rwext_enable_forwarding(): ioctl[SIOCDEVPRIVATE] error");
|
||||
WIFI_UTIL_MSG("\n\rwext_enable_forwarding(): ioctl[SIOCDEVPRIVATE] error");
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
|
@ -1176,7 +1182,7 @@ int wext_disable_forwarding(const char *ifname)
|
|||
iwr.u.essid.length = cmd_len + 1;
|
||||
|
||||
if (iw_ioctl(ifname, SIOCDEVPRIVATE, &iwr) < 0) {
|
||||
printf("\n\rwext_disable_forwarding(): ioctl[SIOCDEVPRIVATE] error");
|
||||
WIFI_UTIL_MSG("\n\rwext_disable_forwarding(): ioctl[SIOCDEVPRIVATE] error");
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
|
@ -1260,7 +1266,7 @@ int wext_init_mac_filter(void)
|
|||
|
||||
mf_list_head = (struct list_head *)rtw_malloc(sizeof(struct list_head));
|
||||
if(mf_list_head == NULL){
|
||||
printf("\n\r[ERROR] %s : can't allocate mf_list_head",__func__);
|
||||
WIFI_UTIL_MSG("\n\r[ERROR] %s : can't allocate mf_list_head",__func__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -1298,7 +1304,7 @@ int wext_add_mac_filter(unsigned char* hwaddr)
|
|||
rtw_mac_filter_list_t *mf_list_new;
|
||||
mf_list_new = (rtw_mac_filter_list_t *)rtw_malloc(sizeof(rtw_mac_filter_list_t));
|
||||
if(mf_list_new == NULL){
|
||||
printf("\n\r[ERROR] %s : can't allocate mf_list_new",__func__);
|
||||
WIFI_UTIL_MSG("\n\r[ERROR] %s : can't allocate mf_list_new",__func__);
|
||||
return -1;
|
||||
}
|
||||
memcpy(mf_list_new->mac_addr,hwaddr,6);
|
||||
|
|
|
@ -65,22 +65,40 @@ Reset_Handler:
|
|||
mov sp, r0 /* set stack pointer */
|
||||
|
||||
/* Copy the data segment initializers from flash to SRAM */
|
||||
movs r1, #0
|
||||
// Load from _sidata -> _sdata through _edata
|
||||
// _sidata has a vma = lma in flash at the end of .text
|
||||
// _sdata has a lma in flash but a vma of ram, so here we move it from where
|
||||
// it was loaded (lma) into where it will be accessed (vma).
|
||||
// Register Schema:
|
||||
// r0 = _sdata, r1 = _edata, r2 = _sidata
|
||||
// r3 = index (goes from 0 -> _sdata - _edata)
|
||||
// r4 = temp var for *(_sidata + r3) or (_sdata + r3)
|
||||
// This is all equivalent to this C:
|
||||
// int index = 0;
|
||||
// extern uint32_t *_sdata, *_sidata;
|
||||
// while (_sdata + index < _edata) {
|
||||
// *_sdata[index] = *_sidata[index];
|
||||
// index += 1;
|
||||
// }
|
||||
ldr r0, =_sdata
|
||||
ldr r1, =_edata
|
||||
ldr r2, =_sidata
|
||||
movs r3, #0
|
||||
b LoopCopyDataInit
|
||||
|
||||
CopyDataInit:
|
||||
ldr r3, =_sidata
|
||||
ldr r3, [r3, r1]
|
||||
str r3, [r0, r1]
|
||||
adds r1, r1, #4
|
||||
ldr r4, [r2, r3]
|
||||
str r4, [r0, r3]
|
||||
adds r3, r3, #4
|
||||
|
||||
LoopCopyDataInit:
|
||||
ldr r0, =_sdata
|
||||
ldr r3, =_edata
|
||||
adds r2, r0, r1
|
||||
cmp r2, r3
|
||||
// while (_sdata + r3 < _edata)
|
||||
adds r4, r0, r3
|
||||
// if (r4 < r1) branch to CopyDataInit
|
||||
cmp r4, r1
|
||||
bcc CopyDataInit
|
||||
|
||||
|
||||
/* Call the clock system intitialization function.*/
|
||||
bl SystemInit
|
||||
|
||||
|
|
|
@ -265,20 +265,20 @@ static void uart_irq(int id)
|
|||
|
||||
if (serial_irq_ids[id] != 0) {
|
||||
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_TC) != RESET) {
|
||||
if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_TC) != RESET) {
|
||||
if (__HAL_UART_GET_IT(huart, UART_IT_TC) != RESET) {
|
||||
irq_handler(serial_irq_ids[id], TxIrq);
|
||||
__HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_TCF);
|
||||
}
|
||||
}
|
||||
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) {
|
||||
if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_RXNE) != RESET) {
|
||||
if (__HAL_UART_GET_IT(huart, UART_IT_RXNE) != RESET) {
|
||||
irq_handler(serial_irq_ids[id], RxIrq);
|
||||
volatile uint32_t tmpval = huart->Instance->RDR; // Clear RXNE flag
|
||||
UNUSED(tmpval);
|
||||
}
|
||||
}
|
||||
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) {
|
||||
if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_ORE) != RESET) {
|
||||
if (__HAL_UART_GET_IT(huart, UART_IT_ORE) != RESET) {
|
||||
__HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF);
|
||||
}
|
||||
}
|
||||
|
@ -780,19 +780,19 @@ int serial_irq_handler_asynch(serial_t *obj)
|
|||
|
||||
// Handle error events
|
||||
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_PE) != RESET) {
|
||||
if (__HAL_UART_GET_IT_SOURCE(huart, USART_IT_ERR) != RESET) {
|
||||
if (__HAL_UART_GET_IT(huart, UART_IT_PE) != RESET) {
|
||||
return_event |= (SERIAL_EVENT_RX_PARITY_ERROR & obj_s->events);
|
||||
}
|
||||
}
|
||||
|
||||
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_FE) != RESET) {
|
||||
if (__HAL_UART_GET_IT_SOURCE(huart, USART_IT_ERR) != RESET) {
|
||||
if (__HAL_UART_GET_IT(huart, UART_IT_FE) != RESET) {
|
||||
return_event |= (SERIAL_EVENT_RX_FRAMING_ERROR & obj_s->events);
|
||||
}
|
||||
}
|
||||
|
||||
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) {
|
||||
if (__HAL_UART_GET_IT_SOURCE(huart, USART_IT_ERR) != RESET) {
|
||||
if (__HAL_UART_GET_IT(huart, UART_IT_ORE) != RESET) {
|
||||
return_event |= (SERIAL_EVENT_RX_OVERRUN_ERROR & obj_s->events);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -211,20 +211,20 @@ static void uart_irq(int id)
|
|||
|
||||
if (serial_irq_ids[id] != 0) {
|
||||
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_TC) != RESET) {
|
||||
if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_TC) != RESET) {
|
||||
if (__HAL_UART_GET_IT(huart, UART_IT_TC) != RESET) {
|
||||
irq_handler(serial_irq_ids[id], TxIrq);
|
||||
__HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_TCF);
|
||||
}
|
||||
}
|
||||
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) {
|
||||
if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_RXNE) != RESET) {
|
||||
if (__HAL_UART_GET_IT(huart, UART_IT_RXNE) != RESET) {
|
||||
irq_handler(serial_irq_ids[id], RxIrq);
|
||||
volatile uint32_t tmpval = huart->Instance->RDR; // Clear RXNE flag
|
||||
UNUSED(tmpval);
|
||||
}
|
||||
}
|
||||
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) {
|
||||
if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_ORE) != RESET) {
|
||||
if (__HAL_UART_GET_IT(huart, UART_IT_ORE) != RESET) {
|
||||
__HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF);
|
||||
}
|
||||
}
|
||||
|
@ -679,19 +679,19 @@ int serial_irq_handler_asynch(serial_t *obj)
|
|||
|
||||
// Handle error events
|
||||
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_PE) != RESET) {
|
||||
if (__HAL_UART_GET_IT_SOURCE(huart, USART_IT_ERR) != RESET) {
|
||||
if (__HAL_UART_GET_IT(huart, UART_IT_PE) != RESET) {
|
||||
return_event |= (SERIAL_EVENT_RX_PARITY_ERROR & obj_s->events);
|
||||
}
|
||||
}
|
||||
|
||||
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_FE) != RESET) {
|
||||
if (__HAL_UART_GET_IT_SOURCE(huart, USART_IT_ERR) != RESET) {
|
||||
if (__HAL_UART_GET_IT(huart, UART_IT_FE) != RESET) {
|
||||
return_event |= (SERIAL_EVENT_RX_FRAMING_ERROR & obj_s->events);
|
||||
}
|
||||
}
|
||||
|
||||
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) {
|
||||
if (__HAL_UART_GET_IT_SOURCE(huart, USART_IT_ERR) != RESET) {
|
||||
if (__HAL_UART_GET_IT(huart, UART_IT_ORE) != RESET) {
|
||||
return_event |= (SERIAL_EVENT_RX_OVERRUN_ERROR & obj_s->events);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* mbed Microcontroller Library
|
||||
*******************************************************************************
|
||||
* Copyright (c) 2015, STMicroelectronics
|
||||
* Copyright (c) 2017, STMicroelectronics
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -30,59 +30,90 @@
|
|||
|
||||
#include "PeripheralPins.h"
|
||||
|
||||
// =====
|
||||
// Note: Commented lines are alternative possibilities which are not used per default.
|
||||
// If you change them, you will have also to modify the corresponding xxx_api.c file
|
||||
// for pwmout, analogin, analogout, ...
|
||||
// =====
|
||||
//==============================================================================
|
||||
// Notes
|
||||
//
|
||||
// - The pins mentionned Px_y_ALTz are alternative possibilities which use other
|
||||
// HW peripheral instances. You can use them the same way as any other "normal"
|
||||
// pin (i.e. PwmOut pwm(PA_7_ALT0);). These pins are not displayed on the board
|
||||
// pinout image on mbed.org.
|
||||
//
|
||||
// - The pins which are connected to other components present on the board have
|
||||
// the comment "Connected to xxx". The pin function may not work properly in this
|
||||
// case. These pins may not be displayed on the board pinout image on mbed.org.
|
||||
// Please read the board reference manual and schematic for more information.
|
||||
//
|
||||
//==============================================================================
|
||||
|
||||
//*** ADC ***
|
||||
|
||||
const PinMap PinMap_ADC[] = {
|
||||
{PA_0, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0
|
||||
{PA_1, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1
|
||||
{PA_2, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2
|
||||
{PA_3, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3
|
||||
// {PA_4, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4, overlay with VSYNC
|
||||
{PA_5, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5
|
||||
{PA_6, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6
|
||||
{PA_7, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7
|
||||
{PB_0, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8
|
||||
{PB_1, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9
|
||||
{PC_0, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10
|
||||
{PC_1, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11
|
||||
{PC_2, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12
|
||||
{PC_3, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13
|
||||
{PC_4, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14
|
||||
{PC_5, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15
|
||||
{PF_3, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC3_IN9
|
||||
{PF_4, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC3_IN14
|
||||
{PF_5, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC3_IN15
|
||||
{PF_6, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4
|
||||
{PF_7, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5
|
||||
{PF_8, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6
|
||||
{PF_9, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_IN7
|
||||
{PF_10,ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC3_IN8
|
||||
{NC, NC, 0}
|
||||
{PA_0, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 - Connected to USER & WAKE-UP button
|
||||
{PA_0_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 - Connected to USER & WAKE-UP button
|
||||
{PA_0_ALT1, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 - Connected to USER & WAKE-UP button
|
||||
{PA_1, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 - Connected to MEMS
|
||||
{PA_1_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 - Connected to MEMS
|
||||
{PA_1_ALT1, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 - Connected to MEMS
|
||||
{PA_2, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 - Connected to MEMS
|
||||
{PA_2_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 - Connected to MEMS
|
||||
{PA_2_ALT0, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 - Connected to MEMS
|
||||
{PA_3, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3
|
||||
{PA_3_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3
|
||||
{PA_3_ALT1, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3
|
||||
{PA_4, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 - Connected to VSYNC
|
||||
{PA_4_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 - Connected to VSYNC
|
||||
{PA_5, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5
|
||||
{PA_5_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5
|
||||
{PA_6, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6
|
||||
{PA_6_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6
|
||||
{PA_7, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 - Connected to ACP
|
||||
{PA_7_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 - Connected to ACP
|
||||
{PB_0, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8
|
||||
{PB_0_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8
|
||||
{PB_1, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9
|
||||
{PB_1_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9
|
||||
{PC_0, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 - Connected to SDRAM
|
||||
{PC_0_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 - Connected to SDRAM
|
||||
{PC_0_ALT0, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 - Connected to SDRAM
|
||||
{PC_1, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 - Connected to MEMS
|
||||
{PC_1_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 - Connected to MEMS
|
||||
{PC_1_ALT0, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 - Connected to MEMS
|
||||
{PC_2, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 - Connected to LCD
|
||||
{PC_2_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 - Connected to LCD
|
||||
{PC_2_ALT0, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12 - Connected to LCD
|
||||
{PC_3, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13
|
||||
{PC_3_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13
|
||||
{PC_3_ALT0, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13
|
||||
{PC_4, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 - Connected to USB
|
||||
{PC_4_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 - Connected to USB
|
||||
{PC_5, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 - Connected to USB
|
||||
{PC_5_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 - Connected to USB
|
||||
{PF_3, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC3_IN9
|
||||
{PF_4, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC3_IN14
|
||||
{PF_5, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC3_IN15
|
||||
{PF_6, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4
|
||||
{PF_7, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5
|
||||
{PF_8, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6
|
||||
{PF_9, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_IN7 - Connected to LCD
|
||||
{PF_10, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC3_IN8 - Connected to LCD
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
const PinMap PinMap_ADC_Internal[] = {
|
||||
{ADC_TEMP, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 16, 0)}, // See in analogin_api.c the correct ADC channel used
|
||||
{ADC_VREF, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 17, 0)}, // See in analogin_api.c the correct ADC channel used
|
||||
{ADC_VBAT, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 18, 0)}, // See in analogin_api.c the correct ADC channel used
|
||||
{NC, NC, 0}
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
|
||||
//*** DAC ***
|
||||
|
||||
const PinMap PinMap_DAC[] = {
|
||||
{PA_4, DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1
|
||||
{PA_4, DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 - Connected to VSYNC
|
||||
{PA_5, DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
|
||||
//*** I2C ***
|
||||
|
||||
const PinMap PinMap_I2C_SDA[] = {
|
||||
|
@ -96,7 +127,7 @@ const PinMap PinMap_I2C_SDA[] = {
|
|||
|
||||
const PinMap PinMap_I2C_SCL[] = {
|
||||
{PA_8, I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)},
|
||||
{PB_6, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},
|
||||
{PB_6, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // Connected to SDRAM
|
||||
{PB_8, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},
|
||||
{PB_10, I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},
|
||||
{PF_1, I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},
|
||||
|
@ -105,225 +136,218 @@ const PinMap PinMap_I2C_SCL[] = {
|
|||
|
||||
//*** PWM ***
|
||||
|
||||
// TIM5 cannot be used because already used by the us_ticker
|
||||
// Pins using PWM_5 (TIMER 5) cannot be used because already used by the us_ticker
|
||||
const PinMap PinMap_PWM[] = {
|
||||
{PA_0, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1
|
||||
// {PA_0, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 (used by us_ticker)
|
||||
// {PA_1, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 // Connected to MEMS
|
||||
// {PA_1, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 (used by us_ticker)
|
||||
// {PA_2, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 // Connected to MEMS
|
||||
// {PA_2, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 (used by us_ticker)
|
||||
// {PA_2, PWM_9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1
|
||||
{PA_3, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4
|
||||
// {PA_3, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 (used by us_ticker)
|
||||
// {PA_3, PWM_9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2
|
||||
{PA_5, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1
|
||||
// {PA_5, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM8, 1, 1)}, // TIM8_CH1N
|
||||
{PA_6, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1
|
||||
// {PA_7, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N // Connected to ACP
|
||||
// {PA_7, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2
|
||||
// {PA_7, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N
|
||||
{PA_8, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1
|
||||
{PA_9, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2
|
||||
{PA_10, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3
|
||||
{PA_11, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4
|
||||
{PA_15, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1
|
||||
|
||||
{PB_0, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N
|
||||
// {PB_0, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3
|
||||
// {PB_0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N
|
||||
{PB_1, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N
|
||||
// {PB_1, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4
|
||||
// {PB_1, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N
|
||||
{PB_3, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2
|
||||
{PB_4, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1
|
||||
{PB_5, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2
|
||||
{PB_6, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1
|
||||
{PB_7, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2
|
||||
{PB_8, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3
|
||||
// {PB_8, PWM_10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10,1, 0)}, // TIM10_CH1
|
||||
{PB_9, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4
|
||||
// {PB_9, PWM_11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11,1, 0)}, // TIM11_CH1
|
||||
{PB_10, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3
|
||||
{PB_11, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4
|
||||
{PB_13, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N
|
||||
// {PB_14, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N // Connected to USB
|
||||
// {PB_14, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N
|
||||
// {PB_14, PWM_12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12,1, 0)}, // TIM12_CH1
|
||||
// {PB_15, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N // Connected to USB
|
||||
// {PB_15, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N
|
||||
// {PB_15, PWM_12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12,2, 0)}, // TIM12_CH2
|
||||
|
||||
{PC_6, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1
|
||||
// {PC_6, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1
|
||||
{PC_7, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2
|
||||
// {PC_7, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2
|
||||
{PC_8, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3
|
||||
// {PC_8, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3
|
||||
{PC_9, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4
|
||||
// {PC_9, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4
|
||||
|
||||
{PD_12, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1
|
||||
{PD_13, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2
|
||||
{PD_14, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3
|
||||
{PD_15, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4
|
||||
|
||||
{PE_5, PWM_9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1
|
||||
{PE_6, PWM_9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2
|
||||
|
||||
{PE_8, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N
|
||||
{PE_9, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1
|
||||
{PE_10, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N
|
||||
{PE_11, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2
|
||||
{PE_12, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N
|
||||
{PE_13, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3
|
||||
{PE_14, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4
|
||||
|
||||
{PF_6, PWM_10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10,1, 0)}, // TIM10_CH1
|
||||
{PF_7, PWM_11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11,1, 0)}, // TIM11_CH1
|
||||
{PF_8, PWM_13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13,1, 0)}, // TIM13_CH1
|
||||
{PF_9, PWM_14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14,1, 0)}, // TIM14_CH1
|
||||
|
||||
{NC, NC, 0}
|
||||
{PA_0, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - Connected to USER & WAKE-UP button
|
||||
// {PA_0_ALT0, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 - Connected to USER & WAKE-UP button
|
||||
{PA_1, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - Connected to MEMS
|
||||
// {PA_1_ALT0, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 - Connected to MEMS
|
||||
{PA_2, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - Connected to MEMS
|
||||
{PA_2_ALT0, PWM_9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 - Connected to MEMS
|
||||
// {PA_2_ALT1, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 - Connected to MEMS
|
||||
{PA_3, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4
|
||||
{PA_3_ALT0, PWM_9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2
|
||||
// {PA_3_ALT1, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4
|
||||
{PA_5, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1
|
||||
{PA_5_ALT1, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N
|
||||
{PA_6, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1
|
||||
{PA_7, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - Connected to ACP
|
||||
{PA_7_ALT0, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - Connected to ACP
|
||||
{PA_7_ALT1, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - Connected to ACP
|
||||
{PA_8, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1
|
||||
{PA_9, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2
|
||||
{PA_10, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3
|
||||
{PA_11, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4
|
||||
{PA_15, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - Connected to LCD TS
|
||||
{PB_0, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N
|
||||
{PB_0_ALT0, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3
|
||||
{PB_0_ALT1, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N
|
||||
{PB_1, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N
|
||||
{PB_1_ALT0, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4
|
||||
{PB_1_ALT1, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N
|
||||
{PB_3, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2
|
||||
{PB_4, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1
|
||||
{PB_5, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - Connected to SDRAM
|
||||
{PB_6, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 - Connected to SDRAM
|
||||
{PB_7, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2
|
||||
{PB_8, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3
|
||||
{PB_8_ALT0, PWM_10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10,1, 0)}, // TIM10_CH1
|
||||
{PB_9, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4
|
||||
{PB_9_ALT0, PWM_11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11,1, 0)}, // TIM11_CH1
|
||||
{PB_10, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3
|
||||
{PB_11, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4
|
||||
{PB_13, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - Connected to USB
|
||||
{PB_14, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - Connected to USB
|
||||
{PB_14_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N - Connected to USB
|
||||
{PB_14_ALT1, PWM_12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12,1, 0)}, // TIM12_CH1 - Connected to USB
|
||||
{PB_15, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - Connected to USB
|
||||
{PB_15_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N - Connected to USB
|
||||
{PB_15_ALT1, PWM_12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12,2, 0)}, // TIM12_CH2 - Connected to USB
|
||||
{PC_6, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - Connected to LCD
|
||||
{PC_6_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 - Connected to LCD
|
||||
{PC_7, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2
|
||||
{PC_7_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2
|
||||
{PC_8, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3
|
||||
{PC_8_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3
|
||||
{PC_9, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4
|
||||
{PC_9_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4
|
||||
{PD_12, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 - Connected to LCD
|
||||
{PD_13, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - Connected to LCD
|
||||
{PD_14, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3
|
||||
{PD_15, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4
|
||||
{PE_5, PWM_9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1
|
||||
{PE_6, PWM_9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2
|
||||
{PE_8, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N
|
||||
{PE_9, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1
|
||||
{PE_10, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N
|
||||
{PE_11, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2
|
||||
{PE_12, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N
|
||||
{PE_13, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3
|
||||
{PE_14, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4
|
||||
{PF_6, PWM_10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10,1, 0)}, // TIM10_CH1
|
||||
{PF_7, PWM_11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11,1, 0)}, // TIM11_CH1
|
||||
{PF_8, PWM_13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13,1, 0)}, // TIM13_CH1
|
||||
{PF_9, PWM_14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14,1, 0)}, // TIM14_CH1 - Connected to LCD
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
//*** SERIAL ***
|
||||
|
||||
const PinMap PinMap_UART_TX[] = {
|
||||
// {PA_0, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to BUTTON
|
||||
// {PA_2, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to MEMS
|
||||
{PA_9, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},
|
||||
{PB_6, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},
|
||||
{PB_10, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},
|
||||
{PC_6, UART_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},
|
||||
// {PC_10, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},
|
||||
{PC_10, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},
|
||||
{PC_12, UART_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)},
|
||||
{PD_5, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},
|
||||
{PD_8, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},
|
||||
{PE_1, UART_8, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART8)},
|
||||
{PE_8, UART_7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART7)},
|
||||
{PF_7, UART_7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART7)},
|
||||
{PG_14, UART_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},
|
||||
{NC, NC, 0}
|
||||
{PA_0, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to USER & WAKE-UP button
|
||||
{PA_2, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to MEMS
|
||||
{PA_9, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to STDIO_UART_TX
|
||||
{PB_6, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to SDRAM
|
||||
{PB_10, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},
|
||||
{PC_6, UART_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // Connected to LCD
|
||||
{PC_10, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},
|
||||
{PC_10_ALT0, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},
|
||||
{PC_12, UART_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)},
|
||||
{PD_5, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to LCD
|
||||
{PD_8, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},
|
||||
{PE_1, UART_8, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART8)}, // Connected to SDRAM
|
||||
{PE_8, UART_7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART7)},
|
||||
{PF_7, UART_7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART7)}, // Connected to LCD
|
||||
{PG_14, UART_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // Connected to LED4
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
const PinMap PinMap_UART_RX[] = {
|
||||
// {PA_1, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to MEMS
|
||||
{PA_3, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},
|
||||
{PA_10, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},
|
||||
{PB_7, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},
|
||||
{PB_11, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},
|
||||
{PC_7, UART_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},
|
||||
// {PC_11, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},
|
||||
{PC_11, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},
|
||||
{PD_2, UART_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)},
|
||||
{PD_6, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},
|
||||
{PD_9, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},
|
||||
{PE_0, UART_8, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART8)},
|
||||
{PE_7, UART_7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART7)},
|
||||
{PF_6, UART_7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART7)},
|
||||
{PG_9, UART_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},
|
||||
{NC, NC, 0}
|
||||
{PA_1, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to MEMS
|
||||
{PA_3, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},
|
||||
{PA_10, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to STDIO_UART_RX
|
||||
{PB_7, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},
|
||||
{PB_11, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},
|
||||
{PC_7, UART_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},
|
||||
{PC_11, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},
|
||||
{PC_11_ALT0, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},
|
||||
{PD_2, UART_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, // Connected to LCD
|
||||
{PD_6, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},
|
||||
{PD_9, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},
|
||||
{PE_0, UART_8, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART8)}, // Connected to SDRAM
|
||||
{PE_7, UART_7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART7)},
|
||||
{PF_6, UART_7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART7)},
|
||||
{PG_9, UART_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
const PinMap PinMap_UART_RTS[] = {
|
||||
// {PA_1, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to MEMS
|
||||
{PA_1, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to MEMS
|
||||
{PA_12, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},
|
||||
// {PB_14, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to USB
|
||||
{PD_4, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},
|
||||
{PB_14, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to USB
|
||||
{PD_4, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to LCD
|
||||
{PD_12, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},
|
||||
{PG_8, UART_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},
|
||||
{PG_8, UART_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // Connected to SDRAM
|
||||
{PG_12, UART_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
const PinMap PinMap_UART_CTS[] = {
|
||||
// {PA_0, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to BUTTON
|
||||
{PA_0, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to USER & WAKE-UP button
|
||||
{PA_11, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},
|
||||
{PB_13, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},
|
||||
{PB_13, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to USB
|
||||
{PD_3, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},
|
||||
{PD_11, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},
|
||||
// {PG_13, UART_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // Connected to LED
|
||||
{PG_15, UART_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},
|
||||
{PD_11, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to LCD
|
||||
{PG_13, UART_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // Connected to LED3
|
||||
{PG_15, UART_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // Connected to SDRAM
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
//*** SPI ***
|
||||
|
||||
const PinMap PinMap_SPI_MOSI[] = {
|
||||
{PA_7, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
|
||||
{PB_5, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
|
||||
// {PB_5, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
|
||||
// {PB_15, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // Connected to USB
|
||||
{PC_3, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
|
||||
{PC_12, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
|
||||
{PD_6, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI3)}, // error in datasheet?
|
||||
{PE_6, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)},
|
||||
{PE_14, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)},
|
||||
{PF_9, SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)},
|
||||
{PF_11, SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)},
|
||||
// {PG_14, SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI6)}, // Connected to LED
|
||||
{NC, NC, 0}
|
||||
{PA_7, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // Connected to ACP
|
||||
{PB_5, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // Connected to SDRAM
|
||||
{PB_5_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, // Connected to SDRAM
|
||||
{PB_15, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // Connected to USB
|
||||
{PC_3, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
|
||||
{PC_12, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
|
||||
{PD_6, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI3)},
|
||||
{PE_6, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)},
|
||||
{PE_14, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)},
|
||||
{PF_9, SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)}, // Connected to LCD
|
||||
{PF_11, SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)}, // Connected to SDRAM
|
||||
{PG_14, SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI6)}, // Connected to LED4
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
const PinMap PinMap_SPI_MISO[] = {
|
||||
{PA_6, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
|
||||
{PB_4, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
|
||||
// {PB_4, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
|
||||
// {PB_14, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // Connected to USB
|
||||
{PC_2, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
|
||||
{PC_11, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
|
||||
{PE_5, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)},
|
||||
{PE_13, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)},
|
||||
{PF_8, SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)},
|
||||
{PG_12, SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI6)},
|
||||
{NC, NC, 0}
|
||||
{PA_6, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
|
||||
{PB_4, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
|
||||
{PB_4_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
|
||||
{PB_14, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // Connected to USB
|
||||
{PC_2, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // Connected to LCD
|
||||
{PC_11, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
|
||||
{PE_5, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)},
|
||||
{PE_13, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)},
|
||||
{PF_8, SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)},
|
||||
{PG_12, SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI6)},
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
const PinMap PinMap_SPI_SCLK[] = {
|
||||
{PA_5, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
|
||||
{PB_3, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
|
||||
// {PB_3, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
|
||||
// {PB_10, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // Connected to USB
|
||||
{PB_13, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
|
||||
{PC_10, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
|
||||
{PD_3, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
|
||||
{PE_2, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)},
|
||||
{PE_12, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)},
|
||||
{PF_7, SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)},
|
||||
// {PG_13, SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI6)}, // Connected to LED
|
||||
{NC, NC, 0}
|
||||
{PA_5, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
|
||||
{PB_3, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
|
||||
{PB_3_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
|
||||
{PB_10, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
|
||||
{PB_13, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // Connected to USB
|
||||
{PC_10, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
|
||||
{PD_3, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
|
||||
{PE_2, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)},
|
||||
{PE_12, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)},
|
||||
{PF_7, SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)},
|
||||
{PG_13, SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI6)}, // Connected to LED3
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
const PinMap PinMap_SPI_SSEL[] = {
|
||||
{PA_4, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},
|
||||
// {PA_4, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},
|
||||
// {PA_15, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},
|
||||
{PA_15, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},
|
||||
{PB_9, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},
|
||||
{PB_12, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},
|
||||
{PE_4, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)},
|
||||
{PE_11, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)},
|
||||
{PF_6, SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)},
|
||||
{PG_8, SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI6)},
|
||||
{NC, NC, 0}
|
||||
{PA_4, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to VSYNC
|
||||
{PA_4_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to VSYNC
|
||||
{PA_15, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to LCD TS
|
||||
{PA_15_ALT0, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to LCD TS
|
||||
{PB_9, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},
|
||||
{PB_12, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to USB
|
||||
{PE_4, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)},
|
||||
{PE_11, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)},
|
||||
{PF_6, SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)},
|
||||
{PG_8, SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI6)}, // Connected to SDRAM
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
const PinMap PinMap_CAN_RD[] = {
|
||||
{PB_8, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},
|
||||
{PB_12, CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)},
|
||||
{PD_0, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},
|
||||
{PB_5 , CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)},
|
||||
{PB_12, CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, // Connected to USB
|
||||
{PD_0, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},
|
||||
{PB_5 , CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, // Connected to SDRAM
|
||||
{PA_11, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
const PinMap PinMap_CAN_TD[] = {
|
||||
{PB_9, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},
|
||||
{PB_13, CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)},
|
||||
{PB_13, CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, // Connected to USB
|
||||
{PD_1, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},
|
||||
{PB_6 , CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)},
|
||||
{PB_6 , CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, // Connected to SDRAM
|
||||
{PA_12, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* mbed Microcontroller Library
|
||||
*******************************************************************************
|
||||
* Copyright (c) 2015, STMicroelectronics
|
||||
* Copyright (c) 2017, STMicroelectronics
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -37,15 +37,35 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef enum {
|
||||
ALT0 = 0x100,
|
||||
ALT1 = 0x200,
|
||||
ALT2 = 0x300,
|
||||
ALT3 = 0x400
|
||||
} ALTx;
|
||||
|
||||
typedef enum {
|
||||
PA_0 = 0x00,
|
||||
PA_0_ALT0 = PA_0|ALT0,
|
||||
PA_0_ALT1 = PA_0|ALT1,
|
||||
PA_1 = 0x01,
|
||||
PA_1_ALT0 = PA_1|ALT0,
|
||||
PA_1_ALT1 = PA_1|ALT1,
|
||||
PA_2 = 0x02,
|
||||
PA_2_ALT0 = PA_2|ALT0,
|
||||
PA_3 = 0x03,
|
||||
PA_3_ALT0 = PA_3|ALT0,
|
||||
PA_3_ALT1 = PA_3|ALT1,
|
||||
PA_4 = 0x04,
|
||||
PA_4_ALT0 = PA_4|ALT0,
|
||||
PA_5 = 0x05,
|
||||
PA_5_ALT0 = PA_5|ALT0,
|
||||
PA_5_ALT1 = PA_5|ALT1,
|
||||
PA_6 = 0x06,
|
||||
PA_6_ALT0 = PA_6|ALT0,
|
||||
PA_7 = 0x07,
|
||||
PA_7_ALT0 = PA_7|ALT0,
|
||||
PA_7_ALT1 = PA_7|ALT1,
|
||||
PA_8 = 0x08,
|
||||
PA_9 = 0x09,
|
||||
PA_10 = 0x0A,
|
||||
|
@ -54,36 +74,62 @@ typedef enum {
|
|||
PA_13 = 0x0D,
|
||||
PA_14 = 0x0E,
|
||||
PA_15 = 0x0F,
|
||||
PA_15_ALT0 = PA_15|ALT0,
|
||||
|
||||
PB_0 = 0x10,
|
||||
PB_0_ALT0 = PB_0|ALT0,
|
||||
PB_0_ALT1 = PB_0|ALT1,
|
||||
PB_1 = 0x11,
|
||||
PB_1_ALT0 = PB_1|ALT0,
|
||||
PB_1_ALT1 = PB_1|ALT1,
|
||||
PB_2 = 0x12,
|
||||
PB_3 = 0x13,
|
||||
PB_3_ALT0 = PB_3|ALT0,
|
||||
PB_4 = 0x14,
|
||||
PB_4_ALT0 = PB_4|ALT0,
|
||||
PB_5 = 0x15,
|
||||
PB_5_ALT0 = PB_5|ALT0,
|
||||
PB_6 = 0x16,
|
||||
PB_7 = 0x17,
|
||||
PB_8 = 0x18,
|
||||
PB_8_ALT0 = PB_8|ALT0,
|
||||
PB_9 = 0x19,
|
||||
PB_9_ALT0 = PB_9|ALT0,
|
||||
PB_10 = 0x1A,
|
||||
PB_11 = 0x1B,
|
||||
PB_12 = 0x1C,
|
||||
PB_13 = 0x1D,
|
||||
PB_14 = 0x1E,
|
||||
PB_14_ALT0 = PB_14|ALT0,
|
||||
PB_14_ALT1 = PB_14|ALT1,
|
||||
PB_15 = 0x1F,
|
||||
PB_15_ALT0 = PB_15|ALT0,
|
||||
PB_15_ALT1 = PB_15|ALT1,
|
||||
|
||||
PC_0 = 0x20,
|
||||
PC_0_ALT0 = PC_0|ALT0,
|
||||
PC_1 = 0x21,
|
||||
PC_1_ALT0 = PC_1|ALT0,
|
||||
PC_2 = 0x22,
|
||||
PC_2_ALT0 = PC_2|ALT0,
|
||||
PC_3 = 0x23,
|
||||
PC_3_ALT0 = PC_3|ALT0,
|
||||
PC_4 = 0x24,
|
||||
PC_4_ALT0 = PC_4|ALT0,
|
||||
PC_5 = 0x25,
|
||||
PC_5_ALT0 = PC_5|ALT0,
|
||||
PC_6 = 0x26,
|
||||
PC_6_ALT0 = PC_6|ALT0,
|
||||
PC_7 = 0x27,
|
||||
PC_7_ALT0 = PC_7|ALT0,
|
||||
PC_8 = 0x28,
|
||||
PC_8_ALT0 = PC_8|ALT0,
|
||||
PC_9 = 0x29,
|
||||
PC_9_ALT0 = PC_9|ALT0,
|
||||
PC_10 = 0x2A,
|
||||
PC_10_ALT0 = PC_10|ALT0,
|
||||
PC_11 = 0x2B,
|
||||
PC_11_ALT0 = PC_11|ALT0,
|
||||
PC_12 = 0x2C,
|
||||
PC_13 = 0x2D,
|
||||
PC_14 = 0x2E,
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* mbed Microcontroller Library
|
||||
'*******************************************************************************
|
||||
* Copyright (c) 2016, STMicroelectronics
|
||||
*******************************************************************************
|
||||
* Copyright (c) 2017, STMicroelectronics
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -30,96 +30,105 @@
|
|||
|
||||
#include "PeripheralPins.h"
|
||||
|
||||
// =====
|
||||
// Note: Commented lines are alternative possibilities which are not used per default.
|
||||
// If you change them, you will have also to modify the corresponding xxx_api.c file
|
||||
// for pwmout, analogin, analogout, ...
|
||||
// =====
|
||||
//==============================================================================
|
||||
// Notes
|
||||
//
|
||||
// - The pins mentionned Px_y_ALTz are alternative possibilities which use other
|
||||
// HW peripheral instances. You can use them the same way as any other "normal"
|
||||
// pin (i.e. PwmOut pwm(PA_7_ALT0);). These pins are not displayed on the board
|
||||
// pinout image on mbed.org.
|
||||
//
|
||||
// - The pins which are connected to other components present on the board have
|
||||
// the comment "Connected to xxx". The pin function may not work properly in this
|
||||
// case. These pins may not be displayed on the board pinout image on mbed.org.
|
||||
// Please read the board reference manual and schematic for more information.
|
||||
//
|
||||
//==============================================================================
|
||||
|
||||
//*** ADC ***
|
||||
|
||||
const PinMap PinMap_ADC[] = {
|
||||
{PA_0, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0
|
||||
// {PA_0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0
|
||||
// {PA_0, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0
|
||||
// {PA_1, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 (pin used by ethernet)
|
||||
// {PA_1, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 (pin used by ethernet)
|
||||
// {PA_1, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 (pin used by ethernet)
|
||||
// {PA_2, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 (pin used by ethernet)
|
||||
// {PA_2, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 (pin used by ethernet)
|
||||
// {PA_2, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 (pin used by ethernet)
|
||||
{PA_3, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 - ARDUINO A0
|
||||
// {PA_3, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 - ARDUINO A0
|
||||
// {PA_3, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 - ARDUINO A0
|
||||
{PA_4, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4
|
||||
// {PA_4, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4
|
||||
{PA_5, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 - ARDUINO D13
|
||||
// {PA_5, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 - ARDUINO D13
|
||||
{PA_6, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 - ARDUINO D12
|
||||
// {PA_6, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 - ARDUINO D12
|
||||
// {PA_7, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 (pin used by ethernet when JP6 ON) - ARDUINO D11 (default configuration)
|
||||
{PA_7, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 (pin used by ethernet when JP6 ON) - ARDUINO D11 (default configuration)
|
||||
// {PB_0, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 (pin used by LED1)
|
||||
// {PB_0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 (pin used by LED1)
|
||||
{PB_1, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9
|
||||
// {PB_1, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9
|
||||
{PC_0, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 - ARDUINO A1
|
||||
// {PC_0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 - ARDUINO A1
|
||||
// {PC_0, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 - ARDUINO A1
|
||||
// {PC_1, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 (pin used by ethernet)
|
||||
// {PC_1, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 (pin used by ethernet)
|
||||
// {PC_1, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 (pin used by ethernet)
|
||||
{PC_2, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12
|
||||
// {PC_2, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12
|
||||
// {PC_2, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12
|
||||
{PC_3, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 - ARDUINO A2
|
||||
// {PC_3, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 - ARDUINO A2
|
||||
// {PC_3, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 - ARDUINO A2
|
||||
{PC_4, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 (pin used by ethernet when JP6 ON)
|
||||
// {PC_4, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 (pin used by ethernet when JP6 ON)
|
||||
{PC_5, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 (pin used by ethernet when JP6 ON)
|
||||
// {PC_5, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 (pin used by ethernet when JP6 ON)
|
||||
{PF_3, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC3_IN9 - ARDUINO A3
|
||||
{PF_4, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC3_IN14
|
||||
{PF_5, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC3_IN15 - ARDUINO A4
|
||||
{PF_6, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4
|
||||
{PF_7, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5
|
||||
{PF_8, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6
|
||||
{PF_9, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_IN7
|
||||
{PF_10, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC3_IN8 - ARDUINO A5
|
||||
{NC, NC, 0}
|
||||
{PA_0, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0
|
||||
{PA_0_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0
|
||||
{PA_0_ALT1, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0
|
||||
{PA_1, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 - Connected to ETHERNET
|
||||
{PA_1_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 - Connected to ETHERNET
|
||||
{PA_1_ALT1, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 - Connected to ETHERNET
|
||||
{PA_2, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 - Connected to ETHERNET
|
||||
{PA_2_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 - Connected to ETHERNET
|
||||
{PA_2_ALT0, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 - Connected to ETHERNET
|
||||
{PA_3, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3
|
||||
{PA_3_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3
|
||||
{PA_3_ALT1, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3
|
||||
{PA_4, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4
|
||||
{PA_4_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4
|
||||
{PA_5, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5
|
||||
{PA_5_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5
|
||||
{PA_6, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6
|
||||
{PA_6_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6
|
||||
{PA_7, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 - Connected to ETHERNET if JP6 ON
|
||||
{PA_7_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 - Connected to ETHERNET if JP6 ON
|
||||
{PB_0, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 - Connected to LED1
|
||||
{PB_0_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 - Connected to LED1
|
||||
{PB_1, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9
|
||||
{PB_1_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9
|
||||
{PC_0, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10
|
||||
{PC_0_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10
|
||||
{PC_0_ALT0, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10
|
||||
{PC_1, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 - Connected to ETHERNET
|
||||
{PC_1_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 - Connected to ETHERNET
|
||||
{PC_1_ALT0, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 - Connected to ETHERNET
|
||||
{PC_2, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12
|
||||
{PC_2_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12
|
||||
{PC_2_ALT0, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12
|
||||
{PC_3, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13
|
||||
{PC_3_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13
|
||||
{PC_3_ALT0, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13
|
||||
{PC_4, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 - Connected to ETHERNET
|
||||
{PC_4_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 - Connected to ETHERNET
|
||||
{PC_5, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 - Connected to ETHERNET
|
||||
{PC_5_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 - Connected to ETHERNET
|
||||
{PF_3, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC3_IN9
|
||||
{PF_4, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC3_IN14
|
||||
{PF_5, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC3_IN15
|
||||
{PF_6, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4
|
||||
{PF_7, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5
|
||||
{PF_8, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6
|
||||
{PF_9, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_IN7
|
||||
{PF_10, ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC3_IN8
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
const PinMap PinMap_ADC_Internal[] = {
|
||||
{ADC_TEMP, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 16, 0)}, // See in analogin_api.c the correct ADC channel used
|
||||
{ADC_VREF, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 17, 0)}, // See in analogin_api.c the correct ADC channel used
|
||||
{ADC_VBAT, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 18, 0)}, // See in analogin_api.c the correct ADC channel used
|
||||
{NC, NC, 0}
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
//*** DAC ***
|
||||
|
||||
const PinMap PinMap_DAC[] = {
|
||||
{PA_4, DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1
|
||||
{PA_5, DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 - ARDUINO D13
|
||||
{PA_4, DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1
|
||||
{PA_5, DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
//*** I2C ***
|
||||
|
||||
const PinMap PinMap_I2C_SDA[] = {
|
||||
// {PB_7, I2C_1 , STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // (pin used by LED2)
|
||||
{PB_9, I2C_1 , STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // ARDUINO D14
|
||||
{PB_11, I2C_2 , STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},
|
||||
{PC_9, I2C_3 , STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)},
|
||||
{PF_0, I2C_2 , STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},
|
||||
{PB_7, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // Connected to LED2
|
||||
{PB_9, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},
|
||||
{PB_11, I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},
|
||||
{PC_9, I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)},
|
||||
{PF_0, I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
const PinMap PinMap_I2C_SCL[] = {
|
||||
{PA_8, I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)},
|
||||
{PB_6, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},
|
||||
{PB_8, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // ARDUINO D15
|
||||
{PB_8, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},
|
||||
{PB_10, I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},
|
||||
{PF_1, I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},
|
||||
{NC, NC, 0}
|
||||
|
@ -127,128 +136,125 @@ const PinMap PinMap_I2C_SCL[] = {
|
|||
|
||||
//*** PWM ***
|
||||
|
||||
// Pins using PWM_5 (TIMER 5) cannot be used because already used by the us_ticker
|
||||
const PinMap PinMap_PWM[] = {
|
||||
{PA_0, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1
|
||||
// {PA_0, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 (TIM5 used by us_ticker)
|
||||
// {PA_1, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 (pin used by ethernet)
|
||||
// {PA_1, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 (TIM5 used by us_ticker) (pin used by ethernet)
|
||||
// {PA_2, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 (pin used by ethernet)
|
||||
// {PA_2, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 (TIM5 used by us_ticker)
|
||||
// {PA_2, PWM_9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 (pin used by ethernet)
|
||||
// {PA_3, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - ARDUINO A0
|
||||
{PA_3, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 (TIM5 used by us_ticker) - ARDUINO A0
|
||||
// {PA_3, PWM_9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 - ARDUINO A0
|
||||
// {PA_5, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - ARDUINO D13
|
||||
{PA_5, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - ARDUINO D13
|
||||
// {PA_6, PWM_13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 - ARDUINO D12
|
||||
{PA_6, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - ARDUINO D12
|
||||
{PA_7, PWM_14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 (pin used by ethernet when JP6 ON) - ARDUINO D11 (default configuration)
|
||||
// {PA_7, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N (pin used by ethernet when JP6 ON) - ARDUINO D11 (default configuration)
|
||||
// {PA_7, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 (pin used by ethernet when JP6 ON) - ARDUINO D11 (default configuration)
|
||||
// {PA_7, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N (pin used by ethernet when JP6 ON) - ARDUINO D11 (default configuration)
|
||||
{PA_8, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1
|
||||
// {PA_9, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 (pin used by usb)
|
||||
// {PA_10, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 (pin used by usb)
|
||||
// {PA_11, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 (pin used by usb)
|
||||
{PA_15, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1
|
||||
// {PB_0, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N (pin used by LED1)
|
||||
// {PB_0, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 (pin used by LED1)
|
||||
// {PB_0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N (pin used by LED1)
|
||||
// {PB_1, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N
|
||||
// {PB_1, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4
|
||||
{PB_1, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N
|
||||
{PB_3, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2
|
||||
{PB_4, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1
|
||||
{PB_5, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - ARDUINO D11 (need HW and SW updates)
|
||||
// HW solder bridge update : SB121 off, SB122 on
|
||||
// SW : config from json files
|
||||
{PB_6, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1
|
||||
// {PB_7, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 (pin used by LED2)
|
||||
// {PB_8, PWM_10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 - ARDUINO D15
|
||||
{PB_8, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 - ARDUINO D15
|
||||
{PB_9, PWM_11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 - ARDUINO D14
|
||||
// {PB_9, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 - ARDUINO D14
|
||||
{PB_10, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3
|
||||
{PB_11, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4
|
||||
{PB_13, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N (pin used by ethernet when JP7 ON)
|
||||
// {PB_14, PWM_12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 (pin used by LED3)
|
||||
// {PB_14, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N (pin used by LED3)
|
||||
// {PB_14, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N (pin used by LED3)
|
||||
{PB_15, PWM_12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2
|
||||
// {PB_15, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N
|
||||
// {PB_15, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N
|
||||
{PC_6, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1
|
||||
// {PC_6, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1
|
||||
{PC_7, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2
|
||||
// {PC_7, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2
|
||||
{PC_8, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3
|
||||
// {PC_8, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3
|
||||
{PC_9, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4
|
||||
// {PC_9, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4
|
||||
{PD_12, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1
|
||||
{PD_13, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2
|
||||
{PD_14, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 - ARDUINO D10
|
||||
{PD_15, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 - ARDUINO D9
|
||||
{PE_5, PWM_9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1
|
||||
{PE_6, PWM_9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2
|
||||
{PE_8, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N
|
||||
{PE_9, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 - ARDUINO D6
|
||||
{PE_10, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N
|
||||
{PE_11, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - ARDUINO D5
|
||||
{PE_12, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N
|
||||
{PE_13, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - ARDUINO D3
|
||||
{PE_14, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4
|
||||
{PF_6, PWM_10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1
|
||||
{PF_7, PWM_11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1
|
||||
{PF_8, PWM_13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1
|
||||
{PF_9, PWM_14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1
|
||||
{NC, NC, 0}
|
||||
{PA_0, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1
|
||||
// {PA_0_ALT0, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1
|
||||
{PA_1, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - Connected to ETHERNET
|
||||
// {PA_1_ALT0, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 - Connected to ETHERNET
|
||||
{PA_2, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - Connected to ETHERNET
|
||||
{PA_2_ALT0, PWM_9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 - Connected to ETHERNET
|
||||
// {PA_2_ALT1, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3
|
||||
{PA_3, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4
|
||||
{PA_3_ALT0, PWM_9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2
|
||||
// {PA_3_ALT1, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4
|
||||
{PA_5, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1
|
||||
{PA_5_ALT1, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N
|
||||
{PA_6, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1
|
||||
{PA_7, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - Connected to ETHERNET if JP6 ON
|
||||
{PA_7_ALT0, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - Connected to ETHERNET if JP6 ON
|
||||
{PA_7_ALT1, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - Connected to ETHERNET if JP6 ON
|
||||
{PA_8, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1
|
||||
{PA_9, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - Connected to USB
|
||||
{PA_10, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - Connected to USB
|
||||
{PA_11, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 - Connected to USB
|
||||
{PA_15, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1
|
||||
{PB_0, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - Connected to LED1
|
||||
{PB_0_ALT0, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 - Connected to LED1
|
||||
{PB_0_ALT1, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N - Connected to LED1
|
||||
{PB_1, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N
|
||||
{PB_1_ALT0, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4
|
||||
{PB_1_ALT1, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N
|
||||
{PB_3, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2
|
||||
{PB_4, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1
|
||||
{PB_5, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2
|
||||
{PB_6, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1
|
||||
{PB_7, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - Connected to LED2
|
||||
{PB_8, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3
|
||||
{PB_8_ALT0, PWM_10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10,1, 0)}, // TIM10_CH1
|
||||
{PB_9, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4
|
||||
{PB_9_ALT0, PWM_11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11,1, 0)}, // TIM11_CH1
|
||||
{PB_10, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3
|
||||
{PB_11, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4
|
||||
{PB_13, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - Connected to ETHERNET if JP7 ON
|
||||
{PB_14, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - Connected to LED3
|
||||
{PB_14_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N - Connected to LED3
|
||||
{PB_14_ALT1, PWM_12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12,1, 0)}, // TIM12_CH1 - Connected to LED3
|
||||
{PB_15, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N
|
||||
{PB_15_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N
|
||||
{PB_15_ALT1, PWM_12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12,2, 0)}, // TIM12_CH2
|
||||
{PC_6, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1
|
||||
{PC_6_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1
|
||||
{PC_7, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2
|
||||
{PC_7_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2
|
||||
{PC_8, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3
|
||||
{PC_8_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3
|
||||
{PC_9, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4
|
||||
{PC_9_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4
|
||||
{PD_12, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1
|
||||
{PD_13, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2
|
||||
{PD_14, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3
|
||||
{PD_15, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4
|
||||
{PE_5, PWM_9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1
|
||||
{PE_6, PWM_9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2
|
||||
{PE_8, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N
|
||||
{PE_9, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1
|
||||
{PE_10, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N
|
||||
{PE_11, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2
|
||||
{PE_12, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N
|
||||
{PE_13, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3
|
||||
{PE_14, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4
|
||||
{PF_6, PWM_10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10,1, 0)}, // TIM10_CH1
|
||||
{PF_7, PWM_11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11,1, 0)}, // TIM11_CH1
|
||||
{PF_8, PWM_13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13,1, 0)}, // TIM13_CH1
|
||||
{PF_9, PWM_14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14,1, 0)}, // TIM14_CH1
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
//*** SERIAL ***
|
||||
|
||||
const PinMap PinMap_UART_TX[] = {
|
||||
{PA_0, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},
|
||||
// {PA_2, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // (pin used by ethernet)
|
||||
// {PA_9, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // (pin used by usb)
|
||||
{PB_6, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},
|
||||
{PB_10, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},
|
||||
{PC_6, UART_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},
|
||||
// {PC_10, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},
|
||||
{PC_10, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},
|
||||
{PC_12, UART_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)},
|
||||
{PD_5, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},
|
||||
{PD_8, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},
|
||||
{PE_1, UART_8, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART8)},
|
||||
{PE_8, UART_7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART7)},
|
||||
{PF_7, UART_7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART7)},
|
||||
{PG_14, UART_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // ARDUINO D1
|
||||
{NC, NC, 0}
|
||||
{PA_0, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},
|
||||
{PA_2, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to ETHERNET
|
||||
{PA_9, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to USB
|
||||
{PB_6, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},
|
||||
{PB_10, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},
|
||||
{PC_6, UART_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},
|
||||
{PC_10, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},
|
||||
{PC_10_ALT0, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},
|
||||
{PC_12, UART_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)},
|
||||
{PD_5, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},
|
||||
{PD_8, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to STDIO_UART_TX
|
||||
{PE_1, UART_8, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART8)},
|
||||
{PE_8, UART_7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART7)},
|
||||
{PF_7, UART_7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART7)},
|
||||
{PG_14, UART_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
const PinMap PinMap_UART_RX[] = {
|
||||
// {PA_1, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // (pin used by ethernet)
|
||||
{PA_3, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // ARDUINO A0
|
||||
// {PA_10, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // (pin used by usb)
|
||||
// {PB_7, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // (pin used by LED2)
|
||||
{PB_11, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},
|
||||
{PC_7, UART_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},
|
||||
{PC_11, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},
|
||||
// {PC_11, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},
|
||||
{PD_2, UART_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)},
|
||||
{PD_6, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},
|
||||
{PD_9, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},
|
||||
{PE_0, UART_8, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART8)},
|
||||
{PE_7, UART_7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART7)},
|
||||
{PF_6, UART_7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART7)},
|
||||
{PG_9, UART_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // ARDUINO D0
|
||||
{NC, NC, 0}
|
||||
{PA_1, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to ETHERNET
|
||||
{PA_3, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},
|
||||
{PA_10, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to USB
|
||||
{PB_7, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to LED2
|
||||
{PB_11, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},
|
||||
{PC_7, UART_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},
|
||||
{PC_11, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},
|
||||
{PC_11_ALT0, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},
|
||||
{PD_2, UART_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)},
|
||||
{PD_6, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},
|
||||
{PD_9, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to STDIO_UART_RX
|
||||
{PE_0, UART_8, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART8)},
|
||||
{PE_7, UART_7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART7)},
|
||||
{PF_6, UART_7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART7)},
|
||||
{PG_9, UART_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
const PinMap PinMap_UART_RTS[] = {
|
||||
// {PA_1, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // (pin used by ethernet)
|
||||
// {PA_12, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // (pin used by usb)
|
||||
// {PB_14, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // (pin used by LED3)
|
||||
{PA_1, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to ETHERNET
|
||||
{PA_12, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to USB
|
||||
{PB_14, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to LED3
|
||||
{PD_4, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},
|
||||
{PD_12, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},
|
||||
{PG_8, UART_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},
|
||||
|
@ -258,94 +264,90 @@ const PinMap PinMap_UART_RTS[] = {
|
|||
|
||||
const PinMap PinMap_UART_CTS[] = {
|
||||
{PA_0, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},
|
||||
// {PA_11, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // (pin used by usb)
|
||||
{PB_13, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // (pin used by ethernet when JP7 ON)
|
||||
{PA_11, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to USB
|
||||
{PB_13, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to ETHERNET if JP7 ON
|
||||
{PD_3, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},
|
||||
{PD_11, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},
|
||||
// {PG_13, UART_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // (pin used by ethernet)
|
||||
{PG_13, UART_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // Connected to ETHERNET
|
||||
{PG_15, UART_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
|
||||
//*** SPI ***
|
||||
|
||||
const PinMap PinMap_SPI_MOSI[] = {
|
||||
{PA_7, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // pin used by ethernet when JP6 ON - ARDUINO D11 (default configuration)
|
||||
{PB_5, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // ARDUINO D11 (need HW and SW updates)
|
||||
// HW solder bridge update : SB121 off, SB122 on
|
||||
// SW : config from json files
|
||||
// {PB_5, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
|
||||
{PB_15, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
|
||||
{PC_3, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // ARDUINO A2
|
||||
{PC_12, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
|
||||
{PD_6, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
|
||||
{PE_6, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)},
|
||||
{PE_14, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)},
|
||||
{PF_9, SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)},
|
||||
{PF_11, SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)},
|
||||
{PG_14, SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI6)}, // ARDUINO D1
|
||||
{NC, NC, 0}
|
||||
{PA_7, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // Connected to ETHERNET if JP6 ON
|
||||
{PB_5, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
|
||||
{PB_5_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
|
||||
{PB_15, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
|
||||
{PC_3, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
|
||||
{PC_12, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
|
||||
{PD_6, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI3)},
|
||||
{PE_6, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)},
|
||||
{PE_14, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)},
|
||||
{PF_9, SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)},
|
||||
{PF_11, SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)},
|
||||
{PG_14, SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI6)},
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
const PinMap PinMap_SPI_MISO[] = {
|
||||
{PA_6, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // ARDUINO D12
|
||||
{PB_4, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
|
||||
// {PB_4, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
|
||||
// {PB_14, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // (pin used by LED3)
|
||||
{PC_2, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
|
||||
{PC_11, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
|
||||
{PE_5, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)},
|
||||
{PE_13, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, // ARDUINO D3
|
||||
{PF_8, SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)},
|
||||
{PG_12, SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI6)},
|
||||
{NC, NC, 0}
|
||||
{PA_6, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
|
||||
{PB_4, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
|
||||
{PB_4_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
|
||||
{PB_14, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // Connected to LED3
|
||||
{PC_2, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
|
||||
{PC_11, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
|
||||
{PE_5, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)},
|
||||
{PE_13, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)},
|
||||
{PF_8, SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)},
|
||||
{PG_12, SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI6)},
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
const PinMap PinMap_SPI_SCLK[] = {
|
||||
{PA_5, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // ARDUINO D13
|
||||
// {PB_3, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
|
||||
{PB_3, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
|
||||
{PB_10, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
|
||||
{PB_13, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // (pin used by ethernet when JP7 ON)
|
||||
{PC_10, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
|
||||
{PD_3, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
|
||||
{PE_2, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)},
|
||||
{PE_12, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)},
|
||||
{PF_7, SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)},
|
||||
// {PG_13, SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI6)}, // (pin used by ethernet)
|
||||
{NC, NC, 0}
|
||||
{PA_5, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
|
||||
{PB_3, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
|
||||
{PB_3_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
|
||||
{PB_10, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
|
||||
{PB_13, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // Connected to ETHERNET if JP7 ON
|
||||
{PC_10, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
|
||||
{PD_3, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
|
||||
{PE_2, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)},
|
||||
{PE_12, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)},
|
||||
{PF_7, SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)},
|
||||
{PG_13, SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI6)}, // Connected to ETHERNET
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
const PinMap PinMap_SPI_SSEL[] = {
|
||||
{PA_4, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
|
||||
// {PA_4, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
|
||||
// {PA_15, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
|
||||
{PA_15, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
|
||||
{PB_9, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // ARDUINO D14
|
||||
{PB_12, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
|
||||
{PE_4, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)},
|
||||
{PE_11, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, // ARDUINO D5
|
||||
{PF_6, SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)},
|
||||
{PG_8, SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI6)},
|
||||
{NC, NC, 0}
|
||||
{PA_4, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},
|
||||
{PA_4_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},
|
||||
{PA_15, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},
|
||||
{PA_15_ALT0, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},
|
||||
{PB_9, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},
|
||||
{PB_12, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},
|
||||
{PE_4, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)},
|
||||
{PE_11, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)},
|
||||
{PF_6, SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI5)},
|
||||
{PG_8, SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI6)},
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
const PinMap PinMap_CAN_RD[] = {
|
||||
{PB_8, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},
|
||||
{PB_12, CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)},
|
||||
{PD_0, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},
|
||||
{PB_5 , CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, // ARDUINO D11 (need HW and SW updates)
|
||||
// HW solder bridge update : SB121 off, SB122 on
|
||||
// SW : config from json files
|
||||
{PA_11, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},
|
||||
{PD_0, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},
|
||||
{PB_5 , CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)},
|
||||
{PA_11, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to USB
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
const PinMap PinMap_CAN_TD[] = {
|
||||
{PB_9, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},
|
||||
{PB_13, CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)},
|
||||
{PB_13, CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, // Connected to ETHERNET if JP7 ON
|
||||
{PD_1, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},
|
||||
{PB_6 , CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)},
|
||||
{PA_12, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},
|
||||
{PA_12, CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to USB
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* mbed Microcontroller Library
|
||||
*******************************************************************************
|
||||
* Copyright (c) 2016, STMicroelectronics
|
||||
* Copyright (c) 2017, STMicroelectronics
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -37,15 +37,35 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef enum {
|
||||
ALT0 = 0x100,
|
||||
ALT1 = 0x200,
|
||||
ALT2 = 0x300,
|
||||
ALT3 = 0x400
|
||||
} ALTx;
|
||||
|
||||
typedef enum {
|
||||
PA_0 = 0x00,
|
||||
PA_0_ALT0 = PA_0|ALT0,
|
||||
PA_0_ALT1 = PA_0|ALT1,
|
||||
PA_1 = 0x01,
|
||||
PA_1_ALT0 = PA_1|ALT0,
|
||||
PA_1_ALT1 = PA_1|ALT1,
|
||||
PA_2 = 0x02,
|
||||
PA_2_ALT0 = PA_2|ALT0,
|
||||
PA_3 = 0x03,
|
||||
PA_3_ALT0 = PA_3|ALT0,
|
||||
PA_3_ALT1 = PA_3|ALT1,
|
||||
PA_4 = 0x04,
|
||||
PA_4_ALT0 = PA_4|ALT0,
|
||||
PA_5 = 0x05,
|
||||
PA_5_ALT0 = PA_5|ALT0,
|
||||
PA_5_ALT1 = PA_5|ALT1,
|
||||
PA_6 = 0x06,
|
||||
PA_6_ALT0 = PA_6|ALT0,
|
||||
PA_7 = 0x07,
|
||||
PA_7_ALT0 = PA_7|ALT0,
|
||||
PA_7_ALT1 = PA_7|ALT1,
|
||||
PA_8 = 0x08,
|
||||
PA_9 = 0x09,
|
||||
PA_10 = 0x0A,
|
||||
|
@ -54,36 +74,62 @@ typedef enum {
|
|||
PA_13 = 0x0D,
|
||||
PA_14 = 0x0E,
|
||||
PA_15 = 0x0F,
|
||||
PA_15_ALT0 = PA_15|ALT0,
|
||||
|
||||
PB_0 = 0x10,
|
||||
PB_0_ALT0 = PB_0|ALT0,
|
||||
PB_0_ALT1 = PB_0|ALT1,
|
||||
PB_1 = 0x11,
|
||||
PB_1_ALT0 = PB_1|ALT0,
|
||||
PB_1_ALT1 = PB_1|ALT1,
|
||||
PB_2 = 0x12,
|
||||
PB_3 = 0x13,
|
||||
PB_3_ALT0 = PB_3|ALT0,
|
||||
PB_4 = 0x14,
|
||||
PB_4_ALT0 = PB_4|ALT0,
|
||||
PB_5 = 0x15,
|
||||
PB_5_ALT0 = PB_5|ALT0,
|
||||
PB_6 = 0x16,
|
||||
PB_7 = 0x17,
|
||||
PB_8 = 0x18,
|
||||
PB_8_ALT0 = PB_8|ALT0,
|
||||
PB_9 = 0x19,
|
||||
PB_9_ALT0 = PB_9|ALT0,
|
||||
PB_10 = 0x1A,
|
||||
PB_11 = 0x1B,
|
||||
PB_12 = 0x1C,
|
||||
PB_13 = 0x1D,
|
||||
PB_14 = 0x1E,
|
||||
PB_14_ALT0 = PB_14|ALT0,
|
||||
PB_14_ALT1 = PB_14|ALT1,
|
||||
PB_15 = 0x1F,
|
||||
PB_15_ALT0 = PB_15|ALT0,
|
||||
PB_15_ALT1 = PB_15|ALT1,
|
||||
|
||||
PC_0 = 0x20,
|
||||
PC_0_ALT0 = PC_0|ALT0,
|
||||
PC_1 = 0x21,
|
||||
PC_1_ALT0 = PC_1|ALT0,
|
||||
PC_2 = 0x22,
|
||||
PC_2_ALT0 = PC_2|ALT0,
|
||||
PC_3 = 0x23,
|
||||
PC_3_ALT0 = PC_3|ALT0,
|
||||
PC_4 = 0x24,
|
||||
PC_4_ALT0 = PC_4|ALT0,
|
||||
PC_5 = 0x25,
|
||||
PC_5_ALT0 = PC_5|ALT0,
|
||||
PC_6 = 0x26,
|
||||
PC_6_ALT0 = PC_6|ALT0,
|
||||
PC_7 = 0x27,
|
||||
PC_7_ALT0 = PC_7|ALT0,
|
||||
PC_8 = 0x28,
|
||||
PC_8_ALT0 = PC_8|ALT0,
|
||||
PC_9 = 0x29,
|
||||
PC_9_ALT0 = PC_9|ALT0,
|
||||
PC_10 = 0x2A,
|
||||
PC_10_ALT0 = PC_10|ALT0,
|
||||
PC_11 = 0x2B,
|
||||
PC_11_ALT0 = PC_11|ALT0,
|
||||
PC_12 = 0x2C,
|
||||
PC_13 = 0x2D,
|
||||
PC_14 = 0x2E,
|
||||
|
|
|
@ -1,17 +1,31 @@
|
|||
/* mbed Microcontroller Library
|
||||
* Copyright (c) 2017 ARM Limited
|
||||
*******************************************************************************
|
||||
* Copyright (c) 2017, STMicroelectronics
|
||||
* All rights reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of STMicroelectronics nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
#include "flash_api.h"
|
||||
|
@ -22,57 +36,156 @@
|
|||
|
||||
#if DEVICE_FLASH
|
||||
|
||||
// This is a flash algo binary blob. It is PIC (position independent code) that should be stored in RAM
|
||||
static uint32_t FLASH_ALGO[] = {
|
||||
0xf3c04601, 0x28203007, 0x2204bf24, 0x1050eb02, 0x2810d205, 0x2203bf26, 0x1010eb02, 0xf4110880,
|
||||
0xbf181f80, 0x0010f040, 0x48714770, 0x6001496f, 0x60014970, 0x68014870, 0x01f0f041, 0x486f6001,
|
||||
0xf0106800, 0xd1080f20, 0xf245486d, 0x60015155, 0x60412106, 0x71fff640, 0x20006081, 0x49694770,
|
||||
0xf4206808, 0x600a52f8, 0x48676008, 0xf0416801, 0x60014100, 0x47702000, 0xc18cf8df, 0x0000f8dc,
|
||||
0x0004f040, 0x0000f8cc, 0x0000f8dc, 0x4000f440, 0x0000f8cc, 0x0000f8dc, 0x3080f440, 0x0000f8cc,
|
||||
0x0004f1ac, 0xf4116801, 0xbf1c3f80, 0x21aaf64a, 0xd0044a53, 0x68036011, 0x3f80f413, 0xf8dcd1fa,
|
||||
0xf0200000, 0xf8cc0004, 0xf8dc0000, 0xf4200000, 0xf8cc4000, 0x20000000, 0xf3c04770, 0x29203107,
|
||||
0x2204bf24, 0x1151eb02, 0x2910d205, 0x2203bf26, 0x1111eb02, 0xf4100889, 0xbf181f80, 0x0110f041,
|
||||
0x6802483d, 0x02f0f042, 0xf1006002, 0x22020c04, 0x2000f8cc, 0x2000f8dc, 0xea0323f8, 0x431101c1,
|
||||
0x1000f8cc, 0x1000f8dc, 0x3180f441, 0x1000f8cc, 0xf4116801, 0xbf1c3f80, 0x21aaf64a, 0xd0044a30,
|
||||
0x68036011, 0x3f80f413, 0xf8dcd1fa, 0xf0211000, 0xf8cc0102, 0x68011000, 0x0ff0f011, 0x2000bf04,
|
||||
0x68014770, 0x01f0f041, 0x20016001, 0x4b224770, 0x1cc9b430, 0xc000f8d3, 0x0103f031, 0x0cf0f04c,
|
||||
0xc000f8c3, 0x0404f103, 0x0c00f04f, 0xc000f8c4, 0xf240bf18, 0xd0252501, 0xc000f8d4, 0x0c05ea4c,
|
||||
0xc000f8c4, 0xc000f8d2, 0xc000f8c0, 0xc000f8d3, 0x3f80f41c, 0xf8d4d1fa, 0xf02cc000, 0xf8c40c01,
|
||||
0xf8d3c000, 0xf01cc000, 0xd0060ff0, 0xf0406818, 0x601800f0, 0x2001bc30, 0x1d004770, 0xf1021f09,
|
||||
0xd1d90204, 0x2000bc30, 0x00004770, 0x45670123, 0x40023c04, 0xcdef89ab, 0x40023c0c, 0x40023c14,
|
||||
0x40003000, 0x40023c00, 0x40023c10, 0x00000000
|
||||
};
|
||||
#if defined (STM32F429xx) || defined (STM32F439xx)
|
||||
#define FLASH_SIZE (uint32_t) 0x200000
|
||||
#endif
|
||||
|
||||
static const flash_algo_t flash_algo_config = {
|
||||
.init = 0x2b,
|
||||
.uninit = 0x5f,
|
||||
.erase_sector = 0xdb,
|
||||
.program_page = 0x16f,
|
||||
.static_base = 0x20c,
|
||||
.algo_blob = FLASH_ALGO
|
||||
};
|
||||
static uint32_t GetSector(uint32_t Address);
|
||||
static uint32_t GetSectorSize(uint32_t Sector);
|
||||
|
||||
static const sector_info_t sectors_info[] = {
|
||||
{0x8000000, 0x4000},
|
||||
{0x8010000, 0x10000},
|
||||
{0x8020000, 0x20000},
|
||||
{0x8100000, 0x4000},
|
||||
{0x8110000, 0x10000},
|
||||
{0x8120000, 0x20000},
|
||||
};
|
||||
|
||||
static const flash_target_config_t flash_target_config = {
|
||||
.page_size = 0x400,
|
||||
.flash_start = 0x8000000,
|
||||
.flash_size = 0x200000,
|
||||
.sectors = sectors_info,
|
||||
.sector_info_count = sizeof(sectors_info) / sizeof(sector_info_t)
|
||||
};
|
||||
|
||||
void flash_set_target_config(flash_t *obj)
|
||||
int32_t flash_init(flash_t *obj)
|
||||
{
|
||||
obj->flash_algo = &flash_algo_config;
|
||||
obj->target_config = &flash_target_config;
|
||||
/* Allow Access to Flash control registers and user Falsh */
|
||||
if (HAL_FLASH_Unlock()) {
|
||||
return -1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
int32_t flash_free(flash_t *obj)
|
||||
{
|
||||
/* Disable the Flash option control register access (recommended to protect
|
||||
the option Bytes against possible unwanted operations) */
|
||||
if (HAL_FLASH_Lock()) {
|
||||
return -1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
int32_t flash_erase_sector(flash_t *obj, uint32_t address)
|
||||
{
|
||||
/*Variable used for Erase procedure*/
|
||||
static FLASH_EraseInitTypeDef EraseInitStruct;
|
||||
uint32_t FirstSector;
|
||||
uint32_t SectorError = 0;
|
||||
|
||||
if ((address >= (FLASH_BASE + FLASH_SIZE)) || (address < FLASH_BASE)) {
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Get the 1st sector to erase */
|
||||
FirstSector = GetSector(address);
|
||||
|
||||
/* Fill EraseInit structure*/
|
||||
EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;
|
||||
EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3;
|
||||
EraseInitStruct.Sector = FirstSector;
|
||||
EraseInitStruct.NbSectors = 1;
|
||||
if(HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError) != HAL_OK){
|
||||
return -1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
int32_t flash_program_page(flash_t *obj, uint32_t address, const uint8_t *data, uint32_t size)
|
||||
{
|
||||
|
||||
if ((address >= (FLASH_BASE + FLASH_SIZE)) || (address < FLASH_BASE)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Note: If an erase operation in Flash memory also concerns data in the data or instruction cache,
|
||||
you have to make sure that these data are rewritten before they are accessed during code
|
||||
execution. If this cannot be done safely, it is recommended to flush the caches by setting the
|
||||
DCRST and ICRST bits in the FLASH_CR register. */
|
||||
__HAL_FLASH_DATA_CACHE_DISABLE();
|
||||
__HAL_FLASH_INSTRUCTION_CACHE_DISABLE();
|
||||
|
||||
__HAL_FLASH_DATA_CACHE_RESET();
|
||||
__HAL_FLASH_INSTRUCTION_CACHE_RESET();
|
||||
|
||||
__HAL_FLASH_INSTRUCTION_CACHE_ENABLE();
|
||||
__HAL_FLASH_DATA_CACHE_ENABLE();
|
||||
|
||||
while (size > 0) {
|
||||
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, address, (uint64_t)*data) != HAL_OK) {
|
||||
return -1;
|
||||
} else {
|
||||
size--;
|
||||
address++;
|
||||
data++;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t flash_get_sector_size(const flash_t *obj, uint32_t address)
|
||||
{
|
||||
|
||||
if ((address >= (FLASH_BASE + FLASH_SIZE)) || (address < FLASH_BASE)) {
|
||||
return MBED_FLASH_INVALID_SIZE;
|
||||
}
|
||||
|
||||
return (GetSectorSize(GetSector(address)));
|
||||
}
|
||||
|
||||
uint32_t flash_get_page_size(const flash_t *obj)
|
||||
{
|
||||
// not applicable for STM32F4
|
||||
return (0x4000); // minimum sector size
|
||||
}
|
||||
uint32_t flash_get_start_address(const flash_t *obj)
|
||||
{
|
||||
return FLASH_BASE;
|
||||
}
|
||||
uint32_t flash_get_size(const flash_t *obj)
|
||||
{
|
||||
return FLASH_SIZE;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Gets the sector of a given address
|
||||
* @param None
|
||||
* @retval The sector of a given address
|
||||
*/
|
||||
static uint32_t GetSector(uint32_t address)
|
||||
{
|
||||
uint32_t sector = 0;
|
||||
uint32_t tmp = address - ADDR_FLASH_SECTOR_0;
|
||||
if (address & 0x100000) { // handle 2nd bank
|
||||
sector = FLASH_SECTOR_12;
|
||||
tmp = address - ADDR_FLASH_SECTOR_12;
|
||||
}
|
||||
if (address < ADDR_FLASH_SECTOR_4) { // 16k sectorsize
|
||||
sector += tmp >>14;
|
||||
} else if (address < ADDR_FLASH_SECTOR_5) { //64k sector size
|
||||
sector += FLASH_SECTOR_4;
|
||||
} else {
|
||||
sector += 4 + (tmp >>17);
|
||||
}
|
||||
return sector;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Gets sector Size
|
||||
* @param None
|
||||
* @retval The size of a given sector
|
||||
*/
|
||||
static uint32_t GetSectorSize(uint32_t Sector)
|
||||
{
|
||||
uint32_t sectorsize = 0x00;
|
||||
if((Sector == FLASH_SECTOR_0) || (Sector == FLASH_SECTOR_1) || (Sector == FLASH_SECTOR_2) ||\
|
||||
(Sector == FLASH_SECTOR_3) || (Sector == FLASH_SECTOR_12) || (Sector == FLASH_SECTOR_13) ||\
|
||||
(Sector == FLASH_SECTOR_14) || (Sector == FLASH_SECTOR_15)) {
|
||||
sectorsize = 16 * 1024;
|
||||
} else if((Sector == FLASH_SECTOR_4) || (Sector == FLASH_SECTOR_16)) {
|
||||
sectorsize = 64 * 1024;
|
||||
} else {
|
||||
sectorsize = 128 * 1024;
|
||||
}
|
||||
return sectorsize;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -0,0 +1,71 @@
|
|||
/* mbed Microcontroller Library
|
||||
*******************************************************************************
|
||||
* Copyright (c) 2016, STMicroelectronics
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of STMicroelectronics nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*******************************************************************************
|
||||
*/
|
||||
#ifndef MBED_FLASH_DATA_H
|
||||
#define MBED_FLASH_DATA_H
|
||||
|
||||
#include "device.h"
|
||||
#include <stdint.h>
|
||||
|
||||
#if DEVICE_FLASH
|
||||
|
||||
/* Exported types ------------------------------------------------------------*/
|
||||
/* Exported constants --------------------------------------------------------*/
|
||||
/* Exported macro ------------------------------------------------------------*/
|
||||
/* Base address of the Flash sectors Bank 1 */
|
||||
#define ADDR_FLASH_SECTOR_0 ((uint32_t)0x08000000) /* Base @ of Sector 0, 16 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_1 ((uint32_t)0x08004000) /* Base @ of Sector 1, 16 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_2 ((uint32_t)0x08008000) /* Base @ of Sector 2, 16 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_3 ((uint32_t)0x0800C000) /* Base @ of Sector 3, 16 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_4 ((uint32_t)0x08010000) /* Base @ of Sector 4, 64 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_5 ((uint32_t)0x08020000) /* Base @ of Sector 5, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_6 ((uint32_t)0x08040000) /* Base @ of Sector 6, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_7 ((uint32_t)0x08060000) /* Base @ of Sector 7, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_8 ((uint32_t)0x08080000) /* Base @ of Sector 8, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_9 ((uint32_t)0x080A0000) /* Base @ of Sector 9, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_10 ((uint32_t)0x080C0000) /* Base @ of Sector 10, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_11 ((uint32_t)0x080E0000) /* Base @ of Sector 11, 128 Kbytes */
|
||||
|
||||
/* Base address of the Flash sectors Bank 2 */
|
||||
#define ADDR_FLASH_SECTOR_12 ((uint32_t)0x08100000) /* Base @ of Sector 0, 16 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_13 ((uint32_t)0x08104000) /* Base @ of Sector 1, 16 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_14 ((uint32_t)0x08108000) /* Base @ of Sector 2, 16 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_15 ((uint32_t)0x0810C000) /* Base @ of Sector 3, 16 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_16 ((uint32_t)0x08110000) /* Base @ of Sector 4, 64 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_17 ((uint32_t)0x08120000) /* Base @ of Sector 5, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_18 ((uint32_t)0x08140000) /* Base @ of Sector 6, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_19 ((uint32_t)0x08160000) /* Base @ of Sector 7, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_20 ((uint32_t)0x08180000) /* Base @ of Sector 8, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_21 ((uint32_t)0x081A0000) /* Base @ of Sector 9, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_22 ((uint32_t)0x081C0000) /* Base @ of Sector 10, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_23 ((uint32_t)0x081E0000) /* Base @ of Sector 11, 128 Kbytes */
|
||||
|
||||
|
||||
#endif
|
||||
#endif
|
|
@ -1,17 +1,31 @@
|
|||
/* mbed Microcontroller Library
|
||||
* Copyright (c) 2017 ARM Limited
|
||||
*******************************************************************************
|
||||
* Copyright (c) 2017, STMicroelectronics
|
||||
* All rights reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of STMicroelectronics nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
#include "flash_api.h"
|
||||
|
@ -22,57 +36,157 @@
|
|||
|
||||
#if DEVICE_FLASH
|
||||
|
||||
// This is a flash algo binary blob. It is PIC (position independent code) that should be stored in RAM
|
||||
static uint32_t FLASH_ALGO[] = {
|
||||
0xf3c04601, 0x28203007, 0x2204bf24, 0x1050eb02, 0x2810d205, 0x2203bf26, 0x1010eb02, 0xf4110880,
|
||||
0xbf181f80, 0x0010f040, 0x48714770, 0x6001496f, 0x60014970, 0x68014870, 0x01f0f041, 0x486f6001,
|
||||
0xf0106800, 0xd1080f20, 0xf245486d, 0x60015155, 0x60412106, 0x71fff640, 0x20006081, 0x49694770,
|
||||
0xf4206808, 0x600a52f8, 0x48676008, 0xf0416801, 0x60014100, 0x47702000, 0xc18cf8df, 0x0000f8dc,
|
||||
0x0004f040, 0x0000f8cc, 0x0000f8dc, 0x4000f440, 0x0000f8cc, 0x0000f8dc, 0x3080f440, 0x0000f8cc,
|
||||
0x0004f1ac, 0xf4116801, 0xbf1c3f80, 0x21aaf64a, 0xd0044a53, 0x68036011, 0x3f80f413, 0xf8dcd1fa,
|
||||
0xf0200000, 0xf8cc0004, 0xf8dc0000, 0xf4200000, 0xf8cc4000, 0x20000000, 0xf3c04770, 0x29203107,
|
||||
0x2204bf24, 0x1151eb02, 0x2910d205, 0x2203bf26, 0x1111eb02, 0xf4100889, 0xbf181f80, 0x0110f041,
|
||||
0x6802483d, 0x02f0f042, 0xf1006002, 0x22020c04, 0x2000f8cc, 0x2000f8dc, 0xea0323f8, 0x431101c1,
|
||||
0x1000f8cc, 0x1000f8dc, 0x3180f441, 0x1000f8cc, 0xf4116801, 0xbf1c3f80, 0x21aaf64a, 0xd0044a30,
|
||||
0x68036011, 0x3f80f413, 0xf8dcd1fa, 0xf0211000, 0xf8cc0102, 0x68011000, 0x0ff0f011, 0x2000bf04,
|
||||
0x68014770, 0x01f0f041, 0x20016001, 0x4b224770, 0x1cc9b430, 0xc000f8d3, 0x0103f031, 0x0cf0f04c,
|
||||
0xc000f8c3, 0x0404f103, 0x0c00f04f, 0xc000f8c4, 0xf240bf18, 0xd0252501, 0xc000f8d4, 0x0c05ea4c,
|
||||
0xc000f8c4, 0xc000f8d2, 0xc000f8c0, 0xc000f8d3, 0x3f80f41c, 0xf8d4d1fa, 0xf02cc000, 0xf8c40c01,
|
||||
0xf8d3c000, 0xf01cc000, 0xd0060ff0, 0xf0406818, 0x601800f0, 0x2001bc30, 0x1d004770, 0xf1021f09,
|
||||
0xd1d90204, 0x2000bc30, 0x00004770, 0x45670123, 0x40023c04, 0xcdef89ab, 0x40023c0c, 0x40023c14,
|
||||
0x40003000, 0x40023c00, 0x40023c10, 0x00000000
|
||||
};
|
||||
#if defined (STM32F429xx) || defined (STM32F439xx)
|
||||
#define FLASH_SIZE (uint32_t) 0x200000
|
||||
#endif
|
||||
|
||||
static const flash_algo_t flash_algo_config = {
|
||||
.init = 0x2b,
|
||||
.uninit = 0x5f,
|
||||
.erase_sector = 0xdb,
|
||||
.program_page = 0x16f,
|
||||
.static_base = 0x20c,
|
||||
.algo_blob = FLASH_ALGO
|
||||
};
|
||||
static uint32_t GetSector(uint32_t Address);
|
||||
static uint32_t GetSectorSize(uint32_t Sector);
|
||||
|
||||
static const sector_info_t sectors_info[] = {
|
||||
{0x8000000, 0x4000},
|
||||
{0x8010000, 0x10000},
|
||||
{0x8020000, 0x20000},
|
||||
{0x8100000, 0x4000},
|
||||
{0x8110000, 0x10000},
|
||||
{0x8120000, 0x20000},
|
||||
};
|
||||
|
||||
static const flash_target_config_t flash_target_config = {
|
||||
.page_size = 0x400,
|
||||
.flash_start = 0x8000000,
|
||||
.flash_size = 0x200000,
|
||||
.sectors = sectors_info,
|
||||
.sector_info_count = sizeof(sectors_info) / sizeof(sector_info_t)
|
||||
};
|
||||
|
||||
void flash_set_target_config(flash_t *obj)
|
||||
int32_t flash_init(flash_t *obj)
|
||||
{
|
||||
obj->flash_algo = &flash_algo_config;
|
||||
obj->target_config = &flash_target_config;
|
||||
/* Allow Access to Flash control registers and user Falsh */
|
||||
if (HAL_FLASH_Unlock()) {
|
||||
return -1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
int32_t flash_free(flash_t *obj)
|
||||
{
|
||||
/* Disable the Flash option control register access (recommended to protect
|
||||
the option Bytes against possible unwanted operations) */
|
||||
if (HAL_FLASH_Lock()) {
|
||||
return -1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
int32_t flash_erase_sector(flash_t *obj, uint32_t address)
|
||||
{
|
||||
/*Variable used for Erase procedure*/
|
||||
static FLASH_EraseInitTypeDef EraseInitStruct;
|
||||
uint32_t FirstSector;
|
||||
uint32_t SectorError = 0;
|
||||
|
||||
if ((address >= (FLASH_BASE + FLASH_SIZE)) || (address < FLASH_BASE)) {
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Get the 1st sector to erase */
|
||||
FirstSector = GetSector(address);
|
||||
|
||||
/* Fill EraseInit structure*/
|
||||
EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;
|
||||
EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3;
|
||||
EraseInitStruct.Sector = FirstSector;
|
||||
EraseInitStruct.NbSectors = 1;
|
||||
if(HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError) != HAL_OK){
|
||||
return -1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
int32_t flash_program_page(flash_t *obj, uint32_t address, const uint8_t *data, uint32_t size)
|
||||
{
|
||||
|
||||
if ((address >= (FLASH_BASE + FLASH_SIZE)) || (address < FLASH_BASE)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Note: If an erase operation in Flash memory also concerns data in the data or instruction cache,
|
||||
you have to make sure that these data are rewritten before they are accessed during code
|
||||
execution. If this cannot be done safely, it is recommended to flush the caches by setting the
|
||||
DCRST and ICRST bits in the FLASH_CR register. */
|
||||
__HAL_FLASH_DATA_CACHE_DISABLE();
|
||||
__HAL_FLASH_INSTRUCTION_CACHE_DISABLE();
|
||||
|
||||
__HAL_FLASH_DATA_CACHE_RESET();
|
||||
__HAL_FLASH_INSTRUCTION_CACHE_RESET();
|
||||
|
||||
__HAL_FLASH_INSTRUCTION_CACHE_ENABLE();
|
||||
__HAL_FLASH_DATA_CACHE_ENABLE();
|
||||
|
||||
while (size > 0) {
|
||||
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, address, (uint64_t)*data) != HAL_OK) {
|
||||
return -1;
|
||||
} else {
|
||||
size--;
|
||||
address++;
|
||||
data++;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t flash_get_sector_size(const flash_t *obj, uint32_t address)
|
||||
{
|
||||
|
||||
if ((address >= (FLASH_BASE + FLASH_SIZE)) || (address < FLASH_BASE)) {
|
||||
return MBED_FLASH_INVALID_SIZE;
|
||||
}
|
||||
|
||||
return (GetSectorSize(GetSector(address)));
|
||||
}
|
||||
|
||||
uint32_t flash_get_page_size(const flash_t *obj)
|
||||
{
|
||||
// not applicable for STM32F4
|
||||
return (0x4000); // minimum sector size
|
||||
}
|
||||
uint32_t flash_get_start_address(const flash_t *obj)
|
||||
{
|
||||
return FLASH_BASE;
|
||||
}
|
||||
uint32_t flash_get_size(const flash_t *obj)
|
||||
{
|
||||
return FLASH_SIZE;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Gets the sector of a given address
|
||||
* @param None
|
||||
* @retval The sector of a given address
|
||||
*/
|
||||
static uint32_t GetSector(uint32_t address)
|
||||
{
|
||||
uint32_t sector = 0;
|
||||
uint32_t tmp = address - ADDR_FLASH_SECTOR_0;
|
||||
if (address & 0x100000) { // handle 2nd bank
|
||||
sector = FLASH_SECTOR_12;
|
||||
tmp = address - ADDR_FLASH_SECTOR_12;
|
||||
}
|
||||
if (address < ADDR_FLASH_SECTOR_4) { // 16k sectorsize
|
||||
//printf("tmp for sectors less than 4: 0X%4x")
|
||||
sector += tmp >>14;
|
||||
} else if (address < ADDR_FLASH_SECTOR_5) { //64k sector size
|
||||
sector += FLASH_SECTOR_4;
|
||||
} else {
|
||||
sector += 4 + (tmp >>17);
|
||||
}
|
||||
return sector;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Gets sector Size
|
||||
* @param None
|
||||
* @retval The size of a given sector
|
||||
*/
|
||||
static uint32_t GetSectorSize(uint32_t Sector)
|
||||
{
|
||||
uint32_t sectorsize = 0x00;
|
||||
if((Sector == FLASH_SECTOR_0) || (Sector == FLASH_SECTOR_1) || (Sector == FLASH_SECTOR_2) ||\
|
||||
(Sector == FLASH_SECTOR_3) || (Sector == FLASH_SECTOR_12) || (Sector == FLASH_SECTOR_13) ||\
|
||||
(Sector == FLASH_SECTOR_14) || (Sector == FLASH_SECTOR_15)) {
|
||||
sectorsize = 16 * 1024;
|
||||
} else if((Sector == FLASH_SECTOR_4) || (Sector == FLASH_SECTOR_16)){
|
||||
sectorsize = 64 * 1024;
|
||||
} else {
|
||||
sectorsize = 128 * 1024;
|
||||
}
|
||||
return sectorsize;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -0,0 +1,71 @@
|
|||
/* mbed Microcontroller Library
|
||||
*******************************************************************************
|
||||
* Copyright (c) 2016, STMicroelectronics
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of STMicroelectronics nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*******************************************************************************
|
||||
*/
|
||||
#ifndef MBED_FLASH_DATA_H
|
||||
#define MBED_FLASH_DATA_H
|
||||
|
||||
#include "device.h"
|
||||
#include <stdint.h>
|
||||
|
||||
#if DEVICE_FLASH
|
||||
|
||||
/* Exported types ------------------------------------------------------------*/
|
||||
/* Exported constants --------------------------------------------------------*/
|
||||
/* Exported macro ------------------------------------------------------------*/
|
||||
/* Base address of the Flash sectors Bank 1 */
|
||||
#define ADDR_FLASH_SECTOR_0 ((uint32_t)0x08000000) /* Base @ of Sector 0, 16 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_1 ((uint32_t)0x08004000) /* Base @ of Sector 1, 16 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_2 ((uint32_t)0x08008000) /* Base @ of Sector 2, 16 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_3 ((uint32_t)0x0800C000) /* Base @ of Sector 3, 16 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_4 ((uint32_t)0x08010000) /* Base @ of Sector 4, 64 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_5 ((uint32_t)0x08020000) /* Base @ of Sector 5, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_6 ((uint32_t)0x08040000) /* Base @ of Sector 6, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_7 ((uint32_t)0x08060000) /* Base @ of Sector 7, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_8 ((uint32_t)0x08080000) /* Base @ of Sector 8, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_9 ((uint32_t)0x080A0000) /* Base @ of Sector 9, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_10 ((uint32_t)0x080C0000) /* Base @ of Sector 10, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_11 ((uint32_t)0x080E0000) /* Base @ of Sector 11, 128 Kbytes */
|
||||
|
||||
/* Base address of the Flash sectors Bank 2 */
|
||||
#define ADDR_FLASH_SECTOR_12 ((uint32_t)0x08100000) /* Base @ of Sector 0, 16 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_13 ((uint32_t)0x08104000) /* Base @ of Sector 1, 16 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_14 ((uint32_t)0x08108000) /* Base @ of Sector 2, 16 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_15 ((uint32_t)0x0810C000) /* Base @ of Sector 3, 16 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_16 ((uint32_t)0x08110000) /* Base @ of Sector 4, 64 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_17 ((uint32_t)0x08120000) /* Base @ of Sector 5, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_18 ((uint32_t)0x08140000) /* Base @ of Sector 6, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_19 ((uint32_t)0x08160000) /* Base @ of Sector 7, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_20 ((uint32_t)0x08180000) /* Base @ of Sector 8, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_21 ((uint32_t)0x081A0000) /* Base @ of Sector 9, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_22 ((uint32_t)0x081C0000) /* Base @ of Sector 10, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_23 ((uint32_t)0x081E0000) /* Base @ of Sector 11, 128 Kbytes */
|
||||
|
||||
|
||||
#endif
|
||||
#endif
|
|
@ -0,0 +1,71 @@
|
|||
/* mbed Microcontroller Library
|
||||
*******************************************************************************
|
||||
* Copyright (c) 2016, STMicroelectronics
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of STMicroelectronics nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*******************************************************************************
|
||||
*/
|
||||
#ifndef MBED_FLASH_DATA_H
|
||||
#define MBED_FLASH_DATA_H
|
||||
|
||||
#include "device.h"
|
||||
#include <stdint.h>
|
||||
|
||||
#if DEVICE_FLASH
|
||||
|
||||
/* Exported types ------------------------------------------------------------*/
|
||||
/* Exported constants --------------------------------------------------------*/
|
||||
/* Exported macro ------------------------------------------------------------*/
|
||||
/* Base address of the Flash sectors Bank 1 */
|
||||
#define ADDR_FLASH_SECTOR_0 ((uint32_t)0x08000000) /* Base @ of Sector 0, 16 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_1 ((uint32_t)0x08004000) /* Base @ of Sector 1, 16 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_2 ((uint32_t)0x08008000) /* Base @ of Sector 2, 16 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_3 ((uint32_t)0x0800C000) /* Base @ of Sector 3, 16 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_4 ((uint32_t)0x08010000) /* Base @ of Sector 4, 64 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_5 ((uint32_t)0x08020000) /* Base @ of Sector 5, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_6 ((uint32_t)0x08040000) /* Base @ of Sector 6, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_7 ((uint32_t)0x08060000) /* Base @ of Sector 7, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_8 ((uint32_t)0x08080000) /* Base @ of Sector 8, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_9 ((uint32_t)0x080A0000) /* Base @ of Sector 9, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_10 ((uint32_t)0x080C0000) /* Base @ of Sector 10, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_11 ((uint32_t)0x080E0000) /* Base @ of Sector 11, 128 Kbytes */
|
||||
|
||||
/* Base address of the Flash sectors Bank 2 */
|
||||
#define ADDR_FLASH_SECTOR_12 ((uint32_t)0x08100000) /* Base @ of Sector 0, 16 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_13 ((uint32_t)0x08104000) /* Base @ of Sector 1, 16 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_14 ((uint32_t)0x08108000) /* Base @ of Sector 2, 16 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_15 ((uint32_t)0x0810C000) /* Base @ of Sector 3, 16 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_16 ((uint32_t)0x08110000) /* Base @ of Sector 4, 64 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_17 ((uint32_t)0x08120000) /* Base @ of Sector 5, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_18 ((uint32_t)0x08140000) /* Base @ of Sector 6, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_19 ((uint32_t)0x08160000) /* Base @ of Sector 7, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_20 ((uint32_t)0x08180000) /* Base @ of Sector 8, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_21 ((uint32_t)0x081A0000) /* Base @ of Sector 9, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_22 ((uint32_t)0x081C0000) /* Base @ of Sector 10, 128 Kbytes */
|
||||
#define ADDR_FLASH_SECTOR_23 ((uint32_t)0x081E0000) /* Base @ of Sector 11, 128 Kbytes */
|
||||
|
||||
|
||||
#endif
|
||||
#endif
|
|
@ -188,6 +188,9 @@ static inline uint16_t adc_read(analogin_t *obj)
|
|||
break;
|
||||
case 18:
|
||||
sConfig.Channel = ADC_CHANNEL_VBAT;
|
||||
/* From experiment, VBAT measurement needs max
|
||||
* sampling time to be avlid */
|
||||
sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
|
|
|
@ -109,7 +109,11 @@ struct i2c_s {
|
|||
uint8_t available_events;
|
||||
#endif
|
||||
};
|
||||
|
||||
#if DEVICE_FLASH
|
||||
struct flash_s {
|
||||
uint32_t dummy;
|
||||
};
|
||||
#endif
|
||||
#define GPIO_IP_WITHOUT_BRR
|
||||
#include "gpio_object.h"
|
||||
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
;******************** (C) COPYRIGHT 2016 STMicroelectronics ********************
|
||||
;* File Name : startup_stm32f769xx.s
|
||||
;* File Name : startup_stm32f767xx.s
|
||||
;* Author : MCD Application Team
|
||||
;* Version : V1.1.0
|
||||
;* Date : 22-April-2016
|
||||
;* Description : STM32F769xx devices vector table for MDK-ARM toolchain.
|
||||
;* Version : V1.2.0
|
||||
;* Date : 30-December-2016
|
||||
;* Description : STM32F767xx devices vector table for MDK-ARM toolchain.
|
||||
;* This module performs:
|
||||
;* - Set the initial SP
|
||||
;* - Set the initial PC == Reset_Handler
|
||||
|
@ -145,7 +145,7 @@ __Vectors DCD __initial_sp ; Top of Stack
|
|||
DCD TIM8_CC_IRQHandler ; TIM8 Capture Compare
|
||||
DCD DMA1_Stream7_IRQHandler ; DMA1 Stream7
|
||||
DCD FMC_IRQHandler ; FMC
|
||||
DCD SDMMC1_IRQHandler ; SDMMC1
|
||||
DCD SDMMC1_IRQHandler ; SDMMC1
|
||||
DCD TIM5_IRQHandler ; TIM5
|
||||
DCD SPI3_IRQHandler ; SPI3
|
||||
DCD UART4_IRQHandler ; UART4
|
||||
|
@ -194,7 +194,7 @@ __Vectors DCD __initial_sp ; Top of Stack
|
|||
DCD I2C4_EV_IRQHandler ; I2C4 Event
|
||||
DCD I2C4_ER_IRQHandler ; I2C4 Error
|
||||
DCD SPDIF_RX_IRQHandler ; SPDIF_RX
|
||||
DCD DSI_IRQHandler ; DSI
|
||||
DCD 0 ; Reserved
|
||||
DCD DFSDM1_FLT0_IRQHandler ; DFSDM1 Filter 0 global Interrupt
|
||||
DCD DFSDM1_FLT1_IRQHandler ; DFSDM1 Filter 1 global Interrupt
|
||||
DCD DFSDM1_FLT2_IRQHandler ; DFSDM1 Filter 2 global Interrupt
|
||||
|
@ -367,7 +367,6 @@ Default_Handler PROC
|
|||
EXPORT I2C4_EV_IRQHandler [WEAK]
|
||||
EXPORT I2C4_ER_IRQHandler [WEAK]
|
||||
EXPORT SPDIF_RX_IRQHandler [WEAK]
|
||||
EXPORT DSI_IRQHandler [WEAK]
|
||||
EXPORT DFSDM1_FLT0_IRQHandler [WEAK]
|
||||
EXPORT DFSDM1_FLT1_IRQHandler [WEAK]
|
||||
EXPORT DFSDM1_FLT2_IRQHandler [WEAK]
|
||||
|
@ -466,9 +465,9 @@ UART8_IRQHandler
|
|||
SPI4_IRQHandler
|
||||
SPI5_IRQHandler
|
||||
SPI6_IRQHandler
|
||||
SAI1_IRQHandler
|
||||
LTDC_IRQHandler
|
||||
LTDC_ER_IRQHandler
|
||||
SAI1_IRQHandler
|
||||
LTDC_IRQHandler
|
||||
LTDC_ER_IRQHandler
|
||||
DMA2D_IRQHandler
|
||||
SAI2_IRQHandler
|
||||
QUADSPI_IRQHandler
|
||||
|
@ -477,7 +476,6 @@ CEC_IRQHandler
|
|||
I2C4_EV_IRQHandler
|
||||
I2C4_ER_IRQHandler
|
||||
SPDIF_RX_IRQHandler
|
||||
DSI_IRQHandler
|
||||
DFSDM1_FLT0_IRQHandler
|
||||
DFSDM1_FLT1_IRQHandler
|
||||
DFSDM1_FLT2_IRQHandler
|
|
@ -1,9 +1,9 @@
|
|||
;******************** (C) COPYRIGHT 2016 STMicroelectronics ********************
|
||||
;* File Name : startup_stm32f769xx.s
|
||||
;* File Name : startup_stm32f767xx.s
|
||||
;* Author : MCD Application Team
|
||||
;* Version : V1.1.0
|
||||
;* Date : 22-April-2016
|
||||
;* Description : STM32F769xx devices vector table for MDK-ARM toolchain.
|
||||
;* Version : V1.2.0
|
||||
;* Date : 30-December-2016
|
||||
;* Description : STM32F767xx devices vector table for MDK-ARM toolchain.
|
||||
;* This module performs:
|
||||
;* - Set the initial SP
|
||||
;* - Set the initial PC == Reset_Handler
|
||||
|
@ -124,7 +124,7 @@ __Vectors DCD __initial_sp ; Top of Stack
|
|||
DCD TIM8_CC_IRQHandler ; TIM8 Capture Compare
|
||||
DCD DMA1_Stream7_IRQHandler ; DMA1 Stream7
|
||||
DCD FMC_IRQHandler ; FMC
|
||||
DCD SDMMC1_IRQHandler ; SDMMC1
|
||||
DCD SDMMC1_IRQHandler ; SDMMC1
|
||||
DCD TIM5_IRQHandler ; TIM5
|
||||
DCD SPI3_IRQHandler ; SPI3
|
||||
DCD UART4_IRQHandler ; UART4
|
||||
|
@ -173,7 +173,7 @@ __Vectors DCD __initial_sp ; Top of Stack
|
|||
DCD I2C4_EV_IRQHandler ; I2C4 Event
|
||||
DCD I2C4_ER_IRQHandler ; I2C4 Error
|
||||
DCD SPDIF_RX_IRQHandler ; SPDIF_RX
|
||||
DCD DSI_IRQHandler ; DSI
|
||||
DCD 0 ; Reserved
|
||||
DCD DFSDM1_FLT0_IRQHandler ; DFSDM1 Filter 0 global Interrupt
|
||||
DCD DFSDM1_FLT1_IRQHandler ; DFSDM1 Filter 1 global Interrupt
|
||||
DCD DFSDM1_FLT2_IRQHandler ; DFSDM1 Filter 2 global Interrupt
|
||||
|
@ -346,7 +346,6 @@ Default_Handler PROC
|
|||
EXPORT I2C4_EV_IRQHandler [WEAK]
|
||||
EXPORT I2C4_ER_IRQHandler [WEAK]
|
||||
EXPORT SPDIF_RX_IRQHandler [WEAK]
|
||||
EXPORT DSI_IRQHandler [WEAK]
|
||||
EXPORT DFSDM1_FLT0_IRQHandler [WEAK]
|
||||
EXPORT DFSDM1_FLT1_IRQHandler [WEAK]
|
||||
EXPORT DFSDM1_FLT2_IRQHandler [WEAK]
|
||||
|
@ -445,9 +444,9 @@ UART8_IRQHandler
|
|||
SPI4_IRQHandler
|
||||
SPI5_IRQHandler
|
||||
SPI6_IRQHandler
|
||||
SAI1_IRQHandler
|
||||
LTDC_IRQHandler
|
||||
LTDC_ER_IRQHandler
|
||||
SAI1_IRQHandler
|
||||
LTDC_IRQHandler
|
||||
LTDC_ER_IRQHandler
|
||||
DMA2D_IRQHandler
|
||||
SAI2_IRQHandler
|
||||
QUADSPI_IRQHandler
|
||||
|
@ -456,7 +455,6 @@ CEC_IRQHandler
|
|||
I2C4_EV_IRQHandler
|
||||
I2C4_ER_IRQHandler
|
||||
SPDIF_RX_IRQHandler
|
||||
DSI_IRQHandler
|
||||
DFSDM1_FLT0_IRQHandler
|
||||
DFSDM1_FLT1_IRQHandler
|
||||
DFSDM1_FLT2_IRQHandler
|
|
@ -1,10 +1,10 @@
|
|||
/**
|
||||
******************************************************************************
|
||||
* @file startup_stm32f769xx.s
|
||||
* @file startup_stm32f767xx.s
|
||||
* @author MCD Application Team
|
||||
* @version V1.1.0
|
||||
* @date 22-April-2016
|
||||
* @brief STM32F769xx Devices vector table for GCC based toolchain.
|
||||
* @version V1.2.0
|
||||
* @date 30-December-2016
|
||||
* @brief STM32F767xx Devices vector table for GCC based toolchain.
|
||||
* This module performs:
|
||||
* - Set the initial SP
|
||||
* - Set the initial PC == Reset_Handler,
|
||||
|
@ -58,6 +58,10 @@ defined in linker script */
|
|||
.word _sdata
|
||||
/* end address for the .data section. defined in linker script */
|
||||
.word _edata
|
||||
/* start address for the .bss section. defined in linker script */
|
||||
.word _sbss
|
||||
/* end address for the .bss section. defined in linker script */
|
||||
.word _ebss
|
||||
/* stack used for SystemInit_ExtMemCtl; always internal RAM used */
|
||||
|
||||
/**
|
||||
|
@ -91,18 +95,24 @@ LoopCopyDataInit:
|
|||
adds r2, r0, r1
|
||||
cmp r2, r3
|
||||
bcc CopyDataInit
|
||||
ldr r2, =_sbss
|
||||
b LoopFillZerobss
|
||||
/* Zero fill the bss segment. */
|
||||
FillZerobss:
|
||||
movs r3, #0
|
||||
str r3, [r2], #4
|
||||
|
||||
LoopFillZerobss:
|
||||
ldr r3, = _ebss
|
||||
cmp r2, r3
|
||||
bcc FillZerobss
|
||||
|
||||
/* Call the clock system initialization function.*/
|
||||
bl SystemInit
|
||||
/* Call static constructors */
|
||||
//bl __libc_init_array
|
||||
bl __libc_init_array
|
||||
/* Call the application's entry point.*/
|
||||
//bl main
|
||||
// Calling the crt0 'cold-start' entry point. There __libc_init_array is called
|
||||
// and when existing hardware_init_hook() and software_init_hook() before
|
||||
// starting main(). software_init_hook() is available and has to be called due
|
||||
// to initializsation when using rtos.
|
||||
bl _start
|
||||
bl main
|
||||
bx lr
|
||||
.size Reset_Handler, .-Reset_Handler
|
||||
|
||||
|
@ -248,7 +258,7 @@ g_pfnVectors:
|
|||
.word I2C4_EV_IRQHandler /* I2C4 Event */
|
||||
.word I2C4_ER_IRQHandler /* I2C4 Error */
|
||||
.word SPDIF_RX_IRQHandler /* SPDIF_RX */
|
||||
.word DSI_IRQHandler /* DSI */
|
||||
.word 0 /* Reserved */
|
||||
.word DFSDM1_FLT0_IRQHandler /* DFSDM1 Filter 0 global Interrupt */
|
||||
.word DFSDM1_FLT1_IRQHandler /* DFSDM1 Filter 1 global Interrupt */
|
||||
.word DFSDM1_FLT2_IRQHandler /* DFSDM1 Filter 2 global Interrupt */
|
||||
|
@ -589,9 +599,6 @@ g_pfnVectors:
|
|||
.weak SPDIF_RX_IRQHandler
|
||||
.thumb_set SPDIF_RX_IRQHandler,Default_Handler
|
||||
|
||||
.weak DSI_IRQHandler
|
||||
.thumb_set DSI_IRQHandler,Default_Handler
|
||||
|
||||
.weak DFSDM1_FLT0_IRQHandler
|
||||
.thumb_set DFSDM1_FLT0_IRQHandler,Default_Handler
|
||||
|
||||
|
@ -625,5 +632,5 @@ g_pfnVectors:
|
|||
.weak MDIOS_IRQHandler
|
||||
.thumb_set MDIOS_IRQHandler,Default_Handler
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
||||
|
|
@ -239,19 +239,19 @@ static void uart_irq(int id)
|
|||
|
||||
if (serial_irq_ids[id] != 0) {
|
||||
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_TC) != RESET) {
|
||||
if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_TC) != RESET) {
|
||||
if (__HAL_UART_GET_IT(huart, UART_IT_TC) != RESET) {
|
||||
irq_handler(serial_irq_ids[id], TxIrq);
|
||||
__HAL_UART_CLEAR_IT(huart, UART_CLEAR_TCF);
|
||||
}
|
||||
}
|
||||
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) {
|
||||
if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_RXNE) != RESET) {
|
||||
if (__HAL_UART_GET_IT(huart, UART_IT_RXNE) != RESET) {
|
||||
irq_handler(serial_irq_ids[id], RxIrq);
|
||||
volatile uint32_t tmpval = huart->Instance->RDR; // Clear RXNE
|
||||
}
|
||||
}
|
||||
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) {
|
||||
if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_ORE) != RESET) {
|
||||
if (__HAL_UART_GET_IT(huart, UART_IT_ORE) != RESET) {
|
||||
__HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF);
|
||||
}
|
||||
}
|
||||
|
@ -744,19 +744,19 @@ int serial_irq_handler_asynch(serial_t *obj)
|
|||
|
||||
// Handle error events
|
||||
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_PE) != RESET) {
|
||||
if (__HAL_UART_GET_IT_SOURCE(huart, USART_IT_ERR) != RESET) {
|
||||
if (__HAL_UART_GET_IT(huart, UART_IT_PE) != RESET) {
|
||||
return_event |= (SERIAL_EVENT_RX_PARITY_ERROR & obj_s->events);
|
||||
}
|
||||
}
|
||||
|
||||
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_FE) != RESET) {
|
||||
if (__HAL_UART_GET_IT_SOURCE(huart, USART_IT_ERR) != RESET) {
|
||||
if (__HAL_UART_GET_IT(huart, UART_IT_FE) != RESET) {
|
||||
return_event |= (SERIAL_EVENT_RX_FRAMING_ERROR & obj_s->events);
|
||||
}
|
||||
}
|
||||
|
||||
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) {
|
||||
if (__HAL_UART_GET_IT_SOURCE(huart, USART_IT_ERR) != RESET) {
|
||||
if (__HAL_UART_GET_IT(huart, UART_IT_ORE) != RESET) {
|
||||
return_event |= (SERIAL_EVENT_RX_OVERRUN_ERROR & obj_s->events);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -49,6 +49,10 @@ const PinMap PinMap_ADC[] = {
|
|||
{PA_7, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7
|
||||
{PB_0, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8
|
||||
{PB_1, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
const PinMap PinMap_ADC_Internal[] = {
|
||||
{ADC_TEMP, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 18, 0)}, // See in analogin_api.c the correct ADC channel used
|
||||
{ADC_VREF, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 17, 0)}, // See in analogin_api.c the correct ADC channel used
|
||||
{ADC_VLCD, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 16, 0)}, // See in analogin_api.c the correct ADC channel used
|
||||
|
|
|
@ -49,6 +49,10 @@ const PinMap PinMap_ADC[] = {
|
|||
{PA_7, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC_IN7
|
||||
{PB_0, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC_IN8
|
||||
{PB_1, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC_IN9
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
const PinMap PinMap_ADC_Internal[] = {
|
||||
{ADC_TEMP, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 18, 0)}, // See in analogin_api.c the correct ADC channel used
|
||||
{ADC_VREF, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 17, 0)}, // See in analogin_api.c the correct ADC channel used
|
||||
{NC, NC, 0}
|
||||
|
|
|
@ -49,6 +49,10 @@ const PinMap PinMap_ADC[] = {
|
|||
{PA_7, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7
|
||||
{PB_0, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8
|
||||
{PB_1, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
const PinMap PinMap_ADC_Internal[] = {
|
||||
{ADC_TEMP, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 18, 0)}, // See in analogin_api.c the correct ADC channel used
|
||||
{ADC_VREF, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 17, 0)}, // See in analogin_api.c the correct ADC channel used
|
||||
{NC, NC, 0}
|
||||
|
|
|
@ -55,6 +55,10 @@ const PinMap PinMap_ADC[] = {
|
|||
{PC_3, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13
|
||||
{PC_4, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14
|
||||
{PC_5, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
const PinMap PinMap_ADC_Internal[] = {
|
||||
{ADC_TEMP, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 18, 0)}, // See in analogin_api.c the correct ADC channel used
|
||||
{ADC_VREF, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 17, 0)}, // See in analogin_api.c the correct ADC channel used
|
||||
{ADC_VLCD, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 16, 0)}, // See in analogin_api.c the correct ADC channel used
|
||||
|
|
|
@ -55,6 +55,10 @@ const PinMap PinMap_ADC[] = {
|
|||
{PC_3, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13
|
||||
{PC_4, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14
|
||||
{PC_5, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
const PinMap PinMap_ADC_Internal[] = {
|
||||
{ADC_TEMP, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 18, 0)}, // See in analogin_api.c the correct ADC channel used
|
||||
{ADC_VREF, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 17, 0)}, // See in analogin_api.c the correct ADC channel used
|
||||
{ADC_VLCD, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 16, 0)}, // See in analogin_api.c the correct ADC channel used
|
||||
|
|
|
@ -42,20 +42,30 @@ int adc_inited = 0;
|
|||
|
||||
void analogin_init(analogin_t *obj, PinName pin)
|
||||
{
|
||||
// Get the peripheral name from the pin and assign it to the object
|
||||
obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC);
|
||||
MBED_ASSERT(obj->adc != (ADCName)NC);
|
||||
uint32_t function = (uint32_t)NC;
|
||||
obj->adc = (ADCName)NC;
|
||||
|
||||
// Get the pin function and assign the used channel to the object
|
||||
uint32_t function = pinmap_function(pin, PinMap_ADC);
|
||||
MBED_ASSERT(function != (uint32_t)NC);
|
||||
obj->channel = STM_PIN_CHANNEL(function);
|
||||
|
||||
// Configure GPIO excepted for internal channels (Temperature, Vref, Vbat, ...)
|
||||
// ADC Internal Channels "pins" are described in PinNames.h and must have a value >= 0xF0
|
||||
// ADC Internal Channels "pins" (Temperature, Vref, Vbat, ...)
|
||||
// are described in PinNames.h and PeripheralPins.c
|
||||
// Pin value must be >= 0xF0
|
||||
if (pin < 0xF0) {
|
||||
// Normal channels
|
||||
// Get the peripheral name from the pin and assign it to the object
|
||||
obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC);
|
||||
// Get the functions (adc channel) from the pin and assign it to the object
|
||||
function = pinmap_function(pin, PinMap_ADC);
|
||||
// Configure GPIO
|
||||
pinmap_pinout(pin, PinMap_ADC);
|
||||
} else {
|
||||
// Internal channels
|
||||
obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC_Internal);
|
||||
function = pinmap_function(pin, PinMap_ADC_Internal);
|
||||
// No GPIO configuration for internal channels
|
||||
}
|
||||
MBED_ASSERT(obj->adc != (ADCName)NC);
|
||||
MBED_ASSERT(function != (uint32_t)NC);
|
||||
|
||||
obj->channel = STM_PIN_CHANNEL(function);
|
||||
|
||||
// Save pin number for the read function
|
||||
obj->pin = pin;
|
||||
|
|
|
@ -202,19 +202,19 @@ static void uart_irq(int id)
|
|||
|
||||
if (serial_irq_ids[id] != 0) {
|
||||
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_TC) != RESET) {
|
||||
if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_TC) != RESET) {
|
||||
if (__HAL_UART_GET_IT(huart, UART_IT_TC) != RESET) {
|
||||
irq_handler(serial_irq_ids[id], TxIrq);
|
||||
__HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_TCF);
|
||||
}
|
||||
}
|
||||
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) {
|
||||
if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_RXNE) != RESET) {
|
||||
if (__HAL_UART_GET_IT(huart, UART_IT_RXNE) != RESET) {
|
||||
irq_handler(serial_irq_ids[id], RxIrq);
|
||||
volatile uint32_t tmpval = huart->Instance->RDR; // Clear RXNE flag
|
||||
}
|
||||
}
|
||||
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) {
|
||||
if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_ORE) != RESET) {
|
||||
if (__HAL_UART_GET_IT(huart, UART_IT_ORE) != RESET) {
|
||||
__HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF);
|
||||
}
|
||||
}
|
||||
|
@ -645,27 +645,27 @@ int serial_irq_handler_asynch(serial_t *obj)
|
|||
|
||||
// Handle error events
|
||||
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_PE) != RESET) {
|
||||
if (__HAL_UART_GET_IT_SOURCE(huart, USART_IT_ERR) != RESET) {
|
||||
__HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_PEF);
|
||||
if (__HAL_UART_GET_IT(huart, USART_IT_ERR) != RESET) {
|
||||
return_event |= (SERIAL_EVENT_RX_PARITY_ERROR & obj_s->events);
|
||||
}
|
||||
}
|
||||
|
||||
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_FE) != RESET) {
|
||||
if (__HAL_UART_GET_IT_SOURCE(huart, USART_IT_ERR) != RESET) {
|
||||
if (__HAL_UART_GET_IT(huart, UART_IT_FE) != RESET) {
|
||||
__HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_FEF);
|
||||
return_event |= (SERIAL_EVENT_RX_FRAMING_ERROR & obj_s->events);
|
||||
}
|
||||
}
|
||||
|
||||
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_NE) != RESET) {
|
||||
if (__HAL_UART_GET_IT_SOURCE(huart, USART_IT_ERR) != RESET) {
|
||||
if (__HAL_UART_GET_IT(huart, UART_IT_NE) != RESET) {
|
||||
__HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_NEF);
|
||||
}
|
||||
}
|
||||
|
||||
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) {
|
||||
if (__HAL_UART_GET_IT_SOURCE(huart, USART_IT_ERR) != RESET) {
|
||||
if (__HAL_UART_GET_IT(huart, UART_IT_ORE) != RESET) {
|
||||
__HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF);
|
||||
return_event |= (SERIAL_EVENT_RX_OVERRUN_ERROR & obj_s->events);
|
||||
}
|
||||
|
|
|
@ -30,12 +30,20 @@
|
|||
|
||||
#include "PeripheralPins.h"
|
||||
|
||||
// =====
|
||||
// Px_y_ALTn pins are ALTernative possibilities which are not used per default.
|
||||
// You can use them as a normal pin name.
|
||||
// Example:
|
||||
// AnalogIn adc_in(PA_0_ALT0); // Use ADC_2 instead of ADC_1
|
||||
// =====
|
||||
//==============================================================================
|
||||
// Notes
|
||||
//
|
||||
// - The pins mentionned Px_y_ALTz are alternative possibilities which use other
|
||||
// HW peripheral instances. You can use them the same way as any other "normal"
|
||||
// pin (i.e. PwmOut pwm(PA_7_ALT0);). These pins are not displayed on the board
|
||||
// pinout image on mbed.org.
|
||||
//
|
||||
// - The pins which are connected to other components present on the board have
|
||||
// the comment "Connected to xxx". The pin function may not work properly in this
|
||||
// case. These pins may not be displayed on the board pinout image on mbed.org.
|
||||
// Please read the board reference manual and schematic for more information.
|
||||
//
|
||||
//==============================================================================
|
||||
|
||||
//*** ADC ***
|
||||
|
||||
|
@ -50,8 +58,8 @@ const PinMap PinMap_ADC[] = {
|
|||
{PA_3_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 8, 0)}, // ARDUINO D4
|
||||
{PA_4, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 9, 0)}, // ARDUINO D7
|
||||
{PA_4_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 9, 0)}, // ARDUINO D7
|
||||
{PA_5, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 10, 0)}, // ARDUINO D13 LED1
|
||||
{PA_5_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 10, 0)}, // ARDUINO D13 LED1
|
||||
{PA_5, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 10, 0)}, // ARDUINO D13 - Connected to LED1
|
||||
{PA_5_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 10, 0)}, // ARDUINO D13 - Connected to LED1
|
||||
{PA_6, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 11, 0)}, // ARDUINO D12
|
||||
{PA_6_ALT0, ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 11, 0)}, // ARDUINO D12
|
||||
{PA_7, ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG_ADC_CONTROL, GPIO_NOPULL, 0, 12, 0)}, // ARDUINO D11
|
||||
|
@ -90,7 +98,7 @@ const PinMap PinMap_ADC_Internal[] = {
|
|||
|
||||
const PinMap PinMap_DAC[] = {
|
||||
{PA_4, DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ARDUINO D7
|
||||
{PA_5, DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ARDUINO D13 LED1
|
||||
{PA_5, DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ARDUINO D13 - Connected to LED1
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
|
@ -100,7 +108,7 @@ const PinMap PinMap_I2C_SDA[] = {
|
|||
{PB_7, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // Pin not available on any connector
|
||||
{PB_9, I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // ARDUINO D14
|
||||
{PB_11, I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // Pin not available on any connector
|
||||
{PB_14, I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // Connected on LED2
|
||||
{PB_14, I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // Connected to LED2
|
||||
{PC_1, I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, // ARDUINO A4
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
@ -116,20 +124,21 @@ const PinMap PinMap_I2C_SCL[] = {
|
|||
|
||||
//*** PWM ***
|
||||
|
||||
// Warning: Pins using PWM_5 cannot be used as TIMER5 is already used by the us_ticker.
|
||||
const PinMap PinMap_PWM[] = {
|
||||
{PA_0, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // ARDUINO D1
|
||||
// {PA_0, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5 is already used by the ticker
|
||||
// {PA_0, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 ARDUINO D1
|
||||
{PA_1, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 ARDUINO D0
|
||||
{PA_1_ALT0, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 1, 1)}, // TIM15_CH1N ARDUINO D0
|
||||
// {PA_1, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5 is already used by the ticker
|
||||
// {PA_1, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 ARDUINO D0
|
||||
{PA_2, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 ARDUINO D10
|
||||
{PA_2_ALT0, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 1, 0)}, // TIM15_CH1 ARDUINO D10
|
||||
// {PA_2, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5 is already used by the ticker
|
||||
// {PA_2, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 ARDUINO D10
|
||||
{PA_3, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 ARDUINO D4
|
||||
{PA_3_ALT0, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 2, 0)}, // TIM15_CH2 ARDUINO D4
|
||||
// {PA_3, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5 is already used by the ticker
|
||||
{PA_5, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 ARDUINO D13 LED1
|
||||
{PA_5_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N ARDUINO D13 LED1
|
||||
// {PA_3, PWM_5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 ARDUINO D4
|
||||
{PA_5, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 ARDUINO D13 - Connected to LED1
|
||||
{PA_5_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N ARDUINO D13 - Connected to LED1
|
||||
{PA_6, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 ARDUINO D12
|
||||
{PA_6_ALT0, PWM_16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM16, 1, 0)}, // TIM16_CH1 ARDUINO D12
|
||||
{PA_7, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N ARDUINO D11
|
||||
|
@ -162,9 +171,9 @@ const PinMap PinMap_PWM[] = {
|
|||
{PB_11, PWM_2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 Pin not available on any connector
|
||||
{PB_13, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N Pin not available on any connector
|
||||
{PB_13_ALT0, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 1, 1)}, // TIM15_CH1N Pin not available on any connector
|
||||
{PB_14, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N Connected on LED2
|
||||
{PB_14_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N Connected on LED2
|
||||
{PB_14_ALT1, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 1, 0)}, // TIM15_CH1 Connected on LED2
|
||||
{PB_14, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - Connected to LED2
|
||||
{PB_14_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N - Connected to LED2
|
||||
{PB_14_ALT1, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 1, 0)}, // TIM15_CH1 - Connected to LED2
|
||||
{PB_15, PWM_1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N Pin not available on any connector
|
||||
{PB_15_ALT0, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N Pin not available on any connector
|
||||
{PB_15_ALT1, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_TIM15, 2, 0)}, // TIM15_CH2 Pin not available on any connector
|
||||
|
@ -174,8 +183,8 @@ const PinMap PinMap_PWM[] = {
|
|||
{PC_7_ALT0, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 Pin not available on any connector
|
||||
{PC_8, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 Pin not available on any connector
|
||||
{PC_8_ALT0, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 Pin not available on any connector
|
||||
{PC_9, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 Connected on LED3/LED4
|
||||
{PC_9_ALT0, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 Connected on LED3/LED4
|
||||
{PC_9, PWM_8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 - Connected to LED3/LED4
|
||||
{PC_9_ALT0, PWM_3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 - Connected to LED3/LED4
|
||||
{PD_12, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 Pin not available on any connector
|
||||
{PD_13, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 Pin not available on any connector
|
||||
{PD_14, PWM_4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 ARDUINO D2
|
||||
|
@ -202,7 +211,7 @@ const PinMap PinMap_UART_TX[] = {
|
|||
{PA_0, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // ARDUINO D1
|
||||
{PA_2, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // ARDUINO D10
|
||||
{PA_9, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Pin not available on any connector
|
||||
{PB_6, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // STDIO_UART_TX Pin not available on any connector
|
||||
{PB_6, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Pin not available on any connector - Connected to STDIO_UART_TX
|
||||
{PB_10, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Pin not available on any connector
|
||||
{PB_11, LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, // Pin not available on any connector
|
||||
{PC_1, LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, // ARDUINO A4
|
||||
|
@ -219,7 +228,7 @@ const PinMap PinMap_UART_RX[] = {
|
|||
{PA_1, UART_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // ARDUINO D0
|
||||
{PA_3, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // ARDUINO D4
|
||||
{PA_10, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Pin not available on any connector
|
||||
{PB_7, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // STDIO_UART_RX Pin not available on any connector
|
||||
{PB_7, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Pin not available on any connector - Connected to STDIO_UART_RX
|
||||
{PB_10, LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, // Pin not available on any connector
|
||||
{PB_11, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Pin not available on any connector
|
||||
{PC_0, LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, // ARDUINO A5
|
||||
|
@ -240,7 +249,7 @@ const PinMap PinMap_UART_RTS[] = {
|
|||
{PB_3, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Pin not available on any connector
|
||||
{PB_4, UART_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, // ARDUINO D5
|
||||
{PB_12, LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, // Pin not available on any connector
|
||||
{PB_14, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected on LED2
|
||||
{PB_14, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to LED2
|
||||
{PD_2, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // PMOD 7
|
||||
{PD_4, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // PMOD 2
|
||||
{PD_12, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Pin not available on any connector
|
||||
|
@ -279,7 +288,7 @@ const PinMap PinMap_SPI_MISO[] = {
|
|||
{PA_6, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // ARDUINO D12
|
||||
{PB_4, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // ARDUINO D5
|
||||
{PB_4_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, // ARDUINO D5
|
||||
{PB_14, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // Connected on LED2
|
||||
{PB_14, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // Connected to LED2
|
||||
{PC_2, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // ARDUINO A3
|
||||
{PC_11, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, // Pin not available on any connector
|
||||
{PD_3, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // PMOD 3
|
||||
|
@ -288,7 +297,7 @@ const PinMap PinMap_SPI_MISO[] = {
|
|||
};
|
||||
|
||||
const PinMap PinMap_SPI_SCLK[] = {
|
||||
{PA_5, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // ARDUINO D13 LED1
|
||||
{PA_5, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // ARDUINO D13 - Connected to LED1
|
||||
{PB_3, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // Pin not available on any connector
|
||||
{PB_3_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, // Pin not available on any connector
|
||||
{PB_10, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, // Pin not available on any connector
|
||||
|
|
|
@ -218,19 +218,19 @@ static void uart_irq(int id)
|
|||
|
||||
if (serial_irq_ids[id] != 0) {
|
||||
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_TC) != RESET) {
|
||||
if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_TC) != RESET) {
|
||||
if (__HAL_UART_GET_IT(huart, UART_IT_TC) != RESET) {
|
||||
irq_handler(serial_irq_ids[id], TxIrq);
|
||||
__HAL_UART_CLEAR_FLAG(huart, UART_FLAG_TC);
|
||||
}
|
||||
}
|
||||
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) {
|
||||
if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_RXNE) != RESET) {
|
||||
if (__HAL_UART_GET_IT(huart, UART_IT_RXNE) != RESET) {
|
||||
irq_handler(serial_irq_ids[id], RxIrq);
|
||||
__HAL_UART_CLEAR_FLAG(huart, UART_FLAG_RXNE);
|
||||
}
|
||||
}
|
||||
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) {
|
||||
if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR) != RESET) {
|
||||
if (__HAL_UART_GET_IT(huart, UART_IT_ORE) != RESET) {
|
||||
volatile uint32_t tmpval = huart->Instance->RDR; // Clear ORE flag
|
||||
}
|
||||
}
|
||||
|
@ -697,19 +697,19 @@ int serial_irq_handler_asynch(serial_t *obj)
|
|||
|
||||
// Handle error events
|
||||
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_PE) != RESET) {
|
||||
if (__HAL_UART_GET_IT_SOURCE(huart, USART_IT_ERR) != RESET) {
|
||||
if (__HAL_UART_GET_IT(huart, UART_IT_PE) != RESET) {
|
||||
return_event |= (SERIAL_EVENT_RX_PARITY_ERROR & obj_s->events);
|
||||
}
|
||||
}
|
||||
|
||||
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_FE) != RESET) {
|
||||
if (__HAL_UART_GET_IT_SOURCE(huart, USART_IT_ERR) != RESET) {
|
||||
if (__HAL_UART_GET_IT(huart, UART_IT_FE) != RESET) {
|
||||
return_event |= (SERIAL_EVENT_RX_FRAMING_ERROR & obj_s->events);
|
||||
}
|
||||
}
|
||||
|
||||
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) {
|
||||
if (__HAL_UART_GET_IT_SOURCE(huart, USART_IT_ERR) != RESET) {
|
||||
if (__HAL_UART_GET_IT(huart, UART_IT_ORE) != RESET) {
|
||||
return_event |= (SERIAL_EVENT_RX_OVERRUN_ERROR & obj_s->events);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -958,7 +958,7 @@
|
|||
"macro_name": "CLOCK_SOURCE_USB"
|
||||
}
|
||||
},
|
||||
"extra_labels_add": ["STM32F4", "STM32F429", "STM32F429ZI", "STM32F429xx", "STM32F429xI", "FLASH_CMSIS_ALGO"],
|
||||
"extra_labels_add": ["STM32F4", "STM32F429", "STM32F429ZI", "STM32F429xx", "STM32F429xI"],
|
||||
"macros_add": ["USB_STM_HAL", "USBHOST_OTHER"],
|
||||
"device_has_add": ["ANALOGOUT", "CAN", "ERROR_RED", "LOWPOWERTIMER", "SERIAL_FC", "TRNG", "FLASH"],
|
||||
"detect_code": ["0796"],
|
||||
|
@ -988,7 +988,7 @@
|
|||
"macro_name": "CLOCK_SOURCE_USB"
|
||||
}
|
||||
},
|
||||
"extra_labels_add": ["STM32F4", "STM32F439", "STM32F439ZI", "STM32F439xx", "STM32F439xI", "FLASH_CMSIS_ALGO"],
|
||||
"extra_labels_add": ["STM32F4", "STM32F439", "STM32F439ZI", "STM32F439xx", "STM32F439xI"],
|
||||
"macros_add": ["MBEDTLS_CONFIG_HW_SUPPORT", "USB_STM_HAL", "USBHOST_OTHER"],
|
||||
"device_has_add": ["ANALOGOUT", "CAN", "ERROR_RED", "LOWPOWERTIMER", "SERIAL_FC", "TRNG", "FLASH"],
|
||||
"detect_code": ["0797"],
|
||||
|
@ -1190,7 +1190,7 @@
|
|||
"core": "Cortex-M4F",
|
||||
"extra_labels_add": ["STM32L4", "STM32L486RG", "STM32L486xG"],
|
||||
"detect_code": ["0827"],
|
||||
"macros_add": ["USBHOST_OTHER"],
|
||||
"macros_add": ["USBHOST_OTHER", "MBEDTLS_CONFIG_HW_SUPPORT"],
|
||||
"device_has_add": ["ANALOGOUT", "CAN", "LOWPOWERTIMER", "SERIAL_ASYNCH", "SERIAL_FC", "TRNG", "FLASH"],
|
||||
"release_versions": ["2", "5"],
|
||||
"device_name": "STM32L486RG"
|
||||
|
@ -1255,7 +1255,7 @@
|
|||
"DISCO_F429ZI": {
|
||||
"inherits": ["FAMILY_STM32"],
|
||||
"core": "Cortex-M4F",
|
||||
"extra_labels_add": ["STM32F4", "STM32F429", "STM32F429ZI", "STM32F429xI", "STM32F429xx", "FLASH_CMSIS_ALGO"],
|
||||
"extra_labels_add": ["STM32F4", "STM32F429", "STM32F429ZI", "STM32F429xI", "STM32F429xx"],
|
||||
"config": {
|
||||
"clock_source": {
|
||||
"help": "Mask value : USE_PLL_HSE_EXTC | USE_PLL_HSE_XTAL (need HW patch) | USE_PLL_HSI",
|
||||
|
@ -1437,7 +1437,7 @@
|
|||
"inherits": ["FAMILY_STM32"],
|
||||
"supported_form_factors": ["ARDUINO"],
|
||||
"core": "Cortex-M4F",
|
||||
"extra_labels_add": ["STM32F4", "STM32F439", "STM32F439ZI","STM32F439xx", "STM32F439xI", "FLASH_CMSIS_ALGO"],
|
||||
"extra_labels_add": ["STM32F4", "STM32F439", "STM32F439ZI","STM32F439xx", "STM32F439xI"],
|
||||
"macros": ["HSE_VALUE=24000000", "HSE_STARTUP_TIMEOUT=5000", "CB_INTERFACE_SDIO","CB_CHIP_WL18XX","SUPPORT_80211D_ALWAYS","WLAN_ENABLED","MBEDTLS_ARC4_C","MBEDTLS_DES_C","MBEDTLS_MD4_C","MBEDTLS_MD5_C","MBEDTLS_SHA1_C"],
|
||||
"device_has_add": ["CAN", "EMAC", "TRNG", "FLASH"],
|
||||
"device_has_remove": ["RTC", "SLEEP"],
|
||||
|
|
|
@ -992,7 +992,7 @@ def build_mbed_libs(target, toolchain_name, verbose=False,
|
|||
mkdir(tmp_path)
|
||||
|
||||
toolchain = prepare_toolchain(
|
||||
[""], tmp_path, target, toolchain_name, macros=macros,
|
||||
[""], tmp_path, target, toolchain_name, macros=macros,verbose=verbose,
|
||||
notify=notify, silent=silent, extra_verbose=extra_verbose,
|
||||
build_profile=build_profile, jobs=jobs, clean=clean)
|
||||
|
||||
|
|
|
@ -103,7 +103,7 @@ def mcu_ide_matrix(verbose_html=False):
|
|||
row = [target] # First column is platform name
|
||||
for ide in supported_ides:
|
||||
text = "-"
|
||||
if target in EXPORTERS[ide].TARGETS:
|
||||
if EXPORTERS[ide].is_target_supported(target):
|
||||
if verbose_html:
|
||||
text = "✓"
|
||||
else:
|
||||
|
|
|
@ -103,8 +103,11 @@ class DeviceCMSIS():
|
|||
class CMSIS(Exporter):
|
||||
NAME = 'cmsis'
|
||||
TOOLCHAIN = 'ARM'
|
||||
TARGETS = [target for target, obj in TARGET_MAP.iteritems()
|
||||
if "ARM" in obj.supported_toolchains]
|
||||
|
||||
@classmethod
|
||||
def is_target_supported(cls, target_name):
|
||||
target = TARGET_MAP[target_name]
|
||||
return cls.TOOLCHAIN in target.supported_toolchains
|
||||
|
||||
def make_key(self, src):
|
||||
"""turn a source file into its group name"""
|
||||
|
|
|
@ -16,7 +16,7 @@ limitations under the License.
|
|||
"""
|
||||
from os.path import splitext, basename
|
||||
from tools.targets import TARGET_MAP
|
||||
from tools.export.exporters import Exporter, filter_supported
|
||||
from tools.export.exporters import Exporter, apply_supported_whitelist
|
||||
|
||||
|
||||
POST_BINARY_WHITELIST = set([
|
||||
|
@ -30,9 +30,6 @@ class EmBitz(Exporter):
|
|||
NAME = 'EmBitz'
|
||||
TOOLCHAIN = 'GCC_ARM'
|
||||
|
||||
|
||||
TARGETS = filter_supported("GCC_ARM", POST_BINARY_WHITELIST)
|
||||
|
||||
MBED_CONFIG_HEADER_SUPPORTED = True
|
||||
|
||||
FILE_TYPES = {
|
||||
|
@ -42,6 +39,11 @@ class EmBitz(Exporter):
|
|||
'cpp_sources': 'cpp'
|
||||
}
|
||||
|
||||
@classmethod
|
||||
def is_target_supported(cls, target_name):
|
||||
target = TARGET_MAP[target_name]
|
||||
return apply_supported_whitelist(
|
||||
cls.TOOLCHAIN, POST_BINARY_WHITELIST, target)
|
||||
|
||||
@staticmethod
|
||||
def _remove_symbols(sym_list):
|
||||
|
|
|
@ -36,7 +36,7 @@ class Exporter(object):
|
|||
TEMPLATE_DIR = dirname(__file__)
|
||||
DOT_IN_RELATIVE_PATH = False
|
||||
NAME = None
|
||||
TARGETS = None
|
||||
TARGETS = set()
|
||||
TOOLCHAIN = None
|
||||
|
||||
|
||||
|
@ -178,19 +178,33 @@ class Exporter(object):
|
|||
"""Generate an IDE/tool specific project file"""
|
||||
raise NotImplemented("Implement a generate function in Exporter child class")
|
||||
|
||||
@classmethod
|
||||
def is_target_supported(cls, target_name):
|
||||
"""Query support for a particular target
|
||||
|
||||
def filter_supported(compiler, whitelist):
|
||||
NOTE: override this method if your exporter does not provide a static list of targets
|
||||
|
||||
Positional Arguments:
|
||||
target_name - the name of the target.
|
||||
"""
|
||||
target = TARGET_MAP[target_name]
|
||||
return bool(set(target.resolution_order_names).intersection(set(cls.TARGETS))) \
|
||||
and cls.TOOLCHAIN in target.supported_toolchains
|
||||
|
||||
|
||||
@classmethod
|
||||
def all_supported_targets(cls):
|
||||
return [t for t in TARGET_MAP.keys() if cls.is_target_supported(t)]
|
||||
|
||||
|
||||
def apply_supported_whitelist(compiler, whitelist, target):
|
||||
"""Generate a list of supported targets for a given compiler and post-binary hook
|
||||
white-list."""
|
||||
def supported_p(obj):
|
||||
"""Internal inner function used for filtering"""
|
||||
if compiler not in obj.supported_toolchains:
|
||||
return False
|
||||
if not hasattr(obj, "post_binary_hook"):
|
||||
return True
|
||||
if obj.post_binary_hook['function'] in whitelist:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
return list(target for target, obj in TARGET_MAP.iteritems()
|
||||
if supported_p(obj))
|
||||
if compiler not in target.supported_toolchains:
|
||||
return False
|
||||
if not hasattr(target, "post_binary_hook"):
|
||||
return True
|
||||
if target.post_binary_hook['function'] in whitelist:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
|
|
@ -177,7 +177,7 @@
|
|||
</option>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.defs.{{u.id}}" name="Defined symbols (-D)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.defs" useByScannerDiscovery="true" valueType="definedSymbols">
|
||||
{% for s in opts['as']['defines'] %}
|
||||
<listOptionValue builtIn="false" value="{{s}}"/>
|
||||
<listOptionValue builtIn="false" value="{{s|replace("\"", "\\\"")|escape}}"/>
|
||||
{% endfor %}
|
||||
</option>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.files.{{u.id}}" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.files" useByScannerDiscovery="true" valueType="includeFiles">
|
||||
|
@ -207,7 +207,7 @@
|
|||
</option>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.defs.{{u.id}}" name="Defined symbols (-D)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.defs" useByScannerDiscovery="true" valueType="definedSymbols">
|
||||
{% for s in opts['c']['defines'] %}
|
||||
<listOptionValue builtIn="false" value="{{s}}"/>
|
||||
<listOptionValue builtIn="false" value="{{s|replace("\"", "\\\"")|escape}}"/>
|
||||
{% endfor %}
|
||||
</option>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.include.files.{{u.id}}" name="Include files (-include)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.include.files" useByScannerDiscovery="true" valueType="includeFiles">
|
||||
|
@ -255,7 +255,7 @@
|
|||
</option>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.cpp.compiler.defs.{{u.id}}" name="Defined symbols (-D)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.cpp.compiler.defs" useByScannerDiscovery="true" valueType="definedSymbols">
|
||||
{% for s in opts['cpp']['defines'] %}
|
||||
<listOptionValue builtIn="false" value="{{s}}"/>
|
||||
<listOptionValue builtIn="false" value="{{s|replace("\"", "\\\"")|escape}}"/>
|
||||
{% endfor %}
|
||||
</option>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.cpp.compiler.include.files.{{u.id}}" name="Include files (-include)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.cpp.compiler.include.files" useByScannerDiscovery="true" valueType="includeFiles">
|
||||
|
|
|
@ -33,7 +33,7 @@ from os.path import splitext, basename, relpath, dirname, exists, join, dirname
|
|||
from random import randint
|
||||
from json import load
|
||||
|
||||
from tools.export.exporters import Exporter, filter_supported
|
||||
from tools.export.exporters import Exporter, apply_supported_whitelist
|
||||
from tools.options import list_profiles
|
||||
from tools.targets import TARGET_MAP
|
||||
from tools.utils import NotSupportedException
|
||||
|
@ -69,7 +69,11 @@ class GNUARMEclipse(Exporter):
|
|||
NAME = 'GNU ARM Eclipse'
|
||||
TOOLCHAIN = 'GCC_ARM'
|
||||
|
||||
TARGETS = filter_supported("GCC_ARM", POST_BINARY_WHITELIST)
|
||||
@classmethod
|
||||
def is_target_supported(cls, target_name):
|
||||
target = TARGET_MAP[target_name]
|
||||
return apply_supported_whitelist(
|
||||
cls.TOOLCHAIN, POST_BINARY_WHITELIST, target)
|
||||
|
||||
# override
|
||||
@property
|
||||
|
|
|
@ -30,15 +30,15 @@ _iar_defs = os.path.join(
|
|||
with open(_iar_defs, 'r') as f:
|
||||
_GUI_OPTIONS = json.load(f)
|
||||
|
||||
_IAR_TARGETS = [target for target, obj in TARGET_MAP.iteritems() if
|
||||
_supported(obj, _GUI_OPTIONS.keys())]
|
||||
|
||||
|
||||
class IAR(Exporter):
|
||||
NAME = 'iar'
|
||||
TOOLCHAIN = 'IAR'
|
||||
|
||||
TARGETS = _IAR_TARGETS
|
||||
@classmethod
|
||||
def is_target_supported(cls, target_name):
|
||||
target = TARGET_MAP[target_name]
|
||||
return _supported(target, _GUI_OPTIONS.keys())
|
||||
|
||||
|
||||
def iar_groups(self, grouped_src):
|
||||
|
|
|
@ -21,7 +21,7 @@ import sys
|
|||
from subprocess import check_output, CalledProcessError, Popen, PIPE
|
||||
import shutil
|
||||
from jinja2.exceptions import TemplateNotFound
|
||||
from tools.export.exporters import Exporter, filter_supported
|
||||
from tools.export.exporters import Exporter, apply_supported_whitelist
|
||||
from tools.utils import NotSupportedException
|
||||
from tools.targets import TARGET_MAP
|
||||
|
||||
|
@ -42,6 +42,12 @@ class Makefile(Exporter):
|
|||
"LPC4088Code.binary_hook"
|
||||
])
|
||||
|
||||
@classmethod
|
||||
def is_target_supported(cls, target_name):
|
||||
target = TARGET_MAP[target_name]
|
||||
return apply_supported_whitelist(
|
||||
cls.TOOLCHAIN, cls.POST_BINARY_WHITELIST, target)
|
||||
|
||||
def generate(self):
|
||||
"""Generate the makefile
|
||||
|
||||
|
@ -186,7 +192,6 @@ class Makefile(Exporter):
|
|||
|
||||
class GccArm(Makefile):
|
||||
"""GCC ARM specific makefile target"""
|
||||
TARGETS = filter_supported("GCC_ARM", Makefile.POST_BINARY_WHITELIST)
|
||||
NAME = 'Make-GCC-ARM'
|
||||
TEMPLATE = 'make-gcc-arm'
|
||||
TOOLCHAIN = "GCC_ARM"
|
||||
|
@ -204,7 +209,6 @@ class GccArm(Makefile):
|
|||
|
||||
class Armc5(Makefile):
|
||||
"""ARM Compiler 5 specific makefile target"""
|
||||
TARGETS = filter_supported("ARM", Makefile.POST_BINARY_WHITELIST)
|
||||
NAME = 'Make-ARMc5'
|
||||
TEMPLATE = 'make-armc5'
|
||||
TOOLCHAIN = "ARM"
|
||||
|
@ -222,7 +226,6 @@ class Armc5(Makefile):
|
|||
|
||||
class IAR(Makefile):
|
||||
"""IAR specific makefile target"""
|
||||
TARGETS = filter_supported("IAR", Makefile.POST_BINARY_WHITELIST)
|
||||
NAME = 'Make-IAR'
|
||||
TEMPLATE = 'make-iar'
|
||||
TOOLCHAIN = "IAR"
|
||||
|
|
|
@ -16,14 +16,11 @@ limitations under the License.
|
|||
"""
|
||||
from os.path import splitext, basename
|
||||
from tools.targets import TARGET_MAP
|
||||
from tools.export.exporters import Exporter, filter_supported
|
||||
from tools.export.exporters import Exporter
|
||||
from tools.export.makefile import GccArm
|
||||
|
||||
class QtCreator(GccArm):
|
||||
NAME = 'QtCreator'
|
||||
TOOLCHAIN = 'GCC_ARM'
|
||||
|
||||
TARGETS = filter_supported("GCC_ARM", set())
|
||||
|
||||
MBED_CONFIG_HEADER_SUPPORTED = True
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@ import re
|
|||
|
||||
from tools.arm_pack_manager import Cache
|
||||
from tools.targets import TARGET_MAP
|
||||
from tools.export.exporters import Exporter, filter_supported
|
||||
from tools.export.exporters import Exporter, apply_supported_whitelist
|
||||
from tools.export.cmsis import DeviceCMSIS
|
||||
|
||||
cache_d = False
|
||||
|
@ -129,8 +129,13 @@ class Uvision(Exporter):
|
|||
"MTSCode.combine_bins_mts_dragonfly",
|
||||
"NCS36510TargetCode.ncs36510_addfib"
|
||||
])
|
||||
TARGETS = [tgt for tgt in filter_supported("ARM", POST_BINARY_WHITELIST)
|
||||
if DeviceCMSIS.check_supported(tgt)]
|
||||
|
||||
@classmethod
|
||||
def is_target_supported(cls, target_name):
|
||||
target = TARGET_MAP[target_name]
|
||||
return apply_supported_whitelist(
|
||||
cls.TOOLCHAIN, cls.POST_BINARY_WHITELIST, target) and\
|
||||
DeviceCMSIS.check_supported(target_name)
|
||||
|
||||
#File associations within .uvprojx file
|
||||
file_types = {'.cpp': 8, '.c': 1, '.s': 2,
|
||||
|
|
|
@ -67,7 +67,7 @@ if __name__ == '__main__':
|
|||
if params:
|
||||
print "Configuration parameters"
|
||||
print "------------------------"
|
||||
for p in params:
|
||||
for p in sorted(params):
|
||||
for s in options.prefix:
|
||||
if p.startswith(s):
|
||||
print(str(params[p]) if not options.verbose else params[p].get_verbose_description())
|
||||
|
|
|
@ -107,7 +107,7 @@ def main():
|
|||
|
||||
parser.add_argument("-m", "--mcu",
|
||||
metavar="MCU",
|
||||
type=argparse_force_uppercase_type(targetnames, "MCU"),
|
||||
type=str.upper,
|
||||
help="generate project for the given MCU ({})".format(
|
||||
', '.join(targetnames)))
|
||||
|
||||
|
@ -235,19 +235,17 @@ def main():
|
|||
if exists(EXPORT_DIR):
|
||||
rmtree(EXPORT_DIR)
|
||||
|
||||
for mcu in options.mcu:
|
||||
zip_proj = not bool(options.source_dir)
|
||||
zip_proj = not bool(options.source_dir)
|
||||
|
||||
if (options.program is None) and (not options.source_dir):
|
||||
args_error(parser, "one of -p, -n, or --source is required")
|
||||
# Export to selected toolchain
|
||||
exporter, toolchain_name = get_exporter_toolchain(options.ide)
|
||||
if options.mcu not in exporter.TARGETS:
|
||||
args_error(parser, "%s not supported by %s"%(options.mcu,options.ide))
|
||||
mcu = extract_mcus(parser, options)[0]
|
||||
if not exporter.is_target_supported(mcu):
|
||||
args_error(parser, "%s not supported by %s"%(mcu,options.ide))
|
||||
profile = extract_profile(parser, options, toolchain_name, fallback="debug")
|
||||
if options.clean:
|
||||
rmtree(BUILD_DIR)
|
||||
mcu = extract_mcus(parser, options)[0]
|
||||
export(mcu, options.ide, build=options.build,
|
||||
src=options.source_dir, macros=options.macros,
|
||||
project_id=options.program, zip_proj=zip_proj,
|
||||
|
|
|
@ -0,0 +1,277 @@
|
|||
"""A linting utility for targets.json
|
||||
|
||||
This linting utility may be called as follows:
|
||||
python <path-to>/lint.py targets TARGET [TARGET ...]
|
||||
|
||||
all targets will be linted
|
||||
"""
|
||||
|
||||
# mbed SDK
|
||||
# Copyright (c) 2017 ARM Limited
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
from os.path import join, abspath, dirname
|
||||
if __name__ == "__main__":
|
||||
import sys
|
||||
ROOT = abspath(join(dirname(__file__), "..", ".."))
|
||||
sys.path.insert(0, ROOT)
|
||||
from copy import copy
|
||||
from yaml import dump_all
|
||||
import argparse
|
||||
|
||||
from tools.targets import Target, set_targets_json_location, TARGET_MAP
|
||||
|
||||
def must_have_keys(keys, dict):
|
||||
"""Require keys in an MCU/Board
|
||||
|
||||
is a generator for errors
|
||||
"""
|
||||
for key in keys:
|
||||
if key not in dict:
|
||||
yield "%s not found, and is required" % key
|
||||
|
||||
def may_have_keys(keys, dict):
|
||||
"""Disable all other keys in an MCU/Board
|
||||
|
||||
is a generator for errors
|
||||
"""
|
||||
for key in dict.keys():
|
||||
if key not in keys:
|
||||
yield "%s found, and is not allowed" % key
|
||||
|
||||
def check_extra_labels(dict):
|
||||
"""Check that extra_labels does not contain any Target names
|
||||
|
||||
is a generator for errors
|
||||
"""
|
||||
for label in (dict.get("extra_labels", []) +
|
||||
dict.get("extra_labels_add", [])):
|
||||
if label in Target.get_json_target_data():
|
||||
yield "%s is not allowed in extra_labels" % label
|
||||
|
||||
def check_release_version(dict):
|
||||
"""Verify that release version 5 is combined with support for all toolcahins
|
||||
|
||||
is a generator for errors
|
||||
"""
|
||||
if ("release_versions" in dict and
|
||||
"5" in dict["release_versions"] and
|
||||
"supported_toolchains" in dict):
|
||||
for toolc in ["GCC_ARM", "ARM", "IAR"]:
|
||||
if toolc not in dict["supported_toolchains"]:
|
||||
yield ("%s not found in supported_toolchains, and is "
|
||||
"required by mbed OS 5" % toolc)
|
||||
|
||||
def check_inherits(dict):
|
||||
if ("inherits" in dict and len(dict["inherits"]) > 1):
|
||||
yield "multiple inheritance is forbidden"
|
||||
|
||||
DEVICE_HAS_ALLOWED = ["ANALOGIN", "ANALOGOUT", "CAN", "ETHERNET", "EMAC",
|
||||
"FLASH", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN",
|
||||
"LOWPOWERTIMER", "PORTIN", "PORTINOUT", "PORTOUT",
|
||||
"PWMOUT", "RTC", "TRNG","SERIAL", "SERIAL_ASYNCH",
|
||||
"SERIAL_FC", "SLEEP", "SPI", "SPI_ASYNCH", "SPISLAVE",
|
||||
"STORAGE"]
|
||||
def check_device_has(dict):
|
||||
for name in dict.get("device_has", []):
|
||||
if name not in DEVICE_HAS_ALLOWED:
|
||||
yield "%s is not allowed in device_has" % name
|
||||
|
||||
MCU_REQUIRED_KEYS = ["release_versions", "supported_toolchains",
|
||||
"default_lib", "public", "inherits", "device_has"]
|
||||
MCU_ALLOWED_KEYS = ["device_has_add", "device_has_remove", "core",
|
||||
"extra_labels", "features", "features_add",
|
||||
"features_remove", "bootloader_supported", "device_name",
|
||||
"post_binary_hook", "default_toolchain", "config",
|
||||
"extra_labels_add", "extra_labels_remove",
|
||||
"target_overrides"] + MCU_REQUIRED_KEYS
|
||||
def check_mcu(mcu_json, strict=False):
|
||||
"""Generate a list of problems with an MCU
|
||||
|
||||
:param: mcu_json the MCU's dict to check
|
||||
:param: strict enforce required keys
|
||||
"""
|
||||
errors = list(may_have_keys(MCU_ALLOWED_KEYS, mcu_json))
|
||||
if strict:
|
||||
errors.extend(must_have_keys(MCU_REQUIRED_KEYS, mcu_json))
|
||||
errors.extend(check_extra_labels(mcu_json))
|
||||
errors.extend(check_release_version(mcu_json))
|
||||
errors.extend(check_inherits(mcu_json))
|
||||
errors.extend(check_device_has(mcu_json))
|
||||
if 'public' in mcu_json and mcu_json['public']:
|
||||
errors.append("public must be false")
|
||||
return errors
|
||||
|
||||
BOARD_REQUIRED_KEYS = ["inherits"]
|
||||
BOARD_ALLOWED_KEYS = ["supported_form_factors", "is_disk_virtual",
|
||||
"detect_code", "extra_labels", "extra_labels_add",
|
||||
"extra_labels_remove", "public", "config",
|
||||
"forced_reset_timeout", "target_overrides"] + BOARD_REQUIRED_KEYS
|
||||
def check_board(board_json, strict=False):
|
||||
"""Generate a list of problems with an board
|
||||
|
||||
:param: board_json the mcus dict to check
|
||||
:param: strict enforce required keys
|
||||
"""
|
||||
errors = list(may_have_keys(BOARD_ALLOWED_KEYS, board_json))
|
||||
if strict:
|
||||
errors.extend(must_have_keys(BOARD_REQUIRED_KEYS, board_json))
|
||||
errors.extend(check_extra_labels(board_json))
|
||||
errors.extend(check_inherits(board_json))
|
||||
return errors
|
||||
|
||||
def add_if(dict, key, val):
|
||||
"""Add a value to a dict if it's non-empty"""
|
||||
if val:
|
||||
dict[key] = val
|
||||
|
||||
def _split_boards(resolution_order, tgt):
|
||||
"""Split the resolution order between boards and mcus"""
|
||||
mcus = []
|
||||
boards = []
|
||||
iterable = iter(resolution_order)
|
||||
for name in iterable:
|
||||
mcu_json = tgt.json_data[name]
|
||||
if (len(list(check_mcu(mcu_json, True))) >
|
||||
len(list(check_board(mcu_json, True)))):
|
||||
boards.append(name)
|
||||
else:
|
||||
mcus.append(name)
|
||||
break
|
||||
mcus.extend(iterable)
|
||||
mcus.reverse()
|
||||
boards.reverse()
|
||||
return mcus, boards
|
||||
|
||||
|
||||
MCU_FORMAT_STRING = {1: "MCU (%s) ->",
|
||||
2: "Family (%s) -> MCU (%s) ->",
|
||||
3: "Family (%s) -> SubFamily (%s) -> MCU (%s) ->"}
|
||||
BOARD_FORMAT_STRING = {1: "Board (%s)",
|
||||
2: "Module (%s) -> Board (%s)"}
|
||||
def _generate_hierarchy_string(mcus, boards):
|
||||
global_errors = []
|
||||
if len(mcus) < 1:
|
||||
global_errors.append("No MCUS found in heirarchy")
|
||||
mcus_string = "??? ->"
|
||||
elif len(mcus) > 3:
|
||||
global_errors.append("No name for targets %s" % ", ".join(mcus[3:]))
|
||||
mcus_string = MCU_FORMAT_STRING[3] % tuple(mcus[:3])
|
||||
for name in mcus[3:]:
|
||||
mcus_string += " ??? (%s) ->" % name
|
||||
else:
|
||||
mcus_string = MCU_FORMAT_STRING[len(mcus)] % tuple(mcus)
|
||||
|
||||
if len(boards) < 1:
|
||||
global_errors.append("no boards found in heirarchy")
|
||||
boards_string = "???"
|
||||
elif len(boards) > 2:
|
||||
global_errors.append("no name for targets %s" % ", ".join(boards[2:]))
|
||||
boards_string = BOARD_FORMAT_STRING[2] % tuple(boards[:2])
|
||||
for name in boards[2:]:
|
||||
boards_string += " -> ??? (%s)" % name
|
||||
else:
|
||||
boards_string = BOARD_FORMAT_STRING[len(boards)] % tuple(boards)
|
||||
return mcus_string + " " + boards_string, global_errors
|
||||
|
||||
|
||||
def check_hierarchy(tgt):
|
||||
"""Atempts to assign labels to the heirarchy"""
|
||||
resolution_order = copy(tgt.resolution_order_names[:-1])
|
||||
mcus, boards = _split_boards(resolution_order, tgt)
|
||||
|
||||
target_errors = {}
|
||||
hierachy_string, hierachy_errors = _generate_hierarchy_string(mcus, boards)
|
||||
to_ret = {"hierarchy": hierachy_string}
|
||||
add_if(to_ret, "hierarchy errors", hierachy_errors)
|
||||
|
||||
for name in mcus[:-1]:
|
||||
add_if(target_errors, name, list(check_mcu(tgt.json_data[name])))
|
||||
if len(mcus) >= 1:
|
||||
add_if(target_errors, mcus[-1],
|
||||
list(check_mcu(tgt.json_data[mcus[-1]], True)))
|
||||
for name in boards:
|
||||
add_if(target_errors, name, list(check_board(tgt.json_data[name])))
|
||||
if len(boards) >= 1:
|
||||
add_if(target_errors, boards[-1],
|
||||
list(check_board(tgt.json_data[boards[-1]], True)))
|
||||
add_if(to_ret, "target errors", target_errors)
|
||||
return to_ret
|
||||
|
||||
PARSER = argparse.ArgumentParser(prog="targets/lint.py")
|
||||
SUBPARSERS = PARSER.add_subparsers(title="Commands")
|
||||
|
||||
def subcommand(name, *args, **kwargs):
|
||||
def __subcommand(command):
|
||||
kwargs['description'] = command.__doc__
|
||||
subparser = SUBPARSERS.add_parser(name, **kwargs)
|
||||
for arg in args:
|
||||
arg = dict(arg)
|
||||
opt = arg['name']
|
||||
del arg['name']
|
||||
|
||||
if isinstance(opt, basestring):
|
||||
subparser.add_argument(opt, **arg)
|
||||
else:
|
||||
subparser.add_argument(*opt, **arg)
|
||||
|
||||
def _thunk(parsed_args):
|
||||
argv = [arg['dest'] if 'dest' in arg else arg['name']
|
||||
for arg in args]
|
||||
argv = [(arg if isinstance(arg, basestring)
|
||||
else arg[-1]).strip('-').replace('-', '_')
|
||||
for arg in argv]
|
||||
argv = {arg: vars(parsed_args)[arg] for arg in argv
|
||||
if vars(parsed_args)[arg] is not None}
|
||||
|
||||
return command(**argv)
|
||||
|
||||
subparser.set_defaults(command=_thunk)
|
||||
return command
|
||||
return __subcommand
|
||||
|
||||
@subcommand("targets",
|
||||
dict(name="mcus", nargs="+", metavar="MCU",
|
||||
choices=TARGET_MAP.keys(), type=str.upper))
|
||||
def targets_cmd(mcus=[]):
|
||||
"""Find and print errors about specific targets"""
|
||||
print dump_all([check_hierarchy(TARGET_MAP[m]) for m in mcus],
|
||||
default_flow_style=False)
|
||||
|
||||
@subcommand("all-targets")
|
||||
def all_targets_cmd():
|
||||
"""Print all errors about all parts"""
|
||||
print dump_all([check_hierarchy(m) for m in TARGET_MAP.values()],
|
||||
default_flow_style=False)
|
||||
|
||||
@subcommand("orphans")
|
||||
def orphans_cmd():
|
||||
"""Find and print all orphan targets"""
|
||||
orphans = Target.get_json_target_data().keys()
|
||||
for tgt in TARGET_MAP.values():
|
||||
for name in tgt.resolution_order_names:
|
||||
if name in orphans:
|
||||
orphans.remove(name)
|
||||
if orphans:
|
||||
print dump_all([orphans], default_flow_style=False)
|
||||
return len(orphans)
|
||||
|
||||
def main():
|
||||
"""entry point"""
|
||||
options = PARSER.parse_args()
|
||||
return options.command(options)
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
|
|
@ -1,4 +1,17 @@
|
|||
{
|
||||
{
|
||||
"update-config" : {
|
||||
"help" : "Update each example repo with a version of mbed-os identified by the tag",
|
||||
"via-fork" : {
|
||||
"help" : "-f cmd line option. Update a fork",
|
||||
"github-user" : "adbridge"
|
||||
},
|
||||
"via-branch" : {
|
||||
"help" : "-b cmd line option. Update dst branch, created from src branch",
|
||||
"src-branch" : "mbed-os-5.5.0-rc1-oob",
|
||||
"dst-branch" : "mbed-os-5.5.0-rc2-oob"
|
||||
},
|
||||
"tag" : "mbed-os-5.5.0-rc2"
|
||||
},
|
||||
"examples": [
|
||||
{
|
||||
"name": "mbed-os-example-blinky",
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
Please test this PR
|
||||
|
||||
If successful then merge, otherwise provide a known issue.
|
||||
Once you get notification of the release being made public then tag Master with {{ tag }} .
|
|
@ -14,11 +14,29 @@
|
|||
# 2) Update a different ARMmbed branch of the specified example
|
||||
#
|
||||
# A branch to update is specified. If it doesn't already exist then it is first created.
|
||||
# This branch will be updated and the change automatically pushed.
|
||||
# This branch will be updated and the change automatically pushed. The new branch will
|
||||
# be created from the specified source branch.
|
||||
#
|
||||
# The modes are controlled via configuration data in the json file.
|
||||
# E.g.
|
||||
#
|
||||
# "update-config" : {
|
||||
# "help" : "Update each example repo with a version of mbed-os identified by the tag",
|
||||
# "via-fork" : {
|
||||
# "help" : "-f cmd line option. Update a fork",
|
||||
# "github-user" : "adbridge"
|
||||
# },
|
||||
# "via-branch" : {
|
||||
# "help" : "-b cmd line option. Update dst branch, created from src branch",
|
||||
# "src-branch" : "mbed-os-5.5.0-rc1-oob",
|
||||
# "dst-branch" : "mbed-os-5.5.0-rc2-oob"
|
||||
# },
|
||||
# "tag" : "mbed-os-5.5.0-rc2"
|
||||
#
|
||||
#
|
||||
# Command usage:
|
||||
#
|
||||
# update.py -c <config file> - T <github_token> -l <logging level> -U <github user> -b <branch> <tag>
|
||||
# update.py -c <config file> - T <github_token> -l <logging level> -f -b
|
||||
#
|
||||
# Where:
|
||||
# -c <config file> - Optional path to an examples file.
|
||||
|
@ -27,16 +45,18 @@
|
|||
# -l <logging level> - Optional Level for providing logging output. Can be one of,
|
||||
# CRITICAL, ERROR, WARNING, INFO, DEBUG
|
||||
# If not provided the default is 'INFO'
|
||||
# -U <github_user> - GitHub user for forked repos
|
||||
# -b <branch> - Branch to be updated
|
||||
# -f - Update forked repos. This will use the 'github-user' parameter in
|
||||
# the 'via-fork' section.
|
||||
# -b - Update branched repos. This will use the "src-branch" and
|
||||
# "dst-branch" parameters in the 'via-branch' section. The destination
|
||||
# branch is created from the source branch (if it doesn't already exist).
|
||||
#
|
||||
# The options -f and -b are mutually exlusive. Only one can be specified.
|
||||
#
|
||||
# NOTE only one of -U or -b can be specified.
|
||||
#
|
||||
# <tag> mbed-os tag to which all examples will be updated
|
||||
#
|
||||
|
||||
import os
|
||||
from os.path import dirname, abspath, basename
|
||||
from os.path import dirname, abspath, basename, join
|
||||
import sys
|
||||
import logging
|
||||
import argparse
|
||||
|
@ -46,6 +66,8 @@ import shutil
|
|||
import stat
|
||||
import re
|
||||
from github import Github, GithubException
|
||||
from jinja2 import FileSystemLoader, StrictUndefined
|
||||
from jinja2.environment import Environment
|
||||
|
||||
ROOT = abspath(dirname(dirname(dirname(dirname(__file__)))))
|
||||
sys.path.insert(0, ROOT)
|
||||
|
@ -216,7 +238,6 @@ def prepare_fork(arm_example):
|
|||
|
||||
Args:
|
||||
arm_example - Full GitHub repo path for original example
|
||||
ret - True if the fork was synchronised successfully, False otherwise
|
||||
|
||||
"""
|
||||
|
||||
|
@ -227,111 +248,89 @@ def prepare_fork(arm_example):
|
|||
['git', 'fetch', 'armmbed'],
|
||||
['git', 'reset', '--hard', 'armmbed/master'],
|
||||
['git', 'push', '-f', 'origin']]:
|
||||
if run_cmd(cmd):
|
||||
update_log.error("Fork preparation failed")
|
||||
return False
|
||||
return True
|
||||
run_cmd(cmd, exit_on_failure=True)
|
||||
|
||||
def prepare_branch(branch):
|
||||
def prepare_branch(src, dst):
|
||||
""" Set up at branch ready for use in updating examples
|
||||
|
||||
Description:
|
||||
|
||||
This function checks whether or not the supplied branch exists.
|
||||
If it does not, the branch is created and pushed to the origin.
|
||||
This function checks whether or not the supplied dst branch exists.
|
||||
If it does not, the branch is created from the src and pushed to the origin.
|
||||
The branch is then switched to.
|
||||
|
||||
Args:
|
||||
arm_example - Full GitHub repo path for original example
|
||||
ret - True if the fork was synchronised successfully, False otherwise
|
||||
src - branch to create the dst branch from
|
||||
dst - branch to update
|
||||
|
||||
"""
|
||||
|
||||
update_log.debug("Preparing branch: %s", branch)
|
||||
update_log.debug("Preparing branch: %s", dst)
|
||||
|
||||
# Check if branch already exists or not.
|
||||
cmd = ['git', 'branch']
|
||||
return_code, output = run_cmd_with_output(cmd)
|
||||
_, output = run_cmd_with_output(cmd, exit_on_failure=True)
|
||||
|
||||
if not branch in output:
|
||||
# OOB branch does not exist thus create it and then check it out
|
||||
cmd = ['git', 'checkout', '-b', branch]
|
||||
return_code = run_cmd(cmd)
|
||||
if not return_code:
|
||||
|
||||
# Push new branch upstream
|
||||
cmd = ['git', 'push', '-u', 'origin', branch]
|
||||
return_code = run_cmd(cmd)
|
||||
else:
|
||||
cmd = ['git', 'checkout', branch]
|
||||
return_code = run_cmd(cmd)
|
||||
|
||||
if return_code:
|
||||
update_log.error("Failed to prepare branch: %s", branch)
|
||||
return False
|
||||
if not dst in output:
|
||||
|
||||
return True
|
||||
|
||||
def upgrade_example(github, example, tag, ref,
|
||||
user='ARMmbed', branch='master'):
|
||||
# OOB branch does not exist thus create it, first ensuring we are on
|
||||
# the src branch and then check it out
|
||||
|
||||
for cmd in [['git', 'checkout', src],
|
||||
['git', 'checkout', '-b', dst],
|
||||
['git', 'push', '-u', 'origin', dst]]:
|
||||
|
||||
run_cmd(cmd, exit_on_failure=True)
|
||||
|
||||
else:
|
||||
cmd = ['git', 'checkout', dst]
|
||||
run_cmd(cmd, exit_on_failure=True)
|
||||
|
||||
def upgrade_example(github, example, tag, ref, user, src, dst, template):
|
||||
""" Upgrade all versions of mbed-os.lib found in the specified example repo
|
||||
|
||||
Description:
|
||||
|
||||
Clone a version of the example specified and upgrade all versions of
|
||||
mbed-os.lib found within its tree. The version cloned and how it
|
||||
is upgraded depends on the user and branch specified. Only two options
|
||||
are valid:
|
||||
1) ARMmbed + non master branch
|
||||
This option will update the branch directly in the ARMmbed repo. If the
|
||||
branch does not exist it will be first created.
|
||||
is upgraded depends on the user, src and dst settings.
|
||||
1) user == None
|
||||
The destination branch will be updated with the version of mbed-os
|
||||
idenfied by the tag. If the destination branch does not exist then it
|
||||
will be created from the source branch.
|
||||
|
||||
2) alternative user + master branch
|
||||
|
||||
This option assumes that a fork of the repo exists in the specified user's
|
||||
account. The fork will first be updated so that it is up to date with the
|
||||
upstream version , then the fork will be updated and a PR raised against
|
||||
the upstream ie ARMmbed repo.
|
||||
|
||||
2) user != None
|
||||
The master branch of a fork of the example will be updated with the
|
||||
version of mbed-os identified by the tag.
|
||||
|
||||
Args:
|
||||
github - GitHub instance to allow internal git commands to be run
|
||||
example - json example object containing the GitHub repo to update.
|
||||
tag - GitHub tag corresponding to a version of mbed-os to upgrade to.
|
||||
ref - SHA corresponding to the tag
|
||||
user - GitHub user name (defaults to 'ARMmbed' if not supplied)
|
||||
branch - branch to update (defaults to 'master' if not supplied)
|
||||
user - GitHub user name
|
||||
src - branch to create the dst branch from
|
||||
dst - branch to update
|
||||
|
||||
returns True if the upgrade was successful, False otherwise
|
||||
"""
|
||||
|
||||
# If a user has not been specified then branch update will be used and thus
|
||||
# the git user will be ARMmbed.
|
||||
if not user:
|
||||
user = 'ARMmbed'
|
||||
|
||||
ret = False
|
||||
update_log.info("Updating example '%s'", example['name'])
|
||||
update_log.debug("User: %s", user)
|
||||
update_log.debug("Branch: %s", branch)
|
||||
|
||||
# First check validity of user/branch combination
|
||||
if ((user == 'ARMmbed' and branch == 'master') or
|
||||
(user != 'ARMmbed' and branch != 'master')):
|
||||
update_log.error("Invalid user/branch combination")
|
||||
return False
|
||||
update_log.debug("Src branch: %s", (src or "None"))
|
||||
update_log.debug("Dst branch: %s", (dst or "None"))
|
||||
|
||||
cwd = os.getcwd()
|
||||
|
||||
upstream_repo = 'ARMmbed/'+ example['name']
|
||||
update_repo = "https://github.com/" + user + '/' + example['name']
|
||||
|
||||
update_log.debug("Upstream repository: %s", upstream_repo)
|
||||
update_log.debug("Update repository: %s", update_repo)
|
||||
|
||||
# Check access to mbed-os repo
|
||||
try:
|
||||
repo = github.get_repo(upstream_repo, False)
|
||||
|
||||
except:
|
||||
update_log.error("Upstream repo: %s, does not exist - skipping", upstream_repo)
|
||||
return False
|
||||
|
||||
|
||||
# Clone the example repo
|
||||
clone_cmd = ['git', 'clone', update_repo]
|
||||
return_code = run_cmd(clone_cmd)
|
||||
|
@ -343,13 +342,11 @@ def upgrade_example(github, example, tag, ref,
|
|||
|
||||
os.chdir(example['name'])
|
||||
|
||||
# If the user is not the default, then a fork will be used. Thus
|
||||
# synchronise the user fork with the upstream
|
||||
if user != 'ARMmbed':
|
||||
# If the user is ARMmbed then a branch is used.
|
||||
if user == 'ARMmbed':
|
||||
prepare_branch(src, dst)
|
||||
else:
|
||||
prepare_fork(example['github'])
|
||||
|
||||
if branch != 'master':
|
||||
prepare_branch(branch)
|
||||
|
||||
for example_directory in example_directories:
|
||||
if not upgrade_single_example(example, tag, os.path.relpath(example_directory, example['name']), ref):
|
||||
|
@ -369,12 +366,28 @@ def upgrade_example(github, example, tag, ref,
|
|||
return_code = run_cmd(push_cmd)
|
||||
|
||||
if not return_code:
|
||||
if user != 'ARMmbed':
|
||||
body = "Please test/merge this PR and then tag Master with " + tag
|
||||
# If the user is not ARMmbed then a fork is being used
|
||||
if user != 'ARMmbed':
|
||||
|
||||
upstream_repo = 'ARMmbed/'+ example['name']
|
||||
update_log.debug("Upstream repository: %s", upstream_repo)
|
||||
# Check access to mbed-os repo
|
||||
try:
|
||||
repo = github.get_repo(upstream_repo, False)
|
||||
|
||||
except:
|
||||
update_log.error("Upstream repo: %s, does not exist - skipping", upstream_repo)
|
||||
return False
|
||||
|
||||
jinja_loader = FileSystemLoader(template)
|
||||
jinja_environment = Environment(loader=jinja_loader,
|
||||
undefined=StrictUndefined)
|
||||
pr_body = jinja_environment.get_template("pr.tmpl").render(tag=tag)
|
||||
|
||||
# Raise a PR from release-candidate to master
|
||||
user_fork = user + ':master'
|
||||
try:
|
||||
pr = repo.create_pull(title='Updating mbed-os to ' + tag, head=user_fork, base='master', body=body)
|
||||
pr = repo.create_pull(title='Updating mbed-os to ' + tag, head=user_fork, base='master', body=pr_body)
|
||||
ret = True
|
||||
except GithubException as e:
|
||||
# Default to False
|
||||
|
@ -409,7 +422,6 @@ if __name__ == '__main__':
|
|||
|
||||
parser = argparse.ArgumentParser(description=__doc__,
|
||||
formatter_class=argparse.RawDescriptionHelpFormatter)
|
||||
parser.add_argument('tag', help="mbed-os tag to which all examples will be updated")
|
||||
parser.add_argument('-c', '--config_file', help="Path to the configuration file (default is 'examples.json')", default='examples.json')
|
||||
parser.add_argument('-T', '--github_token', help="GitHub token for secure access")
|
||||
parser.add_argument('-l', '--log-level',
|
||||
|
@ -417,8 +429,8 @@ if __name__ == '__main__':
|
|||
default='INFO')
|
||||
|
||||
exclusive = parser.add_mutually_exclusive_group(required=True)
|
||||
exclusive.add_argument('-U', '--github_user', help="GitHub user for forked repos, mutually exclusive to branch option")
|
||||
exclusive.add_argument('-b', '--branch', help="Branch to be updated, mutually exclusive to user option")
|
||||
exclusive.add_argument('-f', '--fork', help="Update a fork", action='store_true')
|
||||
exclusive.add_argument('-b', '--branch', help="Update a branch", action='store_true')
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
|
@ -441,30 +453,43 @@ if __name__ == '__main__':
|
|||
create_work_directory('examples')
|
||||
|
||||
github = Github(args.github_token)
|
||||
config = json_data['update-config']
|
||||
tag = config['tag']
|
||||
|
||||
user = None
|
||||
src = "master"
|
||||
dst = None
|
||||
|
||||
if args.fork:
|
||||
user = config['via-fork']['github-user']
|
||||
elif args.branch:
|
||||
src = config['via-branch']['src-branch']
|
||||
dst = config['via-branch']['dst-branch']
|
||||
else:
|
||||
userlog.error("Must specify either -f or -b command line option")
|
||||
exit(1)
|
||||
|
||||
# Get the github sha corresponding to the specified mbed-os tag
|
||||
cmd = ['git', 'rev-list', '-1', args.tag]
|
||||
cmd = ['git', 'rev-list', '-1', tag]
|
||||
return_code, ref = run_cmd_with_output(cmd)
|
||||
|
||||
if return_code:
|
||||
update_log.error("Could not obtain SHA for tag: %s", args.tag)
|
||||
update_log.error("Could not obtain SHA for tag: %s", tag)
|
||||
sys.exit(1)
|
||||
|
||||
# Loop through the examples
|
||||
failures = []
|
||||
successes = []
|
||||
results = {}
|
||||
template = dirname(abspath(__file__))
|
||||
|
||||
os.chdir('examples')
|
||||
|
||||
for example in json_data['examples']:
|
||||
# Determine if this example should be updated and if so update any found
|
||||
# mbed-os.lib files.
|
||||
|
||||
# Only user or branch can be specified on the command line
|
||||
if args.github_user:
|
||||
result = upgrade_example(github, example, args.tag, ref, user=args.github_user)
|
||||
else:
|
||||
result = upgrade_example(github, example, args.tag, ref, branch=args.branch)
|
||||
result = upgrade_example(github, example, tag, ref, user, src, dst, template)
|
||||
|
||||
if result:
|
||||
successes += [example['name']]
|
||||
|
|
|
@ -818,7 +818,7 @@ class mbedToolchain:
|
|||
c = c.replace("\\", "/")
|
||||
if self.CHROOT:
|
||||
c = c.replace(self.CHROOT, '')
|
||||
cmd_list.append('-I%s' % c)
|
||||
cmd_list.append('"-I%s"' % c)
|
||||
string = " ".join(cmd_list)
|
||||
f.write(string)
|
||||
return include_file
|
||||
|
@ -863,7 +863,10 @@ class mbedToolchain:
|
|||
|
||||
inc_paths = resources.inc_dirs
|
||||
if inc_dirs is not None:
|
||||
inc_paths.extend(inc_dirs)
|
||||
if isinstance(inc_dirs, list):
|
||||
inc_paths.extend(inc_dirs)
|
||||
else:
|
||||
inc_paths.append(inc_dirs)
|
||||
# De-duplicate include paths
|
||||
inc_paths = set(inc_paths)
|
||||
# Sort include paths for consistency
|
||||
|
|
Loading…
Reference in New Issue