Je suis à la compilation d'un noyau personnalisé sous Ubuntu et je suis en cours d'exécution dans le problème que mon noyau ne semble pas savoir où chercher pour le firmware. Sous Ubuntu 8.04, le firmware est lié à la version du noyau de la même façon les modules de pilote. Par exemple, le noyau 2.6.24-24-generic stocke ses modules du noyau dans:
/lib/modules/2.6.24-24-generic
et son firmware:
/lib/firmware/2.6.24-24-generic
Quand je compile le 2.6.24-24-generic Ubuntu kernel selon le "Suppléant Construire la Méthode: à L'Ancienne, Façon Debian" je obtenir les modules de répertoire et de tous mes appareils fonctionnent à l'exception de ceux nécessitant le firmware comme ma carte wifi Intel (module ipw2200).
Le noyau historique montre par exemple que, lorsque ipw2200 essaie de charger le firmware, le sous-système du noyau en contrôlant le chargement du firmware est incapable de la localiser:
ipw2200: Detected Intel PRO/Wireless 2200BG Network Connection
ipw2200: ipw2200-bss.fw request_firmware failed: Reason -2
errno-base.h se définit comme:
#define ENOENT 2 /* No such file or directory */
(La fonction de retour ENOENT met un moins devant de lui.)
J'ai essayé de créer un lien symbolique dans /lib/firmware où mon noyau du nom souligné le 2.6.24-24-generic directory, cependant cela a abouti à la même erreur. Ce firmware est non-GPL, fourni par Intel et emballé par Ubuntu. Je ne crois pas qu'elle ait une réelle égalité à une version du noyau. cmp
montre que les versions dans les différents répertoires sont identiques.
Alors, comment fonctionne le noyau de savoir où chercher pour le firmware?
Mise à jour
J'ai trouvé cette solution pour le problème exact, je vais avoir, mais il ne fonctionne plus comme Ubuntu a éliminé /etc/hotplug.d
et ne stocke plus de son firmware en /usr/lib/hotplug/firmware
.
Update2
Un peu plus de recherche sont plus de réponses. Jusqu'à la version de 92 udev
, le programme firmware_helper
a été la façon dont le firmware a obtenu chargé. En commençant par udev
93 ce programme a été remplacé par un script nommé firmware.sh fournir des fonctionnalités identiques à ce que j'en dis. Ces deux coder en dur le firmware chemin de /lib/firmware
. Ubuntu semble toujours être à l'aide de l' /lib/udev/firmware_helper
binaire.
Le nom du fichier du micrologiciel est passé de firmware_helper
dans la variable d'environnement $FIRMWARE
qui est concaténé à la path /lib/firmware
et utilisé pour charger le firmware.
La demande réelle pour charger le firmware est effectué par le pilote (ipw2200 dans mon cas) via l'appel système:
request_firmware(..., "ipw2200-bss.fw", ...);
Maintenant, quelque part entre le pilote appelant request_firmware
et firmware_helper
à la recherche à l' $FIRMWARE
variable d'environnement, le noyau nom du package est l'obtention de préfixer le nom du micrologiciel.
Alors, qui de le faire?