'------------------------------------------------------------------- ' ALawther 2020-05-01 ' USB timing calculator for USBKbm driver by garryj '------------------------------------------------------------------- CON _1m = 1_000_000 _12m = 12_000_000 CLKFREQ = 297_000_000 FSBTns4 = 43799 FSBTns28 = 19162 LSBTns4 = 683 LSBTns22 = 7513 DAT ORGH STALLI ' Protect overlapping CORDIC operations QDIV CLKFREQ,_1m ' CORDIC calculation for 1us QDIV _12m, CLKFREQ ' CORDIC calculation for FS & LS Baud 12_000_000 / CLKFREQ GETQX _1us GETQY ROUND WC ADDX _1us, #0 ' Rounded 1us value QMUL _1us, LSBTns4 ' CORDIC calculation for LS InterPacket Delay: 683 gives 4 LS bit times * 2^8 to prevent excessive rounding errors GETQY _12Mbps ' pickup CORDIC Baud remainder result which is equivalent to 12_000_000 / CLKFREQ * 2^32 and align with CORDIC window ALTR _10us MUL _1us, #10 ' _10us QMUL _1us, LSBTns22 ' CORDIC calculation for LS TurnAroundTime: 7513 gives 22 LS bit times * 2^9 ALTR _33us ADD _10us, _1us ' 11us MUL _33us, #3 ' _33us: 'Seems to be a reasonable NAK delay' QMUL _1us, FSBTns4 ' CORDIC calculation for FS InterPacket Delay: 43799 gives 4 FS bit times * 2^17 ALTR NO_TXN_LS SHL _33us, #2 ' 132us ADD NO_TXN_LS, _33us ' 165us QMUL _1us, FSBTns28 ' CORDIC calcuation for FS TurnAroundTime: 19162 gives 28 FS bit times * 2^13 ALTR NO_TXN_FS ADD NO_TXN_LS, _10us ' 175us MOV TXN_OK_FS, NO_TXN_FS ' save a copy SHL NO_TXN_LS, #1 ' 330us ADD NO_TXN_LS, _1us ' 331us ADD NO_TXN_LS, _1us ' 332us ADD NO_TXN_LS, _1us ' 333us ALTR TXN_OK_LS SHL NO_TXN_LS ,#1 ' 666us SUB NO_TXN_LS, #7 ' NO_TXN_LS = 333us - 7 cycles ADD TXN_OK_LS, _1us ' 667us SUB TXN_OK_LS, #6 ' TXN_OK_LS = 667us - 6 cycles ALTR TXN_ERR MUL _10us, #25 ' TXN_ERR = 250us: Transaction error wait GETQX IP_DELAY_LS ' pickup CORDIC LS IP DELAY result ALTR _500us SHL _250us, #1 ' _500us GETQX TAT_WAIT_LS ' pickup CORDIC LS TAT result ALTR _1ms SHL _500us ,#1 ' _1ms GETQX IP_DELAY_FS ' pickup CORDIC FS IP DELAY result SUBR _1ms, TXN_OK_FS ' TXN_OK_FS = 825us GETQX TAT_WAIT_FS ' pickup CORDIC FS TAT result ALLOWI ' CORDIC ops complete SUB NO_TXN_FS, #7 ' NO_TXN_FS = 175us - 7 cycles SHR _12Mbps, #16 WC ADDX _12Mbps, #0 ' _12Mbps = round(12_000_000 / CLKFREQ * 2^16) ALTR _1_5Mbps SHR _12Mbps, #3 WC ADDX _1_5Mbps ,#0 ' _1_5Mbps = round(_12Mbps / 8) ALTR _2ms SHL _1ms, #1 ' _2ms MOV TO_CHGADDR, _2ms ' TO_CHGADDR = 2ms ALTR _4ms SHL _2ms, #1 ' _4ms ALTR XFER_WAIT ADD _1ms, _4ms ' XFER_WAIT = 5ms ALTR KBD_POLL_INTERVAL SHL _4ms, #1 ' KBD_POLL_INTERVAL = 8ms ALTR RESET_HOLD SHL XFER_WAIT, #1 ' 10ms ADD RESET_HOLD, XFER_WAIT ' RESET_HOLD = 15ms ALTR TO_NODATA SHL XFER_WAIT, #2 ' 20ms ALTR _21ms ADD TO_NODATA, _1ms ' _21ms ADD TO_NODATA, XFER_WAIT ' 25ms SHL TO_NODATA, #1 ' TO_NODATA = 50ms ALTR _100ms SHL TO_NODATA, #1 ' _100ms ALTR CONNECT_WAIT SHL TO_NODATA, #2 ' 200ms ADD CONNECT_WAIT, TO_NODATA ' CONNECT_WAIT = 250ms ALTR TO_DATA SHL CONNECT_WAIT, #1 ' TO_DATA = 500ms ALTR PULSE_TIME ADD TO_DATA, CONNECT_WAIT ' PULSE_TIME = 750ms ALTR TO_STANDARD SHL TO_DATA, #2 ' 2000ms ADD TO_STANDARD, TO_DATA ' 2500ms SHL TO_STANDARD, #1 ' TO_STANDARD = 5000ms SHR IP_DELAY_LS, #8 WC ADDX IP_DELAY_LS, #0 ' IP_DELAY_LS = round(4 * LSBTns * _1us / 1000) SHR TAT_WAIT_LS, #9 WC ADDX TAT_WAIT_LS, #0 ' TAT_WAIT_LS = round(22 * LSBTns * _1us / 1000) SHR IP_DELAY_FS, #17 WC ADDX IP_DELAY_FS, #0 ' IP_DELAY_FS = round(4 * FSBTns * _1us / 1000) SHR TAT_WAIT_FS, #13 WC ADDX TAT_WAIT_FS, #0 ' TAT_WAIT_FS = round(28 * FSBTns * _1us / 1000)