usb接口简单、即插即用、支持热插拔等优点,在各种场合已经大量使用,在嵌入式系统中,也常常需要通过usb外接u盘、键盘、鼠标等设备。 Linux内核已经支持usb主机控制协议ohci,可以支持u盘、键盘、鼠标等usb设备。

1、OHCI设备

ohci设备包含了名字、独有的资源等等一些驱动程序的硬件或自定义信息。 通过platform_add_devices(platform_device_register)函数将定义的平台设备注册到内核中,用于匹配设备驱动。

内核在drivers\usb\host\ohci-s3c2410.c中实现了s3c2416 ohci驱动, ohci设备的平台代码如下。

  1. #ifdef CONFIG_S3C_DEV_USB_HOST
  2. static struct resources3c_usb_resource[] = {
  3. [0]= DEFINE_RES_MEM(S3C_PA_USBHOST, SZ_256),
  4. [1]= DEFINE_RES_IRQ(IRQ_USBH),
  5. };
  6. struct platform_device s3c_device_ohci ={
  7. .name = "s3c2410-ohci",
  8. .id = -1,
  9. .num_resources = ARRAY_SIZE(s3c_usb_resource),
  10. .resource = s3c_usb_resource,
  11. .dev = {
  12. .dma_mask = &samsung_device_dma_mask,
  13. .coherent_dma_mask = DMA_BIT_MASK(32),
  14. }
  15. };
  16. #endif /* CONFIG_S3C_DEV_USB_HOST */

在static struct platform_device *home2416_devices[]板级平台设备列表中加入&s3c_device_ohci,使ohci设备能够注册到内核中。

2、内核配置

Linux配置支持ohci设备驱动,选中Device Drivers->USB support->OHCI support for Samsung S3C24xx/S3C64xx Soc series,并且选中USB Mass Storage support,用于支持u盘: 14_OHCI驱动 - 图1 14_OHCI驱动 - 图2

u盘使用fat32文件系统,配置内核支持vfat文件系统。 File systems->DOS/FAT/NT Filesystems->VFAT (Windows-95) fssupport: 14_OHCI驱动 - 图3

3、u盘测试

cat /proc/partitions 可以知道u盘的主设备号为8,次设备号为0,在/dev目录中创建sda设备文件。 14_OHCI驱动 - 图4

  1. mknod /dev/sda b 8 0

先对sd卡格式化成vfat文件系统。

  1. mkfs.vfat /dev/sda

挂载sda设备。

  1. mkdir /mnt/udisk
  2. mount /dev/sda /mnt/udisk

对u盘读写文件。

  1. echo This is file test. > /mnt/udisk/test.txt
  2. cat /mnt/udisk/test.txt

14_OHCI驱动 - 图5