?? chap_9.c
字號:
/****************************************Copyright (c)**************************************************
** 廣州周立功單片機(jī)發(fā)展有限公司
** 研 究 所
** 產(chǎn)品一部
**
** http://www.zlgmcu.com
** 文 件 名: Chap_9.c
** 最后修改日期: 2004年7月2日
** 描 述: USB驅(qū)動程序軟件包: PDIUSBD12 設(shè)備端驅(qū)動程序 協(xié)議層
** 版 本: V1.0
**********************************************************************************************************/
#include <stdio.h>
#include <string.h>
#include "config.h"
#include "D12Config.h"
#include "D12CI.h"
#include "D12HAL.h"
#include "Chap_9.h"
#include "Descriptor.h"
//定義傳輸控制結(jié)構(gòu)變量
CONTROL_XFER ControlData;
//定義USB事件標(biāo)志變量
EPPFLAGS bEPPflags;
extern OS_EVENT *pSetup_Event;
//*************************************************************************
//USB標(biāo)準(zhǔn)設(shè)備請求入口地址指針表
//*************************************************************************
void (*StandardDeviceRequest[])(void) =
{
get_status,
clear_feature,
reserved,
set_feature,
reserved,
set_address,
get_descriptor,
reserved,
get_configuration,
set_configuration,
get_interface,
set_interface,
reserved,
reserved,
reserved,
reserved
};
//*************************************************************************
// USB 協(xié)議層函數(shù)
//*************************************************************************
/*************************************
** 函數(shù)名稱: void stall_ep0(void)
** 功能描述: 使控制端點處于停止?fàn)顟B(tài)
**************************************/
void stall_ep0(void)
{
D12_SetEndpointStatus(0, 1);
D12_SetEndpointStatus(1, 1);
}
/*************************************
** 函數(shù)名稱: void reserved(void)
** 功能描述: 保留子程序
**************************************/
void reserved(void)
{
stall_ep0(); //返回STALL
}
/**********************************************
** 函數(shù)名稱: void init_unconfig(void)
** 功能描述: 進(jìn)入地址狀態(tài),禁止0除外的所有端點
***********************************************/
void init_unconfig(void)
{
D12_SetEndpointEnable(0); //禁止0除外的所有端點
}
/**********************************************
** 函數(shù)名稱: void init_config(void)
** 功能描述: 配置處理,允許端點收發(fā)
***********************************************/
void init_config(void)
{
D12_SetEndpointEnable(1); //使能普通/同步端點使能
}
/*********************************************************
** 函數(shù)名稱: void single_transmit(INT8U * buf, INT8U len)
** 功能描述: 通過端點索引 1 發(fā)送數(shù)據(jù)(DATA 類型)
** 輸 入: INT8U * buf: 發(fā)送數(shù)據(jù)指針
INT8U len: 發(fā)送數(shù)據(jù)長度
** 輸 出: 無
**********************************************************/
void single_transmit(INT8U * buf, INT8U len)
{
if( len <= EP0_PACKET_SIZE) { //長度小于EP0最大信息包大小才允許發(fā)送
D12_WriteEndpoint(1, len, buf);
}
}
/*************************************************************
** 函數(shù)名稱: void code_transmit(INT8U * pRomData, INT16U len)
** 功能描述: 通過端點索引 1 發(fā)送數(shù)據(jù)(CODE類型)
** 輸 入: INT8U *pRomData: 發(fā)送數(shù)據(jù)指針
INT16U len: 發(fā)送數(shù)據(jù)長度
** 輸 出: 無
**************************************************************/
void code_transmit(INT8U * pRomData, INT16U len)
{
ControlData.wCount = 0; //傳輸字節(jié)數(shù)計數(shù)器清0
if(ControlData.wLength > len)
ControlData.wLength = len; //傳輸數(shù)據(jù)總字節(jié)數(shù)不得超過len
ControlData.pData = pRomData; //傳輸數(shù)據(jù)指針指向pRomData
if( ControlData.wLength >= EP0_PACKET_SIZE) { //傳輸數(shù)據(jù)總字節(jié)數(shù)大于端點0最大信息包大小
D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData); //發(fā)送端點0最大信息包大小個字節(jié)
ControlData.wCount += EP0_PACKET_SIZE; //統(tǒng)計已發(fā)送字節(jié)數(shù)
OS_ENTER_CRITICAL();
bEPPflags.bits.control_state = USB_TRANSMIT; //標(biāo)志數(shù)據(jù)發(fā)送狀態(tài)
OS_EXIT_CRITICAL();
}
else {
D12_WriteEndpoint(1, ControlData.wLength, pRomData); //寫入傳輸數(shù)據(jù)總字節(jié)數(shù)
ControlData.wCount += ControlData.wLength; //統(tǒng)計已發(fā)送字節(jié)數(shù)
OS_ENTER_CRITICAL();
bEPPflags.bits.control_state = USB_IDLE; //標(biāo)志空閑狀態(tài)
OS_EXIT_CRITICAL();
}
}
//*************************************************************************
// USB 標(biāo)準(zhǔn)設(shè)備請求服務(wù)程序
//*************************************************************************
/********************************************************************
** 函數(shù)名稱: void get_status(void)
** 功能描述: 主機(jī)要求獲取狀態(tài),設(shè)備返回16位的狀態(tài)描述給主機(jī)
*********************************************************************/
void get_status(void)
{
INT8U endp, txdat[2], c;
INT8U bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
//取得設(shè)備請求類型
if (bRecipient == USB_RECIPIENT_DEVICE) { //對設(shè)備請求
if(bEPPflags.bits.remote_wakeup == 1)
txdat[0] = 3; //支持遠(yuǎn)程喚醒、自供電
else
txdat[0] = 1; //不支持遠(yuǎn)程喚醒、自供電
txdat[1]=0; //高8位為0
single_transmit(txdat, 2); //發(fā)送16位的狀態(tài)到主機(jī)
} else if (bRecipient == USB_RECIPIENT_INTERFACE) { //對接口請求
txdat[0]=0;
txdat[1]=0;
single_transmit(txdat, 2);
//發(fā)送16位的狀態(tài)到主機(jī)
} else if (bRecipient == USB_RECIPIENT_ENDPOINT) { //對端點請求
endp = (INT8U)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
if (ControlData.DeviceRequest.wIndex & (INT8U)USB_ENDPOINT_DIRECTION_MASK)
c = D12_SelectEndpoint(endp*2 + 1); //讀取輸入端點狀態(tài)
else
c = D12_SelectEndpoint(endp*2); //讀取輸出端點狀態(tài)
if(c & D12_STALL)
txdat[0] = 1; //端點禁止
else
txdat[0] = 0; //端點有效
txdat[1] = 0;
single_transmit(txdat, 2); //發(fā)送16位的狀態(tài)到主機(jī)
} else
stall_ep0(); //非標(biāo)準(zhǔn)請求,發(fā)STALL
}
/****************************************
** 函數(shù)名稱: void clear_feature(void)
** 功能描述: 清除特性
*****************************************/
void clear_feature(void)
{
INT8U endp; //讀取請求類型中的接收方
INT8U bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
//讀取請求類型
if (bRecipient == USB_RECIPIENT_DEVICE //對設(shè)備請求
&& ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
OS_ENTER_CRITICAL(); //清除遠(yuǎn)程喚醒特性
bEPPflags.bits.remote_wakeup = 0; //清0遠(yuǎn)程喚醒標(biāo)志
OS_EXIT_CRITICAL();
single_transmit(0, 0); //返回一個空的數(shù)據(jù)表示執(zhí)行完畢
}
else if (bRecipient == USB_RECIPIENT_ENDPOINT //對端點請求
&& ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
//清除端點禁止特性,恢復(fù)其使用
endp = (INT8U)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
if (ControlData.DeviceRequest.wIndex & (INT8U)USB_ENDPOINT_DIRECTION_MASK)
D12_SetEndpointStatus(endp*2 + 1, 0); //清除控制輸入端點STALL特性
else
D12_SetEndpointStatus(endp*2, 0); //清除控制輸出端點STALL特性
single_transmit(0, 0); //返回一個空的數(shù)據(jù)表示執(zhí)行完畢
} else
stall_ep0(); //沒有該請求,返回STALL
}
/****************************************
** 函數(shù)名稱: void set_feature(void)
** 功能描述: 設(shè)置特性
*****************************************/
void set_feature(void)
{
INT8U endp; //讀取請求類型中的接收方
INT8U bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
//讀取請求類型
if (bRecipient == USB_RECIPIENT_DEVICE //對設(shè)備請求
&& ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
//設(shè)置遠(yuǎn)程喚醒特性
OS_ENTER_CRITICAL();
bEPPflags.bits.remote_wakeup = 1; //置1遠(yuǎn)程喚醒標(biāo)志
OS_EXIT_CRITICAL();
single_transmit(0, 0); //返回一個空的數(shù)據(jù)表示執(zhí)行完畢
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -