📄 lib_at91.s79
字号:
CFI R6 Frame(CFA, -16)
CFI R5 Frame(CFA, -20)
CFI R4 Frame(CFA, -24)
CFI CFA SP+24
MOV R4,R0
MOV R5,R1
MOV R8,R2
MOV R7,R3
; 616 u_int pio = 0 ;
; 617 //* Start the Clock of the Timer
; 618 at91_clock_open ( tc_pt->periph_id ) ;
MOV R6,R4
LDRB R0,[R6, #+8]
BL at91_clock_open
; 619
; 620 pio = 1<<tc_pt->pin_tclk ;
MOV R0,#+0x1
LDRB R2,[R6, #+11]
MOV R1,R0, LSL R2
; 621 //* Enable TIOA pin if requested
; 622 if ( tioa == TRUE )
CMP R8,#+0x1
; 623 {
; 624 pio |= 1<<tc_pt->pin_tioa ;
LDREQB R2,[R6, #+9]
ORREQ R1,R1,R0, LSL R2
; 625 }
; 626 //* Enable TIOB pin if requested
; 627 if ( tiob == TRUE )
CMP R7,#+0x1
; 628 {
; 629 pio |= 1<<tc_pt->pin_tiob ;
LDREQB R2,[R6, #+10]
ORREQ R1,R1,R0, LSL R2
; 630 }
; 631 at91_pio_close ( tc_pt->pio_ctrl, pio ) ;
LDR R0,[R6, #+4]
BL at91_pio_close
; 632
; 633 //* Disable the clock and the interrupts
; 634 tc_pt->tc_base->TC_CCR = TC_CLKDIS ;
MOV R0,#+0x2
LDR R1,[R6, #+0]
STR R0,[R1, #+0]
; 635 tc_pt->tc_base->TC_IDR = 0xFFFFFFFF ;
MVN R0,#+0x0
LDR R1,[R6, #+0]
STR R0,[R1, #+40]
; 636 pio = tc_pt->tc_base->TC_SR ;
LDR R0,[R6, #+0]
LDR R1,[R0, #+32]
; 637
; 638 //* Set the Mode of the Timer Counter
; 639 tc_pt->tc_base->TC_CMR = mode ;
STR R5,[R0, #+4]
; 640
; 641 //* Enable the clock
; 642 tc_pt->tc_base->TC_CCR = TC_CLKEN ;
MOV R0,#+0x1
LDR R1,[R6, #+0]
STR R0,[R1, #+0]
; 643 //* End
; 644 }
LDMIA SP!,{R4-R8,PC} ;; return
CFI EndBlock cfiBlock18
; 645
; 646 //*----------------------------------------------------------------------------
; 647 //* Function Name : at91_tc_close
; 648 //* Object : Stop a Timer Counter Channel and disable is clock
; 649 //* Input Parameters : <tc_pt> = the channel number
; 650 //* Output Parameters : None
; 651 //* Functions called : at91_clock_close
; 652 //*----------------------------------------------------------------------------
RSEG NEARFUNC_A:CODE:NOROOT(2)
CFI Block cfiBlock19 Using cfiCommon0
CFI Function at91_tc_close
CODE32
; 653 void at91_tc_close ( const TCDesc *tc_pt )
; 654 //* Begin
; 655 {
at91_tc_close:
STMDB SP!,{LR} ;; Push
CFI RET Frame(CFA, -4)
CFI CFA SP+4
; 656 //* Disable the clock and interrupts
; 657 tc_pt->tc_base->TC_CCR = TC_CLKDIS ;
MOV R1,R0
MOV R0,#+0x2
LDR R2,[R1, #+0]
STR R0,[R2, #+0]
; 658 tc_pt->tc_base->TC_IDR = 0xFFFFFFFF ;
MVN R0,#+0x0
LDR R2,[R1, #+0]
STR R0,[R2, #+40]
; 659
; 660 //* Stop the Clock of the Timer
; 661 at91_clock_close ( tc_pt->periph_id ) ;
LDRB R0,[R1, #+8]
BL at91_clock_close
; 662 //* End
; 663 }
LDMIA SP!,{PC} ;; return
CFI EndBlock cfiBlock19
; 664
; 665 //*----------------------------------------------------------------------------
; 666 //* Function Name : at91_tc_get_status
; 667 //* Object : Read the Status of a Timer Counter Channel
; 668 //* Input Parameters : <tc_pt> = the channel number
; 669 //* Output Parameters : the status value
; 670 //* Functions called : None
; 671 //*----------------------------------------------------------------------------
RSEG NEARFUNC_A:CODE:NOROOT(2)
CFI Block cfiBlock20 Using cfiCommon0
CFI Function at91_tc_get_status
CODE32
; 672 u_int at91_tc_get_status ( const TCDesc *tc_pt )
; 673 //* Begin
; 674 {
; 675 //* Return the value of the Status Register
; 676 return ( tc_pt->tc_base->TC_SR ) ;
at91_tc_get_status:
LDR R1,[R0, #+0]
LDR R0,[R1, #+32]
MOV PC,LR ;; return
CFI EndBlock cfiBlock20
; 677
; 678 //* End
; 679 }
; 680
; 681 //*----------------------------------------------------------------------------
; 682 //* Function Name : at91_tc_trig_cmd
; 683 //* Object : Generate a software trigger on a TC channel
; 684 //* Input Parameters : <tc_pt> = the channel number to trig
; 685 //* Output Parameters : None
; 686 //* Functions called : at91_error
; 687 //*----------------------------------------------------------------------------
RSEG NEARFUNC_A:CODE:NOROOT(2)
CFI Block cfiBlock21 Using cfiCommon0
CFI Function at91_tc_trig_cmd
CODE32
; 688 void at91_tc_trig_cmd ( const TCDesc *tc_pt, u_int cmd )
; 689 //* Begin
; 690 {
at91_tc_trig_cmd:
STMDB SP!,{LR} ;; Push
CFI RET Frame(CFA, -4)
CFI CFA SP+4
; 691 //* Depending on the command
; 692 switch (cmd)
CMP R1,#+0x1
BEQ ??at91_tc_trig_cmd_0
CMP R1,#+0x2
BEQ ??at91_tc_trig_cmd_1
; 693 {
; 694 //* Case Channel Trigger
; 695 case TC_TRIG_CHANNEL:
; 696 //* Perform a Software trigger on the corresponding channel
; 697 tc_pt->tc_base->TC_CCR = TC_SWTRG ;
; 698 break ;
; 699
; 700 //* Case Synchronization Trigger
; 701 case TC_TRIG_BLOCK:
; 702 //* Perform a synchronization trigger
; 703 ((StructTCBlock *) ((u_int)tc_pt->tc_base & 0xF0))->TC_BCR = TC_SYNC ;
; 704 break ;
; 705
; 706 //* Unkonwn
; 707 // default :
; 708 //* Run the AT91 Library Error Macro
; 709 //$$$$ at91_error ("__FILE__","__LINE__") ;
; 710 //* End Switch
; 711 }
; 712 //* End
; 713 }
LDMIA SP!,{PC} ;; return
??at91_tc_trig_cmd_0:
MOV R1,#+0x4
LDR R2,[R0, #+0]
STR R1,[R2, #+0]
LDMIA SP!,{PC} ;; return
??at91_tc_trig_cmd_1:
MOV R1,#+0x1
LDR R2,[R0, #+0]
AND R0,R2,#+0xF0
STR R1,[R0, #+192]
LDMIA SP!,{PC} ;; return
CFI EndBlock cfiBlock21
; 714
; 715 //*----------------------------------------------------------------------------
; 716 //* Function Name : at91_tc_set_mode
; 717 //* Object : Update Timer Counter Mode Register with mask
; 718 //* Input Parameters : <tc_pt> = the channel number
; 719 //* : <mask> = bit to modify in the mode register
; 720 //* : <data> = set/clear bits in the mode register
; 721 //* Output Parameters : none
; 722 //* Functions called : none
; 723 //*----------------------------------------------------------------------------
RSEG NEARFUNC_A:CODE:NOROOT(2)
CFI Block cfiBlock22 Using cfiCommon0
CFI Function at91_tc_set_mode
CODE32
; 724 void at91_tc_set_mode ( const TCDesc *tc_pt, u_int mask, u_int data )
; 725 //* Begin
; 726 {
; 727 //* If data is not null
; 728 if (data != 0)
at91_tc_set_mode:
CMP R2,#+0x0
BEQ ??at91_tc_set_mode_0
; 729 //* Set bits in the Mode Register corresponding to the mask
; 730 tc_pt->tc_base->TC_CMR |= mask ;
LDR R2,[R0, #+0]
LDR R0,[R2, #+4]
ORR R0,R0,R1
B ??at91_tc_set_mode_1
; 731 //* Else
; 732 else
; 733 //* Clear bits in the Mode Register corresponding to the mask
; 734 tc_pt->tc_base->TC_CMR &= ~mask ;
??at91_tc_set_mode_0:
MVN R1,R1
LDR R2,[R0, #+0]
LDR R0,[R2, #+4]
AND R0,R0,R1
??at91_tc_set_mode_1:
STR R0,[R2, #+4]
; 735 //* EndIf
; 736 }
MOV PC,LR ;; return
CFI EndBlock cfiBlock22
; 737 //* End
; 738
; 739 //*----------------------------------------------------------------------------
; 740 //* Function Name : at91_tc_read
; 741 //* Object : Read all Timer Counter Register
; 742 //* Input Parameters : <tc_pt> = Channel Descriptor Pointer
; 743 //* : <reg> = Destination Register Value Table Pointer
; 744 //* Output Parameters : None
; 745 //* Functions called : None
; 746 //*----------------------------------------------------------------------------
RSEG NEARFUNC_A:CODE:NOROOT(2)
CFI Block cfiBlock23 Using cfiCommon0
CFI Function at91_tc_read
CODE32
; 747 void at91_tc_read ( const TCDesc *tc_pt, u_int reg[] )
; 748 //* Begin
; 749 {
; 750 reg[RA] = tc_pt->tc_base->TC_RA ;
at91_tc_read:
MOV R2,R1
LDR R1,[R0, #+0]
LDR R3,[R1, #+20]
STR R3,[R2, #+0]
; 751 reg[RB] = tc_pt->tc_base->TC_RB ;
LDR R1,[R0, #+0]
LDR R3,[R1, #+24]
STR R3,[R2, #+4]
; 752 reg[RC] = tc_pt->tc_base->TC_RC ;
LDR R1,[R0, #+0]
LDR R3,[R1, #+28]
STR R3,[R2, #+8]
; 753 reg[CV] = tc_pt->tc_base->TC_CV ;
LDR R1,[R0, #+0]
LDR R0,[R1, #+16]
STR R0,[R2, #+12]
; 754 }
MOV PC,LR ;; return
CFI EndBlock cfiBlock23
; 755 //* End
; 756
; 757 //*----------------------------------------------------------------------------
; 758 //* Function Name : at91_tc_write
; 759 //* Object : Write Timer Counter Register
; 760 //* Input Parameters : <tc_pt> = Timer Counter Channel Descriptor Pointer
; 761 //* : <reg> = Source Register Value Table Pointer
; 762 //* Output Parameters : None
; 763 //* Functions called : None
; 764 //*----------------------------------------------------------------------------
RSEG NEARFUNC_A:CODE:NOROOT(2)
CFI Block cfiBlock24 Using cfiCommon0
CFI Function at91_tc_write
CODE32
; 765 void at91_tc_write ( const TCDesc *tc_pt, u_int reg[] )
at91_tc_write:
REQUIRE ??Subroutine2_0
; 766 //* Begin
; 767 {
; 768 //* First Value -> Register A
; 769 tc_pt->tc_base->TC_RA = reg[RA] ;
MOV R2,R1
LDR R1,[R2, #+0]
LDR R3,[R0, #+0]
STR R1,[R3, #+20]
; 770 //* Second Value -> Register B
; 771 tc_pt->tc_base->TC_RB = reg[RB] ;
LDR R1,[R2, #+4]
LDR R3,[R0, #+0]
STR R1,[R3, #+24]
; 772 //* Third Value -> Register C
; 773 tc_pt->tc_base->TC_RC = reg[RC] ;
LDR R1,[R2, #+8]
CFI EndBlock cfiBlock24
; 774 }
RSEG NEARFUNC_A:CODE:NOROOT(2)
CFI Block cfiBlock25 Using cfiCommon0
CFI NoFunction
??Subroutine2_0:
LDR R2,[R0, #+0]
STR R1,[R2, #+28]
MOV PC,LR ;; return
CFI EndBlock cfiBlock25
; 775 //* End
; 776 //*----------------------------------------------------------------------------
; 777 //* Function Name : Interrupt Handlig
; 778 //* Output Parameters : None
; 779 //* Functions called : None
; 780 //*----------------------------------------------------------------------------
; 781
RSEG NEARFUNC_A:CODE:NOROOT(2)
CFI Block cfiBlock26 Using cfiCommon0
CFI Function at91_default_fiq_handler
CODE32
; 782 void at91_default_fiq_handler (void)
at91_default_fiq_handler:
??at91_default_fiq_handler_0:
B ??at91_default_fiq_handler_0
CFI EndBlock cfiBlock26
; 783 {
; 784 for(;;);
; 785 }
RSEG NEARFUNC_A:CODE:NOROOT(2)
CFI Block cfiBlock27 Using cfiCommon0
CFI Function at91_default_irq_handler
CODE32
; 786 void at91_default_irq_handler (void)
at91_default_irq_handler:
??at91_default_irq_handler_0:
B ??at91_default_irq_handler_0
CFI EndBlock cfiBlock27
; 787 {
; 788 for(;;);
; 789 }
; 790
RSEG NEARFUNC_A:CODE:NOROOT(2)
CFI Block cfiBlock28 Using cfiCommon0
CFI Function at91_spurious_handler
CODE32
; 791 void at91_spurious_handler (void)
at91_spurious_handler:
??at91_spurious_handler_0:
B ??at91_spurious_handler_0
CFI EndBlock cfiBlock28
RSEG HUGE_ID:HUGECONST:SORT:NOROOT(2)
`?<Initializer for Pio>`:
DC32 0FFFF0000H
RSEG HUGE_ID:HUGECONST:SORT:NOROOT(2)
`?*?HUGE_ID`:
RSEG INITTAB:CODE:ROOT(2)
?init?tab?HUGE_I:
DCD sfe(HUGE_I) - sfb(HUGE_I), sfb(HUGE_I), sfb(HUGE_ID)
END
; 792 {
; 793 for(;;);
; 794 }
; 795
; 796
;
; 80 bytes in segment HUGE_C
; 4 bytes in segment HUGE_I
; 4 bytes in segment HUGE_ID
; 12 bytes in segment INITTAB
; 1 240 bytes in segment NEARFUNC_A
;
; 1 240 bytes of CODE memory (+ 12 bytes shared)
; 84 bytes of HUGECONST memory
; 4 bytes of HUGEDATA memory
;
;Errors: none
;Warnings: 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -