Я смотрел код функции do_erase_oneblock() в cfi_cmdset_0001.c в
исходнике дистрибутивного ядра той же версии, что и ПО донора. Там такая последовательность:
/* Clear the status register first */
map_write(map, CMD(0x50), adr);
/* Now erase */
map_write(map, CMD(0x20), adr); --- соответствует даташиту, команда Sector Erase Setup
map_write(map, CMD(0xD0), adr); --- соответствует даташиту, команда Sector Erase Confirm
-- затем, как я понимаю, оно пытается ждать нужное время
ret = INVAL_CACHE_AND_WAIT(map, chip, adr, adr, len, chip->erase_time);
а затем код проверяет регистр статуса на предмет ошибок,
map_write(map, CMD(0x70), adr);
status = map_read(map, adr);
где и выдает сообщение:
printk(KERN_ERR "%s: block erase error: (bad VPP)\n", map->name);
https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux/+/refs/tags/v2.6.26/drivers/mtd/chips/cfi_cmdset_0001.c#1852
Однако загружаю я готовую бинарную сборку "от производителя платы".
Нет гарантии, что она 100% совпадает с стоковым ядром 2.6, но думаю (надеюсь), что какие-то существенные изменения там маловероятны.
Ваша гипотеза о причинах проблемы какова?