|
|
|
@ -8,9 +8,6 @@
@@ -8,9 +8,6 @@
|
|
|
|
|
#include <AP_HAL/AP_HAL.h> |
|
|
|
|
#include <AP_HAL/system.h> |
|
|
|
|
|
|
|
|
|
#include <AP_BoardConfig/AP_BoardConfig.h> |
|
|
|
|
#include <AP_BoardConfig/AP_BoardConfig_CAN.h> |
|
|
|
|
|
|
|
|
|
#if HAL_WITH_UAVCAN |
|
|
|
|
|
|
|
|
|
#include <cassert> |
|
|
|
@ -25,6 +22,8 @@
@@ -25,6 +22,8 @@
|
|
|
|
|
|
|
|
|
|
#include "Scheduler.h" |
|
|
|
|
|
|
|
|
|
#include <AP_BoardConfig/AP_BoardConfig_CAN.h> |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* FOR INVESTIGATION: |
|
|
|
|
* AP_HAL::micros64() was called for monotonic time counter |
|
|
|
@ -172,7 +171,7 @@ int VRBRAINCAN::computeTimings(const uint32_t target_bitrate, Timings& out_timin
@@ -172,7 +171,7 @@ int VRBRAINCAN::computeTimings(const uint32_t target_bitrate, Timings& out_timin
|
|
|
|
|
const uint8_t max_quanta_per_bit = (target_bitrate >= 1000000) ? 10 : 17; |
|
|
|
|
|
|
|
|
|
if (max_quanta_per_bit > (MaxBS1 + MaxBS2)) { |
|
|
|
|
if (AP_BoardConfig_CAN::get_can_debug() >= 1) { |
|
|
|
|
if (AP::can().get_debug_level(self_index_) >= 1) { |
|
|
|
|
printf("VRBRAINCAN::computeTimings max_quanta_per_bit problem\n\r"); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -241,7 +240,7 @@ int VRBRAINCAN::computeTimings(const uint32_t target_bitrate, Timings& out_timin
@@ -241,7 +240,7 @@ int VRBRAINCAN::computeTimings(const uint32_t target_bitrate, Timings& out_timin
|
|
|
|
|
uint16_t(1000 * (1 + bs1) / (1 + bs1 + bs2))) |
|
|
|
|
{ |
|
|
|
|
if (bs1_bs2_sum <= arg_bs1) { |
|
|
|
|
if (AP_BoardConfig_CAN::get_can_debug() >= 1) { |
|
|
|
|
if (AP::can().get_debug_level(self_index_) >= 1) { |
|
|
|
|
AP_HAL::panic("VRBRAINCAN::computeTimings bs1_bs2_sum <= arg_bs1"); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -271,13 +270,13 @@ int VRBRAINCAN::computeTimings(const uint32_t target_bitrate, Timings& out_timin
@@ -271,13 +270,13 @@ int VRBRAINCAN::computeTimings(const uint32_t target_bitrate, Timings& out_timin
|
|
|
|
|
* Final validation |
|
|
|
|
*/ |
|
|
|
|
if ((target_bitrate != (pclk / (prescaler * (1 + solution.bs1 + solution.bs2)))) || !solution.isValid()) { |
|
|
|
|
if (AP_BoardConfig_CAN::get_can_debug() >= 1) { |
|
|
|
|
if (AP::can().get_debug_level(self_index_) >= 1) { |
|
|
|
|
printf("VRBRAINCAN::computeTimings target_bitrate error\n\r"); |
|
|
|
|
} |
|
|
|
|
return -ErrLogic; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (AP_BoardConfig_CAN::get_can_debug() >= 2) { |
|
|
|
|
if (AP::can().get_debug_level(self_index_) >= 2) { |
|
|
|
|
printf("VRBRAINCAN::computeTimings Timings: quanta/bit: %d, sample point location: %.1f%%\n\r", |
|
|
|
|
int(1 + solution.bs1 + solution.bs2), double(solution.sample_point_permill / 10.0)); |
|
|
|
|
} |
|
|
|
@ -479,7 +478,7 @@ int VRBRAINCAN::init(const uint32_t bitrate, const OperatingMode mode)
@@ -479,7 +478,7 @@ int VRBRAINCAN::init(const uint32_t bitrate, const OperatingMode mode)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!waitMsrINakBitStateChange(true)) { |
|
|
|
|
if (AP_BoardConfig_CAN::get_can_debug() >= 1) { |
|
|
|
|
if (AP::can().get_debug_level(self_index_) >= 1) { |
|
|
|
|
printf("VRBRAINCAN::init MSR INAK not set\n\r"); |
|
|
|
|
} |
|
|
|
|
can_->MCR = bxcan::MCR_RESET; |
|
|
|
@ -505,7 +504,7 @@ int VRBRAINCAN::init(const uint32_t bitrate, const OperatingMode mode)
@@ -505,7 +504,7 @@ int VRBRAINCAN::init(const uint32_t bitrate, const OperatingMode mode)
|
|
|
|
|
can_->MCR = bxcan::MCR_RESET; |
|
|
|
|
return timings_res; |
|
|
|
|
} |
|
|
|
|
if (AP_BoardConfig_CAN::get_can_debug() >= 2) { |
|
|
|
|
if (AP::can().get_debug_level(self_index_) >= 2) { |
|
|
|
|
printf("VRBRAINCAN::init Timings: presc=%u sjw=%u bs1=%u bs2=%u\n\r", unsigned(timings.prescaler), |
|
|
|
|
unsigned(timings.sjw), unsigned(timings.bs1), unsigned(timings.bs2)); |
|
|
|
|
} |
|
|
|
@ -525,7 +524,7 @@ int VRBRAINCAN::init(const uint32_t bitrate, const OperatingMode mode)
@@ -525,7 +524,7 @@ int VRBRAINCAN::init(const uint32_t bitrate, const OperatingMode mode)
|
|
|
|
|
can_->MCR &= ~bxcan::MCR_INRQ; // Leave init mode
|
|
|
|
|
|
|
|
|
|
if (!waitMsrINakBitStateChange(false)) { |
|
|
|
|
if (AP_BoardConfig_CAN::get_can_debug() >= 1) { |
|
|
|
|
if (AP::can().get_debug_level(self_index_) >= 1) { |
|
|
|
|
printf("VRBRAINCAN::init MSR INAK not cleared\n\r"); |
|
|
|
|
} |
|
|
|
|
can_->MCR = bxcan::MCR_RESET; |
|
|
|
@ -969,7 +968,7 @@ int VRBRAINCANManager::init(const uint32_t bitrate, const VRBRAINCAN::OperatingM
@@ -969,7 +968,7 @@ int VRBRAINCANManager::init(const uint32_t bitrate, const VRBRAINCAN::OperatingM
|
|
|
|
|
|
|
|
|
|
int res = 0; |
|
|
|
|
|
|
|
|
|
if (AP_BoardConfig_CAN::get_can_debug(can_number) >= 2) { |
|
|
|
|
if (AP::can().get_debug_level(can_number) >= 2) { |
|
|
|
|
printf("VRBRAINCANManager::init Bitrate %lu mode %d bus %d\n\r", static_cast<unsigned long>(bitrate), |
|
|
|
|
static_cast<int>(mode), static_cast<int>(can_number)); |
|
|
|
|
} |
|
|
|
@ -980,7 +979,7 @@ int VRBRAINCANManager::init(const uint32_t bitrate, const VRBRAINCAN::OperatingM
@@ -980,7 +979,7 @@ int VRBRAINCANManager::init(const uint32_t bitrate, const VRBRAINCAN::OperatingM
|
|
|
|
|
_ifaces_num++; |
|
|
|
|
_ifaces_out_to_in[can_number] = _ifaces_num - 1; |
|
|
|
|
|
|
|
|
|
if (AP_BoardConfig_CAN::get_can_debug(can_number) >= 2) { |
|
|
|
|
if (AP::can().get_debug_level(can_number) >= 2) { |
|
|
|
|
printf("VRBRAINCANManager::init First initialization bus %d\n\r", static_cast<int>(can_number)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -991,7 +990,7 @@ int VRBRAINCANManager::init(const uint32_t bitrate, const VRBRAINCAN::OperatingM
@@ -991,7 +990,7 @@ int VRBRAINCANManager::init(const uint32_t bitrate, const VRBRAINCAN::OperatingM
|
|
|
|
|
* CAN1 |
|
|
|
|
*/ |
|
|
|
|
if (can_number == 0) { |
|
|
|
|
if (AP_BoardConfig_CAN::get_can_debug(0) >= 2) { |
|
|
|
|
if (AP::can().get_debug_level(0) >= 2) { |
|
|
|
|
printf("VRBRAINCANManager::init Initing iface 0...\n\r"); |
|
|
|
|
} |
|
|
|
|
ifaces[_ifaces_out_to_in[can_number]] = &if0_; // This link must be initialized first,
|
|
|
|
@ -1002,7 +1001,7 @@ int VRBRAINCANManager::init(const uint32_t bitrate, const VRBRAINCAN::OperatingM
@@ -1002,7 +1001,7 @@ int VRBRAINCANManager::init(const uint32_t bitrate, const VRBRAINCAN::OperatingM
|
|
|
|
|
* CAN2 |
|
|
|
|
*/ |
|
|
|
|
if (can_number == 1) { |
|
|
|
|
if (AP_BoardConfig_CAN::get_can_debug(1) >= 2) { |
|
|
|
|
if (AP::can().get_debug_level(1) >= 2) { |
|
|
|
|
printf("VRBRAINCANManager::init Initing iface 1...\n\r"); |
|
|
|
|
} |
|
|
|
|
ifaces[_ifaces_out_to_in[can_number]] = &if1_; // Same thing here.
|
|
|
|
@ -1016,7 +1015,7 @@ int VRBRAINCANManager::init(const uint32_t bitrate, const VRBRAINCAN::OperatingM
@@ -1016,7 +1015,7 @@ int VRBRAINCANManager::init(const uint32_t bitrate, const VRBRAINCAN::OperatingM
|
|
|
|
|
return res; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (AP_BoardConfig_CAN::get_can_debug(can_number) >= 2) { |
|
|
|
|
if (AP::can().get_debug_level(can_number) >= 2) { |
|
|
|
|
printf("VRBRAINCANManager::init CAN drv init OK, res = %d\n\r", res); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|