|
Packit |
e67170 |
;
|
|
Packit |
e67170 |
; Second stage AN2131QC (aka EzUSB) loader
|
|
Packit |
e67170 |
;
|
|
Packit |
e67170 |
;
|
|
Packit |
e67170 |
; Copyright (c) 2004-2005 Martin Langer <martin-langer@gmx.de>
|
|
Packit |
e67170 |
;
|
|
Packit |
e67170 |
; Written for Tascam US-122/US-224/US-428 audio/MIDI devices
|
|
Packit |
e67170 |
;
|
|
Packit |
e67170 |
; This program is free software; you can redistribute it and/or
|
|
Packit |
e67170 |
; modify it under the terms of the GNU General Public License
|
|
Packit |
e67170 |
; as published by the Free Software Foundation; either version 2
|
|
Packit |
e67170 |
; of the License, or any later version.
|
|
Packit |
e67170 |
;
|
|
Packit |
e67170 |
; This program is distributed in the hope that it will be useful,
|
|
Packit |
e67170 |
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
e67170 |
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
e67170 |
; GNU General Public License for more details.
|
|
Packit |
e67170 |
;
|
|
Packit |
e67170 |
; You should have received a copy of the GNU General Public License
|
|
Packit |
e67170 |
; along with this program; if not, write to the Free Software
|
|
Packit |
e67170 |
; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
Packit |
e67170 |
;
|
|
Packit |
e67170 |
;
|
|
Packit |
e67170 |
|
|
Packit |
e67170 |
.inc "an2131.asm"
|
|
Packit |
e67170 |
|
|
Packit |
e67170 |
|
|
Packit |
e67170 |
; ====================================================== interrupt vectors ===
|
|
Packit |
e67170 |
|
|
Packit |
e67170 |
.org 0x0000 ; reset vector
|
|
Packit |
e67170 |
ljmp init
|
|
Packit |
e67170 |
|
|
Packit |
e67170 |
.org 0x0043 ; int2 vector (USB)
|
|
Packit |
e67170 |
ljmp usb_jump_table ; autovector will replace byte 45
|
|
Packit |
e67170 |
|
|
Packit |
e67170 |
|
|
Packit |
e67170 |
; =================================================================== init ===
|
|
Packit |
e67170 |
|
|
Packit |
e67170 |
init:
|
|
Packit |
e67170 |
mov sp, #20h ; move stack pointer to 0x20
|
|
Packit |
e67170 |
|
|
Packit |
e67170 |
mov a, EIE
|
|
Packit |
e67170 |
setb acc.0 ; enable int2 (USB Interrupt)
|
|
Packit |
e67170 |
mov EIE, a
|
|
Packit |
e67170 |
|
|
Packit |
e67170 |
mov dptr, #USBIRQ
|
|
Packit |
e67170 |
mov a, #00011111b
|
|
Packit |
e67170 |
movx @dptr, a ; clear Interrupt Request
|
|
Packit |
e67170 |
|
|
Packit |
e67170 |
mov dptr, #IN07IRQ
|
|
Packit |
e67170 |
mov a, #11111111b
|
|
Packit |
e67170 |
movx @dptr, a ; clear EP IN Interrupt Request
|
|
Packit |
e67170 |
|
|
Packit |
e67170 |
mov dptr, #OUT07IRQ
|
|
Packit |
e67170 |
mov a, #11111111b
|
|
Packit |
e67170 |
movx @dptr, a ; clear EP OUT Interrupt Request
|
|
Packit |
e67170 |
|
|
Packit |
e67170 |
mov dptr, #PORTCCFG
|
|
Packit |
e67170 |
movx a, @dptr
|
|
Packit |
e67170 |
orl a, #11000000b ; allow read and write on Port C
|
|
Packit |
e67170 |
movx @dptr, a
|
|
Packit |
e67170 |
|
|
Packit |
e67170 |
mov dptr, #USBBAV
|
|
Packit |
e67170 |
movx a, @dptr
|
|
Packit |
e67170 |
orl a, #00000001b ; enable Autovector feature
|
|
Packit |
e67170 |
movx @dptr, a
|
|
Packit |
e67170 |
|
|
Packit |
e67170 |
mov dptr, #USBIEN
|
|
Packit |
e67170 |
movx a, @dptr
|
|
Packit |
e67170 |
orl a, #00000101b ; enable 'Setup Data Available
|
|
Packit |
e67170 |
movx @dptr, a ; Interrupt Request' and 'Setup Token
|
|
Packit |
e67170 |
; Interrupt Request'
|
|
Packit |
e67170 |
|
|
Packit |
e67170 |
setb ea ; enable global 8051 Interrupts
|
|
Packit |
e67170 |
|
|
Packit |
e67170 |
loop:
|
|
Packit |
e67170 |
sjmp loop
|
|
Packit |
e67170 |
|
|
Packit |
e67170 |
|
|
Packit |
e67170 |
; ========================================= usb interrupt service routines ===
|
|
Packit |
e67170 |
|
|
Packit |
e67170 |
usb_jump_table:
|
|
Packit |
e67170 |
ljmp setup_data_avail_isr ; setup data available
|
|
Packit |
e67170 |
.db 0
|
|
Packit |
e67170 |
ljmp start_of_frame_isr ; Start of frame
|
|
Packit |
e67170 |
.db 0
|
|
Packit |
e67170 |
ljmp setup_token_isr ; loading setup data
|
|
Packit |
e67170 |
.db 0
|
|
Packit |
e67170 |
ljmp usb_suspend_isr ; USB suspend
|
|
Packit |
e67170 |
.db 0
|
|
Packit |
e67170 |
ljmp usb_reset_isr ; USB reset
|
|
Packit |
e67170 |
.db 0
|
|
Packit |
e67170 |
ljmp spare_isr
|
|
Packit |
e67170 |
.db 0
|
|
Packit |
e67170 |
ljmp ep0_in_isr
|
|
Packit |
e67170 |
.db 0
|
|
Packit |
e67170 |
ljmp ep0_out_isr
|
|
Packit |
e67170 |
.db 0
|
|
Packit |
e67170 |
ljmp ep1_in_isr
|
|
Packit |
e67170 |
.db 0
|
|
Packit |
e67170 |
ljmp ep1_out_isr
|
|
Packit |
e67170 |
.db 0
|
|
Packit |
e67170 |
ljmp ep2_in_isr
|
|
Packit |
e67170 |
.db 0
|
|
Packit |
e67170 |
ljmp ep2_out_isr
|
|
Packit |
e67170 |
.db 0
|
|
Packit |
e67170 |
ljmp ep3_in_isr
|
|
Packit |
e67170 |
.db 0
|
|
Packit |
e67170 |
ljmp ep3_out_isr
|
|
Packit |
e67170 |
.db 0
|
|
Packit |
e67170 |
ljmp ep4_in_isr
|
|
Packit |
e67170 |
.db 0
|
|
Packit |
e67170 |
ljmp ep4_out_isr
|
|
Packit |
e67170 |
.db 0
|
|
Packit |
e67170 |
ljmp ep5_in_isr
|
|
Packit |
e67170 |
.db 0
|
|
Packit |
e67170 |
ljmp ep5_out_isr
|
|
Packit |
e67170 |
.db 0
|
|
Packit |
e67170 |
ljmp ep6_in_isr
|
|
Packit |
e67170 |
.db 0
|
|
Packit |
e67170 |
ljmp ep6_out_isr
|
|
Packit |
e67170 |
.db 0
|
|
Packit |
e67170 |
ljmp ep7_in_isr
|
|
Packit |
e67170 |
.db 0
|
|
Packit |
e67170 |
ljmp ep7_out_isr
|
|
Packit |
e67170 |
.db 0
|
|
Packit |
e67170 |
|
|
Packit |
e67170 |
setup_data_avail_isr:
|
|
Packit |
e67170 |
push acc
|
|
Packit |
e67170 |
push dph
|
|
Packit |
e67170 |
push dpl
|
|
Packit |
e67170 |
push dph1
|
|
Packit |
e67170 |
push dpl1
|
|
Packit |
e67170 |
push dps
|
|
Packit |
e67170 |
mov a, EXIF
|
|
Packit |
e67170 |
clr acc.4 ; clear USB Interrupt Request
|
|
Packit |
e67170 |
mov EXIF, a
|
|
Packit |
e67170 |
mov dptr, #USBIRQ
|
|
Packit |
e67170 |
mov a, #00000001b ; Setup Data Avail. Interrupt Request
|
|
Packit |
e67170 |
movx @dptr, a
|
|
Packit |
e67170 |
pop dps
|
|
Packit |
e67170 |
pop dpl1
|
|
Packit |
e67170 |
pop dph1
|
|
Packit |
e67170 |
pop dpl
|
|
Packit |
e67170 |
pop dph
|
|
Packit |
e67170 |
pop acc
|
|
Packit |
e67170 |
reti
|
|
Packit |
e67170 |
|
|
Packit |
e67170 |
start_of_frame_isr:
|
|
Packit |
e67170 |
push acc
|
|
Packit |
e67170 |
push dph
|
|
Packit |
e67170 |
push dpl
|
|
Packit |
e67170 |
push dph1
|
|
Packit |
e67170 |
push dpl1
|
|
Packit |
e67170 |
push dps
|
|
Packit |
e67170 |
mov a, EXIF
|
|
Packit |
e67170 |
clr acc.4 ; clear USB Interrupt Request
|
|
Packit |
e67170 |
mov EXIF, a
|
|
Packit |
e67170 |
mov dptr, #USBIRQ
|
|
Packit |
e67170 |
mov a, #00000010b ; Start of frame Interrupt Request
|
|
Packit |
e67170 |
movx @dptr, a
|
|
Packit |
e67170 |
pop dps
|
|
Packit |
e67170 |
pop dpl1
|
|
Packit |
e67170 |
pop dph1
|
|
Packit |
e67170 |
pop dpl
|
|
Packit |
e67170 |
pop dph
|
|
Packit |
e67170 |
pop acc
|
|
Packit |
e67170 |
reti
|
|
Packit |
e67170 |
|
|
Packit |
e67170 |
setup_token_isr:
|
|
Packit |
e67170 |
push acc
|
|
Packit |
e67170 |
push dph
|
|
Packit |
e67170 |
push dpl
|
|
Packit |
e67170 |
push dph1
|
|
Packit |
e67170 |
push dpl1
|
|
Packit |
e67170 |
push dps
|
|
Packit |
e67170 |
mov a, EXIF
|
|
Packit |
e67170 |
clr acc.4 ; clear USB Interrupt Request
|
|
Packit |
e67170 |
mov EXIF, a
|
|
Packit |
e67170 |
mov dptr, #USBIRQ
|
|
Packit |
e67170 |
mov a, #00000100b ; Setup Token Interrupt Request
|
|
Packit |
e67170 |
movx @dptr, a
|
|
Packit |
e67170 |
pop dps
|
|
Packit |
e67170 |
pop dpl1
|
|
Packit |
e67170 |
pop dph1
|
|
Packit |
e67170 |
pop dpl
|
|
Packit |
e67170 |
pop dph
|
|
Packit |
e67170 |
pop acc
|
|
Packit |
e67170 |
reti
|
|
Packit |
e67170 |
|
|
Packit |
e67170 |
usb_suspend_isr:
|
|
Packit |
e67170 |
push acc
|
|
Packit |
e67170 |
push dph
|
|
Packit |
e67170 |
push dpl
|
|
Packit |
e67170 |
push dph1
|
|
Packit |
e67170 |
push dpl1
|
|
Packit |
e67170 |
push dps
|
|
Packit |
e67170 |
mov a, EXIF
|
|
Packit |
e67170 |
clr acc.4 ; clear USB Interrupt Request
|
|
Packit |
e67170 |
mov EXIF, a
|
|
Packit |
e67170 |
mov dptr, #USBIRQ
|
|
Packit |
e67170 |
mov a, #00001000b ; USB Suspend Interrupt Request
|
|
Packit |
e67170 |
movx @dptr, a
|
|
Packit |
e67170 |
pop dps
|
|
Packit |
e67170 |
pop dpl1
|
|
Packit |
e67170 |
pop dph1
|
|
Packit |
e67170 |
pop dpl
|
|
Packit |
e67170 |
pop dph
|
|
Packit |
e67170 |
pop acc
|
|
Packit |
e67170 |
reti
|
|
Packit |
e67170 |
|
|
Packit |
e67170 |
usb_reset_isr:
|
|
Packit |
e67170 |
push acc
|
|
Packit |
e67170 |
push dph
|
|
Packit |
e67170 |
push dpl
|
|
Packit |
e67170 |
push dph1
|
|
Packit |
e67170 |
push dpl1
|
|
Packit |
e67170 |
push dps
|
|
Packit |
e67170 |
mov a, EXIF
|
|
Packit |
e67170 |
clr acc.4 ; clear USB Interrupt Request
|
|
Packit |
e67170 |
mov EXIF, a
|
|
Packit |
e67170 |
mov dptr, #USBIRQ
|
|
Packit |
e67170 |
mov a, #00010000b ; USB Reset Interrupt Request
|
|
Packit |
e67170 |
movx @dptr, a
|
|
Packit |
e67170 |
pop dps
|
|
Packit |
e67170 |
pop dpl1
|
|
Packit |
e67170 |
pop dph1
|
|
Packit |
e67170 |
pop dpl
|
|
Packit |
e67170 |
pop dph
|
|
Packit |
e67170 |
pop acc
|
|
Packit |
e67170 |
reti
|
|
Packit |
e67170 |
|
|
Packit |
e67170 |
spare_isr:
|
|
Packit |
e67170 |
reti
|
|
Packit |
e67170 |
ep0_in_isr:
|
|
Packit |
e67170 |
reti
|
|
Packit |
e67170 |
ep0_out_isr:
|
|
Packit |
e67170 |
reti
|
|
Packit |
e67170 |
ep1_in_isr:
|
|
Packit |
e67170 |
reti
|
|
Packit |
e67170 |
ep1_out_isr:
|
|
Packit |
e67170 |
reti
|
|
Packit |
e67170 |
ep2_in_isr:
|
|
Packit |
e67170 |
reti
|
|
Packit |
e67170 |
ep2_out_isr:
|
|
Packit |
e67170 |
reti
|
|
Packit |
e67170 |
ep3_in_isr:
|
|
Packit |
e67170 |
reti
|
|
Packit |
e67170 |
ep3_out_isr:
|
|
Packit |
e67170 |
reti
|
|
Packit |
e67170 |
ep4_in_isr:
|
|
Packit |
e67170 |
reti
|
|
Packit |
e67170 |
ep4_out_isr:
|
|
Packit |
e67170 |
reti
|
|
Packit |
e67170 |
ep5_in_isr:
|
|
Packit |
e67170 |
reti
|
|
Packit |
e67170 |
ep5_out_isr:
|
|
Packit |
e67170 |
reti
|
|
Packit |
e67170 |
ep6_in_isr:
|
|
Packit |
e67170 |
reti
|
|
Packit |
e67170 |
ep6_out_isr:
|
|
Packit |
e67170 |
reti
|
|
Packit |
e67170 |
ep7_in_isr:
|
|
Packit |
e67170 |
reti
|
|
Packit |
e67170 |
ep7_out_isr:
|
|
Packit |
e67170 |
reti
|