linux-3.0-Gadget驅動移植實現模擬U盤

****************************************************************************************************************************************************************************************

 cpu         : s3c2440(arm9)

linux內核:linux-3.0

開發板    :fl2440

開發模塊:USB-DEVICE(gadget)

*************************************************************************************************************************************

  前言:生活中我們經常會將智能手機用數據線插上pc,然後PC對智能手機識別爲存儲設備,進而我們可以進行讀寫文件,那麼本文介紹的技術就是如何將fl2440開發板模擬成類似於智能手機插上pc的存儲設備,也就是模擬U盤      

                  這個功能是參照我同學的博客實現的,我沒有對gadget驅動進行深入的瞭解,只是簡單的實現這一功能,要是想了解更多關於這方面的內容可以參考我同學的博客:   http://blog.csdn.net/edroid1530/article/details/71194942

       1.修改內核源碼

[zoulei@CentOS linux-3.0]$ vim drivers/usb/gadget/file_storage.c

1067 /* Use this for bulk or interrupt transfers, not ep0 */
1068 static void start_transfer(struct fsg_dev *fsg, struct usb_ep *ep,
1069                 struct usb_request *req, int *pbusy,
1070                 enum fsg_buffer_state *state)
1071 {
1072         int     rc;
1073         udelay(800);  /*增加延時*/
                  ......
          }
           
 329 } mod_data = {                                  // Default values
                ......
/*修改mod_data初始值*/
 332         .removable              = 1,
 333         .can_stall              = 0,
                 ......
}
**************************************************************************************************************************************************

說明:我的內核源碼默認就是上面的值,並不需要改動,如果是別的版本內核就需要改動了!

***************************************************************************************************************************************************
 在arch/arm/mach-s3c2440/mach-smdk2440.c中添加gadget設備結構體初始化和 USB device上拉電阻控制,從fl2440原理圖可以看到GPG9引腳控制上拉電阻


[zoulei@CentOS linux-3.0]$ vim arch/arm/mach-s3c2440/mach-smdk2440.c

 #include <plat/udc.h>   /*Added by zoulei  for usbgadget 2017.05.07*/
165 /*usbgadget info was added by zoulei 2017.05.07*/ 
167 static struct s3c2410_udc_mach_info s3c_udc_cfg __initdata = {
168     .pullup_pin = S3C2410_GPG(9),
169 
170 };
274 static struct platform_device *smdk2440_devices[] __initdata = {
              ......
285         &s3c_device_usbgadget, /*added by zoulei 2017.05.7*/
286 };
311 static void __init smdk2440_machine_init(void)
312 {
          ......
316         s3c24xx_udc_set_platdata(&s3c_udc_cfg);/*Added pull-up resistor by zoulei 2017 05.07*/
          ......
321 }
*****************************************************************************************************************************************

注意:添加<plat/udc.h>頭文件時,最好放在文件頭的最低端,否則編譯可能會出錯!

***************************************************************************************************************************************************************************

 2.配置make menuconfig

[zoulei@CentOS linux-3.0]$ make menuconfig


Device drivers -->

[*] USB support -->

                <*>   USB Gadget Support  --->
                   [*]       S3C2410 udc debug messages
                  <M>   USB Gadget Drivers 

                    <M>   Gadget zero(DEVELOPMENT)
                  <M>     File-backed Storage Gadget

**********************************************************************************************************************************************************************************

說明:<M>USB Gadget Support選項主要是編譯出s3c2410_udc.ko,按照上面那種選擇則此時只編譯出g_file_storage.ko

        因爲加載file-backed驅動的時候,要添加鏡像文件,所以這裏我們要選擇模塊編譯,也就是選項前面選擇M

***********************************************************************************************************************************

3.編譯測試

完成以上修改之後重新編譯內核,將在driver/usb/gadget目錄下生成g_file_storage.ko模塊文件,在內核源碼目錄下生成

udisk32M.img文件,將這兩個文件下載到開發板上進行測試,且編譯後的內核一定要燒錄到開發板上運行!

(1)製作FAT32文件系統映像,在開發板上依次執行下列命令

    dd if=/dev/zero of=udisk32M.img bs=1k count = 32768 
    mkfs.vfat udisk32M.img 

(2)加載g_file_storage.ko驅動,與鏡像文件建立關聯,掛載loop設備 

     我們將其掛載到media目錄下,如果沒有該目錄則新建一個media目錄

   insmod g_file_storage.ko file=udisk32M.img stall=0 removable=1 
   mount -o loop /udisk32M.img /media/


**********************************************************************************************************************************************

注意:做完上面的步驟之後,當我們將usb數據線插入pc上時,開發板上會打印g_file_storage gadget: full speed config #1信息,且PC上出現了一個名爲H,大小爲32M的磁盤,裏面沒有任何文件,如圖所示


我們可以看到/media/目錄下有內容System Volume Information,我們再往裏面寫文件測試一下


在開發板上寫文件之後,再看看Windows上發現裏面還是沒有任何內容,重新拔插usb線之後,發現裏面出現了一個test.txt文件如圖:

再往Windows上寫一個test1.txt文件,查看開發板上發現並沒有出現test1.txt文件,重新掛載文件系統映像到 /media目錄後出現了該文件如圖:



經測試發現模擬U盤可以正常工作,則將fl2440開發板模擬成U盤的功能成功實現!

4.遇到的的問題及解決方法

在製作將fl2440開發板模擬成U盤時,我將/media 目錄作爲掛載點,可是後來卸載就出現如下錯誤
問題:>: umount /media
umount: can't umount /media: Device or resource busy
解決:
>: fuser -km /media
Copyright (C) 2011 fulinux<[email protected]>
root login: root
>: df -lh
df: invalid option -- l
BusyBox v1.20.2 (2017-03-01 01:32:52 PST) multi-call binary.
Usage: df [-Pkmhai] [-B SIZE] [FILESYSTEM]...
Print filesystem usage statistics
        -P      POSIX output format
        -k      1024-byte blocks (default)
        -m      1M-byte blocks
        -h      Human readable (e.g. 1K 243M 2G)
        -a      Show all filesystems
        -i      Inodes
        -B SIZE Blocksize
>: umount /media
注意: -k(  kill processes accessing the named file殺死訪問指定文件的進程) -m( show all processes using the named filesystems)
fuser命令是顯示訪問某個文件的進程的PID






 

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章