Il kernel preso come punto di partenza è l'attuale kernel stabile, il 2.4.19. Non ho fatto prove ma è probabile che la cosa funzioni anche con altre release del kernel. Tutto il lavoro è stato svolto su una Debian unstable, ma la cosa è del tutto indipendente dalla distribuzione.
Una volta scaricati i sorgenti si provveda a scompattarli, nel mio caso questo è stato fatto con:
[piccardi@havnor piccardi]$ tar -xvjf linux-2.4.19.tar.bz2si tenga presente che avendo usato bzip2, occorre avere installato questo programma, si possono scaricare i sorgenti in formato .tar.gz, nel qual caso basterà usare lo switch -xvzf.
Questa istruzione crea la directory linux-2.4.19 nella directory corrente con dentro i sorgenti del kernel. Il file da modificare è unusual_devs.h nella directory drivers/usb/storage, tutto quello che c'è da fare è aggiungere le seguenti righe:
UNUSUAL_DEV( 0x0a17, 0x0004, 0x0000, 0xffff, "PENTAX", "DIGITAL_CAMERA", US_SC_8070, US_PR_CB, NULL, US_FL_MODE_XLATE|US_FL_FIX_INQUIRY ),in coda al file, poi ricompilare il tutto.
Le istruzioni per la ricompilazione del kernel si trovano descritte in numerosi HOWTO e guide, per cui non staremo a ripetere nei dettagli i vari passi dell'operazione, e cercheremo semplicemente di ripercorrere brevemente quello che c'è da fare, prendendo una delle strade fra le molte con cui è possibile farlo, soprattutto per mostrare quali sono le opzioni da attivare perché il supporto USB necessario al funzionamento della macchina funzioni.
Il primo passo per la ricompilazione del kernel è sempre la configurazione delle opzioni, in modo che vengano compilate le parti necessarie al funzionamento della macchina digitale; questo si può fare andando nella directory dei sorgenti, ed eseguendo il comando:
[piccardi@havnor linux-2.4.19]$ make menuconfigche manda in esecusione l'interfaccia testuale (a menù) del sistema di configurazione (una alternativa è usare il comando make xconfig, che usa una interfaccia grafica, ma richiede X e TCL/tk).
La scelta delle opzioni da attivare è in genere la fase più complessa della ricompilazione del kernel, dato il grande numero e la relativa complessità delle medesime. Un passo che permette di semplificare notevolmente le cose è prendere le opzioni relative ad un kernel già funzionante (esse si trovano nel file .config nella directory dei sorgenti).1 Di solito installando il pacchetto dei sorgenti del kernel della vostra distribuzione trovate anche un file di configurazione opportuno, che vi può servire come base per la ricompilazione.
Per sicurezza conviene comunque sempre mantenere una copia personale del file di configurazione direttamente nella directory dei sorgenti, da utilizzare per fare le varie prove questa potrà essere usata per caricare le impostazioni nel programma di configurazione con l'opzione mostrata in fig. 1, che porta ad un menu in cui viene richiesto il nome di un file contentente le configurazioni (ad esempio potrebbe essere config.optio).
Presumendo che le configurazioni relative a tutto il resto del kernel siano corrette, vediamo quali sono i passi per ricompilare tutto quello che occorre per poter utilizzare2 la nostra macchina fotografica digitale. Anzitutto deve essere abilitato il supporto per USB, questo si fa selezionando il relativo menù nella schermata principale, mostrato in fig. 2.
Se il supporto non è abilitato (di norma lo è) si avrà una schermata vuota come quella riportata in fig. 3, premendo la barra si potrà selezionare il supporto USB e compariranno le varie opzioni. Nel nostro caso si è scelto il supporto modulare, ci sono infatti delle interferenze fra il supporto per lo storage USB e i dischi SCSI (quelli veri) che non riescono a funzionare insieme,3 è possibile però, rimuovendo e ricaricando i vari moduli,4 poter usare (anche se non contemporaneamente) entrambe le funzionalità.
Le opzioni da selezionare sono quelle generali (Miscellaneous USB options e USB Host Controller Drivers) e quelle relative al supporto per i dischi USB (USB Mass Storage support) dato che la nostra camera (per la precisione la compact flash interna) verrà vista come un hard disk.
Le opzioni generiche attivate sono quelle mostrate in fig. 4; in caso di problemi può valere la pena di attivare anche l'opzione USB verbose debug messages, mentre per il controller occorre scegliere quello che fa al caso proprio (l'opzione selezionata in figura copre la gran parte dei casi). Usare il supporto modulare permette anche di cambiare al volo il modulo da usare.
Le opzioni specifiche per il supporto dei dischi USB sono mostrate in fig. 5; si sono abilitate tutte le estensioni possibili, anche se è presumibile che molte di esse non siano necessarie. Unva volte verificato il funzionamento si può senz'altro disabilitare l'opzione per aumentare la verbosità dei messaggi di debug.
Il secondo passo è assicurarsi che sia attivato il supporto SCSI. Infatti il supporto per le memorie di massa USB utilizza il protocollo SCSI per operare sui dispositivi, che appaiono come dischi SCSI; per questo occorre ritornare al menù principale e selezionare il menù (SCSI support) del supporto SCSI (vedi fig. 6) per attivare le opzioni relative.5
Infine ci si dovrà assicurare di avere il supporto per il filesystem FAT, che è quello usato dalla macchina fotografica per memorizzare le immagini. É molto probabile che questo sia già presente nel kernel (lo è per la gran parte delle distribuzioni) in ogni caso lo si può verificare dalla schermata principale del programma di configurazione (vedi fig. 1) da cui si deve selezionare il menù dei filesystem (File systems), ed attivare le opzioni relative mostrate in fig. 7.
Una volta eseguiti questi settaggi si potrà uscire (con l'opzione < Exit >) dai vari menu fino a tornare nella schermata iniziale di fig. 1, dalla quale è buona pratica salvare su un altro file (con l'opzione Save Configuration to an Alternate File) la configurazione scelta. Uscendo dalla schermata principale ci verrà chiesto di salvare la nuova configurazione (rispondere affermativamente) il andrà a sovrascrivere il file .config presente nella directory dei sorgenti.
Come controllo, e per tutti gli appassionati della configurazione manuale, si verifichi che .config contenga le seguenti opzioni:
# SCSI support CONFIG_SCSI=m CONFIG_BLK_DEV_SD=m CONFIG_SD_EXTRA_DEVS=40 CONFIG_BLK_DEV_SR=m CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_SR_EXTRA_DEVS=2 CONFIG_CHR_DEV_SG=m CONFIG_SCSI_MULTI_LUN=y # USB support CONFIG_USB=m CONFIG_USB_DEVICEFS=y CONFIG_USB_UHCI=m CONFIG_USB_STORAGE=m CONFIG_USB_STORAGE_DEBUG=y CONFIG_USB_STORAGE_DATAFAB=y CONFIG_USB_STORAGE_FREECOM=y CONFIG_USB_STORAGE_ISD200=y CONFIG_USB_STORAGE_DPCM=y CONFIG_USB_STORAGE_HP8200e=y CONFIG_USB_STORAGE_SDDR09=y CONFIG_USB_STORAGE_SDDR55=y CONFIG_USB_STORAGE_JUMPSHOT=ysi tenga presente anche queste sono un sovrainsieme di quelle strettamente necessarie.
A questo punto tutto quello che resta da fare è la ricompilazione. Se non si ha già installato una versione del kernel 2.4.19 si può proseguire immediatamente, altrimenti è opportuno modificare la quarta riga del Makefile principale per definire una EXTRAVERSION; il Makefile dovrà iniziare con qualcosa del tipo:
VERSION = 2 PATCHLEVEL = 4 SUBLEVEL = 19 EXTRAVERSION = -optio
A questo punto si può proseguire con la compilazione, i comandi che di norma uso sono i seguenti:
make dep make -j3 bzImage make -j3 modules
Questo produrrà un nuovo kernel (in arch/i386/boot/bzImage), una nuova System.map e i moduli necessari. Per procedere con l'installazione si tratta di copiare questi file in /boot e di eseguire l'installazione dei moduli; il tutto si può fare con i comandi:
make modules_install cp arch/i386/boot/bzImage /boot/vmlinuz-2.4.19-optio cp System.map /boot/System.map-optio
L'ultimo passo è aggiornare LILO o grub per utilizzare il nuovo kernel; data la mia preferenza personale per il secondo mi limito a descrivere la procedura per quello, che nel caso si limita all'aggiunta delle seguenti righe al file /boot/grub/menu.lst:
title Debian GNU/Linux, kernel 2.4.20-optio root (hd0,0) kernel /vmlinuz-2.4.20-pre8-ac2 root=/dev/hda2 ro savedefault bootavendo cura di specificare come root il device su cui effettivamente risiede la vostra partizione di root (per saperla basta copiarla dalle altre voci del file).