android下usb框架系列文章---(4)android下的光盘功能控制
来源:互联网 发布:如何当一名网络作家 编辑:程序博客网 时间:2024/06/05 19:15
一 使能光盘功能
1. 1内核项中增加cd-rom文件系统的支持
1.2 挂载iso文件到/mnt/cd-rom目录下
注意:由于mtk编译规则除了编译用户目录下的文件,还会处理mt6575平台下的目录。
Mt6575下的init.rc中
mkdir /mnt/cd-rom 0000 system system
mount iso9660 loop@/system/mobile_toolkit/iAmCdRom.iso /mnt/cd-romro
1.3 定义系统属性变量(ro.sys.usb.storage.type)
alps/mediatek/config/xxxx/system.prop
这个选项是用来让设备工作在mtp+cdrom的情形下,如果工作在ums+cdrom情形下的话,ro.sys.usb.storage.type=mass_storage
对于系统变量ro.sys.usb.storage.type在下面的文件中用到了。
mUsbStorageType= SystemProperties.get("ro.sys.usb.storage.type",UsbManager.USB_FUNCTION_MTP);
Framework层有专门对usb设备的管理。这个目录下有4个文件,device和host管理,service文件和settingmanage文件。属于android中的service。
Todo:这部分代码需要看,以便打通usb从上到下的通路。
1.4 增加整个工程的编译控制宏(MTK_BICR_SUPPORT)
alps/mediatek/config/xxxx/ProjectConfig.mk(AUTO_ADD_GLOBAL_DEFINE_BY_NAME 最后加上MTK_BICR_SUPPORT)
宏定义的生效还得通过设置为yes来完成。如果不想启动mtp,启动ums。需要加入MTK_MASS_STORAGE=yes。当这个宏被定义后,build\core\main.mk中的以下代码将会起作用。用来记录系统当前的一些属性变量值。和上面的ro.sys.usb.storage.type一样。大部分在下面的文件中出现:
frameworks/base/services/java/com/android/server/usb/UsbDeviceManager.java
frameworks/base/core/java/android/hardware/usb/UsbManager.java
String config= SystemProperties.get("persist.sys.usb.config",UsbManager.USB_FUNCTION_MTP);
这个属性变量在初始化时是在init.usb.rc中首先起作用的,会根据这个变量的值来操作sys/class/android_usb下的文件,来写入vid/pid以及androidusb gadget复合设备支持的function。
build\core\main.mk
#defaulusb function
ifeq ($(strip $(MTK_MASS_STORAGE)),yes)
ADDITIONAL_DEFAULT_PROPERTIES +=persist.sys.usb.config=mass_storage
else
ifeq ($(strip $(MTK_BICR_SUPPORT)),yes)
ADDITIONAL_DEFAULT_PROPERTIES +=persist.sys.usb.config=mtp,mass_storage
else
ADDITIONAL_DEFAULT_PROPERTIES +=persist.sys.usb.config=mtp
endif
endif
Ums和mtp不能共存,mtp和cdrom可以共存。
//shareman:上面这几个修改配置的地方都是在mediatek/config/a2_3g_data目录下,也就是说在mtk平台下,当用户要修改配置项时都是在自己的项目目录下修改。
内核项配置:autoconfig/kconfig/project
工程的初始化、启动配置:init.project.rc
系统存储设备参数默认初始值:system.prop
整个工程级别的配置:ProjectConfig.mk
下面这个storage_list.xml是framework层面关于storage的一些配置。
1.5 使能allowMassStorage(storage_list.xml)
alps/mediatek/custom/xxxx/resource_overlay/generic/frameworks/base/core/res/res/xml/storage_list.xml
2207上这个默认是加上的
<StorageListxmlns:android="http://schemas.android.com/apk/res/android">
</StorageList>
这个的作用没有看明白,todo。
1.6. 增加开机时usb功能初始化文件
oninit
#Workarunod for USB unknow device issue
# USBwould switch correct function whenset properity sys.usb.config
onpost-fs-data
# Usedto set USB configuration at boot and to switch theconfiguration
# whenchanging the default configuration
onproperty:persist.sys.usb.config=*
# Usedto disable USB when switching states
onproperty:sys.usb.config=none
#25.USBaccessory configuration
onproperty:sys.usb.config=accessory
1.7 制作ISO文件及autorun
Iso 文件制作:
工具ultraISO
1 更改光盘显示的名称
2
3制作autorun.inf
下面是自动运行wmp11-windowsxp-x86-ZH-CN.exe
[autorun]
open=wmp11-windowsxp-x86-ZH-CN.exe
4 iso文件的更新
使用工具制作iso文件后,通过adbpush到设备上。重启后将mount新的iso文件。
(Iso文件alps\system\mobile_toolkit)
注意quick boot是假关机,不能重新挂载
mount iso9660loop@/system/mobile_toolkit/iAmCdRom.iso /mnt/cd-rom ro
系统启动时,将iso文件挂载到了/mnt/cd-rom目录下
Todo:如何将inf形式的驱动做成可执行的驱动文件
1.8 不同pid驱动问题
由于以前的pid是7498,对应的功能为adb/mtp
现在使用了cdrom,对应的功能为adb/mtp/mass-storage,pid为749D
而这时碰到了adb和mtp驱动不能工作的问题,需要重新安装adb驱动,在googleandroid_winusb.inf文件中重新加入对该pid的支持。
%CompositeAdbInterface%
代表复合设备,adb接口,对应的是接口2
但是mtp的驱动仍然不好使呢?即使去掉了adbdebug功能。
Android原生的mtp有问题,当和其他功能复合使用时,驱动不能自动安装。
注意:注册表中设备驱动记录项,
路徑:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB
犯了一个大错误,当时出现了问题,只是草草解决,却没有知其所以然。后来出了问题。在解决上面的驱动时,当时发现了怎么有pid还不行,随便拷贝了一下。就解决了,没有考虑为什么。原来分别是64位机和32位机的驱动。
找到[Google.NTx86]
[Google.NTx86]
; HTC Desire HD
%CompositeAdbInterface% =USB_Install,
Temprecord:
2012-5-24
mtp修改为ums功能
1
alps/mediatek/config/xxxx/ProjectConfig.mk
AUTO_ADD_GLOBAL_DEFINE_BY_NAME=….
最下方再補上 MTK_BICR_SUPPORT=yes
添加:
AUTO_ADD_GLOBAL_DEFINE_BY_NAME= ….MTK_MASS_STORAGE
MTK_MASS_STORAGE =yes
2alps/mediatek/config/xxxx/system.prop
改为:
结果:弹出2个可移动磁盘和一个光盘,但是移动磁盘没有介质。
查看cd-rom的file文件,sys/class/android_usb/f_mass_storage/lun-cdrom
内容为:/dev/block/loop0
原来是pad下方有一个bar,需要turnon mass_storage
PR:后来发现在以前mtp+光驱的配置时,
AUTO_ADD_GLOBAL_DEFINE_BY_NAME= …. MTK_MASS_STORAGE这个是有的。
MTK_MULTI_STORAGE_SUPPORT MTK_MULTI_STORAGE_SUPPORT=YES这个也是有的.
而这个时候为什么没有弹出u盘,而是以mtp形式出现的?
难道mtp和ums冲突,只能以一个呈现?是pad的上层有设定么?原理上确实是不能有两个功能同时使用一个介质sd卡。所以是不能同时使用的。
在没有任何修改时,sys/class/android_usb/anroid0/functions
使用mtp+光驱的方式,sys/class/android_usb/anroid0/functions内容为mtp,mass-storage,adb
使用上面修改的方式,ums+光驱sys/class/android_usb/anroid0/functions内容为mass-storage,adb
1.9 光驱弹出行为
附录:
ISO 9660 CDROM file systemsupport (ISO9660),This is the standard file systemused on CD-ROMs. The so-called Rock-Ridge extensions which allowfor long Unix filenames and symbolic links are also supported bythis driver. If you have a CD-ROM drive and want to do more with itthan just listen to audio CDs and watch its LEDs, say Y
Microsoft Joliet CDROM extensions(Joliet) is a Microsoft extension for the ISO 9660CD-ROM file system which allows forlongfilenames in unicode format 。Say Y here if you want to be able to read JolietCD-ROMs under Linux.
Transparent decompressionextension(ZISOFS), This is aLinux-specific extension to RockRidge which lets you store data incompressed form on a CD-ROM and have it transparently
decompressed when the CD-ROM isaccessed.
光盘挂载:
1、将文件和目录制作成光盘镜像文件,执行下面的命令。
#mkisofs -r -J -V mydisk -o /home/sunky/mydisk.iso/home/sunky/ mydir
注:这条命令将/home/sunky/mydir目录下所有的目录和文件制作成光盘镜像文件/home/sunky/mydisk.iso,光盘卷标为:mydisk
2、光盘镜像文件的挂接(mount)
#mkdir /mnt/vcdrom
注:建立一个目录用来作挂接点(mount point)
#mount -o loop -t iso9660 /home/sunky/mydisk.iso/mnt/vcdrom
二 光盘bicr介质的挂载流程(UsbDeviceManager.java)
2.1 光盘backfile的控制
sys.usb.mtk_bicr_support:这个值系统变量用来标识是否显示光盘内容,两个值yes,yes_hide.
这个值的初始化发生在UsbDeviceManager.java文件里
if(nativeInitUMSproperty())
static jbooleanandroid_server_UsbService_initUMSproperty(JNIEnv *env, jobjectthiz)
{
#ifdefMTK_BICR_SUPPORT
#else
#endif
}
是否支持光盘内容弹出通过MTK_BICR_SUPPORT宏来决定。光盘作为mass_storage的一个子类,只要在使能了mass_storage功能后,并且在mass_storage驱动中定义了cdrom的lun个数非0后,就会在pc上出现光驱。但是是否有文件系统还需要一个步骤。上面的sys.usb.mtk_bicr_support就是用来控制这个功能的开关。
该值为yes的话就会触发文件系统的挂载。
总体流程:
在UsbDeviceManager.java中showBuiltinInstallerUI,启用了BuiltinInstallerActivity
Mountservice.java中,shareCDRom---doshareunshareCDRom--mconnector.doCommand
进入nativedaemonconnector.java
经过jni进入到comandlistener.cpp该文件位于vold文件夹内,
执行CDROMCmd的runCommand函数,执行bicr.cpp的shareCdRom函数,
const char*Bicr::CD_ROM_PATH
const char*Bicr::CD_ROM_LUN_PATH
最后通过else if (write(fd, CD_ROM_PATH,strlen(CD_ROM_PATH)) < 0) {
完成了文件对应介质的操作。
2.2 光盘backfile的触发启动
PR:那么showBuiltinInstallerUI是什么时候启动的呢?挂载的介质在拔除usbcabel时有没有被清掉呢?防止下次在界面中虽然设置了hide,依然会显示光盘内容?所以应该是在拔除这个动作发生时清除才对。代验证。
第一种情况:系统启动完成时,但是要判断usb是否连接着,连接着才会考虑
二 系统上电的时候
三 收到更新消息,并且是发生了硬件重新插拔动作才进行处理,所以如果仅仅是软的连接不会发生这个动作
这个updateState的触发是有kernel层上来的,kernel层会发出uevent消息,所以上面需要接收、处理uevent消息。
如下:
//Added for USB Develpment debug, more log for more debuginghelp
//Added for USB Develpment debug, more log for more debuginghelp
下面看一下
这个UsbHandler是一个主要的usb处理类。
………………
………………
在updateState函数中,通过传进来的state,重新调整了connected和 configured两个参数,并传递了消息。
然后回到了上面的第三种情况中的消息处理函数handleMessage。
root@android:/sys/class/android_usb/android0 # catstate
CONFIGURED
在updateState函数中有4个state状态:
HWDISCONNECTED硬件上拔除了usb cabel
DISCONNECTED 这个应该是软拔除,现在理解是软件上的一种设置
CONNECTED 已经连接上了
CONFIGURED 已经配置完成
其中有一个重要变量mHwReconnected用来记录这次连接是否是硬件的再次连接,而不是软件设置上的重新连接。
2.3 光盘backfile的unshare
上面有一个疑问是,什么时候将光盘的文件系统介质拿掉的。如下,通过下面的receiver接收到usb的action:ACTION_USB_STATE,如果发生了拔除动作,则shareCDRom(false)卸载掉文件系统介质。
// This class is used to closeBuiltInstallerActivity and ims service unMount if it ismounted
public class BuiltinInstallerReceiver
}
这个receiver在manifest.xml中定义,这种方式类似于下面这种注册的方式
registerReceiver(mUsbStateReceiver, newIntentFilter(UsbManager.ACTION_USB_STATE));
这个receiver收到广播消息后,调用了BuiltinInstallerActivity
PR:所以下面的问题就是消息的问题,当usb没有发生硬插拔时是广播的什么消息?可以确认的是即使广播的消息没有触发showBuiltinInstallerUI动作,也没有关系。因为由于上面BuiltinInstallerReceiver
2.4 设置usbfunction的动作
PR:2012-07-04添加了复选框用来使能光盘ornot。主要是通过addFunction和removeFunction两个动作来处理usb的function的。但是当使能光盘时,sys.usb.config变为mtp,adb,mass_storage不在init.usb.rc中,所以这个时候就会setUsbConfig失败,转而重新设置为刚才的(mtp,adb).
所以复选框的功能是否应该更改为:1 setCurrentFunction(“mass_storage”).2 setCurrentFunction(“mtp,adb”).其中2还要看是否使能了debug,如果没有的话还得去掉。
所以这个部分现在只是行为方式上的定义,以及编译时对persist.sys.usb.config的控制(去掉mass_storage).
对于在调用 setCurrentFunction后的动作中,有很多猫腻。setCurrentFunction发送消息,随后在处理函数中调用setEnabledFunctions完成整个设置过程,但这个setEnabledFunctions有对usbfunction的各种各样的变化。下面看看setEnabledFunctions的处理思路:
setEnabledFunctions(String functions, booleanmakeDefault) {
mDefaultFunctions:代表系统默认的function,persist.sys.usb.config
mCurrentFunctions:代表系统当前的usbfunction
mSettingFunction代表当前要设置的function
functions:参数传入时代表当前要设置的function,但是这个值会在这个函数内部根据系统的功能发生变化,如当定义了cdrom,它会默认加入mass_storage功能等,所以最后设置的functions将有可能不是最初传入的function,最初传入的function一直保存在mSettingFunction中。
根据是否override persist.sys.usb.config进行了分支,persist.sys.usb.config考虑是否被修改为makeDefault。
//mSettingUsbCharging:UsbManager.USB_FUNCTION_CHARGING_ONLY代表usb只用来充电,这块的意思是如果在非只充电的情况下,用户的function设置,必须遵循系统的一些特性,尊重系统的adb功能,用户的设置会被改动
//acm和adb类似,注意这几个系统级别的function的顺序
三 控制显示光盘内容的两种方式
3.1 切换usbmass_storage功能
3.2 通过设置backfile来完成
1)添加资源文件
将控制开关放在setting----accessibility中,名称为Install usb driver
packages/apps/Settings/res/values$ vi strings.xml
2) 修改布局文件
packages/apps/Settings/res/xml$vi accessibility_settings.xml
在布局中添加一个复选框
3) 添加代码
增加导入包
importandroid.os.storage.IMountService;
importandroid.os.IBinder;
importandroid.os.ServiceManager;
增加变量定义
增加操作代码
初始化中加入
private voidinitializeAllPreferences
mTurnOnCdRomPreference用来记录当前复选框的状态,TURNON_CDROM对应的是复选框的键值。
点击处理动作
public booleanonPreferenceTreeClick(PreferenceScreen preferenceScreen, Preferencepreference) {
加入实际的处理动作
这个地方就是假设usb 功能包含了mass_storage,并且sys.usb.mtk_bicr_support为yes
4)去掉UsbDeviceManger.java中对光盘的处理,防止插入usbcabel时,光盘弹出
- android下usb框架系列文章---(4)android下的光盘功能控制
- 四、android下的光盘功能控制
- android下的光盘功能控制
- android下usb框架系列文章---(3)Storage框架整理
- android下usb框架系列文章---(6)UsbDeviceManager及功能设置流程.doc
- android下usb框架系列文章---(2)Usb mass_storage turn on的过程
- android下usb框架系列文章---(7)android-kernel gadget框架.doc
- android下usb框架系列文章---(5)Usb setting 中tethering 设置流程
- Android 下的usb框架及功能点
- Android 下的usb框架及功能点
- Android 下的usb框架及功能点
- Android平板USB通讯控制功能的设计
- Android USB下的Accessory模式
- Android下USB Accessory的实现分析
- Android下USB Accessory的实现分析
- Android下USB Accessory的实现分析
- Android下USB Accessory的实现分析
- android usb host 模式下监听usb的拔插
- 只有mdf文件的恢复技术
- Vim_默认打开标签页
- SystemUI的运行机制
- Linux USB子系统 (2)
- sybase监控执行sql(转自新浪)
- android下usb框架系列文章---(4)android下的光盘功能控制
- intentservice和聊天的本地测试
- eclipse 中的Dynamic Web Project 项目导入到myeclipse中
- Fedora登录自执行命令
- “知识地图”助员工岗位成才
- 矢量网络分析仪原理
- 项目开发中,质量和速度哪个更重要?
- 李嘉诚先生
- 关于背景background-position的问题