原文地址::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?
- 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;
- }
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?
- //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);
- }
- }
- }
//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?
- //Android-2.3/system/vold/NetlinkHandler.cpp
- void 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/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?
- //在/Android-2.3/system/vold/VolumeManager.h
- class VolumeManager {
- public:
- //增加如下一行
- void handleUsbEvent(NetlinkEvent *evt);
- }
//在/Android-2.3/system/vold/VolumeManager.h<br />class VolumeManager {<br />public:<br /> //增加如下一行<br /> void handleUsbEvent(NetlinkEvent *evt);<br />}
view plaincopy to clipboardprint?
- //檔案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);
- }
- }