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

📄 main.c

📁 blackfin 的 usb devise 的代码 很基础
💻 C
📖 第 1 页 / 共 2 页
字号:
	
	isp1362_write_addr(isp1362, DC_RD_EP_BUF|ep);
	
	j = isp1362_read_data16(isp1362);
	if (j > len)
		j = len;
		
	len = (j+1)/2;
	for (i=0; i<len; i++)
		ptr[i] = isp1362_read_data16(isp1362);
	
	dc_ack_setup(isp1362);
	dc_clear_ep_buf(isp1362, epindex);
	
	return j;	
}

static void dc_write_ep(struct isp1362 *isp1362, char *buf, int len, int epindex)
{
	int i = 0;
	int ep = 0;
	short *ptr = (short *)buf;
	
	ep = epindex;
	isp1362_write_addr(isp1362, ep);//write cmd(DC_WR_EP_BUF)
	isp1362_write_data16(isp1362, len);//write len
	
	len = (len+1)/2;
	for (i=0; i<len; i++)
		isp1362_write_data16(isp1362, ptr[i]);
		
	dc_validate_ep_buf(isp1362, epindex);	
}

static void dc_endpoint_cfg(struct isp1362 *isp1362)
{	
	dc_set_endpoint(isp1362, DC_CTRL_OUT_EP, 0x83);//64bytes
	dc_set_endpoint(isp1362, DC_CTRL_IN_EP, 0xc3);//64bytes
	dc_set_endpoint(isp1362, DC_WR_CFG_EP1, 0xc3);//out 64bytes
	dc_set_endpoint(isp1362, DC_WR_CFG_EP2, 0x83);//in  64bytes
	
	dc_set_endpoint(isp1362, DC_WR_CFG_EP3, 0x00);//out 64bytes
	dc_set_endpoint(isp1362, DC_WR_CFG_EP4, 0x00);//in  64bytes
	dc_set_endpoint(isp1362, DC_WR_CFG_EP5, 0x00);//out 64bytes
	dc_set_endpoint(isp1362, DC_WR_CFG_EP6, 0x00);//in  64bytes
	
	dc_set_endpoint(isp1362, DC_WR_CFG_EP7, 0x00);//out 64bytes
	dc_set_endpoint(isp1362, DC_WR_CFG_EP8, 0x00);//in  64bytes
	dc_set_endpoint(isp1362, DC_WR_CFG_EP9, 0x00);//out 64bytes
	dc_set_endpoint(isp1362, DC_WR_CFG_EPA, 0x00);//in  64bytes
	
	dc_set_endpoint(isp1362, DC_WR_CFG_EPB, 0x00);//out 64bytes
	dc_set_endpoint(isp1362, DC_WR_CFG_EPC, 0x00);//in  64bytes
	dc_set_endpoint(isp1362, DC_WR_CFG_EPD, 0x00);//out 64bytes
	dc_set_endpoint(isp1362, DC_WR_CFG_EPE, 0x00);//in  64bytes
	
//	dc_write_ep(&usb_isp1362, 0, 0, 1);
}

static void dc_intt_cfg(struct isp1362 *isp1362)
{
	isp1362_write_reg32(isp1362, DC_WR_INTEN_REG, 0xf17);
}

int isp1362_dc_probe(struct isp1362 *isp1362)
{
	int id = 0;
	int tmp = 0;
	
	id = isp1362_read_reg16(isp1362, DC_RD_CHIP_ID);
	if (DC_CHIP_ID != id)
		return -1;
	
	isp1362_write_reg16(isp1362, DC_WR_SCRATCH_ID, 0x55aa);
	tmp = isp1362_read_reg16(isp1362, DC_RD_SCRATCH_ID);
	
	if (0x55aa != tmp)
		return -1;
		
	return 0;	
}

int isp1362_dc_init(struct isp1362 *isp1362)
{
	dc_disconnect(isp1362);
	dc_device_reset(isp1362);
	dc_set_clk_run(isp1362);
	dc_endpoint_cfg(isp1362);
	dc_intt_cfg(isp1362);
	dc_soft_connect(isp1362);
}

void usb_set_address(struct usb_dev *dev, int addr)
{
	dev->set_address(dev->controler, addr);
}

void get_dev_descriptor(struct usb_dev *dev)
{
	
}

/*****************************************************************
HC
*****************************************************************/
#define HC_CHIP_ID 0x3630
//HC CMD define
#define HC_RD_REV_REG						(0x00)
#define HC_RD_CTRL_REG						(0x01)
#define HC_WR_CTRL_REG						(0x80+0x01)
#define HC_RD_CMD_STAT_REG					(0x02)
#define HC_WR_CMD_STAT_REG					(0x80+0x02)
#define HC_RD_INTT_STAT_REG					(0x03)
#define HC_WR_INTT_STAT_REG					(0x80+0x03)
#define HC_RD_INTT_ENB_REG					(0x04)
#define HC_WR_INTT_ENB_REG					(0x80+0x04)
#define HC_RD_INTT_DSB_REG					(0x05)
#define HC_WR_INTT_DSB_REG					(0x80+0x05)

#define HC_RD_FRM_INT_REG					(0x0d)
#define HC_WR_FRM_INT_REG					(0x80+0x0d)
#define HC_RD_FRM_REM_REG					(0x0e)
#define HC_WR_FRM_REM_REG					(0x80+0x0e)
#define HC_RD_FRM_NUM_REG					(0x0f)
#define HC_WR_FRM_NUM_REG					(0x80+0x0f)
#define HC_RD_LST_TH_REG					(0x11)
#define HC_WR_LST_TH_REG					(0x80+0x11)

#define HC_RD_RH_DTA_REG					(0x12)
#define HC_WR_RH_DTA_REG					(0x80+0x12)
#define HC_RD_RH_DTB_REG					(0x13)
#define HC_WR_RH_DTB_REG					(0x80+0x13)
#define HC_RD_RH_STAT_REG					(0x14)
#define HC_WR_RH_STAT_REG					(0x80+0x14)
#define HC_RD_RH_PSTAT1_REG					(0x15)
#define HC_WR_RH_PSTAT1_REG					(0x80+0x15)
#define HC_RD_RH_PSTAT2_REG					(0x16)
#define HC_WR_RH_PSTAT2_REG					(0x80+0x16)

#define HC_RD_HW_CFG_REG					(0x20)
#define HC_WR_HW_CFG_REG					(0x80+0x20)
#define HC_RD_DMA_CFG_REG					(0x21)
#define HC_WR_DMA_CFG_REG					(0x80+0x21)
#define HC_RD_TS_CNT_REG					(0x22)
#define HC_WR_TS_CNT_REG					(0x80+0x22)
#define HC_RD_UP_INTT_REG					(0x24)
#define HC_WR_UP_INTT_REG					(0x80+0x24)
#define HC_RD_UP_INTT_ENB_REG				(0x25)
#define HC_WR_UP_INTT_ENB_REG				(0x80+0x25)

#define HC_RD_CHIP_ID_REG					(0x27)
#define HC_RD_SCRATCH_REG					(0x28)
#define HC_WR_SCRATCH_REG					(0x80+0x28)
#define HC_WR_SW_RST_REG					(0x80+0x29)

#define HC_RD_BUF_STAT_REG					(0x2c)
#define HC_WR_BUF_STAT_REG					(0x80+0x2c)
#define HC_RD_DIR_ADDR_LEN_REG				(0x32)
#define HC_WR_DIR_ADDR_LEN_REG				(0x80+0x32)
#define HC_RD_DIR_ADDR_DATA_REG				(0x45)
#define HC_WR_DIR_ADDR_DATA_REG				(0x80+0x45)

#define HC_RD_ISTL_BUF_SZ_REG				(0x30)
#define HC_WR_ISTL_BUF_SZ_REG				(0x80+0x30)
#define HC_RD_ISTL0_BUF_PORT_REG			(0x40)
#define HC_WR_ISTL0_BUF_PORT_REG			(0x80+0x40)
#define HC_RD_ISTL1_BUF_PORT_REG			(0x42)
#define HC_WR_ISTL1_BUF_PORT_REG			(0x80+0x42)
#define HC_RD_ISTL_TG_RATE_REG				(0x47)
#define HC_WR_ISTL_TG_RATE_REG				(0x80+0x47)

#define HC_RD_INTL_BUF_SZ_REG				(0x33)
#define HC_WR_INTL_BUF_SZ_REG				(0x80+0x33)
#define HC_RD_INTL_BUF_PORT_REG				(0x43)
#define HC_WR_INTL_BUF_PORT_REG				(0x80+0x43)
#define HC_RD_INTL_BLK_SZ_REG				(0x53)
#define HC_WR_INTL_BLK_SZ_REG				(0x80+0x53)
#define HC_RD_INTL_PTD_DONE_MAP_REG			(0x17)
#define HC_RD_INTL_PTD_SKIP_MAP_REG			(0x18)
#define HC_WR_INTL_PTD_SKIP_MAP_REG			(0x80+0x18)
#define HC_RD_INTL_LAST_PTD_REG				(0x19)
#define HC_WR_INTL_LAST_PTD_REG				(0x80+0x19)
#define HC_RD_INTL_CURR_ACT_PTD_REG			(0x1a)

#define HC_RD_ATL_BUF_SZ_REG				(0x34)
#define HC_WR_ATL_BUF_SZ_REG				(0x80+0x34)
#define HC_RD_ATL_BUF_PORT_REG				(0x44)
#define HC_WR_ATL_BUF_PORT_REG				(0x80+0x44)
#define HC_RD_ATL_BLK_SZ_REG				(0x54)
#define HC_WR_ATL_BLK_SZ_REG				(0x80+0x54)
#define HC_RD_ATL_PTD_DONE_MAP_REG			(0x1b)
#define HC_RD_ATL_PTD_SKIP_MAP_REG			(0x1c)
#define HC_WR_ATL_PTD_SKIP_MAP_REG			(0x80+0x1c)
#define HC_RD_ATL_LAST_PTD_REG				(0x1d)
#define HC_WR_ATL_LAST_PTD_REG				(0x80+0x1d)
#define HC_RD_ATL_CURR_ACT_PTD_REG			(0x1e)
#define HC_RD_ATL_PTD_DONE_TH_CNT_REG		(0x51)
#define HC_WR_ATL_PTD_DONE_TH_CNT_REG		(0x80+0x51)
#define HC_RD_ATL_PTD_DONE_TH_TIMEOUT_REG	(0x52)
#define HC_WR_ATL_PTD_DONE_TH_TIMEOUT_REG	(0x80+0x52)

static void hc_reset(struct isp1362 *isp1362)
{
	isp1362_write_addr(isp1362, HC_WR_SW_RST_REG);
}

static void hc_set_istl_buff_size(struct isp1362 *isp1362, int size)
{
	isp1362_write_reg16(isp1362, HC_WR_ISTL_BUF_SZ_REG, size);
}

static void hc_set_intl_buff_size(struct isp1362 *isp1362, int size)
{
	isp1362_write_reg16(isp1362, HC_WR_INTL_BUF_SZ_REG, size);
}

static void hc_set_atl_buff_size(struct isp1362 *isp1362, int size)
{
	isp1362_write_reg16(isp1362, HC_WR_ATL_BUF_SZ_REG, size);
}

static void hc_set_intl_blk_size(struct isp1362 *isp1362, int size)
{
	isp1362_write_reg16(isp1362, HC_WR_INTL_BLK_SZ_REG, size);
}

static void hc_set_atl_blk_size(struct isp1362 *isp1362, int size)
{
	isp1362_write_reg16(isp1362, HC_WR_ATL_BLK_SZ_REG, size);
}
/**********************************************************************************
* 名称 :isp1362_hc_probe
* 功能 :USB主机检测
* 入口参数 :无
* 出口参数 :无
***********************************************************************************/

int isp1362_hc_probe(struct isp1362 *isp1362)
{
	int id = 0;
	int tmp = 0;
	
	id = isp1362_read_reg16(isp1362, HC_RD_CHIP_ID_REG);
	if (HC_CHIP_ID != id)
		return -1;
	
	isp1362_write_reg16(isp1362, HC_WR_SCRATCH_REG, 0x55aa);
	tmp = isp1362_read_reg16(isp1362, HC_RD_SCRATCH_REG);
	
	if (0x55aa != tmp)
		return -1;
		
	return 0;	
}
/**********************************************************************************
* 名称 :isp1362_hc_init
* 功能 :USB主机初始化
* 入口参数 :无
* 出口参数 :无
***********************************************************************************/

int isp1362_hc_init(struct isp1362 *isp1362)
{
	int tmp = 0;
	hc_reset(isp1362);
	
	hc_set_istl_buff_size(isp1362, 0x400);
	hc_set_intl_buff_size(isp1362, 0x200);
	hc_set_atl_buff_size(isp1362, 0x400);
	
	hc_set_atl_blk_size(isp1362, 0x40);
	
	isp1362_write_reg16(isp1362, HC_WR_CTRL_REG, 0x0680);//0x801f0780
	
	isp1362_write_reg32(isp1362, HC_WR_FRM_INT_REG, 0x27782edf);
	
	isp1362_write_reg32(isp1362, HC_WR_RH_DTA_REG, 0x80000102);//0x05000b01//
	isp1362_write_reg32(isp1362, HC_WR_RH_DTB_REG, 0x00000000);//0x00060000
	
	isp1362_write_reg32(isp1362, HC_WR_RH_PSTAT2_REG, 0x00000100);//reset root hub
	tmp = isp1362_read_reg32(isp1362, HC_RD_RH_PSTAT2_REG);
	
	isp1362_write_reg32(isp1362, HC_WR_RH_PSTAT2_REG, 0x00000002);//0x801f0169
	
	tmp = isp1362_read_reg32(isp1362, HC_RD_RH_PSTAT2_REG);
}


struct isp1362 usb_isp1362_dc = {1, DC_CMD_PORT, DC_DATA_PORT};
struct isp1362 usb_isp1362_hc = {1, HC_CMD_PORT, HC_DATA_PORT};
volatile long flag = 0;
unsigned char buff[512];



/**********************************************************************************
* 名称 :main
* 功能 :USB枚举主函数
* 入口参数 :无
* 出口参数 :无
***********************************************************************************/
void main(void)//page 121
{
	int i = 0;
	int len = 0;
	volatile int intt_status = 0;
	volatile int ep_status = 0;
	struct usb_dev usb_dev;
	usb_dev.controler = &usb_isp1362_dc;
	
	Set_PLL(15,5);
	isp1362_ebiuinit();
	Init_SDRAM();
	Setup_LEDs();
	Leda_Off();
	usbpf_init();
	irq_init();
	UART_setbaudrate(9600);
	UART_init();	
	printf("USB enumerate Start!\r\n");
	
	if ( isp1362_dc_probe(&usb_isp1362_dc) != 0 ){
//		printf("isp1362 is absent!\r\n");
		exit(1);
	}
	isp1362_dc_init(&usb_isp1362_dc);		
	while(1){
		intt_status = dc_read_intt_status(&usb_isp1362_dc);
	//	printf("intt_status = 0x%x\r\n", intt_status);

		if (intt_status & 0x01){
			printf("bus reset\r\n");
			dc_endpoint_cfg(&usb_isp1362_dc);
		}
			
		if (intt_status & 0x100){
			ep_status = dc_read_ep_status(&usb_isp1362_dc, 0);//clear interrupt
	//		printf("epout_status = 0x%x\r\n", ep_status);
			ep_status = dc_read_ep_status(&usb_isp1362_dc, 1);//clear interrupt
	//		printf("epin_status = 0x%x\r\n", ep_status);
			
			len = dc_read_ep(&usb_isp1362_dc, buff, 64, 0);
			for (i=0; i<len; i++)
	//		printf("0x%x   ", buff[i]);
	//		printf("\r\n");
			
			//get descriptor
			if ( (buff[0] == 0x80) && (buff[1] == 0x06) ){
				if (buff[3] == 0x01)//get device descriptor
					dc_write_ep(&usb_isp1362_dc, (void *)&device_descriptor, 0x12, 1);
				else if (buff[3] == 0x02){//get configuration descriptor
					int len = buff[6];
					if (len > 0x20)
						len = 0x20;
					dc_write_ep(&usb_isp1362_dc, (void *)&config_descriptor, len, 1);
				}
				else if (buff[3] == 0x06){
					int len = buff[6];
					if (len > 0x0a)
						len = 0x0a;
					dc_write_ep(&usb_isp1362_dc, (void *)&device_qualifier_descriptor, len, 1);
				}
				else{
					ep_status = dc_read_ep_status(&usb_isp1362_dc, 1);//clear interrupt
					dc_write_ep(&usb_isp1362_dc, (void *)&device_descriptor, 0, 1);
				}
				do{
					intt_status = dc_read_intt_status(&usb_isp1362_dc);
				}while(intt_status != 0x200);
				ep_status = dc_read_ep_status(&usb_isp1362_dc, 1);//clear interrupt
			}
			//set address
			if ( (buff[0] == 0x00) && (buff[1] == 0x05) ){
				ep_status = dc_read_ep_status(&usb_isp1362_dc, 1);//clear interrupt
				dc_enable_address(&usb_isp1362_dc);
				dc_set_address(&usb_isp1362_dc, buff[2]);
				dc_write_ep(&usb_isp1362_dc, (void *)&device_descriptor, 0, 1);
				do{
					intt_status = dc_read_intt_status(&usb_isp1362_dc);
				}while(intt_status != 0x200);
			}
			//set configuration
			if ( (buff[1] == 0x09) && (buff[2] == 0x01) ){
				ep_status = dc_read_ep_status(&usb_isp1362_dc, 1);//clear interrupt
				dc_write_ep(&usb_isp1362_dc, (void *)&device_descriptor, 0, 1);
				do{
					intt_status = dc_read_intt_status(&usb_isp1362_dc);
				}while(intt_status != 0x200);
				dc_endpoint_cfg(&usb_isp1362_dc);
			}
			if ( (buff[0] == 0xa1) && (buff[1] == 0xfe) ){
				ep_status = dc_read_ep_status(&usb_isp1362_dc, 1);//clear interrupt
				dc_write_ep(&usb_isp1362_dc, (void *)&flag, 1, 1);
				do{
					intt_status = dc_read_intt_status(&usb_isp1362_dc);
				}while(intt_status != 0x200);
			}
			dc_unstall_ep(&usb_isp1362_dc, 1);
		}
		if (intt_status & 0x200){
			len = len;
		}
		memset(buff, 0, 512);
	}
}



void usb_isr(void)
{
}

⌨️ 快捷键说明

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