📄 verify.c
字号:
{
ISP1581_WriteBulkEndpoint(bulkinendpointindex, fp, globe_variable.ioINSize);
globe_variable.ioINCount += globe_variable.ioINSize;
}
*/
bISP1581flags.bits.Vendor_CMD = BULKIN_Set;
}
else
{
cprintf("bulk out ");
globe_variable.ioOUTSize = ioRequest.uSize;
globe_variable.ioOUTCount = 0;
seg = (ioBuffer + globe_variable.ioOUTCount)>>4;
// off = (ioBuffer + globe_variable.ioOUTCount)&0xf;
// fp = MK_FP(seg, off);
}
cprintf("%5u Bytes", ioRequest.uSize);
}
void Config_DMA(void)
{
unsigned int c;
unsigned short dmacfg_width = 0, dmacfg_counter = 0; // 16 bit when assign dmacfg_width16 to it, else 8 bit;
unsigned short isa_dma_more = 0; // when this is not 0, EXT EOT does not come;
#ifdef debug
debug_out(debug_code_configdma);
#endif
RaiseIRQL();
bISP1581flags.bits.dma_state = DMA_RUNNING;
#ifdef debug1
cprintf("dma_state DMA %x ",bISP1581flags.bits.dma_state);
#endif
LowerIRQL();
dmacfg_width = dmacfg_width16;
// dmacfg_width = dmacfg_width8;
// dmacfg_dmacounter = dmacfg_disablecounter;
ISP1581_SetDMACMD(dmacmd_reset);
isa_dma_more = 10;
globe_variable.xfer_dir = (unsigned short)(ioRequest.bCommand & 0x1);
globe_variable.scantransfer_length_odd = ioRequest.uSize & 0x1; // record dma_counter preset value;
if(globe_variable.xfer_dir){// IN
globe_variable.isp1581_dma_counterset_lowbyte = ioRequest.uSize; //exact number, else, clear ep feature;
// dmacfg_counter = dmacfg_disablecounter;
dmacfg_counter &= ~dmacfg_disablecounter;
}
else{
globe_variable.isp1581_dma_counterset_lowbyte = ioRequest.uSize ; // adjust value, stop by short packet;
// dmacfg_counter = dmacfg_disablecounter;
dmacfg_counter &= ~dmacfg_disablecounter;
}
if(globe_variable.xfer_dir && globe_variable.scantransfer_length_odd && dmacfg_width){
//IN and bus width = 16
//and transfer length is odd, EXT_EOT at last strobe add 1 more byte, increase isa counter to avoid;
isa_dma_more++;
}
if (dmacfg_width) // 16 bit;
globe_variable.isa_dma_counterset = ((ioRequest.uSize - 1)>>1) + isa_dma_more;//DMA control, 0 = 1 Xfer
else // 8 bit;
globe_variable.isa_dma_counterset = (ioRequest.uSize -1) + isa_dma_more;
ISP1581_SetDMACounterLow(globe_variable.isp1581_dma_counterset_lowbyte);
ISP1581_SetDMACounterHigh(0x00); // no longer than 64k bytes each transfer;
dma_start(&ioRequest); // dma control configuration;
ISP1581_SetDMAHDCfg(dmahd_dreqpolh/*|dmahd_dackpolh*/|dmahd_eotpolh/*|dmahd_readpolh|dmahd_writepolh|dmahd_endianbig*/);
#ifdef dma_on_local
#ifdef debug
// cprintf(" dma_on_local verify reset");
#endif
Local_dma_cfg(dma_ctl_rst);
#endif
if(globe_variable.xfer_dir){
#ifdef debug
textattr(0x05);
cprintf("\n\rDMA IN ");
#else
cprintf("DMA IN ");
#endif
}
else{
#ifdef debug
textattr(0x06);
cprintf("\n\rDMA OUT ");
#else
cprintf("DMA OUT ");
#endif
Test_all_burst_mode();
}
#ifdef debug
textattr(0x07); cprintf("CMD %4u ISA %4u, 1581 %4u ", ioRequest.uSize, globe_variable.isa_dma_counterset, globe_variable.isp1581_dma_counterset_lowbyte);//token, DMA start at %lx of %u bytes.\r\n", buf_phy_addr, pio->uSize);
textattr(0x07); cprintf("DMA BURST"); textattr(0x03); cprintf(" %x, ", (globe_variable.burst_mode >> 4)); textattr(0x07);
#else
cprintf("%5u Bytes ", ioRequest.uSize);
#endif
// stop dma on isa board for dma reset testing;
// For CPLD DMA config
#ifdef dma_on_local
#ifdef debug
// cprintf(" dma_on_local ");
#endif
/* if(globe_variable.xfer_dir) {
Local_dma_cfg(dma_ctl_in);
}
globe_variable.burst_mode = dmacfg_burst0;
*/
#endif;
ISP1581_SetDMACounterLow(globe_variable.isp1581_dma_counterset_lowbyte);
ISP1581_SetDMACounterHigh(0x00); // no longer than 64k bytes each transfer;
ISP1581_SetDMAConfig(0x00
|globe_variable.burst_mode//dmacfg_burst2
|dmacfg_modediorw
// |dmacfg_modedack
// |dmacfg_modediorack
|dmacfg_width//dmacfg_width16
|dmacfg_counter
);
ISP1581_SetDMAIntMask(dmaint_oddint|dmaint_extereot|dmaint_intereot|dmaint_xferok);
if(globe_variable.xfer_dir)
{//IN
// ISP1581_SetDMACounterLow(dma_counter);
// ISP1581_SetDMACounterHigh(0x00); // no longer than 64k bytes each transfer;
// clear buffer for dma reset testing;
// ISP1581_SetDMACMD(dmacmd_clearbuffer);
// ISP1581_SetDMACMD(dmacmd_clearbuffer);
ISP1581_SetDMAEP(bulkinendpointindex);
bISP1581flags.bits.dma_endpoint = bulkinendpointindex;
c = ISP1581_GetIntEnableLow();
ISP1581_SetIntEnableLow(c&(~bulkinendpointinterrupt));
#ifdef dma_on_local
#ifdef debug
// cprintf(" dma_on_local enable dma in");
#endif
Local_dma_cfg(dma_ctl_in|dma_ctl_en|dma_ctl_start);
#endif
ISP1581_SetDMACMD(dmacmd_gdmaread);
}
else
{// out
ISP1581_SetDMAEP(bulkoutendpointindex);
bISP1581flags.bits.dma_endpoint = bulkoutendpointindex;
c = ISP1581_GetIntEnableLow();
ISP1581_SetIntEnableLow(c&(~bulkoutendpointinterrupt));
#ifdef dma_on_local
#ifdef debug
// cprintf(" dma_on_local enable dma out");
#endif
Local_dma_cfg(dma_ctl_en|dma_ctl_start);
#endif
ISP1581_SetDMACMD(dmacmd_gdmawrite);
}
// ioRequest.uSize += 64;
// dma_start(&ioRequest); // dma control configuration;
#ifdef debug
// cprintf("setup_dma: ISP1581_GetIntEnableLow =%lx\r\n", ISP1581_GetIntEnableLow());
#endif
}
void get_twin_configuration(void)
{
unsigned int len;
if(ControlData.DeviceRequest.wValue == TWIN_CURRENT_FILE_INDEX)
{
if(ControlData.DeviceRequest.wLength > TWIN_CURRENT_FILE_INDEX_LENGTH)
len = TWIN_CURRENT_FILE_INDEX_LENGTH;
else
len = ControlData.DeviceRequest.wLength;
Chap9_SingleTransmitEP0(&twin_config.bFileIndex, len);
}
else if(ControlData.DeviceRequest.wValue == TWIN_CURRENT_FILE_SIZE)
{
if(ControlData.DeviceRequest.wLength > TWIN_CURRENT_FILE_SIZE_LENGTH)
len = TWIN_CURRENT_FILE_SIZE_LENGTH;
else
len = ControlData.DeviceRequest.wLength;
Chap9_SingleTransmitEP0(&twin_config.bFileSizeLL, len);
}
else
{
Chap9_StallEP0();
key2go();
printf("stall: unknow set twin configuration");
return;
}
}
void set_twin_configuration(void)
{
if(ControlData.DeviceRequest.wValue == TWIN_CLEAR_CURRENT_FILE)
{
twin_config.bFileIndex = 0;
twin_config.bFileSizeLL = 0;
twin_config.bFileSizeLH = 0;
twin_config.bFileSizeHL = 0;
twin_config.bFileSizeHH = 0;
}
else if(ControlData.DeviceRequest.wValue == TWIN_CURRENT_FILE_INDEX)
{
twin_config.bFileIndex = *ControlData.dataBuffer;
}
else if(ControlData.DeviceRequest.wValue == TWIN_CURRENT_FILE_SIZE)
{
twin_config.bFileSizeLL = *ControlData.dataBuffer;
twin_config.bFileSizeLH = *(ControlData.dataBuffer+1);
twin_config.bFileSizeHL = *(ControlData.dataBuffer+2);
twin_config.bFileSizeHH = *(ControlData.dataBuffer+3);
}
else
{
Chap9_StallEP0();
key2go();
printf("stall: unknow set twin configuration");
return;
}
bISP1581flags.bits.DCP_state = USBFSM4DCP_CONTROLOUTDONE;
#ifdef debug
cprintf("^_^%hx", bISP1581flags.bits.DCP_state);
#endif
return;
}
void Test_all_burst_mode(void)
{
if(globe_variable.burst_mode == dmacfg_burst0)
{
globe_variable.burst_mode = dmacfg_burst1;
}
else if(globe_variable.burst_mode == dmacfg_burst1)
{
globe_variable.burst_mode = dmacfg_burst2;
}
else if(globe_variable.burst_mode == dmacfg_burst2)
{
globe_variable.burst_mode = dmacfg_burst4;
}
else if(globe_variable.burst_mode == dmacfg_burst4)
{
globe_variable.burst_mode = dmacfg_burst8;
}
else if(globe_variable.burst_mode == dmacfg_burst8)
{
globe_variable.burst_mode = dmacfg_burst12;
}
else if(globe_variable.burst_mode == dmacfg_burst12)
{
globe_variable.burst_mode = dmacfg_burst16;
}
else if(globe_variable.burst_mode == dmacfg_burst16)
{
globe_variable.burst_mode = dmacfg_burst32;
}
else if(globe_variable.burst_mode == dmacfg_burst32)
{
globe_variable.burst_mode = dmacfg_burst0;
}
else
{
globe_variable.burst_mode = dmacfg_burst0;
}
globe_variable.burst_mode = dmacfg_burst0;
#ifdef debug
debug_out(( globe_variable.burst_mode >> 4) | 0x1000);
#endif
return;
}
void Local_dma_cfg(unsigned int dma_ctl_settings)
{
outport(dmaport, dma_ctl_settings);
return;
}
void transfer_error_handler(void)
{
unsigned char type_loop, type_code;
RaiseIRQL();
type_code = *(ControlData.dataBuffer+4);
type_loop = *(ControlData.dataBuffer+5);
Local_dma_cfg(dma_ctl_rst);
if (type_code == 0)
{
if(type_loop == 2) // stop transfer loop
{
Local_dma_cfg(dma_ctl_rst);
ISP1581_SetDMACMD(dmacmd_reset);
Local_dma_cfg(dma_ctl_rst);
ISP1581_SetDMAEP(EPINDEX4EP02OUT);
ISP1581_SetDMACMD(dmacmd_clearbuffer);
ISP1581_SetDMACMD(dmacmd_clearbuffer);
ISP1581_SetDMAEP(EPINDEX4EP02IN);
ISP1581_SetDMACMD(dmacmd_clearbuffer);
ISP1581_SetDMACMD(dmacmd_clearbuffer);
#ifdef debug
cprintf("Bulk loop stop %x %x %x %x %x %x", *(ControlData.dataBuffer), *(ControlData.dataBuffer+1), *(ControlData.dataBuffer+2), *(ControlData.dataBuffer+3), *(ControlData.dataBuffer+4), *(ControlData.dataBuffer+5));
#else
cprintf(" Stop Bulk Loop");
#endif
}
else if(type_loop == 1)
{
ISP1581_SetDMAEP(EPINDEX4EP03OUT);
ISP1581_SetDMACMD(dmacmd_clearbuffer);
ISP1581_SetDMACMD(dmacmd_clearbuffer);
ISP1581_SetDMAEP(EPINDEX4EP03IN);
ISP1581_SetDMACMD(dmacmd_clearbuffer);
ISP1581_SetDMACMD(dmacmd_clearbuffer);
#ifdef debug
cprintf("ISO loop stop %x %x %x %x %x %x", *(ControlData.dataBuffer), *(ControlData.dataBuffer+1), *(ControlData.dataBuffer+2), *(ControlData.dataBuffer+3), *(ControlData.dataBuffer+4), *(ControlData.dataBuffer+5));
#else
cprintf(" Stop ISO loop");
#endif
}
// else{} // no use;
bISP1581flags.bits.DCP_state = USBFSM4DCP_CONTROLOUTDONE;
}
else// if(type_code == 1) // error in data transfer
{
Chap9_StallEP0();
#ifdef debug
key2go();
cprintf("Stall: unsupported vendor command data %x %x %x %x %x %x", *(ControlData.dataBuffer), *(ControlData.dataBuffer+1), *(ControlData.dataBuffer+2), *(ControlData.dataBuffer+3), *(ControlData.dataBuffer+4), *(ControlData.dataBuffer+5));
#endif
}
#ifdef debug
cprintf("^_^%hx", bISP1581flags.bits.DCP_state);
#endif
LowerIRQL();
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -