主题 : USB Gadget 驱动和VIVI有冲突吗? 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 580
精华: 0
发帖: 9
金钱: 90 两
威望: 9 点
贡献值: 0 点
综合积分: 18 分
注册时间: 2008-04-25
最后登录: 2008-05-28
楼主  发表于: 2008-04-25 16:34

 USB Gadget 驱动和VIVI有冲突吗?

QQ2440真的很好用!!!但是我在配置上usb gadget serial 驱动后经常和vivi中的USB配置发生冲突,连上PC后windows总是分不清是哪个设备,但是去掉VIVI的USB功能后usb gadget serial 又失效了,望解答!!!!!
我是thumb
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
贡献值: 71 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
1楼  发表于: 2008-04-25 17:09
把问题描述的清楚一些,QQ2440的配置,操作的步骤,PC端环境....

另外,我建议你先检查一下PC端USB Gadget serial驱动的PID和VID是否和vivi所用的USB驱动PID,VID相同
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 580
精华: 0
发帖: 9
金钱: 90 两
威望: 9 点
贡献值: 0 点
综合积分: 18 分
注册时间: 2008-04-25
最后登录: 2008-05-28
2楼  发表于: 2008-04-26 13:18
我采用vivi+linux+yaffs的方式开发系统,在Windows端安装usb驱动(secBulk.sys)后,系统能正常与Windows通讯。我的工程要求把arm9配置成usb device,与windows完成数据通讯,因此我在linux内核(基于qq2440自带的内核)中添加了usb gadget serial的功能,此时在内核启动后把qq2440作为usb设备接入pc后windows将识别为“Gadget Serial”,并提示安装驱动。
问题在于:vivi(支持usb)和linux内核的启动是两个连续的过程,在usb线缆始终与pc保持连接的情况下对qq2440加电,windows有时将qq2440识别为vivi定义的usb设备(SEC..TEST..device),有时识别为linux内核定义的usb设备(Gadget Serial)。
我曾经尝试过用不支持usb的vivi作为bootloader引导系统,希望能够避免上述情况,但是两种USB配置都失效了,windows不能检测到任何usb设备!!!,我所以想请教一下,是不是在bootloader中必须完成一部分usb相关的硬件初始化,否则不能linux内核中成功配置USB??谢谢!
我是thumb
级别: 新手上路
UID: 580
精华: 0
发帖: 9
金钱: 90 两
威望: 9 点
贡献值: 0 点
综合积分: 18 分
注册时间: 2008-04-25
最后登录: 2008-05-28
3楼  发表于: 2008-04-26 13:21
补充说明一下,两种USB配置下的VID和PID是不一样的,我在Windows的设备管理器下检查过,否则windows更分不清了谁是谁了!!呵呵
我是thumb
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
贡献值: 71 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
4楼  发表于: 2008-04-26 19:40
引用第2楼johnny_chan于2008-04-26 13:18发表的  :
我采用vivi+linux+yaffs的方式开发系统,在Windows端安装usb驱动(secBulk.sys)后,系统能正常与Windows通讯。我的工程要求把arm9配置成usb device,与windows完成数据通讯,因此我在linux内核(基于qq2440自带的内核)中添加了usb gadget serial的功能,此时在内核启动后把qq2440作为usb设备接入pc后windows将识别为“Gadget Serial”,并提示安装驱动。
问题在于:vivi(支持usb)和linux内核的启动是两个连续的过程,在usb线缆始终与pc保持连接的情况下对qq2440加电,windows有时将qq2440识别为vivi定义的usb设备(SEC..TEST..device),有时识别为linux内核定义的usb设备(Gadget Serial)。
我曾经尝试过用不支持usb的vivi作为bootloader引导系统,希望能够避免上述情况,但是两种USB配置都失效了,windows不能检测到任何usb设备!!!,我所以想请教一下,是不是在bootloader中必须完成一部分usb相关的硬件初始化,否则不能linux内核中成功配置USB??谢谢!


我想你的猜测是很可能的,Linux kernel里可能没有做完整的硬件初始化。要证明这一点,需要对比带有USB功能的vivi和Linux kernel里对UDC的初始化流程。另外,还要注意原理图上的GPG12 - USB_EN pin, 要使用USB device功能,必须把USB_EN置高
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 580
精华: 0
发帖: 9
金钱: 90 两
威望: 9 点
贡献值: 0 点
综合积分: 18 分
注册时间: 2008-04-25
最后登录: 2008-05-28
5楼  发表于: 2008-04-28 10:56
感谢您的耐心答复!问题解决完后我会给出经验共享
我是thumb
级别: 新手上路
UID: 580
精华: 0
发帖: 9
金钱: 90 两
威望: 9 点
贡献值: 0 点
综合积分: 18 分
注册时间: 2008-04-25
最后登录: 2008-05-28
6楼  发表于: 2008-04-28 11:54
确实是由于usb_en信号没有抬高导致的,看来vivi(支持usb)加入了usb_en置高的功能,而原版本的vivi则没有,建议在厂家在新的qq2440手册中加以补充说明。linux内核对usb的初始化是独立于vivi的!!!另外一个是,设立usb-en这个功能还是有必要的,在配置完usb device后再软件置高,pc端就能识别相应的设备,如果简单的硬件强行置高的话,windows容易识别为“未知usb设备”,弱弱的问一下,qq2440的gpio操作是如何实现的,内核中提供了gpio的驱动吗?或者是需要直接操作gpio控制寄存器来实现?谢谢
我是thumb
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
贡献值: 71 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
7楼  发表于: 2008-04-28 12:14
你的经验对大家很有帮助,谢谢!
希望你能给出在正对目前Linux 2.6.13上实现USB Gadget 功能的patch

2.6.13内核里包含了GPIO驱动,源代码在arch/arm/mach-s3c2410/gpio.c
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 580
精华: 0
发帖: 9
金钱: 90 两
威望: 9 点
贡献值: 0 点
综合积分: 18 分
注册时间: 2008-04-25
最后登录: 2008-05-28
8楼  发表于: 2008-04-28 14:35
我在driver/usb/gadget/serial.c文件的gs_module_init函数最后添加了
s3c2410_gpio_cfgpin(S3C2410_GPG12, S3C2410_GPG12_OUTP);
s3c2410_gpio_setpin(S3C2410_GPG12, 1);
两条语句用于使能USB Gadget设备,并且在PC端用WindDriver或DriverStudio编写简单的代码能实现通讯;
gadget serial驱动仍然存在的问题是:
1)不支持反复热插拔,加电的情况下第二次接入pc后arm端会报错
2)仍然存在windows无法正确识别gadget serial设备的问题,开发板10次加电大概有1次windows识别为未知设备,怀疑是gadget驱动本身的问题,对usb协议了解不多,请楼主指点一二
我是thumb
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
贡献值: 71 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
9楼  发表于: 2008-04-28 14:43
很抱歉,我对USB协议了解也不多。
不过我觉得USB_EN的操作不应该放在driver/usb/gadget/serial.c, 对USB_EN的操作属于硬件平台相关初始化,应该放在arch/arm/mach-s3c2410/mach-sbc2440.c里的合适的一个地方。driver/usb/gadget/serial.c 属于协议上的function driver,与硬件平台无关,不需要针对某一特定的硬件平台做修改。

另外,你可以打开S3C2440 UDC driver (drivers/usb/gadget/s3c2410_udc.c)里的debug信息
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."