精品国产一区在线_av无码中文字幕无码王_天海翼三点刺激高潮不停_好硬好大好爽视频_欧美高清一区三区在线专区_香蕉黄色片

微軟公司宣布不再支持你正在使用的 IE瀏覽器,這會嚴重影響瀏覽網頁,請使用微軟最新的Edge瀏覽器
廠商專區
產品/技術
應用分類

AWorks 框架下 USB設備模式的編程與應用

2019-05-09 09:53 來源:ZLG立功科技·致遠電子 編輯:電源網

USB是英文Universal Serial Bus(通用串行總線的縮寫),是一種快速、靈活的總線接口。USB對所有的USB外設提供了單一的易于使用的標準的連接類型,簡化了USB外設的設計。USB接口支持熱插拔,計算機系統可以動態地檢測外設的插拔,并且動態地加載驅動程序。另外,USB還具有很靈活的擴展性,一個USB端口接上一個USB HUB(集線器)就可以擴展多個USB端口。USB廣泛的應用于PC機中的人機接口、音頻、存儲等功能,隨著嵌入式系統在各個領域上廣泛應用,USB也在嵌入式系統中被廣泛的使用。

一、USB簡介

USB是在1994年底由英特爾、康柏、IBM、Microsoft等多家公司聯合提出。ISB1.1是較為普遍的USB規范,其高速方式的傳輸速率是12Mbps,低速模式的傳輸速率為1.5Mbps(b是bit的意思,12Mbps=1.5MB/s),USB2.0規范是由USB1.1規范演變而來,它的傳輸速率達到了480Mbps,足以滿足大多數外設的速率要求。USB2.0中的EHCI(增強主機控制器接口)定義了一個與USB1.1相兼容的結構。它可以用USB2.0的驅動程序驅動USB1.1的設備,也就是說所有支持USB1.1的設備都可以直接在USB2.0的接口上使用而不必擔心兼容性問題。USB采用四線電纜,其中兩根是用來傳送數據的串行通道,另兩根為下游設備提供電源,對于任何已經成功連接且相互識別的外設,將以對方設備均能夠支持的最高速率傳輸數據。USB總線會根據外設情況在所兼容的傳輸模式中自動地由高速向低速動態轉換且匹配鎖定在合適的速率。USB系統采用級聯星型拓撲,該拓撲由三個基本部分組成:主機,集線器和功能設備。

主機包含有主控制器和根集線器,控制著USB總線上的數據和控制信息的流動,每個USB系統只能有一個根集線器,它連接在主控制器上。

集線器是USB結構中的特定成分,它可以對原有的USB端口在數量上進行擴展以獲得更多的USB端口(集線器只能擴展出更多的USB端口,而不能擴展出更多的帶寬),設備通過端口連接到USB總線上,同時檢測連接在總線上的設備,并為這些設備提供電源管理,負責總線的故障檢測和恢復。集線可為總線提供能源,亦可為自身提供能源。

功能設備通過端口與總線連接。

本文章以M1052平臺為例,主要講解在AWorks平臺中如何創建一個自定義的USB設備。

二、AWorks工程配置

在AWorks工程中,用戶可以通過aw_prj_params.h配置文件進行設備添加與刪除,aw_prj_params.h在工程目錄user_config中。

在aw_prj_params.h文件中,有效定義設備的使能宏,才表示一個有效的硬件設備,在本文章中我們需要使能USB Device,所以在aw_prj_params.h中添加AW_DEV_IMX1050_USBD設備宏。  

 #define AW_DEV_IMX1050_USBD             /**< \brief USB Device */

在aw_prj_params.h中添加AW_DEV_IMX1050_USBD設備宏之后,在aw_prj_param_auto_cfg.h文件中會自動添加AW_COM_USBD的定義,AW_COM_USBD代表的是USB Device協議棧組件。此處要注意AW_DEV_IMX1050_USBD與AW_DEV_IMX1050_USBH1有沖突(一個USB控制器不能同時出現主機設備模式),兩個只能使能一個。AW_DRV_IMX1050_USBD表示加載USB Device的驅動:

/**

* \name 內部USB Device控制器

* @{

*/

#ifdef AW_DEV_IMX1050_USBD

#ifndef AW_COM_USBD

#define AW_COM_USBD

#endif

#define AW_DRV_IMX1050_USBD

#endif

三、AWorks中USB Device的硬件配置

在AWorks中所有設備集中由AWbus_lite進行管理,在使用一個硬件設備前,必須將其添加到系統硬件設備列表(在awbus_lite_hwconf_usrcfg.c中定義),各個硬件設備的類型為struct awbl_devhcf。USB設備相關硬件配置可以查閱工程目錄下的\user_config\awbl_hwconf_usrcfg\awbl_hwconf_imx1050_usbd.h文件,USB設備模式的設備信息詳見程序清單2.1。

程序清單2.1  USB設備模式的設備信息類型定義

1 aw_local aw_const struct awbl_imx1050_usbd_info  __g_imx1050_usbd_info = {

2    {

3        "/dev/usbd",                 /**< 控制器名字 */

4        AWBL_USBD_CFG_SELF_POWERED  /**< 控制器配置信息*/

5    },

6

7    IMX1050_USB1_BASE_ADDR,         /**< 寄存器基地址 */

8    IMX1050_USBPHY1_BASE_ADDR,      /**< USB PHY寄存器基地址 */

9    INUM_USB_OTG1,                   /**< USB 中斷號*/

10    5,                                /**< 處理usb中斷業務的任務優先級 */

11    32,

12    __imx1050_usbd_plfm_init                  /**< 平臺相關初始化:初始化時鐘 */

13 };

14

其中"/dev/usbd" 是USB Device外設的設備名字,在實際的應用中需要通過該名字來使用USB Device

AWBL_USBD_CFG_SELF_POWERED 表示本設備為自行供電設備。__imx1050_usbd_plfm_init函數是用來初始化與USB Device平臺相關的信息,在這里是初始化USB Device時鐘,詳見程序清單2.2。

程序清單2.2  USB設備模式的平臺初始化函數

1 aw_local void __imx1050_usbd_plfm_init (void) {

2    /* 配置USB Device時鐘 */

3    usbd_clk_init();

4 };

四、與USB Device操作函數相關重要結構體介紹

USB設備類回調函數列表,這個結構體用于提供USB枚舉以及USB通信過程中的事件回調接口,方便用戶接入應用代碼:

/** \brief USB設備類回調函數列表 */

struct aw_usbd_cb {

   /** \brief 控制器鏈接到設備 */

   int (*pfn_link) (struct aw_usbd *p_obj);

   /** \brief 控制器和設備斷開鏈接 */

   int (*pfn_unlink) (struct aw_usbd *p_obj);

   /** \brief 接收到SETUP包 */

   int (*pfn_ctrl_setup) (struct aw_usbd        *p_obj,

                          struct aw_usb_ctrlreq *p_setup,

                          void                  *p_buf,

                          int                    buf_len);

   /** \brief 設置或清除配置 */

   int (*pfn_config_set) (struct aw_usbd      *p_obj,

                          struct aw_usbd_cfg  *p_cfg,

                          bool_t               set);

   /** \brief 總線掛起 */

   void (*pfn_suspend) (struct aw_usbd *p_obj);

   /** \brief 總線恢復 */

   void (*pfn_resume) (struct aw_usbd  *p_obj);

   /** \brief 總線斷開連接 */

   void (*pfn_disconnect) (struct aw_usbd *p_obj);

};


USB設備信息結構體,此結構體用于配置USB設備的基礎信息(具體信息詳見結構體定義),當設備連接到PC端后,可以在PC端查看到這些信息:

/** \brief USBD信息結構定義 */

struct aw_usbd_info {

   uint8_t          clss;          /**< \brief 類代碼 */

   uint8_t          sub_clss;      /**< \brief 子類代碼 */

   uint8_t          protocol;      /**< \brief 協議代碼 */

   uint8_t          mps0;          /**< \brief 端點0包最大尺寸 */

   uint16_t         bcd;           /**< \brief 設備版本號 */

   uint16_t         vid;           /**< \brief 廠商ID */

   uint16_t         pid;           /**< \brief 產品ID */

   const char      *manufacturer;  /**< \brief 制造商字符串描述 */

   const char      *product;       /**< \brief 產品字符串描述 */

   const char      *serial;        /**< \brief 序列號字符串描述 */

};

USB設備接口信息結構體,這個結構體是用來描述當前USB設備接口的信息:

/** \brief USBD接口信息 */

struct aw_usbd_fun_info {

   uint8_t       clss;         /**< \brief 類代碼 */

   uint8_t       sub_clss;     /**< \brief 子類代碼 */

   uint8_t       protocol;     /**< \brief 協議代碼 */

   /** \brief 替代設置回調 */

   int (*pfn_alt_set) (struct aw_usbd_fun  *p_fun,

                       bool_t               set);

   /** \brief setup控制傳輸回調 */

   int (*pfn_ctrl_setup) (struct aw_usbd_fun    *p_fun,

                          struct aw_usb_ctrlreq *p_setup,

                          void                  *p_buf,

                          int                    buf_len);

};

五、USB Device操作接口

Aworks提供了一系列的USB Device操作相關的標準接口,包括初始化一個USB設備、USB功能初始化、啟動USB設備和USB數據傳輸等,用戶在使用Aworks開發USB Device的應用程序時,使用上述標準接口就能方便快捷的開發出源代碼。詳見表4.1

表4.1  USB設備模式操作接口函數

QQ20190509-100215

QQ20190509-100255

? struct aw_usbd        為USB Device對象

? struct aw_usbd_fun    為功能接口對象

? struct aw_usbd_pipe   為端點管道對象

六、應用案例代碼詳解

這里基于M1052平臺,展示如何創建一個自定義的USB設備。本例子會初始化一個USB設備,為USB設備創建一個OUT管道和一個IN管道用于接收和發送數據(IN和OUT的概念是相對于USB主機而言),并在這個USB設備添加接口功能。通過USB設備與PC機的連接,實現與PC的通訊,當PC機上位機軟件發送數據時,USB設備通過OUT管道接收數據,并通過IN管道把收到的數據發送回PC端上位機。這里只對部分關鍵的代碼進行講解,完整的代碼請自行下載查看,本例程所在目錄位于\examples\peripheral\common\usb\ demo_usbd_vendor.c

定義數據接收緩沖區的大小和等待超時時間:

11 #define __BUF_SIZE          512       /** 數據緩沖區大小*/

12 #define __WAIT_TIMEOUT      5000    /** 等待超時時間*/

定義USB Device的信息,當USB Device與PC端連接時,PC端會對其進行枚舉從而獲取USB Device的設備信息,,這些信息都可以在PC端進行查看:

14 /** \brief 定義全局usb設備實例和usb設備信息結構體 */

15 static struct aw_usbd            __g_usbd_obj;

16 const static struct aw_usbd_info __g_usbd_info = {

17     0,                                                        /**< \brief 類代碼 */

18      0,                                                        /**< \brief 子類代碼 */

19      0,                                                        /**< \brief 協議代碼 */

20      64,                                                       /**< \brief 端點0包最大尺寸 */

21      0x0100,                                                   /**< \brief 設備版本號 */

22      0x3068,                                                   /**< \brief 廠商ID */

23      0x0003,                                                   /**< \brief 產品ID */

24      "ZLG",                                                    /**< \brief 制造商字符串描述 */

25      "AWorks",                                                 /**< \brief 產品字符串描述 */

26      "20160824"                                                /**< \brief 序列號字符串描述 */

27  };

USB Device接口信息結構體:

48 /** \brief 接口信息 */

49 static const struct aw_usbd_fun_info __g_info = {

50   AW_USB_CLASS_VENDOR_SPEC,       /**< \brief 類代碼-廠商自定義設備 */

51   0x00,                           /**< \brief 子類代碼 */

52   0x00,                           /**< \brief 協議代碼 */

53   __custom_alt_set,               /**< \brief 替代設置回調 */

54   NULL                            /**< \brief 控制傳輸回調  */

55 };

USB Device例程入口函數,這里主要是初始化USB Device對象,并為這個USB Device對象添加自定義功能,最后通過調用aw_usbd_start函數啟動配置好的USB Device。

174 /**

175  * \brief 自定義USB設備 demo

176  * \return 無

177  */

178 void demo_usbd_vendor_entry (void)

179 {

180    int  ret;

181

182    /*

183     * USB device 初始化

184     * "/dev/usbd" 在awbl_hwconf_xxxxxx_usbd.h 中定義

185     */

186    /* 初始化一個USB設備對象*/

187    ret = aw_usbd_init(&__g_usbd_obj,

188                       &__g_usbd_info,

189                       NULL,

190                       "/dev/usbd");

191    if (ret != AW_OK) {

192        AW_ERRF(("__g_usbd_obj init failed: %d\n", ret));

193    }

194    /* 對USB設備添加自定義功能*/

195    __demo_usbd_vendor();

196    /* 啟動USB設備*/

197    ret = aw_usbd_start(&__g_usbd_obj);

198    if (ret != AW_OK) {

199        AW_ERRF(("__g_usbd_obj start failed: %d\n", ret));

200    }

201

202    return ;

203 }


創建USB Device自定義功能,在本例程中,調用aw_usbd_pipe_create函數為USB Devie的自定義功能創建兩個管道,一個OUT管道和一個IN管道用于接收和發送數據,然后把這個功能添加進上文中初始化好的USB Device對象,最后創建一個任務用于接收數據并把數據發送回去。

126 /**

127 * \brief 自定義類例程入口

128  */

129 aw_local int __demo_usbd_vendor (void)

130 {

131   int   ret;

132

133 /* initialize function */

134 /* 初始化一個USB設備功能*/

135    ret = aw_usbd_fun_init(&__g_ufun,

136                           "AWORKS-USB",

137                           &__g_info);

138    if (ret != AW_OK) {

139        return ret;

140    }

141

142    /* 創建一個IN管道 */

143    ret = aw_usbd_pipe_create(&__g_ufun, &__g_in, &__g_in_info);

144    if (ret != AW_OK) {

145        return ret;

146    }

147

148    /* 創建一個OUT管道 */

149    ret = aw_usbd_pipe_create(&__g_ufun, &__g_out, &__g_out_info);

150    if (ret != AW_OK) {

151        return ret;

152    }

153

154    /* 把功能添加到創建的USB設備實例中*/

155    ret = aw_usbd_fun_add(&__g_usbd_obj, 0, &__g_ufun);

156    if (ret != AW_OK) {

157        return ret;

158    }

159

160    AW_SEMB_INIT(__g_semb, 0, AW_SEM_Q_PRIORITY);

161    /* 創建一個USB設備任務*/

162    AW_TASK_INIT(__g_task,

163                 "CUSTOM-USB",

164                 10,

165                 2048,

166                 __custom_task,

167                 &__g_ufun);

168

169    AW_TASK_STARTUP(__g_task);

170

171    return AW_OK;

172 }

USB Device接收發送任務,當USB Device連接到PC端后,PC端檢測到USB Device的設備信息和設置功能接口后,就會調用USB Device接口信息的回調函數__custom_alt_set,__custom_alt_set會發送信號量,通知USB Device接收發送任務USB Device已連接到PC端,然后進入等待數據接收狀態,當收到數據后會取消阻塞狀態,然后把收到的數據通過IN管道再發送出去:

74 /* 回調函數*/

75 static int __custom_alt_set (struct aw_usbd_fun  *p_fun,

76                            bool_t               set)

77 {

78    if (set) {

79       AW_SEMB_GIVE(__g_semb);

80    } else {

81       aw_usbd_pipe_reset(p_fun->p_obj, &__g_in);

82       aw_usbd_pipe_reset(p_fun->p_obj, &__g_out);

83   }

84   return AW_OK;

85 }

87 static void __custom_task (void *arg)

88 {

89     int   ret;

90     void *p_buf;

91

92   p_buf = aw_usb_mem_alloc(__BUF_SIZE);

93   if (p_buf == NULL){

94       aw_kprintf("aw_usb_mem_alloc error!");

95        return ;

96   }

97

98     AW_FOREVER {

99     /* 等待USB設備連接*/

100    while (!aw_fun_valid(&__g_ufun)) {

101        AW_INFOF(("custom usb wait for connect.\n"));

102        AW_SEMB_TAKE(__g_semb, AW_SEM_WAIT_FOREVER);

103    }

104

105    memset(p_buf,0,__BUF_SIZE);

106    /* 等待接收數據*/

107    ret = aw_usbd_trans_sync(__g_ufun.p_obj,

108                         &__g_out,

109                       p_buf,

110                             __BUF_SIZE,

111                           0,

112                           AW_SEM_WAIT_FOREVER);

113    if (ret > 0) {

114      aw_kprintf("[recv]:%s\n", (char *)p_buf);

115    }

116

117    /* 把收到的數據發送回去 */

118    ret = aw_usbd_trans_sync(__g_ufun.p_obj,

119                             &__g_in,

120                             p_buf,

121                           ret,

122                             0,

123                             __WAIT_TIMEOUT);

124    }

125 }

七、應用案例演示

把完整的例程拷貝到工程的user_code目錄,并把USB Device入口函數demo_usbd_vendor_entry添加到main.c文件中:

1  #include "aworks.h"

2  #include "aw_vdebug.h"

3  #include "aw_led.h"

4  #include "aw_delay.h"

5

6  #define LED 0

7  extern void demo_usbd_vendor_entry (void);

8

9  int aw_main()

10 {

11    aw_kprintf("\r\nApplication Start. \r\n");

12

13    demo_usbd_vendor_entry();

14    

15    while (1) {

16        aw_led_toggle(LED);

17        aw_mdelay(500);

18    }

19

20    return 0;

21 }

編譯程序并把程序燒寫進M1052開發板后,通過USB線連接開發板上的USB HOST1 和PC機,這時PC即會檢測到有USB設備插入,在PC機上安裝對應的驅動后,PC機識別到我們的自定義USB設備。

打開PC端串口打?。?

QQ20190509-100358

PC端上檢測到USB Device的插入,此時因為PC端沒有相應的驅動,所以檢測到是未知設備:

QQ20190509-100430

在PC機上安裝相應的驅動后,PC機識別到我們的自定義USB設備:

QQ20190509-100456

打開專用的USB通訊軟件,選擇要操作的端點,因為在本例程中創建了兩個管道,一個IN管道一個OUT管道,所以在軟件中會看到本USB設備有兩個端點,選擇后會出現兩個窗口,一個是接收一個是發送。

QQ20190509-100537

在發送窗口輸入想要發送的數據,點擊發送,接收窗口就會收到響應的數據。

QQ20190509-100614

標簽: AWorks USB設備

聲明:本內容為作者獨立觀點,不代表電源網。本網站原創內容,如需轉載,請注明出處;本網站轉載的內容(文章、圖片、視頻)等資料版權歸原作者所有。如我們采用了您不宜公開的文章或圖片,未能及時和您確認,避免給雙方造成不必要的經濟損失,請電郵聯系我們,以便迅速采取適當處理措施;歡迎投稿,郵箱∶editor@netbroad.com。

相關閱讀

微信關注
技術專題 更多>>
技術專題之EMC
技術專題之PCB

頭條推薦

電子行業原創技術內容推薦
客服熱線
服務時間:周一至周五9:00-18:00
微信關注
獲取一手干貨分享
免費技術研討會
editor@netbroad.com
400-003-2006
主站蜘蛛池模板: 国产成人无精品久久久 | 时空行者在线观看完整国语版免费 | 国产?清av在线一区二区三区 | 日日插日日操 | 久久精品国产99久久6动漫欧 | 成年美女免费视频 | 国产精品白丝喷水在线观看 | 在线观看免费视频网站 | 毛片久久久| 四虎永久在线精品视频 | 亚洲成在人线AV无码 | chinesefree抽搐高潮 | 日韩国产欧美在线视频 | 十二夜在线观看免费粤语 | xxxx欧美丰满大屁股free | 欧美极品欧美精品欧美视频 | 后进极品美女白嫩翘臀 | 国产精品色| 黄色成年人在线观看 | 强行从后面挺进人妻 | 五月天婷婷激情视频 | 一级毛片不卡免费视频 | 欧美一级一区 | 18处破外女出血在线 | 日本无码小泬粉嫩有套在线 | free videos性欧美另类 | 破地狱粤语版免费观看全部粤语版 | 国产一级做a爰片久久真人片男 | 日本不卡视频一区二区三区 | 国产亚洲成人av | 久久国产精品免费观看 | 无遮无码免费裸交视频 | 久久高清国产 | porn日韩| 午夜av亚洲女人剧场se | 日本久久小视频 | 性俄罗斯xxxxxbbbbbb极品 鲁一鲁亚洲无线码 | 日日做夜夜操 | 综合无码一区二区三区四区五区 | japanese色国产在线看 | 视频在线观看一区 |