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