📄 cmain70310.c
字号:
//=============================================
//TMS320LF2407A USB1.0 CONTROLLER
//=============================================
#include "regs240x.h"
#include "usb.h"
typedef unsigned char uint8; // 无符号8位整型变量
typedef signed char int8; // 有符号8位整型变量
typedef unsigned int uint16; // 无符号16位整型变量
typedef signed int int16; // 有符号16位整型变量
typedef unsigned long uint32; // 无符号32位整型变量
typedef signed long int32; // 有符号32位整型变量
typedef float fp32; // 单精度浮点数(32位长度)
typedef double fp64; // 双精度浮点数(64位长度)
typedef unsigned char BOOLEAN;
typedef unsigned char INT8U; // Unsigned 8 bit quantity
typedef signed char INT8S; // Signed 8 bit quantity
typedef unsigned int INT16U; // Unsigned 16 bit quantity
typedef signed int INT16S; // Signed 16 bit quantity
typedef unsigned long INT32U; // Unsigned 32 bit quantity
typedef signed long INT32S; // Signed 32 bit quantity
typedef float FP32; // Single precision floating point
typedef double FP64; // Double precision floating point
typedef unsigned long DWORD;
#define U8 INT8U // unsigned 8 bits.
#define I16 INT16S // signed 16 bits.
#define U16 INT16U // unsigned 16 bits.
#define I32 INT32S // signed 32 bits.
#define U32 INT32U // unsigned 32 bits.
#define I16P INT16S // signed 16 bits OR MORE !
#define U16P INT16U // unsigned 16 bits OR MORE !
//12 相关定义
#define D12_NOLAZYCLOCK 0x02
#define D12_CLOCKRUNNING 0x04
#define D12_SOFTCONNECT 0x10
#define D12_CLOCK_12M 0x03
#define D12_CLOCK_4M 0x0b
#define D12_SETTOONE 0x40
#define D12_INT_ENDP0OUT 0x01
#define D12_INT_ENDP0IN 0x02
#define D12_INT_ENDP1OUT 0x04
#define D12_INT_ENDP1IN 0x08
#define D12_INT_ENDP2OUT 0x10
#define D12_INT_ENDP2IN 0x20
#define D12_INT_BUSRESET 0x40
#define D12_INT_SUSPENDCHANGE 0x80
#define D12_INT_EOT 0x0100
#define STATUS_ERR 1
#define STATUS_OK 0
#define UsbDevDescType 1
#define UsbCfgDescType 2
#define UsbStrDescType 3
#define UsbItfDescType 4
#define UsbEndpDescType 5
#define UsbPwrDescType 6
#define UsbDevDescSize 18
#define UsbCfgDescSize 9
#define UsbItfDescSize 9
#define UsbEndpDescSize 7
#define UsbEndpBulk 2
#define UsbEndpInterrupt 3
#define Ep0PacketSize 16
#define Ep1PacketSize 16
#define Ep2PacketSize 64
#define EndpCnt 4
#define UsbTotalCfgDescSize UsbCfgDescSize+UsbItfDescSize+EndpCnt*UsbEndpDescSize
#define D12EpStall 1
//===================================
//设备描述符数据结构
//===================================
typedef struct
{
INT8U size;
INT8U type;
INT8U ver1;
INT8U ver2;
INT8U class;
INT8U subclass;
INT8U protocol;
INT8U pktsize;
INT8U vid1;
INT8U vid2;
INT8U pid1;
INT8U pid2;
INT8U pver1;
INT8U pver2;
INT8U stridx0;
INT8U stridx1;
INT8U stridx2;
INT8U itfcnt;
}UsbDevDesc;
//===========================================
//全部描述符数据结构
//===========================================
typedef struct
{
UsbDevDesc DevDesc;
INT8U CfgDesc[9];
INT8U ItfDesc[9];
INT8U Endp2Desc[7];
INT8U Endp3Desc[7];
INT8U Endp4Desc[7];
INT8U Endp5Desc[7];
}Drivpake;
//============================================
//描述符具体定义
//============================================
Drivpake static ThisDevDesc =
{
{ //设备描述符
UsbDevDescSize, //设备描述符长度,= 12H
UsbDevDescType, //设备描述符类型,= 01H
0x10, //协议版本,= 1.10
0x01, //协议版本,= 1.10
0xdc,//0, //测试设备类型, = 0DCH
0, 0, //设备子类,设备协议
Ep0PacketSize, //端点0最大数据包大小,= 10H
0x71, //PHILIPS公司的设备ID
0x04, //PHILIPS公司的设备ID
0x66, //设备制造商定的产品ID
0x06, //设备制造商定的产品ID
0x00, //设备系列号
0x01, //设备系列号
0, 0, 0, //索引
1 //可能的配置数
},
{ //配置描述符
UsbCfgDescSize, //配置描述符长度,= 09H
UsbCfgDescType, //配置描述符类型,= 02H
UsbTotalCfgDescSize, //描述符总长度, = 002EH
0,
1, //只支持1个接口
1, //配置值
0, //字符串描述符指针(无)
0x80, //自供电,支持远程唤醒
0x32 //最大功耗(100mA)
},
{ //接口描述符
UsbItfDescSize, //接口描述符长度,= 09H
UsbItfDescType, //接口描述符类型,= 04H
0, //接口数,只有1个
0, //可选配置,只有1个
EndpCnt, //除端点0的端点索引数目,= 04H
0xdc,//UsbClassMassStorage, //测试设备类型,= 0DCH
0xa0,//UsbSubClassUfi, //子类代码,= 0A0H
0xb0,//UsbProtocolBulk, //协议代码,= 0B0H
0 //字符串描述符索引
},
//========================================
{ //端点描述符,端点1输入
UsbEndpDescSize, //端点描述符长度,= 07H
UsbEndpDescType, //端点描述符类型,= 05H
0x81, //端点1 IN
UsbEndpInterrupt, //中断传输, = 03H
Ep1PacketSize, //端点最大包的大小,= 0010H
0, //传输间隔时间,= 10ms
10
},
{ //端点描述符,端点1输出
UsbEndpDescSize, //端点描述符长度,= 07H
UsbEndpDescType, //端点描述符类型,= 05H
0x01, //端点1 OUT
UsbEndpInterrupt, //中断传输,= 03H
Ep1PacketSize, //端点最大包的大小,= 0010H
0, //传输间隔时间,= 10ms
10
},
//========================================
{ //端点2输入
UsbEndpDescSize, //端点描述符长度,= 07H
UsbEndpDescType, //端点描述符类型,= 05H
0x82, //端点2 OUT
UsbEndpBulk, //批量传输,= 02H
Ep2PacketSize, //端点最大包的大小,= 0040H
0, //批量传输时该设备无效
10
},
{ //端点2输出
UsbEndpDescSize, //端点描述符长度,= 07H
UsbEndpDescType, //端点描述符类型,= 05H
0x2, //端点2 IN
UsbEndpBulk, //批量传输,= 02H
Ep2PacketSize, //端点最大包的大小,= 0040H
0, //批量传输时该设备无效
10
}
};
static char SetupPkt[8];
static INT8U usb_remote_wake;
static INT8U UsbSendDescF;
static INT8U usb_config;
static int send_remain;
static INT32U send_ptr;
INT8U receive_buf[100];
unsigned int USBID0;
unsigned int USBID1;
unsigned int USBint_reg1;
unsigned int USBint_reg2;
unsigned int P0lstin_status;
unsigned int P0lstout_status;
//========================================
void ep0_rxdone(void);
void ep0_txdone(void);
void UsbSendDesc(void);
void D12AckEp(INT8U Ep);
void D12SelEp(INT8U Ep);
void D12SetEp(INT8U Val);
void D12RdEpStat(INT8U Ep);
void D12SetAddr(INT8U Addr);
void D12RdLastTrStat(INT8U Ep);
void outportb(INT8U port, INT8U val);
void D12SetEpStat(INT8U Ep,INT8U Stat);
void D12SetMode(INT8U Val1, INT8U Val2);
INT8U inportc(void);
INT8U D12RdInt(void);
INT8U inportb(INT8U port);
INT8U D12WrEp(INT8U Ep, char *buf,INT8U cnt);
INT8U D12RdEp(INT8U Ep, char *buf, INT8U cnt);
//========================================
// 函数名称: void bus_delay(void)
// 功能描述: 总线延时
// 输 入: 无
// 输 出: 无
//========================================
void bus_delay(void)
{
INT8U i;
//i = D12_NOP;
for(i=0;i<10;i++);
}
/*
DELAY:
DMOV R
*/
//========================================
// 函数名称: void outportc(INT8U Data)
// 功能描述: 输出命令
// 输 入: INT8U Data: 命令字节
// 输 出: 无
//========================================
void outportc(INT8U Data)
{
bus_delay();
D12_COM = Data;
}
//========================================
// 函数名称: void outportd(INT8U Data)
// 功能描述: 输出数据
// 输 入: INT8U Data: 数据字节
// 输 出: 无
//========================================
void outportd(INT8U Data)
{
bus_delay();
D12_DAT = Data;
}
//========================================
// 函数名称: INT8U inportd(void)
// 功能描述: 读入数据
// 输 入: 无
// 输 出: 读到的数据
//========================================
INT8U inportd(void)
{
bus_delay();
return D12_DAT;
}
INT8U inportc(void)
{
bus_delay();
return D12_COM;
}
void outportb(INT8U port, INT8U val)
{
INT8U i;
if(port)
outportc(val); //while port=1 it is for command
else
outportd(val); //while port=1 it is for command
i = 25; //延时,使得读写周期大于500ns
while(i--);
}
INT8U inportb(INT8U port)
{
INT8U c;
INT8U i;
if(port) c = inportc();
else c = inportd();
i = 25; //延时,使得读写周期大于500ns
while(i--);
return c;
}
//========================================
// 函数名称: void D12_SetMode(INT8U bConfig,INT8U bClkDiv)
// 功能描述: 模式设置
// 输 入: INT8U bConfig: 配置字节信息
// INT8U bClkDiv: 分频系数
// 输 出: 无
//========================================
void D12_SetMode(INT8U bConfig,INT8U bClkDiv)
{
outportc(0xF3); //输出设置模式指令
outportd(bConfig); //输出配置字节信息
outportd(bClkDiv); //输出时钟分频因数字节
}
//========================================
// 函数名称: INT16U D12_ReadInterruptRegister(void)
// 功能描述: 读取中断寄存器值
// 输 入: 无
// 输 出: 中断寄存器值
//========================================
INT16U D12_ReadInterruptRegister(void)
{
INT8U b1;
INT16U j;
outportc(0xF4); //读取中断寄存器命令
b1 = inportd(); //读取低8位字节
j = inportd(); //读取高8位字节
j = j * 256;
j += b1; //组合为16位
return j;
}
//========================================
// 函数名称: INT8U D12_ReadEndpointStatus(INT8U bEndp)
// 功能描述: 读取端点状态
// 输 入: INT8U bEndp: 端点索引号,取值0 ~ 5
// 输 出: 端点状态
//========================================
INT8U D12_ReadEndpointStatus(INT8U bEndp)
{
INT8U c;
outportc(0x80 + bEndp); //读取端点状态命令
c = inportd(); //读取端点状态
return c;
}
//========================================
// 函数名称: INT8U D12_ReadLastTransactionStatus(INT8U bEndp)
// 功能描述: 读取最后处理状态寄存器
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -