fl2440添加USB驱动,并添加ntfs的写入

//内核:linux-3.0



内核添加USB支持

[luminqi@localhost linux-3.0]$ make menuconfig

Device Drivers  --->
      Generic Driver Options  --->
 (/sbin/hotplug) path to uevent helper                  //配置u盘的热插拔
      [*] Block devices  --->
                   <*>   Low Performance USB Block driver     //低性能USB块设备驱动
     SCSI device support  ---> 
                  <*> SCSI device support   //SCSI设备的支持
                  <*> SCSI generic support   //SCSI通用的支持
                  [*] Probe all LUNs on each SCSI device
//所有在每个SCSI LUN探针装置
     [*] USB support  ---> 
                 <*>   Support for Host-side USB           //主机端USB支持
                 [*]     USB device filesystem (DEPRECATED)  //
                 [*]     USB device class-devices (DEPRECATED)   / /USB设备类设备
                 <*>   USB Monitor          //USB监控
                 <*>   OHCI HCD support //支持OHCI标准
                 <*>   USB Mass Storage support  //支持USB海量存储
File systems  --->                                              //配置u盘的文件系统
       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支持
                  [*]  NTFS write support
      -*- Native language support  --->                                      //配置u盘的语言格式支持
                    <*>   Simplified Chinese charset (CP936, GB2312)
                     <*>   ASCII (United States) 
                     <*>   NLS UTF-8


添加USB结构体变量,加厂商ID和设备ID

[luminqi@localhost linux-3.0]$ vim drivers/usb/serial/option.c

101 @@ -51,6 +51,13 @@
102  static void option_instat_callback(struct urb *urb);
103 
104  /* Vendor and product IDs */
105 +static int vendor = 0; /*    Add by luminqi  */
106 +static int product = 0; /*    Add by luminqi   */
107 +
108 +/*    Vendor and product IDs  */
109 +#define OPTION_VENDOR_RESERVED      0xFFFF /*    Add by luminqi */
110 +#define OPTION_RESERVED_DEVICE      0xFFFF /*    Add by luminqi  */
111 +
112  #define OPTION_VENDOR_ID           0x0AF0
113  #define OPTION_PRODUCT_COLT            0x5000
114  #define OPTION_PRODUCT_RICOLA          0x6000
115 @@ -446,7 +453,8 @@
116     .reason = OPTION_BLACKLIST_SENDSETUP
117  };
118 
119 -static const struct usb_device_id option_ids[] = {
120 +static struct usb_device_id option_ids[] = {
121 +    { USB_DEVICE(OPTION_VENDOR_RESERVED, OPTION_RESERVED_DEVICE) }, /*    Add by luminqi  */
122     { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
123     { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) },
124     { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_LIGHT) },
125 @@ -1079,6 +1087,14 @@
125 @@ -1079,6 +1087,14 @@
126  static int __init option_init(void)
127  {
128     int retval;
129 +    if ((vendor>0) && (product>0))
130 +    {
131 +        option_ids[0].match_flags = USB_DEVICE_ID_MATCH_DEVICE;
132 +        option_ids[0].idVendor = vendor;
133 +        option_ids[0].idProduct = product;
134 +        printk("Register option drvier for modem vendor=0x%04x product=0x%04x\n", vendor, product);
135 +    } 
136 +
137     retval = usb_serial_register(&option_1port_device);
138     if (retval)
139         goto failed_1port_device_register;
[ luminqi@localhost linux-3.0]$ vim arch/arm/mach-s3c2440/mach-smdk2440.c

 11 +#include 
 12 +#include 
 13 +#include 
 14 +#include 
 15 +#include 
 16 
 17  #include 
 18  #include 
 19 @@ -44,9 +52,48 @@
 20  #include 
 21  #include 
 22  #include 
 23 +#include          /*  support Touch screen, */
 24 +#include  /*  for usb_s3c2440_init()  */
 25 +#include        /*  for AT24C512 driver  */
 26 +#include   /*   for AT24C512 driver  */
 27 +#include 
68 @@ -155,13 +202,28 @@
 69     &s3c_device_wdt,
 70     &s3c_device_i2c0,
 71     &s3c_device_iis,
 72 +   &s3c_device_dm9000,
 73  };
 74 
 75 +/*   fix device descriptor read/64, error -62 bug, value refer to datasheet P255  */
 76 +int usb_s3c2440_init(void)
 77 +{ 
 78 +    /*  Input Frequency is 12.0000MHz, and MDEV=0x38 PDIV=2 SDIV=2, so output frequency 48.00MHz  */
 79 +     unsigned long upllvalue = (0x38<<12)|(0x02<<4)|(0x02);
 80 +     while (upllvalue != __raw_readl(S3C2410_UPLLCON))
 81 +     {
 82 +         __raw_writel(upllvalue, S3C2410_UPLLCON); 
 83 +         mdelay(1);
 84 +     }
 85 +     return 0;
 86 +}
 87 +
 88  static void __init smdk2440_map_io(void)
 89  {
 90     s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
 91 -   s3c24xx_init_clocks(16934400);
 92 +   s3c24xx_init_clocks(12000000);
 93     s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
 94 +    usb_s3c2440_init(); 

编译内核,加载到开发板上,插入U盘后结果如下:

//这个U盘格式为NTFS

>: usb 1-1.1: new full speed USB device number 3 using s3c2410-ohci
scsi0 : usb-storage 1-1.1:1.0
scsi 0:0:0:0: Direct-Access     Teclast  CoolFlash        8.07 PQ: 0 ANSI: 4
sd 0:0:0:0: Attached scsi generic sg0 type 0
sd 0:0:0:0: [sda] 30720000 512-byte logical blocks: (15.7 GB/14.6 GiB)
sd 0:0:0:0: [sda] Write Protect is off
sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
 sda: sda1
sd 0:0:0:0: [sda] Attached SCSI removable disk
NTFS volume version 3.1.
>: mount
rootfs on / type rootfs (rw)
/dev/root on / type jffs2 (rw,relatime)
proc on /proc type proc (rw,relatime)
tmpfs on /tmp type tmpfs (rw,relatime)
tmpfs on /dev type tmpfs (rw,relatime)
sysfs on /sys type sysfs (rw,relatime)
devpts on /dev/pts type devpts (rw,relatime,mode=600)
/dev/sda1 on /mnt/usb type ntfs (rw,relatime,uid=0,gid=0,fmask=0177,dmask=077,nls=default,errors=continue,mft_zone_multiplier=1)
>: ls mnt/usb/
NTFS-fs error (device sda1): ntfs_ucstonls(): Unicode name contains characters that cannot be converted to character set default.  You might want to try to use the mount option nls=utf8.
NTFS-fs warning (device sda1): ntfs_filldir(): Skipping unrepresentable inode 0x1f6c.
NTFS-fs error (device sda1): ntfs_ucstonls(): Unicode name contains characters that cannot be converted to character set default.  You might want to try to use the mount option nls=utf8.
NTFS-fs warning (device sda1): ntfs_filldir(): Skipping unrepresentable inode 0x1f6b.
NTFS-fs error (device sda1): ntfs_ucstonls(): Unicode name contains characters that cannot be converted to character set default.  You might want to try to use the mount option nls=utf8.
NTFS-fs warning (device sda1): ntfs_filldir(): Skipping unrepresentable inode 0x26.
NTFS-fs error (device sda1): ntfs_ucstonls(): Unicode name contains characters that cannot be converted to character set default.  You might want to try to use the mount option nls=utf8.
NTFS-fs warning (device sda1): ntfs_filldir(): Skipping unrepresentable inode 0x25.
2.txt                             chapter6_key_progressbar_handler
3.txt                             chapter6_prj_qq_handler
LAD1.asm                          linux-3.0
System Volume Information         startActivity
chapter5_prj_qq_activity          u-boot-2010.09
>: usb 1-1.1: USB disconnect, device number 3
NTFS-fs error (device sda1): write_mft_record_nolock(): I/O error while writing mft record 0x5!  Marking base inode as bad.  You should unmount the volume and run chkdsk.
NTFS-fs error (device sda1): __ntfs_write_inode(): Failed (error 5):  Run chkdsk.
NTFS-fs warning (device sda1): ntfs_put_super(): Volume has errors.  Leaving volume marked dirty.  Run chkdsk.

>: ls mnt/usb/
>:



//下面这个是FAT32格式
usb 1-1.1: new full speed USB device number 5 using s3c2410-ohci
scsi2 : usb-storage 1-1.1:1.0
scsi 2:0:0:0: Direct-Access     Lenovo   USB Flash Drive  1100 PQ: 0 ANSI: 0 CCS
sd 2:0:0:0: Attached scsi generic sg0 type 0
sd 2:0:0:0: [sda] 3963904 512-byte logical blocks: (2.02 GB/1.88 GiB)
sd 2:0:0:0: [sda] Write Protect is off
sd 2:0:0:0: [sda] No Caching mode page present
sd 2:0:0:0: [sda] Assuming drive cache: write through
sd 2:0:0:0: [sda] No Caching mode page present
sd 2:0:0:0: [sda] Assuming drive cache: write through
 sda: sda1
sd 2:0:0:0: [sda] No Caching mode page present
sd 2:0:0:0: [sda] Assuming drive cache: write through
sd 2:0:0:0: [sda] Attached SCSI removable disk


>: ls mnt/usb/
$RECYCLE.BIN                          ?????????.ppt
1.docx                                ??????????.doc
15????????????A???.doc                ??????????.docx
201421112103 ???.doc                  ????????????.doc
2016???????????.pdf                   ?????????????.doc
2017?????(1).docx                     ?????????????????--??.doc
??                                    ?????????????????201421112104.doc
??.doc                                ???????????????????.docx
??.mp3                                ????????????????????.docx



//到这里USB驱动支持自动挂载和卸载
可能是板子原因不支持中文显示,‘?’就是中文
支持FAT32格式的读写,可以试着往U盘mkdir文件夹
支持NTFS格式的读,但不支持写
至于自动自动挂载卸载的问题,在根文件系统rootfs下添加mdev.conf文件

mdev会在/etc目录下找mdev的配置文件: mdev.conf. 如果该文件不存在,那么在执行mdev –s这个命令时,

会提示找不到mdev.conf,这时我们可以建一个空的mdev.conf文件解决这个问题。下面创建使用mdev自动挂载u盘和SD卡的配置etc/mdev.conf

vim etc/mdev.conf

sd[a-z][0-9]      0:0 0777        @(mount /dev/$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)
ub[a-z]           0:0 0777        $(umount /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)
@表示在创建设备节点后运行命令。
$表示 在删除设备节点前运行命令。
$MDEV 会被设置成设备名,例如mdev解析到设备 'sdb' 匹配,MDEV 将会被设置为 "sdb"
之前做UBIFS文件系统时,为了确保文件系统挂载到根目录下,注释掉了这两行

#ub[a-z][0-9]      0:0 0777        @(mount /dev/$MDEV /mnt/usb)
#ub[a-z]           0:0 0777        $(umount /mnt/usb)
在这里最好取消掉注释,因为有些U盘识别为UB开头,如果没取消可能会识别不了U盘
还有一个问题就是某些牌子的U盘会识别不了,就算是FAT32也识别不了,估计是内核

的问题,但总的来说大多都可以识别挂载

下面说说怎么添加对NTFS写的支持

make menuconfig

File systems --->
<*>FUSE (Filesystem in Userspace) support   //支持用户空间文件系统,这样就可以使用ntfs-3g挂载
<*>   Character device in Userspace support 

先安装ntfs-3g,使用源码安装,因为ntfs是给ARM使用的,所以先配置,要用到交叉编译器

[luminqi@localhost 3rdparty]$ wget https://tuxera.com/opensource/ntfs-3g_ntfsprogs-2017.3.23.tgz
[luminqi@localhost 3rdparty]$ tar zxvf ntfs-3g_ntfsprogs-2017.3.23.tgz

[luminqi@localhost 3rdparty]cd fl2440/3rdparty/ntfs-3g_ntfsprogs-2017.3.23

[luminqi@localhostntfs-3g_ntfsprogs-2017.3.23]./configure CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc RANLIB=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-ranlib LD=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-ld --build=i686 --host=arm-linux --prefix=/home/luminqi/ntfs 

关于上面这个命名就是为了配置,为了给ARM使用

CC对应arm-linux-gcc,这个一般都要有

RANLIB对应arm-linux-ranlib 

LD对应arm-linux-ld

//对于RANLIB和LD,因为之前没添加上就make,报错说要添加上这两个参数,说明要编译ARM版本的话这两个参数不可缺少,注意要大写,不要小写

--build 指定软件包安装的系统平台.如果没有指定,默认值将是'--host'选项的值.

--host 指定软件运行的系统平台.如果没有指定,将会运行`config.guess'来检测.

--prefix 安装路径,是最常用的选项.制作出的'Makefile'会查看随此选项传递的参数,当一个包在安装时可以彻底的重新安置他的结构独立部分,最好添加.

[luminqi@localhost ntfs-3g_ntfsprogs-2017.3.23]$ make

[luminqi@localhost ntfs-3g_ntfsprogs-2017.3.23]$ make install

[luminqi@localhost ntfs-3g_ntfsprogs-2017.3.23]$ find -iname "ntfs-3g"

./include/ntfs-3g
./src/.libs/ntfs-3g
./src/ntfs-3g

[luminqi@localhost ntfs-3g_ntfsprogs-2017.3.23]cd src/.libs/

[luminqi@localhost .libs]$ file ntfs-3g
ntfs-3g: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), not stripped

[luminqi@localhost .libs]$ cd /home/luminqi/ntfs/

[luminqi@localhost ntfs]$ mv lib/libntfs-3g.so.88.0.0 lib/libntfs-3g.so.88

使用命令file libntfs-3g.so.88

发现是arm支持的


先make下内核,重新烧到开发板

接下来将ntfs-3g和libntfs-3g.so.88传到开发板

依次放在/usr/bin 和/usr/lib

bin 目录下 tftp -gr ntfs-3g 192.168.1.2

lib 目录下 tftp -gr libntfs-3g.so.88 192.168.1.2

主目录下 chmod a+x /usr/bin/ntfs-3g 

在/mnt/下新建文件夹ntfs

接上NTFS格式的U盘,这时会自动挂载

/dev/sda1 on /mnt/usb type ntfs   但是挂载在这里还是不支持写

先手动卸载

umount /mnt/usb

再手动挂载,用到ntfs-3g这个工具

/usr/bin/ntfs-3g /dev/sda1 /mnt/ntfs -o silent,umask=0

这样总算支持了NTFS的写!

当然如果要自动挂载到 /mnt/ntfs,就要修改根文件系统里的etc/mdev.conf,重新制作jffs2文件系统







 









你可能感兴趣的:(驱动,usb,ntfs,内核)