博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android USB 驱动分析
阅读量:4052 次
发布时间:2019-05-25

本文共 1547 字,大约阅读时间需要 5 分钟。

一、USB驱动代码架构和使用
    
    1、代码简介
 
 
 
 
 
 
USB驱动代码在/drivers/usb/gadget下,有三个文件:android.c,f_adb.c,
 
 
 
 
 
 
f_mass_storage.c;g_android.ko 是由这三个文件编译而来,其中android.c 依赖于
 
 
 
 
 
 
 
f_adb.c 
和 f_mass_storage.c(这两个文件之间无依赖关系)。

 
 
 
 
 
 
可在android.c中看到:

 
 
 
 
 
 
static int __init android_bind_config(struct usb_configuration *c) 
 
 

 
 
 
 
 
 
 
 

 
 
 
 
 
 
 
 
struct android_dev *dev = _android_dev; 
 
 

 
 
 
 
 
 
 
 
int ret; 
 
 

 
 
 
 
 
 
 
 
printk(KERN_DEBUG "android_bind_config\n"); 
 
 

 
 
 
 
 
 
 
 
ret = mass_storage_function_add(dev->cdev, c, dev->nluns); 
 
 

 
 
 
 
 
 
 
 
if (ret) 
 
 

 
 
 
 
 
 
 
 
 
 
 
 
return ret; 
 
 

 
 
 
 
 
 
 
 
return adb_function_add(dev->cdev, c); 
 
 

 
 
 
 
 
 
}
 
 
 
 
2、驱动使用
 
 
 
 
 
 
要使USB mass storage连接到主机:

 
 
 
 
 
 
打开/sys/devices/platform/usb_mass_storage/lun0/file文件,向file文件写入一个存储
 
 
 
 
 
 
设备的路径,例如/dev/block/vold/179:0 (major:minor)路径;
 
 
 
 
 
 
这里的usb_mass_storage根据实际应用可以改的,由platform_device_register函数的参数决
 
 
 
 
 
 
定。

 
 
 
 
 
 
例如:

 
 
 
 
 
 
static struct platform_device fsg_platform_device = 
 
 

 
 
 
 
 
 
{

 
 
 
 
 
 
 
 
 
.name = "usb_mass_storage", 
 
 

 
 
 
 
 
 
 
 
 
.id 
 
= -1, 
 
 

 
 
 
 
 
 
}; 
 
 

 
 
 
 
 
 
static void __init tegra_machine_init(void) 
 
 

 
 
 
 
 
 
 
 

 
 
 
 
 
 
 
.... 
 
 

 
 
 
 
 
 
 
(void) platform_device_register(&fsg_platform_device); 
 
 

 
 
 
 
 
 
 
.... 
 
 

 
 
 
 
 
 
}

 
 
 
 

 
 
 
 
 
 
能够连接的设备数,由驱动中的nluns变量来控制,最多支持8个。

二、USB插入检测
 
 
 
三、USB代码分析
 
 
 
 
1、USB初始化

 
 
 
 
 
 
在android.c中分别注册adb和mass storage:
 
 
 
 
 
 
static int __init android_bind_config(struct usb_configuration *c) 
 
 

 
 
 
 
 
 
 
 

 
 
 
 
 
 
 
 
 
struct android_dev *dev = _android_dev; 
 
 

 
 
 
 
 
 
 
 
 
int ret; 
 
 

 
 
 
 
 
 
 
 
 
printk(KERN_DEBUG "android_bind_config\n"); 
 
 

 
 
 
 
 
 
 
 
 
ret = mass_storage_function_add(dev->cdev, c, dev->nluns); 
 
 

 
 
 
 
 
 
 
 
 
if (ret) 
 
 

 
 
 
 
 
 
 
 
 
 
 
 
return ret; 
 
 

 
 
 
 
 
 
 
 
 
 
 
return adb_function_add(dev->cdev, c); 
 
 

 
 
 
 
 
 
}
 
 
 
 
2、往驱动写入lun信息

 
 
 
 
 
 
在驱动中有static DEVICE_ATTR(file, 0444, show_file, store_file);这是负责读
 
 
 
 
 
 
(cat/read)或直写(echo/write)设备属性文件的宏。
 
 
 
 
3、USB连接到主机

 
 
 
 
 
 
 
echo /dev/block/vold/179:0 > /sys/devices/platform/usb_mass_storage/lun0/file
 
 
 
 
4、USB从主机断开

 
 
 
 
 
 
 
 
 
 
 
 
echo "" > /sys/devices/platform/usb_mass_storage/lun0/file
 

转载地址:http://fesci.baihongyu.com/

你可能感兴趣的文章
Idea下安装Lombok插件
查看>>
zookeeper
查看>>
Idea导入的工程看不到src等代码
查看>>
技术栈
查看>>
Jenkins中shell-script执行报错sh: line 2: npm: command not found
查看>>
8.X版本的node打包时,gulp命令报错 require.extensions.hasownproperty
查看>>
Jenkins 启动命令
查看>>
Maven项目版本继承 – 我必须指定父版本?
查看>>
通过C++反射实现C++与任意脚本(lua、js等)的交互(二)
查看>>
利用清华镜像站解决pip超时问题
查看>>
微信小程序开发全线记录
查看>>
CCF 分蛋糕
查看>>
解决python2.7中UnicodeEncodeError
查看>>
小谈python 输出
查看>>
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
查看>>
python:如何将excel文件转化成CSV格式
查看>>
机器学习实战之决策树(一)
查看>>
机器学习实战之决策树二
查看>>
[LeetCode By Python]7 Reverse Integer
查看>>
[LeetCode By Python]121. Best Time to Buy and Sell Stock
查看>>