Chinaunix首页 | 论坛 | 博客
  • 博客访问: 173511
  • 博文数量: 37
  • 博客积分: 2055
  • 博客等级: 大尉
  • 技术积分: 420
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-02 12:34
文章分类
文章存档

2011年(4)

2010年(15)

2009年(18)

我的朋友

分类:

2009-07-01 17:31:07

只写了一部分,先放这吧,太多事情了,里面源码比较多,以后会补上我的注释,大家可以先看一下MCCI USB DataPump Overview 这篇文章,GOOGLE一下很多的:

MCCI USB 开发个人肤浅认知

关键字:MCCI  USB  URC   CDC

作者:apcwowo

邮箱:

参考文献 :Universal Serial Bus Class Definitions for Communication Devices.pdf

           USB Class Codes .doc

 

一.   何为MCCI

     MCCI® is the leading developer of software solutions for personal communication, media delivery, systems peripherals, and networking. MCCI solutions bridge the gap between customers' specific business requirements and MCCI off-the-shelf host-side or embedded connectivity products. Harnessing MCCI's extensive expertise allows customer development teams to more rapidly integrate USB support for their intelligent devices.

这个是在MCCI的首页的介绍(),大概的意思了就是为用户做USB的解决方案的,我的这篇文章主要介绍一下我们PHILIP 7210手机平台中是如何应用MCCI这个技术的,因为也是第一次接触,如有不对的地方,请及时发邮件给我,大家交流学习一下。

二.   通信设备类 (Communication Device Class CDC

由于在手机的应该中USB主要是用来进行通信,比如TRACETAT,所以本文的主要讨论的也是CDC这个类,其余的分类还有HID CLASS ,HUB CLASS

CDC为一个大类,在这个大类下面还分为几个小类,如下

Class

SubClass

 

02h

01h - Direct Line Control Model
02h - Abstract Control Model
03h - Telephone Control Model
04h - Multi-Channel Control Model
05h - CAPI Control Model
06h - Ethernet Networking Control Model
07h - ATM Networking Control Model
08h - Wireless Handset Control Model
09h - Device Management
0Ah - Mobile Direct Line Model
0Bh - OBEX

三.   URC

在开发MCCI USB 设备驱动时,MCCI提出了一个新的概念,对于以前的USB驱动开发,所以USB配置都写在了C文件中,就是说逻辑跟配置放在了一起,开发人员除了要关注配置还有关系逻辑,在这种情况下MCCIUSB的配置抽离出来,形成一个单一的文件,就是后缀为URC的文件,全称为USB Resource Complie,具体的写法可以参考USBRC User's Guide ,里面写的比较详细,在这里就不一一说明了。

四.CDC 结构定义

     在写URC文件的时候,很多地方都牵扯到了数据的一些定义,这个就需要了解一下CDC的结构了,如下:

/*

 * USB Communications Device Class (CDC) definitions

 *

 * CDC says how to talk to lots of different types of network adapters,

 * notably ethernet adapters and various modems.  It's used mostly with

 * firmware based USB peripherals.

 */

 

#ifndef __LINUX_USB_CDC_H

#define __LINUX_USB_CDC_H

 

#include

 

#define USB_CDC_SUBCLASS_ACM              0x02

#define USB_CDC_SUBCLASS_ETHERNET         0x06

#define USB_CDC_SUBCLASS_WHCM             0x08

#define USB_CDC_SUBCLASS_DMM              0x09

#define USB_CDC_SUBCLASS_MDLM             0x0a

#define USB_CDC_SUBCLASS_OBEX             0x0b

 

#define USB_CDC_PROTO_NONE           0

 

#define USB_CDC_ACM_PROTO_AT_V25TER       1

#define USB_CDC_ACM_PROTO_AT_PCCA101      2

#define USB_CDC_ACM_PROTO_AT_PCCA101_WAKE 3

#define USB_CDC_ACM_PROTO_AT_GSM     4

#define USB_CDC_ACM_PROTO_AT_3G           5

#define USB_CDC_ACM_PROTO_AT_CDMA         6

#define USB_CDC_ACM_PROTO_VENDOR     0xff

 

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

 

/*

 * Class-Specific descriptors ... there are a couple dozen of them

 */

 

#define USB_CDC_HEADER_TYPE      0x00 /* header_desc */

#define USB_CDC_CALL_MANAGEMENT_TYPE 0x01 /* call_mgmt_descriptor */

#define USB_CDC_ACM_TYPE         0x02 /* acm_descriptor */

#define USB_CDC_UNION_TYPE       0x06 /* union_desc */

#define USB_CDC_COUNTRY_TYPE         0x07

#define USB_CDC_NETWORK_TERMINAL_TYPE 0x0a /* network_terminal_desc */

#define USB_CDC_ETHERNET_TYPE        0x0f /* ether_desc */

#define USB_CDC_WHCM_TYPE        0x11

#define USB_CDC_MDLM_TYPE        0x12 /* mdlm_desc */

#define USB_CDC_MDLM_DETAIL_TYPE 0x13 /* mdlm_detail_desc */

#define USB_CDC_DMM_TYPE         0x14

#define USB_CDC_OBEX_TYPE        0x15

 

/* "Header Functional Descriptor" from CDC spec  5.2.3.1 */

struct usb_cdc_header_desc {

     __u8 bLength;

     __u8 bDescriptorType;

     __u8 bDescriptorSubType;

 

     __le16   bcdCDC;

} __attribute__ ((packed));

 

/* "Call Management Descriptor" from CDC spec  5.2.3.2 */

struct usb_cdc_call_mgmt_descriptor {

     __u8 bLength;

     __u8 bDescriptorType;

     __u8 bDescriptorSubType;

 

     __u8 bmCapabilities;

#define USB_CDC_CALL_MGMT_CAP_CALL_MGMT        0x01

#define USB_CDC_CALL_MGMT_CAP_DATA_INTF        0x02

 

     __u8 bDataInterface;

} __attribute__ ((packed));

 

/* "Abstract Control Management Descriptor" from CDC spec  5.2.3.3 */

struct usb_cdc_acm_descriptor {

     __u8 bLength;

     __u8 bDescriptorType;

     __u8 bDescriptorSubType;

 

     __u8 bmCapabilities;

} __attribute__ ((packed));

 

/* capabilities from 5.2.3.3 */

 

#define USB_CDC_COMM_FEATURE     0x01

#define USB_CDC_CAP_LINE    0x02

#define USB_CDC_CAP_BRK 0x04

#define USB_CDC_CAP_NOTIFY  0x08

 

/* "Union Functional Descriptor" from CDC spec 5.2.3.8 */

struct usb_cdc_union_desc {

     __u8 bLength;

     __u8 bDescriptorType;

     __u8 bDescriptorSubType;

 

     __u8 bMasterInterface0;

     __u8 bSlaveInterface0;

     /* ... and there could be other slave interfaces */

} __attribute__ ((packed));

 

/* "Country Selection Functional Descriptor" from CDC spec 5.2.3.9 */

struct usb_cdc_country_functional_desc {

     __u8 bLength;

     __u8 bDescriptorType;

     __u8 bDescriptorSubType;

 

     __u8 iCountryCodeRelDate;

     __le16   wCountyCode0;

     /* ... and there can be a lot of country codes */

} __attribute__ ((packed));

 

/* "Network Channel Terminal Functional Descriptor" from CDC spec 5.2.3.11 */

struct usb_cdc_network_terminal_desc {

     __u8 bLength;

     __u8 bDescriptorType;

     __u8 bDescriptorSubType;

 

     __u8 bEntityId;

     __u8 iName;

     __u8 bChannelIndex;

     __u8 bPhysicalInterface;

} __attribute__ ((packed));

 

/* "Ethernet Networking Functional Descriptor" from CDC spec 5.2.3.16 */

struct usb_cdc_ether_desc {

     __u8 bLength;

     __u8 bDescriptorType;

     __u8 bDescriptorSubType;

 

     __u8 iMACAddress;

     __le32   bmEthernetStatistics;

     __le16   wMaxSegmentSize;

     __le16   wNumberMCFilters;

     __u8 bNumberPowerFilters;

} __attribute__ ((packed));

 

/* "Telephone Control Model Functional Descriptor" from CDC WMC spec 6.3..3 */

struct usb_cdc_dmm_desc {

     __u8 bFunctionLength;

     __u8 bDescriptorType;

     __u8 bDescriptorSubtype;

     __u16    bcdVersion;

     __le16   wMaxCommand;

} __attribute__ ((packed));

 

/* "MDLM Functional Descriptor" from CDC WMC spec 6.7.2.3 */

struct usb_cdc_mdlm_desc {

     __u8 bLength;

     __u8 bDescriptorType;

     __u8 bDescriptorSubType;

 

     __le16   bcdVersion;

     __u8 bGUID[16];

} __attribute__ ((packed));

 

/* "MDLM Detail Functional Descriptor" from CDC WMC spec 6.7.2.4 */

struct usb_cdc_mdlm_detail_desc {

     __u8 bLength;

     __u8 bDescriptorType;

     __u8 bDescriptorSubType;

 

     /* type is associated with mdlm_desc.bGUID */

     __u8 bGuidDescriptorType;

     __u8 bDetailData[0];

} __attribute__ ((packed));

 

/* "OBEX Control Model Functional Descriptor" */

struct usb_cdc_obex_desc {

     __u8 bLength;

     __u8 bDescriptorType;

     __u8 bDescriptorSubType;

 

     __le16   bcdVersion;

} __attribute__ ((packed));

 

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

 

/*

 * Class-Specific Control Requests (6.2)

 *

 * section 3.6.2.1 table 4 has the ACM profile, for modems.

 * section 3.8.2 table 10 has the ethernet profile.

 *

 * Microsoft's RNDIS stack for Ethernet is a vendor-specific CDC ACM variant,

 * heavily dependent on the encapsulated (proprietary) command mechanism.

 */

 

#define USB_CDC_SEND_ENCAPSULATED_COMMAND 0x00

#define USB_CDC_GET_ENCAPSULATED_RESPONSE 0x01

#define USB_CDC_REQ_SET_LINE_CODING       0x20

#define USB_CDC_REQ_GET_LINE_CODING       0x21

#define USB_CDC_REQ_SET_CONTROL_LINE_STATE     0x22

#define USB_CDC_REQ_SEND_BREAK            0x23

#define USB_CDC_SET_ETHERNET_MULTICAST_FILTERS 0x40

#define USB_CDC_SET_ETHERNET_PM_PATTERN_FILTER 0x41

#define USB_CDC_GET_ETHERNET_PM_PATTERN_FILTER 0x42

#define USB_CDC_SET_ETHERNET_PACKET_FILTER     0x43

#define USB_CDC_GET_ETHERNET_STATISTIC         0x44

 

/* Line Coding Structure from CDC spec 6.2.13 */

struct usb_cdc_line_coding {

     __le32   dwDTERate;

     __u8 bCharFormat;

#define USB_CDC_1_STOP_BITS          0

#define USB_CDC_1_5_STOP_BITS             1

#define USB_CDC_2_STOP_BITS          2

 

     __u8 bParityType;

#define USB_CDC_NO_PARITY            0

#define USB_CDC_ODD_PARITY           1

#define USB_CDC_EVEN_PARITY          2

#define USB_CDC_MARK_PARITY          3

#define USB_CDC_SPACE_PARITY              4

 

     __u8 bDataBits;

} __attribute__ ((packed));

 

/* table 62; bits in multicast filter */

#define  USB_CDC_PACKET_TYPE_PROMISCUOUS      (1 << 0)

#define  USB_CDC_PACKET_TYPE_ALL_MULTICAST    (1 << 1) /* no filter */

#define  USB_CDC_PACKET_TYPE_DIRECTED         (1 << 2)

#define  USB_CDC_PACKET_TYPE_BROADCAST        (1 << 3)

#define  USB_CDC_PACKET_TYPE_MULTICAST        (1 << 4) /* filtered */

 

 

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

 

/*

 * Class-Specific Notifications (6.3) sent by interrupt transfers

 *

 * section 3.8.2 table 11 of the CDC spec lists Ethernet notifications

 * section 3.6.2.1 table 5 specifies ACM notifications, accepted by RNDIS

 * RNDIS also defines its own bit-incompatible notifications

 */

 

#define USB_CDC_NOTIFY_NETWORK_CONNECTION 0x00

#define USB_CDC_NOTIFY_RESPONSE_AVAILABLE 0x01

#define USB_CDC_NOTIFY_SERIAL_STATE       0x20

#define USB_CDC_NOTIFY_SPEED_CHANGE       0x2a

 

struct usb_cdc_notification {

     __u8 bmRequestType;

     __u8 bNotificationType;

     __le16   wValue;

     __le16   wIndex;

     __le16   wLength;

} __attribute__ ((packed));

 

#endif /* __LINUX_USB_CDC_H */

五.实例

结合7210平台的URC文件,我们具体讲一下如何配置。

 
阅读(4152) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~