; generated by ARM C/C++ Compiler, 4.1 [Build 894]
; commandline ArmCC [--list --split_sections --debug -c --asm --interleave -o.\obj\i2c.o --asm_dir=.\lst\ --list_dir=.\lst\ --depend=.\obj\i2c.d --cpu=Cortex-M0 --apcs=interwork -I..\..\..\..\Library\Device\Nuvoton\Nano1X2Series\Include -I..\..\..\..\Library\StdDriver\inc -I..\..\..\..\Library\CMSIS\Include -IC:\Keil\ARM\RV31\Inc -IC:\Keil\ARM\CMSIS\Include -D__MICROLIB --omf_browse=.\obj\i2c.crf ..\..\..\..\Library\StdDriver\src\i2c.c]
                          THUMB

                          AREA ||i.I2C_ClearTimeoutFlag||, CODE, READONLY, ALIGN=1

                  I2C_ClearTimeoutFlag PROC
;;;71       */
;;;72     void I2C_ClearTimeoutFlag(I2C_T *i2c)
000000  6841              LDR      r1,[r0,#4]
;;;73     {
;;;74         i2c->INTSTS |= I2C_INTSTS_TIF_Msk;
000002  2202              MOVS     r2,#2
000004  4311              ORRS     r1,r1,r2
000006  6041              STR      r1,[r0,#4]
;;;75     }
000008  4770              BX       lr
;;;76     
                          ENDP


                          AREA ||i.I2C_Close||, CODE, READONLY, ALIGN=2

                  I2C_Close PROC
;;;51       */
;;;52     void I2C_Close(I2C_T *i2c)
000000  2105              MOVS     r1,#5
;;;53     {
;;;54         /* Reset I2C */
;;;55         if((uint32_t)i2c == I2C0_BASE) {
000002  4a09              LDR      r2,|L2.40|
;;;56             SYS->IPRST_CTL2 |= SYS_IPRST_CTL2_I2C0_RST_Msk;
000004  0709              LSLS     r1,r1,#28
;;;57             SYS->IPRST_CTL2 &= ~SYS_IPRST_CTL2_I2C0_RST_Msk;
;;;58         } else {
;;;59             SYS->IPRST_CTL2 |= SYS_IPRST_CTL2_I2C1_RST_Msk;
000006  68cb              LDR      r3,[r1,#0xc]
000008  4290              CMP      r0,r2                 ;55
00000a  d101              BNE      |L2.16|
00000c  1582              ASRS     r2,r0,#22             ;56
00000e  e001              B        |L2.20|
                  |L2.16|
000010  2201              MOVS     r2,#1
000012  0252              LSLS     r2,r2,#9
                  |L2.20|
000014  4313              ORRS     r3,r3,r2
000016  60cb              STR      r3,[r1,#0xc]
;;;60             SYS->IPRST_CTL2 &= ~SYS_IPRST_CTL2_I2C1_RST_Msk;
000018  68cb              LDR      r3,[r1,#0xc]
00001a  4393              BICS     r3,r3,r2
00001c  60cb              STR      r3,[r1,#0xc]
;;;61         }
;;;62     
;;;63         /* Disable I2C */
;;;64         i2c->CON &= ~I2C_CON_IPEN_Msk;
00001e  6801              LDR      r1,[r0,#0]
000020  0849              LSRS     r1,r1,#1
000022  0049              LSLS     r1,r1,#1
000024  6001              STR      r1,[r0,#0]
;;;65     }
000026  4770              BX       lr
;;;66     
                          ENDP

                  |L2.40|
                          DCD      0x40020000

                          AREA ||i.I2C_DisableInt||, CODE, READONLY, ALIGN=1

                  I2C_DisableInt PROC
;;;107      */
;;;108    void I2C_DisableInt(I2C_T *i2c)
000000  6801              LDR      r1,[r0,#0]
;;;109    {
;;;110        i2c->CON &= ~I2C_CON_INTEN_Msk;
000002  2280              MOVS     r2,#0x80
000004  4391              BICS     r1,r1,r2
000006  6001              STR      r1,[r0,#0]
;;;111    }
000008  4770              BX       lr
;;;112    
                          ENDP


                          AREA ||i.I2C_DisableTimeout||, CODE, READONLY, ALIGN=1

                  I2C_DisableTimeout PROC
;;;260      */
;;;261    void I2C_DisableTimeout(I2C_T *i2c)
000000  6901              LDR      r1,[r0,#0x10]
;;;262    {
;;;263        i2c->TOUT &= ~I2C_TOUT_TOUTEN_Msk;
000002  0849              LSRS     r1,r1,#1
000004  0049              LSLS     r1,r1,#1
000006  6101              STR      r1,[r0,#0x10]
;;;264    }
000008  4770              BX       lr
;;;265    
                          ENDP


                          AREA ||i.I2C_DisableWakeup||, CODE, READONLY, ALIGN=1

                  I2C_DisableWakeup PROC
;;;280      */
;;;281    void I2C_DisableWakeup(I2C_T *i2c)
000000  6bc1              LDR      r1,[r0,#0x3c]
;;;282    {
;;;283        i2c->CON2 &= ~I2C_CON2_WKUPEN_Msk;
000002  0849              LSRS     r1,r1,#1
000004  0049              LSLS     r1,r1,#1
000006  63c1              STR      r1,[r0,#0x3c]
;;;284    }
000008  4770              BX       lr
;;;285    
                          ENDP


                          AREA ||i.I2C_EnableInt||, CODE, READONLY, ALIGN=1

                  I2C_EnableInt PROC
;;;117      */
;;;118    void I2C_EnableInt(I2C_T *i2c)
000000  6801              LDR      r1,[r0,#0]
;;;119    {
;;;120        i2c->CON |= I2C_CON_INTEN_Msk;
000002  2280              MOVS     r2,#0x80
000004  4311              ORRS     r1,r1,r2
000006  6001              STR      r1,[r0,#0]
;;;121    }
000008  4770              BX       lr
;;;122    
                          ENDP


                          AREA ||i.I2C_EnableTimeout||, CODE, READONLY, ALIGN=1

                  I2C_EnableTimeout PROC
;;;245      */
;;;246    void I2C_EnableTimeout(I2C_T *i2c, uint8_t u8LongTimeout)
000000  2202              MOVS     r2,#2
;;;247    {
;;;248        if(u8LongTimeout)
000002  2900              CMP      r1,#0
;;;249            i2c->TOUT |= I2C_TOUT_DIV4_Msk;
;;;250        else
;;;251            i2c->TOUT &= ~I2C_TOUT_DIV4_Msk;
000004  6901              LDR      r1,[r0,#0x10]
000006  d001              BEQ      |L7.12|
000008  4311              ORRS     r1,r1,r2              ;249
00000a  e000              B        |L7.14|
                  |L7.12|
00000c  4391              BICS     r1,r1,r2
                  |L7.14|
00000e  6101              STR      r1,[r0,#0x10]
;;;252    
;;;253        i2c->TOUT |= I2C_TOUT_TOUTEN_Msk;
000010  6901              LDR      r1,[r0,#0x10]
000012  2201              MOVS     r2,#1
000014  4311              ORRS     r1,r1,r2
000016  6101              STR      r1,[r0,#0x10]
;;;254    }
000018  4770              BX       lr
;;;255    
                          ENDP


                          AREA ||i.I2C_EnableWakeup||, CODE, READONLY, ALIGN=1

                  I2C_EnableWakeup PROC
;;;270      */
;;;271    void I2C_EnableWakeup(I2C_T *i2c)
000000  6bc1              LDR      r1,[r0,#0x3c]
;;;272    {
;;;273        i2c->CON2 |= I2C_CON2_WKUPEN_Msk;
000002  2201              MOVS     r2,#1
000004  4311              ORRS     r1,r1,r2
000006  63c1              STR      r1,[r0,#0x3c]
;;;274    }
000008  4770              BX       lr
;;;275    
                          ENDP


                          AREA ||i.I2C_GetBusClockFreq||, CODE, READONLY, ALIGN=1

                  I2C_GetBusClockFreq PROC
;;;127      */
;;;128    uint32_t I2C_GetBusClockFreq(I2C_T *i2c)
000000  b510              PUSH     {r4,lr}
;;;129    {
;;;130        uint32_t u32Divider = i2c->DIV;
000002  68c4              LDR      r4,[r0,#0xc]
;;;131    
;;;132        return ( CLK_GetPCLKFreq() / ((u32Divider+1)<<2) );
000004  f7fffffe          BL       CLK_GetPCLKFreq
000008  00a1              LSLS     r1,r4,#2
00000a  1d09              ADDS     r1,r1,#4
00000c  f7fffffe          BL       __aeabi_uidivmod
;;;133    }
000010  bd10              POP      {r4,pc}
;;;134    
                          ENDP


                          AREA ||i.I2C_GetData||, CODE, READONLY, ALIGN=1

                  I2C_GetData PROC
;;;178      */
;;;179    uint32_t I2C_GetData(I2C_T *i2c)
000000  6940              LDR      r0,[r0,#0x14]
;;;180    {
;;;181        return ( i2c->DATA );
;;;182    }
000002  4770              BX       lr
;;;183    
                          ENDP


                          AREA ||i.I2C_GetIntFlag||, CODE, READONLY, ALIGN=1

                  I2C_GetIntFlag PROC
;;;158      */
;;;159    uint32_t I2C_GetIntFlag(I2C_T *i2c)
000000  6840              LDR      r0,[r0,#4]
;;;160    {
;;;161        return ( (i2c->INTSTS & I2C_INTSTS_INTSTS_Msk) == I2C_INTSTS_INTSTS_Msk ? 1:0 );
000002  07c0              LSLS     r0,r0,#31
000004  0fc0              LSRS     r0,r0,#31
;;;162    }
000006  4770              BX       lr
;;;163    
                          ENDP


                          AREA ||i.I2C_GetStatus||, CODE, READONLY, ALIGN=1

                  I2C_GetStatus PROC
;;;168      */
;;;169    uint32_t I2C_GetStatus(I2C_T *i2c)
000000  6880              LDR      r0,[r0,#8]
;;;170    {
;;;171        return ( i2c->STATUS );
;;;172    }
000002  4770              BX       lr
;;;173    
                          ENDP


                          AREA ||i.I2C_Open||, CODE, READONLY, ALIGN=1

                  I2C_Open PROC
;;;32       */
;;;33     uint32_t I2C_Open(I2C_T *i2c, uint32_t u32BusClock)
000000  b570              PUSH     {r4-r6,lr}
;;;34     {
000002  4604              MOV      r4,r0
000004  460e              MOV      r6,r1
;;;35         uint32_t u32Div;
;;;36         uint32_t u32Pclk = CLK_GetPCLKFreq();
000006  f7fffffe          BL       CLK_GetPCLKFreq
00000a  4605              MOV      r5,r0
;;;37     
;;;38         u32Div = (uint32_t) (((u32Pclk * 10)/(u32BusClock * 4) + 5) / 10 - 1); /* Compute proper divider for I2C clock */
00000c  220a              MOVS     r2,#0xa
00000e  00b1              LSLS     r1,r6,#2
000010  4350              MULS     r0,r2,r0
000012  f7fffffe          BL       __aeabi_uidivmod
000016  1d40              ADDS     r0,r0,#5
000018  210a              MOVS     r1,#0xa
00001a  f7fffffe          BL       __aeabi_uidivmod
00001e  1e40              SUBS     r0,r0,#1
;;;39         i2c->DIV = u32Div;
000020  60e0              STR      r0,[r4,#0xc]
;;;40     
;;;41         /* Enable I2C */
;;;42         i2c->CON |= I2C_CON_IPEN_Msk;
000022  6821              LDR      r1,[r4,#0]
000024  2201              MOVS     r2,#1
000026  4311              ORRS     r1,r1,r2
000028  6021              STR      r1,[r4,#0]
;;;43     
;;;44         return ( u32Pclk / ((u32Div+1)<<2) );
00002a  0081              LSLS     r1,r0,#2
00002c  1d09              ADDS     r1,r1,#4
00002e  4628              MOV      r0,r5
000030  f7fffffe          BL       __aeabi_uidivmod
;;;45     }
000034  bd70              POP      {r4-r6,pc}
;;;46     
                          ENDP


                          AREA ||i.I2C_SetBusClockFreq||, CODE, READONLY, ALIGN=1

                  I2C_SetBusClockFreq PROC
;;;140      */
;;;141    uint32_t I2C_SetBusClockFreq(I2C_T *i2c, uint32_t u32BusClock)
000000  b570              PUSH     {r4-r6,lr}
;;;142    {
000002  4605              MOV      r5,r0
000004  460e              MOV      r6,r1
;;;143        uint32_t u32Div;
;;;144        uint32_t u32Pclk = CLK_GetPCLKFreq();
000006  f7fffffe          BL       CLK_GetPCLKFreq
00000a  4604              MOV      r4,r0
;;;145    
;;;146        u32Div = (uint32_t) (((u32Pclk * 10)/(u32BusClock * 4) + 5) / 10 - 1); /* Compute proper divider for I2C clock */
00000c  220a              MOVS     r2,#0xa
00000e  00b1              LSLS     r1,r6,#2
000010  4350              MULS     r0,r2,r0
000012  f7fffffe          BL       __aeabi_uidivmod
000016  1d40              ADDS     r0,r0,#5
000018  210a              MOVS     r1,#0xa
00001a  f7fffffe          BL       __aeabi_uidivmod
00001e  1e40              SUBS     r0,r0,#1
;;;147        i2c->DIV = u32Div;
000020  60e8              STR      r0,[r5,#0xc]
;;;148    
;;;149        return ( u32Pclk / ((u32Div+1)<<2) );
000022  0081              LSLS     r1,r0,#2
000024  1d09              ADDS     r1,r1,#4
000026  4620              MOV      r0,r4
000028  f7fffffe          BL       __aeabi_uidivmod
;;;150    }
00002c  bd70              POP      {r4-r6,pc}
;;;151    
                          ENDP


                          AREA ||i.I2C_SetData||, CODE, READONLY, ALIGN=1

                  I2C_SetData PROC
;;;189      */
;;;190    void I2C_SetData(I2C_T *i2c, uint8_t u8Data)
000000  6141              STR      r1,[r0,#0x14]
;;;191    {
;;;192        i2c->DATA = u8Data;
;;;193    }
000002  4770              BX       lr
;;;194    
                          ENDP


                          AREA ||i.I2C_SetSlaveAddr||, CODE, READONLY, ALIGN=1

                  I2C_SetSlaveAddr PROC
;;;204      */
;;;205    void I2C_SetSlaveAddr(I2C_T *i2c, uint8_t u8SlaveNo, uint8_t u8SlaveAddr, uint8_t u8GCMode)
000000  0052              LSLS     r2,r2,#1
;;;206    {
;;;207        switch (u8SlaveNo) {
;;;208        case 0:
;;;209            i2c->SADDR0  = (u8SlaveAddr << 1) | u8GCMode;
000002  431a              ORRS     r2,r2,r3
000004  2900              CMP      r1,#0                 ;207
000006  d001              BEQ      |L16.12|
000008  2901              CMP      r1,#1                 ;207
00000a  d001              BEQ      |L16.16|
                  |L16.12|
;;;210            break;
;;;211        case 1:
;;;212            i2c->SADDR1  = (u8SlaveAddr << 1) | u8GCMode;
;;;213            break;
;;;214        default:
;;;215            i2c->SADDR0  = (u8SlaveAddr << 1) | u8GCMode;
00000c  6182              STR      r2,[r0,#0x18]
;;;216        }
;;;217    }
00000e  4770              BX       lr
                  |L16.16|
000010  61c2              STR      r2,[r0,#0x1c]         ;212
000012  4770              BX       lr
;;;218    
                          ENDP


                          AREA ||i.I2C_SetSlaveAddrMask||, CODE, READONLY, ALIGN=1

                  I2C_SetSlaveAddrMask PROC
;;;225      */
;;;226    void I2C_SetSlaveAddrMask(I2C_T *i2c, uint8_t u8SlaveNo, uint8_t u8SlaveAddrMask)
000000  0052              LSLS     r2,r2,#1
;;;227    {
;;;228        switch (u8SlaveNo) {
000002  2900              CMP      r1,#0
000004  d001              BEQ      |L17.10|
000006  2901              CMP      r1,#1
000008  d001              BEQ      |L17.14|
                  |L17.10|
;;;229        case 0:
;;;230            i2c->SAMASK0  = u8SlaveAddrMask << 1;
;;;231            break;
;;;232        case 1:
;;;233            i2c->SAMASK1  = u8SlaveAddrMask << 1;
;;;234            break;
;;;235        default:
;;;236            i2c->SAMASK0  = u8SlaveAddrMask << 1;
00000a  6282              STR      r2,[r0,#0x28]
;;;237        }
;;;238    }
00000c  4770              BX       lr
                  |L17.14|
00000e  62c2              STR      r2,[r0,#0x2c]         ;233
000010  4770              BX       lr
;;;239    
                          ENDP


                          AREA ||i.I2C_Trigger||, CODE, READONLY, ALIGN=1

                  I2C_Trigger PROC
;;;85       */
;;;86     void I2C_Trigger(I2C_T *i2c, uint8_t u8Start, uint8_t u8Stop, uint8_t u8Si, uint8_t u8Ack)
000000  b5f0              PUSH     {r4-r7,lr}
;;;87     {
;;;88         uint32_t u32Reg = 0;
;;;89         uint32_t u32Val = i2c->CON & ~(I2C_STA | I2C_STO | I2C_AA);
000002  9e05              LDR      r6,[sp,#0x14]
000004  6805              LDR      r5,[r0,#0]
000006  2400              MOVS     r4,#0                 ;88
000008  270e              MOVS     r7,#0xe
00000a  43bd              BICS     r5,r5,r7
;;;90     
;;;91         if (u8Start)
00000c  2900              CMP      r1,#0
00000e  d000              BEQ      |L18.18|
;;;92             u32Reg |= I2C_STA;
000010  2408              MOVS     r4,#8
                  |L18.18|
;;;93         if (u8Stop)
000012  2a00              CMP      r2,#0
000014  d001              BEQ      |L18.26|
;;;94             u32Reg |= I2C_STO;
000016  2104              MOVS     r1,#4
000018  430c              ORRS     r4,r4,r1
                  |L18.26|
;;;95         if (u8Si)
00001a  2b00              CMP      r3,#0
00001c  d001              BEQ      |L18.34|
;;;96             u32Reg |= I2C_SI;
00001e  2110              MOVS     r1,#0x10
000020  430c              ORRS     r4,r4,r1
                  |L18.34|
;;;97         if (u8Ack)
000022  2e00              CMP      r6,#0
000024  d001              BEQ      |L18.42|
;;;98             u32Reg |= I2C_AA;
000026  2102              MOVS     r1,#2
000028  430c              ORRS     r4,r4,r1
                  |L18.42|
;;;99     
;;;100        i2c->CON = u32Val | u32Reg;
00002a  4325              ORRS     r5,r5,r4
00002c  6005              STR      r5,[r0,#0]
;;;101    }
00002e  bdf0              POP      {r4-r7,pc}
;;;102    
                          ENDP


;*** Start embedded assembler ***

#line 1 "..\\..\\..\\..\\Library\\StdDriver\\src\\i2c.c"
	AREA ||.rev16_text||, CODE, READONLY
	THUMB
	EXPORT |__asm___5_i2c_c_I2C_Open____REV16|
#line 118 "..\\..\\..\\..\\Library\\CMSIS\\Include\\core_cmInstr.h"
|__asm___5_i2c_c_I2C_Open____REV16| PROC
#line 119

 rev16 r0, r0
 bx lr
	ENDP
	AREA ||.revsh_text||, CODE, READONLY
	THUMB
	EXPORT |__asm___5_i2c_c_I2C_Open____REVSH|
#line 132
|__asm___5_i2c_c_I2C_Open____REVSH| PROC
#line 133

 revsh r0, r0
 bx lr
	ENDP

;*** End   embedded assembler ***
