Linux上USB移植错误解决笔记
在内核目录下先配置支持USB设备,无论你是什么设备,这一步都是必须的,USB驱动和其他的驱动不同,它分为USB设备驱动,另外还有USB-Host主机控制器的驱动,配置如下:
Device Drivers --->
SCSI device support --->
<*> SCSI device support
<*> SCSI disk support
以上是为了支持U盘挂载,U盘在Linux中被识别为SCSI设备。
Device Drivers --->
<*> USB Monitor
<*> OHCI HCD support
[*] USB device filesystem (DEPRECATED)
[*] USB device class-devices (DEPRECATED)
[*] Dynamic USB minor allocation
这就可以了,这几项是必须选的,因为这里面的OHCI HCD是主机控制器的驱动,不选的话,就算你USB设备驱动写出来了,也无法被主机识别。
接下来再选一下HID设备:
[*] HID Devices --->
这个可以自主的选择,我关注的是主机控制器的驱动:
直接编译内核,烧写,启动,弹出错误,插入USB设备:
usb 1-1: device descriptor read/64, error -62
usb 1-1: device descriptor read/64, error -62
usb 1-1: new full speed USB device using s3c2410-ohci and address 3
usb 1-1: device descriptor read/64, error -62
usb 1-1: device descriptor read/64, error -62
usb 1-1: new full speed USB device using s3c2410-ohci and address 4
usb 1-1: device not accepting address 4, error -62
usb 1-1: new full speed USB device using s3c2410-ohci and address 5
usb 1-1: device not accepting address 5, error -62
hub 1-0:1.0: unable to enumerate USB device on port 1
最后一句的意思是,设备枚举失败,error -62的意思时超时错误。从这里可以看出,系统应该是识别到了USB设备,但是设备却无法工作,而且可以断定是USB主机控制器的错误。的确如此,百度一下,网上说这是时钟错误,也就是USB是时钟没有起来,对于2440,USB时钟需要工作在48M。修改内核源码:
添加时钟初始化的代码,这个网上有很多版本,自己随意去找一个,无非就是给UPLLCON寄存器写个数值进去。这里我就不详细介绍了,但是我不知道为什么,我在内核中添加时钟初始化代码,就是写入UPLLCON寄存器,写入了0x00038022,这是配置USB时钟为48M的数值,但是很不幸,写入是成功的,我把这个寄存器的值重新读出来,printk了一下,也是对的。编译,下载,测试,照样出错。
也就是说USB时钟还是不工作。遇到这种情况,看数据手册去,手册上说配置PLL的时候,有MPLLCON和UPLLCON两个寄存器,要先配置UPLLCON,再配置MPLLCON寄存器,而MPLLCON在哪配置的呢,原来是这样,也就是说我们配置顺序不对,所以在内核中配置UPLLCON会失败,那我们就去改改u-boot代码吧,在u-boot的start.S中添加UPLLCON的配置,也就三行代码:
ldr r0,= 0x4c0000008;
ldr r1,=0x000038022;
str r1, [r0]
这三句要加在MPLLCON之前,同时在两次配置之间至少要起个nop指令的间隔,这是数据手册要求的。
重新烧写u-boot,启动内核,插入USB无线鼠标,奇迹出现了,
usb 1-1: new low speed USB device using s3c2410-ohci and address 3
usb 1-1: New USB device found, idVendor=1bcf, idProduct=05ca
usb 1-1: New USB device strings: Mfr=0, Product=2, SerialNumber=0
usb 1-1: Product: 2.4GHz 2way RF Receiver
usb 1-1: configuration #1 chosen from 1 choice
input: 2.4GHz 2way RF Receiver as /class/input/input1
generic-usb 0003:1BCF:05CA.0001: input,hidraw0: USB HID v1.00 Keyboard [2.4GHz 2way RF Receiver] on usb-s3c24xx-1/input0
input: 2.4GHz 2way RF Receiver as /class/input/input2
generic-usb 0003:1BCF:05CA.0002: input,hiddev0,hidraw1: USB HID v1.00 Mouse [2.4GHz 2way RF Receiver] on usb-s3c24xx-1/input1
识别出来了,OK,移植成功。之前在内核源码部分改了将近一天,但是还是不行。不知道有些人为什么改内核源码却成功了,唯一的解释就是内核的版本不同,可能会有一些差异,所以在这里我的建议是你先改内核源码,这个网上有很多介绍,如果改完了不行,就用我这里介绍的改u-boot的源码,你可以仔细阅读一些数据手册。
我做这个移植,搞了将近两天,我从来没有想到问题是在bootloader上面,因为现在在准备考研阶段,也就是没事随便搞搞,今天上午,差点就放弃了,去看考研书去了。当初要是放弃了,真的,那么昨天的一天真就白花了,浪费了一天还啥都没搞明白,所以又坚持了一下,总算搞定了,所以凡事都要不要轻言放弃,想放弃的时候想想当初为何走到这一步……
PS:我们的荣誉不是在于永远成功,而是在于失败和绝望时能找到重新站起来的希望,勇敢的面对困难战胜困难。
冰雪王爵.obj
2014年6月10日
Linux上USB移植错误解决笔记的更多相关文章
- 16C554在LINUX上的移植(AT91)
16C554在LINUX上的移植(AT91) linux版本:3.14.17 AT91SAMa5d36 EINTA_0 ARM-IO5 PA14 14 EINTA ...
- 在 Linux 上找出并解决程序错误的主要方法【转】
转自:https://www.ibm.com/developerworks/cn/linux/sdk/l-debug/index.html 本文讨论了四种调试 Linux 程序的情况.在第 1 种情况 ...
- nginx for linux安装及安装错误解决
nginx:下载地址:http://www.nginx.org/ 1.GCC编译器 安装指令 :yum install -y gcc 如果你所使用的是ubuntu,则安装指令为:apt-get i ...
- Webpack学习错误解决笔记
错误1:在用npm install 安装模块时,时常会出现没有以下类似的错误 解决方法:右键点击node_modules文件夹,选取属性,将文件夹只读选项去除 错误2:在学习到清理/dist文件夹这块 ...
- linux上wps2019不能启动解决方法
本人linux上的wps2016升级成wps2019后启动不了,双击图标没反应,在命令行输入wps,提示"/lib64/libc.so.6: version `GLIBC_2.18' not ...
- Boa服务器在ARM+Linux上的移植
下面给大家介绍一下Boa服务器移植的具体操作步骤,希望能够有帮助. 环境 主机:ubuntu8.10 交叉工具链:gcc-3.4.5-glibc-2.3.6 ...
- glib wpa_supplicant Unix上库编译错误解决与总结
编译Linux下的库是一件痛苦的事情,这里主要阐述glib和wpa_supplicant库的编译,因各自的依赖关系,另外一些库要事先编译.glib依赖libffi和zlib,而wpa_supplica ...
- vm NAT方式linux上不了网 解决方法
环境: vm版本:vm 11.0.0 系统:本机win7 虚拟机:centos 5.5 问题,当vm设置虚拟机上网方式为NAT方式时,两台虚拟centos能互相ping通.主机能拼通虚拟机,但虚拟 ...
- spring mvc MultipartFile 上传文件错误解决
Field error in object 'xxxx' on field 'xxxx': rejected value [20129259128131.jpg]; codes [typeMismat ...
随机推荐
- 【BZOJ1671】[Usaco2005 Dec]Knights of Ni 骑士 BFS
[Usaco2005 Dec]Knights of Ni 骑士 Description 贝茜遇到了一件很麻烦的事:她无意中闯入了森林里的一座城堡,如果她想回家,就必须穿过这片由骑士们守护着的森林.为 ...
- NOIP2015D1
好像来的有点晚,但我的确现在刚做这套题 T1神奇的幻方 题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可 ...
- BZOJ3687 计算子集和的异或和
题不知道怎么不见了,bzoj上已经没了3687这题了 题意:给你一个n 然后输入n个数 求这n个数的所有子集的和的异或和 思路:用bitset记录某个数是否在子集和中出现,利用bitset对二进制位的 ...
- java.math.RoundingMode 几个参数详解
java.math.RoundingMode里面有几个参数搞得我有点晕,现以个人理解对其一一进行总结: 为了能更好理解,我们可以画一个XY轴 RoundingMode.CEILING:取右边最近的整数 ...
- Android weight属性详解
android:layout_weight是一个经常会用到的属性,它只在LinearLayout中生效,下面我们就来看一下: 当我们把组件宽度设置都为”match_parent”时: <Butt ...
- ArcEngine奇怪异常:HRESULT:0x80040351
错误如图 根据该博客,http://blog.csdn.net/u011609113/article/details/51155116, 显示该错误为Duplicate Field Names wit ...
- CI,从数据库读取数据
1.准备数据库,(用户,密码,数据库服务的地址) 2.CI链接数据库,配置database.php(配置文件) //application/config/database.php 3.准备 ...
- php http头设置相关信息
HTTP 状态码 状态码用来告诉HTTP客户端,HTTP服务器是否产生了预期的Response. HTTP/1.1中定义了5类状态码, 状态码由三位数字组成,第一个数字定义了响应的类别 1XX 提示信 ...
- php变量和数组大小限制
前言:shopnc在默认拼接sql的时候会带上limit 1000 那么问题就来了,如果在使用系统的封装的方法,但是如果你没有带上->limit(false)就完蛋了 那么问题来了,在判断时候, ...
- 掌握Thinkphp3.2.0----连贯操作
其实在TP中,说起来语句中的各个关键词都被封装成了函数,将各个由关键词演变来的函数连起来就是所谓的连贯操作.只要注意各个函数直接参数传递的区别就可以了. 再者,不是所有的函数都可以进行连贯操作!!!比 ...