diff --git a/src/Targets/RiscV/Wch/Peripherals/Flash/FlashControlRegisterFields.hpp b/src/Targets/RiscV/Wch/Peripherals/Flash/FlashControlRegisterFields.hpp index 8eb27cdb..a0be4703 100644 --- a/src/Targets/RiscV/Wch/Peripherals/Flash/FlashControlRegisterFields.hpp +++ b/src/Targets/RiscV/Wch/Peripherals/Flash/FlashControlRegisterFields.hpp @@ -1,7 +1,6 @@ #pragma once #include "src/Targets/TargetBitFieldDescriptor.hpp" -#include "src/Targets/RiscV/Wch/TargetDescriptionFile.hpp" namespace Targets::RiscV::Wch::Peripherals::Flash { diff --git a/src/Targets/RiscV/Wch/Peripherals/Flash/FlashOptionByteRegisterFields.hpp b/src/Targets/RiscV/Wch/Peripherals/Flash/FlashOptionByteRegisterFields.hpp new file mode 100644 index 00000000..e5754939 --- /dev/null +++ b/src/Targets/RiscV/Wch/Peripherals/Flash/FlashOptionByteRegisterFields.hpp @@ -0,0 +1,11 @@ +#pragma once + +#include "src/Targets/TargetBitFieldDescriptor.hpp" + +namespace Targets::RiscV::Wch::Peripherals::Flash +{ + struct FlashOptionByteRegisterFields + { + const TargetBitFieldDescriptor& readProtected; + }; +} diff --git a/src/Targets/RiscV/Wch/Peripherals/Flash/FlashStatusRegisterFields.hpp b/src/Targets/RiscV/Wch/Peripherals/Flash/FlashStatusRegisterFields.hpp index 07d6c1fb..b565b1c1 100644 --- a/src/Targets/RiscV/Wch/Peripherals/Flash/FlashStatusRegisterFields.hpp +++ b/src/Targets/RiscV/Wch/Peripherals/Flash/FlashStatusRegisterFields.hpp @@ -1,7 +1,6 @@ #pragma once #include "src/Targets/TargetBitFieldDescriptor.hpp" -#include "src/Targets/RiscV/Wch/TargetDescriptionFile.hpp" namespace Targets::RiscV::Wch::Peripherals::Flash { diff --git a/src/Targets/RiscV/Wch/WchRiscV.cpp b/src/Targets/RiscV/Wch/WchRiscV.cpp index 61b5095a..98e7789c 100644 --- a/src/Targets/RiscV/Wch/WchRiscV.cpp +++ b/src/Targets/RiscV/Wch/WchRiscV.cpp @@ -15,6 +15,7 @@ #include "src/Services/StringService.hpp" #include "src/Logger/Logger.hpp" +#include "src/TargetController/Exceptions/TargetFailure.hpp" #include "src/TargetController/Exceptions/TargetOperationFailure.hpp" namespace Targets::RiscV::Wch @@ -41,6 +42,7 @@ namespace Targets::RiscV::Wch , flashBootKeyRegisterDescriptor(this->flashPeripheralDescriptor.getRegisterDescriptor("flash", "boot_modekeyr")) , flashStatusRegisterDescriptor(this->flashPeripheralDescriptor.getRegisterDescriptor("flash", "statr")) , flashControlRegisterDescriptor(this->flashPeripheralDescriptor.getRegisterDescriptor("flash", "ctrl")) + , flashOptionByteRegisterDescriptor(this->flashPeripheralDescriptor.getRegisterDescriptor("flash", "obr")) , flashControlRegisterFields( Peripherals::Flash::FlashControlRegisterFields{ .locked = this->flashControlRegisterDescriptor.getBitFieldDescriptor("lock"), @@ -55,6 +57,11 @@ namespace Targets::RiscV::Wch .bootMode = this->flashStatusRegisterDescriptor.getBitFieldDescriptor("boot_mode"), } ) + , flashOptionByteRegisterFields( + Peripherals::Flash::FlashOptionByteRegisterFields{ + .readProtected = this->flashOptionByteRegisterDescriptor.getBitFieldDescriptor("rdprt"), + } + ) , rccPeripheralDescriptor(this->targetDescriptionFile.getTargetPeripheralDescriptor("rcc")) , portPeripheralClockEnableRegisterDescriptor( this->rccPeripheralDescriptor.getRegisterDescriptor("rcc", "apb2pcenr") @@ -121,6 +128,11 @@ namespace Targets::RiscV::Wch } this->variant = *(variantIt->second); + + const auto optionByteValue = this->readRegisterDynamicValue(this->flashOptionByteRegisterDescriptor); + if (optionByteValue.bitFieldAs(this->flashOptionByteRegisterFields.readProtected)) { + throw Exceptions::TargetFailure{"Program memory is currently \"read-protected\""}; + } } void WchRiscV::postActivate() { diff --git a/src/Targets/RiscV/Wch/WchRiscV.hpp b/src/Targets/RiscV/Wch/WchRiscV.hpp index 584f647d..6d2ee167 100644 --- a/src/Targets/RiscV/Wch/WchRiscV.hpp +++ b/src/Targets/RiscV/Wch/WchRiscV.hpp @@ -17,6 +17,7 @@ #include "GpioPadDescriptor.hpp" #include "Peripherals/Flash/FlashControlRegisterFields.hpp" #include "Peripherals/Flash/FlashStatusRegisterFields.hpp" +#include "Peripherals/Flash/FlashOptionByteRegisterFields.hpp" namespace Targets::RiscV::Wch { @@ -106,9 +107,11 @@ namespace Targets::RiscV::Wch const TargetRegisterDescriptor& flashBootKeyRegisterDescriptor; const TargetRegisterDescriptor& flashStatusRegisterDescriptor; const TargetRegisterDescriptor& flashControlRegisterDescriptor; + const TargetRegisterDescriptor& flashOptionByteRegisterDescriptor; const Peripherals::Flash::FlashControlRegisterFields flashControlRegisterFields; const Peripherals::Flash::FlashStatusRegisterFields flashStatusRegisterFields; + const Peripherals::Flash::FlashOptionByteRegisterFields flashOptionByteRegisterFields; const TargetPeripheralDescriptor rccPeripheralDescriptor; const TargetRegisterDescriptor& portPeripheralClockEnableRegisterDescriptor;