Digitale camera's en Linux

door Ben Koopmanschap

Inleiding

In dit artikel beschrijf ik hoe ik er in geslaagd ben mijn digitale fotocamera aan te koppelen (te mounten) onder Linux, waarna het mogelijk voor me werd mijn foto's vanaf mijn camera op te slaan op de harde schijf van mijn computer. Als camera heb ik een Minolta DiMAGE S414 aangeschaft (zie foto), welke onder Linux wordt gezien als een 'USB Mass Storage Device'. Het is namelijk zo'n type fotocamera die je met een speciaal kabeltje aan een USB-poort van je computer kan aansluiten. Tegenwoordig zijn er veel camera's van dit type, dit artikel kan je dan ook heel goed als uitgangspunt nemen om je eigen camera voorzien van USB-aansluiting onder Linux aan de praat te krijgen.

minolta camera

Wat heb je er allemaal voor nodig? Nou, het valt op zich wel mee... Allereerst is het belangrijk dat je Linux distributie werkt met een kernel uit de serie 2.4.x, want de kernel 2.2.x ondersteunt nog geen USB Mass Storage Devices. Maar de meeste distributies werken tegenwoordig wel met de 2.4.x kernel, dus ik ga er vanuit dat dit bij jou dus ook wel goed zit. Toch zal je merken, als je verder gaat met lezen, dat het in dit geval heel handig is als je een beetje weet hoe je zelf een kernel kan compileren. Nu valt het buiten het bestek van dit artikel om je precies uit te leggen hoe je een kernel kan configureren en compileren, maar met behulp van Google kan je daar wel degelijk achter komen. Verder heeft Maurice Heuveling op deze site een grappig artikel geschreven over zijn ervaringen met het compileren van de Linux kernel, zie dit artikel.

Zelf heb ik dit camera-avontuur beleefd met de kernel 2.4.22 met Linux From Scratch als distributie. Maar het moge duidelijk zijn dat als je maar een kernel uit de 2.4.x serie gebruikt, de gebruikte distributie helemaal niets uitmaakt!

Goed, aan de slag dan maar! Eerst gaan we een kernel compileren die zowel SCSI als USB ondersteunt. Huh, SCSI? Ja, SCSI! Immers, Linux beschouwt de Compact Flash memory card (het geheugenkaartje in je camera waarop de foto's worden opgeslagen) als die gemount is, als een SCSI-disk.

Als je met 'make menuconfig' je kernel gaat configureren, dien je er voor te zorgen dat de volgende onderdelen geselecteerd zijn (zie lijstje hieronder!), waarbij je er goed op moet letten dat waar 'y' staat, in het menuutje zelf een '*' komt te staan (het betreffende onderdeel wordt dan in de kernel zelf gecompileerd). Er zijn ook echter onderdelen die je als module moet configureren. In het lijstje hieronder staat dan een 'm', terwijl je in het menuutje zelf dan de 'm' op je toetsenbord moet typen, om ervoor te zorgen dat het betreffende onderdeel als module wordt gecompileerd.

Lijstje kernel configuratie:

# General setup
CONFIG_HOTPLUG=y

# SCSI support
CONFIG_SCSI=y
CONFIG_BLK_DEV_SD=y
CONFIG_SD_EXTRA_DEVS=40
CONFIG_CHR_DEV_SG=m
CONFIG_SCSI_CONSTANTS=y
CONFIG_SCSI_LOGGING=y

# File systems
CONFIG_FAT_FS=m
CONFIG_VFAT_FS=m

# USB support
CONFIG_USB=y
CONFIG_USB_DEVICEFS=y

# USB Controllers
CONFIG_USB_UHCI=m
CONFIG_USB_UHCI_ALT=m
CONFIG_USB_OHCI=m

# USB Device Class drivers
CONFIG_USB_STORAGE=m

kernel config

Om te zien welk menu-item overeenkomt met het item uit het lijstje hierboven, raad ik je aan om geduldig en secuur het hele menu te doorlopen en telkens met de TAB-toets naar <Help> te gaan, vervolgens op de Enter-toets te drukken en dan helemaal bovenin de help-omschrijving te kijken of de naam van het item overeenkomt met datgene in het lijstje:

kernel config

Als je al deze dingetjes hebt geconfigureerd, is het belangrijk dat je de configuratie niet vergeet ook daadwerkelijk op te slaan! Als je dat gedaan hebt, kan je vervolgens de kernel gaan configureren.

Maar, wacht even! Voordat je de modules gaat compileren en installeren, moet je nog wel eerst even een zogenaamde 'entry' toevoegen aan het bestand:

/usr/src/linux/drivers/usb/storage/unusual_devs.h

want we willen natuurlijk wel dat onze camera specifiek wordt herkend, he?

Dus: open dit bestand in je favoriete editor en voeg onderaan een sectie (entry) toe waarin jouw camera wordt beschreven. Maar wat moet daarin dan komen te staan, zal je denken? Nou, aangezien elk USB-apparaat twee specifieke USB identifiers heeft, kan je op deze pagina nazoeken welke USB identifiers je moet gebruiken voor jouw camera. Voor mijn camera zijn de identifiers: 0x0686 en 0x4014 geldig, dus leidt dat tot de volgende entry:

UNUSUAL_DEV(  0x0686, 0x4014, 0x0001, 0x0001,
                "Minolta",
                "DiMAGE S414",
                US_SC_SCSI, US_PR_DEVICE, NULL,
                0 ),

Je kan dus voor jouw camera gewoon bovenstaande entry gebruiken (vergeet ook de laatste komma waarmee de entry eindigt, niet!) en voor de USB identifiers die waarden gebruiken die voor jouw camera gelden. Uiteraard moet je de naam en type van jouw camera ook even aanpassen! Pas als je dit hebt gedaan en het bestand hebt opgeslagen, kan je vervolgens ook de kernel modules compileren en installeren.

Goed, het moeilijkste gedeelte hebben we achter de rug! Nu is het alleen zaak dat je je PC (en dus ook Linux) herstart met de nieuwe kernel. Vergeet alsjeblieft niet de oude kernel nog even te bewaren voor het geval sommige dingen niet meer (goed) werken!

Nu is het moment aangebroken om je digitale camera aan te sluiten op een USB-poort van je PC! Ik verwijs je naar de handleiding van je eigen camera waarin je, als het goed is, precies kan lezen hoe je dit moet doen. Vervolgens open je Konsole (ja, ik ga er voor het gemak even van uit dat je werkt met KDE) en zorg je ervoor dat je met het commando 'su' rechten krijgt als root.

Dan laad je de modules waarmee je zowel USB- als SCSI-ondersteuning als het ware 'aan' zet:

modprobe usb-uhci
modprobe usb-storage

N.B.: Om deze modules voortaan automatisch te laten laden bij het starten van Linux, verwijs ik je naar de documentatie van je eigen distro. Je kan er natuurlijk ook voor kiezen de modules (als root!) steeds handmatig te laden op het moment dat je je camera op je PC hebt aangesloten.

Om te kijken of je camera vanaf dat moment door Linux wordt herkend, type je in:

cd /proc/scsi/usb-storage-0

gevolgd door:

cat scsi

Als je camera goed is aangesloten en door Linux als device is herkend, zal je iets zien dat lijkt op:

[root@topjaklont /proc/scsi]# cat scsi
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
  Vendor: MINOLTA  Model: DIMAGE  CAMERA   Rev: 1.00
  Type:   Direct-Access                    ANSI SCSI revision: 02

waar natuurlijk in jouw geval de naam van jouw eigen camera terug te vinden zal zijn. Als je iets dergelijks inderdaad ziet, dan is het je zojuist gelukt je eigen camera in Linux zichtbaar te maken. Gefeliciteerd!

Om uiteindelijk ook je foto's op de camera te kunnen bereiken, moeten we natuurlijk vervolgens de SCSI-device (je flash memory kaart dus!) gaan mounten. Om er achter te komen wat we precies moeten mounten, type je nu in:

fdisk -l /dev/sda

De output van dit commando zal zoiets zijn als:

Disk /dev/sda: 128 MB, 128303104 bytes
8 heads, 32 sectors/track, 978 cylinders
Units = cylinders of 256 * 512 = 131072 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1         979      125296    6  FAT16

Wat is er nu aan de hand? Nou, in het geval je camera de eerste SCSI drive is die Linux 'ziet', is dat namelijk 'sda'. Het fdisk commando is er alleen maar om erachter te komen welke partitie je camera nu eigenlijk voorstelt. In het geval van een flash memory card zal er echter maar 1 partitie zijn en bovenstaande output leert ons dan ook dat dit 'sda1' is. Deze partitie (het geheugen van je camera dus) moeten we straks dus gaan mounten! Verder kan je zien dat ik in mijn camera een flash memory card ter grootte van 128 MB heb. Ook is het interessant om te vermelden dat het bestandssysteem 'fat' is; daarom moesten we bij het configureren van de kernel ook de ondersteuning van dit bestandssysteem aanzetten!

Om nu heel gemakkelijk de camera te kunnen mounten, maken we (als root!) eerst als volgt een zogenaamd mountpoint aan:

mkdir /mnt/camera

Vervolgens voeg je (wederom als root) met je favoriete editor in /etc/fstab de volgende regel toe:

/dev/sda1     /mnt/camera     vfat     rw,noauto,user     0 0

Om ervoor te zorgen dat je ook als gewone (niet root) gebruiker je camera in Linux kan mounten, maken we met de volgende commando's de camera "world writable" (=voor iedereen zichtbaar en schrijfbaar!):

chmod 777 /mnt/camera
chmod 666 /dev/sda1

Nu kan je met het 'exit'-commando in Konsole je root-status verlaten en als gewone gebruiker je camera mounten met:

mount /mnt/camera

Als er geen foutmeldingen verschijnen, is het je dus zeer waarschijnlijk gelukt je camera onder Linux te mounten!

En dan komt nu het leukste... Je kan nu gewoon Konqueror opstarten en browsen naar:

/mnt/camera

Als het allemaal goed gegaan is, zie je nu een directory (met daarin weer een subdirectory) op je flash memory card (tenminste, bij mijn camera is dat het geval). Als je daar nu op dubbelklikt, dan zie je ineens in Konqueror de foto's die op je camera zijn opgeslagen!

konqueror

Vervolgens kan je dan je foto's heel gemakkelijk kopieren of verplaatsen naar een locatie van je keuze op je harde schijf.

Als je klaar bent met het verplaatsen of kopieren van je foto's en je wilt je camera van je PC afkoppelen (dus de USB-stekker uit je PC halen), is het tot slot wel belangrijk dat je even met:

umount /mnt/camera

je camera netjes afkoppelt. Doe je dit niet, dan loop je de kans dat zelfs je hele PC vastloopt! Dit laatste heb ik tot nu toe nog niet meegemaakt (want ik ben liever voorzichtig!), maar ik heb tenminste ergens gelezen dat dit weleens zou kunnen gebeuren. En een gewaarschuwd mens geldt voor twee...

 

© 2002-2008 - Linux-box.nl en bijdragende auteurs