📄 usbmainold.c
字号:
else
stall_ep0();
}
//-------------------------------------------------------------------------------------------set_address()设置地址
void set_address(void)
{ Clr_WDog(); //清w-dog
D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue &
DEVICE_ADDRESS_MASK), 1);
single_transmit(0, 0);
}
//------------------------------------------------------------------------------------------get_descriptor()获取描述符
void get_descriptor(void)
{
unsigned char bDescriptor = MSB(ControlData.DeviceRequest.wValue); //读取请求描述符类型;
Clr_WDog(); //清w-dog
if (bDescriptor == 0x01) //USB_DEVICE_DESCRIPTOR_TYPE) //0x01
{ //获取设备描述符;
code_transmit((unsigned char code *)&DeviceDescr, 0x12); // sizeof(USB_DEVICE_DESCRIPTOR));
}
else if (bDescriptor == 0x02) //USB_CONFIGURATION_DESCRIPTOR_TYPE) //0x02;
{
code_transmit((unsigned char code *)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH); //
}
else
stall_ep0();
}
//---------------------------------------------------------------------------------------get_configuration获取配置
void get_configuration(void)
{
unsigned char c = bEPPflags.bits.configuration;
Clr_WDog(); //清w-dog
single_transmit(&c, 1); //返回配置值;
}
//---------------------------------------------------------------------------------------set_configuration()设置配置
void set_configuration(void)
{ Clr_WDog(); //清w-dog
if (ControlData.DeviceRequest.wValue == 0)
{
//* put device in unconfigured state
single_transmit(0, 0); //发送响应;
DISABLE;
bEPPflags.bits.configuration = 0; //标记未配置;
ENABLE;
init_unconfig(); //进入地址状态,禁止0除外所有端点;
}
else if (ControlData.DeviceRequest.wValue == 1)
{
// Configure device 配置设置
//发送响应;
init_unconfig(); //进入地址状态,禁止0除外所有端点;
init_config(); //配置处理,允许端点收发;
DISABLE;
bEPPflags.bits.configuration = 1; //标记已配置;
ENABLE;
single_transmit(0, 0);
}
else
stall_ep0();
}
//---------------------------------------------------------------------------------get_interface()获取接口信息
void get_interface(void)
{
unsigned char txdat = 0; // Only/Current interface = 0 本设备只有一个接口;
single_transmit(&txdat, 1);
Clr_WDog(); //清w-dog
}
//--------------------------------------------------------------------------------set_interface()设置接口
void set_interface(void)
{ Clr_WDog(); //清w-dog
if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
single_transmit(0, 0); //发送响应;
else
stall_ep0();
}
void init_unconfig(void)
{ Clr_WDog(); //清w-dog
D12_SetEndpointEnable(0); /* Disable all endpoints but EPP0. */
}
void init_config(void)
{ Clr_WDog(); //清w-dog
D12_SetEndpointEnable(1); /* Enable generic/iso endpoints. */
}
//用户厂商请求
code void (*VendorDeviceRequest[])(void) =
{
reserved,
reserved,
reserved,
reserved,
reserved,
reserved,
reserved,
reserved,
reserved,
reserved,
reserved,
reserved,
reserved,
// read_write_register,
reserved,
reserved,
reserved
};
//保留子程序;
void reserved(void)
{ Clr_WDog(); //清w-dog
stall_ep0(); //返回STALL;
}
//端点0,1有效
void stall_ep0(void)
{ Clr_WDog(); //清w-dog
D12_SetEndpointStatus(0, 1);
D12_SetEndpointStatus(1, 1);
}
void single_transmit(unsigned char * buf, unsigned char len)
{ Clr_WDog(); //清w-dog
if( len <= EP0_PACKET_SIZE)
{
D12_WriteEndpoint(1, len, buf);
}
}
void code_transmit(unsigned char code * pRomData, unsigned short len)
{ Clr_WDog(); //清w-dog
ControlData.wCount = 0;
if(ControlData.wLength > len)
ControlData.wLength = len;
ControlData.pData = pRomData;
if( ControlData.wLength >= EP0_PACKET_SIZE) //16
{ // 如果发送代码大于包长度
D12_WriteEndpoint(1, 16, ControlData.pData);
ControlData.wCount += EP0_PACKET_SIZE;
DISABLE;
bEPPflags.bits.control_state = USB_TRANSMIT;
ENABLE;
}
else
{ //发送代码小于包长度
D12_WriteEndpoint(1, ControlData.wLength, pRomData);
ControlData.wCount += ControlData.wLength;
DISABLE;
bEPPflags.bits.control_state = USB_IDLE;
ENABLE;
}
}
/**********************************************/
/***************** *******************/
/*************** 硬件提取层 *****************/
/****************** *******************/
/**********************************************/
void outportcmd(unsigned char value) //输出命令
{
*((unsigned char xdata *)D12_COMMAND)=value;
}
void outportdata(unsigned char value) //输出数据
{
*((unsigned char xdata *)D12_DATA)=value;
}
unsigned char inportb(unsigned int Addr) //接受数据
{
return *((unsigned char xdata *)Addr);
}
/**********************************************/
/***************** *******************/
/*************** 命令集 *****************/
/****************** *******************/
/**********************************************/
void D12_SetAddressEnable(unsigned char bAddress, unsigned char bEnable) //设置地址使能;
{ Clr_WDog(); //清w-dog
if(bEPPflags.bits.in_isr == 0) //usb中断服务标志;
DISABLE;
outportcmd(0xD0);
if(bEnable)
bAddress |= 0x80; //设置地址使能;
outportdata(bAddress);
if(bEPPflags.bits.in_isr == 0)
ENABLE;
}
void D12_SetEndpointEnable(unsigned char bEnable) //设置端点使能;
{ Clr_WDog(); //清w-dog
if(bEPPflags.bits.in_isr == 0)
DISABLE;
outportcmd(0xD8);
if(bEnable)
outportdata(1); //普通,同步端点使能;
else
outportdata(0);
if(bEPPflags.bits.in_isr == 0)
ENABLE;
}
void D12_SetMode(unsigned char bConfig, unsigned char bClkDiv) //设置模式;
{ Clr_WDog(); //清w-dog
outportcmd(0xF3);
outportdata(bConfig);
outportdata(bClkDiv);
}
unsigned int D12_ReadInterruptRegister(void) //读取中断寄存器;
{
unsigned char b1,b2;
unsigned int j1=0x0000;
Clr_WDog(); //清w-dog
outportcmd(0xF4);
b1 = inportb(D12_DATA);
b2 = inportb(D12_DATA);
j1=(b2<<8);
j1 +=b1 ;
return j1;
}
unsigned char D12_SelectEndpoint(unsigned char bEndp) //端点选择;
{
unsigned char c;
Clr_WDog(); //清w-dog
if(bEPPflags.bits.in_isr == 0)
DISABLE;
outportcmd(bEndp);
c = inportb(D12_DATA);
if(bEPPflags.bits.in_isr == 0)
ENABLE;
return c; //1满,0空;停止位1有效;
}
unsigned char D12_ReadLastTransactionStatus(unsigned char bEndp) //读取端点最后处理状态;
{ Clr_WDog(); //清w-dog
outportcmd(0x40 + bEndp);
return inportb(D12_DATA);
}
void D12_SetEndpointStatus(unsigned char bEndp, unsigned char bStalled) //设置端点状态
{ Clr_WDog(); //清w-dog
if(bEPPflags.bits.in_isr == 0)
DISABLE;
outportcmd(0x40 + bEndp);
outportdata(bStalled);
if(bEPPflags.bits.in_isr == 0)
ENABLE;
}
unsigned char D12_ReadEndpoint(unsigned char endp, unsigned char len, unsigned char * buf) //读取端点数据;
{
unsigned char xdata i, j;
Clr_WDog(); //清w-dog
if(bEPPflags.bits.in_isr == 0)
DISABLE;
outportcmd(endp);
i=inportb(D12_DATA); //选择端点
if( (i & D12_FULLEMPTY) == 0)
{ //如果缓冲区为空,则返回
if(bEPPflags.bits.in_isr == 0)
ENABLE;
return 0;
}
outportcmd(0xF0); //读缓冲区
j = inportb(D12_DATA);
j = inportb(D12_DATA);
if(j > len)
j = len;
for(i=0; i<j; i++)
{ *(buf+i) = inportb(D12_DATA);
Clr_WDog(); //清w-dog
}
outportcmd(0xF2); //缓冲区清空
if(bEPPflags.bits.in_isr == 0)
ENABLE;
return j;
}
unsigned char D12_WriteEndpoint(unsigned char endp, unsigned char len, unsigned char * buf) //把数据写入端点;
{
unsigned char xdata i;
Clr_WDog(); //清w-dog
if(bEPPflags.bits.in_isr == 0)
DISABLE;
outportcmd(endp); //选择端点
inportb(D12_DATA); //读入满/空状态 《 无处理?〉
outportcmd(0xF0); //写缓冲区命令
outportdata(0);
outportdata(len);
for(i=0; i<len; i++)
{ Clr_WDog(); //清w-dog
outportdata(*(buf+i));
}
outportcmd(0xFA); //使缓冲区有效,在接受到下一个IN标志后将其送入主机;
if(bEPPflags.bits.in_isr == 0)
ENABLE;
return len;
}
unsigned char D12_WriteEndpoint5(unsigned char len) //把数据写入端点2的缓冲区
{
unsigned char xdata i;
Clr_WDog(); //清w-dog
if(bEPPflags.bits.in_isr == 0)
DISABLE;
outportcmd(5); //选择端点
inportb(D12_DATA); //读入满/空状态 《 无处理?〉
outportcmd(0xF0); //写缓冲区命令
outportdata(0);
outportdata(64);
for(i=0; i<64; i++)
{ Clr_WDog(); //清w-dog
outportdata(MainEpBuf2[i]);
}
outportcmd(0xFA); //使缓冲区有效,在接受到下一个IN标志后将其送入主机;
if(bEPPflags.bits.in_isr == 0)
ENABLE;
if(len_tmp_data==7510 )
{
len_tmp_data=len;
}
return len;
}
void D12_AcknowledgeEndpoint(unsigned char endp) //端点应答处理;
{ Clr_WDog(); //清w-dog
outportcmd(endp); //选择端点
outportcmd(0xF1); //应答设置
if(endp == 0)
outportcmd(0xF2); //缓冲区清零
}
//*********************************************************************//
//**************************** ****************************//
//**************************** ISR ****************************//
//**************************** ****************************//
//*********************************************************************//
usb_isr() interrupt 2
{
Clr_WDog(); //清w-dog
EX1=0;
fn_usb_isr();
EX1=1;
}
void fn_usb_isr()
{
unsigned int i_st;
Clr_WDog(); //清w-dog
bEPPflags.bits.in_isr = 1;
i_st = D12_ReadInterruptRegister();
if(i_st != 0)
{
if(i_st & 0x02) // 控制输入
ep0_txdone();
if(i_st & 0x01) // 控制输出;0x01
ep0_rxdone();
if(i_st & 0x08) // 端点1输出;
ep1_txdone();
if(i_st & 0x04) // 端点1输入 //0x04
ep1_rxdone();
if(i_st & 0x20) // 端点2输出; //0x20
main_txdone();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -