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

📄 d12_usb.h

📁 LF2407的各个模块的测试程序,包含2407里面的所有模块,均已经调试通过,心血所致,希望对大家有所帮助.
💻 H
字号:
volatile unsigned int D12_data = 0;

//输出数据
void outportb(UINT addr, UINT data)
{
	D12_data = data;
	if(addr == D12_DATA)
		OUTMAC(0,D12_data);
		
	if(addr == D12_COMMAND)
		OUTMAC(1,D12_data);
}

//输入数据
UINT inportb(UINT addr)
{
	if(addr == D12_DATA)
		INMAC(0,D12_data);
		
	if(addr == D12_COMMAND)
		INMAC(1,D12_data);
	return D12_data;
}

//设置地址使能
void D12_SetAddressEnable(unsigned char bAddress, unsigned char bEnable)
{
	outportb(D12_COMMAND, 0xD0);//输出指令
	if(bEnable)
		bAddress |= 0x80;
	outportb(D12_DATA, bAddress);//设置地址
}


//设置端点使能
void D12_SetEndpointEnable(unsigned char bEnable)
{
	outportb(D12_COMMAND, 0xD8);//输出指令
	if(bEnable)
		outportb(D12_DATA, 1);//设置端点允许
	else
		outportb(D12_DATA, 0);//设置端点禁止
}

//模式设置
void D12_SetMode(unsigned char bConfig, unsigned char bClkDiv)
{
	outportb(D12_COMMAND, 0xF3);//设置模式
	outportb(D12_DATA, bConfig);
	outportb(D12_DATA, bClkDiv);
}

//读取中断寄存器
unsigned short D12_ReadInterruptRegister(void)
{
	unsigned char b1;
	unsigned int j;

	outportb(D12_COMMAND, 0xF4);//读取中断寄存器
	b1 = inportb(D12_DATA);
	j = inportb(D12_DATA);

	j <<= 8;
	j += b1;

	return j;
}

//端点选择
unsigned char D12_SelectEndpoint(unsigned char bEndp)
{
	unsigned char c;

	outportb(D12_COMMAND, bEndp);//端点选择
	c = inportb(D12_DATA);

	return c;
}
    
//读取最后传输状态
unsigned char D12_ReadLastTransactionStatus(unsigned char bEndp)
{
	outportb(D12_COMMAND, 0x40 + bEndp);//返回最后传输状态
	return inportb(D12_DATA);
}


//读取端点状态
unsigned char D12_ReadEndpointStatus(unsigned char bEndp)
{
	unsigned char c;

	outportb(D12_COMMAND, 0x80 + bEndp);//读取端点状态
	c = inportb(D12_DATA);

	return c;
}    

//设置端点状态
void D12_SetEndpointStatus(unsigned char bEndp, unsigned char bStalled)
{
	outportb(D12_COMMAND, 0x40 + bEndp);//设置端点状态
	outportb(D12_DATA, bStalled);
}

//读取端点数据
unsigned char D12_ReadEndpoint(unsigned char endp, unsigned char len, unsigned char * buf)
{
	unsigned char i, j;

	outportb(D12_COMMAND, endp);
	if((inportb(D12_DATA) & 0x01) == 0)
		return 0;

	outportb(D12_COMMAND, 0xF0);
	j = inportb(D12_DATA);
	j = inportb(D12_DATA);

	if(j > len)
		j = len;

//    P2 = 0x80;
	for(i=0; i<j; i++)
    {
  //      if((i+1)%8 == 0)
  //          P2 = 0x80;
		*(buf+i) = inportb(D12_DATA);
    }

	outportb(D12_COMMAND, 0xF2);

	return j;
}


//写端点
unsigned char D12_WriteEndpoint(unsigned char endp, unsigned char len, unsigned char * buf)
{
	unsigned char i;

	outportb(D12_COMMAND, endp);
	i = inportb(D12_DATA);

	outportb(D12_COMMAND, 0xF0);
	outportb(D12_DATA, 0);
	outportb(D12_DATA, len);


	for(i=0; i<len; i++){
		outportb(D12_DATA, *(buf+i));
        }

	outportb(D12_COMMAND, 0xFA);

	return len;
}

//设置端点应答
void D12_AcknowledgeEndpoint(unsigned char endp)
{
	outportb(D12_COMMAND, endp);
	outportb(D12_COMMAND, 0xF1);
	if(endp == 0)
		outportb(D12_COMMAND, 0xF2);
}

//////////////////////

//发送端点号1建立代码
void code_transmit(UCHAR * pRomData, UINT len)
{
	EP0_Request_wCount = 0;
	if(EP0_Request_wLength > len)
		EP0_Request_wLength = len;

	EP0_Request_PData = pRomData;
	if( EP0_Request_wLength >= 16)
    {
		D12_WriteEndpoint(1, 16, EP0_Request_PData);//发送16字节数据
		EP0_Request_wCount += 16;
	    EP0_state = TRANSMIT;
	}
	else
    {
		D12_WriteEndpoint(1, EP0_Request_wLength, pRomData);//发送16字节内数据
		EP0_Request_wCount += EP0_Request_wLength;
        EP0_state = IDLE;
	}
}

//返回stall应答
void stall_ep0(void)
{
	D12_SetEndpointStatus(0, 1);
	D12_SetEndpointStatus(1, 1);
}

//从端点号1发送数据
void single_transmit(unsigned char * buf, unsigned char len)
{
	if( len <= 16) {
		D12_WriteEndpoint(1, len, buf);
	}
}

//获取描述符
void get_descriptor(void)
{
	unsigned char bDescriptor = (unsigned char)(Recieved_Data.DEVICE_REQUEST.wValue>>8);

	if (bDescriptor == 0x01) {//获取设备描述符
		code_transmit(DeviceDescr, 18);
	} else if (bDescriptor == 0x02) {//获取配置描述符
		code_transmit(ConfigDescr, 32);
	} else
		stall_ep0();
}

//设置地址
void set_address(void)
{
	D12_SetAddressEnable((unsigned char)(Recieved_Data.DEVICE_REQUEST.wValue),1);
	single_transmit(0, 0);
}

//设置配置状态
void set_configuration(void)
{
	if (Recieved_Data.DEVICE_REQUEST.wValue == 0) //设备进入未配置状态
    {
		single_transmit(0, 0);
		D12_SetEndpointEnable(0);
	}
    else if (Recieved_Data.DEVICE_REQUEST.wValue == 1)  //配置设备
    {
		single_transmit(0, 0);
//		D12_SetEndpointEnable(0);
		D12_SetEndpointEnable(1);
	}
    else
		stall_ep0();
}  
   
unsigned char GML = 0;
void Get_Max_Lun()
{
    D12_SetEndpointEnable(1);
    //single_transmit(&GML, 1);
    D12_WriteEndpoint(1, 1, &GML);
}


void XINT1_INT()//D12中断
{
	static UINT i = 0;
	i++;
	Set_LED(i);
	
	*XINT1CR = *XINT1CR | 0x8000;//清中断标志
	*IFR = 0x0020;	
	asm(" clrc INTM");//开总中断
	return;
}

void D12_init()
{
	D12SUSPD_0;
}

⌨️ 快捷键说明

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