📄 main.c
字号:
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 + -