op_storage: mark as removable
[openpandora.oe.git] / recipes / pandora-system / pandora-scripts / op_storage.sh
index d293cb5..3994003 100755 (executable)
@@ -1,51 +1,47 @@
 #!/bin/bash
-while mainsel=$(zenity --title="SD Card Mass Storage" --width="380" --height="200" --list --column "id" --column "Please select" --hide-column=1 --text="What do you want to do?" "sd1" "Switch SD Card 1 to Mass Storage Mode" "sd2" "Switch SD Card 2 to Mass Storage Mode" ); do
-  case $mainsel in
-  "sd1")
-  remount=$(cat /proc/mounts | grep /dev/mmcblk0p1 | awk '{print "mount " $1 " " $2 " -o " $4}' | sed "s/,codepage=[A-Za-z0-9]*,/,/g")
-  if umount /dev/mmcblk0p1
-  then
-    # switch to mass storage
-    if lsmod | grep g_cdc &>/dev/null
-       then
-       echo Found g_cdc - removing...
-       rmmod g_cdc
-       ethernet=1
-    fi
-    modprobe g_file_storage file=/dev/mmcblk0p1 stall=0
-    zenity --title="SD Card 1 Mass Storage Mode" --info --text="SD Card Slot 1 is currently in Mass Storage Mode.\n\nClick on OK when you're finished with your data transfer\nand want to go back to normal mode."
-    rmmod g_file_storage
-    if [ $ethernet=1 ]; then
-      echo Reloading g_cdc...
-      modprobe g_cdc
-    fi
-    $remount
-  else
-     zenity --title="Error" --error --text="Error.\nEither there is no card in SD Slot 1 or some program\nis currently accessing the card.\n\nPlease make sure to close any programs that currently access te SD Card." --timeout 6
-  fi
-  ;;
-  "sd2")
-  remount=$(cat /proc/mounts | grep /dev/mmcblk0p1 | awk '{print "mount " $1 " " $2 " -o " $4}' | sed "s/,codepage=[A-Za-z0-9]*,/,/g")
-  if umount /dev/mmcblk1p1
-  then
-    # switch to mass storage
-     if lsmod | grep g_cdc &>/dev/null
-       then
-       echo Found g_cdc - removing...
-       rmmod g_cdc
-       ethernet=1
-    fi
-    modprobe g_file_storage file=/dev/mmcblk1p1 stall=0
-    zenity --title="SD Card 2 Mass Storage Mode" --info --text="SD Card Slot 2 is currently in Mass Storage Mode.\n\nClick on OK when you're finished with your data transfer\nand want to go back to normal mode."
-    rmmod g_file_storage
-    if [ $ethernet=1 ]; then
-      echo Reloading g_cdc...
-      modprobe g_cdc
-    fi
-    $remount
-  else
-     zenity --title="Error" --error --text="Error.\nEither there is no card in SD Slot 2 or some program\nis currently accessing the card.\n\nPlease make sure to close any programs that currently access te SD Card." --timeout 6
-  fi
-  ;;
-  esac
-done
\ No newline at end of file
+while selection=$(grep "/dev/mmcblk" /proc/mounts | cut -f 2 -d " " | sed 's/\\040/ /g' | zenity --title="SD Card Mass Storage" --width="380" --height="200" --list --text="Enable mass storage" --column="Select card"); do
+selection2=$(echo "$selection" | sed 's/ /\\\\040/g')
+options=$(grep "${selection2}" /proc/mounts | awk '{print $4}' | sed "s/,codepage=[A-Za-z0-9]*,/,/g" | sed 's/\\040/\\ /g' )
+device=$(grep "${selection2}" /proc/mounts | awk '{print substr($1,1,12)}')
+device2=$(grep "${selection2}" /proc/mounts | awk '{print $1}')
+
+if umount $device2; then
+       delay=0
+
+       # remove other gadget modules
+       modules="$(lsmod | awk '{print $1}' | xargs echo)"
+       blacklist="g_zero g_audio g_ether g_serial g_midi gadgetfs g_file_storage
+               g_mass_storage g_printer g_cdc g_multi g_hid g_dbgp g_nokia g_webcam g_ncm g_acm_ms"
+       restore_list=""
+       for mod in $modules; do
+               if echo $blacklist | grep -q "\<$mod\>"; then
+                       restore_list="$restore_list $mod"
+                       rmmod $mod
+                       delay=1 # enough?
+               fi
+       done
+
+       # driver race condition workaround (some kernels crash without wait)
+       sleep $delay
+
+       # switch to mass storage
+       modprobe g_file_storage file=$device stall=0 removable=1
+
+       zenity --title="Mass Storage Mode" --info --text="SD Card $selection is currently in Mass Storage Mode.\n\nClick on OK when you're finished with your data transfer\nand want to go back to normal mode."
+
+       rmmod g_file_storage
+
+       if [ ! -d "$selection" ]; then
+               mkdir "$selection"
+       fi 
+       mount $device2 "$selection" -o $options
+
+       if [ -n "$restore_list" ]; then
+               sleep $delay
+               modprobe $restore_list
+       fi
+else
+       zenity --title="Error" --error --text="Error.\nThe card could not be unmounted.\n\nPlease make sure to close any programs that currently access the SD Card." --timeout 10
+fi
+
+done