很多時候,我們將手機接入電腦後,會發現一個CR-ROM光碟機類似的盤符,裡面有手機附帶的內容。做法是這樣的:
(1)增加手機分區
通過調整bootloader(傳參給kernel)或kernel的mtd partition table。增加一個分區,專門存放CDROM鏡像。
(2)製作CDROM鏡像並燒寫到該分區
將光碟機的內容拷貝入一個linux目錄,用mkisofs -r -o cdrom.iso /your-cdrom-dir建立鏡像,通過廠家提供的燒寫工具進行燒寫手機。
(3)開發usb gadget支援
a,源碼支援
kernel預設提供了drivers/usb/gadget/f_mass_storage.c以支援mass storage(磁碟或CDROM),android修改了f_mass_storage.c來支援其掛載sdcard為mass storage,其中f_mass_storage.c註冊了一堆虛擬卷lun0-lunX,每個虛擬卷都設定為了普通的DISK。android只使用lun0來掛載sdcard到PC,比較直接的將mass storage初始化直接添加到了這個檔案裡。如要要支援CDROM,需要手工為其中某個lun設定cdrom
flag(比如lun1),參考該檔案中的fsg_probe函數設定lun屬性的行。
#ifdef SUPPORT_CDROM_BLOCKif(i == 1)fsg_cfg.luns[i].cdrom = 1;#endif
b,使用者層控制
在system\vold目錄下的VolumeManager.cpp,android通過vold來控制mass storage的mount到裝置和share到PC,原理就是操作mass storage gadget運行起來後的控制節點/sys/devices/platform/usb_mass_storage。需要設定其中的enable為1,然後lun0下的file指向需要share的裝置節點。假設增加的分區為/dev/block/mtdblock14,則直接填寫該節點到file檔案中即可。
if( mUsbConnected ) { char nodepath[255];memset(nodepath,0 ,255);snprintf(nodepath, sizeof(nodepath), "/dev/block/mtdblock14"); LOGD(" name = usb_configuration"); int fd2; if ((fd2 = open("/sys/devices/platform/usb_mass_storage/lun1/file", O_WRONLY)) < 0) { LOGE("Unable to open ums lunfile (%s)", strerror(errno)); return ; } if (write(fd2, nodepath, strlen(nodepath)) < 0) { LOGE("Unable to write to ums lunfile (%s)", strerror(errno)); close(fd2); return ; } close(fd2);}else{ int fd2; char ch = 0; LOGD(" name = usb_configuration remove "); if ((fd2 = open("/sys/devices/platform/usb_mass_storage/lun1/file", O_WRONLY)) < 0) { SLOGE("Unable to open ums lunfile (%s)", strerror(errno)); return ; } if (write(fd2, &ch, 1) < 0) { SLOGE("Unable to write to ums lunfile (%s)", strerror(errno)); close(fd2); return ; } close(fd2);}
(4)之後,就可以直接在XP中看到掛載的CD-ROM了。基本流程如此,其他還有很多細節,比如光碟片要有aurorun來運行預設執行檔案,如何同時相容adb支援但又可以預設彈出光碟機等等。
================================================================================================================
在android 4.0版本上,通過網路同步時間有兩種方式:NITZ和NTP,它們使用的條件不同,可以擷取的資訊也不一樣;勾選這個功能後,手機首先會嘗試NITZ方式,若擷取時間失敗,則使用NTP方式
(1)NITZ(network identity and time zone)同步時間
NITZ是一種GSM/WCDMA基地台方式,必須插入SIM卡,且需要operator支援;可以提供時間和時區資訊。中國大陸電訊廠商基本是不支援的。
(3)NTP(network time protocol)同步時間
NTP在無SIM卡或operator不支援NITZ時使用,單純通過網路(GPRS/WIFI)擷取時間,只提供時間資訊,沒有時區資訊(因此在不支援NITZ的地區,自動擷取時區功能實際上是無效的)。NTP還有一種緩衝機制:當前成功擷取的時間會儲存下來,當使用者下次開啟自動更新時間功能時會結合手機clock來進行時間更新。這也是沒有任何網路時手機卻能自動更新時間的原因。此外,因為NTP是通過對時的server擷取時間,當同步時間失敗時,可以檢查一下對時的server是否有效,並替換為其他server試一下。