J'ai mis à niveau mon ancien ordinateur portable avec deux modules de mémoire DDR3-1333 de 4 Go, mais il s'est avéré que l'ordinateur portable est compatible avec un maximum de DDR3-1066. Que fera un vrai homme? Bien sûr, il mettra à niveau l'EEPROM pour relier la DDR3 à un modèle plus lent!
Lieu de travail. À droite se trouve le Thinkpad pour clignoter, et à gauche se trouve le MacBook Pro problématiqueSoyez très prudent. De toute évidence, vous pouvez corrompre ou bloquer définitivement l'enregistrement sur votre DIMM. Problèmes plus subtils possibles, y compris une défaillance du circuit logique de la batterie, ou la carte mère se transformera en brique .Comment tout a commencé
J'ai un MacBook Pro 13 pouces mi-2010. Son système de fichiers a été endommagé lors d'un redémarrage régulier et l'utilitaire de disque (à partir de la partition de récupération) n'a rien pu y faire. Eh bien, j'attends cela depuis longtemps: il est temps de mettre un SSD et d'ajouter de la RAM.
J'ai acheté un SSD et j'ai eu la chance de trouver quelques ordinateurs portables cassés avec des modules RAM appropriés dans la montagne de déchets électroniques. Nous insérons le SSD et deux modules de 4 Go, lançons Internet Recovery - et dans une heure, nous devrions avoir un système fonctionnel. Mais non. Le téléchargement se fige. À cause de quoi? La plus grande suspicion est causée par ces modules de RAM, après tout, ils proviennent d'ordures. Par conséquent, nous faisons ce que n'importe qui ferait: créer une clé USB avec memtest86 et l'exécuter pendant la nuit. Très bien, la mémoire est bonne. Après plusieurs heures à essayer différentes méthodes d'installation pour différentes versions de macOS, la découverte vient enfin que tout fonctionne très bien si vous remettez simplement l'ancienne mémoire en place.
1 La vraie raison
Réalisant le problème, j'ai rapidement appris que le
MacBook 2009-2010 ne fonctionnait pas avec la mémoire plus rapidement que le PC3-8500 , et que
vous pouviez contourner le problème en modifiant les métadonnées RAM à l'aide d'un programme Windows appelé Thaiphoon Burner .
La véritable cause de l'échec est le processeur graphique intégré GeForce 320M, qui utilise une mémoire partagée, c'est-à-dire une RAM régulière. Il peut fonctionner avec un maximum de PC3-8500 (alias DDR3-1066, c'est-à-dire avec une fréquence d'horloge de 533 MHz DRAM), mais le contrôleur de mémoire système n'en est pas conscient et augmente la vitesse maximale disponible à 667 MHz (c'est-à-dire PC3-10600 alias DDR3 -1333). Les composants restants n'ont aucun problème avec cela, tout comme le GPU en mode VESA (je pense).
Je n'ai entendu parler d'aucun autre équipement qui échoue dans le fonctionnement de la RAM
capable de vitesses plus élevées que l'équipement peut utiliser. Bien sûr, lors de l'achat de modules de mémoire sur le marché, les vendeurs auraient mis en garde contre cette nuance. C'est encore bien mieux qu'une RAM soudée, comme sur les ordinateurs portables Apple depuis 2012.
Réglage du firmware
Après avoir compris la raison, j'ai installé un module PC3-8500 d'origine sur 2 Go et un nouveau module de 4 Go, et cela a fonctionné. Mais le redémarrage de la DDR3 semblait être un bon projet, j'ai donc décidé de l'essayer.
Bien sûr, je ne vais pas installer Windows uniquement pour le firmware EEPROM, et je ne vais pas acheter de logiciels sophistiqués, si tout peut être fait manuellement. Je pensais que la tâche devrait évidemment être effectuée sous Linux, peut-être avec quelques outils supplémentaires. Je ne voulais pas non plus installer Linux sur un macbook juste pour ça. Par conséquent, mon ancien Thinkpad X220 fiable avec
NixOS est devenu une plate-forme idéale pour le travail. Il a fallu un peu de temps pour le mettre à jour, car je n'ai pas chargé la voiture pendant un an environ.
Ensuite, c'était au tour de choisir le module à essayer en premier. Le Thinkpad avait déjà deux 4 Go chacun, et j'ai trouvé quatre modules de 4 Go, donc j'avais beaucoup de choix. J'ai décidé de commencer avec la production Micron la plus étrange. Tout le reste était Samsung. L'un avait un autocollant Lenovo.
Lire SPD
Les modules de mémoire sont livrés avec une puce EEPROM qui contient des métadonnées sur le module
Serial Presence Detect (SPD). Le format lui-même est simple et l'accès à l'EEPROM peut être organisé via le bus
SMBus , qui est essentiellement le même que
I²C .
2 Heureusement, il existe des pilotes de noyau et des logiciels prêts à l'emploi pour interagir avec SMBus et même lire EEPROM DDR3.
Tout d'abord, pour visualiser les périphériques sur le bus,
i2c-tools
et certains modules du noyau sont nécessaires.
$ nix-shell -p i2c-tools
$ modprobe i2c-dev
$ modprobe i2c-i801
$ i2cdetect -l
i2c-0 unknown i915 gmbus ssc N/A
i2c-1 unknown i915 gmbus vga N/A
i2c-2 unknown i915 gmbus panel N/A
i2c-3 unknown i915 gmbus dpc N/A
i2c-4 unknown i915 gmbus dpb N/A
i2c-5 unknown i915 gmbus dpd N/A
i2c-6 unknown DPDDC-B N/A
i2c-7 unknown DPDDC-C N/A
i2c-8 unknown DPDDC-D N/A
i2c-9 unknown SMBus I801 adapter at efa0 N/A
L'adaptateur SMBus est ici intéressant, dans mon cas
i2c-9
.
Le
i2c-tools
est même livré avec un
decode-dimms
pour lire les informations RAM dans un format lisible. Cela nécessite le module du noyau
eeprom
.
$ modprobe eeprom
$ decode-dimms
$ modprobe -r eeprom
Voici la sortie pour un module de mémoire:
Décodeur de détection de présence série mémoire
Par Philip Edelbrock, Christian Zuckschwerdt, Burkart Lingner,
Jean Delvare, Trent Piepho et autres
Décodage EEPROM: / sys / bus / i2c / drivers / eeprom / 9-0050
Deviner dimm est dans la banque 1
--- === SPD EEPROM Information === ---
CRC EEPROM d'octets 0-116 OK (0xAEA4)
Nombre d'octets écrits dans la SDRAM EEPROM 176
Nombre total d'octets en EEPROM 256
Mémoire fondamentale type DDR3 SDRAM
Type de module SO-DIMM
--- === Caractéristiques de la mémoire === ---
Vitesse maximale du module 1333 MHz (PC3-10600)
Taille 4096 MB
Banques x rangées x colonnes x bits 8 x 15 x 10 x 64
Rangs 2
Largeur du périphérique SDRAM 8 bits
Extension de largeur de bus 0 bits
tCL-tRCD-tRP-tRAS 9-9-9-24
Latences CAS prises en charge (tCL) 10T, 9T, 8T, 7T, 6T, 5T
--- === Timings à des vitesses standard === ---
tCL-tRCD-tRP-tRAS comme DDR3-1333 9-9-9-24
tCL-tRCD-tRP-tRAS comme DDR3-1066 7-7-7-20
tCL-tRCD-tRP-tRAS comme DDR3-800 6-6-6-15
--- === Paramètres de synchronisation === ---
Temps de cycle minimum (tCK) 1.500 ns
Temps de latence CAS minimum (tAA) 13,125 ns
Temps minimum de récupération en écriture (tWR) 15.000 ns
Délai minimum RAS # à CAS # (tRCD) 13,125 ns
Délai minimum entre les lignes actives et les lignes actives (tRRD) 6.000 ns
Délai minimum de précharge de ligne (tRP) 13,125 ns
Délai minimum actif à précharge (tRAS) 36.000 ns
Délai minimum d'activation à l'actualisation automatique (tRC) 49,125 ns
Délai de récupération minimum (tRFC) 160 000 ns
Délai CMD d'écriture en lecture minimum (tWTR) 7,500 ns
Temps de lecture minimum pour précharger CMD (tRTP) 7,500 ns
Délai minimum d'activation de la fenêtre (tFAW) de 30 000 ns
--- === Caractéristiques optionnelles === ---
Tensions utilisables 1,5 V
RZQ / 6 pris en charge? Non
RZQ / 7 pris en charge? Oui
Mode DLL-Off pris en charge? Oui
Plage de température de fonctionnement 0-95 degrés C
Taux de rafraîchissement dans une plage de températures étendue 2X
Auto-rafraîchissement automatique? Oui
Lecture du capteur thermique en marche? Non
Actualisation partielle de la matrice partielle? Non
Capteur thermique du module Oui
Type de périphérique SDRAM Monolithique standard
--- === Caractéristiques physiques === ---
Hauteur du module 30 mm
Épaisseur du module 2 mm à l'avant, 2 mm à l'arrière
Largeur du module 67,6 mm
Carte de référence du module F révision 0
Norme de cartographie de rang 1
--- === Données du fabricant === ---
Fabricant du module Micron Technology
Fabricant de DRAM Micron Technology
Code d'emplacement de fabrication 0x0F
Date de fabrication 2011-W23
Numéro de série de l'assemblage 0xFB5C7F1A
Numéro de pièce 16JSF51264HZ-1G4D1
Code de révision 0x4431
Pas mal de données. Une partie des informations affichées est calculée à partir des données. Par exemple, les temporisations à des vitesses standard (c.-à-d., Le nombre de cycles) sont calculées en fonction des paramètres de synchronisation en résolution nanoseconde. Même s'ils sont stockés sous forme de multiples de l'unité de base de temps installée ailleurs sur l'EEPROM, cela ne s'applique pas au sujet de l'article. Ce module RAM fournit 7-7-7-20 à DDR3-1066, ce qui est conforme à la norme JDREC DDR3-1066F. Ne me demandez pas ce qu'est le JEDEC, mais il est plus rapide que le DDR3-1066G le moins cher.
J'ai passé beaucoup de temps à confirmer ma conclusion: lorsque j'essaie de rebin mémoire, le seul nombre important est le temps de cycle minimum (tCK). Ici, c'est 1,5 ns, soit 667 MHz.
Regardons les données source.
$ i2cdump 9 0x50
Aucune taille spécifiée (en utilisant l'accès aux données en octets)
ATTENTION! Ce programme peut confondre votre bus I2C, provoquer des pertes de données et pire encore!
Je vais tester le fichier / dev / i2c-9, l'adresse 0x50, l'octet de mode
Continuez? [O / n]
0 1 2 3 4 5 6 7 8 9 abcdef 0123456789abcdef
00: 92 10 0b 03 03 19 00 09 03 52 01 08 0c 00 7e 00 ??????. ?? R ???. ~.
10: 69 78 69 30 69 11 20 89 00 05 3c 3c 00 f0 82 05 ixi0i? ?.? <<. ???
20: 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00? ...............
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 0f 11 05 00 ............ ???.
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
70: 00 00 00 00 00 80 2c 0f 11 23 fb 5c 7f 1a a4 ae .....?, ?? #? \ ????
80: 31 36 4a 53 46 35 31 32 36 34 48 5a 2d 31 47 34 16JSF51264HZ-1G4
90: 44 31 44 31 80 2c 00 00 00 00 00 00 00 00 00 00 00 D1D1 ?, ..........
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
Les spécifications indiquent que le temps minimum est indiqué à 0x0c. Voyons, c'est sur la première ligne (
00:
, dans la colonne
c
. Soit dit en passant, sa valeur est également 0x0c ou 12. Il s'agit d'un multiple de la base de temps moyenne (MTB), qui est le quotient de la division de la valeur en 0x0a par la valeur en 0x0b (en nanosecondes). Ici 1⁄8 ns. Donc, 12 VTT correspondent à 1,5 ns.
Planification du changement
Pour passer à la DDR3-1066, nous avons besoin de 533 MHz, soit 1,875 ns ou 15 MTB, ou 0x0f. Autrement dit, nous voulons écrire 0x0f à 0x0c.
Mais attendez, il y a évidemment une correction de bogue. Le CRC des 116 premiers octets est stocké dans 0x7e-7f. J'ai regardé là-bas et j'ai vu
a4 ae
, puis je suis allé chercher une calculatrice pour le calcul. Il m'a fallu un temps incroyablement long pour trouver une calculatrice CRC fonctionnelle. J'ai essayé plusieurs outils de ligne de commande, mais j'ai tout de même opté pour la calculatrice en ligne
http://crccalc.com/ . Ensuite, j'ai découvert que la variante CRC-16 / XMODEM est utilisée ici, et la somme de contrôle est en fait 0xAEA4. Ordre des octets et tout ça. Il convient de le noter dans l'émission de
decode-dimms
.
Par conséquent, vous devez écrire un nouveau temps de cycle minimum (0x0f) à 0x0c et une nouvelle somme de contrôle dans 0x7e en tant que mot.
Enregistrement SPD
Maintenant, je savais quoi écrire et j'ai finalement osé essayer. Avec des mains tremblantes, j'ai tapé
y
, appuyez sur Entrée pour confirmation finale et ...
$ i2cset 9 0x50 0x0c 0x0f
ATTENTION! Ce programme peut confondre votre bus I2C, provoquer des pertes de données et pire encore!
DANGEREUX! Écriture sur une EEPROM série sur une barrette mémoire
peut rendre votre mémoire INUTILE et rendre votre système UNBOOTABLE!
J'écrirai dans le fichier de périphérique / dev / i2c-9, l'adresse de la puce 0x50, l'adresse des données
0x0c, données 0x0f, octet de mode.
Continuez? [y / N] y
Erreur: échec d'écriture
L'erreur. Attends quoi?
En tant que pédant, j'ai commencé à étudier les sources d'i2cset, ainsi que les modules du noyau correspondants. À un moment donné, j'ai réalisé que cela pouvait être dû à la protection en écriture.
J'ai sorti un module de mémoire, l'ai regardé et j'ai reconnu la puce EEPROM. Il dit
97B
,
321
et d'autres choses. Googler, j'ai découvert qu'il s'agit d'une puce
SE97B . J'ai regardé le tableau de données et lu attentivement la section de protection en écriture à plusieurs reprises. À l'aide de programmes, j'ai tenté à plusieurs reprises de supprimer la protection temporaire en écriture, mais j'ai échoué. La protection en écriture était probablement constante, j'ai donc simplement décidé de rechercher un module qui n'a pas de protection en écriture.
Soit dit en passant, la protection en écriture en temps réel est activée en écrivant quelque chose à une adresse spécifique. Je ne pense pas
i2cdetect
fasse normalement, mais l'exécution d'
i2cget 9 0x30 <any-address>
établira probablement une protection en temps réel contre l'écriture, ce qui est vraiment constant. Je n'ai pas essayé de faire ça.
J'ai pris le module suivant et il n'y avait aucun message d'erreur là-bas. L'EEPROM n'a tout simplement pas changé.
Enfin du succès!
Avec le troisième module, l'opération s'est finalement avérée. J'ai calculé le CRC et l'ai écrit avec le temps de cycle. Après le chargement du module du noyau
decode-dimms
et le démarrage
decode-dimms
module ressemblait à un PC3-8500 4 Go standard. Lorsque je l'ai installé sur mon MacBook Pro, j'ai finalement démarré un système avec 8 Go de mémoire.
DDR3 SODIMM après le redémarrage est prêt à fonctionner dans MacBook ProAvant: DDR3-1333 d'origine
0 1 2 3 4 5 6 7 8 9 abcdef 0123456789abcdef
00: 92 10 0b 03 03 19 00 09 03 52 01 08 0c 00 3e 00 ??????. ?? R ???.>.
10: 69 78 69 30 69 11 20 89 00 05 3c 3c 00 f0 83 01 ixi0i? ?.? <<. ???
20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 0f 11 45 00 ............ ?? E.
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
70: 00 00 00 00 00 80 ce 02 11 30 b1 5b 13 a1 0e 59 ..... ???? 0? [??? Y
80: 4d 34 37 31 42 35 32 37 33 43 48 30 2d 43 48 39 M471B5273CH0-CH9
90: 20 20 00 00 80 ce 00 00 00 53 31 42 4e 30 30 30 .. ?? ... S1BN000
a0: 01 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 03?.? ............?
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 32 59 00 ............. 2 ans.
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
Après: ressemble à DDR3-1066
0 1 2 3 4 5 6 7 8 9 abcdef 0123456789abcdef
00: 92 10 0b 03 03 19 00 09 03 52 01 08 0f 00 3e 00 ??????. ?? R ???.>.
10: 69 78 69 30 69 11 20 89 00 05 3c 3c 00 f0 83 01 ixi0i? ?.? <<. ???
20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 0f 11 45 00 ............ ?? E.
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
70: 00 00 00 00 00 80 ce 02 11 30 b1 5b 13 a1 06 54 ..... ???? 0? [??? T
80: 4d 34 37 31 42 35 32 37 33 43 48 30 2d 43 48 39 M471B5273CH0-CH9
90: 20 20 00 00 80 ce 00 00 00 53 31 42 4e 30 30 30 .. ?? ... S1BN000
a0: 01 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 03?.? ............?
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 32 59 00 ............. 2 ans.
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
Si vous ne voyez pas immédiatement la différence, vous n'avez pas plongé dans ces décharges depuis aussi longtemps que moi.
Vos pensées
Cela vaut-il la peine de le faire? Financièrement, bien sûr que non!
Mais c'était amusant et j'ai beaucoup appris. Je n'ai aucune idée
où exactement ces connaissances peuvent être appliquées, mais je pense qu'à un moment donné, elles seront nécessaires. Et juste le sentiment que vous pouvez résoudre le problème correctement est vraiment agréable et donne confiance.
1. Mon hypothèse que la RAM fonctionnera sur cet équipement s'il réussit memtest86 était évidemment fausse. Néanmoins, même en regardant en arrière, l'hypothèse ne semble pas idiote. Par expérience, une étrange combinaison de matériel n'est pas rare, en raison de laquelle le test standard tombe.
↑2. J'ai récemment appris à utiliser I²C dans un autre projet. Je pense que je peux lire et écrire de l'EEPROM sur le microcontrôleur Cortex-M en utilisant mon propre programme, mais en pratique, souder le connecteur sera très difficile, et écrire du code est trop de travail pour moi. Néanmoins, je suis vraiment heureux d'être théoriquement capable d'une telle chose!
↑