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驱动)