fl2440 usb驱动移植

内核版本是linux -3.0

此文章只是一个移植流程的介绍,最重要的我们还是需要了解一下usb的协议:http://blog.sina.com.cn/s/blog_8bbf650701013mub.html

对于linux内核自带驱动的移植总的来说分为2大部:1 修改代码,将usb初始化。2 配置linux内核支持此驱动


第一步:对于代码的操作

进入内核目录下的  mach-smdk2440.c这个文件  (路径/arch/arm/mach-s3c2440/mach-smdk2440.c)


添加头文件

#include <mach/regs-clock.h>

#include <linux/delay.h>


添加usb初始化函数

int usb_s3c2440_init(void)
      {
         unsigned long upllvalue= (0x38<<12)|(0x02<<4)|(0x02); 
          while (upllvalue != __raw_readl(S3C2410_UPLLCON)) 
        {
               __raw_writel(upllvalue, S3C2410_UPLLCON);
          mdelay(1);
          }
          return 0;
    }


 
 

然后将上面这个初始化函数加入smdk2440_map_io中进行初始化

static void __init smdk2440_map_io(void)
        {
          s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
          s3c24xx_init_clocks(12000000);
        //s3c24xx_init_clocks(16934400); fl2440的时钟晶振频率是12000000
          s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
          usb_s3c2440_init(); 
        }


OK以上就是对代码的修改


第二步:对于内核驱动的配置

Device Drivers  ---> 
   [*] USB support  --->
       {*}   Support for Host-side USB 
       [*]     USB device filesystem (DEPRECATED) 
       [*]     USB device class-devices (DEPRECATED)
       <*>     OHCI HCD support 
       <*>   USB Mass Storage support //这个如果不选进入开发板后看不到u盘里面的东西

 //对于这个上面的具体选项可以参考这个博客:     http://blog.chinaunix.net/uid-9727915-id-259858.html
[*] HID Devices  ---> 
    -*-  Generic HID support
    <*>     USB Human Interface Device (full HID) support
 

//HID是Human Interface Devices的缩写.翻译成中文即为人机交互设备.这里的人机交互设备是一个宏观上面的概念,任何设备,只要符合HID spec,都可以称之为HID设备

因为u盘用到了scsi命令,所以我们需要增加scsi支持.

(usb storage驱动利用scsi中间层将usb storage设备虚拟成scsi逻辑设备。这样可以方便的使用scsi驱动的设备IO接口,以及plugin/plugout等机制)

SCSI device support  --->
 <*> SCSI device support
 [*] legacy /proc/scsi/ support
 <*> SCSI disk support 


现在的U盘等移动存储器使用的大都是 FAT/FAT32 格式的,因此我们还需要添加FAT32 文件系统以及分区格式的支持:
File systems  --->
  DOS/FAT/NT Filesystems  --->
<*> MSDOS fs support
<*> VFAT (Windows-95) fs support
(437) Default codepage for FAT
(iso8859-1) Default iocharset for FAT
<*> NTFS file system support
[*]   NTFS write support
Partition Types  --->
  [*]   PC BIOS (MSDOS partition tables) support
  [*]   Windows Logical Disk Manager (Dynamic Disk) support
-*- Native language support  --->
<*>   Codepage 437 (United States, Canada)
<*>   Simplified Chinese charset (CP936, GB2312)
<*>   ASCII (United States)
<*>   NLS ISO 8859-1 (Latin 1; Western European Languages)
<*>   NLS UTF-8


上面都是应该选上的选项。


接下来我们要实现用mdev实现u盘自动挂载

mdev是busybox自带的一个简化版的udev.
作用是在系统启动和热插拔 或动态加载驱动程序时,自动产生驱动程序所需的节点文件,在文件系统中的/dev目录下的设备节点都是由mdev创建的
mdev扫描/sys/class和/sys/block中所有的类设备目录,如果在目录中含有名为"dev"的文件,且文件中包含的是设备号,则mdev就利用这些信息为这个设备在/dev下创建设备节点


1.首先配置busybos,选择mdev

 Linux System Utilities  --->   
             [*] mdev      
             [*]   Support /etc/mdev.conf
             [*]     Support command execution at device addition/removal


2.配置内核支持热拔插

vim .config

CONFIG_HOTPLUG=y  //确保此项为y

CONFIG_NET=y  //确保此项为y

 (/proc/sys/kernel/目录下会出现hotplug文件)


3.在/etc/inittab这个文件中添加启动需要执行的动作

 挂载所有的文件系统(在/etc/fstab中):fstab(/etc/fstab)是Linux下比较重要的配置文件,它包含了系统在启动时挂载文件系统和存储设备的详细信息。

::sysinit:/bin/mount -a 

  #<File system> <mount pt>     <type>   <options>         <dump> <pass>
   #devpts          /dev/pts        devpts   defaults                       0      0
   #/dev/root       /               ext2     rw,noauto                        0      1
   proc            /proc           proc     defaults                            0      0
   tmpfs           /tmp          tmpfs    defaults                            0      0
   tmpfs           /dev          tmpfs    defaults                             0      0
   sysfs           /sys           sysfs    defaults                               0      0


命令内核在增删设备时执行/sbin/mdev,使设备节点会被创建和删除

::sysinit:/bin/echo /sbin/mdev > /proc/sys/kernel/hotplug  //设置系统的hotplug 程序为mdev

设置mdev,让它在系统启动时创建所有的设备节点

::sysinit:/sbin/mdev -s


4.接下来编写mdev配置文件

该文件的作用是:mdev在找到匹配设备时自动执行自定义命令
格式为:
<device regex> <uid>:<gid> <octal permissions> [<@$*><cmd>]
@ 创建节点后执行的
$ 删除节点前执行的
* 创建后和删除前都运行的

vim /etc/mdev.conf

   sd[a-z][0-9]      0:0 0777        @(mount /dev/$MDEV /mnt/usb)  //当检测到sda1类似的设备时将mdev检测到的设备挂载到mnt/usb上
   sd[a-z]             0:0 0777        $(umount /mnt/usb)

   ub[a-z][0-9]      0:0 0777        @(mount /dev/$MDEV /mnt/usb)//如果你u盘插上去能检测到设备但是不能看到里面的内容,就加这2句话,是因为你没挂载成功。
   ub[a-z]             0:0 0777        $(umount /mnt/usb)

这里再说一点的就是u盘在你的内核中的设备名可能是sd[a-z] 也有可能是ub[a-z],所以最好都加上吧,但是如果你的根文件系统是ubifs的那么你最好改成ub[a-h],就是不能有i在里面,因为ubifs的根文件系统,已经挂了根分区,你如果用ub[a-z]它就会把ubifs的根文件系统挂载mnt/usb里面,就会出现很大的问题!
   mmcblk[0-9]p[0-9] 0:0 0777        @(mount /dev/$MDEV /mnt/sdc)
   mmcblk[0-9]       0:0 0777        $(umount /mnt/sdc)

OK大功告成了

参考博客:http://blog.163.com/lby147612@126/blog/static/17041045220112255734836/

http://blog.csdn.net/dragon101788/article/details/8757263



PS:libusual: modprobe for usb-storage succeeded, but module is not present
 如果出现了这个问题请参考我的这个博客



点击打开链接



如果出现了这个问题:

fl2440 usb驱动移植_第1张图片

修改drivers/usb/host/ohci-s3c2410.c
添加头文件:
#include <mach/regs-clock.h>
在函数s3c2410_start_hc中添加:
unsigned long upllvalue = (0x38 << 12) | (0x02 << 4) | (0x02);
while (upllvalue != __raw_readl(S3C2410_UPLLCON)) {
__raw_writel(upllvalue, S3C2410_UPLLCON);
mdelay(1);
}











你可能感兴趣的:(fl2440 usb驱动移植)