usbdisk.s01
来自「MP3 整个 SDK」· S01 代码 · 共 450 行
S01
450 行
NAME usbdisk(17)
RSEG UDISK_RC(0)
RSEG UDISK_RD(0)
EXTERN ClearScreen
EXTERN DRV_ActiveUD
PUBLIC DispBuf
EXTERN Display
PUBLIC DisplayIndi
EXTERN IsCardOut
EXTERN MenuKeyPress
EXTERN MsgManager
PUBLIC OldVddVol
EXTERN ResClose
EXTERN SetContrast
EXTERN StandbyScreen
EXTERN UDiskExit
EXTERN UDiskGetStatus
EXTERN UDiskHandle
EXTERN UDiskInitAll
EXTERN UDiskPullCardOut
PUBLIC USBStatus
EXTERN g_comval
PUBLIC main
EXTERN res_fp
EXTERN sKY_CloseBacklight
EXTERN sKY_OpenBacklight
EXTERN ?CLZ80B_4_04_L00
EXTERN ?C_V_SWITCH_L06
EXTERN ?BANK_FAST_LEAVE_L08
RSEG UDISK_RC
main:
; 1. /*
; 2. ********************************************************************************
; 3. * ACTOS
; 4. * usbmain
; 5. *
; 6. * (c) Copyright 2002-2003, Actions Co,Ld.
; 7. * All Right Reserved
; 8. *
; 9. * File : main.c
; 10. * By : Chliang
; 11. * Version: v1.00 first version 04-1-6 14:33
; 12. ********************************************************************************
; 13. */
; 14. #pragma function=non_banked
; 15.
; 16. #include "Udisk.h"
; 17.
; 18. #pragma memory=dataseg(UDISK_RD)
; 19. char DisplayIndi,USBStatus;
; 20. BYTE OldVddVol;
; 21. char *DispBuf;
; 22. extern BYTE MenuKeyPress;
; 23. extern BYTE IsCardOut;
; 24. extern comval_t g_comval;
; 25. #pragma memory=default
; 26.
; 27.
; 28. #pragma codeseg(UDISK_RC)
; 29. int main(int para)
; 30. {
PUSH BC
PUSH IX
PUSH DE
; 31. char dispIndibak=0xff;
; 32. char rii=0;
; 33.
; 34.
; 35. //~~~~~~~~~~~~~~~~~~~~~
; 36. //init usb disk
; 37. //~~~~~~~~~~~~~~~~~~~~~
; 38. DisplayIndi=0x00; //变量初始化
XOR A
LD (DisplayIndi),A
; 39.
; 40.
; 41. if(!UDiskInitAll(para)) //AP初始化
LD IXL,255
CALL LWRD UDiskInitAll
OR A
JP Z,?0049
?0002:
; 42. {
; 43. return 0;
; 44. }
?0003:
; 45.
; 46. for(rii=0;rii<0x7f;rii++)
LD IXH,0
?0005:
LD A,IXH
CP 127
JR NC,?0004
?0006:
INC IXH
; 47. {
; 48. ; //delay
; 49. }
; 50. //~~~~~~~~~~~~~~~~~~~~~
; 51. //message loop
; 52. //~~~~~~~~~~~~~~~~~~~~~
; 53. while(1)
JR ?0005
?0004:
?0009:
; 54. {
; 55. //清watch dog!!
; 56. output8(0x4e,input8(0x4e)|0x08);
IN A,(78)
SET 3,A
OUT (78),A
; 57.
; 58. MsgManager(); //消息解释
CALL LWRD MsgManager
; 59. if(IsCardOut == 1)
LD A,(IsCardOut)
DEC A
JR NZ,?0012
?0011:
; 60. {
; 61. UDiskPullCardOut();
CALL LWRD UDiskPullCardOut
; 62. IsCardOut = 0;
XOR A
LD (IsCardOut),A
?0012:
; 63. }
; 64. UDiskHandle(); //调用状态机执行命令
CALL LWRD UDiskHandle
; 65.
; 66. USBStatus=UDiskGetStatus();
CALL LWRD UDiskGetStatus
LD (USBStatus),A
; 67. //0:空闲 10h:上传 20h:下传 30h:弹出要求退出 40h:拔线要求退出 50h:切换到韧件升级应用
; 68. //60h:分区处理状态 70h:出错要求退出 80h:进入Suspend状态 90h:退出Suspend状态
; 69. if( (DisplayIndi==0xff) && ( USBStatus !=0x80 ) )
LD A,(DisplayIndi)
INC A
JR NZ,?0014
LD A,(USBStatus)
DEC A
JP PE,?0014
?0016:
?0015:
?0013:
; 70. {
; 71. sKY_OpenBacklight();
CALL LWRD sKY_OpenBacklight
; 72. StandbyScreen(1); //开显示屏
LD E,1
CALL LWRD StandbyScreen
; 73. SetContrast(g_comval.DisplayContrast); //设对比度
LD DE,(g_comval+8)
CALL LWRD SetContrast
?0014:
; 74. }
; 75. if ( (USBStatus==0x30) || (USBStatus==0x40) || (USBStatus==0x50) || (USBStatus==0x70) )
LD A,(USBStatus)
CP 48
JP Z,?0008
CP 64
JP Z,?0008
CP 80
JP Z,?0008
CP 112
JP Z,?0008
?0019:
?0020:
?0017:
; 76. break;
?0018:
; 77. if((MenuKeyPress==1) && (USBStatus==0))
LD A,(MenuKeyPress)
DEC A
JR NZ,?0022
LD A,(USBStatus)
OR A
JP Z,?0008
?0024:
?0023:
?0021:
; 78. break; //0x00
?0022:
; 79. switch (USBStatus)
LD DE,(USBStatus)
CALL LWRD ?C_V_SWITCH_L06
DEFW 11
DEFB 0
DEFB 16
DEFB 17
DEFB 32
DEFB 33
DEFB 49
DEFB 65
DEFB 81
DEFB 97
DEFB 128
DEFB 144
DEFW ?0004
DEFW ?0044
DEFW ?0043
DEFW ?0032
DEFW ?0037
DEFW ?0032
DEFW ?0032
DEFW ?0032
DEFW ?0040
DEFW ?0032
DEFW ?0029
DEFW ?0026
?0026:
; 80. {
; 81. case 0:
; 82.
; 83. if(DisplayIndi!=0x00)
LD A,(DisplayIndi)
OR A
JP Z,?0004
?0027:
; 84. {
; 85. DisplayIndi=0x00;
XOR A
JR ?0065
; 86. Display(DisplayIndi); //显示模块 0:传输结束 01:上传 02:下传
?0028:
; 87. }
; 88. break;
?0029:
; 89.
; 90. case 0x10:
; 91. if(DisplayIndi!=0x01)
LD A,(DisplayIndi)
DEC A
JP Z,?0004
?0030:
; 92. {
; 93. DisplayIndi=0x01;
LD A,1
JR ?0065
; 94. Display(DisplayIndi); //显示模块 0:传输结束 01:上传 02:下传
?0031:
; 95. }
; 96. break;
?0032:
; 97. case 0x11://显示Commu
; 98. case 0x21://显示DownLoad
; 99. case 0x31://显示UpLoad
; 100. case 0x41://显示Succ
; 101. case 0x61://显示Succ,退出
; 102. DisplayIndi=USBStatus>>4;
LD A,(USBStatus)
RRA
RRA
RRA
RRA
AND 15
LD (DisplayIndi),A
; 103. if (USBStatus==0x61)
LD A,(USBStatus)
CP 97
JR NZ,?0034
?0033:
; 104. {
; 105. DisplayIndi -= 1; //0x61与0x51显示一致
LD A,(DisplayIndi)
ADD A,255
LD (DisplayIndi),A
?0034:
; 106. }
; 107. DisplayIndi+=0x10;
LD A,(DisplayIndi)
ADD A,16
LD (DisplayIndi),A
; 108. if(dispIndibak != DisplayIndi) //保证只显示一次
LD B,A
LD A,IXL
CP B
JP Z,?0004
?0035:
; 109. {
; 110. dispIndibak=DisplayIndi;
LD IXL,B
; 111. Display(DisplayIndi);
JR ?0066
?0036:
; 112. }
; 113. break;
?0037:
; 114.
; 115. case 0x51: //切换到adfu
; 116. output8(0x27,input8(0x27) & 0x9f); //关键盘和RTC中断
IN A,(39)
AND 159
OUT (39),A
; 117. DisplayIndi=0x10;
LD A,16
LD (DisplayIndi),A
; 118. if(dispIndibak != DisplayIndi) //保证只显示一次
LD A,IXL
CP 16
JP Z,?0004
?0038:
; 119. {
; 120. dispIndibak=DisplayIndi;
LD A,(DisplayIndi)
LD IXL,A
; 121. Display(DisplayIndi);
?0066:
LD DE,(DisplayIndi)
JR ?0064
?0039:
; 122. }
; 123. break;
?0040:
; 124. case 0x20:
; 125. if(DisplayIndi!=0x02)
LD A,(DisplayIndi)
DEC A
DEC A
JP Z,?0004
?0041:
; 126. {
; 127. DisplayIndi=0x02;
LD A,2
?0065:
LD (DisplayIndi),A
; 128. Display(DisplayIndi); //显示模块 0:传输结束 01:上传 02:下传
LD E,A
?0064:
CALL LWRD Display
?0042:
; 129. }
; 130. break;
JP LWRD ?0004
?0043:
; 131. case 0x80:
; 132. sKY_CloseBacklight();
CALL LWRD sKY_CloseBacklight
; 133. ClearScreen(NULL); //清成白屏
LD DE,0
CALL LWRD ClearScreen
; 134. // UpdateScreen(NULL);
; 135. StandbyScreen(0); //关显示屏
LD E,0
CALL LWRD StandbyScreen
; 136. DisplayIndi=0xff; //置成其他值,为了退出Suspend时能显示
LD A,255
LD (DisplayIndi),A
; 137. break;
JP LWRD ?0004
?0044:
; 138. case 0x90: //退出Suspend状态
; 139. sKY_OpenBacklight();
CALL LWRD sKY_OpenBacklight
; 140. StandbyScreen(1); //开显示屏
LD E,1
CALL LWRD StandbyScreen
; 141. SetContrast(g_comval.DisplayContrast); //设对比度
LD DE,(g_comval+8)
CALL LWRD SetContrast
; 142. output8(0x27,input8(0x27) | 0x04);
IN A,(39)
SET 2,A
OUT (39),A
; 143. break;
JP LWRD ?0004
?0045:
; 144. default:
; 145. break;
?0025:
?0008:
; 146. }
; 147.
; 148. }
; 149.
; 150.
; 151. //~~~~~~~~~~~~~~~~~~~~~
; 152. //usb disk exit
; 153. //~~~~~~~~~~~~~~~~~~~~~
; 154. UDiskExit(); //USB退出
CALL LWRD UDiskExit
; 155.
; 156. ResClose(res_fp); //关资源文件
LD DE,(res_fp)
CALL LWRD ResClose
; 157.
; 158. sKY_CloseBacklight();
CALL LWRD sKY_CloseBacklight
; 159.
; 160. DRV_ActiveUD(0x00,MODE_SLOW);
LD C,1
LD E,0
CALL LWRD DRV_ActiveUD
; 161.
; 162. //////////////////////////// zxs add for card
; 163. output8(0x2f,input8(0x2f)|0x04); //CE3 change to GIOA3
IN A,(47)
SET 2,A
OUT (47),A
; 164. output8(0xf7,input8(0xf7)|0x01); // PowerOff
IN A,(247)
SET 0,A
OUT (247),A
; 165. output8(0xee,input8(0xee)&0xf7); //GPIO A3=0
IN A,(238)
RES 3,A
OUT (238),A
; 166. //////////////////////////// zxs add for card
; 167.
; 168. if(USBStatus == 0x00) //按Mode退出
LD A,(USBStatus)
OR A
JR NZ,?0047
?0046:
; 169. return RESULT_MAIN;
LD HL,10
JR ?0050
?0047:
; 170. else if(USBStatus == 0x50) //升级退出
CP 80
JR NZ,?0049
?0048:
; 171. return RESULT_UPGRADE;
LD HL,3
; 172. else
JR ?0050
?0049:
; 173. return 0; //拔线,弹出 //拔线,弹出
LD HL,0
; 174.
; 175.
; 176. }
?0050:
POP AF
POP IX
POP BC
JP LWRD ?BANK_FAST_LEAVE_L08
; 177.
; 178. #pragma memory=default
RSEG UDISK_RD
DisplayIndi:
DEFS 1
USBStatus:
DEFS 1
OldVddVol:
DEFS 1
DispBuf:
DEFS 2
END
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?