1807 lines
39 KiB
NASM
1807 lines
39 KiB
NASM
;*******************************************************************************
|
|
;*
|
|
;* (c) Copyright 2005, Holtek Semiconductor Inc.
|
|
;*
|
|
;******************************************************************************/
|
|
;*******************************************************************************
|
|
;MODULE: main.asm
|
|
|
|
;INITIAL: 09/14/2006
|
|
|
|
;AUTHOR: C351 Ansonku.
|
|
|
|
;NOTE: HT82A821R , HT82A822R Main Function
|
|
|
|
;VERSION: 1.2
|
|
;Function:
|
|
;key debounced N
|
|
;oled N
|
|
;volume adjust Y
|
|
;2005/05/13 Update Key Debounce
|
|
;2005/05/25 Modify Pop noise
|
|
;2005/06/06 Modify Send_Hand_Shake
|
|
;2005/06/10 判斷 token 時,假設遇到setup scmd,要在讀取8 bytes清除scmd與len0
|
|
;2005/12/20 USB 流程全改用 jmp 方式 implement
|
|
;2005/12/20 將 suspend 判斷修改至 main function 中
|
|
;*******************************************************************************
|
|
|
|
;***************************************************************
|
|
;Include File
|
|
;ht82a822.inc ht82a822r register address defined
|
|
;const.inc user defined
|
|
;macro.asm macro function
|
|
;***************************************************************
|
|
#include ht82a821r.inc
|
|
#include const.inc
|
|
#include macro.asm
|
|
|
|
#define WaitBias 0
|
|
|
|
;====================================================================
|
|
;Variable Defined , DATA 從 40H 開始放
|
|
;====================================================================
|
|
DATA .SECTION AT 40H 'DATA'
|
|
#include memory.inc
|
|
;***************************************************************
|
|
; USB ISR Var (中斷時備份用)
|
|
;***************************************************************
|
|
isr_usb_acc DB ?
|
|
isr_usb_status DB ?
|
|
isr_usb_mp1 DB ?
|
|
isr_usb_mp0 DB ?
|
|
isr_usb_tblp DB ?
|
|
;***************************************************************
|
|
; Timer0 ISR Var (中斷時備份用)
|
|
;***************************************************************
|
|
;;isr_tmr0_acc DB ?
|
|
;;isr_tmr0_status DB ?
|
|
;;isr_tmr0_mp1 DB ?
|
|
;;isr_tmr0_mp0 DB ?
|
|
;;isr_tmr0_tblp DB ?
|
|
;***************************************************************
|
|
; Timer1 ISR Var (中斷時備份用)
|
|
;***************************************************************
|
|
;;isr_tmr1_acc DB ?
|
|
;;isr_tmr1_status DB ?
|
|
;;isr_tmr1_mp1 DB ?
|
|
;;isr_tmr1_mp0 DB ?
|
|
;;isr_tmr1_tblp DB ?
|
|
|
|
;***************************************************************
|
|
; Delay 變數
|
|
;***************************************************************
|
|
Delay_1 DB ?
|
|
Delay_2 DB ?
|
|
Delay_3 DB ?
|
|
|
|
;***************************************************************
|
|
;USB FIFO Variable
|
|
;USB_Interface : to save usb current interface number
|
|
;USB_Interface_Alt : to save usb current alternate of interface number
|
|
;USB_Configuration : to save USB configuration number
|
|
;FIFO_ADDR : to save USB ADDRESS
|
|
;Loop_Counter , Data_Count , Data_Start : control_read variable
|
|
;***************************************************************
|
|
;For FIFO Access
|
|
FIFO_SIZE db ?
|
|
FIFO_SendLen db ?
|
|
FIFO_out1 label byte
|
|
FIFO_Type db ?
|
|
FIFO_out2 label byte
|
|
FIFO_Request db ?
|
|
FIFO_out3 label byte
|
|
FIFO_wValueL db ?
|
|
FIFO_out4 label byte
|
|
FIFO_wValueH db ?
|
|
FIFO_out5 label byte
|
|
FIFO_wIndexL db ?
|
|
FIFO_out6 label byte
|
|
FIFO_wIndexH db ?
|
|
FIFO_out7 label byte
|
|
FIFO_wLengthL db ?
|
|
FIFO_out8 label byte
|
|
FIFO_wLengthH db ?
|
|
|
|
FIFO_TEMP db ?
|
|
;**************************************************************
|
|
;USB 狀態暫存
|
|
;
|
|
;
|
|
;**************************************************************
|
|
USB_Interface db ?
|
|
USB_Interface_Alt db ?
|
|
USB_Configuration db ?
|
|
;//save usb address
|
|
FIFO_ADDR db ?
|
|
|
|
Loop_Counter db ?
|
|
Data_Count db ?
|
|
Data_Start db ?
|
|
|
|
;voice control
|
|
INC_Counter db ?
|
|
DEC_Counter db ?
|
|
|
|
|
|
;FIFO
|
|
bFlag_SetConfiguration_Ready dbit
|
|
bFlag_SetInterface_Ready dbit
|
|
bFlag_Real_Cmd dbit
|
|
bFlag_FIFO_Ready dbit
|
|
bFlag_FIFO_LEN0 dbit
|
|
bFlag_RD_HTable dbit
|
|
bFlag_wait_control_out dbit
|
|
bFlag_SET_ADDRESS dbit
|
|
bFlag_SCMD dbit
|
|
bFlag_Enum_Ready dbit
|
|
;Audio
|
|
PortC_data db ?
|
|
bFlag_Audio_Mute dbit
|
|
Volume1 db ?
|
|
Volume2 db ?
|
|
|
|
;Mute_Save db ?
|
|
VolumeH_Save db ?
|
|
VolumeL_Save db ?
|
|
|
|
nCmdIndex1 db ?
|
|
|
|
|
|
;**************************************************************
|
|
;Key 狀態暫存
|
|
;
|
|
;
|
|
;**************************************************************
|
|
|
|
;;Key_Process db ?
|
|
;;Key_CheckIn db ?
|
|
;;Key_Counter db ?
|
|
;;Key_Temp db ?
|
|
;;Key_IncCounter db ?
|
|
;;Key_DecCounter db ?
|
|
|
|
;modify for Remote Wakeup
|
|
bRmtWakeup dbit
|
|
b_wakeup dbit
|
|
;modify 2007-06-27
|
|
b_forceresumeWakeup dbit
|
|
;modify 2007-07-03
|
|
b_forusbRst dbit
|
|
bFlagTMR1 dbit
|
|
|
|
;;***********************************************
|
|
|
|
extern control_read_table:NEAR
|
|
extern device_desc_table:NEAR
|
|
extern config_desc_table:NEAR
|
|
|
|
extern end_config_desc_table:NEAR
|
|
extern hid_report_desc_table:NEAR
|
|
extern end_hid_report_desc_table:NEAR
|
|
|
|
extern USBStringLanguageDescription:NEAR
|
|
extern USBStringDescription1:NEAR
|
|
extern USBStringDescription2:NEAR
|
|
|
|
extern config_desc_length:NEAR
|
|
extern report_desc_length:NEAR
|
|
;function
|
|
extern Control_Read:NEAR
|
|
extern FIFO0_RD_CHECK:NEAR
|
|
extern FIFO1_RD_CHECK:NEAR
|
|
extern FIFO2_RD_CHECK:NEAR
|
|
extern FIFO3_RD_CHECK:NEAR
|
|
extern FIFO4_RD_CHECK:NEAR
|
|
extern FIFO5_RD_CHECK:NEAR
|
|
extern FIFO0_WR_CHECK:NEAR
|
|
extern FIFO1_WR_CHECK:NEAR
|
|
extern FIFO2_WR_CHECK:NEAR
|
|
extern FIFO3_WR_CHECK:NEAR
|
|
extern FIFO4_WR_CHECK:NEAR
|
|
extern FIFO5_WR_CHECK:NEAR
|
|
extern Read_FIFO0:NEAR
|
|
extern Read_FIFO1:NEAR
|
|
extern Read_FIFO2:NEAR
|
|
extern Read_FIFO3:NEAR
|
|
extern Read_FIFO4:NEAR
|
|
extern Read_FIFO5:NEAR
|
|
extern Write_FIFO0:NEAR
|
|
extern Write_FIFO1:NEAR
|
|
extern Write_FIFO2:NEAR
|
|
extern Write_FIFO3:NEAR
|
|
extern Write_FIFO4:NEAR
|
|
extern Write_FIFO5:NEAR
|
|
extern Send_Hand_Shake:NEAR
|
|
extern get_descriptor_length:NEAR
|
|
|
|
extern SetAddress:NEAR
|
|
extern SetConfiguration:NEAR
|
|
extern SetInterface:NEAR
|
|
extern GetInterface:NEAR
|
|
extern GetDescriptor:NEAR
|
|
extern SetIdle:NEAR
|
|
extern GetDeviceDescriptor:NEAR
|
|
extern GetConfigurationDescriptor:NEAR
|
|
extern GetStringDescriptor:NEAR
|
|
extern GetStatus:NEAR
|
|
;modify for Remote Wakeup
|
|
extern GetStatus_Interface:NEAR
|
|
;----------------------------------------------
|
|
extern SetFeature:NEAR
|
|
extern ClearFeature:NEAR
|
|
extern SetReport:NEAR
|
|
extern Execute:NEAR
|
|
extern SendStall0:NEAR
|
|
extern Delay_3us:NEAR
|
|
|
|
extern SetFeature_Endpoint:NEAR
|
|
extern ClearFeature_Endpoint:NEAR
|
|
extern GetStatus_Endpoint:NEAR
|
|
|
|
extern Check_Real_Cmd:NEAR
|
|
extern GetConfiguration:NEAR
|
|
|
|
|
|
;audio
|
|
extern SetCur:NEAR
|
|
extern GetMin:NEAR
|
|
extern GetMax:NEAR
|
|
extern GetRes:NEAR
|
|
extern GetCur:NEAR
|
|
|
|
extern GetPipeBit:NEAR
|
|
;***************************************************************
|
|
; MCU Interrupt Table
|
|
;***************************************************************
|
|
|
|
|
|
CODE .section AT 00H 'code'
|
|
ORG 00H
|
|
jmp Start
|
|
ORG 04H
|
|
jmp USB_ISR
|
|
ORG 08H
|
|
jmp Timer_0_ISR
|
|
ORG 0CH
|
|
jmp Timer_1_ISR
|
|
|
|
|
|
;-----------------------------------------------------------
|
|
; Start : ORG 20H 避開前面 interrupt
|
|
;-----------------------------------------------------------
|
|
ORG 20H
|
|
Start:
|
|
|
|
call System_Initial
|
|
|
|
;-----------------------------------------------------------
|
|
; Main LOOP Function :
|
|
;-----------------------------------------------------------
|
|
Main:
|
|
;-----------------------------------------------------------
|
|
; Check Suspend Function :
|
|
; 第一次檢查到 suspend 應要再 delay 1 S 後再檢查一次 , 如果此時 suspend 訊號還在才進入 halt
|
|
; 請檢查 timer 此時是否有開啟 , 若有應暫時關閉 , 待 resume 後再開啟
|
|
;-----------------------------------------------------------
|
|
SNZ USC.@USC_SUSP ;check SUSPEND ?
|
|
JMP Main_My_Function
|
|
|
|
call wait_about_1s
|
|
SNZ USC.@USC_SUSP
|
|
JMP Main_My_Function
|
|
|
|
ToSuspend_again:
|
|
clr wdt
|
|
;; clr TMR1C.4
|
|
clr USB_LED_ON
|
|
clr UCC.@UCC_USBCKEN
|
|
clr b_forceresumeWakeup
|
|
;clr b_forusbRst
|
|
;-----------------------------------------------------------
|
|
; Resume Function :
|
|
; 在此 function 要把 halt 之前的 timer 狀態恢復 , 並且開啟 USBCKEN
|
|
;-----------------------------------------------------------
|
|
HALT
|
|
;; set TMR1C.4
|
|
set USB_LED_ON
|
|
set UCC.@UCC_USBCKEN
|
|
|
|
;modify 2007-06-28
|
|
set AWR.@AWR_WKEN
|
|
|
|
;sZ b_forusbRst
|
|
;JMP Start
|
|
|
|
sz b_forceresumeWakeup
|
|
jmp RemoteWakeup
|
|
|
|
snz b_wakeup
|
|
jmp RemoteWakeup_loop
|
|
;clr b_wakeup
|
|
snz bRmtWakeup ; 檢查USB device是否Enable RemoteWakeup能力
|
|
jmp ToSuspend_again ; 若bRmtWakeup=0,則再度回到suspend
|
|
clr bRmtWakeup
|
|
|
|
;modify for Remote Wakeup
|
|
RemoteWakeup_loop:
|
|
clr b_wakeup
|
|
|
|
|
|
;sz b_forceresumeWakeup
|
|
;jmp RemoteWakeup
|
|
|
|
;sz USC.@USC_SUSP ;
|
|
;jmp ToSuspend_again ;
|
|
;JMP Main
|
|
|
|
RemoteWakeup:
|
|
;modify 2007-06-27
|
|
clr b_forceresumeWakeup
|
|
SET USC.@USC_RMWK ; USC.RMWK=1
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
CLR USC.@USC_RMWK ; USC.RMWK=0
|
|
;clr AWR.@AWR_WKEN
|
|
;sZ b_forusbRst
|
|
;JMP Start
|
|
|
|
SZ USC.@USC_SUSP ;check SUSPEND ?
|
|
JMP Main
|
|
|
|
;-----------------------------------------------------
|
|
Main_My_Function:
|
|
CLR WDT
|
|
SNZ bFlag_SetConfiguration_Ready
|
|
JMP main ;;USB Not OK
|
|
|
|
;----------------------------------------------------
|
|
SZ bIniFMOK
|
|
JMP L_MyFunction ;;IniFM OK
|
|
|
|
MOV A,cFreqDefL
|
|
MOV mFreqL,A
|
|
MOV A,cFreqDefH
|
|
MOV mFreqH,A
|
|
CALL QN8072Init ;;Init QN8072
|
|
SET bIniFMOK
|
|
|
|
;-----------------------------------------------------------
|
|
; Here to add your another code !!
|
|
;-----------------------------------------------------------
|
|
L_MyFunction:
|
|
clr wdt
|
|
NOP
|
|
snz bFlagTMR1
|
|
;; jmp Main_End
|
|
;; IF UseMediaKey
|
|
;; call Key_Debounced
|
|
;; ENDIF
|
|
call Run_Volume_Step
|
|
|
|
clr bFlagTMR1
|
|
|
|
Main_End:
|
|
|
|
JMP Main
|
|
|
|
;***************************************************************
|
|
; System Initial
|
|
; 1.ram_initial
|
|
; 1.Timer Initial
|
|
; 2.USB Config
|
|
;***************************************************************
|
|
System_Initial:
|
|
;-----------------------------------------------------------
|
|
; Debug
|
|
;-----------------------------------------------------------
|
|
|
|
|
|
;-----------------------------------------------------------
|
|
; Modify Pop Noise
|
|
; 送中間準位 code 至 DA
|
|
;-----------------------------------------------------------
|
|
clr wdt
|
|
mov a,WDTS
|
|
mov FIFO_TEMP,a
|
|
|
|
mov a,01010111b
|
|
mov WDTS,a
|
|
|
|
clr [02DH]
|
|
|
|
|
|
mov a,80H
|
|
mov [02EH],a
|
|
nop
|
|
nop
|
|
set [02FH].3
|
|
nop
|
|
nop
|
|
clr [02FH].3
|
|
nop
|
|
nop
|
|
|
|
mov a,FIFO_TEMP
|
|
mov WDTS,a
|
|
;-----------------------------------------------------------
|
|
; 此步驟為等待電容的上升時間
|
|
; 測試時應該把 WaitBias 設為 0 , 非測試應該把 WaitBais 設為 1
|
|
; Wait Bais and ROUT LOUT Capacity rise about 1.98ms
|
|
; delay time = 255*255*30*3(sdz,jmp) cycle * 0.3333us/cycle = 1.98 ms
|
|
;-----------------------------------------------------------
|
|
IF WaitBias
|
|
clr pac
|
|
|
|
clr FIFO_OUT1
|
|
clr FIFO_OUT2
|
|
clr FIFO_OUT3
|
|
mov a,9
|
|
mov FIFO_OUT3,a
|
|
clr pa
|
|
|
|
|
|
|
|
System_Initial_Loop:
|
|
clr wdt
|
|
sdz FIFO_OUT1
|
|
jmp System_Initial_Loop
|
|
sdz FIFO_OUT2
|
|
jmp System_Initial_Loop
|
|
sdz FIFO_OUT3
|
|
jmp System_Initial_Loop
|
|
nop
|
|
set pa
|
|
clr wdt
|
|
ENDIF
|
|
;-----------------------------------------------------------
|
|
; Codec Limit
|
|
;-----------------------------------------------------------
|
|
clr [02DH]
|
|
set [02EH]
|
|
|
|
;-----------------------------------------------------------
|
|
; ram_initial : clear the ram of bank 0
|
|
;-----------------------------------------------------------
|
|
ram_initial: ;clear RAM (040H--0FFH)
|
|
MOV A,040H
|
|
MOV MP0,A
|
|
MOV A,192
|
|
ram_initial_next_addr:
|
|
clr wdt
|
|
CLR R0
|
|
INC MP0
|
|
SDZ acc
|
|
JMP ram_initial_next_addr
|
|
|
|
CLR bFlag_RD_HTable
|
|
;-----------------------------------------------------------
|
|
; timer_initial : do timer initial
|
|
;-----------------------------------------------------------
|
|
timer_initial:
|
|
;; MOV A,80H ; 設定 low 到 high 觸發並設為內部計時模式
|
|
;; MOV TMR0C,A ;
|
|
;; MOV A,00H ;
|
|
;; MOV TMR0L,A
|
|
;; MOV A,000H
|
|
;; MOV TMR0H,A
|
|
|
|
mov a,80H
|
|
mov TMR1C,a
|
|
mov a,00H
|
|
mov TMR1L,a
|
|
mov TMR1H,a
|
|
|
|
;-----------------------------------------------------------
|
|
; config_io_port :
|
|
;-----------------------------------------------------------
|
|
;; clr PA
|
|
;-----------------------------------------------------------
|
|
; config_io_port :(USB Audio)
|
|
;-----------------------------------------------------------
|
|
SET P_LED
|
|
CLR P_LEDC
|
|
SET P_SDA
|
|
CLR P_SDAC
|
|
SET P_SCL
|
|
CLR P_SCLC
|
|
|
|
;;Initial QN8072 Reg0~4
|
|
MOV A,51H
|
|
MOV mQNReg[0],A
|
|
MOV A,18H
|
|
MOV mQNReg[1],A
|
|
MOV A,0B9H
|
|
MOV mQNReg[2],A
|
|
MOV A,50H
|
|
MOV mQNReg[3],A
|
|
MOV A,58H
|
|
MOV mQNReg[4],A
|
|
|
|
|
|
;; IF UseMediaKey
|
|
;; kmov pac,Key_Defined
|
|
;; ENDIF
|
|
;; IFE UseMediaKey
|
|
;; kmov pac,00000000b
|
|
;; ENDIF
|
|
|
|
;; clr pb
|
|
;; clr pbc ;change to USB Len On
|
|
;;; clr pc ;for volume control
|
|
;; set pcc
|
|
;; clr pd
|
|
;; clr pdc
|
|
;-----------------------------------------------------------
|
|
; config_usb_speaker_register :
|
|
;-----------------------------------------------------------
|
|
clr USVC ;mute & 0db
|
|
clr USF
|
|
;-----------------------------------------------------------
|
|
; reset variable :
|
|
;-----------------------------------------------------------
|
|
clr bFlag_Audio_Mute
|
|
clr VolumeH_Save
|
|
mov a,Cur_Volume
|
|
mov VolumeL_Save,a
|
|
;-----------------------------------------------------------
|
|
; config_usb : do usb config
|
|
;-----------------------------------------------------------
|
|
config_usb:
|
|
CLR INTC0
|
|
SET INTC0.@INTC0_EEI ;enable USB
|
|
SET INTC0.@INTC0_EMI ;Global interrupt
|
|
|
|
set MISC.@MISC_ISOEN
|
|
clr STALL
|
|
clr UCC.@UCC_SUSP2
|
|
|
|
;SYSCLK
|
|
;set UCC.6 //set to 6 MHz
|
|
|
|
set UCC.@UCC_USBCKEN
|
|
nop
|
|
set USC.@USC_V33C ;//pc 開始送 command 過來
|
|
clr wdt
|
|
;modify for Remote Wakeup
|
|
clr bRmtWakeup
|
|
clr b_wakeup
|
|
clr b_forusbRst
|
|
;clr AWR.@AWR_WKEN
|
|
RET
|
|
|
|
;***************************************************************
|
|
; Timer_0_ISR
|
|
; 1.Timer time = 21.2 ms
|
|
; 2.Do this procedure is 3.6ms
|
|
;***************************************************************
|
|
Timer_0_ISR:
|
|
;; clr TMR0C.4
|
|
;; MOV isr_tmr0_acc,A ;save ACC
|
|
;; MOV A,STATUS
|
|
;; MOV isr_tmr0_status,A ;save status
|
|
;; MOV A,MP1
|
|
;; MOV isr_tmr0_mp1,A ;save mp1
|
|
;; MOV A,MP0
|
|
;; MOV isr_tmr0_mp0,A ;save mp0
|
|
;; MOV A,TBLP
|
|
;; MOV isr_tmr0_tblp,A ;save TBLP
|
|
|
|
Timer_0_My_Function:
|
|
;-----------------------------------------------------------
|
|
; Here to add your another code !!
|
|
;-----------------------------------------------------------
|
|
;; NOP
|
|
;; clr wdt
|
|
|
|
Timer_0_ISR_END:
|
|
;; MOV A,isr_tmr0_tblp ;restore TBLP
|
|
;; MOV TBLP,A
|
|
;; MOV A,isr_tmr0_mp0 ;restore MP0
|
|
;; MOV MP0,A
|
|
;; MOV A,isr_tmr0_mp1 ;restore MP1
|
|
;; MOV MP1,A
|
|
;; MOV A,isr_tmr0_status ;restore STATUS
|
|
;; MOV STATUS,A
|
|
;; MOV A,isr_tmr0_acc ;restore ACC
|
|
;; SET TMR0C.4 ;start timer0
|
|
|
|
RETI
|
|
|
|
;***************************************************************
|
|
; Timer_1_ISR
|
|
; 1.Timer time = 21.2 ms
|
|
; 2.Do this procedure is 3.6ms
|
|
;***************************************************************
|
|
Timer_1_ISR:
|
|
CLR TMR1C.4
|
|
|
|
|
|
;; MOV isr_tmr1_acc,A ;save ACC
|
|
;; MOV A,STATUS
|
|
;; MOV isr_tmr1_status,A ;save status
|
|
;; MOV A,MP1
|
|
;; MOV isr_tmr1_mp1,A ;save mp1
|
|
;; MOV A,MP0
|
|
;; MOV isr_tmr1_mp0,A ;save mp0
|
|
;; MOV A,TBLP
|
|
;; MOV isr_tmr1_tblp,A ;save TBLP
|
|
;; clr wdt
|
|
;IF UseMediaKey
|
|
;call Key_Debounced
|
|
;ENDIF
|
|
;call Run_Volume_Step
|
|
set bFlagTMR1
|
|
|
|
;; MOV A,isr_tmr1_tblp ;restore TBLP
|
|
;; MOV TBLP,A
|
|
;; MOV A,isr_tmr1_mp0 ;restore MP0
|
|
;; MOV MP0,A
|
|
;; MOV A,isr_tmr1_mp1 ;restore MP1
|
|
;; MOV MP1,A
|
|
;; MOV A,isr_tmr1_status ;restore STATUS
|
|
;; MOV STATUS,A
|
|
;; MOV A,isr_tmr1_acc ;restore ACC
|
|
|
|
Timer_1_ISR_End:
|
|
SET TMR1C.4
|
|
RETI
|
|
|
|
;***************************************************************
|
|
; USB_ISR : USB Interrupt Routine
|
|
; 1.Back up every status register
|
|
; 2.check which endpoint is interrupt
|
|
;***************************************************************
|
|
USB_ISR:
|
|
;CLR INTC0.@INTC0_EEI ;disable USB interrupt
|
|
;SET INTC0.@INTC0_EMI
|
|
|
|
MOV isr_usb_acc,A ;save ACC
|
|
MOV A,STATUS
|
|
MOV isr_usb_status,A ;save status
|
|
MOV A,MP1
|
|
MOV isr_usb_mp1,A ;save mp1
|
|
MOV A,MP0
|
|
MOV isr_usb_mp0,A ;save mp0
|
|
MOV A,TBLP
|
|
MOV isr_usb_tblp,A ;save TBLP
|
|
|
|
;modify 2007-07-03
|
|
SZ USC.@USC_URST
|
|
SET b_forusbRst
|
|
CLR USC.@USC_URST
|
|
|
|
;modify 2007-06-27
|
|
SZ USC.@USC_RESUME
|
|
set b_forceresumeWakeup;;JMP RemoteWakeup
|
|
|
|
clr wdt
|
|
;;Check Which FIFO is interrupt
|
|
JMP Check_Access_FIFO
|
|
|
|
|
|
|
|
USB_ISR_END:
|
|
MOV A,isr_usb_tblp ;restore TBLP
|
|
MOV TBLP,A
|
|
MOV A,isr_usb_mp0 ;restore MP0
|
|
MOV MP0,A
|
|
MOV A,isr_usb_mp1 ;restore MP1
|
|
MOV MP1,A
|
|
MOV A,isr_usb_status ;restore STATUS
|
|
MOV STATUS,A
|
|
MOV A,isr_usb_acc ;restore ACC
|
|
|
|
|
|
;CLR INTC0.@INTC0_EMI
|
|
;SET INTC0.@INTC0_EEI
|
|
|
|
|
|
RETI
|
|
|
|
;***************************************************************
|
|
; USB_EPX_ISR
|
|
; 之前使用 USR@EP0IF EQU [01BH].0 判別會偵測不到
|
|
; 更改成 USB_STATUS_CONTROL.@EP0IF
|
|
;***************************************************************
|
|
Check_Access_FIFO:
|
|
clr wdt
|
|
SZ USR.@USR_EP0F
|
|
JMP USB_EP0_ISR
|
|
SZ USR.@USR_EP1F
|
|
JMP USB_EP1_ISR
|
|
SZ USR.@USR_EP2F
|
|
JMP USB_EP2_ISR
|
|
JMP USB_ISR_END
|
|
|
|
;-----------------------------------------------------
|
|
;EPNPOINT 0
|
|
;-----------------------------------------------------
|
|
USB_EP0_ISR:
|
|
;CLR USR.@USR_EP0F
|
|
|
|
;;case1
|
|
SZ MISC.@MISC_SCMD ;check setup token
|
|
JMP USB_EP0_SETUP_TOKEN
|
|
|
|
SZ MISC.@MISC_LEN0 ;check out ack token
|
|
JMP USB_EP0_OUT_ACK_TOKEN
|
|
|
|
CALL FIFO0_RD_CHECK
|
|
SZ bFlag_FIFO_Ready
|
|
JMP USB_EP0_OUT_TOKEN
|
|
;clr MISC.@MISC_REQ
|
|
|
|
CALL FIFO0_WR_CHECK
|
|
SZ bFlag_FIFO_Ready
|
|
JMP USB_EP0_IN_TOKEN ;else is in token
|
|
;clr MISC.@MISC_REQ
|
|
|
|
;modify 2007-06-20
|
|
CLR USR.@USR_EP0F ;Fix OHCI Volume
|
|
|
|
JMP USB_EP0_ISR_END
|
|
|
|
|
|
;;case2
|
|
;; SZ MISC.@MISC_SCMD ;check setup token
|
|
;; JMP USB_EP0_SETUP_TOKEN
|
|
;;
|
|
;; SZ MISC.@MISC_LEN0 ;check out ack token
|
|
;; JMP USB_EP0_OUT_ACK_TOKEN
|
|
;;
|
|
;; CALL FIFO0_RD_CHECK
|
|
;; SZ bFlag_FIFO_Ready
|
|
;; JMP USB_EP0_OUT_TOKEN
|
|
;; ;clr MISC.@MISC_REQ
|
|
;;
|
|
;; CALL FIFO0_WR_CHECK
|
|
;; SZ bFlag_FIFO_Ready
|
|
;; JMP USB_EP0_IN_TOKEN ;else is in token
|
|
;; ;clr MISC.@MISC_REQ
|
|
;;
|
|
;;
|
|
;; JMP USB_EP0_ISR_END
|
|
|
|
|
|
;;case3
|
|
;; call FIFO0_RD_CHECK
|
|
;; sz bFlag_FIFO_Ready
|
|
;; jmp Have_Data_Out
|
|
;;
|
|
;; call FIFO0_WR_CHECK
|
|
;; sz bFlag_FIFO_Ready
|
|
;; jmp USB_EP0_IN_TOKEN
|
|
;;
|
|
;; jmp USB_EP0_ISR_END
|
|
;;
|
|
;;Have_Data_Out:
|
|
;; sz MISC.@MISC_SCMD
|
|
;; jmp USB_EP0_SETUP_TOKEN
|
|
;; sz MISC.@MISC_LEN0
|
|
;; jmp USB_EP0_OUT_ACK_TOKEN
|
|
;;
|
|
;; jmp USB_EP0_OUT_TOKEN
|
|
|
|
|
|
|
|
|
|
|
|
USB_EP0_SETUP_TOKEN: ;PARSE SETUP TOKEN
|
|
clr wdt
|
|
JMP StageOne
|
|
|
|
USB_EP0_IN_TOKEN:
|
|
clr wdt
|
|
;modify 2007-06-20
|
|
CLR USR.@USR_EP0F ;Fix OHCI Volume
|
|
CALL control_read
|
|
JMP USB_EP0_ISR_END
|
|
|
|
USB_EP0_OUT_ACK_TOKEN:
|
|
;modify 2007-06-20
|
|
CLR USR.@USR_EP0F ;Fix OHCI Volume
|
|
clr wdt
|
|
clr MISC.@MISC_LEN0
|
|
JMP USB_EP0_ISR_END
|
|
|
|
;--------------------------------------------------------------
|
|
; Parser nCmdIndex1
|
|
;--------------------------------------------------------------
|
|
USB_EP0_OUT_TOKEN:
|
|
;modify 2007-06-20
|
|
CLR USR.@USR_EP0F ;Fix OHCI Volume
|
|
clr wdt
|
|
clr acc
|
|
xor a,nCmdIndex1
|
|
sz z
|
|
jmp USB_EP0_ISR_END
|
|
|
|
USB_EP0_OUT_TOKEN_Loop:
|
|
clr wdt
|
|
CALL Check_Real_Cmd
|
|
sz bFlag_Real_Cmd
|
|
jmp USB_EP0_OUT_TOKEN_End
|
|
|
|
clr wdt
|
|
CALL FIFO0_RD_CHECK
|
|
SNZ bFlag_FIFO_Ready
|
|
JMP USB_EP0_OUT_TOKEN_Loop
|
|
|
|
CALL READ_FIFO0
|
|
NOP
|
|
CALL Send_Hand_Shake
|
|
|
|
;decode command
|
|
;//parse Cmd , 21 = SetReport Out Data
|
|
mov a,21H
|
|
xor a,nCmdIndex1
|
|
sz z
|
|
jmp ProcessOutData
|
|
|
|
;//parse Cmd , 18 = Mute Control
|
|
mov a,18H
|
|
xor a,nCmdIndex1
|
|
sz z
|
|
jmp Implement_Mute
|
|
|
|
;//parse Cmd , 28 = Volume Control
|
|
mov a,28H
|
|
xor a,nCmdIndex1
|
|
sz z
|
|
jmp Implement_Volume
|
|
|
|
;//unknow command
|
|
jmp USB_EP0_OUT_TOKEN_End
|
|
|
|
USB_EP0_OUT_TOKEN_End:
|
|
clr nCmdIndex1
|
|
JMP USB_EP0_ISR_END
|
|
|
|
|
|
Implement_Mute:
|
|
clr wdt
|
|
sz FIFO_out1.0
|
|
clr USVC.7 ;mute
|
|
snz FIFO_out1.0
|
|
set USVC.7 ;unmute
|
|
|
|
sz FIFO_out1.0
|
|
set bFlag_Audio_Mute ;mute
|
|
snz FIFO_out1.0
|
|
clr bFlag_Audio_Mute ;unmute
|
|
|
|
sz FIFO_out1.0
|
|
set MUTE_LED_ON ;mute
|
|
snz FIFO_out1.0
|
|
clr MUTE_LED_ON ;unmute
|
|
|
|
|
|
snz bFlag_Audio_Mute
|
|
jmp Implement_Mute_1
|
|
|
|
mov a,Min_Volume
|
|
mov USVC,a
|
|
|
|
clr USVC.7
|
|
|
|
|
|
Implement_Mute_1:
|
|
clr wdt
|
|
;//kmov Mute_Save,FIFO_out1
|
|
jmp USB_EP0_OUT_TOKEN_End
|
|
|
|
|
|
Implement_Volume:
|
|
clr wdt
|
|
kmov VolumeH_Save,FIFO_out1
|
|
kmov VolumeL_Save,FIFO_out2
|
|
Implement_Volume_End:
|
|
jmp USB_EP0_OUT_TOKEN_End
|
|
|
|
USB_EP0_ISR_END:
|
|
;//CLR USR.@USR_EP0F
|
|
JMP USB_ISR_END
|
|
;-----------------------------------------------------
|
|
;EPNPOINT 1 Interrupt
|
|
;-----------------------------------------------------
|
|
USB_EP1_ISR:
|
|
CLR USR.@USR_EP1F
|
|
SNZ bIniFMOK
|
|
JMP USB_EP1_ISR_END ;;FM Not initial OK,exit
|
|
|
|
;check the data is in fifo ?
|
|
CALL FIFO1_RD_CHECK
|
|
SNZ bFlag_FIFO_Ready
|
|
JMP USB_EP1_ISR_END
|
|
CALL Read_FIFO1
|
|
|
|
|
|
;;CALL FIFO1_WR_CHECK
|
|
;;SNZ bFlag_FIFO_Ready
|
|
;;JMP USB_EP1_ISR_END
|
|
;;MOV A,00H
|
|
;;MOV FIFO_OUT1,A
|
|
;;MOV A,01H
|
|
;;MOV FIFO_SendLen,A
|
|
;;CALL WRITE_FIFO1
|
|
|
|
CALL QN8027
|
|
|
|
|
|
|
|
USB_EP1_ISR_END:
|
|
JMP USB_ISR_END
|
|
;-----------------------------------------------------
|
|
;EPNPOINT 2 Interrupt
|
|
;-----------------------------------------------------
|
|
USB_EP2_ISR:
|
|
CLR USR.@USR_EP2F
|
|
;;SET ET0I ;enable timer0
|
|
;;SET TMR0C.4 ;致能 此時開始計數
|
|
|
|
|
|
|
|
clr MISC.@MISC_ISOEN ;關閉 ISO 中斷
|
|
|
|
|
|
USB_EP2_ISR_END:
|
|
JMP USB_ISR_END
|
|
|
|
|
|
;***************************************************************
|
|
; Stage One .... Test bmRequestType
|
|
; CALL FIFO_RD_CHECK will return bFlag_FIFO_Ready?(1=Ready,0=not ready)
|
|
;***************************************************************
|
|
StageOne:
|
|
clr wdt
|
|
CALL FIFO0_RD_CHECK
|
|
SNZ bFlag_FIFO_Ready
|
|
JMP StageOne_End ; the EP0 FIFO RD is not ready 沒有data進來
|
|
CALL Read_FIFO0 ; Read EP0 Command
|
|
clr MISC.@MISC_SCMD
|
|
clr MISC.@MISC_LEN0
|
|
|
|
;modify 2007-06-20
|
|
CLR USR.@USR_EP0F ;Fix OHCI Volume
|
|
|
|
clr wdt
|
|
nop
|
|
|
|
MOV A,FIFO_TYPE
|
|
XOR A,00H
|
|
SZ Z ;FIFO_TYPE=00H
|
|
JMP Request_Type00
|
|
|
|
MOV A,FIFO_TYPE
|
|
XOR A,01H
|
|
SZ Z ;FIFO_TYPE=01H
|
|
JMP Request_Type01
|
|
|
|
MOV A,FIFO_TYPE
|
|
XOR A,02H
|
|
SZ Z ;FIFO_TYPE=02H
|
|
JMP Request_Type02
|
|
|
|
MOV A,FIFO_TYPE
|
|
XOR A,80H
|
|
SZ Z ;FIFO_TYPE=80H
|
|
JMP Request_Type80
|
|
|
|
MOV A,FIFO_TYPE
|
|
XOR A,81H
|
|
SZ Z ;FIFO_TYPE=81H
|
|
JMP Request_Type81
|
|
|
|
MOV A,FIFO_TYPE
|
|
XOR A,82H
|
|
SZ Z ;FIFO_TYPE=82H
|
|
JMP Request_Type82
|
|
|
|
;===============================================================
|
|
;HID & Audio
|
|
;===============================================================
|
|
MOV A,FIFO_TYPE
|
|
XOR A,21H
|
|
SZ Z
|
|
JMP Request_Type21
|
|
|
|
;Volume Control
|
|
clr wdt
|
|
MOV A,FIFO_TYPE
|
|
XOR A,0A1H
|
|
SZ Z
|
|
JMP Request_TypeA1
|
|
|
|
JMP SendStall0
|
|
|
|
|
|
StageOne_End:
|
|
;modify 2007-06-20
|
|
CLR USR.@USR_EP0F ;Fix OHCI Volume
|
|
RET
|
|
|
|
|
|
;***************************************************************
|
|
; USB Stage2
|
|
;
|
|
;***************************************************************
|
|
;Device to Host with device as recipient
|
|
;===============================================================
|
|
;Request_Type00
|
|
;bRequest Function
|
|
; 1 Clear Feature
|
|
; 3 Set Feature
|
|
; 5 Set Address
|
|
; 7 not support
|
|
; 9 Set Configuration
|
|
;===============================================================
|
|
;===============================================================
|
|
Request_TYPE00:
|
|
;Set the device address to a non-zero value
|
|
;Set address
|
|
clr wdt
|
|
MOV A,FIFO_REQUEST
|
|
XOR A,set_address
|
|
SZ Z
|
|
JMP SetAddress
|
|
|
|
;Set Configuration
|
|
MOV A,FIFO_REQUEST
|
|
XOR A,set_configuration
|
|
SNZ Z
|
|
JMP Request_TYPE00_NEXT
|
|
|
|
SET ET1I
|
|
SET TMR1C.4
|
|
|
|
JMP SetConfiguration
|
|
|
|
;Clear Feature
|
|
;The HT82A822R return ACK without ERROR
|
|
Request_TYPE00_NEXT:
|
|
MOV A,FIFO_REQUEST
|
|
XOR A,clear_feature
|
|
SZ Z
|
|
JMP ClearFeature
|
|
|
|
;Set Feature
|
|
clr wdt
|
|
MOV A,FIFO_REQUEST
|
|
XOR A,set_feature
|
|
SZ Z
|
|
JMP SetFeature
|
|
|
|
JMP SendStall0
|
|
;===============================================================
|
|
Request_Type01:
|
|
clr wdt
|
|
MOV A,FIFO_REQUEST
|
|
XOR A,set_interface
|
|
SZ Z
|
|
JMP SetInterface
|
|
|
|
JMP SendStall0
|
|
;===============================================================
|
|
Request_Type02:
|
|
clr wdt
|
|
MOV A,FIFO_REQUEST
|
|
XOR A,clear_feature
|
|
SZ Z
|
|
JMP ClearFeature_Endpoint
|
|
|
|
MOV A,FIFO_REQUEST
|
|
XOR A,set_feature
|
|
SZ Z
|
|
JMP SetFeature_Endpoint
|
|
|
|
|
|
|
|
JMP SendStall0
|
|
|
|
|
|
|
|
;===============================================================
|
|
Request_TYPE80:
|
|
;Get Status
|
|
;Get Descriptor 80 06
|
|
clr wdt
|
|
MOV A,FIFO_REQUEST
|
|
XOR A,get_descriptor
|
|
SZ Z
|
|
JMP GetDescriptor
|
|
|
|
;Get Configuration 80 08
|
|
clr wdt
|
|
MOV A,FIFO_REQUEST
|
|
XOR A,get_configuration
|
|
SZ Z
|
|
JMP GetConfiguration
|
|
|
|
;Get Status(DEVICE) 80 00
|
|
clr wdt
|
|
MOV A,FIFO_REQUEST
|
|
XOR A,get_status
|
|
SZ Z
|
|
JMP GetStatus
|
|
|
|
JMP SendStall0
|
|
|
|
;===============================================================
|
|
Request_TYPE81:
|
|
;get status
|
|
;get interface -> not support
|
|
;HID class defines one more request for bmRequestType=81
|
|
;get HID descriptor
|
|
clr wdt
|
|
MOV A,FIFO_REQUEST
|
|
XOR A,get_descriptor
|
|
SZ Z
|
|
JMP GetDescriptor
|
|
|
|
;Get Interface
|
|
clr wdt
|
|
MOV A,FIFO_REQUEST
|
|
XOR A,get_interface
|
|
SZ Z
|
|
JMP GetInterface
|
|
|
|
;Get Status(INTERFACE) 81 00
|
|
clr wdt
|
|
MOV A,FIFO_REQUEST
|
|
XOR A,get_status
|
|
SZ Z
|
|
JMP GetStatus_Interface ;modify for Remote Wakeup
|
|
|
|
JMP SendStall0
|
|
;===============================================================
|
|
Request_TYPE82:
|
|
;get status
|
|
;Get Status(INTERFACE) 82 00
|
|
clr wdt
|
|
MOV A,FIFO_REQUEST
|
|
XOR A,get_status
|
|
SZ Z
|
|
JMP GetStatus_Endpoint
|
|
|
|
JMP SendStall0
|
|
|
|
;===============================================================
|
|
;===============================================================
|
|
;Now parse HID class Descriptor Types
|
|
;===============================================================
|
|
;host to device with endpoint as recipient
|
|
Request_TYPE21:
|
|
clr wdt
|
|
;set report
|
|
MOV A,FIFO_REQUEST
|
|
XOR A,set_report
|
|
SZ Z
|
|
JMP SetReport
|
|
|
|
;------------------------------------------------------
|
|
;audio class-specific request code
|
|
;------------------------------------------------------
|
|
|
|
MOV A,FIFO_REQUEST
|
|
XOR A,SET_CUR
|
|
SZ Z
|
|
JMP SetCur
|
|
|
|
Request_TYPE21_End:
|
|
JMP SendStall0
|
|
|
|
Request_TypeA1:
|
|
MOV A,FIFO_REQUEST
|
|
XOR A,GET_MIN
|
|
SZ Z
|
|
JMP GetMin
|
|
|
|
MOV A,FIFO_REQUEST
|
|
XOR A,GET_MAX
|
|
SZ Z
|
|
JMP GetMax
|
|
|
|
MOV A,FIFO_REQUEST
|
|
XOR A,GET_RES
|
|
SZ Z
|
|
JMP GetRes
|
|
|
|
MOV A,FIFO_REQUEST
|
|
XOR A,GET_CUR
|
|
SZ Z
|
|
JMP GetCur
|
|
|
|
|
|
Request_TYPEA1_End:
|
|
JMP SendStall0
|
|
;===============================================================
|
|
ProcessOutData:
|
|
sz bFlag_Real_Cmd
|
|
jmp ProcessOutData_End
|
|
|
|
;; clr wdt
|
|
;; CALL FIFO0_RD_CHECK
|
|
;; SNZ bFlag_FIFO_Ready
|
|
;; JMP ProcessOutData ; the EP0 FIFO RD is not ready 沒有data進來
|
|
|
|
;; CALL Read_FIFO0
|
|
CALL QN8027
|
|
;; nop
|
|
;; call FIFO1_WR_CHECK
|
|
;; snz bFlag_FIFO_Ready
|
|
;; jmp ProcessOutData_End
|
|
|
|
;; call Write_FIFO1
|
|
|
|
|
|
ProcessOutData_End:
|
|
clr nCmdIndex1
|
|
jmp USB_EP0_ISR_END
|
|
|
|
|
|
|
|
|
|
Delay_20ms:
|
|
clr wdt
|
|
mov a,075H
|
|
mov Delay_1,a
|
|
mov a,0FFH
|
|
mov Delay_2,a
|
|
Delay_20ms_Wait:
|
|
clr wdt
|
|
SDZ Delay_2
|
|
JMP Delay_20ms_Wait
|
|
SDZ Delay_1
|
|
JMP Delay_20ms_Wait
|
|
RET
|
|
|
|
Delay_5ms:
|
|
clr wdt
|
|
mov a,03AH
|
|
mov Delay_1,a
|
|
mov a,0FFH
|
|
mov Delay_2,a
|
|
Delay_5ms_Wait:
|
|
clr wdt
|
|
SDZ Delay_2
|
|
JMP Delay_5ms_Wait
|
|
SDZ Delay_1
|
|
JMP Delay_5ms_Wait
|
|
RET
|
|
|
|
|
|
Delay PROC
|
|
clr wdt
|
|
MOV A,0FFH
|
|
MOV Delay_1,A
|
|
MOV Delay_2,A
|
|
|
|
Wait:
|
|
clr wdt
|
|
SDZ Delay_2
|
|
JMP Wait
|
|
SDZ Delay_1
|
|
JMP Wait
|
|
RET
|
|
|
|
Delay ENDP
|
|
|
|
|
|
|
|
;***************************************************************
|
|
; Run_Volume_Step Module
|
|
; Volume1:Target
|
|
; Volume2:Now
|
|
;***************************************************************
|
|
Run_Volume_Step:
|
|
clr wdt
|
|
;check mute?
|
|
sz bFlag_Audio_Mute
|
|
jmp Run_Volume_Step_End
|
|
|
|
|
|
mov a,VolumeL_Save
|
|
mov Volume1,a
|
|
|
|
;check Volume1 = 080H ?
|
|
mov a,80H
|
|
xor a,Volume1
|
|
sz z
|
|
jmp Run_Volume_Step_Process_Min
|
|
jmp Run_Volume_Step_1
|
|
|
|
Run_Volume_Step_Process_Min:
|
|
mov a,Min_Volume
|
|
mov Volume1,a
|
|
|
|
|
|
|
|
Run_Volume_Step_1:
|
|
|
|
clr Volume1.7
|
|
|
|
mov a,01111111b
|
|
and a,USVC
|
|
mov Volume2,a ;Volume2=now Volume1=target
|
|
|
|
|
|
mov a,Volume1
|
|
xor a,Volume2
|
|
sz z
|
|
jmp Run_Volume_Step_End ;target=now
|
|
|
|
clr wdt
|
|
mov a,Volume1
|
|
sub a,Volume2 ;target-now
|
|
sz C
|
|
jmp Run_Volume_1 ;>0
|
|
jmp Run_Volume_2 ;<0
|
|
|
|
Run_Volume_1:
|
|
snz Volume1.6
|
|
jmp Run_Volume_Step_Inc
|
|
snz Volume2.6
|
|
jmp Run_Volume_Step_Dec
|
|
jmp Run_Volume_Step_Inc
|
|
|
|
Run_Volume_2:
|
|
snz Volume2.6
|
|
jmp Run_Volume_Step_Dec
|
|
snz Volume1.6
|
|
jmp Run_Volume_Step_Inc
|
|
jmp Run_Volume_Step_Dec
|
|
|
|
|
|
|
|
Run_Volume_Step_Inc:
|
|
INC Volume2
|
|
jmp Run_Volume_Step_2
|
|
Run_Volume_Step_Dec:
|
|
DEC Volume2
|
|
Run_Volume_Step_2:
|
|
sz USVC.7
|
|
set Volume2.7
|
|
snz USVC.7
|
|
clr Volume2.7
|
|
kmov USVC,Volume2
|
|
clr wdt
|
|
Run_Volume_Step_End:
|
|
ret
|
|
|
|
;***************************************************************
|
|
; Key_Debounced Module
|
|
; Key_Defined : 欲偵測的 bit
|
|
; Key_Process : 處理過後 請 set 此 bit
|
|
; Key_CheckIn : 第一次偵測到需要 set 此 bit
|
|
; Key_Counter : 儲存哪個 bit 為 1
|
|
; 如果需要連續動作則請勿 set Key_Process (如 INC,DEC Volume)
|
|
; 如果不需要連續動作請 set Key_Process (如 Mute,Play,Stop)
|
|
;***************************************************************
|
|
IF UseMediaKey
|
|
Key_Debounced:
|
|
clr wdt
|
|
mov a,VIOP
|
|
cpl acc
|
|
mov PortC_Data,a
|
|
|
|
mov a,Key_Defined
|
|
andm a,PortC_Data
|
|
sz z
|
|
jmp Key_Debounced_ClearReg ;//沒按鍵被按下
|
|
|
|
|
|
Key_Debounced_Detect_In:
|
|
kmov Key_Temp,PortC_Data
|
|
clr Key_Counter
|
|
Key_Debounced_Detect:
|
|
clr C
|
|
RRC Key_Temp
|
|
sz C
|
|
jmp Key_Debounced_Detect_End
|
|
inc Key_Counter
|
|
mov a,080H
|
|
xor a,Key_Temp
|
|
sz z
|
|
jmp Key_Debounced_Detect_End
|
|
jmp Key_Debounced_Detect
|
|
Key_Debounced_Detect_End:
|
|
mov a,Key_Counter
|
|
call GetPipeBit
|
|
|
|
xor a,Key_CheckIn
|
|
snz z
|
|
jmp Key_Debounced_SetCheckIn
|
|
|
|
;check process
|
|
mov a,Key_Process
|
|
xor a,Key_CheckIn
|
|
sz z
|
|
jmp Key_Debounced_End
|
|
jmp Key_Debounced_Process
|
|
|
|
;若不需要處理的請 jmp Key_Debounced_End
|
|
nop
|
|
nop
|
|
nop
|
|
Key_Debounced_Process:
|
|
clr wdt
|
|
mov a,Key_Counter
|
|
addm a,pcl
|
|
jmp Key_Debounced_Process_WindowsMediaPlayer
|
|
jmp Key_Debounced_Process_Mute
|
|
jmp Key_Debounced_Process_Dec
|
|
jmp Key_Debounced_Process_Inc
|
|
jmp Key_Debounced_Process_PlayPause
|
|
jmp Key_Debounced_Process_Stop
|
|
jmp Key_Debounced_Process_NextTrack
|
|
jmp Key_Debounced_Process_PreviousTrack
|
|
|
|
Key_Debounced_SetCheckIn:
|
|
mov Key_CheckIn,a
|
|
clr Key_Process
|
|
kmov Key_IncCounter,Const_Counter
|
|
kmov Key_DecCounter,Const_Counter
|
|
jmp Key_Debounced_End
|
|
|
|
Key_Debounced_ClearReg:
|
|
clr acc
|
|
xor a,Key_CheckIn
|
|
sz z
|
|
jmp Key_Debounced_End
|
|
jmp Key_Debounced_ClearReg_2
|
|
; clr acc
|
|
; xor a,Key_Process
|
|
; snz z
|
|
; jmp Key_Debounced_ClearReg_2
|
|
; jmp Key_Debounced_End
|
|
|
|
Key_Debounced_ClearReg_2:
|
|
clr Key_CheckIn
|
|
clr Key_Process
|
|
|
|
Key_Debounced_ClearReg_1:
|
|
CALL FIFO1_WR_CHECK
|
|
SNZ bFlag_FIFO_Ready
|
|
JMP Key_Debounced_End
|
|
|
|
IF UseReportID
|
|
MOV A,01H ;REPORT ID
|
|
MOV FIFO_OUT1,A
|
|
MOV A,00H
|
|
MOV FIFO_OUT2,A
|
|
MOV A,02H
|
|
MOV FIFO_SendLen,A
|
|
ELSE
|
|
MOV A,00H
|
|
MOV FIFO_OUT1,A
|
|
MOV A,01H
|
|
MOV FIFO_SendLen,A
|
|
ENDIF
|
|
CALL WRITE_FIFO1
|
|
;//write fifo
|
|
nop
|
|
|
|
|
|
Key_Debounced_My_Function:
|
|
;-----------------------------------------------------------
|
|
; Here to add your another code !!
|
|
;-----------------------------------------------------------
|
|
nop
|
|
|
|
|
|
jmp Key_Debounced_End
|
|
|
|
Key_Debounced_End:
|
|
clr wdt
|
|
ret
|
|
;=========================Process
|
|
Key_Debounced_Process_Mute:
|
|
clr wdt
|
|
CALL FIFO1_WR_CHECK
|
|
SNZ bFlag_FIFO_Ready
|
|
JMP Key_Debounced_End
|
|
|
|
IF UseReportID
|
|
MOV A,01H ;REPORT ID
|
|
MOV FIFO_OUT1,A
|
|
MOV A,08H
|
|
MOV FIFO_OUT2,A
|
|
MOV A,02H
|
|
MOV FIFO_SendLen,A
|
|
ELSE
|
|
MOV A,08H
|
|
MOV FIFO_OUT1,A
|
|
MOV A,01H
|
|
MOV FIFO_SendLen,A
|
|
ENDIF
|
|
CALL WRITE_FIFO1
|
|
nop
|
|
kmov Key_Process,Key_CheckIn
|
|
jmp Key_Debounced_End
|
|
Key_Debounced_Process_Dec:
|
|
clr wdt
|
|
sdz Key_DecCounter
|
|
jmp Key_Debounced_End
|
|
|
|
CALL FIFO1_WR_CHECK
|
|
SNZ bFlag_FIFO_Ready
|
|
JMP Key_Debounced_End
|
|
IF UseReportID
|
|
MOV A,01H ;REPORT ID
|
|
MOV FIFO_OUT1,A
|
|
MOV A,02H
|
|
MOV FIFO_OUT2,A
|
|
MOV A,02H
|
|
MOV FIFO_SendLen,A
|
|
ELSE
|
|
MOV A,02H
|
|
MOV FIFO_OUT1,A
|
|
MOV A,01H
|
|
MOV FIFO_SendLen,A
|
|
ENDIF
|
|
CALL WRITE_FIFO1
|
|
nop
|
|
kmov Key_DecCounter,Const_Counter
|
|
nop
|
|
jmp Key_Debounced_End
|
|
|
|
Key_Debounced_Process_Inc:
|
|
clr wdt
|
|
sdz Key_IncCounter
|
|
jmp Key_Debounced_End
|
|
|
|
CALL FIFO1_WR_CHECK
|
|
SNZ bFlag_FIFO_Ready
|
|
JMP Key_Debounced_End
|
|
IF UseReportID
|
|
MOV A,01H ;REPORT ID
|
|
MOV FIFO_OUT1,A
|
|
MOV A,01H
|
|
MOV FIFO_OUT2,A
|
|
MOV A,02H
|
|
MOV FIFO_SendLen,A
|
|
else
|
|
MOV A,01H
|
|
MOV FIFO_OUT1,A
|
|
MOV A,01H
|
|
MOV FIFO_SendLen,A
|
|
ENDIF
|
|
CALL WRITE_FIFO1
|
|
nop
|
|
kmov Key_IncCounter,Const_Counter
|
|
nop
|
|
jmp Key_Debounced_End
|
|
|
|
;===============================================================
|
|
; User Add Some Key Debounced Code
|
|
;===============================================================
|
|
Key_Debounced_Process_WindowsMediaPlayer:
|
|
;-----------------------------------------------------------
|
|
; Here to add your another code !!
|
|
;-----------------------------------------------------------
|
|
clr wdt
|
|
CALL FIFO1_WR_CHECK
|
|
SNZ bFlag_FIFO_Ready
|
|
JMP Key_Debounced_End
|
|
|
|
IF UseReportID
|
|
MOV A,01H ;REPORT ID
|
|
MOV FIFO_OUT1,A
|
|
MOV A,04H
|
|
MOV FIFO_OUT2,A
|
|
MOV A,02H
|
|
MOV FIFO_SendLen,A
|
|
ELSE
|
|
MOV A,04H
|
|
MOV FIFO_OUT1,A
|
|
MOV A,01H
|
|
MOV FIFO_SendLen,A
|
|
ENDIF
|
|
CALL WRITE_FIFO1
|
|
nop
|
|
kmov Key_Process,Key_CheckIn
|
|
jmp Key_Debounced_End
|
|
|
|
Key_Debounced_Process_PlayPause:
|
|
;-----------------------------------------------------------
|
|
; Here to add your another code !!
|
|
;-----------------------------------------------------------
|
|
clr wdt
|
|
CALL FIFO1_WR_CHECK
|
|
SNZ bFlag_FIFO_Ready
|
|
JMP Key_Debounced_End
|
|
|
|
IF UseReportID
|
|
MOV A,01H ;REPORT ID
|
|
MOV FIFO_OUT1,A
|
|
MOV A,10H
|
|
MOV FIFO_OUT2,A
|
|
MOV A,02H
|
|
MOV FIFO_SendLen,A
|
|
ELSE
|
|
MOV A,10H
|
|
MOV FIFO_OUT1,A
|
|
MOV A,01H
|
|
MOV FIFO_SendLen,A
|
|
ENDIF
|
|
CALL WRITE_FIFO1
|
|
nop
|
|
kmov Key_Process,Key_CheckIn
|
|
|
|
jmp Key_Debounced_End
|
|
|
|
Key_Debounced_Process_Stop:
|
|
;-----------------------------------------------------------
|
|
; Here to add your another code !!
|
|
;-----------------------------------------------------------
|
|
clr wdt
|
|
CALL FIFO1_WR_CHECK
|
|
SNZ bFlag_FIFO_Ready
|
|
JMP Key_Debounced_End
|
|
IF UseReportID
|
|
MOV A,01H ;REPORT ID
|
|
MOV FIFO_OUT1,A
|
|
MOV A,20H
|
|
MOV FIFO_OUT2,A
|
|
MOV A,02H
|
|
MOV FIFO_SendLen,A
|
|
ELSE
|
|
MOV A,20H
|
|
MOV FIFO_OUT1,A
|
|
MOV A,01H
|
|
MOV FIFO_SendLen,A
|
|
ENDIF
|
|
CALL WRITE_FIFO1
|
|
nop
|
|
kmov Key_Process,Key_CheckIn
|
|
|
|
jmp Key_Debounced_End
|
|
|
|
Key_Debounced_Process_NextTrack:
|
|
;-----------------------------------------------------------
|
|
; Here to add your another code !!
|
|
;-----------------------------------------------------------
|
|
clr wdt
|
|
CALL FIFO1_WR_CHECK
|
|
SNZ bFlag_FIFO_Ready
|
|
JMP Key_Debounced_End
|
|
IF UseReportID
|
|
MOV A,01H ;REPORT ID
|
|
MOV FIFO_OUT1,A
|
|
MOV A,40H
|
|
MOV FIFO_OUT2,A
|
|
MOV A,02H
|
|
MOV FIFO_SendLen,A
|
|
ELSE
|
|
MOV A,40H
|
|
MOV FIFO_OUT1,A
|
|
MOV A,01H
|
|
MOV FIFO_SendLen,A
|
|
ENDIF
|
|
CALL WRITE_FIFO1
|
|
nop
|
|
kmov Key_Process,Key_CheckIn
|
|
|
|
jmp Key_Debounced_End
|
|
|
|
Key_Debounced_Process_PreviousTrack:
|
|
;-----------------------------------------------------------
|
|
; Here to add your another code !!
|
|
;-----------------------------------------------------------
|
|
clr wdt
|
|
CALL FIFO1_WR_CHECK
|
|
SNZ bFlag_FIFO_Ready
|
|
JMP Key_Debounced_End
|
|
IF UseReportID
|
|
MOV A,01H ;REPORT ID
|
|
MOV FIFO_OUT1,A
|
|
MOV A,80H
|
|
MOV FIFO_OUT2,A
|
|
MOV A,02H
|
|
MOV FIFO_SendLen,A
|
|
ELSE
|
|
MOV A,80H
|
|
MOV FIFO_OUT1,A
|
|
MOV A,01H
|
|
MOV FIFO_SendLen,A
|
|
ENDIF
|
|
CALL WRITE_FIFO1
|
|
nop
|
|
kmov Key_Process,Key_CheckIn
|
|
|
|
jmp Key_Debounced_End
|
|
ENDIF
|
|
|
|
|
|
wait_about_1s:
|
|
;;;*******************************************
|
|
;;;delay 1S 255*255*3*16*0.3333333=1.04S
|
|
;;;*******************************************
|
|
clr wdt
|
|
clr Delay_1
|
|
clr Delay_2
|
|
kmov Delay_3,16
|
|
wait_about_1s_loop:
|
|
clr wdt
|
|
sdz Delay_1
|
|
jmp wait_about_1s_loop
|
|
sdz Delay_2
|
|
jmp wait_about_1s_loop
|
|
sdz Delay_3
|
|
jmp wait_about_1s_loop
|
|
clr wdt
|
|
nop
|
|
ret
|
|
|
|
|
|
|
|
Public FIFO_Size
|
|
Public FIFO_SendLen
|
|
|
|
Public FIFO_Type
|
|
Public FIFO_Request
|
|
Public FIFO_wValueL
|
|
Public FIFO_wValueH
|
|
Public FIFO_wIndexL
|
|
Public FIFO_wIndexH
|
|
Public FIFO_wLengthL
|
|
Public FIFO_wLengthH
|
|
|
|
Public FIFO_Out1
|
|
Public FIFO_Out2
|
|
Public FIFO_Out3
|
|
Public FIFO_Out4
|
|
Public FIFO_Out5
|
|
Public FIFO_Out6
|
|
Public FIFO_Out7
|
|
Public FIFO_Out8
|
|
|
|
Public USB_Interface
|
|
Public USB_Interface_Alt
|
|
Public USB_Configuration
|
|
|
|
Public FIFO_ADDR
|
|
|
|
|
|
|
|
Public nCmdIndex1
|
|
|
|
|
|
Public Loop_Counter
|
|
Public Data_Count
|
|
Public Data_Start
|
|
Public FIFO_TEMP
|
|
Public bFlag_Real_Cmd
|
|
Public bFlag_FIFO_Ready
|
|
Public bFlag_FIFO_LEN0
|
|
Public bFlag_RD_HTable
|
|
Public bFlag_wait_control_out
|
|
Public bFlag_SET_ADDRESS
|
|
Public bFlag_SCMD
|
|
Public bFlag_Enum_Ready
|
|
Public bFlag_SetConfiguration_Ready
|
|
Public bFlag_SetInterface_Ready
|
|
|
|
|
|
Public USB_ISR_END
|
|
Public USB_EP0_ISR_END
|
|
Public StageOne
|
|
|
|
|
|
|
|
Public VolumeH_Save
|
|
Public VolumeL_Save
|
|
Public bFlag_Audio_Mute
|
|
;modify for Remote Wakeup
|
|
public bRmtWakeup
|
|
public b_wakeup
|
|
|
|
;;-----------------------------------------------
|
|
#include QN8027Driver.asm
|
|
#include QN8072Sub.asm
|
|
|
|
END
|