⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 d12.c

📁 一个是混合鼠标键盘功能的HID设备使用d12
💻 C
📖 第 1 页 / 共 3 页
字号:
void get_report(void)
{
	;
}
void get_protocol(void)
{
	single_transmit(&protocol,1);
}

void set_idle(void)
{
    single_transmit(0,0);
    idle=control_data.DeviceRequest.wValue;
}
void set_report(void)
{
	;
}
void set_protocol(void)
{
    single_transmit(0,0);
    protocol=control_data.DeviceRequest.wValue;
}

void (* ClassRequest[])(void) = 
{
	reserved,
	get_report,
	get_idle,
	get_protocol,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	set_report,
	set_idle,
	set_protocol,
	reserved,
	reserved,
	reserved,
	reserved,
};
//*************************************************************************************************
//函数指针。。。
//*************************************************************************************************
void control_handler()
{
	uint8 type,receiver,reg;
	type     = control_data.DeviceRequest.bmRequestType&USB_REQUEST_TYPE_MASK;
	receiver = control_data.DeviceRequest.bmRequestType&USB_REQUEST_MASK;
	reg      = control_data.DeviceRequest.bRequest&USB_REQUEST_MASK;
	
	if(type == USB_STANDARD_REQUEST)
	{	
		if(receiver == 0)                                                                  //到设备
			(*StandardDeviceRequest[reg])();
		else
		if(receiver == 1)                                                                  //到接口
			(*StandardDeviceRequest[reg])();
		else
		if(receiver == 2)                                                                  //到端点
		{
			if(control_data.DeviceRequest.bRequest==0)
				get_status();
		}
	}
	else
	if(type == USB_CLASS_REQUEST)
    {
		if(receiver == 0)                                                                  //到设备
			(*ClassRequest[reg])();
		else
		if(receiver == 1)                                                                  //到接口
			(*ClassRequest[reg])();
		else
		if(receiver == 2)                                                                  //到端点
		{
			if(control_data.DeviceRequest.bRequest==0)
				get_status();
		}
	}
//	else
//	if(type == USB_VENDOR_REQUEST)
//		(*VendorDeviceRequest[reg])();
	else
		stall_ep0();
	//else
	//{
	//	D12_Endpoint_select(1);
	//	single_transmit(0, 0);
	//}
}
//*************************************************************************************************
//中断服务程序
//*************************************************************************************************
//********
//子程序
//********
//端点0 OUT中断
void ep0_rxdone(void)
{	
	//uint8 ep_status;
	uint8 i;
	uint8 ep_last_status;
	uint8 req[sizeof(DEVICE_REQUEST)];
	
	ep_last_status = D12_read_last_status_reg(0);                                //读最后状态寄存器
	if(ep_last_status&D12_SETUP_PACKET)                                            //等于则为设置包
	{
		control_data.wLength = 0;
		control_data.wCount = 0;											 //假如长度有误,则停止
		if(D12_read_Endpoint(0,sizeof(control_data.DeviceRequest),req)!= sizeof(DEVICE_REQUEST))
		{
			D12_set_Endpoint_status(0, 1);				                            //停止控制端点0
	    	D12_set_Endpoint_status(1, 1);			 	                            //停止控制端点1
	    	event_flag.bits.control_state = USB_IDLE;	                           //设置为等待状态
	    	return;
		}

		control_data.DeviceRequest.bmRequestType = req[0];
		control_data.DeviceRequest.bRequest		 = req[1];
		control_data.DeviceRequest.wValue 		 = req[3] * 256 + req[2]; 
		control_data.DeviceRequest.wIndex        = req[5] * 256 + req[4];
		control_data.DeviceRequest.wLength       = req[7] * 256 + req[6]; 
			
		D12_ack_Endpoint(0);                                                                 //应答
		D12_ack_Endpoint(1);                                                                 //应答
		
		//D12_Endpoint_select(0);
        //D12_clear_buff();

		control_data.wLength = control_data.DeviceRequest.wLength; 	     //取出要传输数据的总字节数
		control_data.wCount  = 0;
			
		if(control_data.DeviceRequest.bmRequestType&(uint8 )USB_ENDPOINT_DIRECTION_MASK)   //为输入
		{
			event_flag.bits.setup_packet = 1;
			event_flag.bits.control_state = USB_TRANSMIT;                                  //发送态
		}
		else 																		   //否则为输出
		{
			if(control_data.wLength == 0)
			{
				event_flag.bits.setup_packet = 1;
  				event_flag.bits.control_state = USB_IDLE;                        //长度为0,则停止态
			}
			else
			{
				if(control_data.wLength>MAX_CONTROL_DATA_SIZE)
				{
  					event_flag.bits.control_state = USB_IDLE;                    //长度为0,则停止态
  					D12_set_Endpoint_status(0,1);                                        //停止端点
					D12_set_Endpoint_status(1,1);                                        //停止端点
				}
				else
				{	
					event_flag.bits.control_state = USB_RECEIVE;                           //接收态
				}
			}
		}

	} 
	///////////////////////////////////////////////////////////////////////////////////////                      
    else //否则为普通接收状态
    if (event_flag.bits.control_state == USB_RECEIVE) 	  	                       //如果为接收状态
    {
        i = D12_read_Endpoint(0, EP0_PACKET_SIZE,
        control_data.dataBuffer + control_data.wCount);	 	                      //从端点0接收数据
        
        control_data.wCount += i;					 			               //统计已接收的字节数
       
        if( i != EP0_PACKET_SIZE || control_data.wCount >= control_data.wLength) 
        {  		                                                                     //数据接收完毕
	    	 event_flag.bits.setup_packet = 1;					 //通知control_handler()处理Setup包
	   		 event_flag.bits.control_state = USB_IDLE;	                           //设置为等待状态
        }
    }
    else                                                                       //不为输入也不为输出
	{
		event_flag.bits.control_state = USB_IDLE;				                     //设置等待状态
		//D12_Endpoint_select(0);
		//D12_clear_buff();
	}
	
}
//端点0 IN中断
void ep0_txdone(void)
{
	uint16 i;
	i = control_data.wLength - control_data.wCount;                            //计算未发送的字节数
	
	D12_read_last_status_reg(1);
	
	if(event_flag.bits.control_state != USB_TRANSMIT)		                     //非发送状态,返回
		return;
	
	if(i>= EP0_PACKET_SIZE)									             //剩下数据大于16B,发送16B
	{
		D12_write_Endpoint(1,EP0_PACKET_SIZE,control_data.pData + control_data.wCount);
		control_data.wCount += EP0_PACKET_SIZE;
		event_flag.bits.control_state = USB_TRANSMIT;                                  //设置传输态
	}
	else
	if(i != 0)												                         //发送剩下数据
	{
		D12_write_Endpoint(1,i,control_data.pData + control_data.wCount);
		control_data.wCount += i;
		event_flag.bits.control_state = USB_IDLE;                                      //设置等待态
		
	}
	else
	if(i == 0)												                     //发送完毕,发送0B
	{
		D12_write_Endpoint(1,0,0);
		event_flag.bits.control_state = USB_IDLE;                                      //设置等待态
	}
	
}
//端点1 IN中断
void ep1_txdone(void)
{
	D12_read_last_status_reg(3);
}
//端点1 OUT中断
void ep1_rxdone(void)
{
	uint8 len;
	D12_read_last_status_reg(2);
	len = D12_read_Endpoint(2,sizeof(GenEpBuf),GenEpBuf);
	if(len != 0)
		event_flag.bits.ep1_rxdone = 1;
}
//主端点 IN控制

extern void scan_key(void);

void main_txdone(void)
{  
	D12_read_last_status_reg(5);
}
//主端点 OUT控制
void main_rxdone(void)
{
	uint8 len,ep_status;
	
	D12_read_last_status_reg(4);
	ep_status = D12_read_Endpoint_status(4);
	ep_status &= 0x60;
	//接收数据
	len = D12_read_Endpoint(4,64,EpBuf);
	if(ep_status == 0x60)
		len = D12_read_Endpoint(4,64,EpBuf);

}
//DMA结束处理
void dma_eot(void)
{
}

//********
//中断程序
//********
//D12外部中断0中断服务程序
void  __irq D12_EINT0(void) 
{
	uint16 isr_status;
	DISABLE();
	isr_status = D12_read_interrupt_reg();                                 //读中断寄存器,清6-15位

	
	event_flag.bits.usb_isr = 1;
/*	
	switch(isr_status)
	{
		case 0x01:	ep0_rxdone();
			break;
		case 0x02:	ep0_txdone();
			break;
		case 0x04:	ep1_rxdone();
			break;
		case 0x08:	ep1_txdone();
			break;
		case 0x10:	main_rxdone();
			break;
		case 0x20:	main_txdone();
			break;
		case 0x40:	event_flag.bits.bus_reset = 1;
			break;
		case 0x80:	event_flag.bits.bus_suspend = 1;
			break;
		case 0x0100:
			break;
		default  :
			break;
	}
*/
	
    if(isr_status!=0)
	{
		if(isr_status&D12_INT_BUSRESET)
			event_flag.bits.bus_reset = 1;
		if(isr_status&D12_INT_EOT)
			dma_eot();
		if(isr_status&D12_INT_SUSPENDCHANGE)
			event_flag.bits.bus_suspend = 1;
		if(isr_status&D12_INT_ENDP0IN)
			ep0_txdone();
		if(isr_status&D12_INT_ENDP0OUT)
			ep0_rxdone();
		if(isr_status&D12_INT_ENDP1IN)
			ep1_txdone();
		if(isr_status&D12_INT_ENDP1OUT)
			ep1_rxdone();
		if(isr_status&D12_INT_ENDP2IN)
			main_txdone();
		if(isr_status&D12_INT_ENDP2OUT)
			main_rxdone();	
	}

	event_flag.bits.usb_isr = 0;
//以下作调试指示用
/*
    if(isr_status == 0x01)UART0_SendByte(0xa0);else	
	if(isr_status == 0x02)UART0_SendByte(0xa1);else
	if(isr_status == 0x04)UART0_SendByte(0xa2);else	
	if(isr_status == 0x08)UART0_SendByte(0xa3);else	
	if(isr_status == 0x10)UART0_SendByte(0xa4);else
	
	if(isr_status == 0x20)UART0_SendByte(0xa5);else
	if(isr_status == 0x40)UART0_SendByte(0xa6);else	
	if(isr_status == 0x80)UART0_SendByte(0xa7);else
	if(isr_status == 0x0100)UART0_SendByte(0xa8);
    else		
	if(isr_status ==0)	UART0_SendByte(0xaa);
	else 
	{
		UART0_SendByte(0xbb);
		UART0_SendByte(isr_status&0xff);
	}
	*/
	
	/*
    if(isr_status == 0x01){rcv_buf[0]+=1;if(rcv_buf[0]>9)rcv_buf[0]=0;}else	
	if(isr_status == 0x02){rcv_buf[1]+=1;if(rcv_buf[1]>9)rcv_buf[1]=0;}else
	if(isr_status == 0x04){rcv_buf[2]+=1;if(rcv_buf[2]>9)rcv_buf[2]=0;}else	
	if(isr_status == 0x08){rcv_buf[3]+=1;if(rcv_buf[3]>9)rcv_buf[3]=0;}else	
	if(isr_status == 0x10){rcv_buf[4]+=1;if(rcv_buf[4]>9)rcv_buf[4]=0;}else
	
	if(isr_status == 0x20){rcv_buf[5]+=1;if(rcv_buf[5]>9)rcv_buf[5]=0;}else
	if(isr_status == 0x40){rcv_buf[6]+=1;if(rcv_buf[6]>9)rcv_buf[6]=0;}else	
	if(isr_status == 0x80){rcv_buf[7]+=1;if(rcv_buf[7]>9)rcv_buf[7]=0;}
	//if(isr_status ==0){rcv_buf[1]+=1;if(rcv_buf[1]>9)rcv_buf[1]=0;}
	*/
	
	EXTINT   = 0x01;         			                                        //清除外部中断0标志
	VICVectAddr = 0x00;

	ENABLE();
}
//*************************************************************************************************
//D12初始化
//*************************************************************************************************
//D12外部中断0初始化
void D12_EINT0_init(void)
{
	PINSEL1  = (PINSEL1&0xfffffffc)| 0x00000001;                                         //01,EINT0
	EXTMODE  = EXTMODE&0x0e;                                                       //EINT0 电平触发
	EXTINT   = 0x01;                                                            //清除外部中断0标志
	
	VICIntSelect = 0x00000000;                                                                //IRQ
	VICVectCntl0 = 0x20|14;                                                              //通道号14
	VICVectAddr0 = (uint32)D12_EINT0;
	VICIntEnable |= 1<<14;
	VICVectAddr = 0x00;                                                      //中断向量地址清空一下
}
//D12初始化
void D12_init(void)
{
	//PINSEL0 = 0x00000000;                                                         //GPIO   不用设
	IO0DIR  |= RSTUSB|SUSP;                                                                //IO输出
	
	IO0CLR = RSTUSB;                                                                         //复位
    DelayNS(2);
	IO0SET = RSTUSB;                                                                         //正常

	IO0CLR = SUSP;                                                                         //不挂起
	
	
	USB_reconnect();                                                                     //重新连接	
	USB_init();                                                               //USB相关寄存器初始化

	D12_EINT0_init();                                                              //外部中断初始化
	
}
//*************************************************************************************************
//结束
//*************************************************************************************************






⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -