Problema de inicialização do SDRAM (Freescale iMX31)

10

Estou tentando modificar uma sequência init existente (init de baixo nível do SDRAM) para acomodar uma alteração na configuração de hardware: um SDRAM existente no meu iMX31 foi substituído por um tamanho diferente, caso contrário, o mesmo tipo / fabricante / layout / pinos / tempos. de acordo com as especificações.

Breve cenário de configuração e comportamento do erro: Consegui iniciar a placa (a sequência é a seguinte: execute o gerenciador de inicialização da NAND, copie o 'step2 bootloader' para a RAM, execute o 'step2 bootloader' da RAM). Mas parece que algumas configurações estão incorretas, pois a execução da RAM (após o salto para a etapa 2) falha de forma consistente.

Fiz uma grande quantidade de testes detalhados para identificar parâmetros errados, meus resultados são os seguintes: - leitura / escrita de byte / palavra simples quando executada a partir de NAND ou JTAG - gravações em bloco / burst parecem funcionar quando executadas a partir de NAND ( JTAG também) O interessante: - após gravações em blocos, eu preciso de várias leituras em qualquer endereço SDRAM para ler um byte / palavra correto (!) - se eu modificar as configurações da minha coluna para APENAS usar a quantidade mais alta (+1) de colunas para "modo de carregamento", mas não para pré-carregamento / atualização, funciona, mas de maneira inconsistente (na minha teoria, funciona de maneira confiável para o intervalo de endereços mais baixo, onde a coluna ausente não importa).

Para ter uma idéia da minha configuração: as configurações da RAM são quase idênticas às desta pergunta. Isso não é surpreendente, uma vez que eles são fornecidos pela Freescale, além dos tempos da RAM: No Freescale iMX31, como posso converter o endereço SDRAM em endereço da CPU? Minha configuração original é idêntica (também SDRAM de 64 MB como no link), minha nova RAM é de 128 MB. Todas as placas de referência são fornecidas com 64 MB ou 128 MB, portanto, ambos os valores são suportados pelo iMX31 e derivados.

A alteração que tenho que fazer (atenção: suposição!) Está apenas na configuração COLUMN (é mais uma coluna) da RAM. A RAM tem o dobro do tamanho, mas, caso contrário, a especificação exige exatamente os mesmos tempos, etc. Como possui apenas mais uma coluna (veja o link acima, meus registros de pré-carregamento, atualização e carregamento mudam de 0x92100000 para 0x92200000 para a nova RAM - por exemplo ) nada mais foi alterado.

Pergunta 1: Minha suposição faz sentido, que se todos os tempos e características físicas do chip (afetando a força da unidade, tempo e consumo de energia) forem semelhantes, uma alteração na contagem de colunas pode ser "local" (não afeta outras configurações)? Interessante, comparei minhas configurações com muitas outras disponíveis on-line (U-Boot, Red-Boot com 128MB) e além das configurações específicas da placa, como a força da unidade, não vejo diferenças.

Pergunta 2: Meu comportamento de erro acima (escreve trabalho, lê apenas parcial) provavelmente é exclusivo de uma determinada configuração inválida da RAM. Alguém pode me dar um conselho sobre qual configuração olhar mais de perto? Também pode ser possível definir parâmetros 'seguros' para que, mesmo com desempenho reduzido, o sistema permita que eu reduza o culpado.

Peter Branforn
fonte
Você está razoavelmente certo de que o problema não está relacionado ao design do hardware (ICs ruins, erros de layout, falta de integridade do sinal, energia insuficiente ...)?
jbarlow

Respostas:

1

Para 2, comece com as configurações de uma placa de demonstração do iMX31. Em seguida, modifique-os conforme necessário para sua peça (principalmente velocidade e tamanho). Em particular, você provavelmente tem o número errado de estados de espera na leitura.

Brian Carlton
fonte