?? d12driver.c
字號:
/****************************************Copyright (c)**************************************************
** 廣州周立功單片機發展有限公司
** 研 究 所
** 產品一部
**
** http://www.zlgmcu.com
**
** 文 件 名: D12Driver.c
** 最后修改日期: 2004年7月2日
** 描 述: USB驅動程序軟件包: PDIUSBD12 設備端驅動程序 應用層
** 版 本: V1.0
**********************************************************************************************************/
#include "config.h"
#include "D12Config.h"
#include "D12CI.h"
#include "D12HAL.h"
#include "Chap_9.h"
#include "D12Driver.h"
extern EPPFLAGS bEPPflags;
/** Setup包處理任務堆棧 */
OS_STK TaskSetupStk[128];
/** Setup包處理任務事件指針 ***/
OS_EVENT *pSetup_Event;
/******* PDIUSBD12各端點對應的 USB 接收或發送控制塊 *********/
CTRL_USB UsbRec_Ep2; //端點2接收控制塊
CTRL_USB UsbRec_Ep1; //端點1接收控制塊
CTRL_USB UsbSend_Ep2; //端點2發送控制塊
CTRL_USB UsbSend_Ep1; //端點1發送控制塊
/***********************************************************************
** 函數名稱: INT8U WritePort1(INT32U len,INT8U *sendbuff,INT16U timeout)
** 功能描述: 用端點 1 發送len個字節
** 輸 入: INT32U len: 發送的字節數(取值范圍為0x00000001 ~ 0xFFFFFFFF)
INT8U sendbuff: 發送緩沖區指針
INT16U timeout: 超時等待時間, 必須大于等于0
** 輸 出: 0: 發送成功 > 0: 發送失敗(錯誤碼)
************************************************************************/
INT8U WritePort1(INT32U len,INT8U *sendbuff,INT16U timeout)
{
return (USB_WritePort(3,16,1,&UsbSend_Ep1,sendbuff,len,timeout));
} //往端點1(端點索引號3)發送數據
/***********************************************************************
** 函數名稱: INT8U WritePort2(INT32U len,INT8U *sendbuff,INT16U timeout)
** 功能描述: 用端點 2 發送len個字節
** 輸 入: INT32U len: 發送的字節數(取值范圍為0x00000001 ~ 0xFFFFFFFF)
INT8U *sendbuff: 發送指針
INT16U timeout: 超時時間, 必須大于等于0
** 輸 出: 0: 發送成功 > 0: 發送失敗(錯誤碼)
***********************************************************************/
INT8U WritePort2(INT32U len,INT8U *sendbuff,INT16U timeout)
{
return (USB_WritePort(5,64,2,&UsbSend_Ep2,sendbuff,len,timeout));
} //往端點2(端點索引號5)發送數據
/**********************************************************************
** 函數名稱: INT8U ReadPort1(INT32U len,INT8U *recbuff,INT16U timeout)
** 功能描述: 從端點 1 讀出 len個字節
** 輸 入: INT32U len: 要讀出的字節數(取值范圍為0x00000001 ~ 0xFFFFFFFF)
INT8U *recbuff: 接收數據指針
INT16U timeout: 超時時間, 必須大于等于0
** 輸 出: 0: 讀出成功 > 0: 讀出失敗(錯誤碼)
***********************************************************************/
INT8U ReadPort1(INT32U len,INT8U *recbuff,INT16U timeout)
{
return (USB_ReadPort(2,&UsbRec_Ep1,len,recbuff,timeout));
}
/**********************************************************************
** 函數名稱: INT8U ReadPort2(INT32U len,INT8U *recbuff,INT16U timeout)
** 功能描述: 從端點 2 讀出len個字節
** 輸 入: INT32U len: 要讀出的字節數(取值范圍為0x00000001 ~ 0xFFFFFFFF)
INT8U *recbuff: 接收數據指針
INT16U timeout: 超時時間, 必須大于等于0
** 輸 出: 0: 讀出成功 > 0: 讀出失敗(錯誤碼)
**********************************************************************/
INT8U ReadPort2(INT32U len,INT8U *recbuff,INT16U timeout)
{
return (USB_ReadPort(4,&UsbRec_Ep2,len,recbuff,timeout));
}
/*********************************************************************
** 函數名稱: INT8U Init_D12(void)
** 功能描述: 設置D12與硬件的連接, 初始化D12, 復位D12
** 輸 入: 無
** 輸 出: 0: 初始化成功 1: 初始化失敗
**********************************************************************/
INT8U Init_D12(void)
{
INT32U i;
OS_ENTER_CRITICAL();
Init_D12Port(); //初始化PDIUSBD12與LPC2200的連接的硬件配置
Rst_D12(); //復位PDIUSBD12
reconnect_USB(); //重新連接USB
if (readchipid() != 0x1012){ //讀取芯片ID號,如果不為 1012H
OS_EXIT_CRITICAL();
return 1; //則復位失敗
}
bEPPflags.value = 0; //初始化USB事件標志變量
UsbRec_Ep1.Sem = 0; //端點1接收資源允許使用
UsbRec_Ep2.Sem = 0; //端點1接收資源允許使用
UsbSend_Ep1.Sem = 0; //端點1發送資源允許使用
UsbSend_Ep2.Sem = 0; //端點1發送資源允許使用
UsbRec_Ep1.Grp = 0; //端點1無任務等待接收
UsbRec_Ep2.Grp = 0; //端點2無任務等待接收
UsbSend_Ep1.Grp = 0; //端點1無任務等待發送
UsbSend_Ep2.Grp = 0; //端點2無任務等待發送
for (i = 0; i < OS_RDY_TBL_SIZE; i++){
UsbRec_Ep1.Tbl[i] = 0; //清空端點1和2接收與發送等待任務列表
UsbRec_Ep2.Tbl[i] = 0;
UsbSend_Ep1.Tbl[i] = 0;
UsbSend_Ep2.Tbl[i] = 0;
}
pSetup_Event = OSSemCreate(0); //創建Setup包處理任務信號量
if (pSetup_Event == NULL) //如果返回的事件指針為空
{
OS_EXIT_CRITICAL();
return 1; //則初始化失敗
}
OS_EXIT_CRITICAL();
return 0; //初始化成功
}
//總線復位處理子程序
void bus_reset(void)
{
}
//DMA結束處理
void dma_eot(void)
{
}
//總線掛起改變
void usb_suspend(void)
{
}
/******************************************
** 函數名稱: void Usb_Exception(void)
** 功能描述: D12中斷服務程序
*******************************************/
void Usb_Exception(void)
{
INT16U i_st;
OS_ENTER_CRITICAL();; //進入D12中斷服務程序時關中斷
i_st = D12_ReadInterruptRegister(); //讀取PDIUSBD12中斷寄存器值
if(i_st != 0) {
if(i_st & D12_INT_BUSRESET)
bus_reset(); //總線復位處理
if(i_st & D12_INT_EOT)
dma_eot(); //DMA傳輸技術處理
if(i_st & D12_INT_SUSPENDCHANGE)
usb_suspend(); //總線掛起改變
if(i_st & D12_INT_ENDP0IN)
ep0_txdone(); //控制端點發送數據處理
if(i_st & D12_INT_ENDP0OUT)
ep0_rxdone(); //控制端點接收數據處理
if(i_st & D12_INT_ENDP1IN)
USB_WriteISR(&UsbSend_Ep1,3,16,1); //端點 1發送數據處理
if(i_st & D12_INT_ENDP1OUT)
USB_ReadISR(&UsbRec_Ep1,2,16,1); //端點 1接收數據處理
if(i_st & D12_INT_ENDP2IN)
USB_WriteISR(&UsbSend_Ep2,5,64,2); //端點 2發送數據處理
if(i_st & D12_INT_ENDP2OUT)
USB_ReadISR(&UsbRec_Ep2,4,64,2); //端點 2接收數據處理
}
//add for uC/OS-II
CLR_INTD12(); //清除PDIUSBD12的中斷標志
CLR_INT(); //通知中斷結束
OS_EXIT_CRITICAL(); //退出D12中斷服務程序時開中斷
}
/*******************************************************************
** 函數名稱: void TaskSetup(void *pdata)
** 功能描述: 控制傳輸處理
** 輸 入: void *pdata 任務參數
** 輸 出: 無
** 注 意: 該任務的優先級應高于其它任務,才能在任何情況下傳輸Setup包
********************************************************************/
void TaskSetup(void *pdata)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
INT8U err;
pdata = pdata; /* Prevent compiler warning */
for (;;)
{
OSSemPend(pSetup_Event,0,&err); //等待Setup包
if (err == OS_NO_ERR){ //接收到Setup包
OS_ENTER_CRITICAL(); //關中斷
control_handler(); //進行控制傳輸處理
OS_EXIT_CRITICAL(); //開中斷
}
}
}
/*******************************************************************************************
** 函數名稱: void USB_ReadISR(CTRL_USB *pUsb,INT8U endp,INT32U eppsize,INT8U buffnums)
** 功能描述: USB 端點接收中斷服務程序
** 輸 入: CTRL_USB *pUsb: USB 接收與發送控制結構體指針
INT8U endp: 端點索引號
INT32U eppsize: 端點最大信息包大小
INT8U buffnums: 該端點緩沖區個數(如D12的端點2有兩個接收緩沖區)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -