Не работало с WCH-LinkE. Добавил одну строчку в wlinke.c: openocd-wch_LinkE_enabled.7z
Было:
case 6:
{
riscvchip = 0x06;
chipiaddr = 0x08000000;
pagesize = 256;
txbuf[3] = 0x03;
len = 4;
pWriteData(0, 1, txbuf, &len);
len = 4;
pReadData(0, 1, rxbuf, &len);
break;
}
Стало:
case 6:
case 0x86:
{
riscvchip = 0x06;
chipiaddr = 0x08000000;
pagesize = 256;
txbuf[3] = 0x03;
len = 4;
pWriteData(0, 1, txbuf, &len);
len = 4;
pReadData(0, 1, rxbuf, &len);
break;
}
Почему-то при всей одинаковости обмена по USB при сравнении с WCH-Link-CH549, вместо 0x06, LinkE передаёт 0x86 - предположу, что единичка в старший бит байта в качестве какого-то флажка залетает.
И вообще, эта OpenOCD - глюкодром ещё тот.
С LTO компилятор и линкер очень глубоко копают. Без оптимизаций, всё собирается без предупреждений. Но с -O3 -flto=auto, получаю это:
In function 'cfi_command',
inlined from 'cfi_command_val' at src/flash/nor/cfi.c:1101:2:
src/flash/nor/cfi.c:158:36: error: writing 8 bytes into a region of size 4 [-Werror=stringop-overflow=]
158 | *cmd_buf++ = (i & (bank->chip_width - 1)) ? 0x0 : cmd;
| ^
Пишут в буфер с размером, заданным в байтах, а количество инкрементов соответствует количеству бит. И никого не парит, так как: "Выключи эту глючную LTO! Оно не работает!". Кроме этого факапа (попутаны байты с битами), ещё есть чипы с размером шины в 64 бита, а размер буфера задан 4 байта - для 32-битных таргетов. И это тоже LTO подсвечивает (уже после исправления байт на биты). И LTO это разматывает и ругается.
В этом месте я не разобрался - не очевидно, как оно должно быть, где в байтах, а где в битах? Но факт, что в массив размером в 4 байта делают как минимум 8 записей, а как максимум 64 - если target 64 бита. Пробовал привести в норму, но там во многих местах используется bank->bus_width, и нигде не подписано, оно в байтах или в битах. Хотя в дефайнах размеров в cfi.h указано 4 максимум - то есть байты, 32 бита (при поддержке архитектур с 64 битами). И LTO блюдёт и ругается благим матом.