📄 xllp_keypad.cod
字号:
; 166 : }
; 167 : *key = (unsigned char) ((C<<4) | RthBit);
00170 e1833202 orr r3, r3, r2, lsl #4
; 168 : }
; 169 : else
00174 ea000009 b |$L865|
00178 |$L712|
; 157 : else
; 158 : RthBit = 0x4;
; 159 : }else
; 160 : {
; 161 : if (c4 > 0x2)
00178 e3530002 cmp r3, #2
; 162 : RthBit = 0x1;
; 163 : else
0017c eaffffee b |$L872|
00180 |$L716|
; 164 : RthBit = 0x0;
00180 e3a03000 mov r3, #0
; 165 : }
; 166 : }
; 167 : *key = (unsigned char) ((C<<4) | RthBit);
00184 e1833202 orr r3, r3, r2, lsl #4
; 168 : }
; 169 : else
00188 ea000004 b |$L865|
0018c |$L849|
; 164 : RthBit = 0x0;
0018c e59d2000 ldr r2, [sp]
00190 e59d3000 ldr r3, [sp]
; 165 : }
; 166 : }
; 167 : *key = (unsigned char) ((C<<4) | RthBit);
00194 e1833202 orr r3, r3, r2, lsl #4
; 168 : }
; 169 : else
00198 ea000000 b |$L865|
0019c |$L668|
; 170 : *key = NO_KEY;
0019c e3a030ff mov r3, #0xFF
001a0 |$L865|
001a0 e5c83000 strb r3, [r8]
; 171 :
; 172 : // RETAILMSG(1,(TEXT("R is %x C is %x key is %x\r\n"), RthBit,C,*key));
; 173 :
; 174 : retval = XLLP_TRUE;
001a4 e3a00001 mov r0, #1
001a8 |$L664|
; 175 : }
; 176 : // RETAILMSG(1,(TEXT("ReadScanCodeAutomatically<\r\n")));
; 177 : return(retval);
; 178 : }
001a8 e28dd004 add sp, sp, #4
001ac e8bd41f0 ldmia sp!, {r4 - r8, lr}
001b0 e12fff1e bx lr
001b4 |$L880|
001b4 00000000 DCD |KP_Status|
001b8 |$M876|
ENDP ; |ReadScanCodeAutomatically|
EXPORT |XllpKpKeypressIsInProgress|
00004 AREA |.bss|, NOINIT
|?gplr0_InPinMask@?1??XllpKpKeypressIsInProgress@@9@9| % 0x4 ; `XllpKpKeypressIsInProgress'::`2'::gplr0_InPinMask
|?gplr0_OutPinMask@?1??XllpKpKeypressIsInProgress@@9@9| % 0x4 ; `XllpKpKeypressIsInProgress'::`2'::gplr0_OutPinMask
|?gplr0_AllPinsMask@?1??XllpKpKeypressIsInProgress@@9@9| % 0x4 ; `XllpKpKeypressIsInProgress'::`2'::gplr0_AllPinsMask
|?gplr1_InPinMask@?1??XllpKpKeypressIsInProgress@@9@9| % 0x4 ; `XllpKpKeypressIsInProgress'::`2'::gplr1_InPinMask
|?gplr1_OutPinMask@?1??XllpKpKeypressIsInProgress@@9@9| % 0x4 ; `XllpKpKeypressIsInProgress'::`2'::gplr1_OutPinMask
|?gplr1_AllPinsMask@?1??XllpKpKeypressIsInProgress@@9@9| % 0x4 ; `XllpKpKeypressIsInProgress'::`2'::gplr1_AllPinsMask
|?gplr2_InPinMask@?1??XllpKpKeypressIsInProgress@@9@9| % 0x4 ; `XllpKpKeypressIsInProgress'::`2'::gplr2_InPinMask
|?gplr2_OutPinMask@?1??XllpKpKeypressIsInProgress@@9@9| % 0x4 ; `XllpKpKeypressIsInProgress'::`2'::gplr2_OutPinMask
|?gplr2_AllPinsMask@?1??XllpKpKeypressIsInProgress@@9@9| % 0x4 ; `XllpKpKeypressIsInProgress'::`2'::gplr2_AllPinsMask
|?gplr3_InPinMask@?1??XllpKpKeypressIsInProgress@@9@9| % 0x4 ; `XllpKpKeypressIsInProgress'::`2'::gplr3_InPinMask
|?gplr3_OutPinMask@?1??XllpKpKeypressIsInProgress@@9@9| % 0x4 ; `XllpKpKeypressIsInProgress'::`2'::gplr3_OutPinMask
|?gplr3_AllPinsMask@?1??XllpKpKeypressIsInProgress@@9@9| % 0x4 ; `XllpKpKeypressIsInProgress'::`2'::gplr3_AllPinsMask
00000 AREA |.text| { |XllpKpKeypressIsInProgress| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 AREA |.pdata$$XllpKpKeypressIsInProgress|, PDATA, SELECTION=5, ASSOC=|.text| { |XllpKpKeypressIsInProgress| } ; comdat associative
|$T897| DCD |$L896|
DCD 0x40009302
; Function compile flags: /Ogsy
00000 AREA |.text| { |XllpKpKeypressIsInProgress| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 |XllpKpKeypressIsInProgress| PROC
; 195 : {
00000 |$L896|
00000 e92d4ff0 stmdb sp!, {r4 - r11, lr}
00004 e24dd014 sub sp, sp, #0x14
00008 |$M894|
00008 e1a02000 mov r2, r0
0000c e58d2010 str r2, [sp, #0x10]
; 196 : // Note that GPIOs used here only include MKOUTs, MKINs and non-rotary DKINs.
; 197 :
; 198 : static XLLP_BOOL_T xllpKpKIP_Initialized = XLLP_FALSE;
; 199 : static XLLP_UINT32_T gplr0_InPinMask, gplr0_OutPinMask, gplr0_AllPinsMask,
; 200 : gplr1_InPinMask, gplr1_OutPinMask, gplr1_AllPinsMask,
; 201 : gplr2_InPinMask, gplr2_OutPinMask, gplr2_AllPinsMask,
; 202 : gplr3_InPinMask, gplr3_OutPinMask, gplr3_AllPinsMask;
; 203 :
; 204 : XLLP_UINT32_T i;
; 205 : XLLP_UINT32_T gpioRegTmp;
; 206 : XLLP_UINT32_T activity = 0;
; 207 :
; 208 : // Set up masks only once. Do this in code rather than precalculation to expose
; 209 : // the algorithm and make it easily re-usable. Perform full init because fairly
; 210 : // fast and only done once.
; 211 :
; 212 : if (!xllpKpKIP_Initialized)
00010 e59f1230 ldr r1, [pc, #0x230]
00014 e5913030 ldr r3, [r1, #0x30]
00018 e3530000 cmp r3, #0
0001c 1a00007a bne |$L888|
; 213 : {
; 214 : gplr0_InPinMask = gplr0_OutPinMask = gplr0_AllPinsMask =
; 215 : gplr1_InPinMask = gplr1_OutPinMask = gplr1_AllPinsMask =
; 216 : gplr2_InPinMask = gplr2_OutPinMask = gplr2_AllPinsMask =
; 217 : gplr3_InPinMask = gplr3_OutPinMask = gplr3_AllPinsMask = 0;
; 218 :
; 219 : for (i=1 ;i<(XllpKpdGpioDirNonScrollWheelInList[0]+1) ;i++ )
00020 e59fe21c ldr lr, [pc, #0x21C]
00024 e3a04000 mov r4, #0
00028 e3a07000 mov r7, #0
0002c e59e3000 ldr r3, [lr]
00030 e3a05000 mov r5, #0
00034 e3a0a000 mov r10, #0
00038 e2833001 add r3, r3, #1
0003c e3a08000 mov r8, #0
00040 e3a0b000 mov r11, #0
00044 e3a09000 mov r9, #0
00048 e3a06000 mov r6, #0
0004c e3530001 cmp r3, #1
00050 e58d7004 str r7, [sp, #4]
00054 e58da008 str r10, [sp, #8]
00058 e58db00c str r11, [sp, #0xC]
0005c e58d6000 str r6, [sp]
00060 e5814008 str r4, [r1, #8]
00064 e5817020 str r7, [r1, #0x20]
00068 e581502c str r5, [r1, #0x2C]
0006c e581a014 str r10, [r1, #0x14]
00070 e5818018 str r8, [r1, #0x18]
00074 e581b000 str r11, [r1]
00078 e5819028 str r9, [r1, #0x28]
0007c e5816024 str r6, [r1, #0x24]
00080 9a00002b bls |$L755|
00084 e28e0004 add r0, lr, #4
00088 e3a0e000 mov lr, #0
0008c e2436001 sub r6, r3, #1
00090 e3a09001 mov r9, #1
00094 e3a08001 mov r8, #1
00098 e3a05001 mov r5, #1
0009c e3a04001 mov r4, #1
000a0 |$L753|
; 220 : {
; 221 : switch (XllpKpdGpioDirNonScrollWheelInList[i] / 32) // 32 pins per level register
000a0 e5902000 ldr r2, [r0]
000a4 e1b032a2 movs r3, r2, lsr #5
000a8 0a000010 beq |$L760|
000ac e3530001 cmp r3, #1
000b0 0a00000a beq |$L761|
000b4 e3530002 cmp r3, #2
000b8 0a000004 beq |$L762|
000bc e3530003 cmp r3, #3
000c0 1a00000d bne |$L754|
; 232 : case 3:
; 233 : gplr3_InPinMask |= (1u << (XllpKpdGpioDirNonScrollWheelInList[i] &31));
000c4 e202301f and r3, r2, #0x1F
000c8 e1877319 orr r7, r7, r9, lsl r3
; 234 : break;
000cc ea00000a b |$L754|
000d0 |$L762|
; 229 : case 2:
; 230 : gplr2_InPinMask |= (1u << (XllpKpdGpioDirNonScrollWheelInList[i] &31));
000d0 e202301f and r3, r2, #0x1F
000d4 e18aa318 orr r10, r10, r8, lsl r3
000d8 e581a014 str r10, [r1, #0x14]
; 231 : break;
000dc ea000006 b |$L754|
000e0 |$L761|
; 225 : break;
; 226 : case 1:
; 227 : gplr1_InPinMask |= (1u << (XllpKpdGpioDirNonScrollWheelInList[i] &31));
000e0 e202301f and r3, r2, #0x1F
000e4 e18bb315 orr r11, r11, r5, lsl r3
000e8 e581b000 str r11, [r1]
; 228 : break;
000ec ea000002 b |$L754|
000f0 |$L760|
; 222 : {
; 223 : case 0:
; 224 : gplr0_InPinMask |= (1u << (XllpKpdGpioDirNonScrollWheelInList[i] &31));
000f0 e202301f and r3, r2, #0x1F
000f4 e18ee314 orr lr, lr, r4, lsl r3
000f8 e581e024 str lr, [r1, #0x24]
000fc |$L754|
000fc e2800004 add r0, r0, #4
00100 e2566001 subs r6, r6, #1
00104 1affffe5 bne |$L753|
00108 e58de000 str lr, [sp]
0010c e59fe130 ldr lr, [pc, #0x130]
00110 e59d6000 ldr r6, [sp]
; 225 : break;
; 226 : case 1:
; 227 : gplr1_InPinMask |= (1u << (XllpKpdGpioDirNonScrollWheelInList[i] &31));
00114 e58db00c str r11, [sp, #0xC]
; 229 : case 2:
; 230 : gplr2_InPinMask |= (1u << (XllpKpdGpioDirNonScrollWheelInList[i] &31));
00118 e58da008 str r10, [sp, #8]
; 232 : case 3:
; 233 : gplr3_InPinMask |= (1u << (XllpKpdGpioDirNonScrollWheelInList[i] &31));
0011c e58d7004 str r7, [sp, #4]
00120 e5817020 str r7, [r1, #0x20]
00124 e3a04000 mov r4, #0
00128 e3a05000 mov r5, #0
0012c e3a08000 mov r8, #0
00130 e3a09000 mov r9, #0
00134 |$L755|
; 235 : }
; 236 : } // Input pin masks
; 237 :
; 238 : for (i=1 ;i<XllpKpdGpioDirOutList[0]+1 ;i++ )
00134 e59e3020 ldr r3, [lr, #0x20]
00138 e2832001 add r2, r3, #1
0013c e3520001 cmp r2, #1
00140 9a000025 bls |$L766|
00144 e28e3020 add r3, lr, #0x20
00148 e2830004 add r0, r3, #4
0014c e242e001 sub lr, r2, #1
00150 e3a06001 mov r6, #1
00154 e3a0a001 mov r10, #1
00158 e3a0b001 mov r11, #1
0015c e3a07001 mov r7, #1
00160 |$L764|
; 239 : {
; 240 : switch (XllpKpdGpioDirOutList[i] / 32) // 32 pins per level register
00160 e5903000 ldr r3, [r0]
00164 e1b022a3 movs r2, r3, lsr #5
00168 0a000010 beq |$L771|
0016c e3520001 cmp r2, #1
00170 0a00000a beq |$L772|
00174 e3520002 cmp r2, #2
00178 0a000004 beq |$L773|
0017c e3520003 cmp r2, #3
00180 1a00000d bne |$L765|
; 251 : case 3:
; 252 : gplr3_OutPinMask |= (1u << (XllpKpdGpioDirOutList[i] &31));
00184 e203301f and r3, r3, #0x1F
00188 e1844316 orr r4, r4, r6, lsl r3
; 253 : break;
0018c ea00000a b |$L765|
00190 |$L773|
; 248 : case 2:
; 249 : gplr2_OutPinMask |= (1u << (XllpKpdGpioDirOutList[i] &31));
00190 e203301f and r3, r3, #0x1F
00194 e185531a orr r5, r5, r10, lsl r3
00198 e581502c str r5, [r1, #0x2C]
; 250 : break;
0019c ea000006 b |$L765|
001a0 |$L772|
; 244 : break;
; 245 : case 1:
; 246 : gplr1_OutPinMask |= (1u << (XllpKpdGpioDirOutList[i] &31));
001a0 e203301f and r3, r3, #0x1F
001a4 e188831b orr r8, r8, r11, lsl r3
001a8 e5818018 str r8, [r1, #0x18]
; 247 : break;
001ac ea000002 b |$L765|
001b0 |$L771|
; 241 : {
; 242 : case 0:
; 243 : gplr0_OutPinMask |= (1u << (XllpKpdGpioDirOutList[i] &31));
001b0 e203301f and r3, r3, #0x1F
001b4 e1899317 orr r9, r9, r7, lsl r3
001b8 e5819028 str r9, [r1, #0x28]
001bc |$L765|
001bc e2800004 add r0, r0, #4
001c0 e25ee001 subs lr, lr, #1
001c4 1affffe5 bne |$L764|
001c8 e59d7004 ldr r7, [sp, #4]
001cc e59da008 ldr r10, [sp, #8]
001d0 e59db00c ldr r11, [sp, #0xC]
001d4 e59d6000 ldr r6, [sp]
; 251 : case 3:
; 252 : gplr3_OutPinMask |= (1u << (XllpKpdGpioDirOutList[i] &31));
001d8 e5814008 str r4, [r1, #8]
001dc |$L766|
; 254 : }
; 255 : } // Output pin masks
; 256 :
; 257 : gplr0_AllPinsMask = gplr0_InPinMask | gplr0_OutPinMask;
001dc e1893006 orr r3, r9, r6
; 258 : gplr1_AllPinsMask = gplr1_InPinMask | gplr1_OutPinMask;
001e0 e188200b orr r2, r8, r11
; 259 : gplr2_AllPinsMask = gplr2_InPinMask | gplr2_OutPinMask;
; 260 : gplr3_AllPinsMask = gplr3_InPinMask | gplr3_OutPinMask;
; 261 :
; 262 : xllpKpKIP_Initialized = XLLP_TRUE;
001e4 e3a06001 mov r6, #1
001e8 e185000a orr r0, r5, r10
001ec e184e007 orr lr, r4, r7
001f0 e581200c str r2, [r1, #0xC]
001f4 e59d2010 ldr r2, [sp, #0x10]
001f8 e5816030 str r6, [r1, #0x30]
001fc e5813004 str r3, [r1, #4]
00200 e5810010 str r0, [r1, #0x10]
00204 e581e01c str lr, [r1, #0x1C]
00208 ea000003 b |$L752|
0020c |$L888|
0020c e591502c ldr r5, [r1, #0x2C]
00210 e5910010 ldr r0, [r1, #0x10]
00214 e5914008 ldr r4, [r1, #8]
00218 e591e01c ldr lr, [r1, #0x1C]
0021c |$L752|
; 263 : }
; 264 :
; 265 : // Main calculation
; 266 : // Platform-specific optimization: For Mainstone, no keypad pins in GPLR[1:0].
; 267 :
; 268 : gpioRegTmp = v_pGPIOReg->GPLR2 ;
0021c e5923008 ldr r3, [r2, #8]
; 269 : activity = (gpioRegTmp ^ gplr2_OutPinMask) & gplr2_AllPinsMask;
; 270 :
; 271 : gpioRegTmp = v_pGPIOReg->GPLR3 ;
00220 e5922100 ldr r2, [r2, #0x100]
00224 e0253003 eor r3, r5, r3
00228 e0031000 and r1, r3, r0
; 272 : activity |= (gpioRegTmp ^ gplr3_OutPinMask) & gplr3_AllPinsMask;
0022c e0243002 eor r3, r4, r2
00230 e003300e and r3, r3, lr
00234 e1830001 orr r0, r3, r1
; 273 :
; 274 : return(activity);
; 275 :
; 276 : } // XllpKpKeypressIsInProgress()
00238 e28dd014 add sp, sp, #0x14
0023c e8bd4ff0 ldmia sp!, {r4 - r11, lr}
00240 e12fff1e bx lr
00244 |$L899|
00244 00000000 DCD |XllpKpdGpioDirNonScrollWheelInList|
00248 00000000 DCD |?gplr1_InPinMask@?1??XllpKpKeypressIsInProgress@@9@9|
0024c |$M895|
ENDP ; |XllpKpKeypressIsInProgress|
EXPORT |ReadDirectKeys|
00000 AREA |.text| { |ReadDirectKeys| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 AREA |.pdata$$ReadDirectKeys|, PDATA, SELECTION=5, ASSOC=|.text| { |ReadDirectKeys| } ; comdat associative
|$T916| DCD |$L915|
DCD 0x40002e01
; Function compile flags: /Ogsy
00000 AREA |.text| { |ReadDirectKeys| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 |ReadDirectKeys| PROC
; 285 : {
00000 |$L915|
00000 e92d4010 stmdb sp!, {r4, lr}
00004 |$M913|
; 286 : XLLP_UINT32_T CurrCount,SaveKpRotaryEncoderCountReg;
; 287 : static XLLP_UINT32_T PrevCount=START_VALUE;
; 288 : XLLP_BOOL_T retval;
; 289 : if(KP_Status & DIRECT_INTR_BIT)
00004 e59f30a8 ldr r3, [pc, #0xA8]
00008 e5933000 ldr r3, [r3]
0000c e3130020 tst r3, #0x20
00010 0a000023 beq |$L786|
; 290 : {
; 291 : SaveKpRotaryEncoderCountReg = v_pKeyPadRegs->kpRotaryEncoderCountReg;
00014 e5902010 ldr r2, [r0, #0x10]
; 292 : CurrCount = SaveKpRotaryEncoderCountReg & COUNT_MASK;
00018 e20230ff and r3, r2, #0xFF
; 293 : if(SaveKpRotaryEncoderCountReg & OVERFLOW_ROTARY_ENC_0)
0001c e3120902 tst r2, #2, 18
00020 0a000009 beq |$L787|
; 297 : *key = SCAN_CODE_SCROLL_UP; // Scroll Up
00024 e3a0400a mov r4, #0xA
00028 |$L912|
; 294 : {
; 295 : v_pKeyPadRegs->kpRotaryEncoderCountReg = START_VALUE;
; 296 : PrevCount = START_VALUE;
00028 e59f3080 ldr r3, [pc, #0x80]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -