Skip to content

Commit d9d3a76

Browse files
authored
Add support for flash alignment of 128 and 256 bits (#350)
1 parent b272fe6 commit d9d3a76

File tree

2 files changed

+44
-6
lines changed

2 files changed

+44
-6
lines changed

nanoFramework.Tools.DebugLibrary.Shared/Extensions/FlashSectorDataExtensions.cs

+38-5
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
//
55

66
using nanoFramework.Tools.Debugger.WireProtocol;
7+
using System;
78
using System.Collections.Generic;
89
using static nanoFramework.Tools.Debugger.WireProtocol.Commands.Monitor_FlashSectorMap;
910

@@ -27,14 +28,46 @@ public static DeploymentSector ToDeploymentSector(this FlashSectorData value)
2728
int programmingAlignment = 0;
2829

2930
// check alignment requirements
30-
if ((value.Flags
31-
& BlockRegionAttributes_MASK
32-
& BlockRegionAttribute_ProgramWidthIs64bits) == BlockRegionAttribute_ProgramWidthIs64bits)
31+
uint blockRegionFlashProgrammingWidth = value.Flags & BlockRegionFlashProgrammingWidth_MASK;
32+
uint blockRegionBitsSet = blockRegionFlashProgrammingWidth;
33+
34+
// Zero, or 1 bit only allowed to be set for programming width
35+
uint countOfBitsSet = 0;
36+
while (blockRegionBitsSet > 0)
37+
{
38+
countOfBitsSet += blockRegionBitsSet & 1;
39+
blockRegionBitsSet >>= 1;
40+
}
41+
if( countOfBitsSet > 1)
3342
{
34-
// programming width is 64bits => 8 bytes
35-
programmingAlignment = 8;
43+
throw new NotSupportedException("Multiple selections for Flash Program Width found, only one supported per block");
3644
}
3745

46+
switch (blockRegionFlashProgrammingWidth)
47+
{
48+
case BlockRegionAttribute_ProgramWidthIs8bits:
49+
// when not specified, default to minimum flash word size
50+
programmingAlignment = 0;
51+
break;
52+
53+
case BlockRegionAttribute_ProgramWidthIs64bits:
54+
programmingAlignment = 64 / 8;
55+
break;
56+
57+
case BlockRegionAttribute_ProgramWidthIs128bits:
58+
programmingAlignment = 128 / 8;
59+
break;
60+
61+
case BlockRegionAttribute_ProgramWidthIs256bits:
62+
programmingAlignment = 256 / 8;
63+
break;
64+
65+
default:
66+
throw new NotSupportedException($"The specified Flash Program Width '{blockRegionFlashProgrammingWidth}' is not supported. Please check the native implementation and/or that you have the .NET nanoFramework Visual Studio extension update.");
67+
}
68+
69+
Console.WriteLine($"The value is {programmingAlignment}");
70+
3871
blocks.Add(new DeploymentBlock(
3972
(int)value.StartAddress + (i * (int)value.BytesPerBlock),
4073
(int)value.BytesPerBlock,

nanoFramework.Tools.DebugLibrary.Shared/WireProtocol/Commands.cs

+6-1
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,15 @@ public class Monitor_FlashSectorMap
9696

9797
// media attributes
9898
public const uint BlockRegionAttributes_MASK = 0x0000FF00;
99+
public const uint BlockRegionFlashProgrammingWidth_MASK = 0x00000E00;
99100

100101
public const uint BlockRegionAttribute_MemoryMapped = 0x0100;
101-
// programming width is 64bits
102+
103+
// Programming width definitions
104+
public const uint BlockRegionAttribute_ProgramWidthIs8bits = 0x0000;
102105
public const uint BlockRegionAttribute_ProgramWidthIs64bits = 0x0200;
106+
public const uint BlockRegionAttribute_ProgramWidthIs128bits = 0x0400;
107+
public const uint BlockRegionAttribute_ProgramWidthIs256bits = 0x0800;
103108

104109
public struct FlashSectorData
105110
{

0 commit comments

Comments
 (0)