很多时候,我们将手机接入电脑后,会发现一个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_BLOCK if(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试一下。