Can't link up two(2) 64x32 displays ! Shouldn't it be "plug and play" simple?

Hello !
I am trying to link up horizontally two 64x32 displays.
The displays are imported from CHINA.
They have 1/8 scan pattern.

I believe their order should be reversed, not like in the picture, right ?
As I look at them they should be
(Display with ESP connection) on the left and (Display without ESP) on the right.
???
But I don’t have that long of a ribbon.

These displays individually work with the same kPanelType that I created using MultiRowMapping example:
kPanelType = SMARTMATRIX_HUB75_32ROW_64COL_MOD8SCAN_P5_2727;

Settings 1

So, naturally, I’ve tried the following settings:

const uint8_t kMatrixWidth = 128;      
const uint8_t kMatrixHeight = 32;     
const uint8_t kPanelType = SMARTMATRIX_HUB75_32ROW_64COL_MOD8SCAN_P5_2727;
const uint8_t kRefreshDepth = 24;
const uint8_t kDmaBufferRows = 2;
const uint8_t kMatrixOptions = (SMARTMATRIX_OPTIONS_NONE);      
const uint8_t kBackgroundLayerOptions = (SM_BACKGROUND_OPTIONS_NONE);

and

  • kMatrixOptions = (SMARTMATRIX_OPTIONS_NONE); -> the output isn’t the correct one.
  • kMatrixOptions = (SMARTMATRIX_OPTIONS_C_SHAPE_STACKING); -> the displays are black.
  • kMatrixOptions = (SMARTMATRIX_OPTIONS_BOTTOM_TO_TOP_STACKING); -> the same result as kMatrixOptions = (SMARTMATRIX_OPTIONS_NONE);.
  • kMatrixOptions = (SMARTMATRIX_OPTIONS_C_SHAPE_STACKING | SMARTMATRIX_OPTIONS_BOTTOM_TO_TOP_STACKING); -> the displays were black again.

Do I need to make a custom kPanelType for them ?

Settings 2

const uint8_t kMatrixWidth = 128;      
const uint8_t kMatrixHeight = 32;     
const uint8_t kPanelType = SMARTMATRIX_HUB75_32ROW_MOD16SCAN;

and:
kMatrixOptions = (SMARTMATRIX_OPTIONS_NONE); -> using this setting the displays output the same thing as one another, but different to above output.
kMatrixOptions = (SMARTMATRIX_OPTIONS_C_SHAPE_STACKING); -> the displays are black
kMatrixOptions = (SMARTMATRIX_OPTIONS_BOTTOM_TO_TOP_STACKING); -> same result as kMatrixOptions = (SMARTMATRIX_OPTIONS_NONE);
kMatrixOptions = (SMARTMATRIX_OPTIONS_C_SHAPE_STACKING | SMARTMATRIX_OPTIONS_BOTTOM_TO_TOP_STACKING); -> the displays are black.

Do I need to make a custom kPanelType for them ?
This is a problem, though ! No matter what settings I try with MODE_MAP_REVERSE_ENGINEERING I can’t get them to behave like one display. They output the same information individually.

By using the formula kMatrixWidth = (32x16)/kMatrixHeight = 128 I will get: (128x32)/16 = 256. But kMatrixWidth is uint8_t so 256 won’t fit.

Whatever I try they are either black or behave like two separate displays that run the same code.

Other questions:

Also, after I fix this I will try to use four(4) horizontally positioned 64x32 displays, so basically 256x32. Will I have issues there too ?

Also, what if I wanted to position the two(2) displays on top of each other ? Basically 64x64.

I still haven’t managed to make them work.

I’ve tried out FeatureDemo.

Settings 1

#define COLOR_DEPTH 24                  // known working: 24, 48 - If the sketch uses type `rgb24` directly, COLOR_DEPTH must be 24
const uint8_t kMatrixWidth = 64;
const uint8_t kMatrixHeight = 32;
const uint8_t kRefreshDepth = 24;       // known working: 24, 36, 48
const uint8_t kDmaBufferRows = 2;       // known working: 2-4, use 2 to save memory, more to keep from dropping frames and automatically lowering refresh rate
const uint8_t kPanelType = SMARTMATRIX_HUB75_32ROW_64COL_MOD8SCAN_P5_2727;
const uint8_t kMatrixOptions = (SMARTMATRIX_OPTIONS_NONE);
const uint8_t kBackgroundLayerOptions = (SM_BACKGROUND_OPTIONS_NONE);
const uint8_t kScrollingLayerOptions = (SM_SCROLLING_OPTIONS_NONE);
const uint8_t kIndexedLayerOptions = (SM_INDEXED_OPTIONS_NONE);

With these settings the output was identical on both displays.
And it crashed when the Brightness was too high. Probably because it doesn’t have enough RAM to drive the same image on two separate displays.

Settings 2:

Changing to const uint8_t kMatrixWidth = 128; I noticed a strange behavior:

20190516-120807.jpg

Instead of going horizontally, they are overlapping. The final image is composed out of 2 pieces of 8 bit-row-each from each display.
The image freezes every time on DEMO_DRAWING_INTRO.

Does somebody have any idea of why is this happening ?

Here is another test with simple text on display:

Settings 1:

#define COLOR_DEPTH 24                  // known working: 24, 48 - If the sketch uses type `rgb24` directly, COLOR_DEPTH must be 24
#define kMatrixWidth  64       // known working: 32, 64, 96, 128
#define kMatrixHeight 32       // known working: 16, 32, 48, 64
const uint8_t kRefreshDepth = 24;       // known working: 24, 36, 48
const uint8_t kDmaBufferRows = 2;       // known working: 2-4, use 2 to save memory, more to keep from dropping frames and automatically lowering refresh rate
const uint8_t kPanelType = SMARTMATRIX_HUB75_32ROW_64COL_MOD8SCAN_P5_2727;
const uint8_t kMatrixOptions = (SMARTMATRIX_OPTIONS_NONE);
const uint8_t kBackgroundLayerOptions = (SM_BACKGROUND_OPTIONS_NONE);

SMARTMATRIX_ALLOCATE_BUFFERS(matrixLayer, kMatrixWidth, kMatrixHeight, kRefreshDepth, kDmaBufferRows, kPanelType, kMatrixOptions);
SMARTMATRIX_ALLOCATE_BACKGROUND_LAYER(backgroundLayer, kMatrixWidth, kMatrixHeight, COLOR_DEPTH, kBackgroundLayerOptions);

// const int defaultBrightness = (100*255)/100;        // full (100%) brightness
const int defaultBrightness = (5*255)/100;       // dim: 15% brightness

The result:

20190516-123235.jpg

Settings 2

I’ve changed only the following:

#define kMatrixWidth  128
#define kMatrixHeight 32

Result:

20190516-123202.jpg

Settings 3

I’ve changed only the following:

#define kMatrixWidth  64
#define kMatrixHeight 64

Result:

20190516-123442.jpg

I think I understand what happens.
The panels are arranged like this:

  • The one that is connected to the ESP is the one with the blue and white lines, the one on the right side of the image
  • The one on the left is connected to the display on the right

Let’s name the panels like this:

  • the one with the ESP connection: Display_1
  • the one on the left: Display_2

So the image I want should come from the Display_1 and continue to Display_2, correct ?

In my case:

As I see it the final image is composed out of 4 final_rows, each having a height of 8 pixels. The final_rows are taken from each display in some way.

On Settings 2 and Settings 3 I have two possibilities:

  • final_row1 from Display_1 row1
  • final_row2 from Display_2 row2
  • final_row3 from Display_1 row3
  • final_row4 from Display_2 row4

or

  • final_row1 from Display_1 row3
  • final_row2 from Display_2 row2
  • final_row3 from Display_1 row1
  • final_row4 from Display_2 row4

Isn’t this a strange behavior ?

What do you think happens here ?

I have no clue.

I’m guessing it has to do with the Panel Mapping. Something seems to be breaking when the pixels need to go beyond one panel.

Can you paste your panel map?

I’m not sure it’s needed, but if you can do this it may save some troubleshooting time in the future. Can you run the MultiRowMapping sketch a few times, video the results of one pass through the sketch, and upload it so it can be seen here? (I use Dropbox, or YouTube).

  • first configured for MODE_MAP_REVERSE_ENGINEERING, using the settings you used to come up with the panel map for your panel, run it on two panels
  • next, configured for MODE_MAP_REVERSE_ENGINEERING, and double the width setting so the pixel travels across both panels in one pass
  • next, configured for MODE_MAP_TESTING, set using your custom panel type and 128x32

To answer some of your previous questions:

  • you should just be able to specify the width/height of your overall display and SmartMatrix Library should just adapt to fill your panels (both chaining in one row, or stacking panels on top of each other)
  • SMARTMATRIX_OPTIONS_C_SHAPE_STACKING is broken in the teensylc branch, this is mentioned in the README

Ok ! Let’s do this !

For the duration of the troubleshoot these settings don’t change:

const uint8_t kRefreshDepth = 24;       // known working: 24, 36, 48
const uint8_t kDmaBufferRows = 2;       // known working: 2-4, use 2 to save memory, more to keep from dropping frames and automatically lowering refresh rate
const uint8_t kMatrixOptions = (SMARTMATRIX_OPTIONS_NONE);
const uint8_t kBackgroundLayerOptions = (SM_BACKGROUND_OPTIONS_NONE);

SMARTMATRIX_ALLOCATE_BUFFERS(matrix, kMatrixWidth, kMatrixHeight, kRefreshDepth, kDmaBufferRows, kPanelType, kMatrixOptions);
SMARTMATRIX_ALLOCATE_BACKGROUND_LAYER(backgroundLayer, kMatrixWidth, kMatrixHeight, COLOR_DEPTH, kBackgroundLayerOptions);

Settings 1

that I used to do the Panel Map

#if (SKETCH_MODE == MODE_MAP_REVERSE_ENGINEERING)
const uint8_t kMatrixWidth = 128;
const uint8_t kMatrixHeight = 16;
const uint8_t kPanelType = SMARTMATRIX_HUB75_16ROW_MOD8SCAN;
#endif

Video 1: LED_Debug_1-1 - YouTube
Video 2: LED_Debug_1-2 - YouTube

Both videos are running with SKETCH_MODE == MODE_MAP_REVERSE_ENGINEERING
The difference is where I’ve put this: backgroundLayer.fillScreen({0,0,0});

resulting in this Panel Map:

const PanelMappingEntry panelMapP5_2727_64x32[] = {
    {0,64,64},
    {8,0,64},
    {0,0,0}
};

This is how it works: LED_Debug_1-3 - YouTube
using the MODE_MAP_TESTING:

#if (SKETCH_MODE == MODE_MAP_TESTING)
const uint8_t kMatrixWidth = 64;      
const uint8_t kMatrixHeight = 32;     
const uint8_t kPanelType = SMARTMATRIX_HUB75_32ROW_64COL_MOD8SCAN_P5_2727;
#endif

You withdrew/edited your post, but I think you can just change uint8_t to uint16_t for matrixWidth, worth a try anyway. I think I changed the SmartMatrix Library internals to handle uint16_t but didn’t update the examples.

Why did you move where backgroundLayer.fillScreen({0,0,0}); is in the sketch? It’s not as useful for me to see more than one pixel lit at a time to troubleshoot this issue

The reason I deleted my posts was because it just hit me: "I can change from uint8_t to uint16_t.
I thought the data types were hardcoded into the library.

Using const uint16_t kMatrixWidth = 256; does seem to work.
I will film it.
And I think I will make a Panel Map for this and make it act like one big 128x32 panel.

I will film it again using you default code.

That might work around whatever bug is there, but if the library and panel map is working properly it shouldn’t be necessary.

After looking at it again I think it’s fine, filming the two panels together would be more helpful in debugging this

Settings 3:

I couldn’t find a longer ribbon, so I had to reverse the arrange the displays in reverse order.
The display with the ESP connection is on the right side.
The second display is on the left side.

#if (SKETCH_MODE == MODE_MAP_REVERSE_ENGINEERING)
const uint16_t kMatrixWidth = 256;
const uint8_t kMatrixHeight = 16;
const uint8_t kPanelType = SMARTMATRIX_HUB75_16ROW_MOD8SCAN;
#endif

Look at it go: LED_Debug_3-1 - YouTube
Please use speed x0.25 if it goes too fast. I wanted to make the videos as short as possible.

In the correct order it should look like this:
20190516-163816.jpg

Using MODE_MAP_TESTING and the custom mapping that works for one display:

#if (SKETCH_MODE == MODE_MAP_TESTING)
const uint16_t kMatrixWidth = 128;      
const uint8_t kMatrixHeight = 32;     
const uint8_t kPanelType = SMARTMATRIX_HUB75_32ROW_64COL_MOD8SCAN_P5_2727;
#endif

Video: LED_Debug_3-2 - YouTube

Should I make a custom mapping for a 128x32 panel ?
Would this mean that I would also have to do a custom mapping for each size I want ? Like (Width,Height) 128x64, 64x64, 64x96, 64x128 ?

There’s no need to double kMatrixHeight. It should match the MOD# that you’re using, so keep it at 8. I’m not sure the effect of doubling it.

The MODE_MAP_REVERSE_ENGINEERING video looks normal to me. Can you change the kMatrixHeight back to 8, and see if you get similar results?

Like I said before: That might work around whatever bug is there, but if the library and panel map is working properly it shouldn’t be necessary.

One thought, it could be there’s a bug when driving 256 pixel wide panels. I haven’t tried this recently myself, I’ve been working with narrower panel layouts

Can you show me the lines you changed in SmartMatrixMultiplexedCommon.h to add your panel type?

I haven’t doubled the height. It always was 16 when I used MODE_MAP_REVERSE_ENGINEERING

Even when I made the first Panel Map:
1/8 scan => kMatrixHeight = 16
kMatrixWidth = (64x32)/16 = 128

#if (SKETCH_MODE == MODE_MAP_REVERSE_ENGINEERING)
const uint8_t kMatrixWidth = 128;
const uint8_t kMatrixHeight = 16;
const uint8_t kPanelType = SMARTMATRIX_HUB75_16ROW_MOD8SCAN;
#endif

It won’t work with kMatrixHeight = 8. The displays is black.

But, sadly, it isn’t working so smoothly.

I am not trying to drive a 256 wide panel. It’s 256 only on MODE_MAP_REVERSE_ENGINEERING. It’s real width is 128.

And, as you can see in my original post, 64x64 has a similar broken output to the 128x32. I don’t think the overall width of the panels is the problem.
I suspect that when going from one panel to two or more something breaks.

I can’t right now. We aren’t on the same time zone. I will do that tomorrow.
Thank you for your help and patience.

Sorry, you’re right, I forgot that you need to double the MOD number to set the height

True, but SmartMatrix Library does have to send 256 pixels out to the panel per latch

Yes. But I need kMatrixWidth = 256 when using MODE_MAP_REVERSE_ENGINEERING for a 128x32 display, right ? Also, MODE_MAP_REVERSE_ENGINEERING works with kMatrixWidth = 256 as you can see in the above video.

MatrixHardware_ESP32_V0.h

#elif (GPIOPINOUT == ESP32_FORUM_PINOUT)

    #pragma message "ESP32 forum wiring"

    // ADDX is output directly using GPIO
    #define CLKS_DURING_LATCH   0 
    #define MATRIX_I2S_MODE I2S_PARALLEL_BITS_16
    #define MATRIX_DATA_STORAGE_TYPE uint16_t

    /*
    HUB 75
    01 02 B0
    03 04 Gnd
    05 06 G1
    07 08 E

    09 10 B
    11 12 D
    13 14 STB/Latch
    15 16 Gnd
                        ESP32 pin / comment
    1	R0	2	Red Data (columns 1-16)
    2	G0	15	Green Data (columns 1-16)

    3	B0	4	Blue Data (columns 1-16)
    4	GND	GND	Ground
    
    5	R1	16/RX2	Red Data (columns 17-32)
    6	G1	27	Green Data (columns 17-32)
    
    7	B1	17/TX2	Blue Data (columns 17-32)
    8	E	12	Demux Input E for 64x64 panels
   
    9	A	5	Demux Input A0
    10	B	18	Demux Input A1

    11	C	19	Demux Input A2
    12	D	21	Demux Input E1, E3 (32x32 panels only)
    
    13	CLK	22	LED Drivers' Clock
    14	STB	26	LED Drivers' Latch
    
    15	OE	25	LED Drivers' Output Enable
    16	GND	GND	Ground
    */ 
    #define R1_PIN  25
    #define G1_PIN  5
    #define B1_PIN  26
    #define R2_PIN  27
    #define G2_PIN  23
    #define B2_PIN  14

    #define A_PIN   13
    #define B_PIN   21
    #define C_PIN   18
    #define D_PIN   19
    #define E_PIN   22
    #define LAT_PIN 15
    #define OE_PIN  4

    #define CLK_PIN 2

    #define GPIO_PWM0A_OUT GPIO_NUM_32
    #define GPIO_SYNC0_IN  GPIO_NUM_34

SmartMatrixMultiplexedCommon.h

/*
 * SmartMatrix Library - Common Definitions for Driving Multiplexed Panels
 *
 * Copyright (c) 2015 Louis Beaudoin (Pixelmatix)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

#ifndef SmartMatrixMultiplexedCommon_h
#define SmartMatrixMultiplexedCommon_h

#define DEFAULT_PANEL_WIDTH_FOR_LINEAR_PANELS       32
#define HUB75_RGB_COLOR_CHANNELS_IN_PARALLEL        2

#define SMARTMATRIX_HUB75_32ROW_MOD16SCAN           0
#define SMARTMATRIX_HUB75_16ROW_MOD8SCAN            1
#define SMARTMATRIX_HUB75_64ROW_MOD32SCAN           2
#define SMARTMATRIX_HUB75_4ROW_MOD2SCAN             3
#define SMARTMATRIX_HUB75_8ROW_MOD4SCAN             4
#define SMARTMATRIX_HUB75_16ROW_32COL_MOD2SCAN      5
#define SMARTMATRIX_HUB12_16ROW_32COL_MOD4SCAN      6   // HUB12 panels have limited support, the height needs to be doubled to account for the fact they only use one RGB channel, though SmartMatrix Library will fill the second channel
#define SMARTMATRIX_HUB75_16ROW_32COL_MOD4SCAN      7
#define SMARTMATRIX_HUB75_2ROW_MOD1SCAN             8
#define SMARTMATRIX_HUB75_16ROW_32COL_MOD4SCAN_V2   9
#define SMARTMATRIX_HUB75_32ROW_64COL_MOD8SCAN_L540_2727      10
#define SMARTMATRIX_HUB75_32ROW_64COL_MOD8SCAN_P5_2727        11

#define CONVERT_PANELTYPE_TO_MATRIXPANELHEIGHT(x)   ((x == SMARTMATRIX_HUB75_32ROW_MOD16SCAN ? 32 : 0) | \
                                                    (x == SMARTMATRIX_HUB75_16ROW_MOD8SCAN ? 16 : 0) | \
                                                    (x == SMARTMATRIX_HUB75_16ROW_32COL_MOD2SCAN ? 16 : 0) | \
                                                    (x == SMARTMATRIX_HUB75_4ROW_MOD2SCAN ? 4 : 0) | \
                                                    (x == SMARTMATRIX_HUB75_8ROW_MOD4SCAN ? 8 : 0) | \
                                                    (x == SMARTMATRIX_HUB12_16ROW_32COL_MOD4SCAN ? 16*2 : 0) | \
                                                    (x == SMARTMATRIX_HUB75_16ROW_32COL_MOD4SCAN ? 16 : 0) | \
                                                    (x == SMARTMATRIX_HUB75_16ROW_32COL_MOD4SCAN_V2 ? 16 : 0) | \
                                                    (x == SMARTMATRIX_HUB75_2ROW_MOD1SCAN ? 2 : 0) | \
                                                    (x == SMARTMATRIX_HUB75_64ROW_MOD32SCAN ? 64 : 0) | \
                                                    (x == SMARTMATRIX_HUB75_32ROW_64COL_MOD8SCAN_L540_2727 ? 32 : 0) | \
                                                    (x == SMARTMATRIX_HUB75_32ROW_64COL_MOD8SCAN_P5_2727 ? 32 : 0))

#define CONVERT_PANELTYPE_TO_MATRIXROWPAIROFFSET(x) ((x == SMARTMATRIX_HUB75_32ROW_MOD16SCAN ? 16 : 0) | \
                                                    (x == SMARTMATRIX_HUB75_16ROW_MOD8SCAN ? 8 : 0) | \
                                                    (x == SMARTMATRIX_HUB75_16ROW_32COL_MOD2SCAN ? 8 : 0) | \
                                                    (x == SMARTMATRIX_HUB75_4ROW_MOD2SCAN ? 2 : 0) | \
                                                    (x == SMARTMATRIX_HUB75_8ROW_MOD4SCAN ? 4 : 0) | \
                                                    (x == SMARTMATRIX_HUB12_16ROW_32COL_MOD4SCAN ? 8*2 : 0) | \
                                                    (x == SMARTMATRIX_HUB75_16ROW_32COL_MOD4SCAN ? 8 : 0) | \
                                                    (x == SMARTMATRIX_HUB75_16ROW_32COL_MOD4SCAN_V2 ? 8 : 0) | \
                                                    (x == SMARTMATRIX_HUB75_2ROW_MOD1SCAN ? 1 : 0) | \
                                                    (x == SMARTMATRIX_HUB75_64ROW_MOD32SCAN ? 32 : 0) | \
                                                    (x == SMARTMATRIX_HUB75_32ROW_64COL_MOD8SCAN_L540_2727 ? 16 : 0) | \
                                                    (x == SMARTMATRIX_HUB75_32ROW_64COL_MOD8SCAN_P5_2727 ? 16 : 0))

#define CONVERT_PANELTYPE_TO_MATRIXSCANMOD(x)   ((x == SMARTMATRIX_HUB75_32ROW_MOD16SCAN ? 16 : 0) | \
                                                    (x == SMARTMATRIX_HUB75_16ROW_MOD8SCAN ? 8 : 0) | \
                                                    (x == SMARTMATRIX_HUB75_16ROW_32COL_MOD2SCAN ? 2 : 0) | \
                                                    (x == SMARTMATRIX_HUB75_4ROW_MOD2SCAN ? 2 : 0) | \
                                                    (x == SMARTMATRIX_HUB75_8ROW_MOD4SCAN ? 4 : 0) | \
                                                    (x == SMARTMATRIX_HUB12_16ROW_32COL_MOD4SCAN ? 4 : 0) | \
                                                    (x == SMARTMATRIX_HUB75_16ROW_32COL_MOD4SCAN ? 4 : 0) | \
                                                    (x == SMARTMATRIX_HUB75_16ROW_32COL_MOD4SCAN_V2 ? 4 : 0) | \
                                                    (x == SMARTMATRIX_HUB75_2ROW_MOD1SCAN ? 1 : 0) | \
                                                    (x == SMARTMATRIX_HUB75_64ROW_MOD32SCAN ? 32 : 0) | \
                                                    (x == SMARTMATRIX_HUB75_32ROW_64COL_MOD8SCAN_L540_2727 ? 8 : 0) | \
                                                    (x == SMARTMATRIX_HUB75_32ROW_64COL_MOD8SCAN_P5_2727 ? 8 : 0))

#define CONVERT_PANELTYPE_TO_MATRIXPANELWIDTH(x)  ((x == SMARTMATRIX_HUB75_32ROW_MOD16SCAN ? DEFAULT_PANEL_WIDTH_FOR_LINEAR_PANELS : 0) | \
                                                    (x == SMARTMATRIX_HUB75_16ROW_MOD8SCAN ? DEFAULT_PANEL_WIDTH_FOR_LINEAR_PANELS : 0) | \
                                                    (x == SMARTMATRIX_HUB75_16ROW_32COL_MOD2SCAN ? 32 : 0) | \
                                                    (x == SMARTMATRIX_HUB75_4ROW_MOD2SCAN ? DEFAULT_PANEL_WIDTH_FOR_LINEAR_PANELS : 0) | \
                                                    (x == SMARTMATRIX_HUB75_8ROW_MOD4SCAN ? DEFAULT_PANEL_WIDTH_FOR_LINEAR_PANELS : 0) | \
                                                    (x == SMARTMATRIX_HUB12_16ROW_32COL_MOD4SCAN ? 32 : 0) | \
                                                    (x == SMARTMATRIX_HUB75_16ROW_32COL_MOD4SCAN ? 32 : 0) | \
                                                    (x == SMARTMATRIX_HUB75_16ROW_32COL_MOD4SCAN_V2 ? 32 : 0) | \
                                                    (x == SMARTMATRIX_HUB75_2ROW_MOD1SCAN ? DEFAULT_PANEL_WIDTH_FOR_LINEAR_PANELS : 0) | \
                                                    (x == SMARTMATRIX_HUB75_64ROW_MOD32SCAN ? DEFAULT_PANEL_WIDTH_FOR_LINEAR_PANELS : 0) | \
                                                    (x == SMARTMATRIX_HUB75_32ROW_64COL_MOD8SCAN_L540_2727 ? 32 : 0) | \
                                                    (x == SMARTMATRIX_HUB75_32ROW_64COL_MOD8SCAN_P5_2727 ? 32 : 0))

#define MATRIX_PANEL_HEIGHT (CONVERT_PANELTYPE_TO_MATRIXPANELHEIGHT(panelType))
#define MATRIX_STACK_HEIGHT (matrixHeight / MATRIX_PANEL_HEIGHT)

#define COLOR_CHANNELS_PER_PIXEL        3
#define LATCHES_PER_ROW (refreshDepth/COLOR_CHANNELS_PER_PIXEL)
#define COLOR_DEPTH_BITS (refreshDepth/COLOR_CHANNELS_PER_PIXEL)
#define MATRIX_SCAN_MOD (CONVERT_PANELTYPE_TO_MATRIXSCANMOD(panelType))
#define COLS_PER_PANEL (CONVERT_PANELTYPE_TO_MATRIXPANELWIDTH(panelType))
#define PHYSICAL_ROWS_PER_REFRESH_ROW (MATRIX_PANEL_HEIGHT / MATRIX_SCAN_MOD / HUB75_RGB_COLOR_CHANNELS_IN_PARALLEL)
#define ROW_PAIR_OFFSET (CONVERT_PANELTYPE_TO_MATRIXROWPAIROFFSET(panelType))

#define PIXELS_PER_LATCH    ((matrixWidth * matrixHeight) / MATRIX_PANEL_HEIGHT * PHYSICAL_ROWS_PER_REFRESH_ROW)

#define SMARTMATRIX_OPTIONS_NONE                    0
#define SMARTMATRIX_OPTIONS_C_SHAPE_STACKING        (1 << 0)
#define SMARTMATRIX_OPTIONS_BOTTOM_TO_TOP_STACKING  (1 << 1)
#define SMARTMATRIX_OPTIONS_HUB12_MODE              (1 << 2)

// defines data bit order from bit 0-7, four times to fit in uint32_t
#define PACKED_HUB75_WORD_ORDER p0r1:1, p0g1:1, p0b1:1, p0r2:1, p0g2:1, p0b2:1, p1r1:1, p1g1:1, \
    p1b1:1, p1r2:1, p1g2:1, p1b2:1, p2r1:1, p2g1:1, p2b1:1, p2r2:1, \
    p2g2:1, p2b2:1, p3r1:1, p3g1:1, p3b1:1, p3r2:1, p3g2:1, p3b2:1 
    
#endif

Sorry, I’m not seeing anything wrong with your panel configuration. I don’t have any really wide panels that need a panel map, nor the time to test them right now. I think your idea of making a panel map for the double width that you need is the best way forward right now, at least temporarily until we can figure out what’s wrong and fix it.

Great !
I will do that and I will get back to you with updates !
Thank you for your patience.

I had to make a custom mapping to able to use 2 panels.