Hi axel:
your patch works well.
"no partitions" means ths sdcard has none partitions,deleted all
partitions.it can r/w with pc operating system
had this problem happen on your device?can't mount sdcard with "no
partitions"
在 2010年8月12日 下午10:51,axel haslam <[email protected]>写道:
> i have pushed this patch that helped with our problem.
> https://review.source.android.com/#change,16460, let me know
> if it helps..
>
> Im not sure what you mean with "no partitions".. you have not
> partitioned the sdcard?
>
>
>
>
> <https://review.source.android.com/#change,16460>
>
> 2010/8/12 邱建波 <[email protected]>
>
> 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 <[email protected]>
>>
>>> 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:
>>> [email protected]<android-porting%[email protected]>
>>> website: http://groups.google.com/group/android-porting
>>>
>>
>>
>>
>> --
>> ------
>>
>> Jianbo Qiu (邱建波)
>>
>> Mobile: 13681184653
>>
>> MSN:[email protected] <msn%[email protected]>
>>
>> ------
>>
>
>
--
------
Jianbo Qiu (邱建波)
Mobile: 13681184653
MSN:[email protected] <msn%[email protected]>
------
--
unsubscribe: [email protected]
website: http://groups.google.com/group/android-porting