/* Name: usbdrvasm16.inc
- * Project: AVR USB driver
+ * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
* Author: Christian Starkjohann
* Creation Date: 2007-06-15
* Tabsize: 4
* Copyright: (c) 2007 by OBJECTIVE DEVELOPMENT Software GmbH
* License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * Revision: $Id: usbdrvasm16.inc 692 2008-11-07 15:07:40Z cs $
*/
/* Do not link this file! Link usbdrvasm.S instead, which includes the
; Receiver loop (numbers in brackets are cycles within byte after instr)
;----------------------------------------------------------------------------
+; duration of unstuffing code should be 10.66666667 cycles. We adjust "leap"
+; accordingly to approximate this value in the long run.
+
unstuff6:
andi x2, USBMASK ;[03]
ori x3, 1<<6 ;[04] will not be shifted any more
andi shift, ~0x80;[05]
mov x1, x2 ;[06] sampled bit 7 is actually re-sampled bit 6
- subi leap, 3 ;[07] since this is a short (10 cycle) bit, enforce leap bit
+ subi leap, -1 ;[07] total duration = 11 bits -> subtract 1/3
rjmp didUnstuff6 ;[08]
unstuff7:
in x2, USBIN ;[00] [10] re-sample bit 7
andi x2, USBMASK ;[01]
andi shift, ~0x80;[02]
- subi leap, 3 ;[03] since this is a short (10 cycle) bit, enforce leap bit
+ subi leap, 2 ;[03] total duration = 10 bits -> add 1/3
rjmp didUnstuff7 ;[04]
unstuffEven:
andi shift, ~0x80;[01]
andi x1, USBMASK ;[02]
breq se0 ;[03]
- subi leap, 3 ;[04] since this is a short (10 cycle) bit, enforce leap bit
- nop ;[05]
+ subi leap, -1 ;[04] total duration = 11 bits -> subtract 1/3
+ nop2 ;[05]
rjmp didUnstuffE ;[06]
unstuffOdd:
andi shift, ~0x80;[01]
andi x2, USBMASK ;[02]
breq se0 ;[03]
- subi leap, 3 ;[04] since this is a short (10 cycle) bit, enforce leap bit
- nop ;[05]
+ subi leap, -1 ;[04] total duration = 11 bits -> subtract 1/3
+ nop2 ;[05]
rjmp didUnstuffO ;[06]
rxByteLoop: