zenitheesc/Drivers

STM32: W25Q128

Closed this issue · 1 comments

STM32: W25Q128

Aquele erro que apareceu ontem na demo da reunião era um bug mesmo.
Eu vi um issue parecido em que o problema era o .lookahead que tava grande demais, ele indica em parte onde procurar novos espaços no disco, corrigi isso mas ainda tinha problema depois de 32 escritas do int, ou seja 128 bytes. Procurei um pouco mais e e vi que poderia ser no calculo de endereços e realmente fez sentido:

Antes de chamar o driver eu calculava o endereço do block do littlefs para as paginas da flash.

	uint32_t pageInBlock = off / W25Q_PAGE_SIZE;
	uint32_t offsetInPage = off % W25Q_PAGE_SIZE;
	uint32_t pageAddress = block * W25Q_SECTOR_SIZE +  (pageInBlock * W25Q_PAGE_SIZE);

Mas note que o pageAddress jjá é calculado em bytes. Mas, dentro do driver eu uso a função byte_address que
recebe um index da pagina.

static uint32_t byte_address(w25q_address_t address) {
	return (address.page * W25Q_PAGE_SIZE) + address.offset;
}

Quando a pagina é 0 (os primeros bytes) o resultado é o certo, mas (eu acho que) quando o littlefs faz o wear leveling, ele tenta escrever em outro endereço, aí o calculo não funciona e ele corrompe o sistema. (ele multiplica pelo PAGE_SIZE (256) duas vezes o que aponta para um endereço fora do disco, por isso que o erro retornado era de disco cheio)

O fix foi passar os indices, não endereços, do setor (block) e pagina para o driver pela struct address_t e na função byte_address calcular corretamente o endereço.