<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > Linux USB gadget設備驅動(dòng)解析(4)--編寫(xiě)一個(gè)gadget驅動(dòng)

Linux USB gadget設備驅動(dòng)解析(4)--編寫(xiě)一個(gè)gadget驅動(dòng)

作者: 時(shí)間:2012-08-06 來(lái)源:網(wǎng)絡(luò ) 收藏

一、計劃

本文引用地址:http://dyxdggzs.com/article/148655.htm

通過(guò)前面幾節的基礎,本節計劃簡(jiǎn)單的。重在讓大家快速了解結構。

上節中簡(jiǎn)單介紹了zero.c程序。這個(gè)程序考慮到了多配置、高速傳輸、 OTG等因素。應該說(shuō)寫(xiě)的比較清楚,是我們了解架構的非常好的途徑。但把這些東西都放在一起,對很多初學(xué)人員來(lái)說(shuō)還是不能快速理解。那就再把它簡(jiǎn)化一些,針對S3C2410平臺,只實(shí)現配置、一個(gè)接口、一個(gè)端點(diǎn),不考慮高速及OTG的情況。只完成單向從hoST端接收數據的功能,但要把字符結合在里面。這需要有一個(gè)host端的驅動(dòng),來(lái)完成向device端發(fā)送數據。關(guān)于在主機端一個(gè)簡(jiǎn)單的程序,有很多的資料。相信大家很快就會(huì )完成的。

二、功能展示

1、PC端編寫(xiě)了一個(gè)us^raNSfer.ko,能夠向device端發(fā)送數據

2、對目標平臺編寫(xiě)一個(gè)gadget驅動(dòng),名稱(chēng)是g_zero.ko

3、測試步驟

在目標平臺(基于S3C2410)上加載gadget驅動(dòng)

# insmod g_zero.ko

name=ep1-bulk

smdk2410_udc: Pull-up enable

# mknod /dev/usb_rcv c 251 0

#

在PC主機上加載驅動(dòng)us^ransfer.ko

#insmod us^ransfer.ko

#mknod /dev/us^ransfer c 266 0

連接設備,目標平臺的終端顯示:

cONnected

目標平臺讀取數據

# cat /dev/usb_rcv

PC端發(fā)送數據

#echo “12345” > /dev/us^ransfer

#echo “abcd” > /dev/us^ransfer

設備端會(huì )顯示收到的數據

# cat /dev/usb_rcv

12345

abcd

三、代碼分析

下面的代碼是在原有的zero.c基礎上做了精簡(jiǎn)、修改的。一些結構的名稱(chēng)還是保留以前的,但含義有所變化。如:loopback_config,不再表示loopback,而只是單向的接收數據。

/*

* zero.c -- Gadget Zero, for simple development

* lht@farsight.com.cn

* All rights reserved.*/

/* #define VERBOSE_DEBUG */

#include

#include

#include

#include

#include

#include gadget_chips.h

#include

#include

#include

#include

#include

#include

#include

#include

#include/* size_t */

#include/* error codes */

#include

#include

#include

/*-------------------------------------------------------------------------*/

stATIc const char shortname[] = zero;

staTIc const char loopback[] = loop input to output;

static const char longname[] = Gadget Zero;

static const char source_sink[] = source and sink data;

#define STRING_MANUFACTURER 25

#define STRING_PRODUCT 42

#define STRING_SERIAL 101

#define STRING_SOURCE_SINK 250

#define STRING_LOOPBACK 251

//#define DRIVER_VENDOR_NUM 0x0525 /* NetChip */

//#define DRIVER_PRODUCT_NUM 0xa4a0 /* -USB Gadget Zero */

#define DRIVER_VENDOR_NUM 0x5345 /* NetChip */

#define DRIVER_PRODUCT_NUM 0x1234 /* -USB Gadget Zero */

static int usb_zero_major = 251;

/*-------------------------------------------------------------------------*/

static const char *EP_OUT_NAME; /* sink */

/*-------------------------------------------------------------------------*/

/* big enough to hold our biggest descriptor */

#define USB_BUFSIZ 256

struct zero_dev { //zero設備結構

spinlock_t lock;

struct usb_gadget *gadget;

struct usb_request *req; /* for control responses */

struct usb_ep *out_ep;

struct cdev cdev;

unsigned char data[128];

unsigned int data_size;

wait_queue_head_t bulkrq;

};

#define CONFIG_LOOPBACK 2

static struct usb_device_descriptor device_desc = { //設備描述符

.bLength = sizeof device_desc,

.bDescriptorType = USB_DT_DEVICE,

.bcdUSB = __constant_cpu_to_le16(0x0110),

.bDeviceClass = USB_CLASS_VENDOR_SPEC,

.idVendor = __constant_cpu_to_le16(DRIVER_VENDOR_NUM),

.idProduct = __constant_cpu_to_le16(DRIVER_PRODUCT_NUM),

.iManufacturer = STRING_MANUFACTURER,

.iProduct = STRING_PRODUCT,

.iSerialnumber = STRING_SERIAL,

.bNumConfigurations = 1,

};

static struct usb_endpoint_descriptor fs_sink_desc = { //端點(diǎn)描述符

.bLength = USB_DT_ENDPOINT_SIZE,

.bDescriptorType = USB_DT_ENDPOINT,

.bEndpointAddress = USB_DIR_OUT, //對主機端來(lái)說(shuō),輸出

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

linux相關(guān)文章:linux教程



上一頁(yè) 1 2 3 4 5 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>