USB学习总结

来源:互联网 发布:iphone7p只有2g网络 编辑:程序博客网 时间:2024/05/16 22:40

USB学习总结1—s3c6410的USB驱动修改

整理USB的内容的内容已经几天了,写点东西作为总结。全部内容分三部分,第一部分主要内容是USB驱动在Linux系统中的具体实现方法;第二部分参考《Linux设备驱动程序(第三版)》中的内容总结USB驱动的结构;最后,总结一下USB协议。

一、             首先是对USB设备的得支持。

1、viarch/arm/mach-s3c64xx/mach-mini6410.c
在mach-mini6410.c中添加该函数,实现对时钟的初始化。在USB host 初始化的过程中没有对OTG时钟未进行初始化,所以在使用USB供能前先添加次设置。

 

#ifdefCONFIG_USB_SUPPORT

/* InitializesOTG Phy. to output 48M clock */

voids3c_otg_phy_config(int enable) {

       u32 val;

 

       if (enable) {

              __raw_writel(0x0, S3C_PHYPWR);     /* Power up */

 

              val = __raw_readl(S3C_PHYCLK);

              val &=~S3C_PHYCLK_CLKSEL_MASK;

              __raw_writel(val, S3C_PHYCLK);

 

              __raw_writel(0x1, S3C_RSTCON);

              udelay(5);

              __raw_writel(0x0, S3C_RSTCON);     /* Finish the reset */

              udelay(5);

       } else {

              __raw_writel(0x19, S3C_PHYPWR);   /* Power down */

       }

}

EXPORT_SYMBOL(s3c_otg_phy_config);

#endif

 


2、vi drivers/usb/host/ohci-s3c2410.c
ohci-s3c2410.c文件下存放的是S3C平台下对OHCI的所有操作。

 

Line26后添加内容:

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

#ifdef CONFIG_MACH_MINI6410
extern void s3c_otg_phy_config(int enable);
#endif
/* clock device associated with the hcd */

static struct clk *clk;
static struct clk *otg_clk, *usb_clk;

/* forward definitions */
Line48,static voids3c2410_start_hc()函数中添加时钟初始化函数,如下

 

static voids3c2410_start_hc(struct platform_device *dev, struct usb_hcd *hcd)

{

。。。

 

       clk_enable(otg_clk);

#ifdefCONFIG_MACH_MINI6410

       s3c_otg_phy_config(1);

#endif

 

       clk_enable(usb_clk);

       。。。

}


以上修改经验证在3.1.6内核同样适用

 

USB学习总结2—USB host设备驱动实现(U盘、鼠标)
一、U盘


1 打开热插拔

Genernal setting

–> [*]configure standard kernel feature(for small)

-> [*]support for hot-pluggable device

2 U盘属于scsi设备,因此还需要加入scsi驱动

device driver

->[*] scsi devicesupport

->[*] scsi disk support

              ->[*]scsi devicesupport

              ->[*]scsi genericsupport

3 usb支持

Device driver

->[*] usb support

->[*] support for host-side usb

              ->[*]usb devicefilesystem

              ->[*]usb massstorage driver

              ->[*]OHCI HCDsupport

              ->[*]usb monitor

 

4 文件系统是用来显示文件名称的,所以也要加入文字的支持

File system

->[*] DOS/FAT/NT filesystems

->[*] MSDOS fs support

              ->[*]VFAT fssupport

              ->default codepagefor FAT(936)

              ->Default iocharset for FAT(cp936)

       ->[*]partitiontypes

->[*] PC BIOS support

       ->Native Languagesupport

->[*] simplified chinese charset

              ->[*] NLS UTF8

 

5 实际测试U盘的读取

Mount /dev/udisk /mnt

Umount /mnt

 


二 鼠标以及其他控制器


1 鼠标或其他控制器

鼠标或其他控制器实现比较简单,控制器属于usb human interface设备,只要打开该功能即可。

 


1 Device driver

             ->[*]usb support

                          ->[*]support for host-side usb

                                       ->[*]OHCI HCD support

             ->[*]HID devices

                          ->[*]usb human interface devicesupport

 

 
2 测试


鼠标设备文件在/dev/input/mouse0

简单测试:cat /dev/input/mouse0

USB学习总结3—USB gadget设备驱动实现(usb串口功能)
USB串口(CDC ACM)

1 内核配置


Device driver


                   ->[*] usb support

                                    ->USB gadget support(gadgetAPI)

                                                      ->[*]serial gadget(设备控制驱动)

                                    ->[*]USB modem support(gadget驱动)

测试:


fedora 的PC端访问/dev/ttyACM0

开发板访问/dev/ttyGS0

 


开发板读取ttyGS0文件: cat /dev/ttyGS0

宿主机写入ttyACM0: echo hello >/dev/ttyACM0

 


总结:从驱动设置过程可以看出,作为gadget设备驱动设置基本遵循 gadget API ->device driver ->gadget driver的顺序基本都可以实现。

例如:作为网卡:


Device driver ->usbsupport->USB gadget support(gadgetAPI)->usb peripheral controller(设备控制驱动)

                                          ->gadget driver

                                          ->ethernet gadget driver(gadget驱动)