ch552tool
                                
                                 ch552tool copied to clipboard
                                
                                    ch552tool copied to clipboard
                            
                            
                            
                        Tried with CH568L , unsuccess. But solution found :) will place PR in near weeks.
First of all , nice work ! But, would like to see more output. Like: Erasing ... Flashing ... Verifying ..
I added :
CH55X_IC_REF[0x68] = {
    'device_name': 'CH568',
    'device_flash_size': (128+64)*1024,
    'device_dataflash_size': 32*1024,
    'chip_id': 0x68}
and got response when tried to flash:
Found CH568.
BTVER: V2.40.
Flash done.
Restart and run.
But board do not startup / do not work. When uploading with WCHISPTool 3.0 result in working board. Will continue next week, will try to capture USB traffic for both applications.
Small update:
- dumped original software USB traffic for flashing and data eeprom updating
- disassembled original software DLL responsible for flashing/eeprom update and found correct way for key and check sum calculation.
In short minimal change which is needed is checksum calculation update. It need be calculated from 4 or 8 bytes of UID depend on Chip Sub ID . When ChipSubID is 0x11 (17) then calculate from 4 bytes. In other cases calculate from 8 bytes.
I checked with my CH568 chip based board and it works after code modification.
Cool. I have my local version with debugging support, but it prints way too much stuff, and don't get time to clear it up. Welcome, PR!
I suspect you might need the new key for newer bootloader versions that @pablomarx found in https://github.com/pablomarx/ch552tool/commit/280d7ef980c16d437f38107c284e3a2896232799 and that I've included in my pr #22
i'm kinda curious whether it's bootloader version or "chip sub id" version that determines this, but I'd kinda lean towards bootloader version, rather than chip sub id
@karlp It depend on "chip sub id" (we can call it other name) and it gotten from disassembled (and converted to C) original WCHISP software. Here is key generation function :
int __stdcall sub_1000AD20(_BYTE *a1, int payload_buff_p, _WORD *payload_size_p, _DWORD *a4)
{
  unsigned int v4; // eax
  int v6; // eax
  unsigned int pl_byte_cnt; // esi
  unsigned int chksum_calc_len; // eax
  char chk_sum; // bl
  unsigned int i; // ecx
  unsigned int payload_size; // [esp+4h] [ebp-Ch]
  v4 = time(0);
  srand(v4);
  if ( !chip_id || !chip_subid )
    return 0;
  v6 = rand();
  pl_byte_cnt = 0;
  payload_size = v6 % 31 + 30;
  if ( v6 % 31 != -30 ) // strange check, probably always !
  {
    do
    {
      *(_BYTE *)(payload_buff_p + pl_byte_cnt) = GetTickCount() + rand();
      ++pl_byte_cnt;
    }
    while ( pl_byte_cnt < payload_size );
  }
  // Calculation CheckSum of UID
  chksum_calc_len  = chip_subid != 17 ? 8 : 4;
  chk_sum = 0;
  for ( i = 0; i < chksum_calc_len; ++i )
    chk_sum += a1[12 + i];   // UID
  LOBYTE(dword_100247F8) = chk_sum ^ *(_BYTE *)(payload_buff_p + 4 * (payload_size / 7));
  BYTE1(dword_100247F8) =  chk_sum ^ *(_BYTE *)(payload_buff_p +      payload_size / 5 );
  BYTE2(dword_100247F8) =  chk_sum ^ *(_BYTE *)(payload_buff_p +      payload_size / 7 );
  HIBYTE(dword_100247F8) = chk_sum ^ *(_BYTE *)(payload_buff_p + 6 * (payload_size / 7));
  LOBYTE(dword_100247FC) = chk_sum ^ *(_BYTE *)(payload_buff_p + payload_size / 7 + 2 * (payload_size / 7));
  BYTE1(dword_100247FC) =  chk_sum ^ *(_BYTE *)(payload_buff_p + payload_size / 5 + 2 * (payload_size / 5));
  BYTE2(dword_100247FC) =  chk_sum ^ *(_BYTE *)(payload_buff_p + payload_size / 7 + 4 * (payload_size / 7));
  HIBYTE(dword_100247FC) = chip_id + dword_100247F8;
  *payload_size_p = payload_size;
  *a4    = dword_100247F8;
   a4[1] = dword_100247FC;
  return 1;
}