;==================================================================================================
;
; FIRMWARE DE DEPURACIÓN DEL PROCESO DE ENUMERACIÓN
; EN UN PIC 18F4550
;
;--------------------------------------------------------------------------------------------------
;NOTAS ENUMERA 64 bytes 1.0
;
;
;
; FSR1H = 0x05 (en el banco 5 Endpoints)
; FSR0H = 0x04 (en el banco 4 Buffer Descriptors)
;
; TRONIX
; César González
; Gero Molina
; tronix.inventos@gmail.com
;
;--------------------------------------------------------------------------------------------------
;
;==================================================================================================
list p=18f4553
#include <p18f4553.inc>
;==================================================================================================
;
;Declaración de variables
;
cblock 0x10
;RAM para demoras
M1 ; Registros que carga los valores iniciales de demora
M2
cont1 ; Contadores que se decrementan n la subrutina demora
cont2 ;hasta ser 0
cont3
;RAM USB
USB_Estado
USB_Estado1 ; Byte de identificación del Estado del proceso de enumeración
USBreset
USBerror
USBtrans
USBrequest
usb_address ; Auxiliar para establecer UADDR en un IN Token
USBin
USBout
USBstall
USBsof
USBrecipiente
auxUSTAT ; Byte para respaldar USTAT
PID_byte ; Byte para los bits PID
n_ByteCount ; Número para el Byte Count IN
USB_config
dato_h
dato_l
datoEP1L
datoEP1H
index_ini
index_end
;Endpoits
ep00 ; Bytes de lectura del Endpoint 0 out
ep01
ep02
ep03
ep04
ep05
ep06
ep07
;Buffer Descriptors
bd00 ; Bytes de lectura de los Buffer Descriptors 0 In/Out
bd01
bd02
bd03
;RAM para banderas
bandera
flag
endc
;Declaración de bits
;Bits del registro "bandera"
;Bits del registro "flag"
;=================================================================================================
;
;Descriptores
;
;Device Descriptors
org 0x1100
data 0x12,0x01,0x00,0x02,0x00,0x00,0x00,0x40,0x34,0x12,0x01,0x00,0x01,0x00,0x01,0x02 ;0-30
data 0x00,0x01
;Configuration Descriptors
org 0x1200
data 0x09,0x02,0x29,0x00,0x01,0x01,0x00,0xC0,0x32,0x09,0x04,0x00,0x00,0x01,0x03,0x00
data 0x00,0x00,0x09,0x21,0x01,0x01,0x00,0x01,0x22,0x2F,0x00,0x07,0x05,0x81,0x03,0x02 ;32-62
data 0x00,0x01,0x07,0x05,0x01,0x03,0x02,0x00,0x01 ;64-94
;String Descriptors
org 0x1300
data 0x04,0x03,0x09,0x04,0x20,0x03,'U',0x00,'D',0x00,'A',0x00,' ',0x00,'E',0x00 ;0-30
data 'l',0x00,'e',0x00,'c',0x00,'t',0x00,'r',0x00,'o',0x00,'n',0x00,'i',0x00 ;32-62
data 'c',0x00,'a',0x00,' ',0x00,' ',0x00,' ',0x00,' ',0x00,' ',0x00,' ',0x00 ;64-94
data ' ',0x00,' ',0x00,' ',0x00,' ',0x00,0x10,0x03,'U',0x00,'S',0x00,'B',0x00 ;96-126
data ' ',0x00,'D',0x00,'A',0x00,'Q',0x00,' ',0x00,' ',0x00,' ',0x00,' ',0x00 ;128-158
data ' ',0x00,' ',0x00,' ',0x00,' ',0x00,' ',0x00,' ',0x00,' ',0x00,' ',0x00 ;160-190
data ' ',0x00,' ',0x00,' ',0x00,' ',0x00,' ',0x00 ;192-222
;Report Descriptors
org 0x1400
data 0x06,0x00,0XFF,0X09,0X01,0XA1,0X01,0X19,0X01,0X29,0X01,0X15,0X00,0X26,0XFF,0X00
data 0X75,0X08,0X95,0X02,0X81,0X00,0X19,0X01,0X29,0X01,0X75,0X08,0X95,0X02,0X91,0X00
data 0XC0
;=================================================================================================
;
;Vectores
org 0X00
goto ini
org 0x18
goto interrupt
;===================================================================================================
;
;Subrutinas
;
;_______________________________________________________________________________ .·.·SUBRUTINAS DE DEMORAS.·.·
;
;MANEJO DE TABLA
enviar_paquete
movlw 0x05
movwf FSR0L
movf n_ByteCount,w
movwf INDF0
movf index_ini,w
movwf TBLPTRL ;Primer Descriptor
movf n_ByteCount,w
mullw 2
movf PRODL,w
movwf index_end
movlw 0x05
movwf FSR1H
movlw 0x08
movwf FSR1L
rd_char ;fin de envio?
movf TBLPTRL,w
subwf index_end,w
btfsc STATUS,Z
goto send ;fin
;lee próximo
call lee_mem
movf dato_h,w
movwf POSTINC1
goto rd_char
send
movlw 0x04
movwf FSR0H
movlw 0x04
movwf FSR0L
movf INDF0,w
xorlw 0x40
movwf INDF0
andlw 0x40
iorlw 0x88
movwf INDF0
return
volver
bsf UEP0,EPSTALL
return
sendEP1
movlw 0x05
movwf FSR1H
movlw 0x4A
movwf FSR1L
movf datoEP1L,w
movwf POSTINC1 ;datos
movf datoEP1H,w
movwf INDF1
movlw 0x04
movwf FSR0H
movlw 0x0D
movwf FSR0L
movlw 0x02 ;byte count
movwf INDF0
movlw 0x04
movwf FSR0H
movlw 0x0C
movwf FSR0L
movf INDF0,w
xorlw 0x40
movwf INDF0
andlw 0x40 ;mandar el byte (tomando en cuenta la sincronizacion)
iorlw 0x88
movwf INDF0
return
;lee MEMORIA DE PROGRAMAS E INCREMENTA CURSOR
lee_mem ;leer el dato
TBLRD*+ ; read into TABLAT and increment
movf TABLAT,w ; get data
movwf dato_h
TBLRD*+ ; read into TABLAT and increment
movf TABLAT,w ; get data
movwf dato_l
return
;
;inicia puntero de TABLA en la 0x1100
ini_ptr1
clrf TBLPTRU
movlw 11
movwf TBLPTRH
clrf TBLPTRL
return
;inicia puntero de TABLA en la 0x1200
ini_ptr2
clrf TBLPTRU
movlw 12
movwf TBLPTRH
clrf TBLPTRL
return
;inicia puntero de TABLA2 en la 0x1300
ini_ptr3
clrf TBLPTRU
movlw 13
movwf TBLPTRH
clrf TBLPTRL
return
;inicia puntero de TABLA2 en la 0x1400
ini_ptr4
clrf TBLPTRU
movlw 14
movwf TBLPTRH
clrf TBLPTRL
return
;DEMORA DE 47US...................·.
dem_40us
movlw d'8'
movwf M1
movlw d'1'
movwf M2
call demora
return
;DEMORA DE 1.64ms (1640 US)....·.
dem_1640us
movlw d'46'
movwf M1
movlw d'1'
movwf M2
call demora
return
;DEMORA DE 5.32 m...............·.
dem_5ms
movlw d'60'
movwf M1
movlw d'5'
movwf M2
call demora
return
;DEMORA DE 50ms..................·.
dem_50ms
movlw d'67'
movwf M1
movlw d'14'
movwf M2
call demora
return
;DEMORA DE 100ms.................·.
dem_100ms
movlw d'100'
movwf M1
movlw d'15'
movwf M2
call demora
return
;DEMORA DE 1s aprox..............·.
dem_1s
movlw d'102'
movwf M1
movlw d'128'
movwf M2
call demora
return
; DEMORA general·.·.·.·.·.·.·.·.·.·.·.·.·
demora ;return
movf M1,w
movwf cont1
movwf cont2
movf M2,w
movwf cont3
loop decfsz cont1
goto loop
movf M1,w
movwf cont1
decfsz cont2
goto loop
movf M1,w
movwf cont2
decfsz cont3
goto loop
return
;_______________________________________________________________________________ .·.·SUBRUTINAS EEPROM.·.·
;
;subrutina endpoints
;
Ini_endpoint0
;Endpoint0
bsf UEP0,EPHSHK ; Handshaking para el endpoint 0 habilitado
bcf UEP0,EPCONDIS ; SETUP habilitado
bsf UEP0,EPOUTEN ; Habilitado como Out
bsf UEP0,EPINEN ; Habilitado como In
movlw 0x04
movwf FSR0H
movlw 0x01
movwf FSR0L
movlw 0x08 ; BD0CNT OUT
movwf POSTINC0
movlw 0x00 ; BD0ADRL OUT
movwf POSTINC0
movlw 0x05 ; BD0ADRH OUT
movwf POSTINC0
movlw 0x08 ; BD0STAT IN
movwf POSTINC0
movlw d'64' ; BD0CNT IN
movwf POSTINC0
movlw 0x08 ; BD0ADRL IN
movwf POSTINC0
movlw 0x05 ; BD0ADRH IN
movwf INDF0
movlw 0x04
movwf FSR0H
movlw 0x00
movwf FSR0L
movlw 0x88 ; BD0STAT OUT
movwf INDF0
return
Ini_endpoint1
;Endpoint1
bsf UEP1,EPHSHK ; Handshaking para el endpoint 1 habilitado
bsf UEP1,EPCONDIS ; SETUP habilitados
bsf UEP1,EPOUTEN ; Habilitado como Out
bsf UEP1,EPINEN ; Habilitado como IN
movlw 0x04
movwf FSR0H
movlw 0x09
movwf FSR0L
movlw 0x02 ; BD1CNT OUT
movwf POSTINC0
movlw 0x48 ; BD1ADRL OUT
movwf POSTINC0
movlw 0x05 ; BD1ADRH OUT
movwf POSTINC0
movlw 0x00 ; BD1STAT IN
movwf POSTINC0
movlw 0x02 ; BD1CNT IN
movwf POSTINC0
movlw 0x4A ; BD1ADRL IN
movwf POSTINC0
movlw 0x05 ; BD1ADRH IN
movwf INDF0
movlw 0x04
movwf FSR0H
movlw 0x08
movwf FSR0L
movlw 0xC8 ; BD1STAT OUT
movwf POSTINC0
return
;===============================================================================================================
;
;Programa Principal
;
ini
;Condiciones iniciales
movlb 0 ; BSR = 00
;Puertos
movlw b'01111111'
movwf TRISB
clrf LATB
clrf PORTB
movlw b'11111111'
movwf TRISA
movlw b'00000000'
movwf TRISC
movwf PORTC
movlw b'00001111' ; Puertos digitales
movwf ADCON1
movlw b'00000111'
movwf CMCON
clrf CCP2CON
;Variables
clrf USB_Estado
clrf USBreset
clrf USBerror
clrf USBtrans
clrf USBin
clrf USBout
clrf USBstall
clrf USBsof
clrf dato_h
clrf dato_l
clrf USB_config
movlw 0x05
movwf datoEP1L
movlw 0x06
movwf datoEP1H
;banderas
clrf flag ; Registros de banderas
clrf bandera ; Todas las banderas comienzan en 0
;USB
; REGISTROS GENERALES
; configuracion
;10-bit A/D
clrf ADCON0
movlw b'00001110' ;referido
movwf ADCON1
movlw b'00100001'
movwf ADCON2
bcf ADCON2,7
bcf ADCON0,7
bsf ADCON0,0 ;On
call dem_40us
;PWM
movlw b'00111100'
movwf CCP1CON
;Timer2
movlw b'01111011' ;8bit Prscaler-16 Postscaler-1 (formula= PR2·1us·Prescalr )(1ms)
movwf T2CON
movlw d'255'
movwf PR2 ;da un overflow cuando TMR2 es igual a este,asi se puede regular el tiempo con mas exctitud
bsf T2CON,2 ;tmr2 ON
clrf UCFG ; Primero se configura este registro
bcf UCFG,UTEYE ; Eye pattern test deshabilitado
bcf UCFG,UOEMON ; Señal UO(negada) inactiva
bsf UCFG,UPUEN ; On chip pull-up resistors habilitados
bcf UCFG,UTRDIS ; On chip tranciver habilitado (por default)
bsf UCFG,FSEN ; Full Speed
bcf UCFG,PPB1 ; Ping Pong Buffers desabilitados
bcf UCFG,PPB0
; Int USB
clrf UIE
bsf UIE,SOFIF ; Start of frame
bsf UIE,STALLIF ; STALL
bsf UIE,TRNIF ; Transacción completa
bsf UIE,ACTVIF ; Actividad
bsf UIE,UERRIF ; Error
bsf UIE,URSTIF ; Reset
clrf UIR ; Banderas
; control
clrf UCON
bcf UCON,PKTDIS ; Procesamiento de paquetes Token habilitado
bsf UCON,USBEN ; Modulo USB y circuiteria habilitado
bcf UCON,SUSPND ; Modo en suspension deshabilitado
; call Ini_endpoint
;Interrupciones
clrf INTCON
bsf PIE2,5
bcf PIR2,5
bsf INTCON,6 ; Todos las interrupciones perifericas activadas
; GIE y USBEN se prenden al final de la configuración
movlw 0xff
movwf CCPR1L
call dem_1s
call dem_1s
call dem_1s
movlw 0x00
movwf CCPR1L
bsf PORTB,7
call dem_1s
bcf PORTB,7
bsf INTCON,7
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
inicio
btfss PORTC,1
goto inicio
call dem_1s
call sendEP1
principal
btfss bandera,0
goto principal
bcf bandera,0
bcf INTCON,7
bsf ADCON0,1
loopA0
btfsc ADCON0,1; tiempo de conversion (96us)
goto loopA0
movff ADRESH,datoEP1H
movff ADRESL,datoEP1L
call sendEP1
bsf INTCON,7
;Aqui hay que preguntar por el LED, si esta apagado, goto inicio
goto principal
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;===============================================================================================================
;interrupciones
interrupt ; Atención a interrupción
btfsc PIR2,5
call interrupcionUSB
bcf PIR2,5
retfie
;===============================================================================================================
;-----------------------------------------------------------------------
;Atención a Interrupción USB (1er nivel)
;-----------------------------------------------------------------------
interrupcionUSB
btfsc UIR,UERRIF
goto subERROR
btfsc UIR,SOFIF
goto subSOF
btfsc UIR,IDLEIF
goto subIDLE
btfsc UIR,ACTVIF
call subACTV
btfsc UIR,STALLIF
goto subSTALL
btfsc UIR,URSTIF
goto subRESET
btfsc UIR,TRNIF
goto subTRANS
return
subERROR
clrf UEIR
bcf UIR,UERRIF
return
subSOF
bcf UIR,SOFIF
return
subIDLE
bcf UIR,IDLEIF
bsf UCON,SUSPND
return
subACTV
bcf UIR,ACTVIF
bcf UCON,SUSPND
return
subSTALL
bcf UIR,STALLIF
return
subRESET
bcf UIR,TRNIF
bcf UIR,TRNIF
bcf UIR,TRNIF
bcf UIR,TRNIF
call Ini_endpoint0
clrf UADDR
clrf UIR
clrf USB_config
bsf UEP0,EPHSHK ; Handshaking para el endpoint 0 habilitado
bcf UEP0,EPCONDIS ; SETUP habilitado
bsf UEP0,EPOUTEN ; Habilitado como Out
bsf UEP0,EPINEN ; Habilitado como In
setf UEIE
clrf USB_Estado
return
subTRANS ; HACER CON DIR y PID
btfsc USTAT,3
goto TRANS_EP1
movlw 0x04
movwf FSR0H
btfsc USTAT,DIR
movlw 0x04
btfss USTAT,DIR
movlw 0x00
movwf FSR0L
movf POSTINC0,w
movwf bd00
movf POSTINC0,w
movwf bd01
movf POSTINC0,w
movwf bd02
movf POSTINC0,w
movwf bd03
movf USTAT,w
movwf auxUSTAT
bcf UIR,TRNIF
movf bd00,w
andlw b'00111100'
movwf PID_byte
sublw b'00000100'
btfsc STATUS,Z
call OUT_Token
movf PID_byte,w
sublw b'00110100'
btfsc STATUS,Z
call SETUP_Token
movf PID_byte,w
sublw b'00100100'
btfsc STATUS,Z
call IN_Token
return
TRANS_EP1
btfss USTAT,DIR
call OUT_Token_EP1
btfsc USTAT,DIR
call IN_Token_EP1
bcf UIR,TRNIF
bcf UCON,PKTDIS
return
;
;-----------------------------------------------------------------------
;Token (2do nivel)
;-----------------------------------------------------------------------
IN_Token
movf auxUSTAT,w
andlw b'00011000'
btfss STATUS,Z
return
movf USB_Estado,w
sublw 0x02
btfsc STATUS,Z
movff usb_address,UADDR
movf USB_Estado,w
sublw 0x01
btfsc STATUS,Z
goto enviar_paquete
bcf UCON,PKTDIS
return
OUT_Token
movf auxUSTAT,w
andlw b'01111000'
btfss STATUS,Z
return
movlw 0x04
movwf FSR0H
movlw 0x01
movwf FSR0L
movlw 0x08
movwf INDF0 ; ByteCount=8 (en estado default)
movlw 0x00
movwf FSR0L
movlw 0x88
movwf INDF0
movlw 0x05
movwf FSR0L
movlw 0x00
movwf INDF0
movlw 0x04
movwf FSR0L
movlw 0xC8
movwf INDF0
return
SETUP_Token ; Transaccion de control
movlw 0x05
movwf FSR1H
movlw 0x00
movwf FSR1L
movf POSTINC1,w
movwf ep00
movf POSTINC1,w
movwf ep01
movf POSTINC1,w
movwf ep02
movf POSTINC1,w
movwf ep03
movf POSTINC1,w
movwf ep04
movf POSTINC1,w
movwf ep05
movf POSTINC1,w
movwf ep06
movf POSTINC1,w
movwf ep07
movlw 0x04
movwf FSR0H
movlw 0x01
movwf FSR0L
movlw 0x08
movwf INDF0 ; ByteCount=8 (en estado default)
movlw 0x04
movwf FSR0L
movlw 0x08
movwf INDF0
movlw 0x00
movwf FSR0L
movf ep00,w
sublw 0x21
btfss STATUS,Z
movlw 0x88
btfsc STATUS,Z
movlw 0xC8
movwf INDF0 ; BDown=1 SIE
bcf UCON,PKTDIS
clrf USB_Estado
movf ep00,w
andlw 0x60
movwf USBrequest
btfsc STATUS,Z
goto StandarRqeuest
movf USBrequest,w
sublw 0x20
btfsc STATUS,Z
goto ClassRqeuest
movf USBrequest,w
sublw 0x40
btfsc STATUS,Z
goto VendorRqeuest
return
IN_Token_EP1
bsf bandera,0
return
OUT_Token_EP1
bsf PORTC,0
return
;-----------------------------------------------------------------------
;Request (3er nivel)
;-----------------------------------------------------------------------
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++STANDART
StandarRqeuest
movf ep01,w
sublw 0x00
btfsc STATUS,Z
goto GET_STATUS
movf ep01,w
sublw 0x01
btfsc STATUS,Z
goto CLEAR_FEATURE
movf ep01,w
sublw 0x03
btfsc STATUS,Z
goto SET_FEATURE
movf ep01,w
sublw 0x05
btfsc STATUS,Z
goto SET_ADDRESS
movf ep01,w
sublw 0x06
btfsc STATUS,Z
goto GET_DESCRIPTOR
movf ep01,w
sublw 0x07
btfsc STATUS,Z
goto SET_DESCRIPTOR
movf ep01,w
sublw 0x08
btfsc STATUS,Z
goto GET_CONFIGURATION
movf ep01,w
sublw 0x09
btfsc STATUS,Z
goto SET_CONFIGURATION
movf ep01,w
sublw 0x0A
btfsc STATUS,Z
goto GET_INTERFACE
movf ep01,w
sublw 0x0B
btfsc STATUS,Z
goto SET_INTERFACE
movf ep01,w
sublw 0x0C
btfsc STATUS,Z
goto SYNCH_FRAME
bsf UEP0,EPSTALL
return
GET_STATUS
movf ep00,w
andlw 0x0F
movwf USBrecipiente
sublw 0x00
btfsc STATUS,Z
goto Recipiente_Device
movwf USBrecipiente
sublw 0x01
btfsc STATUS,Z
goto Recipiente_Interface
movwf USBrecipiente
sublw 0x02
btfsc STATUS,Z
goto Recipiente_Ebdpoint
bsf UEP0,EPSTALL
return
Recipiente_Device
movlw 0x05
movwf FSR0L
movlw 2
movwf INDF0
movlw 0x05
movwf FSR1H
movlw 0x08
movwf FSR1L
movlw 0x01
movwf POSTINC1
movlw 0x00
movwf INDF1
call send
return
Recipiente_Interface
movf USB_Estado,w
sublw 0x03 ; Config_estate
btfss STATUS,Z
goto volver
movlw 0x05
movwf FSR0L
movlw 2
movwf INDF0
movlw 0x05
movwf FSR1H
movlw 0x08
movwf FSR1L
movlw 0x00
movwf POSTINC1
movlw 0x00
movwf INDF1
call send
return
Recipiente_Ebdpoint
movf USB_Estado,w
sublw 0x02 ; address state
btfss STATUS,Z
call config_state
movf ep04,w
andlw 0x0F
btfss STATUS,Z
goto volver
movlw 0x08
movwf FSR1L
btfsc UEP0,EPSTALL
movlw 0x01
btfss UEP0,EPSTALL
movlw 0x00
movwf POSTINC1
clrf INDF1
movlw 0x05
movwf FSR0L
movlw 2
movwf INDF0
call send
return
config_state
movf USB_Estado,w
sublw 0x03
btfss STATUS,Z
goto volver
return
CLEAR_FEATURE
return
SET_FEATURE
return
SET_ADDRESS
btfsc ep02,7
bsf UEP0,EPSTALL
btfsc ep02,7
return
movlw 0x02
movwf USB_Estado
movff ep02,usb_address
movlw 0x04
movwf FSR0H
movlw 0x05
movwf FSR0L
movlw 0x00
movwf INDF0
movlw 0x04
movwf FSR0L
movlw 0xC8
movwf INDF0
return
GET_DESCRIPTOR
movlw 0x01 ;Get descriptor
movwf USB_Estado
movf ep03,w
sublw 1
btfsc STATUS,Z
goto DeviceDescriptor
movf ep03,w
sublw 2
btfsc STATUS,Z
goto ConfigDescriptor
movf ep03,w
sublw 3
btfsc STATUS,Z
goto StringDescriptor
movf ep03,w
sublw 6
btfsc STATUS,Z
bsf UEP0,EPSTALL
movf ep03,w
sublw 0x21
btfsc STATUS,Z
goto HIDDescriptor
movf ep03,w
sublw 0x22
btfsc STATUS,Z
goto ReportDescriptor
return
DeviceDescriptor
call ini_ptr1
clrf TBLPTRL
call lee_mem
movf dato_h,w
movwf n_ByteCount
clrf index_ini
movf ep07,w
sublw 0
btfss STATUS,Z
goto enviar_paquete
movf ep06,w
subwf n_ByteCount,w
btfsc STATUS,N
goto enviar_paquete
movff ep06,n_ByteCount
goto enviar_paquete
ConfigDescriptor
movf ep02,w
sublw 0
btfss STATUS,Z
bsf UEP0,EPSTALL
movf ep02,w
sublw 0
btfss STATUS,Z
return
call ini_ptr2
movlw d'4'
movwf TBLPTRL
call lee_mem
movf dato_h,w
movwf n_ByteCount
clrf index_ini
movf ep06,w
btfsc STATUS,Z
bsf UEP0,EPSTALL
movf ep06,w
sublw 0x09
btfsc STATUS,Z
movff ep06,n_ByteCount
bsf PORTB,7
goto enviar_paquete
StringDescriptor
call ini_ptr3
movf ep02,w
sublw 0
btfsc STATUS,Z
call string0
movf ep02,w
sublw 1
btfsc STATUS,Z
call string1
movf ep02,w
sublw 2
btfsc STATUS,Z
call string2
call lee_mem
movf dato_h,w
movwf n_ByteCount
bsf PORTC,1
goto enviar_paquete
string0
movlw 0x00
movwf index_ini
movwf TBLPTRL
return
string1
movlw 0x08
movwf index_ini
movwf TBLPTRL
return
string2
movlw 0x70
movwf index_ini
movwf TBLPTRL
return
HIDDescriptor
movf ep02,w
sublw 0
btfss STATUS,Z
bsf UEP0,EPSTALL
movf ep02,w
sublw 0
btfss STATUS,Z
return
call ini_ptr2
movlw 9
movwf n_ByteCount
movlw d'32'
movwf index_ini
goto enviar_paquete
return
ReportDescriptor
movf ep02,w
sublw 0
btfss STATUS,Z
bsf UEP0,EPSTALL
movf ep02,w
sublw 0
btfss STATUS,Z
return
call ini_ptr3
movlw 0x29
movwf n_ByteCount
clrf index_ini
goto enviar_paquete
return
SET_DESCRIPTOR
return
GET_CONFIGURATION
movlw 0x05
movwf FSR0L
movlw 1
movwf INDF0
movlw 0x05
movwf FSR1H
movlw 0x08
movwf FSR1L
movf USB_config,w
movwf INDF1
call send
return
SET_CONFIGURATION
movf ep02,w
sublw 0
btfsc STATUS,Z
goto set_config0
movf ep02,w
sublw 1
btfss STATUS,Z
return
movlw 0x03 ;Estado Configurado
movwf USB_Estado
call Ini_endpoint1
movlw 0x05
movwf FSR0L
movlw 0
movwf INDF0
call send
return
set_config0
movlw 0x02 ; Estado Adress
movwf USB_Estado
movlw 0x05
movwf FSR0L
movlw 0
movwf INDF0
call send
return
GET_INTERFACE
return
SET_INTERFACE
return
SYNCH_FRAME
return
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++CLASS
ClassRqeuest
return
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++VENDOR
VendorRqeuest
return
end