android adb源码分析(2)
来源:互联网 发布:辽宁省农产品出口数据 编辑:程序博客网 时间:2024/06/10 15:40
本篇分析usb_linux_client.c中的usb_init(),它的代码如下:
void usb_init(){ if (access(USB_FFS_ADB_EP0, F_OK) == 0) { usb_ffs_init(); } else{ usb_adb_init(); }}
调用usb_adb_init():
static void usb_adb_init(){ usb_handle *h; adb_thread_t tid; int fd; h = calloc(1, sizeof(usb_handle)); h->write = usb_adb_write; h->read = usb_adb_read; h->kick = usb_adb_kick; h->fd = -1; adb_cond_init(&h->notify, 0); adb_mutex_init(&h->lock, 0); // Open the file /dev/android_adb_enable to trigger // the enabling of the adb USB function in the kernel. // We never touch this file again - just leave it open // indefinitely so the kernel will know when we are running // and when we are not. fd = unix_open("/dev/android_adb_enable", O_RDWR); if (fd < 0) { D("failed to open /dev/android_adb_enable\n"); } else { close_on_exec(fd); } D("[ usb_init - starting thread ]\n"); if(adb_thread_create(&tid, usb_adb_open_thread, h)){ fatal_errno("cannot create usb thread"); }}
它初始化了usb_handle,并把它作为参数创建usb_adb_open_thread()线程。这里不能打开/dev/android_adb_enable。h->fd的值会在线程usb_adb_open_thread中赋值,并把它做为h->write(), h->read(), h->kick()的文件句柄,h->kick()函数功能是把h->fd置为-1。
usb_adb_open_thread的代码如下:
static void *usb_adb_open_thread(void *x){ struct usb_handle *usb = (struct usb_handle *)x; int fd; while (1) { // wait until the USB device needs opening adb_mutex_lock(&usb->lock); while (usb->fd != -1) adb_cond_wait(&usb->notify, &usb->lock); adb_mutex_unlock(&usb->lock); D("[ usb_thread - opening device ]\n"); do { /* XXX use inotify? */ fd = unix_open("/dev/android_adb", O_RDWR); if (fd < 0) { // to support older kernels fd = unix_open("/dev/android", O_RDWR); } if (fd < 0) { adb_sleep_ms(1000); } } while (fd < 0); D("[ opening device succeeded ]\n"); close_on_exec(fd); usb->fd = fd; D("[ usb_thread - registering device ]\n"); register_usb_transport(usb, 0, 0, 1); } // never gets here return 0;}
这个线程的作用是一进入立即打开/dev/android_adb或/dev/android,如果成功,则调用register_usb_transport()后再次循环,并阻塞在以下代码处
while(usb->fd != -1)
adb_cond_wait(&usb->notify, &usb->lock);
当usb->kick()调用后fd的值被赋为-1,并发送cond唤醒上面的代码。
0 0
- android adb源码分析(2)
- Android 2.3 ADB源码分析
- android adb源码分析(1)
- android adb源码分析(3)
- android adb源码分析(4)
- android adb源码分析(5)
- android adb源码分析(1)
- android adb 源码框架分析(2 角色)
- ADB 源码分析
- adb源码分析(一)
- adb源码分析
- android adb 源码框架分析(1 系统)
- android adb 源码框架分析(3 传输)
- android adb 源码框架分析(4 服务)
- android adb 源码框架分析(5 客户端)
- ADB源码分析(一)
- android2.3-adb源码分析
- android2.3-adb源码分析
- Java源码:ArrayList的实现原理
- 类文件结构
- Android如何判断时间是否在0到8点之间
- 【miscellaneous】GPRS本质论
- opencv彩色图像可视化实例
- android adb源码分析(2)
- 数组中出现次数超过一半的数字
- 冒泡排序
- 我的音乐收藏 http://www.xiami.com/u/45574524
- 使用 Gradle 与 Travis CI 进行简单持续集成 II
- javascript引用类型
- 2016年华为秋招机试题——2.字符串排序(200分)
- 使用文件来保存程序中的数据
- android-图片加载 Picasso 设计及优点