Compilare ed aggiungere un driver staging ad un kernel già in uso.

7 risposte [Ultimo contenuto]
Ritratto di g4r
g4r
(Newbie)
Offline
Newbie
Iscritto: 02/06/2012
Messaggi: 4

Salve a tutti.

Sto cercando, con molta frustrazione, a compilare ed aggiungere un modulo in staging al kernel standard distribuito in questo momento (sono su testing).

Il kernel è "3.2.0-2-amd64 #1 SMP Sat May 12 23:08:28 UTC 2012 x86_64 GNU/Linux".

Vorrei EVITARE di dovermi compilare un kernel custom, perciò vorrei solo far compilare, con i giusti kernel symbols, il modulo che mi serve.

Ora, normalmente il modulo è disabilitato.
Ho provato a prendere il kernel-package, estratto i sorgenti in /usr/src/linux-source-versione , copiata la versione "ufficiale" del kernel config da boot/config-versione in /usr/src/linux-source-versione/.config , abilitato il modulo con "make menuconfig" (il flag staging è già abilitato) quindi provato a compilare il singolo modulo con:

make -C /lib/modules/`uname -r`/build M=/usr/src/linux-source-3.2/drivers/staging/(nome modulo)

Non viene compilato nulla, ho solamente:
make: Entering directory `/usr/src/linux-headers-3.2.0-2-amd64'
Building modules, stage 2.
MODPOST 0 modules
make: Leaving directory `/usr/src/linux-headers-3.2.0-2-amd64'

Ho anche provato a cambiare il .config presente in /usr/src/linux-headers-3.2.0-2-amd64 ma nulla.

Qualcuno sa aiutarmi ?

Grazie.

Ritratto di homeless
homeless
(Guru)
Offline
Guru
Iscritto: 21/10/2011
Messaggi: 1453

Qual'è il nome (finora segretato) del modulo ?

Ritratto di g4r
g4r
(Newbie)
Offline
Newbie
Iscritto: 02/06/2012
Messaggi: 4

E' asus_oled.
Ma credo sia lo stesso per qualunque altro modulo in staging che sia disabilitato nel kernel di default.

Idee su come fare ?

Ritratto di mcortese
mcortese
(Moderatore)
Offline
Moderatore
Iscritto: 27/02/2009
Messaggi: 2918

Non manca il target alla riga make? Tipo

make -C ... M=... modules

Ritratto di g4r
g4r
(Newbie)
Offline
Newbie
Iscritto: 02/06/2012
Messaggi: 4

Ho provato a mettere il target ma non cambia assolutamente niente, anche perché c'è quello di default.

Ad esempio se provi la stessa linea di makefile in drivers/staging/rtl8192u invece funziona. Ma quel modulo è abilitato nel build di default.

Altre idee ?

Ritratto di homeless
homeless
(Guru)
Offline
Guru
Iscritto: 21/10/2011
Messaggi: 1453

Impartisci i seguenti comandi come utente ordinario:

su -c "aptitude update; aptitude install linux-source ncurses-dev build-essential devscripts"
cd ~
tar xf /usr/src/linux-source-3.2.tar.bz2
cd linux-source-3.2
ln -s /usr/src/linux-headers-$(uname -r)/Module.symvers Module.symvers
make oldconfig
# modifica manualmente la configurazione del kernel per attivare il modulo
make menuconfig
make prepare 
make scripts
cd drivers/staging/asus_oled
make -C $HOME/linux-source-3.2/ M=$PWD  
su -c "make -C /lib/modules/$(uname -r)/build M=$PWD  modules_install"
su -c "modprobe asus_oled"
lsmod | grep asus_oled

I comandi sopra indicati sono stati testati su una Debian Wheezy con kernel 3.2.0-2-486 .

Ritratto di g4r
g4r
(Newbie)
Offline
Newbie
Iscritto: 02/06/2012
Messaggi: 4

Ti ringrazio per l'aiuto!

Sono riuscito a compilare il modulo seguendo le tue indicazioni ma ho avuto qualche problema.

Ma prima di tutto vorrei capire dove stavo sbagliando io. Mi spiego: la procedura che avevo tentato differisce dalla tua sostanzialmente nel fatto che tu fai il link per Module.symvers (che io non facevo) ed in più hai
make oldconfig
mentre invece io mi ero limitato a copiare la configurazione del kernel in uso da /boot/ .

La modifica via menuconfig era la stessa così come le altre linee di make.

Come dicevo sopra comunque, il modulo è stato compilato ed installato sotto /lib/modules/3.2.0-2-amd64/extra/ anziché /lib/modules/3.2.0-2-amd64/kernel/drivers/staging/. Provando con modprobe mi veniva risposto FATAL: Module asus_oled not found.

Ho spostato il file sotto drivers/staging , dato un depmod ed ha funzionato tutto.

Grazie ancora per l'aiuto! Smile

Ritratto di homeless
homeless
(Guru)
Offline
Guru
Iscritto: 21/10/2011
Messaggi: 1453

La presenza del link simbolico è necessaria con i comandi impartiti e precedentemente riportati, altrimenti non è possibile compilare il modulo (mancano, appunto, i simboli del kernel già compilato di cui ha bisogno il linker).

E' possibile anche procedere copiando manualmente il file di configurazione del kernel già compilato: compila ugualmente. Ad esempio, volendo, si possono anche impartire i seguenti comandi ottenendo lo stesso risultato:

su -c "aptitude update; aptitude install linux-source ncurses-dev build-essential devscripts"
cd ~
tar xf /usr/src/linux-source-3.2.tar.bz2
cd linux-source-3.2
ln -s /usr/src/linux-headers-$(uname -r)/Module.symvers Module.symvers
# make oldconfig
cp /boot/config-$(uname -r) .
# modifica manualmente la configurazione del kernel per attivare il modulo
make menuconfig
make prepare 
make scripts
cd drivers/staging/asus_oled
make -C $HOME/linux-source-3.2/ M=$PWD  
su -c "make -C /lib/modules/$(uname -r)/build M=$PWD  modules_install"
su -c "depmod -a; modprobe asus_oled"
lsmod | grep asus_oled

Il modulo è installato in extra anche nel mio caso e viene riconosciuto (senza alcuna difficoltà o esigenza di collocarlo altrove) dopo aver impartito come utente root il comando di seguito riportato (o, presumibilmente, dopo aver riavviato il sistema):
depmod -a
 
modinfo asus_oled
filename:       /lib/modules/3.2.0-2-486/extra/asus_oled.ko
license:        GPL
description:    Asus OLED Driver v0.04-dev
author:         Jakub Schmidtke, sjakub@gmail.com
alias:          usb:v0B05p175Bd*dc*dsc*dp*ic*isc*ip*
alias:          usb:v0B05p1726d*dc*dsc*dp*ic*isc*ip*
depends:        usbcore
vermagic:       3.2.18 mod_unload modversions 486 
parm:           start_off:Set to 1 to switch off OLED display after it is attached (uint)