hi axelhaslam :

    We have a problem with mount too .That is MMC can't mount auto while it
no partitions.
    when SDcard Inserted ,the state changed and stoped with state "Pending"

    Have you had this problem?

2010/7/16 axel haslam <axelhas...@gmail.com>

> We have a problem with froyo in which the MMC does not get
> automatically mounted upon insertion.
>
> This is what i could understand from the code:
> in DirectVolume.cpp on the function handleDiskAdded, if the number of
> partitions is not 0, the volume state gets set to "State_Pending" ,
> and the VolumeDiskInserted broadcast is sent.This triggers the onEvent
> method on MountService, which starts a new thread that sends the
> command "volume mount"
>
> the "volume mount" command, gets handled in Volume.cpp function
> mountVol() which checks if the state is "State_Idle" if not, returns
> BUSY, which in turn gets translated to code 405 "OpFailedStorageBusy"
> which is what we see on MountService. This happens because we have
> just set the state to "State_Pending".
>
> If we force "State_Idle" on handleDiskAdded, instead of going into
> state_Pending, it fixes our problem.
>
> A possible fix for this is setting a flag in the onEvent method on
> MountService when the disk is inserted, and starting the thread that
> sends the mount command when we receive the state-change to idle, and
> the
> flag is set.
>
> In short, we should try to mount when the state has changed to idle,
> and
> not on insertion.
>
> Here is the patch for this:
>
> index 6ceeb95..0adaf19
> --- a/services/java/com/android/server/MountService.java
> +++ b/services/java/com/android/server/MountService.java
> @@ -136,6 +136,8 @@ class MountService extends IMountService.Stub
>     private static final int RETRY_UNMOUNT_DELAY = 30; // in ms
>     private static final int MAX_UNMOUNT_RETRIES = 4;
>
> +    /*used to send the mount command after state is idle.*/
> +    boolean insertionMountPending = false;
>     class UnmountCallBack {
>         String path;
>         int retries;
> @@ -495,6 +497,26 @@ class MountService extends IMountService.Stub
>              * Format: "NNN Volume <label> <path> state changed
>              * from <old_#> (<old_str>) to <new_#> (<new_str>)"
>              */
> +            if ((Integer.parseInt(cooked[10]) == VolumeState.Idle) &&
> +                 insertionMountPending == true) {
> +                /* If the state moves to idle after a insertion
> +                 * try to mount the device "Insertion mount"
> +                 */
> +                final String path = cooked[3];
> +                insertionMountPending = false;
> +                new Thread() {
> +                    public void run() {
> +                        try {
> +                            int rc;
> +                            if ((rc = doMountVolume(path)) !=
> StorageResultCode.OperationSucceeded) {
> +                                Slog.w(TAG, String.format("Insertion
> mount failed (%d)", rc));
> +                            }
> +                        } catch (Exception ex) {
> +                            Slog.w(TAG, "Failed to mount media on
> insertion", ex);
> +                        }
> +                    }
> +                }.start();
> +           }
>             notifyVolumeStateChange(
>                     cooked[2], cooked[3],
> Integer.parseInt(cooked[7]),
>                             Integer.parseInt(cooked[10]));
> @@ -526,18 +548,11 @@ class MountService extends IMountService.Stub
>             }
>
>             if (code == VoldResponseCode.VolumeDiskInserted) {
> -                new Thread() {
> -                    public void run() {
> -                        try {
> -                            int rc;
> -                            if ((rc = doMountVolume(path)) !=
> StorageResultCode.OperationSucceeded) {
> -                                Slog.w(TAG, String.format("Insertion
> mount failed (%d)", rc));
> -                            }
> -                        } catch (Exception ex) {
> -                            Slog.w(TAG, "Failed to mount media on
> insertion", ex);
> -                        }
> -                    }
> -                }.start();
> +               /* Instead of tring to mount here, wait for
> +                * the state to be Idle before atempting the
> +                * insertion mount, else "insertion mount" may fail.
> +                */
> +               insertionMountPending = true;
>             } else if (code == VoldResponseCode.VolumeDiskRemoved) {
>                 /*
>                  * This event gets trumped if we're already in
> BAD_REMOVAL state
>
> --
> unsubscribe: 
> android-porting+unsubscr...@googlegroups.com<android-porting%2bunsubscr...@googlegroups.com>
> website: http://groups.google.com/group/android-porting
>



-- 
------

Jianbo Qiu (邱建波)

Mobile: 13681184653

MSN:q173981...@126.com <msn%3aq173981...@126.com>

------

-- 
unsubscribe: android-porting+unsubscr...@googlegroups.com
website: http://groups.google.com/group/android-porting

Reply via email to