;1****************************************************************************** ;| | ;| PROGARM : H11A20HM.ASM | ;| | ;| FUNCTIONS : Hub/EmbeddedFunction Control Program | ;| | ;| COMPILER : ASM51 Macro Assebbler V1.2 ( SW I2C version) | ;| | ;| USED IN : 80C51 | ;| | ;| AUTHORS : Eric Lu | ;| | ;| WRITTEN AT : 15-11-96 | ;| | ;| VERSION : V 1.7 | ;| | ;| UPDATES : 05-14-98 | ;| | ;| Copyright 1996, Product Innovation Centre Asia, Philips Semiconductors | ;| 620A, Lorong, 1 Toa Payoh( TP3), 2nd Floor, Singapore319762 | ;| All rights are reserved. Reproduction in whole or in part is | ;| prohibited without the prior written consent of the copyright owner. | ;| | ;| COMPANY CONFIDENTIAL | ;| | ;***************************************************************************** ; Code History ; H11A10HM.asm, First released version for Hub with embedded function using H11A ; H11A11HM.asm, Added a Hot Key to pop-up applet ; H11A12HM.asm, Added 2 more keys for Volume control and store DAC data in uC ; H11A13HM.asm, Added a security key, compliance to RC7 ; H11A14HM.asm, Fixed the Set Address command and individual OV problem ; H11A15HM.asm: 1. Changed to after Set_Address command, uC wait for interrupt ; pin active( low) then change Hub address( For Hub), for embedded ; need to check remaining interrupt task and remember it. ; 2. Sent Zero-length packet to host, when all data were all sent ; for host but IN token is still coming. ; 3. Added auto-detection between H11 and H12. ; H11A16HM.asm, Supporting single Hot Key on small VGA board. ; H11A17HM.asm, Changed to no remote wakeup feature in embedded function ;***************************************************************************** ; ; H11A22HM.asm, which is greatly changed based on H11A20HM.asm, primarily supports ; version 2.2 of CoolScreen of Philips Semiconductors APIC. ; Compared with version 2.1, the new version of CoolScreen adds following new ; features for monitor controls: ; . autobrightness capability ; . autobrightness ON/OFF control ; . three typical controls of audio playback---Volume Up, Volume Down and MUTE ; . one typical OSD of monitor control---CONTRAST UP and CONTRAST DOWN ; . Three user-defined general purpose hotkeys ; ; To implement above functionality, the second interrupt pipe using the endpoint ; index 0x07 of H11A was added. In detail, the firmware codes had been changed ; from following aspects: ; . AUTOBRIGHTNESS --- addition of one INPUT item. Report ID =10H ; The brightness data acquisition is implemented by A2D segment. To understand this ; A2D segment, please refer to button project schematic(bttn.pdf) and document ; (brightness.doc). ; BRIGHTNESS -- brightness buffer storing data measured by ADC circuit ; ; . CONTRAST UP/DOWN --- addition of a INPUT item. ; Report ID= 12H ; ; . GP1, GP2 and GP3 --- addition of three INPUT item. ; Report ID = 37H ; ; . HOTKEY --- addition of INPUT item for CoolScreen popping ON/OFF. ; Report ID = 41H ; Removal of old HOTKEY processing and registers ; ; . AUTOBRIGHTNESS ON/OFF --- addition of one FEATURE item. ; Report ID =11H ; BRIT_MUTE -- bit buffer to store the ON/OFF control command. Can be changed ; by Host command ; ; . AUDIO PLAYBACK CONTROL --- addition of three INPUT items, Volume Up, Volume ; Down and Mute in another top-level report descriptor. ; These controls are transferred through the second interrupt pipe. ; IMPORTANT note: these controls can not follow any report ID. This is the reason ; the second interrupt pipe is added. ; ; . IO pin assignments ; 6 IO pins of MCU are used to scan buttons ; KB_MTX_3_CLM BIT P2.2 ; KB_MTX_2_CLM BIT P2.3 ; KB_MTX_1_CLM BIT P2.4 ; KB_MTX_1_RW BIT P2.5 ; KB_MTX_2_RW BIT P2.6 ; KB_MTX_3_RW BIT P2.7 ; 2 IO pins of MCU are used to implement ADC without ADC chipset ; DISCHARGE BIT P0.2 ;discharge CAP/start counting ; GATINGPIN BIT P3.2 ;gating counting ; ; Except the audio controls, all INPUT items are transferred through the first ; interrupt pipe. One register INT_PIPE_PKT is used to trace the send order of ; items. ; ; All data pattern in firmware are defined following the HID class usage table. ; For more information, please refer to document of button project (bttn_fm.doc). ; ; Oct.7, 98 ;================================ ; add EDID information report item for debugging HATACHI issue ; ; Autobrightness enable/disable changed as ENUM ; ENUM 1 disable ; ENUM 2 enable ; ; add color temperature, report ID =0xD8 ; ENUM 1 user ; ENUM 2 9300k ; ENUM 3 7500k ; ENUM 4 6500k ; ENUM 5 5500k ; ENUM 6 5000k ; ; add red black level, REPORT ID=0x6c ; add green black level, report ID=0x70 ; add blue black level, report ID=0x6e ; ; add preset color temperature option, report ID=0xD9 ; ; Change the codes, make it applicable for longer HID report than 255 bytes ; ; Dec. 7, 98 ;======================================== ; ; Author: Paul Yang C.M. ; ;********************************************************************************** $TITLE(H11 USB Hub) $PAGEWIDTH(132) $DATE(12/1/1995) $DEBUG $OBJECT ;$NOPAGING $MOD51 ;---------------- FLAG DATA 20H ;I2C SOFTWARE STATUS FLAGS. ; I2C_FAIL BIT FLAG.0 ;I2C FAIL FLAG. INIT_FLAG BIT FLAG.1 ;VALIDATE BUFFER FLAG SEL_EPT_FLAG BIT FLAG.2 ;SEL HUB OR EMBEDDED FLAG zero_byte_flag BIT FLAG.3 H12_FLAG BIT FLAG.4 BRIT_MUTE BIT FLAG.5 ; BIT FLAG.7 ;---------------- HUB_STATUS DATA 21H ;FLAG AND STATUS SELF_POWER BIT HUB_STATUS.0 ;HUB SELF POWERED FLAG REMOTE_WAKE BIT HUB_STATUS.1 ;HUB REMOTE WAKEUP FLAG EPT0_OUT_STALL BIT HUB_STATUS.2 ;HUB EPT0 OUT STALL FLAG EPT0_IN_STALL BIT HUB_STATUS.3 ;HUB EPT0 IN STALL FLAG EPT1_IN_STALL BIT HUB_STATUS.4 ;HUB EPT1 IN STALL FLAG HUB_CONFIG BIT HUB_STATUS.5 ;HUB CONFIGURED VALIDATE_FLAG BIT HUB_STATUS.6 ;WRITE BUFFER FLAG PWR_SRC_FLAG BIT HUB_STATUS.7 ; ;---------------- EMB_STATUS DATA 22H ;FLAG AND STATUS EMB_SELF_POWER BIT EMB_STATUS.0 ;EMB FUNCTION SELF POWERED FLAG EMB_REMOTE_WAKE BIT EMB_STATUS.1 ;EMB FUNCTION REMOTE WAKEUP FLAG EMB_EPT0_OUT_STALL BIT EMB_STATUS.2 ;EMB FUNCTION EPT0 OUT STALL FLAG EMB_EPT0_IN_STALL BIT EMB_STATUS.3 ;EMB FUNCTION EPT0 IN STALL FLAG EMB_EPT1_IN_STALL BIT EMB_STATUS.4 ;EMB FUNCTION EPT1 IN STALL FLAG EMB_EPT2_IN_STALL BIT EMB_STATUS.5 ;EMB FUNCTION EPT2 IN STALL FLAG EMB_CONFIG BIT EMB_STATUS.6 ;EMB CONFIGURED ; BIT EMB_STATUS.7 ; ;---------------- EMBED_STATUS0 DATA 23H ;CONTAINS THE STATUS OF PORT1 ;---------------- E_PORT_CONN BIT EMBED_STATUS0.0 E_PORT_ENABLE BIT EMBED_STATUS0.1 E_PORT_SUSPEND BIT EMBED_STATUS0.2 E_PORT_OVERCUR BIT EMBED_STATUS0.3 E_PORT_RESET BIT EMBED_STATUS0.4 E_PORT_POWER BIT EMBED_STATUS0.5 E_LOW_SPEED BIT EMBED_STATUS0.6 ;--------------------------------- EMBED_STATUS1 DATA 24H ;-------------- E_C_PORT_CONN BIT EMBED_STATUS1.0 E_C_PORT_ENABLE BIT EMBED_STATUS1.1 E_C_PORT_SUSPEND BIT EMBED_STATUS1.2 E_C_PORT_OVERCUR BIT EMBED_STATUS1.3 E_C_PORT_RESET BIT EMBED_STATUS1.4 ;--------- ;KEY_STATUS DATA 25H ;--------- INT_PIPE_PKT DATA 25H ;packet order for those packets through ;embedded function interrupt pipe ;---------- ; ;Following definition used for HID class control keypads ; GPCTRL DATA 26H GP1 BIT GPCTRL.0 GP2 BIT GPCTRL.1 GP3 BIT GPCTRL.2 GP1_LAST_STATE BIT GPCTRL.3 GP2_LAST_STATE BIT GPCTRL.4 GP3_LAST_STATE BIT GPCTRL.5 ; AUDIOCTRL DATA 27H ;audio control key VOL_UP BIT AUDIOCTRL.0 VOL_DN BIT AUDIOCTRL.1 MUTE BIT AUDIOCTRL.2 MUTE_LAST_STATE BIT AUDIOCTRL.3 ; APPLET_MENU_CTRL DATA 28H ;PHILLIPS Applet menu babbling hotkey HOTKEY BIT APPLET_MENU_CTRL.0 HTKY_LAST_STATE BIT APPLET_MENU_CTRL.1 ; ;---------------- ;DSEG AT 30H ;---------------- clrtmp data 2ch dsc_len_low data 2eh dsc_len_high data 2fh RW_COUNTER DATA 30H HUB_ADDR DATA 31H ;address of the hub LAST_COM DATA 32H ;CONTAINS THE LAST RECEIVED REQUEST BYTE_TO_SEND DATA 33H MSG_DPH DATA 34H MSG_DPL DATA 35H ;-------------------------- EMB_ADDR DATA 36H ;ADDRESS OF THE EMBEDDED FUNCTION EMB_LAST_COM DATA 37H ;CONTAINS THE LAST RECEIVED REQUEST ;EMB_BYTE_TO_SEND DATA 38H ; ; EMB_MSG_DPH DATA 39H EMB_MSG_DPL DATA 3AH DAC_CHANNEL DATA 3BH ;--------------------------------- COUNTER DATA 3CH ;COUNTER INT_BYTE_TO_SEND DATA 3DH I2C_COUNTER DATA 3EH BRIGHTNESS DATA 3Fh ;autobrightness buffer ;------------------------------------------------- ; S/W I2C CONTROL REGISTERS ;------------------------------------------------- BITCNT DATA 40H ;I2C BIT COUNTER. BYTE_CNT DATA 41H ;BYTES TO BE PROCESSED BY I2C TX/RX CNT_BYTE DATA 42H ;NUMBER OF BYTES TO BE TRANSMITTED SLV_ADR DATA 43H ;I2C ADDRESS OF ACTIVE SLAVE. I2C_BUFFER DATA 44H ;I2C TRANSMIT/RECEIVE DATA BUFFER ;---------------------------- ;64H-6FH 10 BYTES BRIT_DAC DATA 50H ;DA CHANNEL A CONT_DAC DATA 51H ;DA CHANNEL B HBAL_DAC DATA 52H RG_DAC DATA 53H ;DA CHANNEL 7 GG_DAC DATA 54H ;DA CHANNEL 8 BG_DAC DATA 55H ;DA CHANNEL 9 HP_DAC DATA 56H ;DA CHANNEL 0 HS_DAC DATA 57H ;DA CHANNEL 1 HPIN_DAC DATA 58H VC_DAC DATA 59H ;DA CHANNEL 2 VS_DAC DATA 5AH ;DA CHANNEL 3 VPIN_DAC DATA 5BH PARA_DAC DATA 5CH TZ_DAC DATA 5DH ;DA CHANNEL 5 ROT_DAC DATA 5EH ;DA CHANNEL 6 RB_DAC DATA 5fH GB_DAC DATA 60H BB_DAC DATA 61H ;----------------- STACK_BUF DATA 62H ; IO PORT Definition ;--------------------------------------- SCLPIN BIT P0.0 ;S/W I2C CLOCK PIN SDAPIN BIT P0.1 ;S/W I2C DATA PIN H11_INT_PORT BIT P1.5 ;H11 INTERRUPT PIN SUSPEND_PORT BIT P1.2 ;H11 SUSPEND PIN POWER_INPUT_PIN BIT P1.0 ;BUS/SELF POWER INDICATION PIN HWSCL BIT P1.6 HWSDA BIT P1.7 ;HOT_KEY_1 BIT P1.1 ;VOL_UP_KEY BIT P1.3 ;VOL_DN_KEY BIT P1.4 DISCHARGE BIT P0.2 ;low,discharge CAP;high, counting command GATINGPIN BIT P3.2 ;gating counting, high, counting, low, stop KB_MTX_3_CLM BIT P2.2 KB_MTX_2_CLM BIT P2.3 KB_MTX_1_CLM BIT P2.4 KB_MTX_1_RW BIT P2.5 KB_MTX_2_RW BIT P2.6 KB_MTX_3_RW BIT P2.7 ; ;******************************************* ; H11 commands ; ; ; Initialization Commands ; SET_HUB_ADDRESS_EN EQU 0D0h SET_EMB_ADDRESS_EN EQU 0D1h SET_EPOINT_EN EQU 0D8h ; ; Data Flow Commands ; SEL_EPOINT_0_OUT EQU 000h SEL_EPOINT_0_IN EQU 001h SEL_EPT_EMBF_OUT EQU 002h SEL_EPT_EMBF_IN EQU 003h SEL_EPT_EMBF_INT EQU 004h SEL_EPT_EMBF_INT2 EQU 007h ;--- READ_LAST_EPT0_OUT_ST EQU 040h READ_LAST_EPT0_IN_ST EQU 041h READ_LAST_EMBF_OUT_ST EQU 042h READ_LAST_EMBF_IN_ST EQU 043H READ_LAST_EMBF_INT_ST EQU 044H READ_LAST_EMBF_INT2_ST EQU 047H ;--- READ_EPT0_OUT_ST EQU 080h READ_EPT0_IN_ST EQU 081h READ_EMBF_OUT_ST EQU 082h READ_EMBF_IN_ST EQU 083H READ_EMBF_INT_ST EQU 084H ;--- SET_EPT0_OUT_ST EQU 040h SET_EPT0_IN_ST EQU 041h SET_EMBF_OUT_ST EQU 042h SET_EMBF_IN_ST EQU 043H SET_EMBF_INT_ST EQU 044H ;--- READ_BUFFER EQU 0F0h WRITE_BUFFER EQU 0F0h ACK_SETUP EQU 0F1h CLEAR_BUF EQU 0F2h READ_INT EQU 0F4h VALIDATE_BUF EQU 0FAh ;--- ;----------------------------------- ; Hub Commands ; CLEAR_PORT_F EQU 0E0h CLEAR_PORT_2 EQU 0E0h CLEAR_PORT_3 EQU 0E1h CLEAR_PORT_4 EQU 0E2h CLEAR_PORT_5 EQU 0E3h ;--- GET_PORT_STATUS_F EQU 0E0h GET_PORT_STATUS_2 EQU 0E0h GET_PORT_STATUS_3 EQU 0E1h GET_PORT_STATUS_4 EQU 0E2h GET_PORT_STATUS_5 EQU 0E3h ;--- SET_STATUS_CHG_BITS EQU 0F7h SET_PORT_F EQU 0E8h SET_PORT_2 EQU 0E8h SET_PORT_3 EQU 0E9h SET_PORT_4 EQU 0EAh SET_PORT_5 EQU 0EBh ; ; General Commands ; SEND_RESUME EQU 0F6h READ_CURR_FRAME_NUM EQU 0F5h SET_MODE EQU 0F3H ;---------------------------------------- OFFSET_bmReqTyp EQU 02h OFFSET_bmReq EQU 03h OFFSET_wValue EQU 04h OFFSET_wIndex EQU 06h OFFSET_wLength EQU 08h ;--------------------------------------- REQ_SET_ADDRESS EQU 05H REQ_SET_REPORT EQU 01H REQ_GET_REPORT EQU 02H REQ_SET_FEATURE EQU 03H REQ_GET_FEATURE EQU 04H ;--------------------------------------- ;************************************** ; Port Feature Code ;************************************** F_PORT_ENABLE EQU 00h F_PORT_SUSPEND EQU 01h FC_PORT_RESET EQU 02h F_PORT_POWER EQU 03h C_PORT_CONN EQU 04h C_PORT_ENABLE EQU 05h C_PORT_SUSPEND EQU 06h C_PORT_OVERCUR EQU 07h ;-------------------------------------- ;-------------------------------------- ENS1_NOTSTA_STO_NOTSI_NOTAA_CR0 EQU 0D1H ENS1_NOTSTA_STO_NOTSI_AA_CR0 EQU 0D5H ENS1_NOTSTA_NOTSTO_NOTSI_AA_CR0 EQU 0C5H ENS1_NOTSTA_NOTSTO_NOTSI_NOTAA_CR0 EQU 0C1H ENS1_STA_NOTSTO_NOTSI_AA_CR0 EQU 0E5H ;---------------------------------------- ; ;----------------------------- ; INTERRUPT VECTOR TABLE ;------------------------------ CSEG AT 0000H ORG 0000H lJMP START ;PROGRAM START ORG 0003H AJMP INT0_SERVER ;INT0 SERVICE ROUTINE ORG 000BH AJMP T0_SERVER ;TIMER0 SERVICE ROUTINE ORG 0013H AJMP INT1_SERVER ;INT1 SERVICE ROUTINE ORG 001BH AJMP T1_SERVER ;TIMER1 SERVICE ROUTINE ORG 0023H AJMP UART_SERVER ;UART SERVICE ROUTINE ORG 002BH AJMP I2C_SERVER ;I2C SERVICE ROUTINE ;****************************** INT0_SERVER: ;INT0 SERVICE ROUTINE T0_SERVER: ;TIMER0 SERVICE ROUTINE INT1_SERVER: ;INT1 SERVICE ROUTINE T1_SERVER: ;TIMER1 SERVICE ROUTINE UART_SERVER: ;UART SERVICE ROUTINE I2C_SERVER: ;I2C SERVICE ROUTINE RETI ;*************************************** ; PROGRAM START ;*************************************** ORG 0030H START: MOV IE,#00H ;ALL INTERRUPT DISABLE MOV IP,#00H ;INT PRIORITY DISABLE MOV SP,#STACK_BUF ;SET STACK POINTER ;----------------------------- ; INITIAL I/O PORT ;----------------------------- MOV P0,#11111111B MOV P1,#11111111B MOV P2,#11111111B MOV P3,#11111111B ;---------------------------------------------------------------------------------- ; KEYBOARD MATRIX OF HOTKEYS SETTINGS ; keyboard matrix encode: normal state, matrix rows as input, matrix columns as ; output. columns output low levels. When some one key was pushed down, the ; corresponding row became low. ;---------------------------------------------------------------------------------- CLR KB_MTX_1_CLM ;setting matrix columns as output("L"). CLR KB_MTX_2_CLM CLR KB_MTX_3_CLM SETB KB_MTX_1_RW ;setting matrix rows as input("H"). SETB KB_MTX_2_RW SETB KB_MTX_3_RW ; ;----------------------------- ;CLEAR DATA MEMORY ;----------------------------- MOV R0,#05H CLR_DATA: MOV @R0,#0 INC R0 CJNE R0,#080H,CLR_DATA ;----------------- MOV I2C_BUFFER,#SET_MODE MOV I2C_BUFFER+1,#10001110B ;SWITCH TO H11 COMPATIBILE MODE MOV I2C_BUFFER+2,#00000011B ;SWITCH TO 12 MHZ OUTPUT ACALL WRITE_TWO_BYTE ;REMOTE WAKEUP DISABLE ;------------------ LCALL DELAY_100MS ;------------------ ;; MOV I2C_BUFFER,#0E0H ;CLEAR POWER ;; MOV I2C_BUFFER+1,#F_PORT_POWER ;; ACALL WRITE_ONE_BYTE ;------------------ MOV I2C_BUFFER,#0E2H ACALL READ_ONE_BYTE MOV A,I2C_BUFFER JNB ACC.6,H11A_CONNT ;---- MOV I2C_BUFFER,#0E3H ACALL READ_ONE_BYTE MOV A,I2C_BUFFER JNB ACC.6,H11A_CONNT ;--- SETB H12_FLAG ;H12 CONNECT AJMP H11A_CONNT1 ;--- H11A_CONNT: CLR H12_FLAG ;------------------ H11A_CONNT1: ;------------------ ACALL INITIAL ;---- MOV COUNTER,#70H ;------ MOV BRIT_DAC,#127 MOV CONT_DAC,#255 MOV RG_DAC,#127 MOV GG_DAC,#127 MOV BG_DAC,#127 MOV HP_DAC,#51 MOV HS_DAC,#84 MOV HPIN_DAC,#127 MOV VS_DAC,#59 MOV VS_DAC,#55 MOV TZ_DAC,#58 MOV ROT_DAC,#62 MOV RB_DAC,#127 MOV GB_DAC,#127 MOV BB_DAC,#127 ; clr BRIT_MUTE ;default disabled AutoBrightness, i.e., enum1 ; ; initialize the CAP charging/discharging process ; CLR EA ;disable all interrupts CLR ES ;disable each individual interrupt CLR ET1 CLR EX1 CLR ET0 CLR EX0 ; ; Initialize ADC mechanism with RC ; MOV TMOD,#09h ;setup timer0 as a 16-bit counter SETB GATINGPIN ;make P3.2/INT0 as input. Up to now, the CAP should be ;fully charged upon power on, P0.2 is high, P3.2/INT0 ;should be low CLR TR0 ;forbid counting CLR DISCHARGE ;discharge CAP, when pin P0.2 becomes low, P3.2/INT0 ;becomes high, allow counting from 0. MOV TH0,#0 ;now P0.2=0, P3.2=1. clear counter value of timer0 MOV TL0,#0 CLR TF0 ;clear counter of timer0 overflow flag SETB DISCHARGE ;charge CAP. When CAP voltage is ;greater than one certain value(1.2V in case of HCT04), ;P3.2/INT0 logic converse, counting stops. RC time ;constant was counted and remain in 16-bit counter. But ;the charging continues until uP clears P0.2 to ;discharge. SETB TR0 ;start counting because right now, P3.2/INT0 is high, so ;this instruction begin hardware counting ;------------------ MAIN: ACALL USB_SUBROUTINE JNB EMB_CONFIG,MAIN ;add addtional feature until monitor HID class configured LCALL A2D AJMP MAIN ; ;-------------------- ; INITIAL SETTING ;-------------------- INITIAL: MOV HUB_STATUS,#01H ; SELF POWER HUB MOV EMB_STATUS,#01H MOV HUB_ADDR,#00H MOV EMB_ADDR,#00H MOV EMBED_STATUS0,#00H MOV EMBED_STATUS1,#00H ;---- CLR POWER_INPUT_PIN JB POWER_INPUT_PIN,SELF_PWR_IN ;HUB IS SELF POWER HUB SETB POWER_INPUT_PIN MOV HUB_STATUS,#00H ; BUS POWER HUB, REMOTE WAKEUP DISABLE SELF_PWR_IN: SETB POWER_INPUT_PIN ;---- MOV I2C_BUFFER,#SET_MODE ;RECONNECT SOFTCONNECT MOV I2C_BUFFER+1,#10111100B ;INITIALIZE H11A ACALL WRITE_ONE_BYTE ; RET ;========================================================================= USB_SUBROUTINE: JB H11_INT_PORT,H11_RET ;IF H11 INT PORT HI THEN RETURN ;------ MOV I2C_BUFFER,#READ_INT ;READ INTERRUPT REGISTER ACALL READ_TWO_BYTE ;READ DATA FROM H11 ;------ MOV A,I2C_BUFFER ; cjne a,#1,chk_event1 ; ajmp HUB_ED0_OUTPUT ;chk_event1: ; cjne a,#2,chk_event2 ; ajmp HUB_ED0_INPUT ;chk_event2: ; cjne a,#4,chk_event3 ; ajmp EMB_ED0_OUTPUT ;chk_event3: ; cjne a,#8,chk_event4 ; ajmp EMB_ED0_INPUT ;chk_event4: ; cjne a,#10h,chk_event5 ; ljmp EMB_ED1_INPUT ;chk_event5: ; cjne a,#80h,chk_event6 ; ljmp EMB_ED2_INPUT ;chk_event6: ; JB ACC.0,HUB_ED0_OUTPUT JB ACC.1,HUB_ED0_INPUT JB ACC.2,EMB_ED0_OUTPUT_P JB ACC.3,EMB_ED0_INPUT_P JB ACC.4,EMB_ED1_INPUT_P JB ACC.7,EMB_ED2_INPUT_P ;----- MOV A,I2C_BUFFER+1 JB ACC.6,RESTART_H11 H11_RET: RET ;-------------------- RESTART_H11: ;---- MOV I2C_BUFFER,#SET_HUB_ADDRESS_EN ;SET HUB ADDRESS : 0 MOV I2C_BUFFER+1,#080H ;ENABLE HUB ACALL WRITE_ONE_BYTE ;---- MOV I2C_BUFFER,#SET_EPOINT_EN ;ENABLE HUB INTERRUPT ENDPOINT MOV I2C_BUFFER+1,#01H ACALL WRITE_ONE_BYTE ;----- MOV I2C_BUFFER,#SET_EMB_ADDRESS_EN ;DISABLE EMBED ADDRESS MOV I2C_BUFFER+1,#00 ACALL WRITE_ONE_BYTE ;---- ACALL INITIAL ;---- DATA_ERROR: RET ;======================== EMB_ED0_OUTPUT_P: AJMP EMB_ED0_OUTPUT ;HUB_ED0_OUTPUT_P: ; AJMP HUB_ED0_OUTPUT EMB_ED0_INPUT_P: AJMP EMB_ED0_INPUT EMB_ED1_INPUT_P: LJMP EMB_ED1_INPUT EMB_ED2_INPUT_P: LJMP EMB_ED2_INPUT ;******************************************************************** HUB_ED0_INPUT: ;--- CLR SEL_EPT_FLAG ;SELECT HUB BUFFER ;--- MOV I2C_BUFFER,#READ_LAST_EPT0_IN_ST ;clear interrupt register ACALL READ_ONE_BYTE ;------ MOV I2C_BUFFER,#SEL_EPOINT_0_IN ;steer the read-head to control out ACALL READ_ONE_BYTE MOV A,I2C_BUFFER ANL A,#1 ;IS BUFFER EMPTY? JNZ HUB_INPUT_ret ;if NOT empty, cannot fill the FIFO, return ;------ MORE_MESSAGE: MOV R0,#BYTE_TO_SEND MOV A,@R0 JZ HUB_NO_DATA_TO_HOST MOV DPH,MSG_DPH MOV DPL,MSG_DPL ACALL SEND_TO_HOST HUB_INPUT_ret: RET HUB_NO_DATA_TO_HOST: ACALL SEND_ZERO_PACKET RET ;******************************************************************** HUB_ED0_OUTPUT: ;------ CLR SEL_EPT_FLAG ;SELECT HUB BUFFER ;----- MOV I2C_BUFFER,#READ_LAST_EPT0_OUT_ST ;clear interrupt register ACALL READ_ONE_BYTE ;----- MOV I2C_BUFFER,#READ_EPT0_OUT_ST ;SETUP PACKET STATUS ACALL READ_ONE_BYTE MOV A,I2C_BUFFER ANL A,#00000100B ;is SETUP packet? JNZ READ_SETUP_DATA ;yes, SETUP PACKET IS NOT ACK ; MOV A,I2C_BUFFER ; ANL A,#00100000B ;is buffer full? ; JNZ H11_RET1 ;yes, full buffer means OUT token,but not support ; AJMP H11_RET1 ;NO TOKEN COMING HUB_OUTPUT_ret: ret ;--------------------------- ;MAYBE OUT TOKEN READ_SETUP_DATA: MOV I2C_BUFFER,#SEL_EPOINT_0_IN ACALL WRITE_COMMAND ;----- MOV I2C_BUFFER,#ACK_SETUP ;SEND ACK TO ENDPOINT 0 IN ACALL WRITE_COMMAND ;--------------------------- MOV I2C_BUFFER,#SEL_EPOINT_0_OUT ACALL WRITE_COMMAND ;----- MOV I2C_BUFFER,#ACK_SETUP ;SEND ACK TO ENDPOINT 0 OUT ACALL WRITE_COMMAND ;--------------------------- MOV I2C_BUFFER,#READ_BUFFER ;SEND READ BUFFER CMD TO H11 ACALL READ_TEN_BYTE ;----- MOV I2C_BUFFER,#CLEAR_BUF ;RELEASE BUFFER ACALL WRITE_COMMAND ;----- MOV A,I2C_BUFFER+1 ;READ TOTAL HOW MANY BYTES CJNE A,#8,HUB_OUTPUT_ret ;NOT CORRECT COMMAND FROM HOST ;----------------------------------------------------------------- ; DECODE HUB ENDPOINT 0 STANDARD REQUEST COMMAND ;----------------------------------------------------------------- DECODE_REQUEST: ;--- MOV R2,I2C_BUFFER+OFFSET_bmReqTyp MOV R3,I2C_BUFFER+OFFSET_bmReq MOV R4,I2C_BUFFER+OFFSET_wValue MOV R5,I2C_BUFFER+OFFSET_wIndex MOV R6,I2C_BUFFER+OFFSET_wLength ;--- MOV A,R2 ;I2C_BUFFER+OFFSET_bmReqTyp ANL A,#01100000B JZ STANDARD_REQUEST AJMP CLASS_REQUEST ;--------- STANDARD_REQUEST: MOV A,R3 ;I2C_BUFFER+OFFSET_bmReq clr c subb a,#12 jnc NO_SUPPORT_REQ mov a,r3 mov b,#3 mul ab mov dptr,#req_tbl jmp @a+dptr req_tbl: ljmp GET_STATUS ljmp CLEAR_FEATURE ljmp NO_SUPPORT_REQ ;undefined ljmp SET_FEATURE ljmp NO_SUPPORT_REQ ;undefined ljmp SET_ADDRESS ljmp GET_DESCRIPTOR ljmp NO_SUPPORT_REQ ;set_descriptor ljmp GET_CONFIG ljmp SET_CONFIG ljmp GET_INTERFACE ljmp SET_INTERFACE NO_SUPPORT_REQ: LCALL SEND_EP0I_STALL ;10 - GET INTERFACE, NO SUUPORT RET ;11 - SET INTERFACE, NO SUPPORT ;12 - SYNCH FRAME, NO SUPPORT ;================================================================= SET_INTERFACE: ACALL SEND_ZERO_PACKET RET ;----- GET_INTERFACE: MOV I2C_BUFFER,#WRITE_BUFFER ;WRITE BUFFER COMMAND MOV I2C_BUFFER+1,#0 MOV I2C_BUFFER+2,#1 MOV I2C_BUFFER+3,#0 ;not alternate interface settings ACALL WRITE_THREE_BYTE RET ;------ ;================================================================= SET_ADDRESS: ;5 MOV R0,#I2C_BUFFER+OFFSET_wValue MOV A,@R0 ORL A,#080H MOV HUB_ADDR,A ;--- ACALL SEND_ZERO_PACKET ;---- SET_ADDRESS_LOOP: JB H11_INT_PORT,SET_ADDRESS_LOOP ;IF H11 INT PORT HI THEN RETURN ;--- SET_HUB_ADDR: MOV I2C_BUFFER,#SET_HUB_ADDRESS_EN ;WRITE NEW ADDRESS TO HUB MOV I2C_BUFFER+1,HUB_ADDR ACALL WRITE_ONE_BYTE ;---- MOV I2C_BUFFER,#READ_LAST_EPT0_IN_ST ;CLEAR HUB EP0 IN SETTING OF ACALL READ_ONE_BYTE ;INTERRUPT REGISTER RET ;=============================================================== GET_CONFIG: ;8 ;--- MOV I2C_BUFFER,#WRITE_BUFFER ;WRITE BUFFER COMMAND MOV I2C_BUFFER+1,#0 MOV I2C_BUFFER+2,#1 MOV I2C_BUFFER+3,#0 ;configuration value=0 means not configurated JB HUB_CONFIG,HUB_HAD_CONFIG GET_CONFIG_1: ACALL WRITE_THREE_BYTE RET HUB_HAD_CONFIG: MOV I2C_BUFFER+3,#1 AJMP GET_CONFIG_1 ;================================================================== SET_CONFIG: ;9 MOV A,R4 JZ DISABLE_CONFIG CJNE A,#1,NO_SUPPORT_REQ ;WRONG_SET_CONFIG ;----- MOV I2C_BUFFER,#SET_MODE ;SET STOP PLL DURING MOV I2C_BUFFER+1,#10111000B ;SUSPEND MODE ACALL WRITE_ONE_BYTE ;----- SETB HUB_CONFIG MOV I2C_BUFFER,#SET_EPOINT_EN MOV I2C_BUFFER+1,#01H SET_CONFIG_1: ACALL WRITE_ONE_BYTE ;--- ACALL SEND_ZERO_PACKET RET ;---- DISABLE_CONFIG: CLR HUB_CONFIG MOV I2C_BUFFER,#SET_EPOINT_EN MOV I2C_BUFFER+1,#00H AJMP SET_CONFIG_1 ;================================================================= ; GET HUB OR PORT STATUS FROM H11 ;------------------------------------ GET_STATUS: ;0 ;----- MOV I2C_BUFFER,#WRITE_BUFFER MOV I2C_BUFFER+1,#0 MOV I2C_BUFFER+2,#2 MOV I2C_BUFFER+3,#0 MOV I2C_BUFFER+4,#0 ;----- MOV A,R2 ;I2C_BUFFER+OFFSET_bmReqTyp ANL A,#00000011B JZ GET_DEVICE_STATUS DEC A JZ GET_IF_STATUS DEC A JZ GET_EPT_STATUS GET_WRONG_RECIPIENT: AJMP NO_SUPPORT_REQ ;----- GET_DEVICE_STATUS: MOV A,HUB_STATUS ANL A,#00000011B MOV I2C_BUFFER+3,A ;STATUS OF SELF POWER AND REMOTE WAKEUP GET_IF_STATUS: HUB_EPT0_OUT: EPT_UN_STALL: ACALL WRITE_FOUR_BYTE ;WRITE FOUR BYTES TO H11 RET ;----- GET_EPT_STATUS: MOV A,R5 ;I2C_BUFFER+OFFSET_wIndex JZ HUB_EPT0_OUT ;SHOULD BE UN_STALL ;--- XRL A,#080H JZ HUB_EPT0_IN ;HUB EPT0 IN ;--- MOV A,R5 XRL A,#081H JZ HUB_EPT1_IN ;HUB EPT0 OUT AJMP NO_SUPPORT_REQ ;----- HUB_EPT0_IN: JNB EPT0_OUT_STALL,EPT_UN_STALL ;HUB EPT0 IN UN_STALL ;----- EPT_STALL: MOV I2C_BUFFER+3,#1 ;HUB EPT0 IN STALL AJMP EPT_UN_STALL ;----- HUB_EPT1_IN: JNB EPT1_IN_STALL,EPT_UN_STALL ;HUB EPT1 IN UN_STALL AJMP EPT_STALL ;HUB EPT1 IN STALL ;================================================================== ; CLEAR DEVICE,INTERFACE,ENDPOINT FEATURE ;---------------------------------------- CLEAR_FEATURE: ;1 MOV A,R2 ;I2C_BUFFER+OFFSET_bmReqTyp JZ CLEAR_DEVICE_FEATURE DEC A JZ CLEAR_INTERFACE_FEATURE DEC A JZ CLEAR_EPT_FEATURE ;----- CLEAR_INTERFACE_FEATURE: AJMP NO_SUPPORT_REQ ;---- CLEAR_DEVICE_FEATURE: MOV I2C_BUFFER,#SET_MODE ;CLEAR REMOTE WAKE-UP MOV I2C_BUFFER+1,#10111100B ;FUNCTION ACALL WRITE_ONE_BYTE ;---- CLR REMOTE_WAKE ;----- CLEAR_FEATURE_RET: CLR_EPT0_OUT: ACALL SEND_ZERO_PACKET RET ;--------------------------------- ;CLEAR ENDPOINR FEATURE CLEAR_EPT_FEATURE: MOV A,R5 ;I2C_BUFFER+OFFSET_wIndex JZ CLR_EPT0_OUT ;SHOULD BE UN_STALL ;--- XRL A,#080H JZ CLR_EPT0_IN ;HUB EPT0 IN ;--- MOV A,R5 XRL A,#081H JZ CLR_EPT1_IN ;HUB EPT0 OUT AJMP NO_SUPPORT_REQ ;---------------- CLR_EPT0_IN: CLR EPT0_IN_STALL ;HUB EPT0 IN STALL FLAG MOV I2C_BUFFER,#SET_EPT0_IN_ST ;SET ENDPOINT STATUS MOV I2C_BUFFER+1,#0 ;CLEAR ENDPOINT STALL CONDITION ACALL WRITE_ONE_BYTE AJMP CLEAR_FEATURE_RET ;--------------- CLR_EPT1_IN: CLR EPT1_IN_STALL ;HUB EPT1 IN STALL FLAG AJMP CLEAR_FEATURE_RET ;========================================================= SET_FEATURE: ;3 MOV A,R2 ;I2C_BUFFER+OFFSET_bmReqTyp JZ SET_DEVICE_FEATURE DEC A JZ SET_INTERFACE_FEATURE DEC A JZ SET_EPT_FEATURE ;----- SET_INTERFACE_FEATURE: NO_SUPPORT_REQ1: AJMP NO_SUPPORT_REQ ;---- SET_DEVICE_FEATURE: MOV I2C_BUFFER,#SET_MODE ;ENABLE REMOTE WAKE-UP MOV I2C_BUFFER+1,#10111101B ; ACALL WRITE_ONE_BYTE ;----- SETB REMOTE_WAKE ;----- SET_FEATURE_RET: SET_EPT0_OUT: ACALL SEND_ZERO_PACKET RET ;--------------------------------- ;CLEAR ENDPOINR FEATURE SET_EPT_FEATURE: MOV A,R5 ;I2C_BUFFER+OFFSET_wIndex JZ SET_EPT0_OUT ;SHOULD BE UN_STALL ;--- XRL A,#080H JZ SET_EPT0_IN ;HUB EPT0 IN ;--- MOV A,R5 XRL A,#081H JZ SET_EPT1_IN ;HUB EPT0 OUT AJMP NO_SUPPORT_REQ ;---------------- SET_EPT0_IN: SETB EPT0_IN_STALL ;HUB EPT0 IN STALL FLAG MOV I2C_BUFFER,#SET_EPT0_IN_ST ;SET ENDPOINT STATUS MOV I2C_BUFFER+1,#1 ;CLEAR ENDPOINT STALL CONDITION ACALL WRITE_ONE_BYTE AJMP SET_FEATURE_RET ;--------------- SET_EPT1_IN: SETB EPT1_IN_STALL ;HUB EPT1 IN STALL FLAG AJMP SET_FEATURE_RET ;------- ;======================================================= GET_DESCRIPTOR: ;6 MOV A,I2C_BUFFER+OFFSET_wValue+1 ;I2C_BUFFER+OFFSET_wValue+1 ;---- CHK_DEV_DESC: CJNE A,#01,CHK_CONF_DESC MOV DPTR,#STAND_DEV_DESC MOV R0,#I2C_BUFFER+OFFSET_wLength ;--- INC R0 ;IF HOST ISSUE OVER 256 BYTES MOV A,@R0 JNZ CHK_DEV_DESC1 DEC R0 ;--- MOV A,@R0 CLR C SUBB A,#18 ;device descriptor length=18 JC SEND_DESCRIPTOR CHK_DEV_DESC1: MOV @R0,#18 AJMP SEND_DESCRIPTOR ;---- CHK_CONF_DESC: CJNE A,#02,NO_SUPPORT_REQ2 SETB PWR_SRC_FLAG ;BUS /SELF POWER FLAG MOV DPTR,#CONFIG_DESC MOV R0,#I2C_BUFFER+OFFSET_wLength ;--- INC R0 ;IF HOST ISSUE OVER 256 BYTES MOV A,@R0 JNZ CHK_CONF_DESC1 ;-- DEC R0 MOV A,@R0 CLR C SUBB A,#25 JC SEND_DESCRIPTOR CHK_CONF_DESC1: MOV @R0,#25 ;---- SEND_DESCRIPTOR: LCALL SEND_TO_HOST RET ;******************************************************* ; MOV R2,I2C_BUFFER+OFFSET_bmReqTyp ; MOV R3,I2C_BUFFER+OFFSET_bmReq ; MOV R4,I2C_BUFFER+OFFSET_wValue ; MOV R5,I2C_BUFFER+OFFSET_wIndex ; MOV R6,I2C_BUFFER+OFFSET_wLength ;******************************************************* CLASS_REQUEST: MOV A,R3 ;I2C_BUFFER+OFFSET_bmReq JZ GET_C_STATUS ;0 DEC A JZ CLEAR_C_FEATURE_P ;1 DEC A ;;; JZ GET_C_STATE ;2 NO SUPPORT DEC A JZ SET_C_FEATURE_P ;3 DEC A ;4 DEC A ;5 DEC A JZ GET_C_DESCRIPTOR ;6 ;; DEC A ;; JZ SET_C_DESCRIPTOR ;7 NO SUPPORT ;-------- NO_SUPPORT_REQ2: AJMP NO_SUPPORT_REQ SET_C_FEATURE_P: AJMP SET_C_FEATURE CLEAR_C_FEATURE_P: AJMP CLEAR_C_FEATURE ;1 ;========================================= GET_C_DESCRIPTOR: ;6 JB H12_FLAG,HUB_DESC_TYPE_H12 MOV DPTR,#HUB_DESC HUB_TYPE: MOV R0,#I2C_BUFFER+OFFSET_wLength MOV A,@R0 CLR C SUBB A,#9 JC SEND_HUB_DESCRIPTOR MOV @R0,#9 AJMP SEND_HUB_DESCRIPTOR SEND_HUB_DESCRIPTOR: LCALL SEND_TO_HOST RET HUB_DESC_TYPE_H12: MOV DPTR,#HUB_DESC_H12 AJMP HUB_TYPE ;========================================= GET_C_STATUS: ;0 GET CLASS STATUS MOV A,R5 JZ GET_HUB_STATUS DEC A JZ GET_PORT1_STATUS DEC A JZ GET_PORT2_STATUS DEC A JZ GET_PORT3_STATUS DEC A JZ GET_PORT4_STATUS DEC A JZ GET_PORT5_STATUS NO_SUPPORT_REQ3: AJMP NO_SUPPORT_REQ ;---------------------------------------- GET_HUB_STATUS: MOV I2C_BUFFER,#0E0H ACALL READ_TWO_BYTE ;---- MOV A,I2C_BUFFER+1 ;SECOND BYTE RR A RR A ANL A,#00000010B MOV R6,A MOV R7,A AJMP SEND_STATUS_HOST GET_PORT1_STATUS: ;--- MOV I2C_BUFFER,#SET_STATUS_CHG_BITS ;CLEAR HUB ENDPOINT1 INTERRUPT MOV I2C_BUFFER+1,#00 ;TRS FOR PORT0 ACALL WRITE_ONE_BYTE ;--- MOV R6,EMBED_STATUS0 MOV R7,EMBED_STATUS1 AJMP SEND_STATUS_HOST ;----- GET_PORT2_STATUS: GET_PORT3_STATUS: GET_PORT4_STATUS: GET_PORT5_STATUS: MOV A,R5 DEC A DEC A ORL A,#0E0H MOV I2C_BUFFER,A ACALL READ_TWO_BYTE ;--- MOV R6,I2C_BUFFER ;FIRST BYTE MOV R7,I2C_BUFFER+1 ;SECOND BYTE ;--- SEND_STATUS_HOST: ;--- MOV I2C_BUFFER,#WRITE_BUFFER MOV I2C_BUFFER+1,#0 MOV I2C_BUFFER+2,#4 ;--- MOV A,R6 ANL A,#00011111B MOV I2C_BUFFER+3,A ;--- MOV A,R6 SWAP A RR A ANL A,#00000011B MOV I2C_BUFFER+4,A ;--- MOV A,R7 ANL A,#00011111B MOV I2C_BUFFER+5,A ;---- MOV I2C_BUFFER+6,#0 ;---- ACALL WRITE_SIX_BYTE RET ;====================================== CLEAR_C_FEATURE: ;1 GET CLASS FEATURE JNB HUB_CONFIG,NO_SUPPORT_REQ3 ;HUB NOT CONFIGURATION,SEND STALL ;--- MOV A,R5 ; JZ CLEAR_HUB_FEATURE ;CLEAR HUB FEATURE DEC A JNZ CLEAR_DN_PORT AJMP CLEAR_PORT0_FEATURE ;CLEAR EMBED PORT FEATURE ;------ CLEAR_DN_PORT: DEC A MOV R1,A ANL A,#11111100B JNZ NO_SUPPORT_REQ3 ;OVER PORT5, NO SUPPORT ;--- MOV A,R1 ORL A,#0E0H ;CLEAR PORT2-5 FEATURE MOV R1,A ;E0-E3 ;----- CLEAR_PORT_FEATURE: MOV A,R4 ;; JZ ;0 PORT CONNECTION DEC A JZ CL_PORT_ENABLE ;1 DEC A JZ CL_PORT_SUSPEND ;2 CLR C ;3,4 SUBB A,#6 JZ CL_PORT_POWER ;8 CLEAR PORT POWER CLR C SUBB A,#8 JZ CL_C_PORT_CONN ;16 DEC A JZ CL_C_PORT_ENABLE ;17 DEC A JZ CL_C_PORT_SUSPEND ;18 DEC A JZ CL_C_PORT_OVER_CURR ;19 DEC A JZ CL_C_PORT_RESET ;20 NO_SUPPORT_REQ4: AJMP NO_SUPPORT_REQ ;------------------------------------------- CL_PORT_ENABLE: MOV R6,#F_PORT_ENABLE ;1 AJMP VALID_CL_FEATURE ;----------- CL_PORT_SUSPEND: MOV R6,#F_PORT_SUSPEND ;2 AJMP VALID_CL_FEATURE ;---------- CL_PORT_POWER: MOV EMBED_STATUS0,#0 ;8 ALL EMBED STATUS SHOULD BE CLEAR MOV EMBED_STATUS1,#0 CLR E_PORT_POWER ;--- MOV R6,#F_PORT_POWER ;8 AJMP VALID_CL_FEATURE ;---------- CL_C_PORT_CONN: MOV R6,#C_PORT_CONN ;16 AJMP VALID_CL_FEATURE ;---------- CL_C_PORT_ENABLE: MOV R6,#C_PORT_ENABLE ;17 AJMP VALID_CL_FEATURE ;----------- CL_C_PORT_SUSPEND: MOV R6,#C_PORT_SUSPEND ;18 AJMP VALID_CL_FEATURE ;----------- CL_C_PORT_OVER_CURR: MOV R6,#C_PORT_OVERCUR ;19 AJMP VALID_CL_FEATURE ;----------- CL_C_PORT_RESET: MOV R6,#FC_PORT_RESET ;20 ;----- VALID_CL_FEATURE: MOV I2C_BUFFER,R1 MOV I2C_BUFFER+1,R6 ACALL WRITE_ONE_BYTE ;--- ACALL SEND_ZERO_PACKET CL_RET: RET ;--------------- CLEAR_HUB_FEATURE: MOV A,R4 JB ACC.0,CLEAR_HUB_OVERCURRENT ;NO SUPPORT FEATURE SELECTORS AJMP NO_SUPPORT_REQ4 CLEAR_HUB_OVERCURRENT: MOV R1,#0E0H ;CLEAR PORT2-5 OVERCURRENT AJMP CL_C_PORT_OVER_CURR ;===================---------------- CLEAR_PORT0_FEATURE: MOV A,R4 ;; JZ ;0 PORT CONNECTION DEC A JZ CL_PORT0_ENABLE ;IGNORE 1:CL_PORT0_ENABLE DEC A JZ CL_PORT0_SUSPEND ;IGNORE 2:CL_PORT0_SUSPEND CLR C ;3,4 SUBB A,#6 JZ CL_PORT0_POWER ;IGNORE 8:CLEAR PORT POWER CLR C SUBB A,#8 JZ CL_PORT0_OK ;IGNORE 16:CL_C_PORT0_CONN DEC A JZ CL_PORT0_C_ENABLE ;IGNORE 17:CL_C_PORT0_ENABLE DEC A JZ CL_PORT0_C_SUSPEND ;IGNORE 18:CL_C_PORT0_SUSPEND DEC A JZ CL_PORT0_OK ;IGNORE 19:CL_C_PORT0_OVER_CURR DEC A JZ CL_PORT0_RESET ;IGNORE 20:CL_C_PORT0_RESET AJMP NO_SUPPORT_REQ ;------------------------------ CL_PORT0_POWER: MOV I2C_BUFFER,#SET_EMB_ADDRESS_EN ;DISABLE EMBED ADDRESS MOV I2C_BUFFER+1,#00 ACALL WRITE_ONE_BYTE ;---- MOV I2C_BUFFER,#SET_STATUS_CHG_BITS ;INFORM HOST, CURRENT EMBEDDED MOV I2C_BUFFER+1,#02 ;FUNCTION IS LOSE ACALL WRITE_ONE_BYTE ;---- MOV R1,#0E0H AJMP CL_PORT_POWER ;CLEAR ALL DN PORT POWER ;--------- CL_PORT0_SUSPEND: ;IGNORE 2:CL_PORT0_SUSPEND CLR E_PORT_SUSPEND SETB E_C_PORT_SUSPEND ;---- MOV I2C_BUFFER,#SET_STATUS_CHG_BITS ;INFORM HOST, CURRENT EMBEDDED MOV I2C_BUFFER+1,#02 ;FUNCTION IS LOSE ACALL WRITE_ONE_BYTE ;---- AJMP CL_PORT0_OK CL_PORT0_RESET: CLR E_C_PORT_RESET ACALL SEND_ZERO_PACKET LCALL INIT_DDC2B CC_RET: RET ;---- CL_PORT0_C_ENABLE: CLR E_C_PORT_ENABLE AJMP CL_PORT0_OK ;---- CL_PORT0_C_SUSPEND: CLR E_C_PORT_SUSPEND AJMP CL_PORT0_OK ;---- CL_PORT0_ENABLE: JNB E_PORT_ENABLE,CL_PORT0_OK ;PORT0 CURRENT IS DISBALE SETB E_C_PORT_ENABLE ;PORT0 CURRENT IS ENABLE, SET CHNAGE BIT CLR E_PORT_ENABLE ;CLEAR PROT0 ENABLE ;--- MOV I2C_BUFFER,#SET_EMB_ADDRESS_EN ;DISABLE EMBED ADDRESS MOV I2C_BUFFER+1,#00 ACALL WRITE_ONE_BYTE ;--- CL_PORT0_OK: ACALL SEND_ZERO_PACKET RET ;========================================== SET_C_FEATURE: ;3 JNB HUB_CONFIG,NO_SUPPORT_REQ5 ;HUB NOT CONFIGURATION ;----- MOV A,R5 ;I2C_BUFFER+OFFSET_wIndex JZ NO_SUPPORT_REQ5 ;SET HUB FEATURE DEC A JZ SET_PORT0_FEATURE ;SET EMBEDED PORT FEATURE SET_PORT_FEATURE: DEC A MOV R1,A ;PORT2-5 ANL A,#11111100B JNZ NO_SUPPORT_REQ5 ;OVER PORT 5 MOV A,R1 ORL A,#0E8H MOV R1,A ;E8,9,A,B ;----- SET_FEATURE_TABLE: MOV A,R4 ;; JZ ;0 PORT CONNECTION DEC A JZ SET_PORT_ENABLE ;1 DEC A JZ SET_PORT_SUSPEND ;2 DEC A ;3 DEC A JZ SET_PORT_RESET ;4 DEC A ;5 DEC A ;6 DEC A ;7 DEC A JZ SET_PORT_POWER ;8 CLEAR PORT POWER NO_SUPPORT_REQ5: AJMP NO_SUPPORT_REQ ;------------------------------------------- SET_PORT_ENABLE: MOV R6,#F_PORT_ENABLE ;1 AJMP VALID_SET_FEATURE ;-------------------- SET_PORT_SUSPEND: MOV R6,#F_PORT_SUSPEND ;2 AJMP VALID_SET_FEATURE ;------------------ SET_PORT_RESET: MOV R6,#FC_PORT_RESET ;4 VALID_SET_FEATURE: AJMP VALID_CL_FEATURE ;------------------ SET_PORT_POWER: SETB E_PORT_POWER ;WHEN ONE PORT HAS POWER TEHN EVERY ONE HAS POWER SETB E_PORT_CONN ;THE PORT0 IS ALWAYS CONNECTED TO HUB ;---- MOV R1,#0E8H ;turn on port2 power as well as OV detection ACALL SET_POWER_ON MOV R1,#0E9H ;turn on port3 power as well as OV detection ACALL SET_POWER_ON MOV R1,#0EAH ;turn on port4 power as well as OV detection ACALL SET_POWER_ON MOV R1,#0EBH ;turn on port5 power as well as OV detection ACALL SET_POWER_ON ;---- ACALL SEND_ZERO_PACKET RET ;---- SET_POWER_ON: MOV I2C_BUFFER,R1 ;TURN ON POWER MOV I2C_BUFFER+1,#F_PORT_POWER ACALL WRITE_ONE_BYTE NOP NOP MOV I2C_BUFFER,R1 ;TURN ON OVERCURRENT CIRCUIT MOV I2C_BUFFER+1,#F_PORT_POWER ACALL WRITE_ONE_BYTE RET ;======================----------------- SET_PORT0_FEATURE: MOV A,R4 ;;; JZ ;0 PORT CONNECTION DEC A JZ SET_PORT0_ENABLE ;IGNORE 1:SET_PORT_ENABLE DEC A JZ SET_PORT0_SUSPEND ;IGNORE 2:SET_PORT_SUSPEND DEC A ;3 DEC A JZ SET_PORT0_RESET ;IGNORE 4:SET_PORT0_RESET DEC A ;5 DEC A ;6 DEC A ;7 DEC A JZ SET_PORT0_POWER ;8 SET PORT POWER AJMP NO_SUPPORT_REQ ;------------------------------------------- SET_PORT0_POWER: ;---- CLR INIT_FLAG ;---- MOV I2C_BUFFER,#SET_STATUS_CHG_BITS ;INFORM HOST, CURRENT EMBEDDED MOV I2C_BUFFER+1,#02 ;FUNCTION IS ATTACHED ACALL WRITE_ONE_BYTE ;---- AJMP SET_PORT_POWER ;---- SET_PORT0_SUSPEND: ;IGNORE 2:CL_PORT0_SUSPEND SETB E_PORT_SUSPEND ;--- SET_PORT0_OK: ACALL SEND_ZERO_PACKET RET ;--------------------- SET_PORT0_RESET: JNB E_PORT_POWER,SET_PORT0_OK ;PORT0 NO POWER ;-------------- MOV I2C_BUFFER,#SET_STATUS_CHG_BITS ;INFORM HOST, CURRENT EMBEDDED MOV I2C_BUFFER+1,#02 ;FUNCTION IS LOSE ACALL WRITE_ONE_BYTE ;------------- SETB E_C_PORT_RESET ;SETTING PORT RESET READY FLAG CLR E_PORT_SUSPEND MOV EMB_ADDR,#0 AJMP SET_PORT0_1 ;--------------------- SET_PORT0_ENABLE: JNB E_PORT_POWER,SET_PORT0_OK ;PORT0 NO POWER JB E_PORT_ENABLE,SET_PORT0_OK ;CURRENT IS ENABLE SETB E_C_PORT_ENABLE ;CURRENT IS DISBALE ;--- SET_PORT0_1: SETB E_PORT_ENABLE ;SET PROT0 ENABLE ;---- MOV I2C_BUFFER,#SET_EMB_ADDRESS_EN ;DISABLE EMBED ADDRESS MOV A,EMB_ADDR ;ADDRESS OF THE EMBEDDED FUNCTION ORL A,#080H MOV I2C_BUFFER+1,A ACALL WRITE_ONE_BYTE ;---- MOV I2C_BUFFER,#SET_EPOINT_EN ;ENABLE HUB INTERRUPT ENDPOINT MOV I2C_BUFFER+1,#03H ;and EMBEDDED FUNCTION ACALL WRITE_ONE_BYTE ;--- AJMP SET_PORT0_OK ; ;******************************************* ;******************************************* WRITE_NINE_BYTE: MOV RW_COUNTER,#9 LJMP WRITE_TO_H11 ;---------------------------------------- WRITE_SIX_BYTE: MOV RW_COUNTER,#6 WRITE_N_BYTE: LJMP WRITE_TO_H11 ;---------------------------------------- WRITE_THREE_BYTE: MOV RW_COUNTER,#3 LJMP WRITE_TO_H11 ;---------------------------------------- WRITE_FOUR_BYTE: MOV RW_COUNTER,#4 LJMP WRITE_TO_H11 ;---------------------------------------- WRITE_TWO_BYTE: MOV RW_COUNTER,#2 LJMP WRITE_TO_H11 ;---------------------------------------- READ_ONE_BYTE: MOV RW_COUNTER,#1 LJMP READ_FROM_H11 ;---------------------------------------- READ_TWO_BYTE: MOV RW_COUNTER,#2 LJMP READ_FROM_H11 ;---------------------------------------- READ_TEN_BYTE: MOV RW_COUNTER,#10 LJMP READ_FROM_H11 ;---------------------------------------- WRITE_ONE_BYTE: MOV RW_COUNTER,#1 LJMP WRITE_TO_H11 ;---------------------------------------- WRITE_COMMAND: MOV SLV_ADR,#036H ;WRITE COMMAND MOV CNT_BYTE,#1 ;NUMBER OF BYTES TO BE SENT LCALL WRITE_H11_POINT ;READ 1 BYTES RET ;----- ; ;-------------------------------- ; ENDPOINT 0 SEND DATA TO HOST ;-------------------------------- SEND_TO_HOST: MOV A,@R0 ;SEND DATA LENGTH CLR C ;R0 = BYTE_TO_SEND SUBB A,#08H JNC SEND01 MOV A,@R0 MOV R1,A ;NUMBER BYTES TO SEND ADD A,#2 MOV RW_COUNTER,A ;TOTAL BYTES TO SEND MOV BYTE_TO_SEND,#0 ;REMAIN BYTES TO SEND AJMP SEND02 ;----- SEND01: MOV BYTE_TO_SEND,A ;REMAIN BYTES MOV R1,#8 MOV RW_COUNTER,#0AH ;TOTAL BYTES TO SEND ;----- SEND02: ;---- MOV I2C_BUFFER,#WRITE_BUFFER ;COMMAND MOV I2C_BUFFER+1,#0 ;FIRST BYTE SHOULD BE ZERO MOV I2C_BUFFER+2,R1 ;DATA LENGTH ;--- MOV R0,#I2C_BUFFER+3 ;--- SEND03: CLR A MOVC A,@A+DPTR MOV @R0,A INC R0 INC DPTR DJNZ R1,SEND03 ;--- MOV MSG_DPH,DPH MOV MSG_DPL,DPL ;--- LCALL WRITE_N_BYTE ;--- RET ;======================================== SEND_ZERO_PACKET: ; MOV BYTE_TO_SEND,#0 MOV I2C_BUFFER,#SEL_EPOINT_0_IN ;----- SEND_ZERO_P1: ACALL WRITE_COMMAND ;---- MOV I2C_BUFFER,#WRITE_BUFFER MOV I2C_BUFFER+1,#0 MOV I2C_BUFFER+2,#0 MOV I2C_BUFFER+3,#0 ACALL WRITE_THREE_BYTE RET ;******************************************************************** EMB_ED0_INPUT: ;---- SETB SEL_EPT_FLAG ;SELECT EMBED BUFFER ;---- MOV I2C_BUFFER,#READ_LAST_EMBF_IN_ST ;clear interrupt register ACALL READ_ONE_BYTE ;-- MOV I2C_BUFFER,#SEL_EPT_EMBF_IN ;steer read_head to emb control in ACALL READ_ONE_BYTE MOV A,I2C_BUFFER ANL A,#1 ;IS BUFFER EMPTY? JNZ EMB_INPUT_ret ;if NOT empty, cannot fill FIFO ;------ EMB_MORE_MESSAGE: mov c,zero_byte_flag jc emb_no_data_to_host MOV DPH,EMB_MSG_DPH MOV DPL,EMB_MSG_DPL LCALL EMB_SEND_TO_HOST EMB_INPUT_ret: RET EMB_NO_DATA_TO_HOST: ACALL SEND_EMB_ZERO_PACKET ; clr zero_byte_flag RET ;======================================== SEND_EMB_ZERO_PACKET: MOV I2C_BUFFER,#SEL_EPT_EMBF_IN AJMP SEND_ZERO_P1 ;======================================== SEND_EP0O_STALL: MOV I2C_BUFFER,#SET_EPT0_OUT_ST ;SET ENDPOINT 0 SEND_STALL: MOV I2C_BUFFER+1,#01H ;SET ENDPOINT STALL LCALL WRITE_ONE_BYTE RET ;======================================== SEND_EP0I_STALL: MOV I2C_BUFFER,#SET_EPT0_IN_ST ;SET ENDPOINT 0 AJMP SEND_STALL ;======================================== SEND_EMB0I_STALL: MOV I2C_BUFFER,#SET_EMBF_IN_ST ;SET EMB EPT0 STALL AJMP SEND_STALL ;======================================== SEND_EMB0O_STALL: MOV I2C_BUFFER,#SET_EMBF_OUT_ST ; AJMP SEND_STALL ;======================================== ;------------------ EMB_C_NO_SUPPORT_REQ2: LJMP EMB_C_NO_SUPPORT_REQ ;******************************************************************** EMB_ED0_OUTPUT: ;--- SETB SEL_EPT_FLAG ;SELECT EMBED BUFFER ;--- MOV I2C_BUFFER,#READ_LAST_EMBF_OUT_ST ;clear interrupt register of H11A ACALL READ_ONE_BYTE ;---- MOV I2C_BUFFER,#READ_EMBF_OUT_ST ;SETUP PACKET STATUS ACALL READ_ONE_BYTE MOV A,I2C_BUFFER ANL A,#00000100B ;is SETUP packet? JNZ EMB_READ_SETUP_DATA ;SETUP PACKET IS NOT ACK MOV A,I2C_BUFFER ANL A,#00100000B ;is FIFO full? JNZ OUT_TOKEN ;yes, is OUT TOKEN COMING AJMP EMB_DATA_ERROR ;NO TOKEN COMING, error ;======================================== ; output data processing ;----------------------------------------- OUT_TOKEN: MOV A,EMB_LAST_COM CJNE A,#REQ_SET_FEATURE,WRONG_REQ_COMMAND ;LAST COM IS NOT SET_FEATURE. MOV EMB_LAST_COM,#0 ;what's meaning? Ready for next OUT token checking up ;---- MOV I2C_BUFFER,#SEL_EPT_EMBF_OUT ACALL WRITE_COMMAND ;----- MOV I2C_BUFFER,#READ_BUFFER ;SEND READ BUFFER CMD TO H11 ACALL READ_TEN_BYTE ;------ MOV I2C_BUFFER,#CLEAR_BUF ;RELEASE BUFFER ACALL WRITE_COMMAND ;----- ;******************************************************************************** LCALL SET_DAC_DATA ;This is important for function settings ;******************************************************************************** ACALL SEND_EMB_ZERO_PACKET ;shakehand stage, it can be placed before ; fucntion implementation RET ;------ WRONG_REQ_COMMAND: MOV I2C_BUFFER,#CLEAR_BUF ;RELEASE BUFFER ACALL WRITE_COMMAND EMB_DATA_ERROR: ret ;============================================== ; setup packet processing ;--------------------------- ;MAYBE OUT TOKEN EMB_READ_SETUP_DATA: MOV I2C_BUFFER,#SEL_EPT_EMBF_IN ACALL WRITE_COMMAND ;----- MOV I2C_BUFFER,#ACK_SETUP ;SEND ACK TO ENDPOINT 0 IN ACALL WRITE_COMMAND ;--------------------------- MOV I2C_BUFFER,#SEL_EPT_EMBF_OUT ACALL WRITE_COMMAND ;----- MOV I2C_BUFFER,#ACK_SETUP ;SEND ACK TO ENDPOINT 0 OUT ACALL WRITE_COMMAND ;--------------------------- MOV I2C_BUFFER,#READ_BUFFER ;SEND READ BUFFER CMD TO H11 ACALL READ_TEN_BYTE ;------ MOV I2C_BUFFER,#CLEAR_BUF ;RELEASE BUFFER ACALL WRITE_COMMAND ;----- MOV A,I2C_BUFFER+1 ;READ TOTAL HOW MANY BYTES CJNE A,#8,EMB_DATA_ERROR ;NOT CORRECT COMMAND FROM HOST ;----------------------------------------------------------------- ; DECODE HUB ENDPOINT 0 STANDARD REQUEST COMMAND ;----------------------------------------------------------------- EMB_DECODE_REQUEST: ;--- MOV R2,I2C_BUFFER+OFFSET_bmReqTyp MOV R3,I2C_BUFFER+OFFSET_bmReq MOV R4,I2C_BUFFER+OFFSET_wValue MOV R5,I2C_BUFFER+OFFSET_wIndex MOV R6,I2C_BUFFER+OFFSET_wLength ;--- MOV A,R2 ;I2C_BUFFER+OFFSET_bmReqTyp ANL A,#01100000B JZ EMB_STANDARD_REQUEST LJMP EMB_CLASS_REQUEST ;--------- EMB_STANDARD_REQUEST: MOV A,R3 ;I2C_BUFFER+OFFSET_bmReq clr c subb a,#12 jnc EMB_NO_SUPPORT_REQ mov a,r3 mov b,#3 mul ab mov dptr,#EMB_req_tbl jmp @a+dptr EMB_req_tbl: ljmp EMB_GET_STATUS ljmp EMB_CLEAR_FEATURE ljmp EMB_NO_SUPPORT_REQ ;undefined ljmp EMB_SET_FEATURE ljmp EMB_NO_SUPPORT_REQ ;undefined ljmp EMB_SET_ADDRESS ljmp EMB_GET_DESCRIPTOR ljmp EMB_NO_SUPPORT_REQ ;set_descriptor ljmp EMB_GET_CONFIG ljmp EMB_SET_CONFIG ljmp EMB_GET_INTERFACE ljmp EMB_SET_INTERFACE EMB_NO_SUPPORT_REQ: LCALL SEND_EMB0I_STALL ;10 - GET INTERFACE, NO SUUPORT RET ;11 - SET INTERFACE, NO SUPPORT ;12 - SYNCH FRAME, NO SUPPORT ;================================================================= EMB_SET_INTERFACE: ACALL SEND_EMB_ZERO_PACKET RET ;----- EMB_GET_INTERFACE: MOV I2C_BUFFER,#WRITE_BUFFER ;WRITE BUFFER COMMAND MOV I2C_BUFFER+1,#0 MOV I2C_BUFFER+2,#1 MOV I2C_BUFFER+3,#0 ACALL WRITE_THREE_BYTE RET ;------ ;================================================================= EMB_SET_ADDRESS: MOV A,R4 ORL A,#080H MOV EMB_ADDR,A ;I2C_BUFFER+OFFSET_wValue ;--- ACALL SEND_EMB_ZERO_PACKET ;---- EMB_LOOP: MOV I2C_BUFFER,#READ_INT ;READ INTERRUPT REGISTER ACALL READ_ONE_BYTE ;READ DATA FROM H11 ;------ MOV A,I2C_BUFFER JNB ACC.3,EMB_LOOP ;--- SET_EMB_ADDR: MOV I2C_BUFFER,#SET_EMB_ADDRESS_EN ;WRITE NEW ADDRESS TO HUB MOV I2C_BUFFER+1,EMB_ADDR ACALL WRITE_ONE_BYTE ;---- MOV I2C_BUFFER,#READ_LAST_EMBF_IN_ST ;READ ENDPOINT STATUS FROM H11 ACALL READ_ONE_BYTE ;CLEAR HUB ED0 IN FLAG RET ;=============================================================== EMB_GET_CONFIG: ;8 ;--- MOV I2C_BUFFER,#WRITE_BUFFER ;WRITE BUFFER COMMAND MOV I2C_BUFFER+1,#0 MOV I2C_BUFFER+2,#1 MOV I2C_BUFFER+3,#0 JB EMB_CONFIG,EMB_HAD_CONFIG EMB_GET_CONFIG_1: ACALL WRITE_THREE_BYTE RET EMB_HAD_CONFIG: MOV I2C_BUFFER+3,#1 AJMP EMB_GET_CONFIG_1 ;================================================================== EMB_SET_CONFIG: ;9 MOV A,R4 JZ EMB_DISABLE_CONFIG CJNE A,#1,EMB_NO_SUPPORT_REQ ;WRONG_SET_CONFIG ;----- SETB EMB_CONFIG ;---- MOV I2C_BUFFER,#SET_EPOINT_EN ;enable hub + embdedded func1 MOV I2C_BUFFER+1,#03h ACALL WRITE_ONE_BYTE ;--- EMB_SET_CONFIG_1: LCALL SEND_EMB_ZERO_PACKET RET ;---- EMB_DISABLE_CONFIG: CLR EMB_CONFIG AJMP EMB_SET_CONFIG_1 ;================================================================= ; GET HUB OR PORT STATUS FROM H11 ;------------------------------------ EMB_GET_STATUS: ;0 ;----- MOV I2C_BUFFER,#WRITE_BUFFER MOV I2C_BUFFER+1,#0 MOV I2C_BUFFER+2,#2 MOV I2C_BUFFER+3,#0 MOV I2C_BUFFER+4,#0 ;----- MOV A,R2 ;I2C_BUFFER+OFFSET_bmReqTyp ANL A,#00000011B JZ EMB_GET_DEVICE_STATUS DEC A JZ EMB_GET_IF_STATUS DEC A JZ EMB_GET_EPT_STATUS EMB_GET_WRONG_RECIPIENT: AJMP EMB_NO_SUPPORT_REQ ;----- EMB_GET_DEVICE_STATUS: MOV A,EMB_STATUS ANL A,#00000011B MOV I2C_BUFFER+3,A ;STATUS OF SELF POWER AND REMOTE WAKEUP EMB_GET_IF_STATUS: EMB_EPT0_OUT: EMB_EPT_UN_STALL: ACALL WRITE_FOUR_BYTE ;WRITE FOUR BYTES TO H11 RET ;----- EMB_GET_EPT_STATUS: MOV A,R5 ;I2C_BUFFER+OFFSET_wIndex JZ EMB_EPT0_OUT ;emb ept0 out, SHOULD BE UN_STALL ;--- XRL A,#080H JZ EMB_EPT0_IN ;emb EPT0 IN ;--- MOV A,R5 XRL A,#81H JZ EMB_EPT1_IN ;emb interrupt endpoint1 ;--- MOV A,R5 XRL A,#82H JZ EMB_EPT2_IN ;emb interrupt endpoint2 AJMP EMB_NO_SUPPORT_REQ ;----- EMB_EPT0_IN: JNB EMB_EPT0_OUT_STALL,EMB_EPT_UN_STALL ;HUB EPT0 IN UN_STALL ;----- EMB_EPT_STALL: MOV I2C_BUFFER+3,#1 ;EMBB EPTs IN STALL AJMP EMB_EPT_UN_STALL ;----- EMB_EPT1_IN: JNB EMB_EPT1_IN_STALL,EMB_EPT_UN_STALL ;HUB EPT1 IN UN_STALL AJMP EMB_EPT_STALL ;HUB EPT1 IN STALL ;----- EMB_EPT2_IN: JNB EMB_EPT2_IN_STALL,EMB_EPT_UN_STALL ;HUB EPT1 IN UN_STALL AJMP EMB_EPT_STALL ;HUB EPT1 IN STALL ;================================================================== ; CLEAR DEVICE,INTERFACE,ENDPOINT FEATURE ;---------------------------------------- EMB_CLEAR_FEATURE: ;1 MOV A,R2 ;I2C_BUFFER+OFFSET_bmReqTyp JZ EMB_CLEAR_DEVICE_FEATURE DEC A JZ EMB_CLEAR_INTERFACE_FEATURE DEC A JZ EMB_CLEAR_EPT_FEATURE ;----- EMB_CLEAR_INTERFACE_FEATURE: AJMP EMB_NO_SUPPORT_REQ ;---- EMB_CLEAR_DEVICE_FEATURE: CLR EMB_REMOTE_WAKE ;----- EMB_CLEAR_FEATURE_RET: EMB_CLR_EPT0_OUT: ACALL SEND_EMB_ZERO_PACKET RET ;------------- ;CLEAR ENDPOINR FEATURE EMB_CLEAR_EPT_FEATURE: MOV A,R5 ;I2C_BUFFER+OFFSET_wIndex JZ EMB_CLR_EPT0_OUT ;SHOULD BE UN_STALL ;--- XRL A,#080H JZ EMB_CLR_EPT0_IN ;HUB EPT0 IN ;--- MOV A,R5 XRL A,#081H JZ EMB_CLR_EPT1_IN ;HUB EPT0 OUT ;--- MOV A,R5 XRL A,#82H JZ EMB_CLR_EPT2_IN ;emb ept2 IN AJMP EMB_NO_SUPPORT_REQ ;---------------- EMB_CLR_EPT0_IN: CLR EMB_EPT0_IN_STALL ;HUB EPT0 IN STALL FLAG AJMP EMB_CLEAR_FEATURE_RET ;--------------- EMB_CLR_EPT1_IN: CLR EMB_EPT1_IN_STALL ;HUB EPT1 IN STALL FLAG AJMP EMB_CLEAR_FEATURE_RET ;--------------- EMB_CLR_EPT2_IN: CLR EMB_EPT2_IN_STALL ;HUB EPT1 IN STALL FLAG AJMP EMB_CLEAR_FEATURE_RET ;========================================================= EMB_SET_FEATURE: ;3 MOV A,R2 ;I2C_BUFFER+OFFSET_bmReqTyp JZ EMB_SET_DEVICE_FEATURE DEC A JZ EMB_SET_INTERFACE_FEATURE DEC A JZ EMB_SET_EPT_FEATURE ;----- EMB_SET_INTERFACE_FEATURE: EMB_NO_SUPPORT_REQ1: AJMP EMB_NO_SUPPORT_REQ ;---- EMB_SET_DEVICE_FEATURE: SETB EMB_REMOTE_WAKE ;----- EMB_SET_FEATURE_RET: EMB_SET_EPT0_OUT: LCALL SEND_EMB_ZERO_PACKET RET ;--------------- ;CLEAR ENDPOINR FEATURE EMB_SET_EPT_FEATURE: MOV A,R5 ;I2C_BUFFER+OFFSET_wIndex JZ EMB_SET_EPT0_OUT ;SHOULD BE UN_STALL ;--- XRL A,#080H JZ EMB_SET_EPT0_IN ;HUB EPT0 IN ;--- MOV A,R5 XRL A,#081H JZ EMB_SET_EPT1_IN ;HUB EPT0 OUT ;--- MOV A,R5 XRL A,#82H JZ EMB_SET_EPT2_IN ;HUB EPT0 OUT AJMP EMB_NO_SUPPORT_REQ ;---------------- EMB_SET_EPT0_IN: SETB EMB_EPT0_IN_STALL ;HUB EPT0 IN STALL FLAG AJMP EMB_SET_FEATURE_RET ;--------------- EMB_SET_EPT1_IN: SETB EMB_EPT1_IN_STALL ;HUB EPT1 IN STALL FLAG AJMP EMB_SET_FEATURE_RET ;------- EMB_SET_EPT2_IN: SETB EMB_EPT2_IN_STALL ;HUB EPT1 IN STALL FLAG AJMP EMB_SET_FEATURE_RET ; ;======================================================= EMB_GET_DESCRIPTOR: ;6 clr zero_byte_flag MOV A,R4 ;descriptor index JNZ EMB_NO_SUPPORT_REQ1 ;no string descriptor MOV R0,#I2C_BUFFER+OFFSET_wLength ;get the descriptor length mov dsc_len_low,@r0 inc r0 mov dsc_len_high,@r0 ;---- MOV A,I2C_BUFFER+OFFSET_wValue+1 ;descriptor type EMB_CHK_DEV_DESC: CJNE A,#01,EMB_CHK_CONF_DESC MOV DPTR,#EMB_STAND_DEV_DESC ; clr c ;required length greater than defined? mov a,dsc_len_low subb a,#18 mov a,dsc_len_high subb a,#0 jc emb_dev_dsc1 MOV dsc_len_low,#18 ;yes, use defined mov DSC_LEN_HIGH,#0 EMB_DEV_DSC1: LJMP EMB_SEND_DESCRIPTOR ;otherwise, use required ;---- EMB_CHK_CONF_DESC: CJNE A,#02,EMB_CHK_HID_DESC MOV DPTR,#EMB_CONFIG_DESC clr c ;if required data length greater than defined? mov a,dsc_len_low subb a,#CONF_LENGTH mov a,dsc_len_high subb a,#0 jc emb_conf_dsc1 MOV DSC_LEN_LOW,#CONF_LENGTH ;yes, use defined length MOV DSC_LEN_HIGH,#0 EMB_CONF_DSC1: EMB_SEND_DESCRIPTOR: LJMP EMB_SEND_TO_HOST ;no, use required length ;------------- EMB_CHK_HID_DESC: CJNE A,#021H,EMB_CHK_REPORT_DESC MOV A,I2C_BUFFER+OFFSET_wIndex ;interface number the HID accompanies jz HID_desc ;hid or hid1? dec a jz hid1_desc ljmp EMB_NO_SUPPORT_REQ1 hid_desc: MOV DPTR,#EMB_HID_DESC ;hid sjmp hid_dsc hid1_desc: MOV DPTR,#EMB_HID1_DESC ;hid1 hid_dsc: clr c ;if required length greater than defined mov a,dsc_len_low subb a,#9 mov a,dsc_len_high subb a,#0 jc emb_hid_dsc1 mov dsc_len_low,#9 ;yes, use defined mov dsc_len_high,#0 EMB_HID_DSC1: LJMP EMB_SEND_TO_HOST ;otherwise, use required ;------------- emb_no_support_req2: ljmp emb_no_support_req EMB_CHK_REPORT_DESC: CJNE A,#022H,EMB_NO_SUPPORT_REQ2 MOV A,I2C_BUFFER+OFFSET_wIndex ;interface number the HID accompanies jz rpt_dsc ;hid report or hid1 report dec a jz rpt1_dsc ljmp EMB_NO_SUPPORT_REQ1 rpt_dsc: clr c ;if required length greater than defined mov a,dsc_len_low subb a,#rpt_len_low mov a,dsc_len_high subb a,#rpt_len_high jc rpt_dsc_update mov dsc_len_low,#rpt_len_low ;yes, use defined mov dsc_len_high,#rpt_len_high rpt_dsc_update: MOV DPTR,#EMB_REPORT_DESC ;otherwise use required ajmp EMB_SEND_TO_HOST rpt1_dsc: MOV DPTR,#EMB_REPORT1_DESC clr c ;similarly mov a,dsc_len_low subb a,#report1_length mov a,dsc_len_high subb a,#0 jc rpt1_dsc_update mov dsc_len_low,#report1_length mov dsc_len_high,#0 rpt1_dsc_update: AJMP EMB_SEND_TO_HOST ;******************************************************* ; MOV R2,I2C_BUFFER+OFFSET_bmReqTyp ;1 ; MOV R3,I2C_BUFFER+OFFSET_bmReq ;1 ; MOV R4,I2C_BUFFER+OFFSET_wValue ;2 ;report Type is high byte and Report ID in low byte ; MOV R5,I2C_BUFFER+OFFSET_wIndex ;2 ; MOV R6,I2C_BUFFER+OFFSET_wLength ;2 ;******************************************************* EMB_CLASS_REQUEST: MOV A,R3 ;I2C_BUFFER+OFFSET_bmReq XRL A,#9 JZ SET_REPORT ;HOST SEND "SET_REPORT" COMMAND ;--- MOV A,R3 ;THIS COMMAND ONLY FOR CATC DRIVER XRL A,#01 JZ GET_REPORT ;GET VCP FEATURE FROM MONITOR ;---- EMB_C_NO_SUPPORT_REQ: LJMP EMB_NO_SUPPORT_REQ ;============================== EMB_SEND_TO_HOST: mov a,dsc_len_low ;sending 8 of remaining bytes to host clr c SUBB A,#08H mov b,a ;temporarily store low byte of length mov a,dsc_len_high subb a,#0 JC EMB_SEND01 ;check if less than 8 bytes (MaxPacketSize)? mov dsc_len_high,a ;no, greater than or equal to 8 mov dsc_len_low,b ;steply reduce byte number of yet to be sent ; jnz non_zero mov a,b jnz non_zero setb zero_byte_flag ;no data remaining for next IN token. non_zero: MOV R1,#8 MOV RW_COUNTER,#0AH ;TOTAL BYTES TO SEND AJMP EMB_SEND02 ; EMB_SEND01: mov a,dsc_len_low ;yes, store byte number to send MOV R1,A ADD A,#2 MOV RW_COUNTER,A ;TOTAL BYTES TO SEND ;----- EMB_SEND02: ;---- MOV I2C_BUFFER,#WRITE_BUFFER ;COMMAND MOV I2C_BUFFER+1,#0 ;FIRST BYTE SHOULD BE ZERO MOV I2C_BUFFER+2,R1 ;DATA LENGTH ;--- MOV R0,#I2C_BUFFER+3 ;--- EMB_SEND03: CLR A MOVC A,@A+DPTR MOV @R0,A INC R0 INC DPTR DJNZ R1,EMB_SEND03 ;--- MOV EMB_MSG_DPH,DPH MOV EMB_MSG_DPL,DPL ;--- LCALL WRITE_N_BYTE ;--- RET ; ;================================= OUT_EDID: clr zero_byte_flag mov r0,#I2C_BUFFER+OFFSET_wLength mov dsc_len_low,@r0 inc r0 mov dsc_len_high,@r0 clr c mov a,dsc_len_low subb a,#81h ;must consider an extra byte for report ID mov a,dsc_len_high subb a,#0 jc out_edid1 mov dsc_len_low,#81h ;must consider an extra byte for report ID mov dsc_len_high,#0 out_edid1: mov dptr,#EDID_DATA ajmp EMB_SEND_TO_HOST ; ;========================================= SET_REPORT: MOV A,I2C_BUFFER+OFFSET_wValue+1 ;R4+1 dec a ;is input? no meaning dec a ;is output? dec a ;is feature? jnz EMB_C_NO_SUPPORT_REQ MOV EMB_LAST_COM,#REQ_SET_FEATURE MOV DAC_CHANNEL,R4 ;report ID into DAC_CHANNEL ret ; ; ; ; ;========================================= GET_REPORT: MOV A,I2C_BUFFER+OFFSET_wValue+1 ;R4+1 XRL A,#03 ;IS IT FEATURE REPORT? JNZ EMB_C_NO_SUPPORT_REQ MOV A,R4 CJNE A,#4,CHK_SECU MOV COUNTER,#0 LJMP OUT_DATA ;----- CHK_SECU: CJNE A,#0FDH,CHK_EDID ;CHK_OSD AJMP OUT_PHILIPS ;---- CHK_EDID: CJNE A,#0F2H,CHK_OSD ajmp OUT_EDID ;---- CHK_OSD: CJNE A,#0CAH,CHK_AUTOSIZE MOV COUNTER,#2 AJMP OUT_DATA ;---- CHK_AUTOSIZE: CJNE A,#0A2H,CHK_HORIP MOV COUNTER,#1 AJMP OUT_DATA ;---- CHK_HORIP: CJNE A,#0A4H,CHK_VERTIP MOV COUNTER,#2 AJMP OUT_DATA ;---- CHK_VERTIP: CJNE A,#0A6H,CHK_SYNCT MOV COUNTER,#2 AJMP OUT_DATA ;---- CHK_SYNCT: CJNE A,#0A8H,CHK_SCREENP MOV COUNTER,#2 AJMP OUT_DATA ;---- CHK_SCREENP: CJNE A,#0AAH,CHK_HORIF MOV COUNTER,#2 AJMP OUT_DATA ;---- CHK_HORIF: CJNE A,#0ACH,CHK_VERTIF MOV I2C_BUFFER+5,#07BH MOV COUNTER,#0CH AJMP OUT_DATA1 ;---- CHK_VERTIF: CJNE A,#0AEH,CHK_BRIT MOV I2C_BUFFER+5,#17H MOV COUNTER,#070H AJMP OUT_DATA1 ;---- CHK_BRIT: CJNE A,#10H,CHK_AUTO_BRIT_CTRL MOV COUNTER,BRIT_DAC AJMP OUT_DATA CHK_AUTO_BRIT_CTRL: CJNE A,#11h,CHK_CONT mov C,BRIT_MUTE ;autoBrightness enable/disable status jc rpt_enum2 ;check default enum value mov counter,#1 ;enum1, then report enum1 ajmp out_data rpt_enum2: MOV COUNTER,#2 ;otherwise, report enum2 AJMP OUT_DATA CHK_CONT: CJNE A,#12h,CHK_RG MOV COUNTER,CONT_DAC AJMP OUT_DATA CHK_RG: CJNE A,#16H,CHK_GG MOV COUNTER,RG_DAC AJMP OUT_DATA CHK_GG: CJNE A,#18H,CHK_BG MOV COUNTER,GG_DAC AJMP OUT_DATA CHK_BG: CJNE A,#1AH,CHK_HP MOV COUNTER,BG_DAC AJMP OUT_DATA CHK_HP: CJNE A,#20H,CHK_HS MOV COUNTER,HP_DAC AJMP OUT_DATA CHK_HS: CJNE A,#22H,CHK_HPIN MOV COUNTER,HS_DAC AJMP OUT_DATA CHK_HPIN: CJNE A,#24H,CHK_HPIN_BAL MOV COUNTER,HPIN_DAC AJMP OUT_DATA CHK_HPIN_BAL: CJNE A,#26H,CHK_VP MOV COUNTER,HBAL_DAC AJMP OUT_DATA CHK_VP: CJNE A,#30H,CHK_VS MOV COUNTER,VS_DAC AJMP OUT_DATA CHK_VS: CJNE A,#32H,CHK_TZ MOV COUNTER,VS_DAC AJMP OUT_DATA CHK_TZ: CJNE A,#42H,CHK_ROT MOV COUNTER,TZ_DAC AJMP OUT_DATA CHK_ROT: CJNE A,#44H,CHK_Rb ;DAC MOV COUNTER,ROT_DAC AJMP OUT_DATA CHK_Rb: cjne a,#6ch,chk_Gb mov counter,RB_DAC ajmp out_data CHK_Gb: cjne a,#6eh,chk_bb mov counter,GB_DAC ajmp out_data CHK_Bb: cjne a,#70h,chk_clrtmp mov counter,BB_DAC ajmp out_data CHK_CLRTMP: CJNE A,#0d8h,CHK_DAC mov counter,clrtmp ;report colortemp Enum value ajmp out_data CHK_DAC: INC COUNTER ;---- OUT_DATA: MOV I2C_BUFFER+5,#00H OUT_DATA1: MOV I2C_BUFFER,#WRITE_BUFFER MOV I2C_BUFFER+1,#0 MOV I2C_BUFFER+2,#3 ;returned byte count MOV I2C_BUFFER+3,R4 ;report ID of feature MOV I2C_BUFFER+4,COUNTER ;feature data MOV RW_COUNTER,#05H LCALL WRITE_N_BYTE RET GET_VERSION: MOV COUNTER,#0 AJMP OUT_DATA ;----------- ;---- OUT_PHILIPS: MOV I2C_BUFFER,#WRITE_BUFFER MOV I2C_BUFFER+1,#0 MOV I2C_BUFFER+2,#8 MOV I2C_BUFFER+3,#0FDH MOV I2C_BUFFER+4,#50H ;'P' MOV I2C_BUFFER+5,#68H ;'h' MOV I2C_BUFFER+6,#69H ;'i' MOV I2C_BUFFER+7,#6CH ;'l' MOV I2C_BUFFER+8,#69H ;'i' MOV I2C_BUFFER+9,#70H ;'p' MOV I2C_BUFFER+10,#73H ;'s' MOV RW_COUNTER,#10 LCALL WRITE_N_BYTE RET ; ;============================== ; Interrupt transfer1 handling ;============================== EMB_ED1_INPUT: ;---- MOV I2C_BUFFER,#READ_LAST_EMBF_INT_ST ;clear interrupt register of H11A LCALL READ_ONE_BYTE ;------ MOV I2C_BUFFER,#SEL_EPT_EMBF_INT ;SELECT EMB EPT0 IN LCALL READ_ONE_BYTE MOV A,I2C_BUFFER ANL A,#1 ;IS BUFFER EMPTY? JNZ INT_RET2 ;if NOT empty,cannot fill value MOV R0,#I2C_BUFFER+1 MOV A,INT_PIPE_PKT ; CJNE A,#0,NEXT_PKT inc INT_PIPE_PKT ;cycling counter++ jb BRIT_MUTE,FST_PKT ;if autobrightness is enabled, then report brightness int_ret1: ;otherwise, NAK int_ret2: RET FST_PKT: mov a,brightness clr c subb a,BRIT_DAC ;comparing last current jnc pos_proc mov a,Brit_DAC clr c subb a,brightness pos_proc: ;at here ACC store the absolute difference clr c subb a,#4 ;+-4 tolerance jc int_ret1 ;less than to tolerance, no need report to host mov brit_dac,brightness ;update brightness if large variation exists MOV RW_COUNTER,#5 ;TOTAL BYTES except command byte TO SEND MOV @R0,#0 ;FIRST BYTE SHOULD BE ZERO INC R0 MOV @R0,#3 ;DATA LENGTH inc r0 MOV @r0,#10H ;REPORT ID inc r0 MOV @r0,BRIT_DAC ;the brightness data inc r0 MOV @r0,#00 ;high byte of brightness ACALL INT_WRITE_TO_H11 MOV R3,brightness ;write monitor MOV R2,#10H ; brightness report ID ACALL OUT_DDC2B_1 ; send data to monitor ret ; NEXT_PKT: CJNE A,#1,THIRD_PKT inc INT_PIPE_PKT ;cycling counter++ CLR KB_MTX_1_CLM ;BIT P2.4 SETB KB_MTX_2_CLM ;BIT P2.3 SETB KB_MTX_3_CLM ;BIT P2.2 mov r7,#20 cntr_lp: djnz r7,cntr_lp MOV A,P2 CPL A ANL A,#01100000b jnz cntr_KY_PRD cntr_ret: cntr_ret1: ret cntr_KY_PRD: cjne a,#20h,cntr_dn mov a,cont_dac cpl a jnz inc_cont ;not reach #0ff, increment 1, ajmp cntr_ret ;otherwise, stay at the maximum,do nothing inc_cont: mov r7,#4 ;4 times of contrast++ until reach upper limit cntr_inc_loop: mov a,cont_dac inc a mov cont_dac,a cpl a jz cntr_snd djnz r7,cntr_inc_loop ajmp cntr_snd cntr_dn: cjne a,#40h,cntr_ret mov a,cont_dac jnz dec_cont ;not reach 0, decrement 1 ajmp cntr_ret ;otherwise, stay at minimum,do nothing dec_cont: mov r7,#4 ;4 times of contrast-- until reach zero cntr_dec_loop: mov a,cont_dac dec a mov cont_dac,a jz cntr_snd djnz r7,cntr_dec_loop cntr_snd: MOV RW_COUNTER,#5 ;TOTAL BYTES except command byte TO SEND MOV @r0,#0 ;FIRST BYTE SHOULD BE ZERO inc r0 MOV @r0,#3 ;DATA LENGTH inc r0 MOV @r0,#12H ;REPORT ID inc r0 MOV @r0,CONT_DAC ;the contrast data inc r0 MOV @r0,#00 ;high byte of contrast Acall INT_WRITE_TO_H11 MOV R3,CONT_DAC MOV R2,#12H ACALL OUT_DDC2B_1 ret ; THIRD_PKT: CJNE A,#2,FOURTH_PKT inc INT_PIPE_PKT ;cycling counter++ CLR KB_MTX_1_CLM ;BIT P2.4 SETB KB_MTX_2_CLM ;BIT P2.3 SETB KB_MTX_3_CLM ;BIT P2.2 mov r7,#20 menu_htky_lp: djnz r7,menu_htky_lp MOV A,P2 CPL A ANL A,#10000000b jnz menu_KY_PRD MOV C,HTKY_LAST_STATE clr HTKY_LAST_STATE jc menu1 htky_NAK: ret menu1: clr HOTKEY ajmp menu_send menu_KY_PRD: mov c,HTKY_LAST_STATE setb HTKY_LAST_STATE jnc menu2 ajmp htky_NAK menu2: SETB HOTKEY ;set vol_up bitmap of audioctrl menu_send: MOV RW_COUNTER,#4 ;TOTAL BYTES except command byte TO SEND MOV @r0,#0 ;FIRST BYTE SHOULD BE ZERO inc r0 MOV @r0,#2 ;DATA LENGTH inc r0 MOV @r0,#41H ;REPORT ID inc r0 mov a,APPLET_MENU_CTRL ;the HOTKEY status byte for popping up Menu anl a,#01h MOV @r0,a AJMP INT_WRITE_TO_H11 ; FOURTH_PKT: mov INT_PIPE_PKT,#0 ;reset the cycling counter value CJNE A,#3,gp_NAK SETB KB_MTX_1_CLM ;BIT P2.3 SETB KB_MTX_2_CLM ; CLR KB_MTX_3_CLM ; mov r7,#20 gp_lp: djnz r7,gp_lp MOV A,P2 CPL A ANL A,#0E0H jnz gp_KY_PRD mov a,GPCTRL clr GP1_LAST_STATE clr GP2_LAST_STATE clr GP3_LAST_STATE anl a,#00111000b jz gp_NAk clr GP1 clr GP2 clr GP3 ajmp gp_snd gp_NAK: ret gp_KY_PRD: cjne a,#20h,KEY_8 mov c,GP1_LAST_STATE setb GP1_LAST_STATE jnc mute_gp1 ajmp gp_NAK mute_gp1: setb gp1 ;set function control1 bitmap of GPCTRL clr gp2 clr gp3 ajmp gp_snd KEY_8: cjne a,#40h,KEY_9 mov c,GP2_LAST_STATE setb GP2_LAST_STATE jnc mute_gp2 ajmp gp_NAK mute_gp2: setb gp2 ;set function control2 bitmap of GPCTRL clr gp1 clr gp3 ajmp gp_snd KEY_9: cjne a,#80h,gp_NAK mov c,GP3_LAST_STATE setb GP3_LAST_STATE jnc mute_gp3 ajmp gp_NAK mute_gp3: setb gp3 ;set function control3 bitmap of GPCTRL clr gp1 clr gp2 ; ajmp gp_snd gp_snd: MOV RW_COUNTER,#5 ;TOTAL BYTES except command byte TO SEND MOV @r0,#0 ;FIRST BYTE SHOULD BE ZERO inc r0 MOV @r0,#3 ;DATA LENGTH inc r0 MOV @r0,#37H ;REPORT ID inc r0 mov a,GPCTRL ;the low byte of general purpose button status anl a,#00000111b MOV @r0,a inc r0 MOV @r0,#0 ;high byte of it AJMP INT_WRITE_TO_H11 ; ;==================================== ; Interrupt transfer2 handling ;==================================== EMB_ED2_INPUT: ;---- MOV I2C_BUFFER,#READ_LAST_EMBF_INT2_ST ;clear interrupt register of H11A LCALL READ_ONE_BYTE ;------ MOV I2C_BUFFER,#SEL_EPT_EMBF_INT2 ;SELECT EMB EPT0 INt2 LCALL READ_ONE_BYTE ; MOV A,I2C_BUFFER ANL A,#1 ;IS BUFFER EMPTY? JNZ audio_NAK ;if NOT empty, cannot fill value into FIFO MOV R0,#I2C_BUFFER+1 ; SETB KB_MTX_1_CLM ;BIT P2.3 CLR KB_MTX_2_CLM ; SETB KB_MTX_3_CLM ; mov r7,#20 audio_lp: djnz r7,audio_lp MOV A,P2 CPL A ANL A,#0E0H JNZ Audio_KY_PRD ; clr vol_up ;clear vol_up clr vol_dn ;clear vol_down MOV C,MUTE_LAST_STATE clr MUTE_LAST_STATE jc mute1 audio_NAK: ret mute1: clr MUTE ajmp audio_send Audio_KY_PRD: cjne a,#20h,KEY_5 SETB VOL_UP ;set vol_up bitmap of audioctrl AJMP audio_send KEY_5: cjne a,#40h,KEY_6 SETB VOL_DN ;set vol_down bitmap of audioctrl AJMP audio_send KEY_6: cjne a,#80h,audio_nak mov c,MUTE_LAST_STATE setb MUTE_LAST_STATE jnc mute2 ajmp audio_NAK mute2: setb MUTE audio_send: MOV RW_COUNTER,#4 ;TOTAL BYTES except command byte TO SEND MOV @r0,#0 ;FIRST BYTE SHOULD BE ZERO inc r0 MOV @r0,#1 ;DATA LENGTH inc r0 mov a,AUDIOCTRL anl a,#07h MOV @r0,a ;the audio control key status ; INT_WRITE_TO_H11: ; MOV SLV_ADR,#036H ;WRITE COMMAND MOV CNT_BYTE,#1 ;NUMBER OF BYTES TO BE SENT MOV R0,#I2C_BUFFER ;point to i2c buffer mov @r0,#WRITE_BUFFER ;write command(write buffer) LCALL WRITE_H11 ;write command first ;---------- MOV SLV_ADR,#034H ;write data MOV CNT_BYTE,RW_COUNTER LCALL WRITE_H11 ;----- MOV I2C_BUFFER,#VALIDATE_BUF ;validate FIFO LCALL WRITE_COMMAND ; int_ret: ret ;---------------------------------------- ;---- INIT_DDC2B: ;----- MOV I2C_BUFFER,#06EH MOV I2C_BUFFER+1,#050H MOV I2C_BUFFER+2,#081H MOV I2C_BUFFER+3,#0F0H ;------ MOV A,I2C_BUFFER MOV R0,I2C_BUFFER+1 XRL A,R0 MOV R0,I2C_BUFFER+2 XRL A,R0 MOV R0,I2C_BUFFER+3 XRL A,R0 MOV I2C_BUFFER+4,A MOV I2C_COUNTER,#5 ACALL DO_IIC RET ;-------------- ; clrtmp_sl: mov clrtmp,R3 ;store the enum value ; mov a,clrtmp dec a jnz clrtmp_sl1 ajmp sl_usr ;enum1 clrtmp_sl1: dec a jnz clrtmp_sl2 mov dptr,#ct5000k ;enum2 ajmp clrtmp_com clrtmp_sl2: dec a jnz clrtmp_sl3 mov dptr,#ct5500k ;enum3 ajmp clrtmp_com clrtmp_sl3: dec a jnz clrtmp_sl4 mov dptr,#ct6500k ;enum4 ajmp clrtmp_com clrtmp_sl4: dec a jnz clrtmp_sl5 mov dptr,#ct7500k ;enum5 ajmp clrtmp_com clrtmp_sl5: dec a jnz clrtmp_nak mov dptr,#ct9300k ;enum6 clrtmp_com: ;adjustment event of parameter values clr a movc a,@a+dptr mov RG_DAC,a acall CK_RG ; inc dptr clr a movc a,@a+dptr mov GG_DAC,a acall CK_GG ; inc dptr clr a movc a,@a+dptr mov BG_DAC,a acall CK_BG ; inc dptr clr a movc a,@a+dptr mov RB_DAC,a acall CK_RB ; inc dptr clr a movc a,@a+dptr mov GB_DAC,a acall CK_GB ; inc dptr clr a movc a,@a+dptr mov BB_DAC,a acall CK_BB ; inc dptr clr a movc a,@a+dptr mov CONT_DAC,a acall CK_CONT ; inc dptr clr a movc a,@a+dptr mov BRIT_DAC,a acall OUT_DDC2B clrtmp_nak: sl_usr: ret ;-------------- DEG_FUNC: MOV R2,#00 AJMP OUT_DDC2B ;--------------- VESA_COMMAND: MOV A,R3 XRL A,#1 JZ CURRENT_SETTING MOV A,R3 XRL A,#2 JZ RESTORE_FACTORY MOV A,R3 XRL A,#3 JZ RESTORE_SAVED RET ;------ RESTORE_FACTORY: MOV R2,#04 MOV R3,#00 AJMP OUT_DDC2B ;------ RESTORE_SAVED: MOV R2,#0B2H MOV R3,#00 AJMP OUT_DDC2B ;------ CURRENT_SETTING: MOV R2,#0B0H MOV R3,#00 AJMP OUT_DDC2B ; BRIG_LED_MUTE: mov a,I2C_BUFFER+3 cjne a,#1,ck_enum2 clr BRIT_MUTE ;enum1, then disable autobrightness ret ck_enum2: cjne a,#2,no_support setb brit_mute ;enum2, enable autobrightness no_support: ret ; clr_sl: ajmp clrtmp_sl ;--------------------------------------- SET_DAC_DATA: MOV R3,I2C_BUFFER+3 ;load low-byte of values ;--- MOV R2,DAC_CHANNEL ;load report ID mov a,r2 xrl a,#11h ;is autobrightness enable/disable control(report ID=11H)? jz BRIG_LED_MUTE MOV A,R2 XRL A,#01H JZ DEG_FUNC MOV A,R2 XRL A,#0B0H JZ VESA_COMMAND mov a,r2 xrl a,#0d8h ;directly update color temperature. jz clr_sl ; ;------------------ ; OUT_DDC2B: MOV A,R2 XRL A,#10H JNZ CK_CONT mov clrtmp,#1 ;update brightness. indirectly update color temp to user mode MOV BRIT_DAC,R3 AJMP OUT_DDC2B_1 ;----- CK_CONT: MOV A,R2 XRL A,#12H JNZ CK_RG mov clrtmp,#1 ;update contrast. indirectly update color temp to user mode MOV CONT_DAC,R3 AJMP OUT_DDC2B_1 ;----- CK_RG: MOV A,R2 XRL A,#16H JNZ CK_GG mov a,r3 xrl a,RG_DAC jz CK_RG1 mov clrtmp,#1 ;update red color. indirectly update color temp to user mode MOV RG_DAC,R3 CK_RG1: AJMP OUT_DDC2B_1 ;----- CK_GG: MOV A,R2 XRL A,#18H JNZ CK_BG mov a,r3 xrl a,GG_DAC jz CK_GG1 mov clrtmp,#1 ;update green color. indirectly update color temp to user mode MOV GG_DAC,R3 CK_GG1: AJMP OUT_DDC2B_1 ;----- CK_BG: MOV A,R2 XRL A,#1AH JNZ CK_HP mov a,r3 xrl a,BG_DAC jz CK_BG1 mov clrtmp,#1 ;update blue color. indirectly update color temp to user mode MOV BG_DAC,R3 CK_BG1: AJMP OUT_DDC2B_1 ;----- CK_HP: MOV A,R2 XRL A,#20H JNZ CK_HS MOV HP_DAC,R3 AJMP OUT_DDC2B_1 ;----- CK_HS: MOV A,R2 XRL A,#22H JNZ CK_HPIN MOV HS_DAC,R3 AJMP OUT_DDC2B_1 ;----- CK_HPIN: MOV A,R2 XRL A,#24H JNZ CK_HPIN_BAL MOV HPIN_DAC,R3 AJMP OUT_DDC2B_1 ;----- CK_HPIN_BAL: MOV A,R2 XRL A,#26H JNZ CK_VP MOV HBAL_DAC,R3 AJMP OUT_DDC2B_1 ;----- CK_VP: MOV A,R2 XRL A,#30H JNZ CK_VS MOV VS_DAC,R3 AJMP OUT_DDC2B_1 ;----- CK_VS: MOV A,R2 XRL A,#32H JNZ CK_TZ MOV VS_DAC,R3 AJMP OUT_DDC2B_1 ;----- CK_TZ: MOV A,R2 XRL A,#42H JNZ CK_ROT MOV TZ_DAC,R3 AJMP OUT_DDC2B_1 ;----- CK_ROT: MOV A,R2 XRL A,#44H JNZ ck_rb ;OUT_DDC2B_1 MOV ROT_DAC,R3 ajmp out_ddc2b_1 ;----- CK_Rb: MOV A,R2 XRL A,#6cH JNZ ck_gb mov a,r3 xrl a,RB_DAC jz CK_RB1 mov clrtmp,#1 ;update red black level. indirectly update color temp to user mode MOV RB_DAC,R3 CK_RB1: ajmp out_ddc2b_1 ;----- CK_gb: MOV A,R2 XRL A,#6eH JNZ ck_bb mov a,r3 xrl a,GB_DAC jz CK_GB1 mov clrtmp,#1 ;update green black level. indirectly update color temp to user mode MOV GB_DAC,R3 CK_GB1: ajmp out_ddc2b_1 ;----- CK_bb: MOV A,R2 XRL A,#70H JNZ OUT_DDC2B_1 mov a,r3 xrl a,BB_DAC jz OUT_DDC2B_1 mov clrtmp,#1 ;update blue black level. indirectly update color temp to user mode MOV BB_DAC,R3 ;----- OUT_DDC2B_1: MOV I2C_BUFFER,#06EH MOV I2C_BUFFER+1,#050H MOV I2C_BUFFER+2,#084H MOV I2C_BUFFER+3,#3 ;byte MOV I2C_BUFFER+4,R2 ;report ID MOV I2C_BUFFER+5,#00H ;DAC HIGH BYTE MOV I2C_BUFFER+6,R3 ;DAC LOW BYTE ;------ MOV A,I2C_BUFFER MOV R0,I2C_BUFFER+1 XRL A,R0 MOV R0,I2C_BUFFER+2 XRL A,R0 MOV R0,I2C_BUFFER+3 XRL A,R0 MOV R0,I2C_BUFFER+4 XRL A,R0 MOV R0,I2C_BUFFER+5 XRL A,R0 MOV R0,I2C_BUFFER+6 XRL A,R0 MOV I2C_BUFFER+7,A MOV I2C_COUNTER,#8 ACALL DO_IIC RET ;=============================== DO_IIC: MOV R0,#I2C_BUFFER ;SET FIRST RECEIVE DATA BUFFER ADDRESS MOV BYTE_CNT,I2C_COUNTER ;---- ACALL HW_GOMASTER ;ACQUIRE BUS AND SEND SLAVE ADDRESS. JB I2C_FAIL,WR_NOK ;CHECK FOR SLAVE NOT RESPONDING. ;----- WR_DATA_LOOP: MOV A,@R0 ;GET DATA BYTE FROM BUFFER. ACALL HW_SEND_BYTE ;SEND NEXT DATA BYTE. INC R0 ;ADVANCE BUFFER POINTER. JB I2C_FAIL,WR_NOK ;CHECK FOR SLAVE NOT RESPONDING. DJNZ BYTE_CNT,WR_DATA_LOOP ;ALL BYTES SENT? WR_NOK: WR_OK: ACALL HW_SEND_STOP ;DONE, SEND AN I2C STOP. RET ;---------------------- HW_GOMASTER: CLR I2C_FAIL ;CLEAR ERROR STATUS FLAGS. ;--- JNB HWSCL,HW_FAULT ;CHECK FOR BUS CLEAR. JNB HWSDA,HW_FAULT CLR HWSDA ;BEGIN I2C START. ACALL BITDLY CLR HWSCL ;;; ACALL BITDLY ;COMPLETE I2C START. ;;; MOV A,#06EH ;GET SLAVE ADDRESS. ;;; ACALL HW_SEND_BYTE ;SEND SLAVE ADDRESS. RET ;------------- HW_FAULT: SETB I2C_FAIL ;SET FAULT STATUS RET ;AND EXIT. ;------------- HW_BITDLY: RET ;NOPS TO DELAY 5 MICROSECONDS (MINUS 4 ;======================================== HW_SEND_BYTE: MOV BITCNT,#8 ;SET BIT COUNT. HW_SBLOOP: RLC A ;SEND ONE DATA BIT. MOV HWSDA,C ;PUT DATA BIT ON PIN. ACALL HW_SCLHIGH ;SEND CLOCK. ACALL BITDLY CLR HWSCL ACALL BITDLY DJNZ BITCNT,HW_SBLOOP ;REPEAT UNTIL ALL BITS SENT. SETB HWSDA ;RELEASE DATA LINE FOR ACKNOWLEDGE. ACALL HW_SCLHIGH ;SEND CLOCK FOR ACKNOWLEDGE. ACALL BITDLY JNB HWSDA,HW_SBEX ;CHECK FOR VALID ACKNOWLEDGE BIT. SETB I2C_FAIL ;SET STATUS FOR NO ACKNOWLEDGE. HW_SBEX: CLR HWSCL ;FINISH ACKNOWLEDGE BIT. ACALL BITDLY RET ;======================================= HW_SCLHIGH: SETB HWSCL ;Set SCL from our end. JNB HWSCL,$ ;Wait for pin to actually go high. RET ;----------------------------------- HW_SEND_STOP: CLR HWSDA ;Get SDA ready for stop. ACALL HW_SCLHIGH ;SET CLOCK FOR STOP. ACALL BITDLY SETB HWSDA ;SEND I2C STOP. ACALL BITDLY RET ;BUS SHOULD NOW BE RELEASED. ;================================= READ_FROM_H11: MOV SLV_ADR,#036H ;WRITE COMMAND MOV CNT_BYTE,#1 ;NUMBER OF BYTES TO BE SENT LCALL WRITE_H11_POINT ;READ 1 BYTES ;----- MOV SLV_ADR,#035H ;READ DATA MOV CNT_BYTE,RW_COUNTER ACALL READ_H11 RET ;--------------------------------------- ; WRITE DATA INTO ENDPOINT 0 INPUT ;--------------------------------------- WRITE_TO_H11: ;----------- CLR VALIDATE_FLAG ;IS WRITE BUFFER COMMAND? MOV A,I2C_BUFFER XRL A,#WRITE_BUFFER JNZ WRITE_TO_H11_1 SETB VALIDATE_FLAG ;----------- JB SEL_EPT_FLAG,SEL_EMB_BUFFER ;OUTPUT TO EMBEDDED BUFFER ;----------- MOV I2C_BUFFER,#SEL_EPOINT_0_IN AJMP SEL_EPT_COMMAND SEL_EMB_BUFFER: MOV I2C_BUFFER,#SEL_EPT_EMBF_IN ;SELECT EMBED IN BUFFER SEL_EPT_COMMAND: LCALL WRITE_COMMAND MOV I2C_BUFFER,#WRITE_BUFFER ;----------- WRITE_TO_H11_1: MOV SLV_ADR,#036H ;WRITE COMMAND MOV CNT_BYTE,#1 ;NUMBER OF BYTES TO BE SENT ACALL WRITE_H11_POINT ;READ 1 BYTES ;---------- MOV SLV_ADR,#034H ;WRITE DATA MOV CNT_BYTE,RW_COUNTER ACALL WRITE_H11 ;----- JNB VALIDATE_FLAG,WRITE_RET ;ONLY WRITE BUFFER NEED VALIDATE BUFFER MOV I2C_BUFFER,#VALIDATE_BUF ;READY DATA TO SEND LCALL WRITE_COMMAND ;---- WRITE_RET: RET ;---------------------------------------- ;*************************************************************** ;* Function = Read_H11 ;* Input = SlvAdr (H11 slave address); ;* CNT_Byte (Number of Bytes to be sent); ;* ;* Return = I2C_BUFFER Buffer ;* Change = R0,R3 ;**************************************************************** READ_H11: MOV BYTE_CNT,CNT_BYTE ;---- ACALL GOMASTER ;ACQUIRE BUS AND SEND SLAVE ADDRESS. JB I2C_FAIL,READ_NOK ;CHECK FOR SLAVE NOT RESPONDING. ;--- MOV R0,#I2C_BUFFER ;SET FIRST RECEIVE DATA BUFFER ADDRESS READ_DATA_LOOP: ACALL RCV_BYTE ;RECEIVE DATA BYTE MOV @R0,A ;PUT RECEIVED DATA TO BUFFER INC R0 ;PREPARE NEXT BYTE DJNZ BYTE_CNT,READ_DATA_LOOP ;REPEAT UNTIL ALL BYTES RECEIVED READ_NOK: READ_OK: ACALL SEND_STOP ;DONE, SEND AN I2C STOP. RET ;======================================== RCV_BYTE: MOV BITCNT,#8 ;SET BIT COUNT. RCV_LOOP: ACALL SCLHIGH ;READ ONE DATA BIT. ACALL BITDLY MOV C,SDAPIN ;GET DATA BIT FROM PIN. RLC A ;ROTATE BIT INTO RESULT BYTE. CLR SCLPIN ACALL BITDLY DJNZ BITCNT,RCV_LOOP ;REPEAT UNTIL ALL BITS RECEIVED. ;--- PUSH ACC ;SAVE ACCUMULATOR MOV A,BYTE_CNT CJNE A,#1,SRBACK ;CHECK FOR LAST BYTE OF FRAME. SETB SDAPIN ;SEND NO ACKNOWLEDGE ON LAST BYTE. SJMP SRBACLK ;NO ACK WHEN IT'S LAST BYTE ;---- SRBACK: CLR SDAPIN ;SEND ACKNOWLEDGE BIT. SRBACLK: ACALL SCLHIGH ;SEND ACKNOWLEDGE CLOCK. POP ACC ;RESTORE ACCUMULATOR ACALL BITDLY CLR SCLPIN SETB SDAPIN ;CLEAR ACKNOWLEDGE BIT. ACALL BITDLY RET ;**************************************************************************** ;* Function = WRITE_H11 ;* Input = SLV_ADR (H11 SLAVE ADDRESS) ;* SUB_ADR (H11 COMMAND); ;* CNT_Byte (Number of Bytes to be sent); ;* @I2C_BUFFER (Output Buffer, Data to be sent, starts from RAM ;* location sI2C_BUFFER) ;* Return = None ;* Change = R0,R3 ;***************************************************************************** WRITE_H11_POINT: MOV R0,#I2C_BUFFER ;SET FIRST RECEIVE DATA BUFFER ADDRESS WRITE_H11: MOV BYTE_CNT,CNT_BYTE ;---- ACALL GOMASTER ;ACQUIRE BUS AND SEND SLAVE ADDRESS. JB I2C_FAIL,WRITE_NOK ;CHECK FOR SLAVE NOT RESPONDING. ;----- ;;; MOV R0,#I2C_BUFFER ;SET FIRST RECEIVE DATA BUFFER ADDRESS WRITE_DATA_LOOP: MOV A,@R0 ;GET DATA BYTE FROM BUFFER. ACALL SEND_BYTE ;SEND NEXT DATA BYTE. INC R0 ;ADVANCE BUFFER POINTER. JB I2C_FAIL,WRITE_NOK ;CHECK FOR SLAVE NOT RESPONDING. DJNZ BYTE_CNT,WRITE_DATA_LOOP ;ALL BYTES SENT? WRITE_NOK: WRITE_OK: ACALL SEND_STOP ;DONE, SEND AN I2C STOP. RET ;======================================== ; SEND SLAVE ADDRESS TO H11 ;---------------------------------------- GOMASTER: CLR I2C_FAIL ;CLEAR ERROR STATUS FLAGS. ;--- JNB SCLPIN,FAULT ;CHECK FOR BUS CLEAR. JNB SDAPIN,FAULT CLR SDAPIN ;BEGIN I2C START. ACALL BITDLY CLR SCLPIN ACALL BITDLY ;COMPLETE I2C START. MOV A,SLV_ADR ;GET SLAVE ADDRESS. ACALL SEND_BYTE ;SEND SLAVE ADDRESS. RET ;------------- FAULT: SETB I2C_FAIL ;SET FAULT STATUS RET ;AND EXIT. ;------------- BITDLY: RET ;NOPS TO DELAY 5 MICROSECONDS (MINUS 4 ;======================================== SEND_BYTE: MOV BITCNT,#8 ;SET BIT COUNT. SBLOOP: RLC A ;SEND ONE DATA BIT. MOV SDAPIN,C ;PUT DATA BIT ON PIN. ACALL SCLHIGH ;SEND CLOCK. ACALL BITDLY CLR SCLPIN ACALL BITDLY DJNZ BITCNT,SBLOOP ;REPEAT UNTIL ALL BITS SENT. SETB SDAPIN ;RELEASE DATA LINE FOR ACKNOWLEDGE. ACALL SCLHIGH ;SEND CLOCK FOR ACKNOWLEDGE. ACALL BITDLY JNB SDAPIN,SBEX ;CHECK FOR VALID ACKNOWLEDGE BIT. SETB I2C_FAIL ;SET STATUS FOR NO ACKNOWLEDGE. SBEX: CLR SCLPIN ;FINISH ACKNOWLEDGE BIT. ACALL BITDLY RET ;======================================= SCLHIGH: SETB SCLPIN ;Set SCL from our end. JNB SCLPIN,$ ;Wait for pin to actually go high. RET ;----------------------------------- SEND_STOP: CLR SDAPIN ;Get SDA ready for stop. ACALL SCLHIGH ;SET CLOCK FOR STOP. ACALL BITDLY SETB SDAPIN ;SEND I2C STOP. ACALL BITDLY RET ;BUS SHOULD NOW BE RELEASED. ;--- DELAY_20MS: MOV R7,#20 AJMP DELAY_1MS ;======================================== DELAY_100MS: MOV R7,#100 ;---- DELAY_1MS: MOV A,#165 ;(165*3+2+1)*1=498us DY: NOP NOP NOP DEC A JNZ DY DJNZ R7,DELAY_1MS DY_RET: RET ; ;---------------------------------------------------------------------------- ; ADC process with RC ;---------------------------------------------------------------------------- A2D: jb BRIT_MUTE,adc ;auto-brightness is defaultly disable ret adc: JNB GATINGPIN,NOT_COUNTING ;High P3.2 shows CAP is being charged, not ;arrive the threshold(2.0V) JB TF0,OVFLOW1 ;timer0 is overflow, should stop and restart ;restart counting AJMP A2D_RTRN ;in charging before arriving threshold NOT_COUNTING: JB TF0,OVFLOW ;timer0 is overflow, restart MOV A,TH0 CPL A AJMP store_brit OVFLOW1: CLR TR0 ; stop counting OVFLOW: MOV A,#0 ; overflow shows in the darkest ambient light store_brit: MOV BRIGHTNESS,A ; store brightness CLR TR0 ;stop counting CLR DISCHARGE ;discharge CAP, brit_dl: MOV 08H,#10 ;delay 10*2 us DJNZ 09H,brit_dl ;delay to ensure CAP be fully discharged MOV TH0,#0 ;clear counter current content of timer0 MOV TL0,#0 CLR TF0 ;software clear counter of timer0 overflow flag SETB DISCHARGE ;and begin charging CAP SETB TR0 ;re_ensure timer0 work be controlled only by external ;P3.2/INT0 pin, because right now, P3.2/INT0 is high, so ;this instruction begin hardware counting again A2D_RTRN: RET ; ;------------ ; ORG 0E00H ;**************************** ;* STANDARD DEVICE DESCRIPTOR ;**************************** STAND_DEV_DESC: DB 12h ;0 bLength DB 01h ;1 bDescriptorType DB 00h ; DB 01h ;2-3 version 1.00 USB spec Word DB 09h ;4 Class DB 01h ;5 bDeviceSubClass DB 00h ;6 bDeviceProtocol DB 08h ;7 bMaxPacketSize0 DW 7104h ;8-9 idVendor DW 0102h ;a-b idProduct DW 4000h ;c-d bcdDevice DB 00h ;e iManufacturer DB 00h ;f iProduct DB 00h ;10 iSerialNumber DB 01h ;11 bNumConfigurations CONFIG_DESC: DB 09h ;0 DB 02h ;1 DW 1900h ;2-3 DB 01h ;4 DB 01h ;5 DB 00h ;6 DB 60h ;7 DB 05h ;8 10mA INTERFACE_DESC: DB 09h ;0 DB 04h ;1 DB 00h ;2 DB 00h ;3 DB 01h ;4 DB 09h ;5 DB 01h ;6 DB 00h ;7 DB 00h ;8 ENDP1_INT_DESC: DB 07h ;0 DB 05h ;1 DB 81h ;2 DB 03h ;3 DW 0100h ;4-5 DB 0ffh ;6 ;**************** ;* HUB DECRIPTOR ;**************** HUB_DESC: DB 09h ; 0 DB 29h ; standard HUB descriptortype = 0 DB 05h ; 5 downstreamports DB 04H ; D4D3=00 D2=1 D1D0=0 DB 00h ; D15--D5=0 DB 30h ; 48 msec DB 0Ah ; 10 mA DB 02h ; B7--B4=0 B3-B0=0 DB 02h ; ;********************** ; H12 HUB DESCRIPTOR ;********************** HUB_DESC_H12: DB 09H ; 0 DB 29H ; STANDARD HUB DESCRIPTORTYPE = 0 DB 03H ; 3 DOWNSTREAMPORTS DB 04H ; D4D3=00 D2=1 D1D0=0 DB 00H ; D15--D5=0 DB 30H ; 48 MSEC DB 0AH ; 10 MA DB 02H ; B7--B4=0 B3-B0=0 DB 02H ; ;**************************** ;* STANDARD DEVICE DESCRIPTOR ;**************************** EMB_STAND_DEV_DESC: DB 12H ;0 BLENGTH DB 01H ;1 BDESCRIPTORTYPE DB 00H ; DB 01H ;2-3 VERSION 1.00 USB SPEC WORD DB 00H ;;04H ;4 CLASS DB 00H ;;01H ;5 BDEVICESUBCLASS DB 00H ;;0FFH ;6 BDEVICEPROTOCOL DB 08H ;7 BMAXPACKETSIZE0 DB 71H,04H ;8-9,IDVENDOR DB 00H,00H ;00H,00H ;A-B,IDPRODUCT DB 00H,00H ;C-D,BCDDEVICE DB 00H ;E IMANUFACTURER DB 00H ;F IPRODUCT DB 00H ;10 ISERIALNUMBER DB 01H ;11 BNUMCONFIGURATIONS EMB_CONFIG_DESC: DB 09H ;0 DB 02H ;1 DB CONF_LENGTH ;configuration length DB 00h ; DB 01H ;only one interface DB 02H ;TWO INTERFACES DB 01H ;5 DB 00H ;6 DB 0C0H ;7 DB 32H ;8 EMB_INTERFACE_DESC: DB 09H ;0 DB 04H ;1 DB 00H ;2, No.0 interface DB 00H ;3 DB 01H ;4 DB 03H ;5 DB 01H ;6 DB 00H ;7 DB 00H ;8 EMB_HID_DESC: DB 09H ;DESCRIPTOR LENGTH DB 21H ;DESCRIPTOR TYPE DB 00H ; DB 01H DB 00H DB 01H DB 22H ; DW REPORT_LENGTH ;REPORT LENGTH ; dB 0H db rpt_len_low ;report length db rpt_len_high EMB_ENDP1_INT_DESC: DB 07H ;0 DB 05H ;1 DB 81H ;2 DB 03H ;3 DB 8,0 ;4-5 DB 0ffH ;255 ms ;-------------------------- EMB_INTERFACE1_DESC: DB 09H ;0 DB 04H ;1 DB 01H ;2 No.1 INTERFACE DB 00H ;3 DB 01H ;4 DB 03H ;5 DB 01H ;6 DB 00H ;7 DB 00H ;8 ; EMB_HID1_DESC: DB 09H DB 21H DW 100H DB 00H DB 01H DB 22H Db REPORT1_LENGTH ;REPORT LENGTH DB 0H EMB_ENDP1_INT_DESC1: DB 07H ;0 DB 05H ;1 DB 82H ;2, ENDPOINT ADDRESS DB 03H ;3, INTERRUPT DB 8,0 ;4-5 DB 0ffh ;255 ms ;========================================== EMB_REPORT_DESC: DB 05H,080H ;USAGE PAGE( MONITOR) DB 09H,01H ;USAGE ( MONITOR CONTROL) DB 0A1H,01H ;COLLECTION( APPLICATION) DB 15H,00H ;LOGICAL MINIMUM(0) DB 26H,0FFH,00 ;LOGICAL MAXIMUM(255) ;---- db 75h,08h ;repor_size( 8 bits) db 95h,80h ;report_count(128 bytes) db 85h,0f2h ;report_id (0xf2) db 09h,02h ;usage(EDID information) DB 0B2H,02H,01 ;FEATURE ( DATA,VAR,ABS,BUF) ;---- ; DB 75H,08 ;REPORT SIZE( 8 BYTES) DB 95H,07H ;REPORT COUNTER ( 7) DB 85H,0FDH ;REPORT ID ( FD) DB 09H,0FDH ;USAGE ( FD) DB 0B2H,02H,01 ;FEATURE ( DATA,VAR,ABS,BUF) ;---- DB 05H,082H ;USAGE_PAGE ( VESA VIRTUAL CONTROL) DB 75H,10H ;REPORT SIZE( 16 BIT) DB 95H,01H ;REPORT COUNTER( 1 BYTES) ;---- DB 85H,01H ;REPORT ID( 1H) DB 09H,01H ;USGAE ( DEGAUSS) DB 0B1H,02H ;FEATURE ( DATA,VAR,ABS) ;---- DB 85H,10H ;REPORT ID( 10H) DB 09H,10H ;USGAE ( BRIGHTNESS) DB 0B1H,02H ;FEATURE ( DATA,VAR,ABS) ; DB 09H,10H ;USAGE ( BRIGHTNESS) DB 81H,02H ;INPUT ( DATA, VAR,ABS) ;---- DB 85H,12H ;REPORT ID( 12H) DB 09H,12H ;USGAE ( CONTRAST) DB 0B1H,02H ;FEATURE ( DATA,VAR,ABS) ; DB 09H,12H ;USAGE ( CONTRAST) DB 81H,02H ;INPUT (DATA,VAR,ABS) ;CONTRAST UP/DOWN ;---- DB 85H,16H ;REPORT ID( 16H) DB 09H,16H ;USGAE ( R GAIN) DB 0B1H,02H ;FEATURE ( DATA,VAR,ABS) ;---- DB 85H,18H ;REPORT ID( 18H) DB 09H,18H ;USAGE ( G GAIN) DB 0B1H,02H ;FEATURE ( DATA,VAR,ABS) ;---- DB 85H,1AH ;REPORT ID( 1AH) DB 09H,1AH ;USAGE ( B GAIN) DB 0B1H,02H ;FEATURE ( DATA,VAR,ABS) ;---- DB 85H,20H ;REPORT ID( 20H) DB 09H,20H ;USAGE ( HORIZONTAL POSITION) DB 0B1H,02H ;FEATURE ( DATA,VAR,ABS) ;---- DB 85H,22H ;REPORT ID( 22H) DB 09H,22H ;USAGE ( HORIZONTAL SIZE) DB 0B1H,02H ;FEATURE ( DATA,VAR,ABS) ;---- DB 85H,30H ;REPORT ID( 30H) DB 09H,30H ;USAGE ( VERTICAL POSITION) DB 0B1H,02H ;FEATURE ( DATA,VAR,ABS) ;---- DB 85H,32H ;REPORT ID( 32H) DB 09H,32H ;USAGE ( VERTICAL SIZE) DB 0B1H,02H ;FEATURE ( DATA,VAR,ABS) ;---- DB 85H,6eH ;REPORT ID( 6eH) DB 09H,6eH ;USAGE ( GREEN BLACK LEVEL) DB 0B1H,02H ;FEATURE ( DATA,VAR,ABS) ;---- DB 85H,6cH ;REPORT ID( 6cH) DB 09H,6cH ;USAGE ( RED BLACK LEVEL) DB 0B1H,02H ;FEATURE ( DATA,VAR,ABS) ;---- DB 85H,70H ;REPORT ID( 70H) DB 09H,70H ;USAGE ( BLUE BLACK LEVEL) DB 0B1H,02H ;FEATURE ( DATA,VAR,ABS) ;---- DB 85H,0ACH ;REPORT ID( ACH) DB 09H,0ACH ;USAGE ( HORI. FREQ) DB 0B1H,02H ;FEATURE ( DATA,VAR,ABS) ;---- DB 85H,0AEH ;REPORT ID( AEH) DB 09H,0AEH ;USAGE ( VERTI. FREQ) DB 0B1H,02H ;FEATURE ( DATA,VAR,ABS) ;------------------ DB 25H,40h ;LOGICAL MAXIMUM(64) DB 85H,24H ;REPORT ID( 24H) DB 09H,24H ;USGAE ( HORIZONTAL PIN) DB 0B1H,02H ;FEATURE ( DATA,VAR,ABS) ;---- DB 85H,34H ;REPORT ID( 34H) DB 09H,34H ;USGAE ( VERTICAL PIN) DB 0B1H,02H ;FEATURE ( DATA,VAR,ABS) ;------------------ DB 25H,60h ;LOGICAL MAXIMUM(96) DB 85H,42H ;REPORT ID( 42H) DB 09H,42H ;USAGE ( TRAPEZOIDAL) DB 0B1H,02H ;FEATURE ( DATA,VAR,ABS) ;---- DB 85H,44H ;REPORT ID( 44H) DB 09H,44H ;USAGE ( TILT) DB 0B1H,02H ;FEATURE ( DATA,VAR,ABS) ; ;------------------ DB 85H,0B0H ;REPORT ID( B0H) DB 75H,02H ;REPORT SIZE( 2 BIT) DB 95H,01H ;REPORT COUNTER( 1 BYTES) DB 15H,01H ;LOGICAL MINIMUM(1) DB 25H,03H ;LOGICAL MAXIMUM(3) DB 09H,0B0H ;USAGE ( SETTING) DB 0A1H,02 ;COLLECTION ( LOGICAL) DB 05H,81H ;USGAE_PAGE( MONITOR ENUM VALUES) DB 09H,01H ;USAGE ENUM 1 DB 09H,02H ;USGAE ENUM 2 DB 09H,03H ;USGAE ENUM 3 DB 0B1H,00H ;FEATURE (DATA,ARRAY,ABS) DB 75H,06H ;REPORT SIZE (6 BITS) DB 0B1H,01H ;FEATURE (CONSTANT) DB 0C0H ;END COLLECTION ;------------------ DB 85H,11H ;REPORT ID( 11H) DB 75H,02H ;REPORT SIZE( 2 BIT) DB 05H,082H ;USAGE_PAGE ( VESA VIRTUAL CONTROL) DB 09H,11H ;USAGE ( Autobrightness disable/enable) DB 0A1H,02 ;COLLECTION ( LOGICAL) DB 05H,81H ;USGAE_PAGE( MONITOR ENUM VALUES) DB 09H,01H ;USAGE ENUM 1 ;disable DB 09H,02H ;USGAE ENUM 2 ;enable DB 0B1H,00H ;FEATURE ( DATA,ARRAY,ABS) DB 75H,06H ;REPORT SIZE (6 BITS) DB 0B1H,01H ;FEATURE (CONSTANT) DB 0C0H ;END COLLECTION ;------------------ DB 85H,0D8H ;REPORT ID( D8H) DB 75H,03H ;REPORT SIZE( 3 BIT) DB 25H,06H ;LOGICAL MAXIMUM(6) DB 05H,082H ;USAGE_PAGE ( VESA VIRTUAL CONTROL) DB 09H,0D8H ;USAGE ( colortemp) DB 0A1H,02 ;COLLECTION ( LOGICAL) DB 05H,81H ;USGAE_PAGE( MONITOR ENUM VALUES) DB 09H,01H ;USAGE ENUM 1 ;user DB 09H,02H ;USGAE ENUM 2 ;5000k DB 09H,03H ;USAGE ENUM 3 ;5500k DB 09H,04H ;USGAE ENUM 4 ;6500k DB 09H,05H ;USAGE ENUM 5 ;7500k DB 09H,06H ;USGAE ENUM 6 ;9300k DB 0B1H,00H ;FEATURE ( DATA,ARRAY,ABS) DB 75H,05H ;REPORT SIZE (5 BITS) DB 0B1H,01H ;FEATURE (CONSTANT) DB 0C0H ;END COLLECTION ;--------------- DB 05H,0CH ;USAGE PAGE( CONSUMER DEVICE) DB 09H,01H ;UASGE(CONSUMER CONTROL) DB 0A1H,01H ;COLLECTION(APPLICATION) DB 15H,00H ;LOGICAL MINIMUM(0) DB 25H,01H ;LOGICAL MAXIMUM (1) DB 75H,01H ;REPORT SIZE( 1) ;FROM HERE ON, REPORT SIZE IS ALWAYS 1 ; DB 85H,041H ;REPORT ID( 41H) DB 95H,01H ;REPORT COUNT( 1) ;APPLET Menu hotkey DB 09H,40H ;USAGE ( MENU) DB 81H,02H ;INPUT (DATA,VAR,ABS) DB 95H,07H ;REPORT COUNT( 7) DB 81H,01H ;INPUT(CONSTANT) ; DB 85H,37H ;REPORT ID( 37H) DB 95H,03H ;REPORT COUNT( 3) DB 09h,36h ;usage (Function Buttons) DB 0a1h,01h ;Collection(Application) DB 05H,09H ;USAGE PAGE(BUTTONS) DB 09H,01H ;USAGE(BUTTON_1) ;GP1 DB 09H,02H ;USAGE(BUTTON_2) ;GP2 DB 09H,03H ;USAGE(BUTTON_3) ;GP3 DB 81H,02H ;INPUT (DATA,VAR,ABS) DB 0c0h ;end_collection DB 95H,0DH ;REPORT COUNT( 13) DB 81H,01H ;INPUT(CONSTANT) ; DB 0C0H ;END_COLLECTION DB 0C0H ;END_COLLECTION EMB_REPORT_DESC_END: ; EMB_REPORT1_DESC: DB 05H,0CH ;USAGE PAGE (CONSUMER DEVICES) DB 09H,01H ;USAGE (CONSUMER CONTROL) DB 0A1H,01H ;COLLECTION(APPLICATION) ; DB 15H,00H ;LOGICAL_MINIMUM(0) DB 25H,01H ;LOGICAL_MAXIMUM(1) DB 09H,0E9H ;USAGE(VOLUME UP) DB 09H,0EAH ;USAGE(VOLUME DOWN) DB 75H,01H ;REPORT_SIZE(1) DB 95H,02H ;REPORT_COUNT(2) DB 81H,02H ;INPUT(DATA,VAR,ABS) DB 09H,0E2H ;USAGE(MUTE) DB 95H,01H ;REPORT_COUNT(1) DB 81H,02H ;INPUT(DATA,VAR,ABS) DB 95H,05H ;REPORT_COUNT(5) DB 81H,01H ;INPUT(CONST) DB 0C0H ;END_COLLECTION ;------- EMB_REPORT1_DESC_END: ; ;---------------------------------------------- ; descriptor length ;---------------------------------------------- report_length EQU EMB_REPORT_DESC_END-EMB_REPORT_DESC rpt_len_low equ 29h rpt_len_high equ 01h REPORT1_LENGTH EQU EMB_REPORT1_DESC_END-EMB_REPORT1_DESC CONF_LENGTH EQU EMB_REPORT_DESC-EMB_CONFIG_DESC ; ; color temperature table, not true value, only used for software debugging ; the parameter value order is RG, BG, GG, RB,GB,BB,CONT,BRIT from left to right ; ct9300k: db 9fh,9fh,9fh,9fh,9fh,9fh,9fh,9fh ct7500k: db 7fh,7fh,7fh,7fh,7fh,7fh,7fh,7fh ct6500k: db 3fh,3fh,3fh,3fh,3fh,3fh,3fh,3fh ct5500k: db 2fh,2fh,2fh,2fh,2fh,2fh,2fh,2fh ct5000k: db 1fh,1fh,1fh,1fh,1fh,1fh,1fh,1fh ; ; EDID data, not ytur values, only used for software debugging. ; EDID_DATA: db 0f2h,00h,01h,02h,03h,04h,05h,06h,07h,08h,09h,0ah,0bh,0ch,0dh,0eh,0fh, db 10h,11h,12h,13h,14h,15h,16h,17h,18h,19h,1ah,1bh,1ch,1dh,1eh,1fh, db 20h,21h,22h,23h,24h,25h,26h,27h,28h,29h,2ah,2bh,2ch,2dh,2eh,2fh, db 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h,3ah,3bh,3ch,3dh,3eh,3fh, db 40h,41h,42h,43h,44h,45h,46h,47h,48h,49h,4ah,4bh,4ch,4dh,4eh,4fh, db 50h,51h,52h,53h,54h,55h,56h,57h,58h,59h,5ah,5bh,5ch,5dh,5eh,5fh, db 60h,61h,62h,63h,64h,65h,66h,67h,68h,69h,6ah,6bh,6ch,6dh,6eh,6fh, db 70h,71h,72h,73h,74h,75h,76h,77h,78h,79h,7ah,7bh,7ch,7dh,7eh,7fh ;; END