Android USB 驱动分析与开发----编程
来源:互联网 发布:听戏曲的软件 编辑:程序博客网 时间:2024/05/16 07:33
一、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
设备初始化:
/kernel/arch/arm/mach-msm/board-msmxxxx.c
USB驱动文件文件:
/kernel/drivers/usb/gadget/android.c-------复合设备,所有的f开头的接口设备向android.c注册,由android.c控制enable/disable
/kernel/drivers/usb/gadget/f_mass_storage.c--------cdrom/u盘设备,由cdrom参数控制,如果为1上报cdrom,否则上报u盘。
/kernel/drivers/usb/gadget/f_ecm.c--------ecm网络设备,设备侧枚举为usb0
/kernel/drivers/usb/gadget/f_adb.c--------adb驱动
/kernel/drivers/usb/gadget/f_serial.c--------比较常用和通用的一个驱动程序,可以枚举出一个ttyGS*的设备在设备侧,它可以作为诊断口,modem口,at口来使用。
/kernel/drivers/usb/gadget/f_diag.c--------诊断口,msm7x27a作为一个双cpu共享外设的soc,这个口比较特别,还没有来得及了解。
/kernel/drivers/usb/gadget/f_rndis.c--------remotendis设备驱动。Rndis不同于ecm驱动,它需要固定的占据interface 0和interface1两个接口,否则无法正常工作,但rndis的优势也是明显的,在windows下,它可以实现“免驱”,vista以后,设备上报rndis类型接口,可以不用写pc侧驱动程序。
驱动parameter设置:
Static intset_pid(const char *val, struct kernel_param *kp);
Static intget_pid(char *buffer, struct kernel_param *kp);
Module_param_call(product_id,set_pid,get_pid);
MODULE_PARM_DESC(product_id,”USBdevice product id”);
为module android(android.c)增加一个parameter,通过读取这个parameter,获取当前android复合设备采用的是哪一个pid,通过设置pid,可以达到重新枚举usb复合设备,使用不同的功能组合。如pid:1000对应rndis,pid:1001对应rndis+u盘。
增加完以后,我们会看到多出一个/sys/module/android/parameters/ product_id的文件。
查看当前的设备pid:cat/sys/module/android/parameters/g_product_id
设置当前的设备pid:echo 9024> /sys/module/android/parameters/g_product_id
设备属性设置:
通过增加设备属性,可以达到设备的灵活配置,为f_mass_storage增加一个cdrom和description的设备属性,第一个用于将设备配置成为cdrom和光盘;第二个用于配置设备描述符,8+16+4个字符组成,用于设备的描述符。
StaticDEVICE_ATTR(cdrom,0644,fsg_show_cdrom,fsg_store_cdrom);
Rc=device_create_file(&curlun->dev,&dev_attr_cdrom);
增加完以后,我们会看到多出一个/sys/devices/platform/usb_mass_storage/lun0/cdrom文件,
设置当前的设备的cdrom属性为1—光盘:
echo 1>/sys/devices/platform/usb_mass_storage/lun0/cdrom
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
设备初始化:
/kernel/arch/arm/mach-msm/board-msmxxxx.c
USB驱动文件文件:
/kernel/drivers/usb/gadget/android.c-------复合设备,所有的f开头的接口设备向android.c注册,由android.c控制enable/disable
/kernel/drivers/usb/gadget/f_mass_storage.c--------cdrom/u盘设备,由cdrom参数控制,如果为1上报cdrom,否则上报u盘。
/kernel/drivers/usb/gadget/f_ecm.c--------ecm网络设备,设备侧枚举为usb0
/kernel/drivers/usb/gadget/f_adb.c--------adb驱动
/kernel/drivers/usb/gadget/f_serial.c--------比较常用和通用的一个驱动程序,可以枚举出一个ttyGS*的设备在设备侧,它可以作为诊断口,modem口,at口来使用。
/kernel/drivers/usb/gadget/f_diag.c--------诊断口,msm7x27a作为一个双cpu共享外设的soc,这个口比较特别,还没有来得及了解。
/kernel/drivers/usb/gadget/f_rndis.c--------remotendis设备驱动。Rndis不同于ecm驱动,它需要固定的占据interface 0和interface1两个接口,否则无法正常工作,但rndis的优势也是明显的,在windows下,它可以实现“免驱”,vista以后,设备上报rndis类型接口,可以不用写pc侧驱动程序。
驱动parameter设置:
Static intset_pid(const char *val, struct kernel_param *kp);
Static intget_pid(char *buffer, struct kernel_param *kp);
Module_param_call(product_id,set_pid,get_pid);
MODULE_PARM_DESC(product_id,”USBdevice product id”);
为module android(android.c)增加一个parameter,通过读取这个parameter,获取当前android复合设备采用的是哪一个pid,通过设置pid,可以达到重新枚举usb复合设备,使用不同的功能组合。如pid:1000对应rndis,pid:1001对应rndis+u盘。
增加完以后,我们会看到多出一个/sys/module/android/parameters/ product_id的文件。
查看当前的设备pid:cat/sys/module/android/parameters/g_product_id
设置当前的设备pid:echo 9024> /sys/module/android/parameters/g_product_id
设备属性设置:
通过增加设备属性,可以达到设备的灵活配置,为f_mass_storage增加一个cdrom和description的设备属性,第一个用于将设备配置成为cdrom和光盘;第二个用于配置设备描述符,8+16+4个字符组成,用于设备的描述符。
StaticDEVICE_ATTR(cdrom,0644,fsg_show_cdrom,fsg_store_cdrom);
Rc=device_create_file(&curlun->dev,&dev_attr_cdrom);
增加完以后,我们会看到多出一个/sys/devices/platform/usb_mass_storage/lun0/cdrom文件,
设置当前的设备的cdrom属性为1—光盘:
echo 1>/sys/devices/platform/usb_mass_storage/lun0/cdrom
阅读全文
0 0
- Android USB 驱动分析与开发----编程
- USB固件编程与驱动开发
- Android USB 驱动分析[转]
- Android USB驱动源码分析
- LINUX USB驱动开发(2)-USB驱动体系分析
- Android USB 驱动分析
- Android USB 驱动分析
- Android USB驱动源码分析(-)
- [Linux驱动开发] USB驱动之usb_skel分析
- [Linux驱动开发] USB驱动之usb_skel分析
- Android 设备侧usb驱动开发
- Android 设备侧usb驱动开发
- Android开发USB驱动的工作
- USB OTG驱动分析
- usb驱动分析
- usb鼠标驱动分析
- Linux USB驱动分析
- linux usb驱动分析
- centos搭建lamp php运行环境
- hdu 1003(未完成)
- Featuretools介绍
- 矩阵相乘C语言
- 第十一周LeetCode
- Android USB 驱动分析与开发----编程
- poj 2456 二分
- HBuilder&&WebStorm部分快捷键
- 的风格
- 锤子剪刀布
- poj 3111 K Best 二分
- python 格式化字符串
- 尾插法建立链表分解
- 转载-总结sublime text3安装package control插件的方法