?? main.asm
字號:
set UCC.@UCC_USBCKEN
nop
set USC.@USC_V33C ;//pc 開始送 command 過來
if AUDIO_8K
set MODE_CTRL.3
endif
;-----------------------------------------------------------
;初始化按鍵處理指令
;-----------------------------------------------------------
clr CMD_SCount
mov A,OFFSET CMD_Buf
mov CMD_SPtr,A
clr Key_Count
mov A,OFFSET Key_Buf
mov Key_ptr,A
clr wdt
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
SET TMR1_KEY_FG
;IF UseMediaKey
;call Key_Debounced
;ENDIF
call Run_Volume_Step
call KeyScanProcess ;鍵盤按鍵掃描
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
;modify 2006-09-11
;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
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
;modify 2006-08-18
;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
SZ USR.@USR_EP3F
JMP USB_EP3_ISR
SZ USR.@USR_EP4F
JMP USB_EP4_ISR
JMP USB_ISR_END
;-----------------------------------------------------
;EPNPOINT 0
;-----------------------------------------------------
USB_EP0_ISR:
;modify 2006-07-27
;CLR USR.@USR_EP0F ;Fix Bus Enumeration Stress
;;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 2006-08-28
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
CALL StageOne
;Clear OutToken 的剩余中斷
CLR bFlag_OutTokenRemainInt
;保存指定的大小
kmov Data_Length,FIFO_wLengthL
JMP USB_EP0_ISR_END
USB_EP0_IN_TOKEN:
clr wdt
;modify 2006-08-28
CLR USR.@USR_EP0F ;Fix OHCI Volume
CALL control_read
JMP USB_EP0_ISR_END
USB_EP0_OUT_ACK_TOKEN:
;modify 2006-08-28
CLR USR.@USR_EP0F ;Fix OHCI Volume
clr wdt
clr MISC.@MISC_LEN0
;; call Delay_3us
JMP USB_EP0_ISR_END
USB_EP0_OUT_TOKEN:
;modify 2006-08-28
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
SZ bFlag_OutTokenRemainInt
JMP USB_EP0_OUT_TOKEN_ReadRemain
MOV A,OFFSET FIFO_TYPE
MOV Data_RStart,A
CLR DATA_RCount
SET bFlag_OutTokenRemainInt ;首次終端中,設定標記下次為剩余數據的中斷
CALL READ_FIFO0_EX
CALL Send_Hand_Shake
JMP USB_EP0_OUT_TOKEN_ReadDoneCheck
USB_EP0_OUT_TOKEN_ReadRemain:
CALL READ_FIFO0_EX
CALL Send_Hand_Shake
USB_EP0_OUT_TOKEN_ReadDoneCheck:
;根據Setup階段的數據包確定Data階段的數據大小檢查是否已經完成
MOV A,Data_Length
XOR A,Data_RCount
SNZ Z
JMP USB_EP0_OUT_TOKEN_End
USB_EP0_OUT_TOKEN_ReadDone: ;數據接收完畢
NOP
;為了與原先的處理流程兼容將Data_Buf的數據保存到FIFO中,
MOV A,OFFSET Data_Buf
MOV MP0,A
MOV A,OFFSET FIFO_Type
MOV MP1,A
MOV A,8
MOV Loop_Counter,A
USB_EP0_OUT_TOKEN_COPYFIFO:
MOV A,R0
MOV R1,A
INC MP0
INC MP1
DEC Loop_Counter
SNZ Z
JMP USB_EP0_OUT_TOKEN_COPYFIFO
;decode command
;//parse Cmd , 21H = SetReport Out Data
mov a,21H
xor a,nCmdIndex1
sz z
jmp ProcessOutData
;//parse Cmd , 18H = Speaker Mute Control
mov a,18H
xor a,nCmdIndex1
sz z
jmp Implement_Speaker_Mute
;//parse Cmd , 19H = Mic Mute Control
mov a,19H
xor a,nCmdIndex1
sz z
jmp Implement_Mic_Mute
;//parse Cmd , 28H = Speaker Volume Control
mov a,28H
xor a,nCmdIndex1
sz z
jmp Implement_Speaker_Volume
;//parse Cmd , 29H = Mic Volume Control
mov a,29H
xor a,nCmdIndex1
sz z
jmp Implement_Mic_Volume
;//unknow command
jmp USB_EP0_OUT_TOKEN_End
USB_EP0_OUT_TOKEN_End:
clr nCmdIndex1
JMP USB_EP0_ISR_END
Implement_Speaker_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
snz bFlag_Audio_Mute
jmp Implement_Speaker_Mute_1
mov a,Min_Volume
mov USVC,a
clr USVC.7
Implement_Speaker_Mute_1:
jmp USB_EP0_OUT_TOKEN_End
Implement_Mic_Mute:
clr wdt
sz FIFO_OUT1.0
clr PGA_CTRL.7 ;mute
snz FIFO_OUT1.0
set PGA_CTRL.7 ;unmute
sz FIFO_out1.0
set bFlag_Mic_Mute ;mute
snz FIFO_out1.0
clr bFlag_Mic_Mute ;unmute
jmp USB_EP0_OUT_TOKEN_End
Implement_Speaker_Volume:
clr wdt
kmov VolumeH_Save,FIFO_out1
kmov VolumeL_Save,FIFO_out2
Implement_Speaker_Volume_End:
jmp USB_EP0_OUT_TOKEN_End
Implement_Mic_Volume:
clr wdt
mov a,7FH
xor a,FIFO_OUT2
sz z
jmp Implement_Mic_Volume_Set_Max
mov a,80H
xor a,FIFO_OUT2
sz z
jmp Implement_Mic_Volume_Set_Min
kmov FIFO_TEMP,FIFO_OUT2
jmp Implement_Mic_Volume_1
Implement_Mic_Volume_Set_Max:
clr wdt
kmov FIFO_TEMP,MIC_Max_Volume
jmp Implement_Mic_Volume_1
Implement_Mic_Volume_Set_Min:
clr wdt
kmov FIFO_TEMP,MIC_Min_Volume
jmp Implement_Mic_Volume_1
Implement_Mic_Volume_1:
clr wdt
mov a,80H
and a,PGA_CTRL
or a,FIFO_TEMP
mov PGA_CTRL,a
Implement_Mic_Volume_End:
jmp USB_EP0_OUT_TOKEN_END
USB_EP0_ISR_END:
;modify 2006-07-27
;CLR USR.@USR_EP0F ;Fix Bus Enumeration Stress
JMP USB_ISR_END
;-----------------------------------------------------
;EPNPOINT 1 Interrupt
;-----------------------------------------------------
USB_EP1_ISR:
;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
;JMP USB_EP1_ISR_END
;準備寫入數據
;檢查是否需要被寫入的數據
SZ CMD_SCount
JMP USB_EP1_ISR_Write
JMP USB_EP1_ISR_END
USB_EP1_ISR_Write:
CALL FIFO1_WR_CHECK
SNZ bFlag_FIFO_Ready
JMP USB_EP1_ISR_END
;將CMD_Buf的數據發送出去
;----------------------------------------------------------------------
; EP1_InData:
; EP1在收到IN Token后調用該函數,返回CMD_SPtr, CMD_SCount 指定的數據
; 若數據
;
;----------------------------------------------------------------------
EP1_InData:
clr wdt
EP1_InData_stage:
clr wdt
MOV A,0H
MOV Loop_Counter,A ;本次發送的字節數
MOV FIFO_SendLen,A
;
;1)將數據保存到FIFO_OUT
;2)再將數據寫入到FIFO
;
MOV A,CMD_SCount ;檢查是否仍有待處理數據
XOR A,00H
SZ Z
JMP USB_EP1_ISR_END ;A=00H
MOV A,CMD_SPtr
MOV MP0,A
;準備裝載數據到內存
EP1_InData_dma_load_loop:
SET MISC.@MISC_REQ
EP1_Write_FIFO_Loop:
clr wdt
MOV A,CMD_SCount
XOR A,00H
SZ Z
JMP EP1_Write_FIFO_End
MOV A,USB_FIFO1
MOV MP1,A
MOV A,R0
MOV R1,A
DEC CMD_SCount
INC CMD_SPtr
MOV A,CMD_SCount
XOR A,00H
SZ Z
JMP EP1_Write_FIFO_End ;FIFO_SendLen=0
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -