上位机:ubuntu14.04 64bit

下位机:qq2440

交叉编译器:arm-linux-gcc 3.4.1

下位机使用的linux内核版本:kernel2.6.13

1.插入u盘时错误信息如下:

[root@FriendlyARM /home]# usb 1-1: new full speed USB device using s3c2410-ohci and address 6
usb 1-1: device descriptor read/64, error -110
usb 1-1: device descriptor read/64, error -110
usb 1-1: new full speed USB device using s3c2410-ohci and address 7
usb 1-1: device descriptor read/64, error -110
usb 1-1: device descriptor read/64, error -110
usb 1-1: new full speed USB device using s3c2410-ohci and address 8
usb 1-1: device not accepting address 8, error -110
usb 1-1: new full speed USB device using s3c2410-ohci and address 9
usb 1-1: device not accepting address 9, error -110

2.解决方案如下:

2.1修改drivers/usb/host/ohci-s3c2410.c文件,添加以下内容:

  a.先添加头文件#include <mach/regs-clock.h>

  b.在s3c2410_start_hc函数中添加以下内容:

bash/shell Code复制内容到剪贴板
  1. unsignedlongupllvalue=(0x78<<12)|(0x02<<4)|(0x03);
  2. while(upllvalue!=__raw_readl(S3C2410_UPLLCON)){
  3. __raw_writel(upllvalue,S3C2410_UPLLCON);
  4. mdelay(1);
  5. }

  添加后的s3c2410_start_hc函数如下:

bash/shell Code复制内容到剪贴板
  1. staticvoids3c2410_start_hc(structplatform_device*dev,structusb_hcd*hcd)
  2. {
  3. structs3c2410_hcd_info*info=dev->dev.platform_data;
  4. dev_dbg(&dev->dev,"s3c2410_start_hc:\n");
  5. clk_enable(clk);
  6. if(info!=NULL){
  7. info->hcd=hcd;
  8. info->report_oc=s3c2410_hcd_oc;
  9. if(info->enable_oc!=NULL){
  10. (info->enable_oc)(info,1);
  11. }
  12. }
  13. unsignedlongupllvalue=(0x78<<12)|(0x02<<4)|(0x03);
  14. while(upllvalue!=__raw_readl(S3C2410_UPLLCON)){
  15. __raw_writel(upllvalue,S3C2410_UPLLCON);
  16. mdelay(1);
  17. }
  18. }

  2.2总结:以上修改的函数功能是启动主机控制器,因为usb时钟设置有问题,因而在开启主机控制器时修改时钟,修改后的S3C2410_UPLLCON的值为0xF4100008;

3.注意:本版本内核没有头文件regs-clock.h,因而我从其他内核中复制过来的,命令如下:

jello@jello-Inspiron-N4050:~/Downloads/qq2440/linux/kernel-2.6.13$ cp /tftpboot/kernel-2.6.35.7/arch/arm/mach-s3c2410/include/mach/regs-clock.h ./

发表回复