Modifier le profil fan nvfancontrol (côté BSP)
Objectif
Éditer la configuration nvfancontrol par carte pour que l'appareil démarre avec la courbe fan / le mode de contrôle / le gouverneur / le profil par défaut souhaité. Côté BSP uniquement — toutes les écritures se font dans le tracker d'overlay, la copie bsp_image en amont est en lecture seule.
Cette skill gère les éditions côté BSP du fichier de configuration nvfancontrol par carte : ajouter des profils, supprimer des profils, éditer les courbes temp → PWM / RPM, changer le profil / mode de contrôle / gouverneur de démarrage par défaut, et lister les profils définis. S'applique sur les plateformes Jetson / Tegra (T234 Orin, T264 Thor).
Format de fichier (canonique, selon l'en-tête du fichier BSP)
POLLING_INTERVAL <seconds>
<FAN <index>>
TMARGIN <ENABLED|DISABLED>
FAN_GOVERNOR <type> {
STEP_SIZE <int>
}
FAN_CONTROL <close_loop|open_loop> {
RPM_TOLERANCE <rpm>
}
FAN_PROFILE <name> {
# TEMP HYST PWM RPM
<T0> <H0> <P0> <R0>
...
}
FAN_PROFILE <name> { ... } # one or more profiles
THERMAL_GROUP <id> {
GROUP_MAX_TEMP <C>
# zone-name <coeffs csv> <max-temp>
<zone> <coeffs> <max-temp>
...
}
FAN_DEFAULT_CONTROL <close_loop|open_loop>
FAN_DEFAULT_PROFILE <name>
FAN_DEFAULT_GOVERNOR <type>
KICKSTART_PWM <0..255>
Règles :
- Les tuples de courbe de profil sont à 4 colonnes :
TEMP HYST PWM RPM. Triez les points par ordre croissant deTEMP; le démon interpole entre eux. PWMest0..255(cycle utile 8 bits) ;RPMest la vitesse cible en boucle fermée. Une ligne0 0à la fin, en haut, bloque le ventilateur au-delà deGROUP_MAX_TEMP.HYSTest l'hystérésis (°C) à ce point — le contrôleur attendHYSTdegrés de refroidissement avant de descendre la courbe.FAN_DEFAULT_PROFILEdoit référencer un blocFAN_PROFILEexistant dans le même<FAN N>. nvfancontrol ne démarre pas si le profil par défaut pointe vers un profil manquant.FAN_DEFAULT_CONTROL=close_loop(vise la RPM cible, nécessite un tachymètre) ouopen_loop(écrit le PWM directement).FAN_DEFAULT_GOVERNOR=cont(interpolation continue) et autres valeurs spécifiques à la famille ; copiez verbatim des fichiers existants par carte lors de l'introduction d'une nouvelle.THERMAL_GROUPmappe les zones thermiques à l'entrée du contrôleur. Les coefficients sont un CSV à 20 éléments — copiez verbatim des entrées existantes ; les valeurs varient selon la famille de puces et la zone.<FAN N>est un bloc par index de ventilateur (typique :<FAN 1>). Les délimiteurs de bloc<...>et{...}sont stricts ; préservez l'indentation correspondant aux lignes voisines.- Les courbes sont caractérisées, non inventées. Ajoutez ou éditez les courbes à partir de données thermiques-acoustiques réelles pour la plateforme ; n'interpolez pas à partir de profils voisins ou ne copiez pas entre familles de puces.
Prérequis
Résolvez le profil actif selon
../../context/target-platform-contract.md.
Refusez et routez dans ces cas :
| Condition | Refuser avec |
|---|---|
Pas de profil actif, ou active: NA |
Route vers /jetson-set-target ou /jetson-init-target. |
Le profil manque le bloc bsp_image: |
Route vers /jetson-init-image. |
<bsp_image.root_path>/Linux_for_Tegra/ manquant |
Route vers /jetson-init-image. |
<source.root_path>/Linux_for_Tegra/ manquant ou pas un repo git |
Route vers /jetson-init-source. |
Résolvez les chemins :
<bsp_image.root_path>depuisbsp_image.root_path:si présent, sinon<workspace>/Image.<source.root_path>depuissource.root_path:si présent, sinon<workspace>/Source.
<bsp_image.root_path> est en lecture seule pour cette skill ; toute écriture se fait sous <source.root_path> (le tracker d'overlay). C'est l'invariant de workflow dans
../../context/bsp-customization-workflow.md#workflow-invariants — l'édition manuelle en amont détruit silencieusement la traçabilité du diff et rend /jetson-promote-image inopérant.
Le fichier par carte
Le fichier conf que cette skill édite a le chemin relatif :
Linux_for_Tegra/rootfs/etc/nvpower/nvfancontrol/nvfancontrol_<active-sku>.conf
Il existe dans deux racines ; la skill les parcourt toutes les deux :
| Rôle | Localisation | La skill écrit ? |
|---|---|---|
| Détection + source vierge | <bsp_image.root_path>/Linux_for_Tegra/rootfs/etc/nvpower/nvfancontrol/ |
non — en lecture seule |
| Cible d'édition d'overlay + commit git | <source.root_path>/Linux_for_Tegra/rootfs/etc/nvpower/nvfancontrol/ |
oui |
Les sections suivantes se réfèrent au fichier par carte pour signifier la copie d'overlay sous <source.root_path>. Les opérations 1–4 lisent, éditent et sauvegardent toutes cette copie d'overlay. La copie <bsp_image.root_path> est lue une fois pendant l'étape de détection « Résoudre <active-sku> » et une fois pendant l'étape d'import vierge de la Recette d'édition d'overlay, puis jamais touchée de nouveau.
Résoudre <active-sku> — quel fichier éditer
Les conventions de nommage varient par famille de produit :
nvfancontrol_<module.id>_<module.sku>.conf— la plupart des pièces Orin (ex.nvfancontrol_p3767_0000.conf,nvfancontrol_p3701_0008.conf).nvfancontrol_<module.id>_<module.sku>_<carrier.id>_<carrier.sku>.conf— variantes Thor où le carrier lève l'ambiguïté (ex.nvfancontrol_p3834_0008_p4071_0000.conf).nvfancontrol_<carrier>_<sku>_<rev>.conf— variantes IGX revision (ex.nvfancontrol_p3740_0002_b01.conf).
Le démon nvfancontrol résout le bon fichier au démarrage basé sur le compatible DT du matériel booted plus les IDs de carte (pas de script helper — c'est fait à l'intérieur du binaire). Pour mapper côté BSP sans une cible en exécution, contre <bsp_image.root_path> :
- Lister
<bsp_image.root_path>/Linux_for_Tegra/rootfs/etc/nvpower/nvfancontrol/. - Filtrer les noms de fichiers qui contiennent
<module.id>_<module.sku>du profil actif. - Si plusieurs candidats restent, affinez avec
<carrier.id>_<carrier.sku>et (quand pertinent) l'étiquette de révision du carrier. - Si toujours ambigu, exécutez la chaîne de dispatch de conf flash par carte pour lire le
compatibledu kernel DTB et choisir le fichier dont le nom s'aligne avec le carrier / carte résolu. - Vérifiez que le fichier choisi existe réellement sous
<bsp_image.root_path>/Linux_for_Tegra/rootfs/etc/nvpower/nvfancontrol/.
Ne composez pas aveuglément un nom de fichier — la convention de nommage varie par famille de produit.
Ensemble de propagation — confs à synchroniser
Le fichier SKU actif est rarement le seul conf qui devrait recevoir une personnalisation. Après l'avoir édité, appliquez la même édition à chaque frère dans l'ensemble de propagation pour que le changement survive quel que soit le module / SKU de baseboard qui démarre :
- Le conf nvfancontrol de la plateforme de référence — le conf en amont duquel le fichier actif a été dérivé (résolvez via
reference_devkitdans le profil actif, ou l'ascendance de forkjetson-derive-carrier). Pour un BSP qui contient seulement la référence (aucun carrier dérivé), c'est le même fichier que l'actif et la règle se réduit à une no-op. - Chaque conf nvfancontrol dérivé de carrier — chaque
nvfancontrol_*.confproduit parjetson-derive-carrierpour un carrier personnalisé sur le même module SKU.
« Appliquer la même édition » ≠ copie de fichier en masse. Portez les lignes FAN_PROFILE / contrôle changées dans chaque frère ; préservez chaque autre ligne. Les confs frères détiennent souvent des deltas spécifiques au carrier (coefficients THERMAL_GROUP différents pour une solution thermique différente, plafonds RPM de tachymètre différents) qui doivent rester intacts — une surcharge en masse dés-accorderait le ventilateur sur ces carriers. La copie en masse est sûre seulement si les deux confs étaient byte-identiques avant l'édition.
Recette d'édition d'overlay (appliquer avant toute opération)
Suivez la Recette d'éditions hors-skill canonique dans le doc de workflow — import vierge + paire de commit de personnalisation, tous deux gardés par la porte de preview. Appliquez une fois par exécution, couvrant chaque fichier par carte que l'exécution touche (le conf actif plus chaque frère dans l'Ensemble de propagation).
Substitutions concrètes pour cette skill :
<rel>/<file>estrootfs/etc/nvpower/nvfancontrol/<conf>.- Message d'import vierge suggéré :
import pristine: <chemins rel séparés par des virgules des confs importés>, corpsSource: <bsp_image.root_path>/Linux_for_Tegra/ (BSP <bsp_image.version>). - En-tête de commit de personnalisation suggéré :
jetson-customize-fan: <summary>, lignes de corps commenvfancontrol_p3767_0000.conf: added FAN_PROFILE static (open-loop, PWM=255 flat), FAN_DEFAULT_CONTROL close_loop -> open_loop, FAN_DEFAULT_PROFILE quiet -> static.
Instructions
Choisissez l'opération qui correspond à l'intention de l'utilisateur et suivez la sous-section correspondante. Toutes les opérations côté écriture (1–4) doivent d'abord appliquer la Recette d'édition d'overlay.
- Opération 1 — Ajouter un nouveau profil fan.
- Opération 2 — Supprimer un profil fan.
- Opération 3 — Éditer un profil fan existant (courbe, hystérésis).
- Opération 4 — Changer le défaut de démarrage (contrôle / profil / gouverneur).
- Opération 5 — Lister les profils fan définis (lecture seule).
Après toute opération côté écriture, exécutez la chaîne Deploy (## Deploy) pour placer le changement sur l'appareil.
Exemples
Ajouter un profil agressif à une cible P3767-0000 (kit dev Orin Nano) et le définir comme défaut de démarrage :
/jetson-customize-fan
> add a profile called "aggressive" with the curve {0:255, 40:150, 80:0}
> set FAN_DEFAULT_PROFILE to aggressive
Assouplir la rampe fan sur le profil existant quiet (augmenter HYST, baisser PWM au milieu) :
/jetson-customize-fan
> edit FAN_PROFILE quiet — raise HYST to 5 from 30 °C up, drop PWM at 60 °C to 80
Lister quels profils le SKU actif définit actuellement et lequel est le défaut de démarrage :
/jetson-customize-fan
> list defined fan profiles
Opération 1 — Ajouter un nouveau profil fan
Appliquez d'abord la Recette d'édition d'overlay.
- Dans le fichier par carte, à l'intérieur du bloc
<FAN N>, ajoutez un nouveauFAN_PROFILE <name> { ... }entre les profils existants. L'ordre de parse du démon n'importe pas, mais le regroupement avec les frères garde le fichier lisible. - Choisissez
<name>en minuscules, sans espace blanc (ex.quiet,cool,aggressive). - Remplissez le tableau de courbe — tuples 4-colonnes
TEMP HYST PWM RPM,TEMPcroissant. Terminez avec au moins une ligne au-dessus deGROUP_MAX_TEMPpour que le comportement à température excessive soit défini.
Squelette exemple :
FAN_PROFILE aggressive {
#TEMP HYST PWM RPM
0 0 255 6000
20 2 255 6000
40 2 150 3500
60 2 50 1500
80 0 0 0
105 0 0 0
}
Validez (voir Règles) :
- Chaque
TEMPse trouve dans0..GROUP_MAX_TEMPduTHERMAL_GROUP. PWM∈[0, 255];RPM≤ le max rapporté par tachymètre de la plateforme (varie par pièce fan).- Les tuples sont triés en croissant par
TEMP.
Si vous avez l'intention que le nouveau profil soit le défaut de démarrage, suivez l'opération 4.
Opération 2 — Supprimer un profil fan
Appliquez d'abord la Recette d'édition d'overlay.
- Dans le fichier par carte, supprimez le bloc entier
FAN_PROFILE <name> { ... }y compris toutes les lignes de courbe et la fermeture}. - Si le
<name>supprimé correspond auFAN_DEFAULT_PROFILEen fin, pointezFAN_DEFAULT_PROFILEvers un profil restant — sinon le démon ne démarre pas. - Cherchez les références en dur dans le rootfs avant de déclarer le changement sûr :
grep -rn "nvfancontrol.*profile\|FAN_PROFILE" \ Linux_for_Tegra/rootfs/etc 2>/dev/null
Les profils restants ne nécessitent pas de renommage.
Opération 3 — Éditer un profil fan existant
Appliquez d'abord la Recette d'édition d'overlay.
- Dans le fichier par carte, modifiez les lignes de courbe du
FAN_PROFILE <name>cible. Conservez la forme 4-colonnesTEMP HYST PWM RPM. - Maintenez l'ordre croissant de
TEMP; insérez ou supprimez des lignes selon les besoins. - Ajustez
HYSTpour affiner l'anti-oscillation : trop bas → le ventilateur s'agite près d'un point de courbe ; trop haut → le ventilateur accuse du retard sur la réalité. - Validez selon les règles de l'opération 1.
Les éditions à KICKSTART_PWM, RPM_TOLERANCE (à l'intérieur de FAN_CONTROL), ou STEP_SIZE (à l'intérieur de FAN_GOVERNOR) se situent en dehors des profils mais règlent le même ventilateur ; même fichier par carte.
Opération 4 — Changer le défaut de démarrage
Appliquez d'abord la Recette d'édition d'overlay.
Éditez les lignes de défaut en fin à l'intérieur du bloc <FAN N> :
FAN_DEFAULT_CONTROL <close_loop|open_loop>
FAN_DEFAULT_PROFILE <name>
FAN_DEFAULT_GOVERNOR <type>
FAN_DEFAULT_PROFILE doit référencer un FAN_PROFILE existant dans le même bloc <FAN N>. FAN_DEFAULT_CONTROL et FAN_DEFAULT_GOVERNOR doivent référencer des valeurs que le binaire supporte — copiez-les depuis les fichiers existants par carte lors d'un changement.
Opération 5 — Lister les profils fan définis
C'est une opération en lecture seule ; aucune configuration du tracker d'overlay n'est nécessaire. Exécutez-la contre la copie que vous souhaitez inspecter (<bsp_image.root_path>/... pour l'état vierge, <source.root_path>/... pour l'état post-édition) :
grep -E '^[[:space:]]*FAN_PROFILE ' <fichier par carte>
grep -E '^[[:space:]]*FAN_DEFAULT_' <fichier par carte>
La première affiche tous les noms de profil du fichier ; la seconde affiche les défauts de démarrage (contrôle / profil / gouverneur).
Limitations
- Scope côté BSP uniquement — cette skill ne touche jamais directement
/etc/nvpower/nvfancontrol/sur une cible en exécution. La tuning en direct nécessite un redémarrage via Deploy, ou le flux side-channelscp + systemctl restartdécrit dans## Deploy. - Les éditions se font uniquement dans la copie d'overlay sous
<source.root_path>; la copie<bsp_image.root_path>est en lecture seule et est réécrite par/jetson-promote-image. L'édition manuelle debsp_imageest silencieusement perdue au prochain/jetson-init-imagere-extract. - Les tuples de courbe doivent refléter des données thermiques-acoustiques caractérisées pour la plateforme — cette skill n'interpole pas et ne copie pas les courbes entre familles de puces.
- La propagation entre carriers frères (même module SKU) est partielle par design : seulement les lignes
FAN_PROFILE/ contrôle changées sont portées, jamais une surcharge de fichier en masse, car les confs frères peuvent détenir desTHERMAL_GROUP/ plafonds RPM spécifiques au carrier. - Les limites des points de courbe sont spécifiques à la famille ; copiez verbatim des confs existants lors de l'introduction de nouveaux coefficients
THERMAL_GROUPou valeursFAN_DEFAULT_GOVERNOR.
Dépannage
| Erreur | Cause | Solution |
|---|---|---|
| nvfancontrol.service ne démarre pas après édition | FAN_DEFAULT_PROFILE référence un profil supprimé ou renommé |
Définissez FAN_DEFAULT_PROFILE sur un FAN_PROFILE <name> existant dans le même <FAN N>. |
| Le ventilateur s'agite près d'un point de courbe | HYST trop bas |
Augmentez HYST sur la ligne affectée (typique 2–5 °C). |
| Le ventilateur accuse du retard sur la réalité | HYST trop haut |
Baissez HYST sur la ligne affectée. |
| Le ventilateur ne démarre jamais à haute température | Courbe manquant une ligne au-dessus de GROUP_MAX_TEMP, ou le 0 0 en fin tronque au-dessus de l'ambiance |
Ajoutez un tuple haute-temp avec PWM/RPM non-nul ; épinglez la ligne sur-temp seulement au-dessus de GROUP_MAX_TEMP. |
| L'erreur de parse du démon référence le nombre de colonnes | La ligne de courbe n'est pas 4-colonnes TEMP HYST PWM RPM |
Restaurez la forme 4-colonnes ; supprimez les espaces traînants et les colonnes orphelines. |
La cible RPM ne s'approche jamais en boucle fermée |
Cible au-dessus du max rapporté par tachymètre, ou FAN_CONTROL défini à open_loop |
Baissez RPM au-dedans du max mécanique du ventilateur, ou changez FAN_DEFAULT_CONTROL à close_loop. |
Le changement a disparu après /jetson-init-image re-extract |
L'édition est tombée dans <bsp_image.root_path> au lieu d'overlay <source.root_path> |
Réappliquez via la Recette d'édition d'overlay pour que le changement soit commité dans le tracker d'overlay. |
| Le carrier frère démarre avec mauvais plafond de tachymètre après propagation | La copie de fichier en masse a écrasé le THERMAL_GROUP / lignes RPM spécifiques au carrier |
Portez seulement les lignes changées selon l'Ensemble de propagation ; restaurez le THERMAL_GROUP original du carrier. |
Deploy
Le commit de personnalisation dans le tracker d'overlay n'atteint pas l'appareil de lui-même. La chaîne Deploy :
/jetson-promote-image— copie chaque fichier suivi dans l'overlay vers<bsp_image.root_path>/Linux_for_Tegra/. Aware du diff (saute byte-identique) ; utilisesudo cp -ppour les destinationsrootfs/*./jetson-flash-image— flash lebsp_imagemis à jour sur l'appareil.- (Alternatif, pas de flash) Copiez
<source.root_path>/Linux_for_Tegra/rootfs/etc/nvpower/nvfancontrol/<conf>directement vers/etc/nvpower/nvfancontrol/<conf>de la cible en exécution, puissudo systemctl restart nvfancontrol.service(ou redémarrage).
Éditer <source.root_path>/... sans committer — ou éditer <bsp_image.root_path>/... directement — ne fait rien pour /jetson-promote-image et est silencieusement perdu au prochain /jetson-init-image re-extract.