J'essaie de modifier une séquence d'initialisation existante (init de bas niveau de SDRAM) pour s'adapter à un changement de configuration matérielle: une SDRAM existante sur mon iMX31 a été remplacée par une taille différente, sinon même type / fabricant / disposition / broches / timings. selon spécifications.
Bref scénario de configuration et comportement d'erreur: j'ai réussi à obtenir le démarrage de la carte (la séquence est la suivante: exécuter le chargeur de démarrage à partir de NAND, copier 'bootloader step2' sur RAM, exécuter 'bootloader step2' à partir de RAM). Mais il me semble que certains paramètres sont incorrects, car l'exécution à partir de la RAM (après le passage à l'étape 2) échoue de manière cohérente.
J'ai fait un grand nombre de tests approfondis pour identifier les mauvais paramètres, mes résultats sont les suivants: - les lectures / écritures sur un seul octet / mot fonctionnent lorsqu'elles sont exécutées à partir de NAND ou JTAG - les écritures par blocs / en rafale semblent fonctionner lorsqu'elles sont exécutées à partir de NAND ( JTAG aussi) La chose intéressante: - après des écritures par blocs, j'ai besoin de plusieurs lectures sur n'importe quelle adresse SDRAM pour lire un octet / mot correct (!) - si je modifie mes paramètres de colonne pour utiliser UNIQUEMENT la quantité plus élevée (+1) de colonnes pour le "mode de chargement" mais pas pour la précharge / rafraîchissement, alors cela fonctionne, mais de manière incohérente (dans ma théorie, cela fonctionne de manière fiable pour la plage d'adresses inférieure, où la colonne manquante n'a pas d'importance).
Pour avoir une idée de ma config: les paramètres de la RAM sont presque identiques à ceux de cette question. Cela n'est pas surprenant, car ils sont fournis par Freescale, à côté des timings RAM: Sur Freescale iMX31, comment puis-je traduire l'adresse SDRAM en adresse CPU? Mon réglage d'origine est identique (également 64 Mo de SDRAM comme dans le lien), ma nouvelle RAM est de 128 Mo. Toutes les cartes de référence sont fournies avec 64 Mo ou 128 Mo, donc les deux valeurs sont prises en charge par iMX31 et dérivés.
Le changement que je dois faire (attention: hypothèse!) Ne concerne que la configuration COLONNE (c'est une colonne de plus) de la RAM. La RAM a une taille double, mais sinon la spécification revendique exactement le même timing, etc. Puisqu'il n'a qu'une seule colonne de plus (voir le lien ci-dessus, mes registres de mode de précharge, d'actualisation et de chargement changent de 0x92100000 à 0x92200000 pour la nouvelle RAM - par exemple ) rien d'autre n'est changé.
Question 1: mon hypothèse est-elle logique, si tous les synchronisations et les caractéristiques physiques de la puce (affectant la force du lecteur, la synchronisation et la consommation d'énergie) sont similaires, qu'un changement du nombre de colonnes pourrait être "local" (n'affectant pas les autres paramètres)? Assez intéressant, j'ai comparé mes paramètres avec de nombreux autres disponibles en ligne (U-Boot, Red-Boot avec 128 Mo) et à côté des paramètres spécifiques à la carte, tels que la force du lecteur, je ne vois pas de différences.
Question 2: Mon comportement d'erreur ci-dessus (écrit le travail, ne lit que partiellement) est probablement unique à un certain paramètre non valide de la RAM. Quelqu'un est-il en mesure de me conseiller sur le paramètre à examiner de plus près? De plus, il pourrait être possible de définir des paramètres «sûrs» de sorte que même avec des performances réduites, le système me permettrait de réduire le coupable.
Réponses:
Pour 2, commencez par les paramètres d'une carte de démonstration iMX31. Modifiez-les ensuite selon les besoins de votre pièce (vitesse et taille principalement). En particulier, vous avez probablement le mauvais nombre d'états d'attente en lecture.
la source