Android實現3G類usb模式自動轉換

來源:互聯網
上載者:User

原文地址::http://blog.csdn.net/maeom/article/details/6583858

 

 

環境系統: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檔案中

view plaincopy to clipboardprint?
  1. bool NetlinkListener::onDataAvailable(SocketClient *cli)  
  2. {  
  3.     int socket = cli->getSocket();  
  4.     int count;  
  5.     if ((count = recv(socket, mBuffer, sizeof(mBuffer), 0)) < 0) {  
  6.         return false;  
  7.     }     
  8.     //這裡buffer形式為:add@/devices/platform/s3c2410-ohci/usb1/1-1/1-1.2
      
  9.     NetlinkEvent *evt = new NetlinkEvent();  
  10.     if (!evt->decode(mBuffer, count)) {  
  11.         goto out;  
  12.     }   
  13.   
  14.     onEvent(evt);  
  15. out:  
  16.     delete evt;  
  17.     return true;  
  18. }  

bool NetlinkListener::onDataAvailable(SocketClient *cli)<br />{<br /> int socket = cli->getSocket();<br /> int count;<br /> if ((count = recv(socket, mBuffer, sizeof(mBuffer), 0)) < 0) {<br /> return false;<br /> }<br /> //這裡buffer形式為:add@/devices/platform/s3c2410-ohci/usb1/1-1/1-1.2<br /> NetlinkEvent *evt = new NetlinkEvent();<br /> if (!evt->decode(mBuffer, count)) {<br /> goto out;<br /> } </p><p> onEvent(evt);<br />out:<br /> delete evt;<br /> return true;<br />}這裡的decode調用的為

view plaincopy to clipboardprint?
  1. //Android-2.3/system/core/libsysutils/src/NetlinkEvent.cpp  這裡迴圈將buffer資料提取出來
      
  2. bool NetlinkEvent::decode(char *buffer, int size) {  
  3.     while (s < end) {  
  4.         if (first) {  
  5.             ......  
  6.             for (p = s; *p != '@'; p++);  
  7.             mPath = strdup(p);  
  8.             .......  
  9.         } else {  
  10.             if (!strncmp(s, "ACTION=", strlen("ACTION="))) {  
  11.                 char *a = s + strlen("ACTION=");  
  12.                 if (!strcmp(a, "add"))  
  13.                     mAction = NlActionAdd;  
  14.                 else if (!strcmp(a, "remove"))  
  15.                     mAction = NlActionRemove;  
  16.                 else if (!strcmp(a, "change"))  
  17.                     mAction = NlActionChange;  
  18.             } else if (!strncmp(s, "SEQNUM=", strlen("SEQNUM=")))  
  19.                 mSeq = atoi(s + strlen("SEQNUM="));  
  20.             else if (!strncmp(s, "SUBSYSTEM=", strlen("SUBSYSTEM=")))  
  21.                 mSubsystem = strdup(s + strlen("SUBSYSTEM="));  
  22.             else  
  23.                 mParams[param_idx++] = strdup(s);  
  24.         }     
  25.     }  
  26. }  

//Android-2.3/system/core/libsysutils/src/NetlinkEvent.cpp 這裡迴圈將buffer資料提取出來<br />bool NetlinkEvent::decode(char *buffer, int size) {<br /> while (s < end) {<br /> if (first) {<br /> ......<br /> for (p = s; *p != '@'; p++);<br /> mPath = strdup(p);<br /> .......<br /> } else {<br /> if (!strncmp(s, "ACTION=", strlen("ACTION="))) {<br /> char *a = s + strlen("ACTION=");<br /> if (!strcmp(a, "add"))<br /> mAction = NlActionAdd;<br /> else if (!strcmp(a, "remove"))<br /> mAction = NlActionRemove;<br /> else if (!strcmp(a, "change"))<br /> mAction = NlActionChange;<br /> } else if (!strncmp(s, "SEQNUM=", strlen("SEQNUM=")))<br /> mSeq = atoi(s + strlen("SEQNUM="));<br /> else if (!strncmp(s, "SUBSYSTEM=", strlen("SUBSYSTEM=")))<br /> mSubsystem = strdup(s + strlen("SUBSYSTEM="));<br /> else<br /> mParams[param_idx++] = strdup(s);<br /> }<br /> }<br />}繼續調用onEvent函數,會有兩處調用onEvent函數

1:為vold  2:為netd 程式。 兩者類似。 只看下vold 

view plaincopy to clipboardprint?
  1. //Android-2.3/system/vold/NetlinkHandler.cpp
      
  2. void NetlinkHandler::onEvent(NetlinkEvent *evt) {  
  3.     VolumeManager *vm = VolumeManager::Instance();  
  4.     const char *subsys = evt->getSubsystem();  
  5.   
  6.     if (!strcmp(subsys, "block")) {  
  7.         vm->handleBlockEvent(evt);  
  8.     } else if (!strcmp(subsys, "usb_composite")) {  
  9.         vm->handleUsbCompositeEvent(evt);  
  10.         //這裡沒有usb,我們添加一項,如下3行   
  11.     } else if (!strcmp(subsys, "usb")) {  
  12.         vm->handleUsbEvent(evt);    //此函數需要在 Event類中添加
      
  13.     }     
  14. }  

//Android-2.3/system/vold/NetlinkHandler.cpp<br />void NetlinkHandler::onEvent(NetlinkEvent *evt) {<br /> VolumeManager *vm = VolumeManager::Instance();<br /> const char *subsys = evt->getSubsystem();</p><p> if (!strcmp(subsys, "block")) {<br /> vm->handleBlockEvent(evt);<br /> } else if (!strcmp(subsys, "usb_composite")) {<br /> vm->handleUsbCompositeEvent(evt);<br /> //這裡沒有usb,我們添加一項,如下3行<br /> } else if (!strcmp(subsys, "usb")) {<br /> vm->handleUsbEvent(evt); //此函數需要在 Event類中添加<br /> }<br />}

view plaincopy to clipboardprint?
  1. //在/Android-2.3/system/vold/VolumeManager.h
      
  2. class VolumeManager {  
  3. public:  
  4.     //增加如下一行   
  5.     void handleUsbEvent(NetlinkEvent *evt);  
  6. }  

//在/Android-2.3/system/vold/VolumeManager.h<br />class VolumeManager {<br />public:<br /> //增加如下一行<br /> void handleUsbEvent(NetlinkEvent *evt);<br />}

view plaincopy to clipboardprint?
  1. //檔案Android-2.3/system/vold/VolumeManager.cpp中,增加函數
      
  2. void VolumeManager::handleUsbEvent(NetlinkEvent *evt) {  
  3.     const char *devtype = evt->findParam("DEVTYPE");  
  4.     char *cmd;  
  5.     //如下判斷裝置類型,和是否為add模式。 進行相應操作
      
  6.     if(1 == evt->getAction() && !strcmp(devtype, "usb_device")) {   
  7.         /*call usb mode switch function*/  
  8.         asprintf(&cmd, "usb_modeswitch -W -c /12d1\\:1da1");  //這裡應該調用外部shell指令碼,這裡為測試程式。所以寫死了
      
  9.         system(cmd);  
  10.         free(cmd);  
  11.     }      
  12. }  
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.