diff --git a/tools/svdconv/SVDGenerator/src/SfdData_SingleItems.cpp b/tools/svdconv/SVDGenerator/src/SfdData_SingleItems.cpp
index 53fa787e3..68481d1d0 100644
--- a/tools/svdconv/SVDGenerator/src/SfdData_SingleItems.cpp
+++ b/tools/svdconv/SVDGenerator/src/SfdData_SingleItems.cpp
@@ -954,7 +954,11 @@ bool SfdData::CreateFieldItem(SvdField* field)
if(bitWidth > MAX_BITWIDTH_FOR_COMBO && firstContHasChilds) {
string msg = "Enumerated values list for field '";
msg += field->GetNameCalculated();
- msg += "' exceeds maximum of 256 elements. List will not be generated.";
+ msg += "' will not be generated: field width ";
+ msg += to_string(bitWidth);
+ msg += " exceeds the maximum of ";
+ msg += to_string(MAX_BITWIDTH_FOR_COMBO);
+ msg += " bits.";
LogMsg("M227", MSG(msg), field->GetLineNumber());
}
diff --git a/tools/svdconv/test/data/enumComboWidth/EnumComboWidth.svd b/tools/svdconv/test/data/enumComboWidth/EnumComboWidth.svd
new file mode 100644
index 000000000..e8c1695d2
--- /dev/null
+++ b/tools/svdconv/test/data/enumComboWidth/EnumComboWidth.svd
@@ -0,0 +1,75 @@
+
+
+
+ EnumComboWidth
+ 1.0
+ Test the SFD combo field width limit
+ 8
+ 32
+ 0x20
+ 0x0
+ 0xFFFFFFFF
+
+
+ CM4
+ r0p0
+ little
+ false
+ 4
+ 16
+
+
+
+
+ TEST
+ Test peripheral
+ Enum Combo Width
+ 0x40000000
+
+ 0x0
+ 0x4
+ registers
+
+
+
+ CTRL
+ Test control register
+ 0x0
+ 0x20
+ read-only
+ 0x0
+
+
+ SIX_BIT
+ Six bit field
+ 0
+ 6
+
+
+ ONE
+ Value one
+ 1
+
+
+
+
+ SEVEN_BIT
+ Seven bit field
+ 8
+ 7
+
+
+ NINE
+ Value nine
+ 9
+
+
+
+
+
+
+
+
+
diff --git a/tools/svdconv/test/integtests/src/SvdConvIntegTests.cpp b/tools/svdconv/test/integtests/src/SvdConvIntegTests.cpp
index a038befa1..95ae6d7e0 100644
--- a/tools/svdconv/test/integtests/src/SvdConvIntegTests.cpp
+++ b/tools/svdconv/test/integtests/src/SvdConvIntegTests.cpp
@@ -252,3 +252,53 @@ TEST_F(SvdConvIntegTests, CheckPosMaskDimFields) {
EXPECT_EQ(string::npos, buf.find("#define TIM_DATA_PIN_Pos"));
EXPECT_EQ(string::npos, buf.find("#define TIM_DATA_PIN_Msk"));
}
+
+TEST_F(SvdConvIntegTests, CheckEnumComboWidthLimit) {
+ const string& inFile = SvdConvIntegTestEnv::localtestdata_dir + "/enumComboWidth/EnumComboWidth.svd";
+ const string testOut = SvdConvIntegTestEnv::testoutput_dir + "/enumComboWidth";
+ ASSERT_TRUE(RteFsUtils::Exists(inFile));
+
+ Arguments args("SVDConv.exe", inFile);
+ args.add({ "-o", testOut, "--generate=sfd", "--create-folder" });
+
+ SvdConv svdConv;
+ EXPECT_EQ(1, svdConv.Check(args, args, nullptr));
+
+ const auto msgs = ErrLog::Get()->GetLogMessages();
+ size_t m227Count = 0;
+ string allMessages;
+ for(const auto& msg : msgs) {
+ allMessages += msg;
+ if(msg.find("M227") != string::npos) {
+ ++m227Count;
+ }
+ }
+ EXPECT_EQ(1U, m227Count);
+ EXPECT_NE(string::npos, allMessages.find("field 'SEVEN_BIT'"));
+ EXPECT_NE(string::npos, allMessages.find("field width 7"));
+ EXPECT_NE(string::npos, allMessages.find("maximum of 6 bits"));
+
+ const string testOutSfd = testOut + "/EnumComboWidth.sfd";
+ ASSERT_TRUE(RteFsUtils::Exists(testOutSfd));
+
+ string buf;
+ RteFsUtils::ReadFile(testOutSfd, buf);
+ ASSERT_FALSE(buf.empty());
+
+ const auto sixBitField = buf.find("SFDITEM_FIELD__TEST_CTRL_SIX_BIT");
+ const auto sevenBitField = buf.find("SFDITEM_FIELD__TEST_CTRL_SEVEN_BIT");
+ ASSERT_NE(string::npos, sixBitField);
+ ASSERT_NE(string::npos, sevenBitField);
+ ASSERT_LT(sixBitField, sevenBitField);
+
+ const auto sixBitCombo = buf.find("// ", sixBitField);
+ EXPECT_NE(string::npos, sixBitCombo);
+ EXPECT_LT(sixBitCombo, sevenBitField);
+ const auto sixBitLastValue = buf.find("// <63=>", sixBitCombo);
+ EXPECT_NE(string::npos, sixBitLastValue);
+ EXPECT_LT(sixBitLastValue, sevenBitField);
+
+ const auto sevenBitEdit = buf.find("// ", sevenBitField);
+ EXPECT_NE(string::npos, sevenBitEdit);
+ EXPECT_EQ(string::npos, buf.find("// ", sevenBitField));
+}