2.6在s3c2410上usb host不工作的直接结果就是提示110错误: 
usb 1-1: device descriptor read/64, error -110
追踪错误代码,我们来看看能不能找到导致这个错误的线索。
include/asm-generic/errno.h 
#define EPROTO 71 /* Protocol error */ 
#define EILSEQ 84 /* Illegal byte sequence */ 
#define ETIMEDOUT 110 /* Connection timed out */
Documentation/usb/error-codes.txt 
-EPROTO (*, **) a) bitstuff error 
b) no response packet received within the 
prescribed bus turn-around time 
c) unknown USB error
-EILSEQ (*, **) a) CRC mismatch 
b) no response packet received within the 
prescribed bus turn-around time 
c) unknown USB error
-ETIMEDOUT (**) No response packet received within the prescribed 
bus turn-around time. This error may instead be 
reported as -EPROTO or -EILSEQ.
由此我们可以判断,这个错误与 usb 设备的超时有关。报告这个错误的地方在drivers/usb/core/hub.c中的hub_port_init部分,由于usb_get_device_descriptor获取 usb 设备信息的时候产生了超时。这样基本可以确定三种情况,1、usb 设备及接口有问题;2、usb core有问题;3、usb driver有问题。 
我们可以很容易地排除1和2的可能性,问题应该在usb driver implement部分造成的。2.6的usb driver把usb规范中对usb接口的操作集中到了core里面,针对不同设备的implement分别归为host、gadget、storage等。基本确定问题就在ohci-s3c2410.c里。
跟踪进入ohci-s3c2410.c,这里面主要完成s3c2410 usb host设备的初始化工作,包括电源、时钟、寄存器等。
其实很多问题在互联网上已经被遇到和解决,我们要做的就是多参考别人的成功经验,这样可以节省时间,同时能够帮助我们找到一些思路。借助google这双强大的翅膀,我们来看看能找到什么:
[url]http://www.linux-usb.org/FAQ.html#ts6[/url]
Q: Why doesn’t USB work at all? I get “device not accepting address”.
A: You may have some problem with your PCI setup that’s preventing your USB host controller from getting hardware interrupts. When Linux submits a request, but never hears back from the controller, this is the diagnostic you’ll see. To see if this is the problem, look at /proc/interrupts to see if the interrupt count for your host controller driver ever goes up. If it doesn’t, this is the problem: either your BIOS isn’t telling the truth to Linux (ACPI sometimes confuses these things, or setting the expected OS to windows in your BIOS), or Linux doesn’t understand what it’s saying.
Sometimes a BIOS fix will be available for your motherboard, and in other cases a more recent kernel will have a Linux fix. You may be able to work around this by passing the noapic boot option to your kernel, or (when you’re using an add-in PCI card) moving the USB adapter to some other PCI slot. If you’re using a current kernel and BIOS, report this problem to the Linux-kernel mailing list, with details about your motherboard and BIOS.
google返回的大量结果中有个建议是设置old_scheme_first标志,让驱动程序优先处理采用老式结构的设备: 
设置old_scheme_first=y 
测试结果并没有太大帮助,不是这个原因引发的。
linux-usb-devel mail list 上Ben大哥正在不断更新他的ohci-s3c2410 driver,但好像还没最终完成。 
[url]http://www.mail-archive.com/linux-usb-devel%40lists.sourceforge.net/msg33670.html[/url]
跟踪ohci-s3c2410.c,发现to_s3c2410_info返回NULL,很明显,是platform_data没有定义,在 include/asm/arch/usb-control.h中已经有struct s3c2410_hcd_info,那么仿照simtec的usb-simtec.c,来构造自己的platform_data。
static struct s3c2410_hcd_info smdk2410_usbcfg = { 
.port[0] = { 
.flags = S3C_HCDFLG_USED 
}, 
};
然后在smdk2410_init中完成初始化:
s3c_device_usb.dev.platform_data = &smdk2410_usbcfg;
重新make zImage,情况有所变化: 
初始化usb controller的过程中有一行debug信息: 
s3c2410-ohci: CTRL: TypeReq=0x2303 val=0x8 idx=0x1 len=0 ==> -115
在include/asm-generic/errno.h中查了一下这个错误代码: 
#define EINPROGRESS 115 /* Operation now in progress */
在Documentation/usb/error-codes.txt中的解释是: 
-EINPROGRESS URB still pending, no results yet 
(That is, if drivers see this it’s a bug.)
这时无论插入什么USB设备,USB鼠标、U盘、USB无线网卡,都报告: 
<6>usb 1-1: new full speed USB device using s3c2410-ohci and address 2 
<7>s3c2410-ohci s3c2410-ohci: urb c3c430c0 path 1 ep0in 5ec20000 cc 5 –> status -110
看上去这两个错误应该存在关联,可能前面的115错误导致了后面的110错误;在跟踪过程中发现115错误是在GetPortStatus时产生的,从这个情况来看,可以暂时屏蔽0hci-s3c2410.c中GetPortStatus的实现部分,继续观察变化,结果还是110错误,因此可以排除115 造成110错误的假设。
最后怀疑是时钟设置的问题,便参照2.4.18的代码在clk_enable(clk);后面加了个udelay(11);但是错误还是没有解决。
那么需要对ohci-s3c2410.c进行详细的排查了,2.6把系统资源进行了详细的分类,这使得驱动程序要完成初始化相应设备寄存器的工作,查遍 ohci-s3c2410.c,竟然没有对s3c24102410的UPLLCON进行设置的代码,问题很可能就在这里,user manual说UPLLCON需要48.00MHz output, 于是在s3c2410_start_hc里增加:
__raw_writel((0x78<<12)|(0x02<<4)|(0x03), S3C2410_UPLLCON);
OK!usb host可以工作了,但是在第一次上电还会出现110错误,reset后才可以正常,2410上的这个UPLLCON问题由来已久,2.4内核也经常出现,原因是UPLLCON的值没有设置成功,那么就需要对设置的值进行检查,直到成功为止。
把上面的代码修改为: 
unsigned long upllvalue = (0x78<<12)|(0x02<<4)|(0x03);
while (upllvalue != __raw_readl(S3C2410_UPLLCON)) 

__raw_writel(upllvalue, S3C2410_UPLLCON); 
mdelay(1); 
}

转载于:https://blog.51cto.com/ironpeak/99113

一步一步解决 kernel 2.6 usb host driver相关推荐

  1. 一步一步SharePoint 2007之十七:解决实现Form认证后无法再用SharePoint Designer编辑网站的问题...

    一步一步SharePoint 2007之十七:解决实现Form认证后无法再用SharePoint Designer编辑网站的问题 摘要 前面的文章中,我曾提到,Form认证目前还有缺陷,就是实现For ...

  2. 【ARM】一步一步移植Linux Kernel 2.6.13到板子

    1环境搭建所需材料 2环境搭建所需材料之间的关系 3所使用的开发板 4译内核 1修改makefile 2拷贝配置文件 3编译得到zImage 4把zImage转成uImage 5开发板串口连接 6ub ...

  3. MySQL5.5安装到最后一步卡住的解决办法(即使删除了隐藏文件内C:\ProgramData的MySQL以后还是没解决问题)

    MySQL5.5安装到最后一步卡住的解决办法(即使删除了隐藏文件内C:\ProgramData的MySQL以后还是没解决问题) 参考文章: (1)MySQL5.5安装到最后一步卡住的解决办法(即使删除 ...

  4. iOS审核4.3被拒? 别担心,这几步帮你解决重复应用问题

    iOS审核4.3被拒? 别担心,这几步帮你解决重复应用问题 最近有许多开发者遇到了因为审核条款 4.3(后文统一简称 4.3)审核条款 4.3(后文统一简称 4.3),这种情况 常见于大家上传重复应用 ...

  5. 为什么计算机桌面图标不见了,桌面上的图标不见了怎么办(电脑桌面图标突然没了怎么办?简单三步教你解决)...

    使用电脑过程中,我们有时候会发现桌面上的图标不见了,或者我们不小心误删了,这时候我们又急着是用电脑,怎么办呢?在这里网际简单三步教你解决!以win10系统来教大家怎么找回我的桌面电脑图标如下简单3步: ...

  6. 步进电机失步(丢步)怎么解决?

    步进电机失步(丢步)怎么解决? 所谓步进电机失步,就是电机没有按照命令走相应的步数.通常过大的运行步距,会导致高振荡,因为过大的步距,需要很大的扭矩,大扭矩又会产生大加速度,进而容易产生过冲和铃响(振 ...

  7. 电脑打印机显示服务器脱机怎么弄,打印机显示脱机怎么办 只需四步就能解决...

    想必大家在使用打印机的时候肯定遇到过各种各样的问题,打印机脱机就是我们在使用的过程中较为常见的,打印机一旦显示脱机的话打印机就无法正常工作了我们也无法再继续打印东西了,这对于我们来说是一件非常令人头疼 ...

  8. 教你一步一步用C语言实现sift算法、上

    原文:http://blog.csdn.net/v_july_v/article/details/6245939 引言:     在我写的关于sift算法的前倆篇文章里头,已经对sift算法有了初步的 ...

  9. 【Linux】一步一步学Linux——route命令(169)

    00. 目录 文章目录 00. 目录 01. 命令概述 02. 命令格式 03. 常用选项 04. 参考示例 05. 附录 01. 命令概述 route命令用来显示并设置linux内核中的网络路由表, ...

最新文章

  1. OpenCV读写图像文件解析
  2. 微信小程序自定义组件Component的简单使用
  3. 陈中华:李彦宏候选工程院院士,是全中国人民的大耻辱
  4. 直播平台搭建中你需要注意的小细节
  5. Selenium + Grid + Testng并发运行用例
  6. 洛谷 - P2617 Dynamic Rankings(树状数组套主席树)
  7. Java 计算两个日期时间差,天数、时、分、秒
  8. 【LeetCode笔记】160. 相交链表(Java、链表)
  9. python捕获所有异常状态_如何在scrapy中捕获并处理各种异常
  10. python傅里叶变换库_python的numpy库和cv2库实现图像傅里叶变换
  11. matlab怎么利用圆形度提取园,基于Matlab+GUI图像处理的物料粒度与圆形度测试.pdf...
  12. 楼盘管理系统_秦皇岛全新交通大动脉迎官宣 沉寂的潜力楼盘迎抄底窗口
  13. java使用derby增删改查_JDBC 笔记3 通过PreparedStatement 对数据库进行增删改查 (转载)...
  14. vuex的购物车效果 index.js
  15. Inpaint破解版 - 图片去水印神器
  16. 香港流行乐黄金二十年——经典歌手(音乐人)全面回顾 一
  17. 手机邮件html样式,iPhone技巧篇 如何添加HTML风格邮件签名
  18. 安装SqlServer 2008 R2时出现程序兼容性问题
  19. 8款炫酷的HTML5特效源码
  20. 量化、交易、策略、算法精选论文汇总,建议收藏

热门文章

  1. 零基础学怎么学Java_零基础学java难么?怎么自学?
  2. 第十七届全国大学生智能车竞赛:英飞凌芯片第二批申请开放
  3. 2021年人工神经网络第一次作业要求
  4. sklearn中分类器的比较
  5. BT33F双基二极管
  6. TPS54360 输入60V,输出3.5A降压开关电压
  7. 第五届全国大学生智能汽车竞赛获奖名单
  8. 我们需要的不仅仅是一个车模轨迹
  9. 浏览新闻oracle的数据结构,oracle 数据结构探索之旅二 [2]
  10. python知网查重_用Python写了个检测抄袭/文章去重算法(nshash)