Arm9 hotplug
From NAS-Central Buffalo - The Linkstation Wiki
m (→Example: image downloading) |
(Added LSLive category) |
||
| (2 intermediate revisions not shown) | |||
| Line 1: | Line 1: | ||
| + | {{Articles|LSPro|LSLive}} | ||
Hotplug on ARM9 | Hotplug on ARM9 | ||
This article explains (very short) how the hot plug system on the Linkstation Pro (also Live and Terasation Pro/Live - on the ARM9 series)works and shows a simple way to alter it in order to perform custom actions upon hot plugging. | This article explains (very short) how the hot plug system on the Linkstation Pro (also Live and Terasation Pro/Live - on the ARM9 series)works and shows a simple way to alter it in order to perform custom actions upon hot plugging. | ||
| Line 25: | Line 26: | ||
Copying is done using gphoto2, jhead evaluates the EXIF tag and calls libjpeg to rotate the JPG's. gphoto2 and libjpeg are available via ipkg from the optware feed, you can find a compiled jhead version (2.8) in the download section (http://downloads.nas-central.org/Uploads/LSPro/Binaries/). | Copying is done using gphoto2, jhead evaluates the EXIF tag and calls libjpeg to rotate the JPG's. gphoto2 and libjpeg are available via ipkg from the optware feed, you can find a compiled jhead version (2.8) in the download section (http://downloads.nas-central.org/Uploads/LSPro/Binaries/). | ||
| - | The script for the usb device has to be in /etc/hotplug.d/usb, | + | The script for the usb device has to be in /etc/hotplug.d/usb, its name has to have the form *.hotplug and it has to be executable. It is called from /sbin/hotplug, for my camera the variable $PRODUCT is set to "4a9/313a/2" if this is the case and $ACTION is equal to "add" then it's time for action. |
''Currently the line for deleting the images from the camera (gphoto2 -RD) is commented out - to avoid any trouble in case there's a bug in the script. See the comments!'' | ''Currently the line for deleting the images from the camera (gphoto2 -RD) is commented out - to avoid any trouble in case there's a bug in the script. See the comments!'' | ||
Latest revision as of 07:40, 6 January 2009
Hotplug on ARM9 This article explains (very short) how the hot plug system on the Linkstation Pro (also Live and Terasation Pro/Live - on the ARM9 series)works and shows a simple way to alter it in order to perform custom actions upon hot plugging.
The hotplug system
When plugging in a new usb device /sbin/hotplug is called. Before the call a number of environment variables are set (see http://linux-hotplug.sourceforge.net/?selected=hotplug). For this article the most important are:
$PRODUCT the product ID of the device $ACTION "add"/"remove" depending on if the device is plugged or unplugged $PATH /sbin:/bin:/usr/sbin:/usr/bin
Further a parameter $1 is passed to /sbin/hotplug, that depends on the device. Depending on this parameter scripts in /etc/hotplug.d/$1/*.hotplug are called. On the linkstation pro only one script for handling external usb disks exists /etc/hotplug.d/scsi_device/usb-buffalo.hotplug.
Customizing
The idea was brought to me by an article in the German IT magazine c't (16/2007). The idea in short: If you plug in a device you usually want to perform a certain action. For a camera you want to copy the images from the camera to the hard disc, if it's a mp3 player you might to put new music on it...
The mentioned article used udev and hal (hardware abstraction layer). Due to the different mechanism implemented on the arm9 stock firmware it can not be transfered directly. So we adapt the idea using the hotplug.d concept.
All we have to do is to add a user script e.g /etc/hotplug.d/usb/mydevice.hotplug and make it executable.
This is explained in the following for a Canon powershot. We download the images, rotate them according to the exif flags and store them into a date dependent folder.
Example: image downloading
When connecting the camera to the linkstation I want all images (JPG, AVI) to be copied to the hard disk into year/month folders and the photos should be rotated according to the info in the EXIF tag. During operation feedback is given by the info LED, in case of an error the diag LED starts to flash.
Copying is done using gphoto2, jhead evaluates the EXIF tag and calls libjpeg to rotate the JPG's. gphoto2 and libjpeg are available via ipkg from the optware feed, you can find a compiled jhead version (2.8) in the download section (http://downloads.nas-central.org/Uploads/LSPro/Binaries/).
The script for the usb device has to be in /etc/hotplug.d/usb, its name has to have the form *.hotplug and it has to be executable. It is called from /sbin/hotplug, for my camera the variable $PRODUCT is set to "4a9/313a/2" if this is the case and $ACTION is equal to "add" then it's time for action.
Currently the line for deleting the images from the camera (gphoto2 -RD) is commented out - to avoid any trouble in case there's a bug in the script. See the comments!
/etc/hotplug.d/usb/canon.hotplug:
#!/bin/bash
CAMERA="4a9/313a/2"
TMPDIR=/mnt/disk1/tmp/canon
LOGFILE=/var/log/hotplug.log
ERRORLOG=$TMPDIR/error.log
BASEDIR=/mnt/disk1/myphotos/
# user and group that'll own the images
IMGUSR=guest
IMGGRP=hdusers
error()
# write error message into ERRORLOG, let error/diag led blink
{
echo $1 >> $ERRORLOG
# play signal tones
miconapl -a bz_melody 300 a4 g4
# blink error LED
miconapl -a led_set_cpu_mcon diag on
miconapl -a led_set_on_off diag on
miconapl -a led_set_brink diag on
}
get_images()
# copy images from camera and delete them there,
# during operation info LED flashes
{
# turn info LED on and let it blink while copying from camera
miconapl -a led_set_on_off info
miconapl -a led_set_brink info
# copy photos into current dir using gphoto2
gphoto2 -P || error "Error in gphoto2 -RP, code: $?" >> $ERRORLOG
# if everything works, uncomment next line to delete images from the camera
# gphoto2 -RD || error "Error in gphoto2 -RD, code: $?" >> $ERRORLOG
# turn info LED off again and clear blink status
miconapl -a led_set_on_off info off
miconapl -a led_set_brink info off
}
process_photos()
# automatic processing of photo files
{
# autorotate images according to the exif-flags
# also set modification time to exif-date/time
# exit codes of jhead: 0=OK, 1=Modified
/opt/bin/jhead -autorot -ft *.JPG >> $ERRORLOG
# jhead returns "1" in case of successful modification (e.g. rotation)
if [ "$?" -lt "0"]; then
error "Error in jhead operation, code: $?"
fi
}
copy_images()
# move all images into photo folders
{
chown $IMGUSR:$IMGGRP *.JPG *.AVI
chmod a+rw,a-x *.JPG *.AVI
for photo in *.JPG *.AVI; do
if [ ! -f "$photo" ]; then
# continue with next loop if it's not a file
continue
fi
# get the year and month of the photo - separate vars if further processing is desired
date_year=`date -r "$photo" +"%Y"` || echo "error in date_year with $photo, code $?"
date_month=`date -r "$photo" +"%m"`|| echo "error in date_month with $photo, code $?"
# compose target folder for the photo
year_dir="$BASEDIR/$date_year""_Fotos"
photo_dir="$year_dir/$date_year$date_month"
# make sure the target folder exists and has proper permissions set
if [ ! -e $year_dir ]; then
mkdir "$year_dir"
chown $IMGUSR:$IMGGRP "$year_dir"
chmod a+rwx "$year_dir"
fi
if [ ! -e $photo_dir ]; then
mkdir "$photo_dir"
chown $IMGUSR:$IMGGRP "$photo_dir"
chmod a+rwx "$photo_dir"
fi
# cp the file, if everything works change to move (mv)
cp "$photo" "$photo_dir/$photo" || echo "error copying $photo, code $?"
done
}
#
# main program follows
#
# enable the line below to get the product ID written out (debugging or new device))
#
# echo "canon.hotplug: $ACTION $PRODUCT" >> /var/log/hotplug.log
if [ "$PRODUCT" == "$CAMERA" ]; then
echo "`date`: Found the Canon to $ACTION!" >> $LOGFILE
if [ "$ACTION" == "add" ]; then
PATH=$PATH:/opt/bin:/usr/local/bin:/usr/local/sbin
export PATH
echo `date` > $ERRORLOG
# create temporary dir, cd there
if [ ! -e $TMPDIR ]; then
mkdir $TMPDIR || error "error creating tempdir $TMPDIR"
fi
cd $TMPDIR
rm *.JPG *.AVI *.JPEG
# set info led into cpu control mode
miconapl -a led_set_cpu_mcon info on
# get images, while accessing camera info LED blinks
get_images
# during processing switch info LED on
miconapl -a led_set_on_off info
process_photos
copy_images
# processing complete, switch info LED off
miconapl -a led_set_on_off info off
# switch info led back to mcon control
miconapl -a led_set_cpu_mcon info off
# do some housekeeping
# rm -rf $TMPDIR
echo "`date`: Image processing for Canon complete." >> $LOGFILE
fi
fi
exit 0

