News:

Welcome to the Bridgetek Community!

Please read our Welcome Note

Technical Support enquires
please contact the team
@ Bridgetek Support

Please refer to our website for detailed information on all our products - Bridgetek - Bridging Technology

Main Menu

Recent posts

#1
Discussion - EVE / Re: What is going on?
Last post by vdc - October 15, 2025, 03:08:30 PM
I agree with you.

I want to test out the BT82x, but I can't find a suitable display module. Riverdi released a BT820B display, but it's 15.6 inches and quite expensive. I'm not sure who would buy a 15.6" display for embedded projects—5" or 7" displays are much more common. Hopefully, next year someone will release a 7" BT82x display module that I can experiment with.
#2
Discussion - EVE / What is going on?
Last post by Rudolph - October 06, 2025, 09:02:10 PM
What's up?  :)
It has been three weeks again since the last post while there are 75+ daily visistors listed.

I implemented all of the BT822 patch functions, or at least these that are documented so far.
Actually testing these still is difficult since the new EAB has not been released.

I would like to buy a BT82x based display module, but the options are still very limited.

Today I received a ACD-110DHTT which is a 10.1" industrial touch monitor that I got used for only 23€ from EBay, 1280x800.
And of course I only took it apart, really nice build quality, the case is machined from a block of aluminium, I do not want to know how much these cost before they were phased out back in 2019.
The panel is a G101EVN01.0 from AUO for which I even found a datasheet, LVDS, single channel, 6 bits per color.

The touch is a separate unit and will provide more challenges, it uses an eGalax Touch controller.
On the outside the interface is USB, but it does support I2C as well.


Now, what is everyone else here up to?

Edit: I really have no idea why this site is practically dead, 144 views of this post and no reaction?
Ok, stay positive. :-)


I just spent some time to check the wiring of the ACD-110DHTT and adapt it the VM820C.
As it turned out, the wire harness of the display is using the exact same 6 pin / 2mm header for the backlight than the VM820C, I only had to swap two pins.  ;D
And for LVDS the wire harness connects to the conroller board with a 32 pin / 2mm header which uses the same crimps than the 30 pin / 2mm headers I have for the LVDS TX of the VM820C.
The pinout was slightly different, but taking out the pins from the old header and putting it in the 30pin header was really easy.

Next I put in a 1280x800 profile, checked the data format, which is JEIDA / Format 1 for 18-bit RGB, checked the clock frequency range and configured REG_LVDSTX_PLLCFG accordingly.
And, yeah, it worked on the first try.  :)
Even the backlight control is working, as the panel has the backlight controller integrated and takes a PWM signal to control it.

I do not have touch, did not even try to connect it, so far I have no idea if the eGalax touch controller is compatible to anything the BT820 supports.
#3
Discussion - EVE / Re: BT82x
Last post by Rudolph - September 14, 2025, 04:30:05 PM
I realized it has been a while since I updated this blog, hrmm, thread. :-)

I was discussing the LVDS input over on Github and to make that short, turned out that PCB800099 I bought is garbage, or at least the firmware on it for the RTD2660H is garbage.
The HDMI input is not working.
At least the OSD was working, but only for a few seconds and then it froze.

So I bought an inexpensive AV camera: "Car HD Reversing Camera" - mostly lies in the product description, as expected.
I tore it apart and found an analog camera module with 3.3V supply inside.
I soldered that to the AV2 input of the PCB800099 and since then I have continuous video input without freezes, sort of, the video is rather distorted and the PCB800099 reports "NTSC" for the input.

Whatever, the LVDS input to the BT820 is working fine now.

Fast forward, I am exploring the ability of the BT820 now to patch the firmware with both updated functions and additional functions.

I implemented CMD_LOADPATCH and copied a bunch of patchfiles to the SD card I am using with the VM820C.
ESE 4.1.x will have a new panel to supply these patches, but that is not yet released, so I converted patches from the BRT repositories to .bin.
And I just noticed that the "patchb2tf" that is shown in the screenshot is outdated, the patch_b2tf2.py this is taken from was updated a couple of days ago.
So I just updated my patch and to make a second screenshot more interesting, I also implemented CMD_SEVENSEG - only to find it not working properly which I will report next on Github.



#4
Discussion - EVE / Re: BT82x patches
Last post by Rudolph - September 08, 2025, 04:47:41 PM
Thanks for the update, I will keep an eye out for it then and play in the meantime with the few patches I found before in your repositories.
#5
Discussion - EVE / Re: BT82x patches
Last post by BRT Community - September 05, 2025, 05:37:05 PM
Hi Rudolph,

The new EAB and the associated extensions are currently being completed and should be available by end-September. We'll keep you updated here,

Best Regards, BRT Community

#6
BRT News / Bridgetek | Upgrade the experi...
Last post by BRT Marketing - September 05, 2025, 01:38:17 AM
#7
Discussion - EVE / Re: BT817 with FreeRTOS, REG_P...
Last post by BRT Community - September 03, 2025, 03:37:36 PM
Hello kumaichi,

Thank you for your post.

It is certainly a curious issue in relation to the FreeRTOS implementation.

I would be interested to know whether moving the REG_PWM_DUTY call to either of the indicated places below  results in different behaviour:

    TFT_qspi_cmd_setrotate(0);

    TFT_qspi_write16(REG_GPIOX_DIR, 0xFFFF);
    TFT_qspi_write16(REG_GPIOX, 0xFFFF);

        <---------------------- TO HERE

    /* after this display is visible on the LCD */
    TFT_qspi_write8(REG_PCLK, DispPCLK);

    //while (TFT_busy() != E_OK){};
    TFT_qspi_WaitCmdfifo_empty();

    /* If the status of the flash is 0 (INIT) Attach it */
    while (EVE_FLASH_STATUS_DETACHED == TFT_qspi_read8(REG_FLASH_STATUS))
    {
        TFT_qspi_dl_cmd(CMD_FLASHATTACH);
    }

    /* Initialize the onboard flash and put in FAST mode
    * Need to check the return value and not proceed if
    * there is an error so we can read in the Fonts
    */
    if (TFT_init_flash() == E_OK)
    {
        /* Read the image from the flash */
        uint32_t flashCommands[] =
        {
                CMD_FLASHREAD, (uint32_t) MEM_FONT34, (uint32_t) 198592, (uint32_t) 280 + 40,
                CMD_FLASHREAD, (uint32_t) CAR_IMAGE_HORIZONTAL, (uint32_t) 198912, (uint32_t) 92000 + 32
        };

        TFT_qspi_cmd_burst(flashCommands,    sizeof(flashCommands) / sizeof(flashCommands[0]));

        while (TFT_busy() != E_OK)
        {
        };

        TFT_qspi_WaitCmdfifo_empty();
    }

        <---------------------- OR HERE

    TFT_qspi_dl_cmd(CMD_DLSTART);
    TFT_qspi_dl_cmd(DL_CLEAR_COLOR_RGB | WHITE);
    TFT_qspi_dl_cmd(DL_CLEAR | CLR_COL | CLR_STN | CLR_TAG);
    TFT_qspi_dl_cmd(DL_BEGIN);

    TFT_qspi_dl_cmd(COLOR_RGB(120, 6, 6));

    TFT_qspi_cmd_setfont2(13, MEM_FONT34, 0); /* assign bitmap handle to a custom font */
    TFT_qspi_cmd_text((DispWidth / 2), (DispHeight / 5) - 15, 13, EVE_OPT_CENTERX, "Please wait...");

    TFT_qspi_dl_cmd(COLOR_RGB(20, 20, 130));

    TFT_qspi_cmd_spinner(DispWidth / 2, DispHeight / 2, 0, 0);

    //TFT_qspi_write8(REG_PWM_DUTY, 25);
 

i.e. is it specifically this call causing the issue, or is just where the call is being executed in the sequence of SPI writes that is the problem.

Can i ask if you are observing the write taking place on the SPI bus when the issue occurs?


Best Regards,
BRT Community
#8
Discussion - EVE / BT817 with FreeRTOS, REG_PWM_D...
Last post by kumaichi - September 03, 2025, 04:46:38 AM
Hello,

I've just ran into the strangest issue and I'm not exactly sure where to even start.  I have two projects, they both use QSPI to write to the BT817, not sure that matters but want to give as much information as possible.  One project uses FreeRTOS and the other one doesn't.  When the FreeRTOS version runs through the initialization,  I try to set the REG_PWM_DUTY to 25 and it crashes everything, the QSPI command returns successfully but then it crashes the debugger.  I've never ran into anything like this.  Has anyone experienced this before?  It's only on the setting of, REG_PWM_DUTY which calls TFT_qspi_write8(...), other commands call the same method with no issues.  Below is my initialization code as well as my write 8 method.

The non-freeRTOS project runs fine all day long using the exact same code.  Only difference is it uses a timer to update the display running off the main thread.

Any insight would be greatly appreciated.

Kindest regards.

Initialization:
void TFT_qspi_init()
{
tft_active = 0;

HAL_GPIO_WritePin(MCU_DISP_RST_GPIO_Port, MCU_DISP_RST_Pin, GPIO_PIN_RESET);
HAL_Delay(40); /* minimum time for power-down is 5ms */
HAL_GPIO_WritePin(MCU_DISP_RST_GPIO_Port, MCU_DISP_RST_Pin, GPIO_PIN_SET);
HAL_Delay(40); /* minimum time to allow from rising PD_N to first access is 20ms */

//Explicitly put SPI in single mode
TFT_write8(REG_SPI_WIDTH, 0x00);
//External Crystal
TFT_sendCmd(CMD_CLKEXT, 0x00);
HAL_Delay(100);
/* set clock to 72 MHz */
TFT_sendCmd(CMD_CLKSEL, 0x46);
//Reset the device
TFT_sendCmd(EVE_RST_PULSE, 0x00);
/* give EVE time to power up */
HAL_Delay(40);
/* start EVE */
TFT_sendCmd(CMD_ACTIVE, 0x00);
HAL_Delay(300);
/* tell EVE that we changed the frequency to 72MHz */
TFT_write32(REG_FREQUENCY, 72000000);
/* read the frequency to verify */
if (TFT_read32(REG_FREQUENCY) != 72000000)
Error_Handler();

TFT_write8(REG_TRIM, 25);

/* read the ID */
while (TFT_readId(REG_ID) != 0x7c)
{
};

/* read REG_CPURESET to confirm 0 is returned */
uint8_t engine_status;

/* Read REG_CPURESET to check if engines are ready.
Bit 0 for coprocessor engine,
Bit 1 for touch engine,
Bit 2 for audio engine.
*/
engine_status = TFT_read8(REG_CPURESET);
while (engine_status != 0x00)
{
engine_status = TFT_read8(REG_CPURESET);
HAL_Delay(100);
}

TFT_write16(REG_PWM_HZ, 4000);
TFT_write8(REG_PWM_DUTY, 0);

/* switch to QSPI */
TFT_write8(REG_SPI_WIDTH, 0x02);
while (TFT_qspi_read8(REG_SPI_WIDTH) != 0x02)
{
TFT_write8(REG_SPI_WIDTH, 0x02);
};

/* Check if everything is okay */
if (TFT_qspi_read16(REG_CMD_READ) == 0xFFF)
{
uint8_t Offset = 0;
uint8_t ErrChar;
uint8_t result[128 + 1]; // Buffer to hold the full string (including null terminator)
int result_index = 0;
do
{
// Get the error character and display it
ErrChar = TFT_qspi_read8(EVE_RAM_ERR_REPORT + Offset);
// Only append valid characters (non-null)
if (ErrChar != 0 && result_index < 128)
{
result[result_index++] = ErrChar;
}

Offset++;
}
while ((ErrChar != 0) && (Offset < 128)); // when the last stuffed character was null, we are done

// Null-terminate the string
result[result_index] = '\0';

// Now the full string is in 'result', which you can use or print
printf("Captured string: %s\n", result);
sprintf((char*) message, "Captured string: %s\r\n", result);
CDC_Transmit_FS((uint8_t*) message, strlen((char*) message));
}

TFT_qspi_write16(REG_HSIZE, DispWidth); /*   800 */
TFT_qspi_write16(REG_VSIZE, DispHeight); /*   480 */
TFT_qspi_write16(REG_HCYCLE, DispHCycle); /*   816 */
TFT_qspi_write16(REG_HOFFSET, DispHOffset); /*     8 */
TFT_qspi_write16(REG_HSYNC0, DispHSync0); /*     0 */
TFT_qspi_write16(REG_HSYNC1, DispHSync1); /*     4 */
TFT_qspi_write16(REG_VCYCLE, DispVCycle); /*   496 */
TFT_qspi_write16(REG_VOFFSET, DispVOffset); /*     8 */
TFT_qspi_write16(REG_VSYNC0, DispVSync0); /*     0 */
TFT_qspi_write16(REG_VSYNC1, DispVSync1); /*     4 */
TFT_qspi_write8(REG_SWIZZLE, DispSwizzle); /*     0 */
TFT_qspi_write8(REG_PCLK_POL, DispPCLKPol); /*     1 */
TFT_qspi_write16(REG_CSPREAD, DispCSpread); /*     0 */
TFT_qspi_write16(REG_DITHER, DispDither); /*     0 */
TFT_qspi_write16(REG_PCLK_FREQ, DispPLCLKFREQ); /* 0xD14 */
TFT_qspi_write8(REG_PCLK_2X, DispPCLK2x); /*     0 */

/* disable Audio for now */
TFT_qspi_write8(REG_VOL_PB, 0U); /* turn recorded audio volume down, reset-default is 0xff */
TFT_qspi_write8(REG_VOL_SOUND, 0U); /* turn synthesizer volume down, reset-default is 0xff */
TFT_qspi_write16(REG_SOUND, EVE_MUTE); /* set synthesizer to mute */

uint32_t initCommands[] =
{
CMD_DLSTART,
DL_CLEAR_COLOR_RGB | WHITE,
DL_CLEAR | CLR_COL | CLR_STN | CLR_TAG, /* clear the screen - this and the previous prevent artifacts between lists, Attributes are the color, stencil and tag buffers */
DL_DISPLAY,
CMD_SWAP // display, in this case nothing
};

TFT_qspi_cmd_burst(initCommands,
sizeof(initCommands) / sizeof(initCommands[0]));

//while (TFT_busy() != E_OK){};
TFT_qspi_WaitCmdfifo_empty();

if (TFT_qspi_read16(REG_CMD_READ) == 0xFFF)
{
uint8_t Offset = 0;
uint8_t ErrChar;
uint8_t result[128 + 1]; // Buffer to hold the full string (including null terminator)
int result_index = 0;
do
{
// Get the error character and display it
ErrChar = TFT_qspi_read8(EVE_RAM_ERR_REPORT + Offset);
// Only append valid characters (non-null)
if (ErrChar != 0 && result_index < 128)
{
result[result_index++] = ErrChar;
}

Offset++;
}
while ((ErrChar != 0) && (Offset < 128)); // when the last stuffed character was null, we are done

// Null-terminate the string
result[result_index] = '\0';

// Now the full string is in 'result', which you can use or print
printf("Captured string: %s\n", result);
sprintf((char*) message, "Captured string: %s\r\n", result);
CDC_Transmit_FS((uint8_t*) message, strlen((char*) message));
}

TFT_qspi_cmd_setrotate(0);

TFT_qspi_write16(REG_GPIOX_DIR, 0xFFFF);
TFT_qspi_write16(REG_GPIOX, 0xFFFF);

/* after this display is visible on the LCD */
TFT_qspi_write8(REG_PCLK, DispPCLK);

//while (TFT_busy() != E_OK){};
TFT_qspi_WaitCmdfifo_empty();

/* If the status of the flash is 0 (INIT) Attach it */
while (EVE_FLASH_STATUS_DETACHED == TFT_qspi_read8(REG_FLASH_STATUS))
{
TFT_qspi_dl_cmd(CMD_FLASHATTACH);
}

/* Initialize the onboard flash and put in FAST mode
* Need to check the return value and not proceed if
* there is an error so we can read in the Fonts
*/
if (TFT_init_flash() == E_OK)
{
/* Read the image from the flash */
uint32_t flashCommands[] =
{
CMD_FLASHREAD, (uint32_t) MEM_FONT34, (uint32_t) 198592, (uint32_t) 280 + 40,
CMD_FLASHREAD, (uint32_t) CAR_IMAGE_HORIZONTAL, (uint32_t) 198912, (uint32_t) 92000 + 32
};

TFT_qspi_cmd_burst(flashCommands, sizeof(flashCommands) / sizeof(flashCommands[0]));

while (TFT_busy() != E_OK)
{
};

TFT_qspi_WaitCmdfifo_empty();
}

TFT_qspi_dl_cmd(CMD_DLSTART);
TFT_qspi_dl_cmd(DL_CLEAR_COLOR_RGB | WHITE);
TFT_qspi_dl_cmd(DL_CLEAR | CLR_COL | CLR_STN | CLR_TAG);
TFT_qspi_dl_cmd(DL_BEGIN);

TFT_qspi_dl_cmd(COLOR_RGB(120, 6, 6));

TFT_qspi_cmd_setfont2(13, MEM_FONT34, 0); /* assign bitmap handle to a custom font */
TFT_qspi_cmd_text((DispWidth / 2), (DispHeight / 5) - 15, 13, EVE_OPT_CENTERX, "Please wait...");

TFT_qspi_dl_cmd(COLOR_RGB(20, 20, 130));

TFT_qspi_cmd_spinner(DispWidth / 2, DispHeight / 2, 0, 0);

//TFT_qspi_write8(REG_PWM_DUTY, 25);

HAL_Delay(2000);

TFT_qspi_cmd_stop();

TFT_qspi_WaitCmdfifo_empty();

/* set the precision of VERTEX2F coordinates */
#if defined (IPS_70) || (IPS_101)
      /* VERTEX2F range: -2048 to 2047 */
      //TFT_qspi_dl_cmd(VERTEX_FORMAT(3));
      pixel_precision = 8;
#else
/* use default VERTEX_FORMAT(3) with VERTEX2F range: -1024 to 1023 */
pixel_precision = 16;
#endif

tft_active = 1;
}

Write 8 Method:
void TFT_qspi_write8(uint32_t const address, uint32_t const data)
{
QSPI_CommandTypeDef sCommand = {0};

// Set up the command structure
sCommand.InstructionMode   = QSPI_INSTRUCTION_4_LINES;    // Instruction sent over 1 line
sCommand.Instruction       = (uint8_t) (address >> 16U) | 0X80; //Get the first byte, should look like 0x30
sCommand.AddressMode       = QSPI_ADDRESS_4_LINES;        // Address sent over 1 line
sCommand.AddressSize       = QSPI_ADDRESS_16_BITS;        // 16-bit address
sCommand.Address           = address & 0xFFFF;            // Mask off the first byte and keep the last two bytes
sCommand.DataMode          = QSPI_DATA_4_LINES;            // Data mode for receiving ID
sCommand.NbData            = 2;                          // Sending 2 bytes
sCommand.DummyCycles       = 0;                          // No dummy cycles
sCommand.DdrMode           = QSPI_DDR_MODE_DISABLE;      // Disable DDR mode
sCommand.SIOOMode          = QSPI_SIOO_INST_EVERY_CMD;    // Send instruction every command

// Send the command (instruction and address)
if (HAL_QSPI_Command(&hqspi, &sCommand, HAL_QSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
Error_Handler();

// Now write the data
uint8_t localData[2] = {(uint8_t) data & 0xFF,
(uint8_t) (data >> 8) & 0xFF};
if (HAL_QSPI_Transmit(&hqspi, localData, HAL_QSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
Error_Handler();

return;
}

FreeRTOS Task:
void StartDisplayTask(void *argument)
{
  /* USER CODE BEGIN StartDisplayTask */
  /* Infinite loop */
(void)argument;
const TickType_t period = pdMS_TO_TICKS(16); // ~60 Hz
TickType_t last = xTaskGetTickCount();
bool initialized = false;

for (;;)
{
if(!initialized)
{
initialized = true;

TFT_qspi_init();
}

//TFT_touch(); - Called from another task
TFT_display();

vTaskDelayUntil(&last, period);
}
  /* USER CODE END StartDisplayTask */
}
#9
Discussion - EVE / Re: BT82x patches
Last post by BRT Community - September 02, 2025, 09:25:00 PM
Hi Rudolph,

Glad that you like the new extensions. We'll check when the new EAB will be released and will post back here with an update very soon,

Best Regards, BRT Community
#10
Discussion - EVE / BT82x patches
Last post by Rudolph - September 02, 2025, 03:22:51 PM
Hello,

I just found this:
https://brtchip.com/wp-content/uploads/2025/08/BRT_AN_095_BT82X-Firmware-Update-and-Extension-Guide.pdf

Nice, I was expecting something like this.

But the referenced patches are not available yet as an not yet released EVE Asset Builder is supposed to provide these in a new EXTENSION tab.
Please attach a full .bin here in the meantime for testing, the base patches and all extension patches in one binary.
Or, if that needs to be handled separately for some reason, the mentioned base_patch.bin plus a binary with all extension modules.

I would just drop that on the SD card for the BT820.