📄 fw_epmg.lst
字号:
474 *
475 * Global data : fw_fifoId : ID of the IN FIFO
476 * fw_deviceState : bit1 = 1 when TX on EP2
477 *
478 *****************************************************************/
\ In segment CODE, align 4, keep-with-next
479 void fw_mainTxDone(void)
480 {
\ fw_mainTxDone:
\ 00000000 F0B5 PUSH {R4-R7,LR}
481 UCHAR i;
482
483 if(fw_fifoId.NbOctetsLibres != (fw_fifoId.last - fw_fifoId.first))
\ 00000002 .... LDR R4,??DataTable9 ;; fw_deviceState
\ 00000004 .... LDR R5,??Subroutine7_0 ;; fw_fifoId
\ 00000006 2869 LDR R0,[R5, #+16]
\ 00000008 E968 LDR R1,[R5, #+12]
\ 0000000A 2A68 LDR R2,[R5, #+0]
\ 0000000C 891A SUB R1,R1,R2
\ 0000000E 8842 CMP R0,R1
\ 00000010 22D0 BEQ ??fw_mainTxDone_0
484 {
485 for( i=0; i<FW_MAIN_EP_MAXPACKET_SIZE; i++ )
\ 00000012 0020 MOV R0,#+0
\ 00000014 .... LDR R6,??Subroutine7_0+0x4 ;; TxBuffer
486 {
487 TxBuffer[i] = 0;
\ ??fw_mainTxDone_1:
\ 00000016 0021 MOV R1,#+0
\ 00000018 3154 STRB R1,[R6, R0]
488 }
\ 0000001A 401C ADD R0,R0,#+1
\ 0000001C 0106 LSL R1,R0,#+24
\ 0000001E 090E LSR R1,R1,#+24
\ 00000020 4029 CMP R1,#+64
\ 00000022 F8D3 BCC ??fw_mainTxDone_1
489
490 // Get the data out of the fifo and put them in the endpoint buffer
491 fw_lastTxPacket = po_rngBufGet(&fw_fifoId,(char*)TxBuffer,FW_MAIN_EP_MAXPACKET_SIZE);
\ 00000024 .... LDR R7,??Subroutine7_0+0x8 ;; fw_lastTxPacket
\ 00000026 4022 MOV R2,#+64
\ 00000028 311C MOV R1,R6
\ 0000002A 281C MOV R0,R5
\ 0000002C ........ _BLF po_rngBufGet,??po_rngBufGet??rT
\ 00000030 3870 STRB R0,[R7, #+0]
492 fw_lastTxPacket = fw_writeEndpoint(FW_EP_BULK_IN,TxBuffer,fw_lastTxPacket);
\ 00000032 3A78 LDRB R2,[R7, #+0]
\ 00000034 311C MOV R1,R6
\ 00000036 0120 MOV R0,#+1
\ 00000038 ........ _BLF fw_writeEndpoint,??fw_writeEndpoint??rT
\ 0000003C 3870 STRB R0,[R7, #+0]
493
494 // Test if the FIFO is only 20% full
495 if( (fw_deviceState & FW_DS_FIFO_FULL) && (po_rngNBytes(&fw_fifoId) < FW_IN_FIFO_EMPTY) )
\ 0000003E 2078 LDRB R0,[R4, #+0]
\ 00000040 4006 LSL R0,R0,#+25
\ 00000042 10D5 BPL ??fw_mainTxDone_2
\ 00000044 281C MOV R0,R5
\ 00000046 ........ _BLF po_rngNBytes,??po_rngNBytes??rT
\ 0000004A 6628 CMP R0,#+102
\ 0000004C 0BDA BGE ??fw_mainTxDone_2
496 {
497 fw_deviceState &= ~FW_DS_FIFO_FULL;
\ 0000004E 2078 LDRB R0,[R4, #+0]
\ 00000050 BF21 MOV R1,#+191
\ 00000052 0140 AND R1,R0
\ 00000054 2170 STRB R1,[R4, #+0]
\ 00000056 06E0 B ??fw_mainTxDone_2
498 }
499 }
500 else
501 {
502 // End of the transfer
503 fw_deviceState &= ~FW_DS_TX;
\ ??fw_mainTxDone_0:
\ 00000058 2078 LDRB R0,[R4, #+0]
\ 0000005A FD21 MOV R1,#+253
\ 0000005C 0140 AND R1,R0
\ 0000005E 2170 STRB R1,[R4, #+0]
504 USB_TX = 1;
\ 00000060 .... LDR R0,??Subroutine7_0+0xC ;; USB_TX
\ 00000062 0121 MOV R1,#+1
\ 00000064 0160 STR R1,[R0, #+0]
\ ??fw_mainTxDone_2:
\ 00000066 C046 NOP
505 /* if the last packet is a full packet we must send a zero length packet */
506 // TODO
507 //if(fw_fifoId.NbOctetsLibres == 0)
508 //{
509 // fw_singleTransmit(0, 0);
510 //}
511 }
512 }
\ 00000068 REQUIRE ?Subroutine7
\ 00000068 ;; // Fall through to label ?Subroutine7
513
514
515 /*****************************************************************
516 *
517 * ROUTINE fw_writeRxData
518 *
519 *-----------------------------------------------------------------
520 *
521 * Purpose :
522 * write data in a valid TB
523 *
524 * Input parameters : length : length of data to write
525 * dataBuffer : data to write
526 *
527 * Output parameters : NONE
528 *
529 * Global data : fw_TB : array of the buffer IDs
530 * fw_writeTB : TB currently used by the firmware
531 *
532 *****************************************************************/
\ In segment CODE, align 4, keep-with-next
533 int fw_writeRxData(int length,UCHAR *dataBuffer)
534 {
\ fw_writeRxData:
\ 00000000 F3B5 PUSH {R0,R1,R4-R7,LR}
\ 00000002 81B0 SUB SP,#+4
\ 00000004 .... LDR R0,??DataTable17 ;; fw_writeTB
\ 00000006 0068 LDR R0,[R0, #+0]
\ 00000008 0468 LDR R4,[R0, #+0]
535 structTB *_TB;
536 ULONG _i = 0;
537 long *_sizeTB,*_indexTB;
538
539 _TB = fw_writeTB[0];
540 _indexTB =&_TB->index; /* pointer to the current write position */
\ 0000000A 251C MOV R5,R4
\ 0000000C 0835 ADD R5,#+8
541 _sizeTB = &_TB->length; /* pointer to the size field */
\ 0000000E 261D ADD R6,R4,#+4
\ 00000010 2168 LDR R1,[R4, #+0]
\ 00000012 4906 LSL R1,R1,#+25
\ 00000014 03D5 BPL ??fw_writeRxData_0
542
543 /* check if the current TB was Empty */
544 if(_TB->status & FW_EBIT)
545 {
546 _TB->status &= ~FW_EBIT;
\ 00000016 2168 LDR R1,[R4, #+0]
\ 00000018 4022 MOV R2,#+64
\ 0000001A 9143 BIC R1,R2
\ 0000001C 2160 STR R1,[R4, #+0]
547 }
548
549 /* if the TB isn't large enough pass to the next TB */
550 if(length > (FW_TB_SIZE - *_sizeTB) )
\ ??fw_writeRxData_0:
\ 0000001E 4021 MOV R1,#+64
\ 00000020 3268 LDR R2,[R6, #+0]
\ 00000022 891A SUB R1,R1,R2
\ 00000024 384F LDR R7,??fw_writeRxData_1 ;; fw_TB + 28
\ 00000026 019A LDR R2,[SP, #+4]
\ 00000028 9142 CMP R1,R2
\ 0000002A 4EDA BGE ??fw_writeRxData_2
551 {
552 fw_writeTB++;
\ 0000002C 001D ADD R0,R0,#+4
553 if(fw_writeTB > (fw_TB + (FW_TB_NUM - 1)))
\ 0000002E 8742 CMP R7,R0
\ 00000030 00D2 BCS ??fw_writeRxData_3
554 {
555 fw_writeTB = fw_TB;
\ 00000032 .... LDR R0,??DataTable16 ;; fw_TB
\ ??fw_writeRxData_3:
\ 00000034 .... LDR R2,??DataTable17 ;; fw_writeTB
\ 00000036 1060 STR R0,[R2, #+0]
556 }
557 /* fill the current TB */
558 _i = FW_TB_SIZE - (*_sizeTB);
\ 00000038 0091 STR R1,[SP, #+0]
559 po_memcpy(&_TB->data[(*_indexTB)],dataBuffer,_i);
\ 0000003A 0A1C MOV R2,R1
\ 0000003C 0299 LDR R1,[SP, #+8]
\ 0000003E 2868 LDR R0,[R5, #+0]
\ 00000040 2018 ADD R0,R4,R0
\ 00000042 0C30 ADD R0,#+12
\ 00000044 ........ _BLF po_memcpy,??po_memcpy??rT
560
561 *_sizeTB = FW_TB_SIZE;
\ 00000048 4020 MOV R0,#+64
\ 0000004A 3060 STR R0,[R6, #+0]
562 *_indexTB = 0;
\ 0000004C 0020 MOV R0,#+0
\ 0000004E 2860 STR R0,[R5, #+0]
563 /* validate the TB */
564 _TB->status |= FW_VBIT;
\ 00000050 2068 LDR R0,[R4, #+0]
\ 00000052 8021 MOV R1,#+128
\ 00000054 0143 ORR R1,R0
\ 00000056 2160 STR R1,[R4, #+0]
565 USB_RX++;
\ 00000058 2C48 LDR R0,??fw_writeRxData_1+0x4 ;; USB_RX
\ 0000005A 2C49 LDR R1,??fw_writeRxData_1+0x4 ;; USB_RX
\ 0000005C 0968 LDR R1,[R1, #+0]
\ 0000005E 491C ADD R1,R1,#+1
\ 00000060 0160 STR R1,[R0, #+0]
566 /* put the other data in the next TB */
567 _TB = fw_writeTB[0];
\ 00000062 .... LDR R0,??DataTable17 ;; fw_writeTB
\ 00000064 0068 LDR R0,[R0, #+0]
\ 00000066 0468 LDR R4,[R0, #+0]
568 _indexTB = &_TB->index;
\ 00000068 251C MOV R5,R4
\ 0000006A 0835 ADD R5,#+8
569 _sizeTB = &_TB->length;
\ 0000006C 261D ADD R6,R4,#+4
570 if(!(_TB->status & FW_VBIT))
\ 0000006E 2168 LDR R1,[R4, #+0]
\ 00000070 0906 LSL R1,R1,#+24
\ 00000072 20D4 BMI ??fw_writeRxData_4
571 {
572 fw_writeTB++;
\ 00000074 001D ADD R0,R0,#+4
573 if(fw_writeTB > (fw_TB + (FW_TB_NUM - 1)))
\ 00000076 8742 CMP R7,R0
\ 00000078 00D2 BCS ??fw_writeRxData_5
574 {
575 fw_writeTB = fw_TB;
\ 0000007A .... LDR R0,??DataTable16 ;; fw_TB
\ ??fw_writeRxData_5:
\ 0000007C .... LDR R1,??DataTable17 ;; fw_writeTB
\ 0000007E 0860 STR R0,[R1, #+0]
576 }
577 po_memcpy(&_TB->data[(*_indexTB)],(char*)(dataBuffer + _i),(length - _i));
\ 00000080 0198 LDR R0,[SP, #+4]
\ 00000082 0099 LDR R1,[SP, #+0]
\ 00000084 421A SUB R2,R0,R1
\ 00000086 081C MOV R0,R1
\ 00000088 0299 LDR R1,[SP, #+8]
\ 0000008A 0918 ADD R1,R1,R0
\ 0000008C 2868 LDR R0,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -