****************************************************************************************************************************************************************************************
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
- 喫v不v好喜歡步步v和成本v和v成本vport)5*******************************************************************************************************************************************************************************
Device drivers -->
[*] USB 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.遇到的的問題及解決方法