Android实现3G类usb模式自动转换
来源:互联网 发布:美工电商平台是什么 编辑:程序博客网 时间:2024/04/30 06:07
环境系统:Android-2.3 板子:友善之臂提供s3c6410
当一个新的usb插入时,内核会发送一个uevent时间。上层接收到后,做出相应的处理。
如:我使用的为HuaWei ET127的3G网卡,插入arm板上后。没有正确识别成为ttyACM*设备。无法进行AT命令发送。这时。我们需要转换模式。
我使用的是usb_modeswitch可以去官网下载,然后使用arm-gcc进行编译。
首先看一下消息流向
在Android-2.3/system/core/libsysutils/src/NetlinkListener.cpp文件中
bool NetlinkListener::onDataAvailable(SocketClient *cli){ int socket = cli->getSocket(); int count; if ((count = recv(socket, mBuffer, sizeof(mBuffer), 0)) < 0) { return false; } //这里buffer形式为:add@/devices/platform/s3c2410-ohci/usb1/1-1/1-1.2 NetlinkEvent *evt = new NetlinkEvent(); if (!evt->decode(mBuffer, count)) { goto out; } onEvent(evt);out: delete evt; return true;}这里的decode调用的为
//Android-2.3/system/core/libsysutils/src/NetlinkEvent.cpp 这里循环将buffer数据提取出来bool NetlinkEvent::decode(char *buffer, int size) { while (s < end) { if (first) { ...... for (p = s; *p != '@'; p++); mPath = strdup(p); ....... } else { if (!strncmp(s, "ACTION=", strlen("ACTION="))) { char *a = s + strlen("ACTION="); if (!strcmp(a, "add")) mAction = NlActionAdd; else if (!strcmp(a, "remove")) mAction = NlActionRemove; else if (!strcmp(a, "change")) mAction = NlActionChange; } else if (!strncmp(s, "SEQNUM=", strlen("SEQNUM="))) mSeq = atoi(s + strlen("SEQNUM=")); else if (!strncmp(s, "SUBSYSTEM=", strlen("SUBSYSTEM="))) mSubsystem = strdup(s + strlen("SUBSYSTEM=")); else mParams[param_idx++] = strdup(s); } }}继续调用onEvent函数,会有两处调用onEvent函数
1:为vold 2:为netd 程序。 两者类似。 只看下vold
//Android-2.3/system/vold/NetlinkHandler.cppvoid NetlinkHandler::onEvent(NetlinkEvent *evt) { VolumeManager *vm = VolumeManager::Instance(); const char *subsys = evt->getSubsystem(); if (!strcmp(subsys, "block")) { vm->handleBlockEvent(evt); } else if (!strcmp(subsys, "usb_composite")) { vm->handleUsbCompositeEvent(evt); //这里没有usb,我们添加一项,如下3行 } else if (!strcmp(subsys, "usb")) { vm->handleUsbEvent(evt); //此函数需要在 Event类中添加 } }
//在/Android-2.3/system/vold/VolumeManager.hclass VolumeManager {public: //增加如下一行 void handleUsbEvent(NetlinkEvent *evt);}
//文件Android-2.3/system/vold/VolumeManager.cpp中,增加函数void VolumeManager::handleUsbEvent(NetlinkEvent *evt) { const char *devtype = evt->findParam("DEVTYPE"); char *cmd; //如下判断设备类型,和是否为add模式。 进行相应操作 if(1 == evt->getAction() && !strcmp(devtype, "usb_device")) { /*call usb mode switch function*/ asprintf(&cmd, "usb_modeswitch -W -c /12d1\\:1da1"); //这里应该调用外部shell脚本,这里为测试程序。所以写死了 system(cmd); free(cmd); } }
- Android实现3G类usb模式自动转换
- Android实现3G类usb模式自动转换
- USB 3G上网卡的模式切换
- Android 如何实现usb驱动自动安装?
- Android代码实现自动切换USB调试
- 开机自动打开USB调试模式和配置android为USB OTA模式
- 用Android代码实现自动打开USB调试
- 用Android代码实现自动打开USB调试
- 用Android代码实现自动打开USB调试
- android下调试3G之自动拨号
- android下调试3G之自动拨号
- android usb挂载分析--ntfs-3g移植
- android下调试3G之USB串口驱动集成配置
- android usb挂载分析--ntfs-3g移植
- (一) Porting USB 3G MODEM to Android
- android usb挂载分析--ntfs-3g移植
- Android USB 主机模式
- Android USB配件模式
- DataTextFormatString属性
- 英特尔力挺MeeGo 开发规划已至2012二季度
- gcc -l 链接共享库(动态/静态共享库)
- 基于Skyline的Web程序开发整理(一)
- 解决内存不能为written的办法
- Android实现3G类usb模式自动转换
- JS获取父框架的内容:获取子框架的内容:js框架应用
- solaris 使用proc工具
- WCF编码规范(三):服务契约
- Birt参数实现日历控件的方法
- 由先序,中序,求后序
- Apache与Tomcat整合
- (unsigned char *)
- GDB调试器手册[转]