; generated by ARM C/C++ Compiler, 4.1 [Build 894]
; commandline ArmCC [--c99 --list --split_sections --debug -c --asm --interleave -o.\obj\nano1xx_i2c.o --asm_dir=.\lst\ --list_dir=.\lst\ --depend=.\obj\nano1xx_i2c.d --cpu=Cortex-M0 --apcs=interwork -I..\inc -I..\drv -I..\bsp -I..\bsp\Cmsis -I..\bsp\Driver -I..\bsp\system -I..\lib -I..\lib\libtk -IC:\Keil\ARM\RV31\Inc -IC:\Keil\ARM\CMSIS\Include -D__MICROLIB -D__LCDDISPLAY_BTL001_H --omf_browse=.\obj\nano1xx_i2c.crf ..\bsp\Driver\nano1xx_i2c.c]
                          THUMB

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

                  I2C_Close PROC
;;;77       */
;;;78     void I2C_Close(I2C_TypeDef *I2cPort)
000000  6801              LDR      r1,[r0,#0]
;;;79     {
;;;80         I2cPort->CON &= ~(I2C_CON_INTEN | I2C_CON_IPEN); 
000002  2281              MOVS     r2,#0x81
000004  4391              BICS     r1,r1,r2
000006  6001              STR      r1,[r0,#0]
;;;81     }
000008  4770              BX       lr
;;;82     
                          ENDP


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

                  I2C_Ctrl PROC
;;;30       */
;;;31     void I2C_Ctrl(I2C_TypeDef *I2cPort, uint8_t start, uint8_t stop, uint8_t ack)
000000  b510              PUSH     {r4,lr}
;;;32     {	
;;;33     	uint32_t Reg = 0;
000002  2400              MOVS     r4,#0
;;;34     	
;;;35     	if (start)
000004  2900              CMP      r1,#0
000006  d000              BEQ      |L2.10|
;;;36     		Reg |= I2C_CON_START;
000008  2408              MOVS     r4,#8
                  |L2.10|
;;;37     	if (stop)
00000a  2a00              CMP      r2,#0
00000c  d001              BEQ      |L2.18|
;;;38     	    Reg |= I2C_CON_STOP;
00000e  2104              MOVS     r1,#4
000010  430c              ORRS     r4,r4,r1
                  |L2.18|
;;;39     	if (ack)
000012  2b00              CMP      r3,#0
000014  d001              BEQ      |L2.26|
;;;40     		Reg |= I2C_CON_ACK;
000016  2102              MOVS     r1,#2
000018  430c              ORRS     r4,r4,r1
                  |L2.26|
;;;41     	
;;;42     	I2cPort->CON = (I2cPort->CON & ~0x1E) | Reg;
00001a  6801              LDR      r1,[r0,#0]
00001c  221e              MOVS     r2,#0x1e
00001e  4391              BICS     r1,r1,r2
000020  4321              ORRS     r1,r1,r4
000022  6001              STR      r1,[r0,#0]
;;;43     }
000024  bd10              POP      {r4,pc}
;;;44     
                          ENDP


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

                  I2C_DeInit PROC
;;;194      */
;;;195    void I2C_DeInit(I2C_TypeDef *I2cPort)
000000  4a05              LDR      r2,|L3.24|
;;;196    {
;;;197    	if((uint32_t)I2cPort == I2C1_BASE)
;;;198    		CLK->APBCLK &= ~CLK_APBCLK_I2C1_EN;
000002  4906              LDR      r1,|L3.28|
000004  4290              CMP      r0,r2                 ;197
;;;199    	else
;;;200    		CLK->APBCLK &= ~CLK_APBCLK_I2C0_EN;
000006  6888              LDR      r0,[r1,#8]
000008  d101              BNE      |L3.14|
00000a  1552              ASRS     r2,r2,#21             ;198
00000c  e001              B        |L3.18|
                  |L3.14|
00000e  22ff              MOVS     r2,#0xff
000010  3201              ADDS     r2,#1
                  |L3.18|
000012  4390              BICS     r0,r0,r2              ;198
000014  6088              STR      r0,[r1,#8]            ;198
;;;201    }
000016  4770              BX       lr
;;;202    
                          ENDP

                  |L3.24|
                          DCD      0x40120000
                  |L3.28|
                          DCD      0x50000200

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

                  I2C_DisableInt PROC
;;;115      */
;;;116    void I2C_DisableInt(I2C_TypeDef *I2cPort)
000000  6801              LDR      r1,[r0,#0]
;;;117    {
;;;118    	I2cPort->CON &= ~I2C_CON_INTEN;
000002  2280              MOVS     r2,#0x80
000004  4391              BICS     r1,r1,r2
000006  6001              STR      r1,[r0,#0]
;;;119    	
;;;120    	if((uint32_t)I2cPort == I2C0_BASE)	
000008  4a06              LDR      r2,|L4.36|
00000a  4907              LDR      r1,|L4.40|
00000c  4290              CMP      r0,r2
00000e  d102              BNE      |L4.22|
000010  2001              MOVS     r0,#1
000012  0480              LSLS     r0,r0,#18
;;;121    		NVIC_DisableIRQ(I2C0_IRQn);
000014  e004              B        |L4.32|
                  |L4.22|
;;;122    	else if((uint32_t)I2cPort == I2C1_BASE)	
000016  4a05              LDR      r2,|L4.44|
000018  4290              CMP      r0,r2
00001a  d102              BNE      |L4.34|
00001c  2001              MOVS     r0,#1
00001e  04c0              LSLS     r0,r0,#19
                  |L4.32|
000020  6008              STR      r0,[r1,#0]
                  |L4.34|
;;;123    		NVIC_DisableIRQ(I2C1_IRQn);   
;;;124    }
000022  4770              BX       lr
;;;125    
                          ENDP

                  |L4.36|
                          DCD      0x40020000
                  |L4.40|
                          DCD      0xe000e180
                  |L4.44|
                          DCD      0x40120000

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

                  I2C_EnableInt PROC
;;;100      */
;;;101    void I2C_EnableInt(I2C_TypeDef *I2cPort)
000000  6801              LDR      r1,[r0,#0]
;;;102    {	
;;;103    	I2cPort->CON |= I2C_CON_INTEN;
000002  2280              MOVS     r2,#0x80
000004  4311              ORRS     r1,r1,r2
000006  6001              STR      r1,[r0,#0]
;;;104    		
;;;105    	if((uint32_t)I2cPort == I2C0_BASE)	
000008  4a06              LDR      r2,|L5.36|
00000a  4907              LDR      r1,|L5.40|
00000c  4290              CMP      r0,r2
00000e  d102              BNE      |L5.22|
000010  2001              MOVS     r0,#1
000012  0480              LSLS     r0,r0,#18
;;;106    		NVIC_EnableIRQ(I2C0_IRQn);
000014  e004              B        |L5.32|
                  |L5.22|
;;;107    	else if((uint32_t)I2cPort == I2C1_BASE)	
000016  4a05              LDR      r2,|L5.44|
000018  4290              CMP      r0,r2
00001a  d102              BNE      |L5.34|
00001c  2001              MOVS     r0,#1
00001e  04c0              LSLS     r0,r0,#19
                  |L5.32|
000020  6008              STR      r0,[r1,#0]
                  |L5.34|
;;;108    		NVIC_EnableIRQ(I2C1_IRQn);	
;;;109    }
000022  4770              BX       lr
;;;110    
                          ENDP

                  |L5.36|
                          DCD      0x40020000
                  |L5.40|
                          DCD      0xe000e100
                  |L5.44|
                          DCD      0x40120000

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

                  I2C_GetClockFreq PROC
;;;87       */
;;;88     uint32_t I2C_GetClockFreq(I2C_TypeDef *I2cPort)
000000  b510              PUSH     {r4,lr}
;;;89     {
;;;90         uint32_t divider;     
;;;91      
;;;92     	divider = I2cPort->DIV;
000002  68c4              LDR      r4,[r0,#0xc]
;;;93     	return ( SYS_GetHCLKFreq() / ((divider+1)<<2) );
000004  f7fffffe          BL       SYS_GetHCLKFreq
000008  00a1              LSLS     r1,r4,#2
00000a  1d09              ADDS     r1,r1,#4
00000c  f7fffffe          BL       __aeabi_uidivmod
;;;94     }
000010  bd10              POP      {r4,pc}
;;;95     
                          ENDP


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

                  I2C_Init PROC
;;;181      */
;;;182    void I2C_Init(I2C_TypeDef *I2cPort)
000000  4a05              LDR      r2,|L7.24|
;;;183    {
;;;184    	if((uint32_t)I2cPort == I2C1_BASE)
;;;185    		CLK->APBCLK |= CLK_APBCLK_I2C1_EN;
000002  4906              LDR      r1,|L7.28|
000004  4290              CMP      r0,r2                 ;184
;;;186    	else
;;;187    		CLK->APBCLK |= CLK_APBCLK_I2C0_EN;
000006  6888              LDR      r0,[r1,#8]
000008  d101              BNE      |L7.14|
00000a  1552              ASRS     r2,r2,#21             ;185
00000c  e001              B        |L7.18|
                  |L7.14|
00000e  22ff              MOVS     r2,#0xff
000010  3201              ADDS     r2,#1
                  |L7.18|
000012  4310              ORRS     r0,r0,r2              ;185
000014  6088              STR      r0,[r1,#8]            ;185
;;;188    }
000016  4770              BX       lr
;;;189    
                          ENDP

                  |L7.24|
                          DCD      0x40120000
                  |L7.28|
                          DCD      0x50000200

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

                  I2C_Open PROC
;;;51       */
;;;52     void I2C_Open(I2C_TypeDef *I2cPort, uint32_t u32BusClock)
000000  b570              PUSH     {r4-r6,lr}
;;;53     {
000002  4604              MOV      r4,r0
000004  460d              MOV      r5,r1
;;;54         uint32_t divider;     
;;;55      	 	
;;;56     	divider = (uint32_t) (((SYS_GetHCLKFreq()*10)/(u32BusClock * 4) + 5) / 10 - 1);	/* Compute proper divider for I2C clock */
000006  f7fffffe          BL       SYS_GetHCLKFreq
00000a  210a              MOVS     r1,#0xa
00000c  4348              MULS     r0,r1,r0
00000e  00a9              LSLS     r1,r5,#2
000010  f7fffffe          BL       __aeabi_uidivmod
000014  1d40              ADDS     r0,r0,#5
000016  210a              MOVS     r1,#0xa
000018  f7fffffe          BL       __aeabi_uidivmod
00001c  1e41              SUBS     r1,r0,#1
;;;57     	
;;;58         if((uint32_t)I2cPort == I2C1_BASE)
;;;59     	{		
;;;60     		GCR->IPRST_CTL2 |= GCR_IPRSTCTL2_I2C1;
00001e  2005              MOVS     r0,#5
000020  4a08              LDR      r2,|L8.68|
000022  0700              LSLS     r0,r0,#28
;;;61     		GCR->IPRST_CTL2 &= ~GCR_IPRSTCTL2_I2C1;		
;;;62     	}
;;;63     	else
;;;64     	{		
;;;65     		GCR->IPRST_CTL2 |= GCR_IPRSTCTL2_I2C0;
000024  68c3              LDR      r3,[r0,#0xc]
000026  4294              CMP      r4,r2                 ;58
000028  d101              BNE      |L8.46|
00002a  1552              ASRS     r2,r2,#21             ;60
00002c  e001              B        |L8.50|
                  |L8.46|
00002e  22ff              MOVS     r2,#0xff
000030  3201              ADDS     r2,#1
                  |L8.50|
000032  4313              ORRS     r3,r3,r2
000034  60c3              STR      r3,[r0,#0xc]
;;;66     		GCR->IPRST_CTL2 &= ~GCR_IPRSTCTL2_I2C0;	
000036  68c3              LDR      r3,[r0,#0xc]
000038  4393              BICS     r3,r3,r2
00003a  60c3              STR      r3,[r0,#0xc]
;;;67     	}
;;;68     	
;;;69     	I2cPort->DIV = divider;
00003c  60e1              STR      r1,[r4,#0xc]
;;;70     	I2cPort->CON = I2C_CON_INTEN | I2C_CON_IPEN;
00003e  2081              MOVS     r0,#0x81
000040  6020              STR      r0,[r4,#0]
;;;71     }
000042  bd70              POP      {r4-r6,pc}
;;;72     
                          ENDP

                  |L8.68|
                          DCD      0x40120000

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

                  I2C_SetAddress PROC
;;;134      */
;;;135    int32_t I2C_SetAddress(I2C_TypeDef *I2cPort, uint8_t slaveNo, uint8_t slave_addr, uint8_t GC_Flag)
000000  0052              LSLS     r2,r2,#1
;;;136    {	
;;;137    	switch (slaveNo)
;;;138    	{
;;;139    		case 0:
;;;140    			I2cPort->SADDR0 = (slave_addr << 1) | GC_Flag;
000002  431a              ORRS     r2,r2,r3
000004  2900              CMP      r1,#0                 ;137
000006  d004              BEQ      |L9.18|
000008  2901              CMP      r1,#1                 ;137
00000a  d004              BEQ      |L9.22|
;;;141    			break;
;;;142    		case 1:
;;;143    			I2cPort->SADDR1 = (slave_addr << 1) | GC_Flag;
;;;144    			break;			
;;;145    		default:
;;;146    			return -1;
00000c  2000              MOVS     r0,#0
00000e  43c0              MVNS     r0,r0
;;;147    	}
;;;148    
;;;149    	return 0;
;;;150    }
000010  4770              BX       lr
                  |L9.18|
000012  6182              STR      r2,[r0,#0x18]         ;140
000014  e000              B        |L9.24|
                  |L9.22|
000016  61c2              STR      r2,[r0,#0x1c]         ;143
                  |L9.24|
000018  2000              MOVS     r0,#0                 ;149
00001a  4770              BX       lr
;;;151    
                          ENDP


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

                  I2C_SetAddressMask PROC
;;;159      */
;;;160    int32_t I2C_SetAddressMask(I2C_TypeDef *I2cPort, uint8_t slaveNo, uint8_t slaveAddrMask)
000000  0052              LSLS     r2,r2,#1
;;;161    {
;;;162    	switch (slaveNo)
000002  2900              CMP      r1,#0
000004  d004              BEQ      |L10.16|
000006  2901              CMP      r1,#1
000008  d004              BEQ      |L10.20|
;;;163    	{
;;;164    		case 0:
;;;165    			I2cPort->SAMASK0 = slaveAddrMask << 1;
;;;166    			break;
;;;167    		case 1:
;;;168    			I2cPort->SAMASK1 = slaveAddrMask << 1;
;;;169    			break;			
;;;170    		default:
;;;171    			return -1;
00000a  2000              MOVS     r0,#0
00000c  43c0              MVNS     r0,r0
;;;172    	}
;;;173    	
;;;174    	return 0;
;;;175    }
00000e  4770              BX       lr
                  |L10.16|
000010  6282              STR      r2,[r0,#0x28]         ;165
000012  e000              B        |L10.22|
                  |L10.20|
000014  62c2              STR      r2,[r0,#0x2c]         ;168
                  |L10.22|
000016  2000              MOVS     r0,#0                 ;174
000018  4770              BX       lr
;;;176    
                          ENDP


;*** Start embedded assembler ***

#line 1 "..\\bsp\\Driver\\nano1xx_i2c.c"
	AREA ||.rev16_text||, CODE, READONLY
	THUMB
	EXPORT |__asm___13_nano1xx_i2c_c_I2C_Ctrl____REV16|
#line 115 "C:\\Keil\\ARM\\CMSIS\\Include\\core_cmInstr.h"
|__asm___13_nano1xx_i2c_c_I2C_Ctrl____REV16| PROC
#line 116

 rev16 r0, r0
 bx lr
	ENDP
	AREA ||.revsh_text||, CODE, READONLY
	THUMB
	EXPORT |__asm___13_nano1xx_i2c_c_I2C_Ctrl____REVSH|
#line 130
|__asm___13_nano1xx_i2c_c_I2C_Ctrl____REVSH| PROC
#line 131

 revsh r0, r0
 bx lr
	ENDP

;*** End   embedded assembler ***
