2440/2410上将usb device改成usb host

发布者:InspiredDreamer最新更新时间:2016-07-11 来源: eefocus关键字:usb  device  host 手机看文章 扫描二维码
随时随地手机看文章
之前的开发,要在2440上使用两个usb host口,一个接摄像头,一个接无线网卡。但友善之臂mini2440板子只有一个usb host口,曾想通过外接一个usb hub来解决,无线网卡接hub没有问题,但是摄像头插到hub上总是有错误:

          usb 1-1: reset full speed USB device using s3c2410-ohci and address 3
          usb 1-1.2: new full speed USB device using s3c2410-ohci and address 4
          usb 1-1.2: device descriptor read/64, error -62
          usb 1-1.2: device descriptor read/64, error -62
          usb 1-1.2: new full speed USB device using s3c2410-ohci and address 5
          usb 1-1.2: device descriptor read/64, error -62
          usb 1-1.2: device descriptor read/64, error -62
          usb 1-1.2: new full speed USB device using s3c2410-ohci and address 6
          usb 1-1.2: device not accepting address 6, error -62
          usb 1-1.2: new full speed USB device using s3c2410-ohci and address 7
          usb 1-1.2: device not accepting address 7, error -62
          hub 1-1:1.0: unable to enumerate USB device on port 2

本来想试着修改内核中关于hub.c和ohci-s3c2410中的代码,看看能不能好使,但后来在PC机上的hub下使用摄像头也不好使,看来是我使用的zc301摄像头对hub不支持吧。(估计一般的摄像头都对hub不支持,我又试了另一款也是这样的)。

    所以放弃了在usb hub上使用摄像头的想法。记得以前看过关于s3c2410的手册,它应该是支持2个usb host通道的啊,2440应该也是如此。所以仔细看了下s3c2440的手册,发现第二个usb hos通道的管脚和usb device的管脚是复用的。所以感觉将usb device改成host应该是可行的,深入研究研究。(好像一些板子已经设计出来可以跳线选择,友善之臂的没这么设计)

    要将usb device改成host,不只是硬件上需要改动,软件驱动上肯定也需要改动,所以分为硬件和软件两个部分。

    硬件上:仔细看了mini2440的手册中的关于usb电路图,其实硬件电路上host和device没什么本质区别,一些外拉电阻不一样,VBUS的提供者不一样。将device改成host感觉外拉电阻不一样应该也不会影响使用,所以就没有改变,避免在板子上做手脚。其它的就是要给VBUS一个5v的电源,而不是像device一样电脑供电了。其它的就没什么改动了。自己动手做了一个usb host口。

    软件上:本质就是对寄存器MISCCR的设置改变一下,为了以后改动方便,我参考了网上的一些《关于阳初2440 超值版只能使用一个 USB Host 问题的解决》的方法。以下主要参照了一些关于这个方法的帖子博客之类的。(转载一些)

第一篇:

修改linux-2.6.20.3/drivers/usb/host/Kconfig,添加:

 

    config MAX_ROOT_PORTS

    int "Maximum port(s) of RootHub"

    depends on USB_OHCI_HCD && ARCH_S3C2410

    default 1

    ---help---

    pls select usb host number,default one host and one     device.so We select one normally

 

    修改/linux-2.6.20.3/drivers/usb/host/ohci-s3c2410.c

    static int usb_hcd_s3c2410_probe (const struct hc_driver *driver,

                  struct platform_device *dev)

    {

       struct usb_hcd *hcd = NULL;

       int retval;

       //add by hiboy

       unsigned long tmp;

       #if CONFIG_MAX_ROOT_PORTS < 2

          /* 1 host port, 1 slave port*/

          tmp = __raw_readl(S3C2410_MISCCR);

          tmp &= ~S3C2410_MISCCR_USBHOST;

           __raw_writel(tmp, S3C2410_MISCCR);

          s3c2410_usb_set_power(dev->dev.platform_data, 1, 1);

       #else

         /* 2 host port */

        tmp = __raw_readl(S3C2410_MISCCR);

        tmp |= S3C2410_MISCCR_USBHOST;

        __raw_writel(tmp, S3C2410_MISCCR);

        s3c2410_usb_set_power(dev->dev.platform_data, 1, 1);

        s3c2410_usb_set_power(dev->dev.platform_data, 2, 1);

       #endif

 

 

    //s3c2410_usb_set_power(dev->dev.platform_data, 1, 1);

    //s3c2410_usb_set_power(dev->dev.platform_data, 2, 1);

 

    ......

 

    修改/linux-2.6.20.3/drivers/usb/core/hub.c

    static int hub_configure(struct usb_hub *hub,

    struct usb_endpoint_descriptor *endpoint)

    {

       struct usb_device *hdev = hub->hdev;

       struct device *hub_dev = hub->intfdev;

       u16 hubstatus, hubchange;

       u16 wHubCharacteristics;

       unsigned int pipe;

       int maxp, ret;

       char *message;

 

       hub->buffer = usb_buffer_alloc(hdev, sizeof(*hub->buffer), GFP_KERNEL,

            &hub->buffer_dma);

       if (!hub->buffer) {

          message = "can't allocate hub irq buffer";

          ret = -ENOMEM;

          goto fail;

       }

 

       hub->status = kmalloc(sizeof(*hub->status), GFP_KERNEL);

       if (!hub->status) {

          message = "can't kmalloc hub status buffer";

          ret = -ENOMEM;

          goto fail;

       }

      mutex_init(&hub->status_mutex);

 

      hub->descriptor = kmalloc(sizeof(*hub->descriptor), GFP_KERNEL);

      if (!hub->descriptor) {

          message = "can't kmalloc hub descriptor";

          ret = -ENOMEM;

          goto fail;

      }

 

    /* Request the entire hub descriptor.

     * hub->descriptor can handle USB_MAXCHILDREN ports,

     * but the hub can/will return fewer bytes here.

     */

    ret = get_hub_descriptor(hdev, hub->descriptor,

            sizeof(*hub->descriptor));

    if (ret < 0) {

        message = "can't read hub descriptor";

        goto fail;

    } else if (hub->descriptor->bNbrPorts > USB_MAXCHILDREN) {

        message = "hub has too many ports!";

        ret = -ENODEV;

        goto fail;

    }

 

    /********************************************/

    /*add by hiboy */

    #ifdef CONFIG_ARCH_S3C2410

    if ((hdev->devnum == 1) // Root Hub

    && hub->descriptor->bNbrPorts > CONFIG_MAX_ROOT_PORTS) {

    int j;

    for (j=hub->descriptor->bNbrPorts-1; j>=0; j--) {

        printk("port #%d ", j);

        if (j > CONFIG_MAX_ROOT_PORTS-1) {

        printk("suspened!\n");

        } else {

        printk("alived!\n");

        }

    }

    hub->descriptor->bNbrPorts = CONFIG_MAX_ROOT_PORTS;

    }

    #endif

    /*********************************************/

第二篇:

    是由于MISCCR寄存器没有正确设置的缘故,我在mach-2410.c中增加了设置MISCCR寄存器的内容,HOST0就可以正常使用了

    /*add by seigpao*/

    int usb_seigpao_init(void)

    {

      unsigned long upllvalue;

      unsigned long misccr;

      //设置UPLLCON

      upllvalue = (0x78<<12)|(0x02<<4)|(0x03);

      __raw_writel(upllvalue,S3C2410_UPLLCON);

 

      //设置MISCCR

      misccr = __raw_readl(S3C2410_MISCCR);

      misccr |= S3C2410_MISCCR_USBHOST;

      misccr &= ~(S3C2410_MISCCR_USBSUSPND0 | S3C2410_MISCCR_USBSUSPND1);

      __raw_writel(misccr,S3C2410_MISCCR);

 

      return 1;

    }

    /* end by seigpao */

 

    static void __init smdk2410_map_io(void)

    {

        s3c24xx_init_io(smdk2410_iodesc, ARRAY_SIZE(smdk2410_iodesc));

        s3c24xx_init_clocks(0);

        s3c24xx_init_uarts(smdk2410_uartcfgs, ARRAY_SIZE(smdk2410_uartcfgs));

        s3c24xx_set_board(&smdk2410_board);

 

        /*add by seigpao*/

        //设置2410触摸屏

        set_s3c2410ts_info(&sbc2410_ts_cfg);

 

        //设置USB相关寄存器

        usb_seigpao_init();

        /* end by seigpao */

     }

    不知道为什么会有第二篇,感觉不适合,所以又重网上找了另一篇文章。

修改ohci-s3c2440.c文件(含头文件):


    #include


    #include


    #include

 

    /*add here*/


    #include


    #include


    #include

    #include


    /*end here*/

 

 

#define valid_port(idx) ((idx) == 1 || (idx) == 2)

 

 


/*add here*/


static void s3c2410_start_hc(struct platform_device *dev, struct usb_hcd *hcd)


{


      unsigned long upllvalue = (0x78<<12)|(0x02<<4)|(0x03); //add upllvalue


      unsigned long misccr; //add misccr


      struct s3c2410_hcd_info *info = dev->dev.platform_data;


      while (upllvalue != __raw_readl(S3C2410_UPLLCON)) //setup UPLLCON


      {


      __raw_writel(upllvalue, S3C2410_UPLLCON);


      mdelay(1);

      }

      misccr = __raw_readl(S3C2410_MISCCR); //MISCCR


      misccr |= S3C2410_MISCCR_USBHOST;


      misccr&=~(S3C2410_MISCCR_USBSUSPND0|S3C2410_MISCCR_USBSUSPND1);


      __raw_writel(misccr,S3C2410_MISCCR);

 

      dev_dbg(&dev->dev, "s3c2410_start_hc:\n");


      clk_enable(clk);

      if (info != NULL) {


          info->hcd   = hcd;


          info->report_oc = s3c2410_hcd_oc;

         if (info->enable_oc != NULL) {


              (info->enable_oc)(info, 1);

          }


}


     }

     使用了这篇文章的改动。头文件位置可能根据内核不同做相应改动。我的2.6.29内核中的regs-clock.h和regs-gpio.h是在arch\arm\mach-s3c2410\include\mach中。我拷贝两个头文件到本地drivers/usb/host/,include 变成""。

    然后make zImage,之后Kconfig会重新选择,

    USB support (USB_SUPPORT) [Y/n/?] y

    Support for Host-side USB (USB) [Y/n/m/?] y

    USB verbose debug messages (USB_DEBUG) [N/y/?] n

    USB announce new devices (USB_ANNOUNCE_NEW_DEVICES) [Y/n/?] y

    *

    * Miscellaneous USB options

    *

    USB device filesystem (USB_DEVICEFS) [Y/n/?] y

    USB device class-devices (DEPRECATED) (USB_DEVICE_CLASS) [N/y/?] n

    Dynamic USB minor allocation (USB_DYNAMIC_MINORS) [N/y/?] n

    USB Monitor (USB_MON) [N/m/y/?] n

    Enable Wireless USB extensions (EXPERIMENTAL) (USB_WUSB) [N/m/y/?] n

    Support WUSB Cable Based Association (CBA) (USB_WUSB_CBAF) [N/m/y/?] n

    *

    * USB Host Controller Drivers

    *

    Cypress C67x00 HCD support (USB_C67X00_HCD) [N/m/y/?] n

    OXU210HP HCD support (USB_OXU210HP_HCD) [N/m/y/?] n

    ISP116X HCD support (USB_ISP116X_HCD) [N/m/y/?] n

    OHCI HCD support (USB_OHCI_HCD) [Y/n/m/?] y

    SL811HS HCD support (USB_SL811_HCD) [N/m/y/?] n

    R8A66597 HCD support (USB_R8A66597_HCD) [N/m/y/?] n

    Host Wire Adapter (HWA) driver (EXPERIMENTAL) (USB_HWA_HCD) [N/m/y/?] n

Maximum port(s) of RootHub (MAX_ROOT_PORTS) [2] (NEW)

   最后一项选的时候选成2就行了,因为config MAX_ROOT_PORTS为2代表使用两个host。

   烧写生成的内核,结果大失所望,启动后在自己焊出的usb host口上插上设备没反应。不过郁闷重启之时,发现先在这之上插上设备启动时,设备就能识别出来了。而且插入无线网卡可以配置使用。不过使用摄像头确出现错误:

gspca: ISOC data error: [1] len=318, status=-84

gspca: ISOC data error: [4] len=274, status=-84

gspca: ISOC data error: [25] len=144, status=-84

gspca: ISOC data error: [1] len=240, status=-84

等等。这是又回到对内核的改动上,当改动内核时就感觉帖子文章中第二篇没什么用,跟第一篇有些重复之嫌,后来替代的在static void s3c2410_start_hc中的改动也是,感觉有些重复static int usb_hcd_s3c2410_probe中的内容,所以重新编译内核,将对static void s3c2410_start_hc的改动去掉,即不改s3c2410_start_hc,重新编译内核烧写,结果使用摄像头正常。

    也就是说,usb device已经改成了usb host,可以当成usb host使用了,只不过,必需先插入设备再启动板子,分析这种情况的原因可能是因为bootloader中肯定有对usb部分的设置驱动之类的,(Nor Flash的时候可以使用usb device进行下载传输,说明肯定已经驱上了usb device),vivi的设置跟重新编译的内核对usb设置不一样,可能就导致了这种情况,我也不确定是不是这个原因。不插设备的时候启动信息改的usb 1-2提示:

usb 1-2: new full speed USB device using s3c2410-ohci and address 3

usb 1-2: device descriptor read/64, error -62

usb 1-2: device descriptor read/64, error -62

usb 1-2: new full speed USB device using s3c2410-ohci and address 4

usb 1-2: device descriptor read/64, error -62

usb 1-2: device descriptor read/64, error -62

usb 1-2: new full speed US. device using s3c2410-ohci and address 5

usb 1-2: device not accepting addre髎 5, error -62

usb 1-2: new full speed USB device using s3c2410-ohci and address 6

usb 1-2: device not accepting address 6, error -62

hub 1-0:1.0: unable to enumerate USB device on port 2

但是,插上设备比如无线网卡,就能找到设备,提示:

usb 1-2: new full speed USB device using s3c2410-o鑓i and address 3

usb 1-2: New USB device found, idVen鋙r=0ace, idProduct=1215

usb 1-2: New USB device strings: Mfr=16, Product=32, SerialNumber=0

usb 1-2: Product: USB2.0 WLAN

usb 1-2: Manufacturer: ZyDAS

usb 1-2: configuration #1 chosen from 1 choice

usb 1-2: reset full speed USB device using s3c2410-ohci and address 3

wmaster0 (zd1211rw): not using net_device_ops yet

wlan0 (zd1211rw): not using net_device_ops yet

zd1211rw 1-2:1.0: phy0

对于这种情况,上网搜了一下,好像修改vivi中的upll设置,在main中添加了ChangeUPllValue(56,2,2)一句后,问题可以解决。具体没有再试,先如此的用着吧。
    我是在友善之臂的mini2440上实现的,基于2410与2440没有本质差别,2410上应该也可以。

关键字:usb  device  host 引用地址:2440/2410上将usb device改成usb host

上一篇:Mini2440的LCD配置分析
下一篇:S3C2440与NAND FLASH(K9F1208)的接线分析

推荐阅读最新更新时间:2024-03-16 14:59

感受10Gbps 接口讯号质量,Diodes USB ReDriver问市
Diodes 公司 针对工业、嵌入式与消费性市场推出一系列 USB ReDriver。PI3EQX1004E 及 PI3EQX1002E 线性ReDriver支持 USB 3.2,传输速度介于 5Gbps 至 10Gbps,具备双端口和单端口规格。装置提供可调式线性等化、输出振幅及平整增益,协助减少符码间干扰,进而使各种实体媒体的效能优化。此款装置为业界最小型的ReDriver,其使用的封装较类似产品常用封装最多可减少 64% 体积,以节省电路板空间。目标产品应用包括笔记本电脑、平板电脑、台式电脑和游戏设备。 ReDriver也称为讯号中继器 (repeater IC),可藉由产生讯号大幅提升高速接口的讯号质量。讯号频率
[网络通信]
感受10Gbps 接口讯号质量,Diodes <font color='red'>USB</font> ReDriver问市
如何在FPGA和ASIC设计中结合高速USB功能
    通用串行总线已经很普遍了,这是由于其使用简单,随插即用,并具有鲁棒性的优点。USB已经找到了进入曾经使用串口、并口作为其host接口的计算机外设的方式,需要接口到host计算机的产品现在也把USB作为其主要选择。USB提供多种带宽选择--低速、全速、高速、和现在的超高速--迎合了各种计算机外设以及工业和医疗设备的需要。   USB提供的吞吐量足够大,适合高带宽应用,如硬盘驱动器和扫描器。事实上,对于大部分计算机外设,如键盘,鼠标,PDA,游戏键盘,操纵杆,扫描仪,数码相机,打印机,USB已经是互连标准。   除了简单的电脑外围设备,FPGA应用也广泛存在,其可以受益于高速USB接口的增加。数字信号示波器、心电图、摄像机
[嵌入式]
USB数据通信接□模块的元器件选型
    本模块选用USB接口芯片为Philips公司生产的PDIUSBD 12芯片,由于设计的需要,下面对该芯片进行简单 的描述。   PDIUSBD 12是一款性价比很高的USB器件,它通常用作微控制器系统中实现与微控制器进行通信的高速通 用并行接口,它还支持本地的DMA传输。   1.芯片工作方式   PDIUSBD12可编程为单周期DMA或突发模式DMA。在单周期DMA中DMREQ在每单个应答后直到被DMACK N重新激 活之前保持无效。在突发模式DMA中DMREQ在器件中突发编程时一直保持有效。该过程持续到PDIUSBD12通过 E0T N接收到一个DMA终止信息,这时产生一个中断指示本地CPU,DMA操作已经完成
[嵌入式]
S3C2440地址空间的分配与启动
一、S3C2440地址空间的分配 1. s3c2440A 的存储器控制器有以下特性: 大小端(通过软件选择) 地址空间:每个bank有128M 的字节(总共1G字节/8个banks) 可编程的访问位宽,bank0(16/32 位),其他bank(8/16/32 位) 共8个存储器banks 6个是ROM,SRAM 等类型存储器bank 2个是可以作为ROM、SRAM、SDRAM 等存储器bank 7个固定的存储器bank起始地址 最后一个bank 的起始地址可调整 最后两个bank 大小可编程 所有存储器bank的访问周期可编程 总线访问周期可通过插入外部wait来延长 支持SDRAM 的自刷新和掉电模式 2. 寻
[单片机]
SMSC开始提供首款 USB 3.0 图形技术样品
智能型混合信号连接解决方案(Smart Mixed-Signal Connectivity™)的开发商SMSC今天宣布,针对多屏显示应用推出ViewSpan™ USB 3.0远程图形技术。利用无所不在的USB连接端口作为显示接口,ViewSpan能为消费者提供可扩充、即插即用、且多样化的个人计算机交互模式。 便于连接的USB将成为多屏显示器与台式和便携式个人计算机连接的首选方式,同时也能促进计算共享模式在教育领域等应用中的日渐普及。USB 3.0或称为“SuperSpeed USB”,可提供10倍的数据传输率,首次能让消费者不需压缩,即可通过USB端口将高清内容直接传送至显示屏幕。 SMSC公司计算与连接产品
[手机便携]
SMSC开始提供首款 <font color='red'>USB</font> 3.0 图形技术样品
基于S3C2410的网络式汽车防盗系统
引言 汽车的普及为人们的生活带来了方便,同时也给人们提出了一大难题——汽车防盗。本设计是为了解决以往汽车防盗产品的缺点和不足而开发的集成传感、报警和远程图像监控3大功能模块的汽车防盗报警系统。 系统工作原理及组成 本系统是把传感器装在车身的隐蔽位置,当有人走进监控距离、车身移动或振动、车门被打开时,传感器发出电信号,通过A/D转换装置,发送到主控制器。控制器根据信号的来源,把报警分为“有人靠近”、“车体振动”和“车门被开”3个等级,并用 GPRS/GSM终端将报警信息用短信的方式发送到用户手机上。把“车门被开”作为高级别的报警,通知用户的同时,启动视频驱动程序,通过车内的摄像头把车内实况记录下来,发送到车主手机。前两种
[嵌入式]
S3C2440中断与异常定义与基本知识
1. S3C2440中断初始化: #define BIT_ALLMSK (0xffffffff) void Isr_Init(void) { pISR_UNDEF=(unsigned)HaltUndef; pISR_SWI =(unsigned)HaltSwi; pISR_PABORT=(unsigned)HaltPabort; pISR_DABORT=(unsigned)HaltDabort; rINTMOD=0x0; // All=IRQ mode Address:0x4A000004 =1 FIQ mode; =0 IRQ mode rINTMSK=BIT_ALLMSK; // All interrupt is ma
[单片机]
80C51和CH375的USB打印机驱动设计
引 言   本课题来源于北京普析通用公司的一个项目。由于公司现有单机版光谱仪器产品(如1810、T6等)采用的是并行口打印技术,而随着USB打印机技术的逐渐普及,并行口打印机越来越不好买到,而且有些用户的打印机只是USB接口而非并行口,因此现有仪器产品对打印机的支持变得不能适应用户需要。为了实现能将公司的并行口仪器直接和USB打印机相连进行打印,决定设计开发一款LPT-USB打印机的驱动器,负责并口仪器和USB打印机的连接。   本文利用单片机和USB总线接口芯片实现LPT-USB打印机的驱动器设计。利用该设计将能够实现并行打印口数据可以在USB打印机上的直接打印工作,克服了有些并口仪器必须连接并口打印机才能打印的弊端,极大地方
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved