📄 usb.s
字号:
.module usb.c
.area text(rom, con, rel)
.dbfile G:\IccPro\Mp3Ide\usb.c
.dbfunc e InitUSB _InitUSB fV
.even
_InitUSB::
.dbline -1
.dbline 16
; #include <iom128v.h>
; #include "usb.h"
; #include "ata.h"
; #include "generic.h"
; #include <macros.h>
; #include <string.h>
; #include <stdio.h>
; #include <stdlib.h>
;
; //******************************************************************
; //* Init USB Serial Port
; //*
; //*
; //******************************************************************
; void InitUSB(void)
; {
.dbline 17
; UCSR0C = 0x86; // Asyn,NoParity,1StopBit,8Bit,
ldi R24,134
sts 149,R24
.dbline 18
; UBRR0L = 16; // 8->115200 at 16Mhz // 16->57600 at 16Mhz // 25->38400bps at 16Mhz
ldi R24,16
out 0x9,R24
.dbline 19
; UCSR0B = 0x98; // Rx enable Tx Enable RxInt Enable
ldi R24,152
out 0xa,R24
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 72
jmp _USBRxChar
.area text(rom, con, rel)
.dbfile G:\IccPro\Mp3Ide\usb.c
.area bss(ram, con, rel)
.dbfile G:\IccPro\Mp3Ide\usb.c
L3:
.blkb 1
L4:
.blkb 15
.area text(rom, con, rel)
.dbfile G:\IccPro\Mp3Ide\usb.c
.dbfunc e USBRxChar _USBRxChar fV
.dbsym s USBCommand L4 A[15:15]c
.dbsym s InChar L3 c
; Sector -> y+2
; i -> R20
.even
_USBRxChar::
xcall push_lset
xcall push_gset1
sbiw R28,6
.dbline -1
.dbline 25
; }
;
; /*********************************************************/
; #pragma interrupt_handler USBRxChar:19
; void USBRxChar(void)
; {
.dbline 32
; extern volatile unsigned char IsPlaying;
; static unsigned char InChar;
; static unsigned char USBCommand[15];
; unsigned long Sector;
; unsigned char i;
;
; if (IsPlaying == TRUE)
lds R24,_IsPlaying
cpi R24,1
brne L5
.dbline 33
; {
.dbline 34
; InChar = UDR0;
in R2,0xc
sts L3,R2
.dbline 35
; return;
xjmp L2
L5:
.dbline 38
; }
;
; InChar = UDR0;
in R2,0xc
sts L3,R2
.dbline 40
ldi R20,1
xjmp L10
L7:
.dbline 40
ldi R24,<L4
ldi R25,>L4
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R24,<L4-1
ldi R25,>L4-1
mov R30,R20
clr R31
add R30,R24
adc R31,R25
std z+0,R2
L8:
.dbline 40
inc R20
L10:
.dbline 40
;
; for (i=1;i<12;i++) USBCommand[i-1] = USBCommand[i]; // Shift buffer
cpi R20,12
brlo L7
.dbline 41
; USBCommand[11] = InChar;
lds R2,L3
sts L4+11,R2
.dbline 43
;
; if (strncmp(&USBCommand[0],"+++R",4) == 0)
ldi R24,4
ldi R25,0
std y+1,R25
std y+0,R24
ldi R18,<L15
ldi R19,>L15
ldi R16,<L4
ldi R17,>L4
xcall _strncmp
cpi R16,0
cpc R16,R17
brne L13
X0:
.dbline 44
; {
.dbline 45
; USBCommand[12] = 0x00;
clr R2
sts L4+12,R2
.dbline 46
; Sector = atol(&USBCommand[4]);
ldi R16,<L4+4
ldi R17,>L4+4
xcall _atol
movw R30,R28
std z+2,R16
std z+3,R17
std z+4,R18
std z+5,R19
.dbline 47
; USBReadSector(Sector);
movw R30,R28
ldd R16,z+2
ldd R17,z+3
ldd R18,z+4
ldd R19,z+5
xcall _USBReadSector
.dbline 48
; }
L13:
.dbline 50
ldi R24,4
ldi R25,0
std y+1,R25
std y+0,R24
ldi R18,<L20
ldi R19,>L20
ldi R16,<L4
ldi R17,>L4
xcall _strncmp
cpi R16,0
cpc R16,R17
brne L18
X1:
.dbline 51
.dbline 52
clr R2
sts L4+12,R2
.dbline 53
ldi R16,<L4+4
ldi R17,>L4+4
xcall _atol
movw R30,R28
std z+2,R16
std z+3,R17
std z+4,R18
std z+5,R19
.dbline 54
movw R30,R28
ldd R16,z+2
ldd R17,z+3
ldd R18,z+4
ldd R19,z+5
xcall _USBWriteSector
.dbline 55
L18:
.dbline -2
L2:
adiw R28,6
xcall pop_gset1
xcall pop_lset
.dbline 0 ; func end
reti
.dbsym l Sector 2 l
.dbsym r i 20 c
.dbend
.dbfunc e USBReadSector _USBReadSector fV
; i -> R20,R21
; Sector -> y+10
.even
_USBReadSector::
xcall push_arg4
xcall push_gset1
sbiw R28,8
.dbline -1
.dbline 61
;
; if (strncmp(&USBCommand[0],"+++W",4) == 0)
; {
; USBCommand[12] = 0x00;
; Sector = atol(&USBCommand[4]);
; USBWriteSector(Sector);
; }
; }
;
; /*********************************************************/
;
; void USBReadSector(unsigned long Sector)
; {
.dbline 65
; unsigned int i;
; extern unsigned char SectorBuffer[512];
;
; ata_read_sector_byte(0, Sector, 0, 512, (unsigned char*)&SectorBuffer);
ldi R24,<_SectorBuffer
ldi R25,>_SectorBuffer
std y+7,R25
std y+6,R24
ldi R24,512
ldi R25,2
std y+5,R25
std y+4,R24
clr R2
clr R3
std y+3,R3
std y+2,R2
movw R30,R28
ldd R2,z+10
ldd R3,z+11
ldd R4,z+12
ldd R5,z+13
std y+0,R4
std y+1,R5
movw R18,R2
clr R16
xcall _ata_read_sector_byte
.dbline 66
clr R20
clr R21
xjmp L27
L24:
.dbline 66
ldi R24,<_SectorBuffer
ldi R25,>_SectorBuffer
movw R30,R20
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _USBTxChar
L25:
.dbline 66
subi R20,255 ; offset = 1
sbci R21,255
L27:
.dbline 66
; for (i=0;i<512;i++) USBTxChar(SectorBuffer[i]);
cpi R20,0
ldi R30,2
cpc R21,R30
brlo L24
.dbline -2
L23:
adiw R28,8
xcall pop_gset1
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym l Sector 10 l
.dbend
.dbfunc e USBWriteSector _USBWriteSector fV
; i -> R10,R11
; TimeOut -> y+4
; Sector -> y+14
.even
_USBWriteSector::
xcall push_arg4
xcall push_gset3
sbiw R28,8
.dbline -1
.dbline 72
; }
;
; /*********************************************************/
;
; void USBWriteSector(unsigned long Sector)
; {
.dbline 77
; unsigned int i;
; unsigned long TimeOut;
; extern unsigned char SectorBuffer[512];
;
; UCSR0B = 0x18; // Rx enable Tx Enable RxInt Disable
ldi R24,24
out 0xa,R24
.dbline 78
; for (i=0;i<512;i++)
clr R10
clr R11
xjmp L32
L29:
.dbline 79
; {
.dbline 80
; TimeOut = 0;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+4,R20
std z+5,R21
std z+6,R22
std z+7,R23
xjmp L34
L33:
.dbline 82
; while (USBIsChar() == 0)
; {
.dbline 83
; WDR();
wdr
.dbline 84
; TimeOut++;
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
movw R30,R28
std z+4,R2
std z+5,R3
std z+6,R4
std z+7,R5
.dbline 85
; if (TimeOut == 1000000) // Wait 3 second for each char,
ldi R20,64
ldi R21,66
ldi R22,15
ldi R23,0
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brne L36
.dbline 86
; {
.dbline 87
; UCSR0B = 0x98; // Rx enable Tx Enable RxInt Enable
ldi R24,152
out 0xa,R24
.dbline 88
; return;
xjmp L28
L36:
.dbline 90
L34:
.dbline 81
xcall _USBIsChar
tst R16
breq L33
.dbline 91
ldi R24,<_SectorBuffer
ldi R25,>_SectorBuffer
movw R30,R10
add R30,R24
adc R31,R25
in R2,0xc
std z+0,R2
.dbline 92
L30:
.dbline 78
movw R24,R10
adiw R24,1
movw R10,R24
L32:
.dbline 78
movw R24,R10
cpi R24,0
ldi R30,2
cpc R25,R30
brsh X2
xjmp L29
X2:
.dbline 93
; }
; }
; SectorBuffer[i] = UDR0;
; }
; ata_write_sector(0, Sector, &SectorBuffer[0]);
ldi R24,<_SectorBuffer
ldi R25,>_SectorBuffer
std y+3,R25
std y+2,R24
movw R30,R28
ldd R2,z+14
ldd R3,z+15
ldd R4,z+16
ldd R5,z+17
std y+0,R4
std y+1,R5
movw R18,R2
clr R16
xcall _ata_write_sector
.dbline 94
; USBTxChar('!');
ldi R16,33
xcall _USBTxChar
.dbline 95
; UCSR0B = 0x98; // Rx enable Tx Enable RxInt Enable
ldi R24,152
out 0xa,R24
.dbline -2
L28:
adiw R28,8
xcall pop_gset3
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r i 10 i
.dbsym l TimeOut 4 l
.dbsym l Sector 14 l
.dbend
.dbfunc e USBIsChar _USBIsChar fc
.even
_USBIsChar::
.dbline -1
.dbline 101
; }
;
; /*********************************************************/
;
; unsigned char USBIsChar(void)
; {
.dbline 102
; if (UCSR0A & 0x80) return 1;
sbis 0xb,7
rjmp L39
.dbline 102
ldi R16,1
xjmp L38
L39:
.dbline 103
; return 0;
clr R16
.dbline -2
L38:
.dbline 0 ; func end
ret
.dbend
.dbfunc e USBTxChar _USBTxChar fV
; ch -> R16
.even
_USBTxChar::
.dbline -1
.dbline 109
; }
;
; /*********************************************************/
;
; void USBTxChar(unsigned char ch)
; {
xjmp L43
L42:
.dbline 110
wdr
L43:
.dbline 110
; while (!(UCSR0A & 0x20)) WDR(); // Wait for empty transmit buffer
sbis 0xb,5
rjmp L42
.dbline 111
; UDR0 = ch; // Write char
out 0xc,R16
.dbline -2
L41:
.dbline 0 ; func end
ret
.dbsym r ch 16 c
.dbend
.area data(ram, con, rel)
.dbfile G:\IccPro\Mp3Ide\usb.c
L20:
.blkb 5
.area idata
.byte 43,43,43,'W,0
.area data(ram, con, rel)
.dbfile G:\IccPro\Mp3Ide\usb.c
L15:
.blkb 5
.area idata
.byte 43,43,43,'R,0
.area data(ram, con, rel)
.dbfile G:\IccPro\Mp3Ide\usb.c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -