USB gadget裝置驅動解析(1)

2021-05-02 04:15:19 字數 3365 閱讀 1010

劉洪濤,

華清遠見嵌入式學院

金牌講師。

所有usb通訊的裝置端都有usb device程式,通常稱它們為usb韌體。在一些功能簡單的裝置裡,用一些專用的可程式設計usb控制器就可以了。而在一些執行了類似linux作業系統的複雜的嵌入式系統中,要完成usb device程式,就會要求你不僅熟悉usb device控制器的操作,還要熟悉作業系統的驅動架構。

我想通過 「功能體驗」、「驅動除錯」、「gadget驅動結構分析」、「編寫乙個自己的gadget驅動」這4個方面解析linux usb gadget裝置驅動的編寫方法。

一、linux模擬u盤功能的實現

在硬體環境為華清遠見的fs2410平台,軟體環境為linux-2.6.26的linux系統上,實現模擬u盤的功能。

向核心新增**

#include

#include

#include

修改arch/arm/mach-s3c2410/mach-smdk2410.c

/*usb device上拉電阻處理 */

static voidsmdk2410_udc_pullup(enum s3c2410_udc_cmd_e cmd)

;printk("smdk2410_udc: %s/n",s3c2410_pullup_info[cmd]);

s3c2410_gpio_cfgpin(s3c2410_gpg9, s3c2410_gpg9_outp);

switch (cmd)

}static struct s3c2410_udc_mach_infosmdk2410_udc_cfg__initdata = ;

static struct platform_device *smdk2410_devices __initdata = ;

static void __init sdmk2410_init(void)    

}修改drivers/usb/gadget/file_storage.c

static void start_transfer(struct fsg_dev *fsg, struct usb_ep *ep,

struct usb_request *req, int *pbusy,

enum fsg_buffer_state *state)

配置核心支援u盤模擬

<*>   usb gadget support  --->

usb peripheral controller (s3c2410 usb device controller)  --->

s3c2410 usb device controller

[*]       s3c2410 udc debug messages

usb gadget drivers

file-backed storage gadget

3、編譯核心

#make zimage

#make modules

在目錄drivers/usb/gadget下生成g_file_storage.ko

載入驅動,測試功能

利用前面的生成的核心,啟動系統後,載入g_file_storage.ko

#insmod g_file_storage.ko

# insmod g_file_storage.ko file=/dev/mtdblock2 stall=0 removable=1

0.03 usb: usb_gadget_register_driver() 'g_file_storage'

0.04 usb: binding gadget driver 'g_file_storage'

0.05 usb: s3c2410_set_selfpowered()

g_file_storage gadget: file-backed storage gadget, version: 20 october 2004

g_file_storage gadget: number of luns=1

g_file_storage gadget-lun0: ro=0, file: /dev/mtdblock3

0.06 usb: udc_enable called

smdk2410_udc: pull-up enable

連線裝置到windows,windows系統會自動裝置到乙個新的u盤加入。格式化u盤,存入檔案。解除安裝u盤後,在目標板上執行如下操作:

# mkdir /mnt/gadget

# mount -t vfat /dev/mtdblock2 /mnt/gadget/

#ls可以看到windows存入u盤的檔案。

二、usbnet功能的實現

配置核心支援usbnet

<*>   usb gadget support  --->

usb peripheral controller (s3c2410 usb device controller)  --->

s3c2410 usb device controller

[*]       s3c2410 udc debug messages

usb gadget drivers

ethernet gadget (with cdc ethernet support)

[*]       rndis support

2、編譯核心

#make zimage

#make modules

在目錄drivers/usb/gadget下生成g_ether.ko

3、載入驅動,測試功能

利用前面的生成的核心,啟動系統後,載入g_ether.ko

#insmod g_ether.ko

#ifconfig usb0 192.168.1.120

……usb0 link encap:ethernet hwaddr 5e:c5:f6:d4:2b:91

inet addr:192.168.1.120 bcast:192.168.1.255 mask:255.255.255.0

up broadcast running multicast mtu:1500 metric:1

rx packets:253 errors:0 dropped:0 overruns:0 frame:0

tx packets:43 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

rx bytes:35277 (34.4 kib) tx bytes:10152 (9.9 kib)

USB gadget裝置驅動解析(1)

所有usb通訊的裝置端都有usb device程式,通常稱它們為usb韌體。在一些功能簡單的裝置裡,用一些專用的可程式設計usb控制器就可以了。而在一些執行了類似linux作業系統的複雜的嵌入式系統中,要完成usb device程式,就會要求你不僅熟悉usb device控制器的操作,還要熟悉作業系...

Linux下USB gadget裝置詳解

linux下usb gadget裝置詳解 usb gadget是什麼?linux usb gadget 驅動框架 以下簡稱 gadget 實現了usb 協議定義的裝置端的軟體功能。相對於 linux usb 主機端 host 驅動而言,gadget 驅動出現較晚,它出現在2.4.23 以後。gadg...

Linux下USB gadget裝置詳解

usb gadget是什麼?linux usb gadget 驅動框架 以下簡稱 gadget 實現了usb 協議定義的裝置端的軟體功能。相對於 linux usb 主機端 host 驅動而言,gadget 驅動出現較晚,它出現在2.4.23 以後。gadget 框架提出了一套標準 api,在底層,...