From 3431411e6314626993da98fcca44fc0f1f0c6f8b Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Thu, 17 Apr 2014 12:53:42 +0300 Subject: [PATCH] adds a pie in the sky --- test/gpio.s | 4159 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 4159 insertions(+) create mode 100644 test/gpio.s diff --git a/test/gpio.s b/test/gpio.s new file mode 100644 index 00000000..c6c94b0d --- /dev/null +++ b/test/gpio.s @@ -0,0 +1,4159 @@ +@ this is the gpio library as assmebler. Just as an idea of all the things needed. The c is at the end. + .arch armv6 + .eabi_attribute 27, 3 + .eabi_attribute 28, 1 + .fpu vfp + .eabi_attribute 20, 1 + .eabi_attribute 21, 1 + .eabi_attribute 23, 3 + .eabi_attribute 24, 1 + .eabi_attribute 25, 1 + .eabi_attribute 26, 2 + .eabi_attribute 30, 6 + .eabi_attribute 18, 4 + .file "gpio.c" + .text +.Ltext0: + .cfi_sections .debug_frame + .local gGpioMap + .comm gGpioMap,4,4 + .local pcbRev + .comm pcbRev,4,4 + .section .rodata + .align 2 +.LC2: + .ascii "/dev/mem\000" + .align 2 +.LC3: + .ascii "gpio.c\000" + .align 2 +.LC4: + .ascii "open() failed. /dev/mem. errno %s.\000" + .align 2 +.LC5: + .ascii "mmap() failed. errno: %s.\000" + .align 2 +.LC6: + .ascii "close() failed. errno: %s.\000" + .align 2 +.LC7: + .ascii "/proc/cpuinfo\000" + .align 2 +.LC8: + .ascii "r\000" + .align 2 +.LC9: + .ascii "Revision\000" + .align 2 +.LC10: + .ascii "did not find revision in cpuinfo.\000" + .align 2 +.LC11: + .ascii "can't open /proc/cpuinfo. errno: %s.\000" + .text + .align 2 + .global gpioSetup + .type gpioSetup, %function +gpioSetup: +.LFB0: + .file 1 "gpio.c" + .loc 1 45 0 + .cfi_startproc + @ args = 0, pretend = 0, frame = 32 + @ frame_needed = 1, uses_anonymous_args = 0 + stmfd sp!, {r4, fp, lr} +.LCFI0: + .cfi_def_cfa_offset 12 + .cfi_offset 14, -4 + .cfi_offset 11, -8 + .cfi_offset 4, -12 + add fp, sp, #8 +.LCFI1: + .cfi_def_cfa 11, 4 + sub sp, sp, #44 + .loc 1 46 0 + mov r3, #0 + str r3, [fp, #-20] + .loc 1 47 0 + mov r3, #1 + str r3, [fp, #-16] + .loc 1 49 0 + ldr r0, .L13 + mov r1, #2 + bl open + str r0, [fp, #-20] + ldr r3, [fp, #-20] + cmp r3, #0 + bge .L2 + .loc 1 51 0 + ldr r3, .L13+4 + ldr r4, [r3, #0] + bl __errno_location + mov r3, r0 + ldr r3, [r3, #0] + mov r0, r3 + bl strerror + mov r3, r0 + str r3, [sp, #0] + mov r0, r4 + ldr r1, .L13+8 + mov r2, #51 + ldr r3, .L13+12 + bl dbgPrint + .loc 1 52 0 + mov r3, #5 + str r3, [fp, #-16] + b .L3 +.L2: + .loc 1 55 0 + ldr r3, [fp, #-20] + str r3, [sp, #0] + ldr r3, .L13+16 + str r3, [sp, #4] + mov r0, #0 + mov r1, #156 + mov r2, #3 + mov r3, #1 + bl mmap + mov r2, r0 + ldr r3, .L13+20 + str r2, [r3, #0] + ldr r3, .L13+20 + ldr r3, [r3, #0] + cmn r3, #1 + bne .L4 + .loc 1 62 0 + ldr r3, .L13+4 + ldr r4, [r3, #0] + bl __errno_location + mov r3, r0 + ldr r3, [r3, #0] + mov r0, r3 + bl strerror + mov r3, r0 + str r3, [sp, #0] + mov r0, r4 + ldr r1, .L13+8 + mov r2, #62 + ldr r3, .L13+24 + bl dbgPrint + .loc 1 63 0 + mov r3, #5 + str r3, [fp, #-16] + b .L3 +.L4: + .loc 1 67 0 + ldr r0, [fp, #-20] + bl close + mov r3, r0 + cmp r3, #0 + beq .L5 + .loc 1 69 0 + ldr r3, .L13+4 + ldr r4, [r3, #0] + bl __errno_location + mov r3, r0 + ldr r3, [r3, #0] + mov r0, r3 + bl strerror + mov r3, r0 + str r3, [sp, #0] + mov r0, r4 + ldr r1, .L13+8 + mov r2, #69 + ldr r3, .L13+28 + bl dbgPrint + .loc 1 70 0 + mov r3, #5 + str r3, [fp, #-16] + b .L3 +.L5: +.LBB2: + .loc 1 75 0 + ldr r2, .L13+32 + ldr r3, .L13+36 + mov r0, r2 + mov r1, r3 + bl fopen + str r0, [fp, #-24] + .loc 1 76 0 + ldr r3, [fp, #-24] + cmp r3, #0 + beq .L6 +.LBB3: + .loc 1 78 0 + mov r3, #0 + str r3, [fp, #-40] + .loc 1 82 0 + b .L7 +.L9: + .loc 1 84 0 + ldr r3, [fp, #-40] + mov r0, r3 + ldr r1, .L13+40 + bl strstr + mov r2, r0 + ldr r3, [fp, #-40] + cmp r2, r3 + bne .L7 +.LBB4: + .loc 1 86 0 + ldr r3, [fp, #-40] + mov r0, r3 + mov r1, #58 + bl strchr + str r0, [fp, #-32] + .loc 1 87 0 + ldr r3, [fp, #-32] + cmp r3, #0 + beq .L7 +.LBB5: + .loc 1 89 0 + ldr r3, [fp, #-32] + add r3, r3, #1 + mov r0, r3 + mov r1, #0 + mov r2, #16 + bl strtol + str r0, [fp, #-36] + .loc 1 91 0 + ldr r3, [fp, #-36] + cmp r3, #3 + bgt .L8 + .loc 1 93 0 + ldr r3, .L13+44 + mov r2, #1 + str r2, [r3, #0] + b .L7 +.L8: + .loc 1 98 0 + ldr r3, .L13+44 + mov r2, #2 + str r2, [r3, #0] +.L7: +.LBE5: +.LBE4: + .loc 1 82 0 discriminator 1 + sub r2, fp, #40 + sub r3, fp, #44 + mov r0, r2 + mov r1, r3 + ldr r2, [fp, #-24] + bl getline + str r0, [fp, #-28] + ldr r3, [fp, #-28] + cmp r3, #0 + bge .L9 + .loc 1 103 0 + ldr r3, .L13+44 + ldr r3, [r3, #0] + cmp r3, #0 + beq .L10 + .loc 1 105 0 + mov r3, #0 + str r3, [fp, #-16] + b .L11 +.L10: + .loc 1 109 0 + ldr r3, .L13+4 + ldr r3, [r3, #0] + mov r0, r3 + ldr r1, .L13+8 + mov r2, #109 + ldr r3, .L13+48 + bl dbgPrint + .loc 1 110 0 + mov r3, #5 + str r3, [fp, #-16] +.L11: + .loc 1 113 0 + ldr r3, [fp, #-40] + cmp r3, #0 + beq .L12 + .loc 1 115 0 + ldr r3, [fp, #-40] + mov r0, r3 + bl free +.L12: + .loc 1 117 0 + ldr r0, [fp, #-24] + bl fclose + b .L3 +.L6: +.LBE3: + .loc 1 121 0 + ldr r3, .L13+4 + ldr r4, [r3, #0] + bl __errno_location + mov r3, r0 + ldr r3, [r3, #0] + mov r0, r3 + bl strerror + mov r3, r0 + str r3, [sp, #0] + mov r0, r4 + ldr r1, .L13+8 + mov r2, #121 + ldr r3, .L13+52 + bl dbgPrint + .loc 1 122 0 + mov r3, #5 + str r3, [fp, #-16] +.L3: +.LBE2: + .loc 1 126 0 + ldr r3, [fp, #-16] + .loc 1 127 0 + mov r0, r3 + sub sp, fp, #8 + ldmfd sp!, {r4, fp, pc} +.L14: + .align 2 +.L13: + .word .LC2 + .word stderr + .word .LC3 + .word .LC4 + .word 538968064 + .word gGpioMap + .word .LC5 + .word .LC6 + .word .LC7 + .word .LC8 + .word .LC9 + .word pcbRev + .word .LC10 + .word .LC11 + .cfi_endproc +.LFE0: + .size gpioSetup, .-gpioSetup + .section .rodata + .align 2 +.LC12: + .ascii "gGpioMap was NULL. Ensure gpioSetup() was called su" + .ascii "ccessfully.\000" + .align 2 +.LC13: + .ascii "mummap() failed. errno %s.\000" + .text + .align 2 + .global gpioCleanup + .type gpioCleanup, %function +gpioCleanup: +.LFB1: + .loc 1 135 0 + .cfi_startproc + @ args = 0, pretend = 0, frame = 8 + @ frame_needed = 1, uses_anonymous_args = 0 + stmfd sp!, {r4, fp, lr} +.LCFI2: + .cfi_def_cfa_offset 12 + .cfi_offset 14, -4 + .cfi_offset 11, -8 + .cfi_offset 4, -12 + add fp, sp, #8 +.LCFI3: + .cfi_def_cfa 11, 4 + sub sp, sp, #20 + .loc 1 136 0 + mov r3, #1 + str r3, [fp, #-16] + .loc 1 138 0 + ldr r3, .L19 + ldr r3, [r3, #0] + cmp r3, #0 + bne .L16 + .loc 1 140 0 + ldr r3, .L19+4 + ldr r3, [r3, #0] + mov r0, r3 + ldr r1, .L19+8 + mov r2, #140 + ldr r3, .L19+12 + bl dbgPrint + .loc 1 141 0 + mov r3, #4 + str r3, [fp, #-16] + b .L17 +.L16: + .loc 1 144 0 + ldr r3, .L19 + ldr r3, [r3, #0] + mov r0, r3 + mov r1, #156 + bl munmap + mov r3, r0 + cmp r3, #0 + beq .L18 + .loc 1 146 0 + ldr r3, .L19+4 + ldr r4, [r3, #0] + bl __errno_location + mov r3, r0 + ldr r3, [r3, #0] + mov r0, r3 + bl strerror + mov r3, r0 + str r3, [sp, #0] + mov r0, r4 + ldr r1, .L19+8 + mov r2, #146 + ldr r3, .L19+16 + bl dbgPrint + .loc 1 147 0 + mov r3, #5 + str r3, [fp, #-16] + b .L17 +.L18: + .loc 1 152 0 + ldr r3, .L19 + mov r2, #0 + str r2, [r3, #0] + .loc 1 153 0 + mov r3, #0 + str r3, [fp, #-16] +.L17: + .loc 1 155 0 + ldr r3, [fp, #-16] + .loc 1 156 0 + mov r0, r3 + sub sp, fp, #8 + ldmfd sp!, {r4, fp, pc} +.L20: + .align 2 +.L19: + .word gGpioMap + .word stderr + .word .LC3 + .word .LC12 + .word .LC13 + .cfi_endproc +.LFE1: + .size gpioCleanup, .-gpioCleanup + .section .rodata + .align 2 +.LC14: + .ascii "gGpioMap was NULL. Ensure gpioSetup() called succes" + .ascii "sfully.\000" + .align 2 +.LC15: + .ascii "eFunction was out of range. %d\000" + .align 2 +.LC16: + .ascii "gpioValidatePin() failed. Ensure pin %d is valid.\000" + .text + .align 2 + .global gpioSetFunction + .type gpioSetFunction, %function +gpioSetFunction: +.LFB2: + .loc 1 165 0 + .cfi_startproc + @ args = 0, pretend = 0, frame = 16 + @ frame_needed = 1, uses_anonymous_args = 0 + stmfd sp!, {fp, lr} +.LCFI4: + .cfi_def_cfa_offset 8 + .cfi_offset 14, -4 + .cfi_offset 11, -8 + add fp, sp, #4 +.LCFI5: + .cfi_def_cfa 11, 4 + sub sp, sp, #24 + str r0, [fp, #-16] + str r1, [fp, #-20] + .loc 1 166 0 + mov r3, #1 + str r3, [fp, #-8] + .loc 1 168 0 + ldr r3, .L26 + ldr r3, [r3, #0] + cmp r3, #0 + bne .L22 + .loc 1 170 0 + ldr r3, .L26+4 + ldr r3, [r3, #0] + mov r0, r3 + ldr r1, .L26+8 + mov r2, #170 + ldr r3, .L26+12 + bl dbgPrint + .loc 1 171 0 + mov r3, #4 + str r3, [fp, #-8] + b .L23 +.L22: + .loc 1 174 0 + ldr r3, [fp, #-20] + cmp r3, #7 + bls .L24 + .loc 1 176 0 + ldr r3, .L26+4 + ldr r3, [r3, #0] + ldr r2, [fp, #-20] + str r2, [sp, #0] + mov r0, r3 + ldr r1, .L26+8 + mov r2, #176 + ldr r3, .L26+16 + bl dbgPrint + .loc 1 177 0 + mov r3, #3 + str r3, [fp, #-8] + b .L23 +.L24: + .loc 1 180 0 + ldr r0, [fp, #-16] + bl gpioValidatePin + str r0, [fp, #-8] + ldr r3, [fp, #-8] + cmp r3, #0 + beq .L25 + .loc 1 182 0 + ldr r3, .L26+4 + ldr r3, [r3, #0] + ldr r2, [fp, #-16] + str r2, [sp, #0] + mov r0, r3 + ldr r1, .L26+8 + mov r2, #182 + ldr r3, .L26+20 + bl dbgPrint + b .L23 +.L25: + .loc 1 189 0 + ldr r3, .L26 + ldr r1, [r3, #0] + ldr r3, [fp, #-16] + ldr r2, .L26+24 + smull r0, r2, r2, r3 + mov r2, r2, asr #2 + mov r3, r3, asr #31 + rsb r3, r3, r2 + mov r2, r3 + mov r2, r2, asl #2 + add r0, r1, r2 + ldr r2, .L26 + ldr r2, [r2, #0] + mov r3, r3, asl #2 + add r3, r2, r3 + ldr ip, [r3, #0] + ldr r1, [fp, #-16] + ldr r3, .L26+24 + smull r2, r3, r3, r1 + mov r2, r3, asr #2 + mov r3, r1, asr #31 + rsb r2, r3, r2 + mov r3, r2 + mov r3, r3, asl #2 + add r3, r3, r2 + mov r3, r3, asl #1 + rsb r2, r3, r1 + mov r3, r2 + mov r3, r3, asl #1 + add r3, r3, r2 + mov r2, #7 + mov r3, r2, asl r3 + mvn r3, r3 + and r3, ip, r3 + str r3, [r0, #0] + .loc 1 192 0 + ldr r3, .L26 + ldr r1, [r3, #0] + ldr r3, [fp, #-16] + ldr r2, .L26+24 + smull r0, r2, r2, r3 + mov r2, r2, asr #2 + mov r3, r3, asr #31 + rsb r3, r3, r2 + mov r2, r3 + mov r2, r2, asl #2 + add r0, r1, r2 + ldr r2, .L26 + ldr r2, [r2, #0] + mov r3, r3, asl #2 + add r3, r2, r3 + ldr ip, [r3, #0] + ldr r1, [fp, #-16] + ldr r3, .L26+24 + smull r2, r3, r3, r1 + mov r2, r3, asr #2 + mov r3, r1, asr #31 + rsb r2, r3, r2 + mov r3, r2 + mov r3, r3, asl #2 + add r3, r3, r2 + mov r3, r3, asl #1 + rsb r2, r3, r1 + mov r3, r2 + mov r3, r3, asl #1 + add r3, r3, r2 + ldr r2, [fp, #-20] + mov r3, r2, asl r3 + orr r3, ip, r3 + str r3, [r0, #0] + .loc 1 194 0 + mov r3, #0 + str r3, [fp, #-8] +.L23: + .loc 1 197 0 + ldr r3, [fp, #-8] + .loc 1 198 0 + mov r0, r3 + sub sp, fp, #4 + ldmfd sp!, {fp, pc} +.L27: + .align 2 +.L26: + .word gGpioMap + .word stderr + .word .LC3 + .word .LC14 + .word .LC15 + .word .LC16 + .word 1717986919 + .cfi_endproc +.LFE2: + .size gpioSetFunction, .-gpioSetFunction + .section .rodata + .align 2 +.LC17: + .ascii "state %d should have been %d or %d\000" + .text + .align 2 + .global gpioSetPin + .type gpioSetPin, %function +gpioSetPin: +.LFB3: + .loc 1 209 0 + .cfi_startproc + @ args = 0, pretend = 0, frame = 16 + @ frame_needed = 1, uses_anonymous_args = 0 + stmfd sp!, {fp, lr} +.LCFI6: + .cfi_def_cfa_offset 8 + .cfi_offset 14, -4 + .cfi_offset 11, -8 + add fp, sp, #4 +.LCFI7: + .cfi_def_cfa 11, 4 + sub sp, sp, #32 + str r0, [fp, #-16] + str r1, [fp, #-20] + .loc 1 210 0 + mov r3, #1 + str r3, [fp, #-8] + .loc 1 212 0 + ldr r3, .L34 + ldr r3, [r3, #0] + cmp r3, #0 + bne .L29 + .loc 1 214 0 + ldr r3, .L34+4 + ldr r3, [r3, #0] + mov r0, r3 + ldr r1, .L34+8 + mov r2, #214 + ldr r3, .L34+12 + bl dbgPrint + .loc 1 215 0 + mov r3, #4 + str r3, [fp, #-8] + b .L30 +.L29: + .loc 1 218 0 + ldr r0, [fp, #-16] + bl gpioValidatePin + str r0, [fp, #-8] + ldr r3, [fp, #-8] + cmp r3, #0 + beq .L31 + .loc 1 220 0 + ldr r3, .L34+4 + ldr r3, [r3, #0] + ldr r2, [fp, #-16] + str r2, [sp, #0] + mov r0, r3 + ldr r1, .L34+8 + mov r2, #220 + ldr r3, .L34+16 + bl dbgPrint + b .L30 +.L31: + .loc 1 223 0 + ldr r3, [fp, #-20] + cmp r3, #1 + bne .L32 + .loc 1 227 0 + ldr r3, .L34 + ldr r3, [r3, #0] + add r3, r3, #28 + mov r1, #1 + ldr r2, [fp, #-16] + mov r2, r1, asl r2 + str r2, [r3, #0] + .loc 1 228 0 + mov r3, #0 + str r3, [fp, #-8] + b .L30 +.L32: + .loc 1 231 0 + ldr r3, [fp, #-20] + cmp r3, #0 + bne .L33 + .loc 1 235 0 + ldr r3, .L34 + ldr r3, [r3, #0] + add r3, r3, #40 + mov r1, #1 + ldr r2, [fp, #-16] + mov r2, r1, asl r2 + str r2, [r3, #0] + .loc 1 236 0 + mov r3, #0 + str r3, [fp, #-8] + b .L30 +.L33: + .loc 1 241 0 + ldr r3, .L34+4 + ldr r3, [r3, #0] + ldr r2, [fp, #-20] + str r2, [sp, #0] + mov r2, #0 + str r2, [sp, #4] + mov r2, #1 + str r2, [sp, #8] + mov r0, r3 + ldr r1, .L34+8 + mov r2, #241 + ldr r3, .L34+20 + bl dbgPrint + .loc 1 242 0 + mov r3, #3 + str r3, [fp, #-8] +.L30: + .loc 1 245 0 + ldr r3, [fp, #-8] + .loc 1 246 0 + mov r0, r3 + sub sp, fp, #4 + ldmfd sp!, {fp, pc} +.L35: + .align 2 +.L34: + .word gGpioMap + .word stderr + .word .LC3 + .word .LC12 + .word .LC16 + .word .LC17 + .cfi_endproc +.LFE3: + .size gpioSetPin, .-gpioSetPin + .section .rodata + .align 2 +.LC18: + .ascii "Parameter state was NULL.\000" + .align 2 +.LC19: + .ascii "gpioValidatePin() failed. Pin %d isn't valid.\000" + .text + .align 2 + .global gpioReadPin + .type gpioReadPin, %function +gpioReadPin: +.LFB4: + .loc 1 256 0 + .cfi_startproc + @ args = 0, pretend = 0, frame = 16 + @ frame_needed = 1, uses_anonymous_args = 0 + stmfd sp!, {fp, lr} +.LCFI8: + .cfi_def_cfa_offset 8 + .cfi_offset 14, -4 + .cfi_offset 11, -8 + add fp, sp, #4 +.LCFI9: + .cfi_def_cfa 11, 4 + sub sp, sp, #24 + str r0, [fp, #-16] + str r1, [fp, #-20] + .loc 1 257 0 + mov r3, #1 + str r3, [fp, #-8] + .loc 1 259 0 + ldr r3, .L43 + ldr r3, [r3, #0] + cmp r3, #0 + bne .L37 + .loc 1 261 0 + ldr r3, .L43+4 + ldr r3, [r3, #0] + mov r0, r3 + ldr r1, .L43+8 + ldr r2, .L43+12 + ldr r3, .L43+16 + bl dbgPrint + .loc 1 262 0 + mov r3, #4 + str r3, [fp, #-8] + b .L38 +.L37: + .loc 1 265 0 + ldr r3, [fp, #-20] + cmp r3, #0 + bne .L39 + .loc 1 267 0 + ldr r3, .L43+4 + ldr r3, [r3, #0] + mov r0, r3 + ldr r1, .L43+8 + ldr r2, .L43+20 + ldr r3, .L43+24 + bl dbgPrint + .loc 1 268 0 + mov r3, #4 + str r3, [fp, #-8] + b .L38 +.L39: + .loc 1 271 0 + ldr r0, [fp, #-16] + bl gpioValidatePin + str r0, [fp, #-8] + ldr r3, [fp, #-8] + cmp r3, #0 + beq .L40 + .loc 1 273 0 + ldr r3, .L43+4 + ldr r3, [r3, #0] + ldr r2, [fp, #-16] + str r2, [sp, #0] + mov r0, r3 + ldr r1, .L43+8 + ldr r2, .L43+28 + ldr r3, .L43+32 + bl dbgPrint + b .L38 +.L40: + .loc 1 279 0 + ldr r3, .L43 + ldr r3, [r3, #0] + add r3, r3, #52 + ldr r2, [r3, #0] + mov r1, #1 + ldr r3, [fp, #-16] + mov r3, r1, asl r3 + and r3, r2, r3 + cmp r3, #0 + beq .L41 + .loc 1 281 0 + ldr r3, [fp, #-20] + mov r2, #1 + str r2, [r3, #0] + b .L42 +.L41: + .loc 1 286 0 + ldr r3, [fp, #-20] + mov r2, #0 + str r2, [r3, #0] +.L42: + .loc 1 289 0 + mov r3, #0 + str r3, [fp, #-8] +.L38: + .loc 1 292 0 + ldr r3, [fp, #-8] + .loc 1 293 0 + mov r0, r3 + sub sp, fp, #4 + ldmfd sp!, {fp, pc} +.L44: + .align 2 +.L43: + .word gGpioMap + .word stderr + .word .LC3 + .word 261 + .word .LC12 + .word 267 + .word .LC18 + .word 273 + .word .LC19 + .cfi_endproc +.LFE4: + .size gpioReadPin, .-gpioReadPin + .section .rodata + .align 2 +.LC20: + .ascii "resistorOption value: %d was out of range.\000" + .text + .align 2 + .global gpioSetPullResistor + .type gpioSetPullResistor, %function +gpioSetPullResistor: +.LFB5: + .loc 1 303 0 + .cfi_startproc + @ args = 0, pretend = 0, frame = 24 + @ frame_needed = 1, uses_anonymous_args = 0 + stmfd sp!, {fp, lr} +.LCFI10: + .cfi_def_cfa_offset 8 + .cfi_offset 14, -4 + .cfi_offset 11, -8 + add fp, sp, #4 +.LCFI11: + .cfi_def_cfa 11, 4 + sub sp, sp, #32 + str r0, [fp, #-24] + str r1, [fp, #-28] + .loc 1 304 0 + mov r3, #1 + str r3, [fp, #-8] + .loc 1 307 0 + ldr r3, .L50 + ldr r3, [r3, #0] + cmp r3, #0 + bne .L46 + .loc 1 309 0 + ldr r3, .L50+4 + ldr r3, [r3, #0] + mov r0, r3 + ldr r1, .L50+8 + ldr r2, .L50+12 + ldr r3, .L50+16 + bl dbgPrint + .loc 1 310 0 + mov r3, #4 + str r3, [fp, #-8] + b .L47 +.L46: + .loc 1 313 0 + ldr r0, [fp, #-24] + bl gpioValidatePin + str r0, [fp, #-8] + ldr r3, [fp, #-8] + cmp r3, #0 + beq .L48 + .loc 1 315 0 + ldr r3, .L50+4 + ldr r3, [r3, #0] + ldr r2, [fp, #-24] + str r2, [sp, #0] + mov r0, r3 + ldr r1, .L50+8 + ldr r2, .L50+20 + ldr r3, .L50+24 + bl dbgPrint + b .L47 +.L48: + .loc 1 318 0 + ldr r3, [fp, #-28] + cmp r3, #2 + bls .L49 + .loc 1 320 0 + ldr r3, .L50+4 + ldr r3, [r3, #0] + ldr r2, [fp, #-28] + str r2, [sp, #0] + mov r0, r3 + ldr r1, .L50+8 + mov r2, #320 + ldr r3, .L50+28 + bl dbgPrint + .loc 1 321 0 + mov r3, #3 + str r3, [fp, #-8] + b .L47 +.L49: + .loc 1 326 0 + mov r3, #0 + str r3, [fp, #-16] + .loc 1 327 0 + mov r3, #1000 + str r3, [fp, #-12] + .loc 1 330 0 + ldr r3, .L50 + ldr r3, [r3, #0] + add r3, r3, #148 + ldr r2, [fp, #-28] + str r2, [r3, #0] + .loc 1 332 0 + sub r3, fp, #16 + mov r0, r3 + mov r1, #0 + bl nanosleep + .loc 1 334 0 + ldr r3, .L50 + ldr r3, [r3, #0] + add r3, r3, #152 + mov r1, #1 + ldr r2, [fp, #-24] + mov r2, r1, asl r2 + str r2, [r3, #0] + .loc 1 336 0 + sub r3, fp, #16 + mov r0, r3 + mov r1, #0 + bl nanosleep + .loc 1 337 0 + ldr r3, .L50 + ldr r3, [r3, #0] + add r3, r3, #148 + mov r2, #0 + str r2, [r3, #0] + .loc 1 338 0 + ldr r3, .L50 + ldr r3, [r3, #0] + add r3, r3, #152 + mov r2, #0 + str r2, [r3, #0] + .loc 1 340 0 + mov r3, #0 + str r3, [fp, #-8] +.L47: + .loc 1 344 0 + ldr r3, [fp, #-8] + .loc 1 345 0 + mov r0, r3 + sub sp, fp, #4 + ldmfd sp!, {fp, pc} +.L51: + .align 2 +.L50: + .word gGpioMap + .word stderr + .word .LC3 + .word 309 + .word .LC12 + .word 315 + .word .LC19 + .word .LC20 + .cfi_endproc +.LFE5: + .size gpioSetPullResistor, .-gpioSetPullResistor + .section .rodata + .align 2 +.LC21: + .ascii "Parameter gpioNumberScl is NULL.\000" + .align 2 +.LC22: + .ascii "Parameter gpioNumberSda is NULL.\000" + .text + .align 2 + .global gpioGetI2cPins + .type gpioGetI2cPins, %function +gpioGetI2cPins: +.LFB6: + .loc 1 357 0 + .cfi_startproc + @ args = 0, pretend = 0, frame = 16 + @ frame_needed = 1, uses_anonymous_args = 0 + stmfd sp!, {fp, lr} +.LCFI12: + .cfi_def_cfa_offset 8 + .cfi_offset 14, -4 + .cfi_offset 11, -8 + add fp, sp, #4 +.LCFI13: + .cfi_def_cfa 11, 4 + sub sp, sp, #16 + str r0, [fp, #-16] + str r1, [fp, #-20] + .loc 1 358 0 + mov r3, #1 + str r3, [fp, #-8] + .loc 1 360 0 + ldr r3, .L58 + ldr r3, [r3, #0] + cmp r3, #0 + bne .L53 + .loc 1 362 0 + ldr r3, .L58+4 + ldr r3, [r3, #0] + mov r0, r3 + ldr r1, .L58+8 + ldr r2, .L58+12 + ldr r3, .L58+16 + bl dbgPrint + .loc 1 363 0 + mov r3, #4 + str r3, [fp, #-8] + b .L54 +.L53: + .loc 1 366 0 + ldr r3, [fp, #-16] + cmp r3, #0 + bne .L55 + .loc 1 368 0 + ldr r3, .L58+4 + ldr r3, [r3, #0] + mov r0, r3 + ldr r1, .L58+8 + mov r2, #368 + ldr r3, .L58+20 + bl dbgPrint + .loc 1 369 0 + mov r3, #4 + str r3, [fp, #-8] + b .L54 +.L55: + .loc 1 372 0 + ldr r3, [fp, #-20] + cmp r3, #0 + bne .L56 + .loc 1 374 0 + ldr r3, .L58+4 + ldr r3, [r3, #0] + mov r0, r3 + ldr r1, .L58+8 + ldr r2, .L58+24 + ldr r3, .L58+28 + bl dbgPrint + .loc 1 375 0 + mov r3, #4 + str r3, [fp, #-8] + b .L54 +.L56: + .loc 1 378 0 + ldr r3, .L58+32 + ldr r3, [r3, #0] + cmp r3, #1 + bne .L57 + .loc 1 380 0 + ldr r3, [fp, #-16] + mov r2, #1 + str r2, [r3, #0] + .loc 1 381 0 + ldr r3, [fp, #-20] + mov r2, #0 + str r2, [r3, #0] + .loc 1 382 0 + mov r3, #0 + str r3, [fp, #-8] + b .L54 +.L57: + .loc 1 385 0 + ldr r3, .L58+32 + ldr r3, [r3, #0] + cmp r3, #2 + bne .L54 + .loc 1 387 0 + ldr r3, [fp, #-16] + mov r2, #3 + str r2, [r3, #0] + .loc 1 388 0 + ldr r3, [fp, #-20] + mov r2, #2 + str r2, [r3, #0] + .loc 1 389 0 + mov r3, #0 + str r3, [fp, #-8] +.L54: + .loc 1 392 0 + ldr r3, [fp, #-8] + .loc 1 393 0 + mov r0, r3 + sub sp, fp, #4 + ldmfd sp!, {fp, pc} +.L59: + .align 2 +.L58: + .word gGpioMap + .word stderr + .word .LC3 + .word 362 + .word .LC12 + .word .LC21 + .word 374 + .word .LC22 + .word pcbRev + .cfi_endproc +.LFE6: + .size gpioGetI2cPins, .-gpioGetI2cPins + .section .rodata + .align 2 +.LC23: + .ascii "InvalidError\000" + .text + .align 2 + .global gpioErrToString + .type gpioErrToString, %function +gpioErrToString: +.LFB7: + .loc 1 406 0 + .cfi_startproc + @ args = 0, pretend = 0, frame = 8 + @ frame_needed = 1, uses_anonymous_args = 0 + @ link register save eliminated. + str fp, [sp, #-4]! +.LCFI14: + .cfi_def_cfa_offset 4 + .cfi_offset 11, -4 + add fp, sp, #0 +.LCFI15: + .cfi_def_cfa_register 11 + sub sp, sp, #12 + str r0, [fp, #-8] + .loc 1 409 0 + ldr r3, [fp, #-8] + cmp r3, #11 + bls .L61 + .loc 1 411 0 + ldr r3, .L63 + b .L62 +.L61: + .loc 1 416 0 + ldr r3, .L63+4 + ldr r2, [fp, #-8] + ldr r3, [r3, r2, asl #2] +.L62: + .loc 1 418 0 + mov r0, r3 + add sp, fp, #0 + ldmfd sp!, {fp} + bx lr +.L64: + .align 2 +.L63: + .word .LC23 + .word errorString.3344 + .cfi_endproc +.LFE7: + .size gpioErrToString, .-gpioErrToString + .section .rodata + .align 2 +.LC24: + .ascii "[%s:%d] \000" + .align 2 +.LC25: + .ascii "\012\000" + .text + .align 2 + .global dbgPrint + .type dbgPrint, %function +dbgPrint: +.LFB8: + .loc 1 440 0 + .cfi_startproc + @ args = 4, pretend = 4, frame = 32 + @ frame_needed = 1, uses_anonymous_args = 1 + str r3, [sp, #-4]! +.LCFI16: + .cfi_def_cfa_offset 4 + .cfi_offset 3, -4 + stmfd sp!, {fp, lr} +.LCFI17: + .cfi_def_cfa_offset 12 + .cfi_offset 14, -8 + .cfi_offset 11, -12 + add fp, sp, #4 +.LCFI18: + .cfi_def_cfa 11, 8 + sub sp, sp, #36 + str r0, [fp, #-28] + str r1, [fp, #-32] + str r2, [fp, #-36] + .loc 1 442 0 + mov r3, #0 + str r3, [fp, #-12] + .loc 1 443 0 + mov r3, #0 + str r3, [fp, #-16] + .loc 1 445 0 + ldr r3, [fp, #-28] + cmp r3, #0 + beq .L66 + .loc 1 447 0 + ldr r3, .L71 + ldr r0, [fp, #-28] + mov r1, r3 + ldr r2, [fp, #-32] + ldr r3, [fp, #-36] + bl fprintf + str r0, [fp, #-16] + ldr r3, [fp, #-16] + cmp r3, #0 + bge .L67 + .loc 1 449 0 + ldr r3, [fp, #-16] + b .L68 +.L67: + .loc 1 451 0 + ldr r2, [fp, #-12] + ldr r3, [fp, #-16] + add r3, r2, r3 + str r3, [fp, #-12] + .loc 1 453 0 + add r3, fp, #8 + str r3, [fp, #-20] + .loc 1 454 0 + ldr r0, [fp, #-28] + ldr r1, [fp, #4] + ldr r2, [fp, #-20] + bl vfprintf + str r0, [fp, #-16] + ldr r3, [fp, #-16] + cmp r3, #0 + bge .L69 + .loc 1 456 0 + ldr r3, [fp, #-16] + b .L68 +.L69: + .loc 1 458 0 + ldr r2, [fp, #-12] + ldr r3, [fp, #-16] + add r3, r2, r3 + str r3, [fp, #-12] + .loc 1 461 0 + ldr r3, .L71+4 + ldr r0, [fp, #-28] + mov r1, r3 + bl fprintf + str r0, [fp, #-16] + ldr r3, [fp, #-16] + cmp r3, #0 + bge .L70 + .loc 1 463 0 + ldr r3, [fp, #-16] + b .L68 +.L70: + .loc 1 465 0 + ldr r2, [fp, #-12] + ldr r3, [fp, #-16] + add r3, r2, r3 + str r3, [fp, #-12] +.L66: + .loc 1 468 0 + ldr r3, [fp, #-12] +.L68: + .loc 1 469 0 + mov r0, r3 + sub sp, fp, #4 + ldmfd sp!, {fp, lr} + add sp, sp, #4 + bx lr +.L72: + .align 2 +.L71: + .word .LC24 + .word .LC25 + .cfi_endproc +.LFE8: + .size dbgPrint, .-dbgPrint + .section .rodata + .align 2 +.LC0: + .word 0 + .word 1 + .word 4 + .word 7 + .word 8 + .word 9 + .word 10 + .word 11 + .word 14 + .word 15 + .word 17 + .word 18 + .word 21 + .word 22 + .word 23 + .word 24 + .word 25 + .align 2 +.LC1: + .word 2 + .word 3 + .word 4 + .word 7 + .word 8 + .word 9 + .word 10 + .word 11 + .word 14 + .word 15 + .word 17 + .word 18 + .word 22 + .word 23 + .word 24 + .word 25 + .word 27 + .text + .align 2 + .type gpioValidatePin, %function +gpioValidatePin: +.LFB9: + .loc 1 481 0 + .cfi_startproc + @ args = 0, pretend = 0, frame = 88 + @ frame_needed = 1, uses_anonymous_args = 0 + stmfd sp!, {fp, lr} +.LCFI19: + .cfi_def_cfa_offset 8 + .cfi_offset 14, -4 + .cfi_offset 11, -8 + add fp, sp, #4 +.LCFI20: + .cfi_def_cfa 11, 4 + sub sp, sp, #88 + str r0, [fp, #-88] + .loc 1 482 0 + mov r3, #2 + str r3, [fp, #-8] + .loc 1 483 0 + mov r3, #0 + str r3, [fp, #-12] + .loc 1 490 0 + ldr r3, .L81 + ldr r3, [r3, #0] + cmp r3, #0 + bne .L74 + .loc 1 492 0 + ldr r3, .L81+4 + ldr r3, [r3, #0] + cmp r3, #0 + bne .L75 + .loc 1 494 0 + mov r3, #3 + str r3, [fp, #-8] + b .L74 +.L75: + .loc 1 497 0 + ldr r3, .L81+4 + ldr r3, [r3, #0] + cmp r3, #1 + bne .L76 +.LBB6: + .loc 1 499 0 + ldr r3, .L81+8 + sub r1, fp, #80 + mov r2, r3 + mov r3, #68 + mov r0, r1 + mov r1, r2 + mov r2, r3 + bl memcpy + .loc 1 500 0 + ldr r2, .L81+12 + sub r3, fp, #80 + mov r1, r2 + mov r2, r3 + mov r3, #68 + mov r0, r1 + mov r1, r2 + mov r2, r3 + bl memcpy + .loc 1 501 0 + ldr r3, .L81 + mov r2, #17 + str r2, [r3, #0] + b .L74 +.L76: +.LBE6: + .loc 1 503 0 + ldr r3, .L81+4 + ldr r3, [r3, #0] + cmp r3, #2 + bne .L74 +.LBB7: + .loc 1 505 0 + ldr r3, .L81+16 + sub r1, fp, #80 + mov r2, r3 + mov r3, #68 + mov r0, r1 + mov r1, r2 + mov r2, r3 + bl memcpy + .loc 1 506 0 + ldr r2, .L81+12 + sub r3, fp, #80 + mov r1, r2 + mov r2, r3 + mov r3, #68 + mov r0, r1 + mov r1, r2 + mov r2, r3 + bl memcpy + .loc 1 507 0 + ldr r3, .L81 + mov r2, #17 + str r2, [r3, #0] +.L74: +.LBE7: + .loc 1 511 0 + mov r3, #0 + str r3, [fp, #-12] + b .L77 +.L80: + .loc 1 513 0 + ldr r2, [fp, #-88] + ldr r3, .L81+12 + ldr r1, [fp, #-12] + ldr r3, [r3, r1, asl #2] + cmp r2, r3 + bne .L78 + .loc 1 515 0 + mov r3, #0 + str r3, [fp, #-8] + .loc 1 516 0 + b .L79 +.L78: + .loc 1 511 0 + ldr r3, [fp, #-12] + add r3, r3, #1 + str r3, [fp, #-12] +.L77: + .loc 1 511 0 is_stmt 0 discriminator 1 + ldr r2, [fp, #-12] + ldr r3, .L81 + ldr r3, [r3, #0] + cmp r2, r3 + bcc .L80 +.L79: + .loc 1 520 0 is_stmt 1 + ldr r3, [fp, #-8] + .loc 1 521 0 + mov r0, r3 + sub sp, fp, #4 + ldmfd sp!, {fp, pc} +.L82: + .align 2 +.L81: + .word pinCnt.3360 + .word pcbRev + .word .LC0 + .word validPins.3359 + .word .LC1 + .cfi_endproc +.LFE9: + .size gpioValidatePin, .-gpioValidatePin + .local pinCnt.3360 + .comm pinCnt.3360,4,4 + .local validPins.3359 + .comm validPins.3359,68,4 + .section .rodata + .align 2 +.LC26: + .ascii "OK\000" + .align 2 +.LC27: + .ascii "ERROR_DEFAULT\000" + .align 2 +.LC28: + .ascii "ERROR_INVALID_PIN_NUMBER\000" + .align 2 +.LC29: + .ascii "ERROR_RANGE\000" + .align 2 +.LC30: + .ascii "ERROR_NULL\000" + .align 2 +.LC31: + .ascii "ERROR_EXTERNAL\000" + .align 2 +.LC32: + .ascii "ERROR_NOT_INITIALISED\000" + .align 2 +.LC33: + .ascii "ERROR_ALREADY_INITIALISED\000" + .align 2 +.LC34: + .ascii "ERROR_I2C_NACK\000" + .align 2 +.LC35: + .ascii "ERROR_I2C\000" + .align 2 +.LC36: + .ascii "ERROR_I2C_CLK_TIMEOUT\000" + .align 2 +.LC37: + .ascii "ERROR_INVALID_BSC\000" + .data + .align 2 + .type errorString.3344, %object + .size errorString.3344, 48 +errorString.3344: + .word .LC26 + .word .LC27 + .word .LC28 + .word .LC29 + .word .LC30 + .word .LC31 + .word .LC32 + .word .LC33 + .word .LC34 + .word .LC35 + .word .LC36 + .word .LC37 + .text +.Letext0: + .file 2 "/usr/lib/gcc/arm-linux-gnueabihf/4.6/include/stddef.h" + .file 3 "/usr/include/arm-linux-gnueabihf/bits/types.h" + .file 4 "/usr/include/stdio.h" + .file 5 "/usr/include/libio.h" + .file 6 "/usr/lib/gcc/arm-linux-gnueabihf/4.6/include/stdarg.h" + .file 7 "" + .file 8 "/usr/include/stdint.h" + .file 9 "../include/rpiGpio.h" + .file 10 "/usr/include/time.h" + .section .debug_info,"",%progbits +.Ldebug_info0: + .4byte 0x8d5 + .2byte 0x2 + .4byte .Ldebug_abbrev0 + .byte 0x4 + .uleb128 0x1 + .4byte .LASF128 + .byte 0x1 + .4byte .LASF129 + .4byte .LASF130 + .4byte .Ltext0 + .4byte .Letext0 + .4byte .Ldebug_line0 + .uleb128 0x2 + .4byte .LASF8 + .byte 0x2 + .byte 0xd4 + .4byte 0x30 + .uleb128 0x3 + .byte 0x4 + .byte 0x7 + .4byte .LASF0 + .uleb128 0x3 + .byte 0x1 + .byte 0x8 + .4byte .LASF1 + .uleb128 0x3 + .byte 0x2 + .byte 0x7 + .4byte .LASF2 + .uleb128 0x3 + .byte 0x4 + .byte 0x7 + .4byte .LASF3 + .uleb128 0x3 + .byte 0x1 + .byte 0x6 + .4byte .LASF4 + .uleb128 0x3 + .byte 0x2 + .byte 0x5 + .4byte .LASF5 + .uleb128 0x4 + .byte 0x4 + .byte 0x5 + .ascii "int\000" + .uleb128 0x3 + .byte 0x8 + .byte 0x5 + .4byte .LASF6 + .uleb128 0x3 + .byte 0x8 + .byte 0x7 + .4byte .LASF7 + .uleb128 0x2 + .4byte .LASF9 + .byte 0x3 + .byte 0x38 + .4byte 0x61 + .uleb128 0x2 + .4byte .LASF10 + .byte 0x3 + .byte 0x8d + .4byte 0x85 + .uleb128 0x3 + .byte 0x4 + .byte 0x5 + .4byte .LASF11 + .uleb128 0x2 + .4byte .LASF12 + .byte 0x3 + .byte 0x8e + .4byte 0x6f + .uleb128 0x2 + .4byte .LASF13 + .byte 0x3 + .byte 0x95 + .4byte 0x85 + .uleb128 0x5 + .byte 0x4 + .uleb128 0x2 + .4byte .LASF14 + .byte 0x3 + .byte 0xb4 + .4byte 0x5a + .uleb128 0x6 + .byte 0x4 + .4byte 0xb5 + .uleb128 0x3 + .byte 0x1 + .byte 0x8 + .4byte .LASF15 + .uleb128 0x2 + .4byte .LASF16 + .byte 0x4 + .byte 0x31 + .4byte 0xc7 + .uleb128 0x7 + .4byte .LASF47 + .byte 0x98 + .byte 0x5 + .2byte 0x10f + .4byte 0x288 + .uleb128 0x8 + .4byte .LASF17 + .byte 0x5 + .2byte 0x110 + .4byte 0x5a + .byte 0x2 + .byte 0x23 + .uleb128 0 + .uleb128 0x8 + .4byte .LASF18 + .byte 0x5 + .2byte 0x115 + .4byte 0xaf + .byte 0x2 + .byte 0x23 + .uleb128 0x4 + .uleb128 0x8 + .4byte .LASF19 + .byte 0x5 + .2byte 0x116 + .4byte 0xaf + .byte 0x2 + .byte 0x23 + .uleb128 0x8 + .uleb128 0x8 + .4byte .LASF20 + .byte 0x5 + .2byte 0x117 + .4byte 0xaf + .byte 0x2 + .byte 0x23 + .uleb128 0xc + .uleb128 0x8 + .4byte .LASF21 + .byte 0x5 + .2byte 0x118 + .4byte 0xaf + .byte 0x2 + .byte 0x23 + .uleb128 0x10 + .uleb128 0x8 + .4byte .LASF22 + .byte 0x5 + .2byte 0x119 + .4byte 0xaf + .byte 0x2 + .byte 0x23 + .uleb128 0x14 + .uleb128 0x8 + .4byte .LASF23 + .byte 0x5 + .2byte 0x11a + .4byte 0xaf + .byte 0x2 + .byte 0x23 + .uleb128 0x18 + .uleb128 0x8 + .4byte .LASF24 + .byte 0x5 + .2byte 0x11b + .4byte 0xaf + .byte 0x2 + .byte 0x23 + .uleb128 0x1c + .uleb128 0x8 + .4byte .LASF25 + .byte 0x5 + .2byte 0x11c + .4byte 0xaf + .byte 0x2 + .byte 0x23 + .uleb128 0x20 + .uleb128 0x8 + .4byte .LASF26 + .byte 0x5 + .2byte 0x11e + .4byte 0xaf + .byte 0x2 + .byte 0x23 + .uleb128 0x24 + .uleb128 0x8 + .4byte .LASF27 + .byte 0x5 + .2byte 0x11f + .4byte 0xaf + .byte 0x2 + .byte 0x23 + .uleb128 0x28 + .uleb128 0x8 + .4byte .LASF28 + .byte 0x5 + .2byte 0x120 + .4byte 0xaf + .byte 0x2 + .byte 0x23 + .uleb128 0x2c + .uleb128 0x8 + .4byte .LASF29 + .byte 0x5 + .2byte 0x122 + .4byte 0x2eb + .byte 0x2 + .byte 0x23 + .uleb128 0x30 + .uleb128 0x8 + .4byte .LASF30 + .byte 0x5 + .2byte 0x124 + .4byte 0x2f1 + .byte 0x2 + .byte 0x23 + .uleb128 0x34 + .uleb128 0x8 + .4byte .LASF31 + .byte 0x5 + .2byte 0x126 + .4byte 0x5a + .byte 0x2 + .byte 0x23 + .uleb128 0x38 + .uleb128 0x8 + .4byte .LASF32 + .byte 0x5 + .2byte 0x12a + .4byte 0x5a + .byte 0x2 + .byte 0x23 + .uleb128 0x3c + .uleb128 0x8 + .4byte .LASF33 + .byte 0x5 + .2byte 0x12c + .4byte 0x7a + .byte 0x2 + .byte 0x23 + .uleb128 0x40 + .uleb128 0x8 + .4byte .LASF34 + .byte 0x5 + .2byte 0x130 + .4byte 0x3e + .byte 0x2 + .byte 0x23 + .uleb128 0x44 + .uleb128 0x8 + .4byte .LASF35 + .byte 0x5 + .2byte 0x131 + .4byte 0x4c + .byte 0x2 + .byte 0x23 + .uleb128 0x46 + .uleb128 0x8 + .4byte .LASF36 + .byte 0x5 + .2byte 0x132 + .4byte 0x2f7 + .byte 0x2 + .byte 0x23 + .uleb128 0x47 + .uleb128 0x8 + .4byte .LASF37 + .byte 0x5 + .2byte 0x136 + .4byte 0x307 + .byte 0x2 + .byte 0x23 + .uleb128 0x48 + .uleb128 0x8 + .4byte .LASF38 + .byte 0x5 + .2byte 0x13f + .4byte 0x8c + .byte 0x2 + .byte 0x23 + .uleb128 0x50 + .uleb128 0x8 + .4byte .LASF39 + .byte 0x5 + .2byte 0x148 + .4byte 0xa2 + .byte 0x2 + .byte 0x23 + .uleb128 0x58 + .uleb128 0x8 + .4byte .LASF40 + .byte 0x5 + .2byte 0x149 + .4byte 0xa2 + .byte 0x2 + .byte 0x23 + .uleb128 0x5c + .uleb128 0x8 + .4byte .LASF41 + .byte 0x5 + .2byte 0x14a + .4byte 0xa2 + .byte 0x2 + .byte 0x23 + .uleb128 0x60 + .uleb128 0x8 + .4byte .LASF42 + .byte 0x5 + .2byte 0x14b + .4byte 0xa2 + .byte 0x2 + .byte 0x23 + .uleb128 0x64 + .uleb128 0x8 + .4byte .LASF43 + .byte 0x5 + .2byte 0x14c + .4byte 0x25 + .byte 0x2 + .byte 0x23 + .uleb128 0x68 + .uleb128 0x8 + .4byte .LASF44 + .byte 0x5 + .2byte 0x14e + .4byte 0x5a + .byte 0x2 + .byte 0x23 + .uleb128 0x6c + .uleb128 0x8 + .4byte .LASF45 + .byte 0x5 + .2byte 0x150 + .4byte 0x30d + .byte 0x2 + .byte 0x23 + .uleb128 0x70 + .byte 0 + .uleb128 0x2 + .4byte .LASF46 + .byte 0x6 + .byte 0x28 + .4byte 0x293 + .uleb128 0x9 + .4byte .LASF48 + .byte 0x4 + .byte 0x7 + .byte 0 + .4byte 0x2ad + .uleb128 0xa + .4byte .LASF131 + .4byte 0xa2 + .byte 0x2 + .byte 0x23 + .uleb128 0 + .byte 0x1 + .byte 0 + .uleb128 0xb + .4byte .LASF132 + .byte 0x5 + .byte 0xb4 + .uleb128 0x9 + .4byte .LASF49 + .byte 0xc + .byte 0x5 + .byte 0xba + .4byte 0x2eb + .uleb128 0xc + .4byte .LASF50 + .byte 0x5 + .byte 0xbb + .4byte 0x2eb + .byte 0x2 + .byte 0x23 + .uleb128 0 + .uleb128 0xc + .4byte .LASF51 + .byte 0x5 + .byte 0xbc + .4byte 0x2f1 + .byte 0x2 + .byte 0x23 + .uleb128 0x4 + .uleb128 0xc + .4byte .LASF52 + .byte 0x5 + .byte 0xc0 + .4byte 0x5a + .byte 0x2 + .byte 0x23 + .uleb128 0x8 + .byte 0 + .uleb128 0x6 + .byte 0x4 + .4byte 0x2b4 + .uleb128 0x6 + .byte 0x4 + .4byte 0xc7 + .uleb128 0xd + .4byte 0xb5 + .4byte 0x307 + .uleb128 0xe + .4byte 0x30 + .byte 0 + .byte 0 + .uleb128 0x6 + .byte 0x4 + .4byte 0x2ad + .uleb128 0xd + .4byte 0xb5 + .4byte 0x31d + .uleb128 0xe + .4byte 0x30 + .byte 0x27 + .byte 0 + .uleb128 0x6 + .byte 0x4 + .4byte 0x323 + .uleb128 0xf + .4byte 0xb5 + .uleb128 0x2 + .4byte .LASF53 + .byte 0x4 + .byte 0x50 + .4byte 0x288 + .uleb128 0x2 + .4byte .LASF54 + .byte 0x4 + .byte 0x67 + .4byte 0xa4 + .uleb128 0x2 + .4byte .LASF55 + .byte 0x8 + .byte 0x34 + .4byte 0x30 + .uleb128 0x10 + .byte 0x4 + .byte 0x9 + .byte 0x3f + .4byte 0x39f + .uleb128 0x11 + .ascii "OK\000" + .sleb128 0 + .uleb128 0x12 + .4byte .LASF56 + .sleb128 1 + .uleb128 0x12 + .4byte .LASF57 + .sleb128 2 + .uleb128 0x12 + .4byte .LASF58 + .sleb128 3 + .uleb128 0x12 + .4byte .LASF59 + .sleb128 4 + .uleb128 0x12 + .4byte .LASF60 + .sleb128 5 + .uleb128 0x12 + .4byte .LASF61 + .sleb128 6 + .uleb128 0x12 + .4byte .LASF62 + .sleb128 7 + .uleb128 0x12 + .4byte .LASF63 + .sleb128 8 + .uleb128 0x12 + .4byte .LASF64 + .sleb128 9 + .uleb128 0x12 + .4byte .LASF65 + .sleb128 10 + .uleb128 0x12 + .4byte .LASF66 + .sleb128 11 + .uleb128 0x12 + .4byte .LASF67 + .sleb128 12 + .byte 0 + .uleb128 0x2 + .4byte .LASF68 + .byte 0x9 + .byte 0x42 + .4byte 0x349 + .uleb128 0x10 + .byte 0x4 + .byte 0x9 + .byte 0x45 + .4byte 0x3bf + .uleb128 0x11 + .ascii "low\000" + .sleb128 0 + .uleb128 0x12 + .4byte .LASF69 + .sleb128 1 + .byte 0 + .uleb128 0x2 + .4byte .LASF70 + .byte 0x9 + .byte 0x48 + .4byte 0x3aa + .uleb128 0x10 + .byte 0x4 + .byte 0x9 + .byte 0x4b + .4byte 0x3e5 + .uleb128 0x12 + .4byte .LASF71 + .sleb128 0 + .uleb128 0x12 + .4byte .LASF72 + .sleb128 1 + .uleb128 0x12 + .4byte .LASF73 + .sleb128 2 + .byte 0 + .uleb128 0x2 + .4byte .LASF74 + .byte 0x9 + .byte 0x4f + .4byte 0x3ca + .uleb128 0x10 + .byte 0x4 + .byte 0x9 + .byte 0x55 + .4byte 0x435 + .uleb128 0x12 + .4byte .LASF75 + .sleb128 0 + .uleb128 0x12 + .4byte .LASF76 + .sleb128 1 + .uleb128 0x12 + .4byte .LASF77 + .sleb128 4 + .uleb128 0x12 + .4byte .LASF78 + .sleb128 5 + .uleb128 0x12 + .4byte .LASF79 + .sleb128 6 + .uleb128 0x12 + .4byte .LASF80 + .sleb128 7 + .uleb128 0x12 + .4byte .LASF81 + .sleb128 3 + .uleb128 0x12 + .4byte .LASF82 + .sleb128 2 + .uleb128 0x12 + .4byte .LASF83 + .sleb128 0 + .uleb128 0x12 + .4byte .LASF84 + .sleb128 7 + .byte 0 + .uleb128 0x2 + .4byte .LASF85 + .byte 0x9 + .byte 0x60 + .4byte 0x3f0 + .uleb128 0x10 + .byte 0x4 + .byte 0x9 + .byte 0x8f + .4byte 0x45b + .uleb128 0x12 + .4byte .LASF86 + .sleb128 0 + .uleb128 0x12 + .4byte .LASF87 + .sleb128 1 + .uleb128 0x12 + .4byte .LASF88 + .sleb128 2 + .byte 0 + .uleb128 0x2 + .4byte .LASF89 + .byte 0x9 + .byte 0x93 + .4byte 0x440 + .uleb128 0x6 + .byte 0x4 + .4byte 0x5a + .uleb128 0x9 + .4byte .LASF90 + .byte 0x8 + .byte 0xa + .byte 0x78 + .4byte 0x495 + .uleb128 0xc + .4byte .LASF91 + .byte 0xa + .byte 0x7a + .4byte 0x97 + .byte 0x2 + .byte 0x23 + .uleb128 0 + .uleb128 0xc + .4byte .LASF92 + .byte 0xa + .byte 0x7b + .4byte 0x85 + .byte 0x2 + .byte 0x23 + .uleb128 0x4 + .byte 0 + .uleb128 0x13 + .byte 0x1 + .4byte .LASF98 + .byte 0x1 + .byte 0x2c + .byte 0x1 + .4byte 0x39f + .4byte .LFB0 + .4byte .LFE0 + .4byte .LLST0 + .4byte 0x54b + .uleb128 0x14 + .4byte .LASF93 + .byte 0x1 + .byte 0x2e + .4byte 0x5a + .byte 0x2 + .byte 0x91 + .sleb128 -24 + .uleb128 0x15 + .ascii "rtn\000" + .byte 0x1 + .byte 0x2f + .4byte 0x39f + .byte 0x2 + .byte 0x91 + .sleb128 -20 + .uleb128 0x16 + .4byte .LBB2 + .4byte .LBE2 + .uleb128 0x14 + .4byte .LASF94 + .byte 0x1 + .byte 0x4b + .4byte 0x54b + .byte 0x2 + .byte 0x91 + .sleb128 -28 + .uleb128 0x16 + .4byte .LBB3 + .4byte .LBE3 + .uleb128 0x14 + .4byte .LASF95 + .byte 0x1 + .byte 0x4e + .4byte 0xaf + .byte 0x2 + .byte 0x91 + .sleb128 -44 + .uleb128 0x14 + .4byte .LASF96 + .byte 0x1 + .byte 0x4f + .4byte 0x333 + .byte 0x2 + .byte 0x91 + .sleb128 -32 + .uleb128 0x15 + .ascii "foo\000" + .byte 0x1 + .byte 0x50 + .4byte 0x25 + .byte 0x2 + .byte 0x91 + .sleb128 -48 + .uleb128 0x16 + .4byte .LBB4 + .4byte .LBE4 + .uleb128 0x15 + .ascii "rev\000" + .byte 0x1 + .byte 0x56 + .4byte 0xaf + .byte 0x2 + .byte 0x91 + .sleb128 -36 + .uleb128 0x16 + .4byte .LBB5 + .4byte .LBE5 + .uleb128 0x14 + .4byte .LASF97 + .byte 0x1 + .byte 0x59 + .4byte 0x85 + .byte 0x2 + .byte 0x91 + .sleb128 -40 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x6 + .byte 0x4 + .4byte 0xbc + .uleb128 0x13 + .byte 0x1 + .4byte .LASF99 + .byte 0x1 + .byte 0x86 + .byte 0x1 + .4byte 0x39f + .4byte .LFB1 + .4byte .LFE1 + .4byte .LLST1 + .4byte 0x57d + .uleb128 0x15 + .ascii "rtn\000" + .byte 0x1 + .byte 0x88 + .4byte 0x39f + .byte 0x2 + .byte 0x91 + .sleb128 -20 + .byte 0 + .uleb128 0x13 + .byte 0x1 + .4byte .LASF100 + .byte 0x1 + .byte 0xa4 + .byte 0x1 + .4byte 0x39f + .4byte .LFB2 + .4byte .LFE2 + .4byte .LLST2 + .4byte 0x5c5 + .uleb128 0x17 + .4byte .LASF101 + .byte 0x1 + .byte 0xa4 + .4byte 0x5a + .byte 0x2 + .byte 0x91 + .sleb128 -20 + .uleb128 0x17 + .4byte .LASF102 + .byte 0x1 + .byte 0xa4 + .4byte 0x435 + .byte 0x2 + .byte 0x91 + .sleb128 -24 + .uleb128 0x15 + .ascii "rtn\000" + .byte 0x1 + .byte 0xa6 + .4byte 0x39f + .byte 0x2 + .byte 0x91 + .sleb128 -12 + .byte 0 + .uleb128 0x13 + .byte 0x1 + .4byte .LASF103 + .byte 0x1 + .byte 0xd0 + .byte 0x1 + .4byte 0x39f + .4byte .LFB3 + .4byte .LFE3 + .4byte .LLST3 + .4byte 0x60d + .uleb128 0x17 + .4byte .LASF101 + .byte 0x1 + .byte 0xd0 + .4byte 0x5a + .byte 0x2 + .byte 0x91 + .sleb128 -20 + .uleb128 0x17 + .4byte .LASF104 + .byte 0x1 + .byte 0xd0 + .4byte 0x3bf + .byte 0x2 + .byte 0x91 + .sleb128 -24 + .uleb128 0x15 + .ascii "rtn\000" + .byte 0x1 + .byte 0xd2 + .4byte 0x39f + .byte 0x2 + .byte 0x91 + .sleb128 -12 + .byte 0 + .uleb128 0x13 + .byte 0x1 + .4byte .LASF105 + .byte 0x1 + .byte 0xff + .byte 0x1 + .4byte 0x39f + .4byte .LFB4 + .4byte .LFE4 + .4byte .LLST4 + .4byte 0x656 + .uleb128 0x17 + .4byte .LASF101 + .byte 0x1 + .byte 0xff + .4byte 0x5a + .byte 0x2 + .byte 0x91 + .sleb128 -20 + .uleb128 0x17 + .4byte .LASF104 + .byte 0x1 + .byte 0xff + .4byte 0x656 + .byte 0x2 + .byte 0x91 + .sleb128 -24 + .uleb128 0x18 + .ascii "rtn\000" + .byte 0x1 + .2byte 0x101 + .4byte 0x39f + .byte 0x2 + .byte 0x91 + .sleb128 -12 + .byte 0 + .uleb128 0x6 + .byte 0x4 + .4byte 0x3bf + .uleb128 0x19 + .byte 0x1 + .4byte .LASF106 + .byte 0x1 + .2byte 0x12e + .byte 0x1 + .4byte 0x39f + .4byte .LFB5 + .4byte .LFE5 + .4byte .LLST5 + .4byte 0x6b7 + .uleb128 0x1a + .4byte .LASF101 + .byte 0x1 + .2byte 0x12e + .4byte 0x5a + .byte 0x2 + .byte 0x91 + .sleb128 -28 + .uleb128 0x1a + .4byte .LASF107 + .byte 0x1 + .2byte 0x12e + .4byte 0x3e5 + .byte 0x2 + .byte 0x91 + .sleb128 -32 + .uleb128 0x18 + .ascii "rtn\000" + .byte 0x1 + .2byte 0x130 + .4byte 0x39f + .byte 0x2 + .byte 0x91 + .sleb128 -12 + .uleb128 0x1b + .4byte .LASF108 + .byte 0x1 + .2byte 0x131 + .4byte 0x46c + .byte 0x2 + .byte 0x91 + .sleb128 -20 + .byte 0 + .uleb128 0x19 + .byte 0x1 + .4byte .LASF109 + .byte 0x1 + .2byte 0x164 + .byte 0x1 + .4byte 0x39f + .4byte .LFB6 + .4byte .LFE6 + .4byte .LLST6 + .4byte 0x703 + .uleb128 0x1a + .4byte .LASF110 + .byte 0x1 + .2byte 0x164 + .4byte 0x466 + .byte 0x2 + .byte 0x91 + .sleb128 -20 + .uleb128 0x1a + .4byte .LASF111 + .byte 0x1 + .2byte 0x164 + .4byte 0x466 + .byte 0x2 + .byte 0x91 + .sleb128 -24 + .uleb128 0x18 + .ascii "rtn\000" + .byte 0x1 + .2byte 0x166 + .4byte 0x39f + .byte 0x2 + .byte 0x91 + .sleb128 -12 + .byte 0 + .uleb128 0x19 + .byte 0x1 + .4byte .LASF112 + .byte 0x1 + .2byte 0x195 + .byte 0x1 + .4byte 0x31d + .4byte .LFB7 + .4byte .LFE7 + .4byte .LLST7 + .4byte 0x743 + .uleb128 0x1a + .4byte .LASF113 + .byte 0x1 + .2byte 0x195 + .4byte 0x39f + .byte 0x2 + .byte 0x91 + .sleb128 -12 + .uleb128 0x1b + .4byte .LASF114 + .byte 0x1 + .2byte 0x197 + .4byte 0x743 + .byte 0x5 + .byte 0x3 + .4byte errorString.3344 + .byte 0 + .uleb128 0xd + .4byte 0x31d + .4byte 0x753 + .uleb128 0xe + .4byte 0x30 + .byte 0xb + .byte 0 + .uleb128 0x19 + .byte 0x1 + .4byte .LASF115 + .byte 0x1 + .2byte 0x1b7 + .byte 0x1 + .4byte 0x5a + .4byte .LFB8 + .4byte .LFE8 + .4byte .LLST8 + .4byte 0x7dc + .uleb128 0x1a + .4byte .LASF116 + .byte 0x1 + .2byte 0x1b7 + .4byte 0x54b + .byte 0x2 + .byte 0x91 + .sleb128 -36 + .uleb128 0x1a + .4byte .LASF117 + .byte 0x1 + .2byte 0x1b7 + .4byte 0x31d + .byte 0x2 + .byte 0x91 + .sleb128 -40 + .uleb128 0x1a + .4byte .LASF95 + .byte 0x1 + .2byte 0x1b7 + .4byte 0x5a + .byte 0x2 + .byte 0x91 + .sleb128 -44 + .uleb128 0x1a + .4byte .LASF118 + .byte 0x1 + .2byte 0x1b7 + .4byte 0x31d + .byte 0x2 + .byte 0x91 + .sleb128 -4 + .uleb128 0x1c + .uleb128 0x1b + .4byte .LASF119 + .byte 0x1 + .2byte 0x1b9 + .4byte 0x328 + .byte 0x2 + .byte 0x91 + .sleb128 -28 + .uleb128 0x18 + .ascii "rtn\000" + .byte 0x1 + .2byte 0x1ba + .4byte 0x5a + .byte 0x2 + .byte 0x91 + .sleb128 -20 + .uleb128 0x1b + .4byte .LASF120 + .byte 0x1 + .2byte 0x1bb + .4byte 0x5a + .byte 0x2 + .byte 0x91 + .sleb128 -24 + .byte 0 + .uleb128 0x1d + .4byte .LASF133 + .byte 0x1 + .2byte 0x1e0 + .byte 0x1 + .4byte 0x39f + .4byte .LFB9 + .4byte .LFE9 + .4byte .LLST9 + .4byte 0x884 + .uleb128 0x1a + .4byte .LASF101 + .byte 0x1 + .2byte 0x1e0 + .4byte 0x5a + .byte 0x3 + .byte 0x91 + .sleb128 -92 + .uleb128 0x18 + .ascii "rtn\000" + .byte 0x1 + .2byte 0x1e2 + .4byte 0x39f + .byte 0x2 + .byte 0x91 + .sleb128 -12 + .uleb128 0x1b + .4byte .LASF121 + .byte 0x1 + .2byte 0x1e3 + .4byte 0x5a + .byte 0x2 + .byte 0x91 + .sleb128 -16 + .uleb128 0x1b + .4byte .LASF122 + .byte 0x1 + .2byte 0x1e7 + .4byte 0x884 + .byte 0x5 + .byte 0x3 + .4byte validPins.3359 + .uleb128 0x1b + .4byte .LASF123 + .byte 0x1 + .2byte 0x1e8 + .4byte 0x33e + .byte 0x5 + .byte 0x3 + .4byte pinCnt.3360 + .uleb128 0x1e + .4byte .LBB6 + .4byte .LBE6 + .4byte 0x869 + .uleb128 0x1b + .4byte .LASF124 + .byte 0x1 + .2byte 0x1f3 + .4byte 0x894 + .byte 0x3 + .byte 0x91 + .sleb128 -84 + .byte 0 + .uleb128 0x16 + .4byte .LBB7 + .4byte .LBE7 + .uleb128 0x1b + .4byte .LASF125 + .byte 0x1 + .2byte 0x1f9 + .4byte 0x899 + .byte 0x3 + .byte 0x91 + .sleb128 -84 + .byte 0 + .byte 0 + .uleb128 0xd + .4byte 0x33e + .4byte 0x894 + .uleb128 0xe + .4byte 0x30 + .byte 0x10 + .byte 0 + .uleb128 0xf + .4byte 0x884 + .uleb128 0xf + .4byte 0x884 + .uleb128 0x14 + .4byte .LASF126 + .byte 0x1 + .byte 0x23 + .4byte 0x8af + .byte 0x5 + .byte 0x3 + .4byte gGpioMap + .uleb128 0x6 + .byte 0x4 + .4byte 0x8b5 + .uleb128 0x1f + .4byte 0x33e + .uleb128 0x14 + .4byte .LASF127 + .byte 0x1 + .byte 0x26 + .4byte 0x45b + .byte 0x5 + .byte 0x3 + .4byte pcbRev + .uleb128 0x20 + .4byte .LASF134 + .byte 0x4 + .byte 0xa7 + .4byte 0x2f1 + .byte 0x1 + .byte 0x1 + .byte 0 + .section .debug_abbrev,"",%progbits +.Ldebug_abbrev0: + .uleb128 0x1 + .uleb128 0x11 + .byte 0x1 + .uleb128 0x25 + .uleb128 0xe + .uleb128 0x13 + .uleb128 0xb + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x1b + .uleb128 0xe + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x1 + .uleb128 0x10 + .uleb128 0x6 + .byte 0 + .byte 0 + .uleb128 0x2 + .uleb128 0x16 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x3 + .uleb128 0x24 + .byte 0 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3e + .uleb128 0xb + .uleb128 0x3 + .uleb128 0xe + .byte 0 + .byte 0 + .uleb128 0x4 + .uleb128 0x24 + .byte 0 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3e + .uleb128 0xb + .uleb128 0x3 + .uleb128 0x8 + .byte 0 + .byte 0 + .uleb128 0x5 + .uleb128 0xf + .byte 0 + .uleb128 0xb + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x6 + .uleb128 0xf + .byte 0 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x7 + .uleb128 0x13 + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x8 + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0xa + .byte 0 + .byte 0 + .uleb128 0x9 + .uleb128 0x13 + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0xa + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0xa + .uleb128 0x34 + .uleb128 0xc + .byte 0 + .byte 0 + .uleb128 0xb + .uleb128 0x16 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0xc + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0xa + .byte 0 + .byte 0 + .uleb128 0xd + .uleb128 0x1 + .byte 0x1 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0xe + .uleb128 0x21 + .byte 0 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2f + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0xf + .uleb128 0x26 + .byte 0 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x10 + .uleb128 0x4 + .byte 0x1 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x11 + .uleb128 0x28 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x1c + .uleb128 0xd + .byte 0 + .byte 0 + .uleb128 0x12 + .uleb128 0x28 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x1c + .uleb128 0xd + .byte 0 + .byte 0 + .uleb128 0x13 + .uleb128 0x2e + .byte 0x1 + .uleb128 0x3f + .uleb128 0xc + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x27 + .uleb128 0xc + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x1 + .uleb128 0x40 + .uleb128 0x6 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x14 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0xa + .byte 0 + .byte 0 + .uleb128 0x15 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0xa + .byte 0 + .byte 0 + .uleb128 0x16 + .uleb128 0xb + .byte 0x1 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x1 + .byte 0 + .byte 0 + .uleb128 0x17 + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0xa + .byte 0 + .byte 0 + .uleb128 0x18 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0xa + .byte 0 + .byte 0 + .uleb128 0x19 + .uleb128 0x2e + .byte 0x1 + .uleb128 0x3f + .uleb128 0xc + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x27 + .uleb128 0xc + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x1 + .uleb128 0x40 + .uleb128 0x6 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x1a + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0xa + .byte 0 + .byte 0 + .uleb128 0x1b + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0xa + .byte 0 + .byte 0 + .uleb128 0x1c + .uleb128 0x18 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x1d + .uleb128 0x2e + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x27 + .uleb128 0xc + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x1 + .uleb128 0x40 + .uleb128 0x6 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x1e + .uleb128 0xb + .byte 0x1 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x1 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x1f + .uleb128 0x35 + .byte 0 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x20 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x3f + .uleb128 0xc + .uleb128 0x3c + .uleb128 0xc + .byte 0 + .byte 0 + .byte 0 + .section .debug_loc,"",%progbits +.Ldebug_loc0: +.LLST0: + .4byte .LFB0-.Ltext0 + .4byte .LCFI0-.Ltext0 + .2byte 0x2 + .byte 0x7d + .sleb128 0 + .4byte .LCFI0-.Ltext0 + .4byte .LCFI1-.Ltext0 + .2byte 0x2 + .byte 0x7d + .sleb128 12 + .4byte .LCFI1-.Ltext0 + .4byte .LFE0-.Ltext0 + .2byte 0x2 + .byte 0x7b + .sleb128 4 + .4byte 0 + .4byte 0 +.LLST1: + .4byte .LFB1-.Ltext0 + .4byte .LCFI2-.Ltext0 + .2byte 0x2 + .byte 0x7d + .sleb128 0 + .4byte .LCFI2-.Ltext0 + .4byte .LCFI3-.Ltext0 + .2byte 0x2 + .byte 0x7d + .sleb128 12 + .4byte .LCFI3-.Ltext0 + .4byte .LFE1-.Ltext0 + .2byte 0x2 + .byte 0x7b + .sleb128 4 + .4byte 0 + .4byte 0 +.LLST2: + .4byte .LFB2-.Ltext0 + .4byte .LCFI4-.Ltext0 + .2byte 0x2 + .byte 0x7d + .sleb128 0 + .4byte .LCFI4-.Ltext0 + .4byte .LCFI5-.Ltext0 + .2byte 0x2 + .byte 0x7d + .sleb128 8 + .4byte .LCFI5-.Ltext0 + .4byte .LFE2-.Ltext0 + .2byte 0x2 + .byte 0x7b + .sleb128 4 + .4byte 0 + .4byte 0 +.LLST3: + .4byte .LFB3-.Ltext0 + .4byte .LCFI6-.Ltext0 + .2byte 0x2 + .byte 0x7d + .sleb128 0 + .4byte .LCFI6-.Ltext0 + .4byte .LCFI7-.Ltext0 + .2byte 0x2 + .byte 0x7d + .sleb128 8 + .4byte .LCFI7-.Ltext0 + .4byte .LFE3-.Ltext0 + .2byte 0x2 + .byte 0x7b + .sleb128 4 + .4byte 0 + .4byte 0 +.LLST4: + .4byte .LFB4-.Ltext0 + .4byte .LCFI8-.Ltext0 + .2byte 0x2 + .byte 0x7d + .sleb128 0 + .4byte .LCFI8-.Ltext0 + .4byte .LCFI9-.Ltext0 + .2byte 0x2 + .byte 0x7d + .sleb128 8 + .4byte .LCFI9-.Ltext0 + .4byte .LFE4-.Ltext0 + .2byte 0x2 + .byte 0x7b + .sleb128 4 + .4byte 0 + .4byte 0 +.LLST5: + .4byte .LFB5-.Ltext0 + .4byte .LCFI10-.Ltext0 + .2byte 0x2 + .byte 0x7d + .sleb128 0 + .4byte .LCFI10-.Ltext0 + .4byte .LCFI11-.Ltext0 + .2byte 0x2 + .byte 0x7d + .sleb128 8 + .4byte .LCFI11-.Ltext0 + .4byte .LFE5-.Ltext0 + .2byte 0x2 + .byte 0x7b + .sleb128 4 + .4byte 0 + .4byte 0 +.LLST6: + .4byte .LFB6-.Ltext0 + .4byte .LCFI12-.Ltext0 + .2byte 0x2 + .byte 0x7d + .sleb128 0 + .4byte .LCFI12-.Ltext0 + .4byte .LCFI13-.Ltext0 + .2byte 0x2 + .byte 0x7d + .sleb128 8 + .4byte .LCFI13-.Ltext0 + .4byte .LFE6-.Ltext0 + .2byte 0x2 + .byte 0x7b + .sleb128 4 + .4byte 0 + .4byte 0 +.LLST7: + .4byte .LFB7-.Ltext0 + .4byte .LCFI14-.Ltext0 + .2byte 0x2 + .byte 0x7d + .sleb128 0 + .4byte .LCFI14-.Ltext0 + .4byte .LCFI15-.Ltext0 + .2byte 0x2 + .byte 0x7d + .sleb128 4 + .4byte .LCFI15-.Ltext0 + .4byte .LFE7-.Ltext0 + .2byte 0x2 + .byte 0x7b + .sleb128 4 + .4byte 0 + .4byte 0 +.LLST8: + .4byte .LFB8-.Ltext0 + .4byte .LCFI16-.Ltext0 + .2byte 0x2 + .byte 0x7d + .sleb128 0 + .4byte .LCFI16-.Ltext0 + .4byte .LCFI17-.Ltext0 + .2byte 0x2 + .byte 0x7d + .sleb128 4 + .4byte .LCFI17-.Ltext0 + .4byte .LCFI18-.Ltext0 + .2byte 0x2 + .byte 0x7d + .sleb128 12 + .4byte .LCFI18-.Ltext0 + .4byte .LFE8-.Ltext0 + .2byte 0x2 + .byte 0x7b + .sleb128 8 + .4byte 0 + .4byte 0 +.LLST9: + .4byte .LFB9-.Ltext0 + .4byte .LCFI19-.Ltext0 + .2byte 0x2 + .byte 0x7d + .sleb128 0 + .4byte .LCFI19-.Ltext0 + .4byte .LCFI20-.Ltext0 + .2byte 0x2 + .byte 0x7d + .sleb128 8 + .4byte .LCFI20-.Ltext0 + .4byte .LFE9-.Ltext0 + .2byte 0x2 + .byte 0x7b + .sleb128 4 + .4byte 0 + .4byte 0 + .section .debug_aranges,"",%progbits + .4byte 0x1c + .2byte 0x2 + .4byte .Ldebug_info0 + .byte 0x4 + .byte 0 + .2byte 0 + .2byte 0 + .4byte .Ltext0 + .4byte .Letext0-.Ltext0 + .4byte 0 + .4byte 0 + .section .debug_line,"",%progbits +.Ldebug_line0: + .section .debug_str,"MS",%progbits,1 +.LASF109: + .ascii "gpioGetI2cPins\000" +.LASF36: + .ascii "_shortbuf\000" +.LASF77: + .ascii "alt0\000" +.LASF132: + .ascii "_IO_lock_t\000" +.LASF79: + .ascii "alt2\000" +.LASF80: + .ascii "alt3\000" +.LASF81: + .ascii "alt4\000" +.LASF82: + .ascii "alt5\000" +.LASF75: + .ascii "input\000" +.LASF134: + .ascii "stderr\000" +.LASF118: + .ascii "format\000" +.LASF25: + .ascii "_IO_buf_end\000" +.LASF108: + .ascii "sleepTime\000" +.LASF23: + .ascii "_IO_write_end\000" +.LASF0: + .ascii "unsigned int\000" +.LASF55: + .ascii "uint32_t\000" +.LASF123: + .ascii "pinCnt\000" +.LASF133: + .ascii "gpioValidatePin\000" +.LASF17: + .ascii "_flags\000" +.LASF29: + .ascii "_markers\000" +.LASF65: + .ascii "ERROR_I2C_CLK_TIMEOUT\000" +.LASF113: + .ascii "error\000" +.LASF78: + .ascii "alt1\000" +.LASF122: + .ascii "validPins\000" +.LASF105: + .ascii "gpioReadPin\000" +.LASF98: + .ascii "gpioSetup\000" +.LASF120: + .ascii "tempRtn\000" +.LASF97: + .ascii "revision\000" +.LASF119: + .ascii "arguments\000" +.LASF52: + .ascii "_pos\000" +.LASF28: + .ascii "_IO_save_end\000" +.LASF121: + .ascii "index\000" +.LASF7: + .ascii "long long unsigned int\000" +.LASF117: + .ascii "file\000" +.LASF69: + .ascii "high\000" +.LASF27: + .ascii "_IO_backup_base\000" +.LASF38: + .ascii "_offset\000" +.LASF59: + .ascii "ERROR_NULL\000" +.LASF31: + .ascii "_fileno\000" +.LASF46: + .ascii "__gnuc_va_list\000" +.LASF67: + .ascii "ERROR_MAX\000" +.LASF92: + .ascii "tv_nsec\000" +.LASF8: + .ascii "size_t\000" +.LASF76: + .ascii "output\000" +.LASF20: + .ascii "_IO_read_base\000" +.LASF83: + .ascii "eFunctionMin\000" +.LASF50: + .ascii "_next\000" +.LASF100: + .ascii "gpioSetFunction\000" +.LASF58: + .ascii "ERROR_RANGE\000" +.LASF90: + .ascii "timespec\000" +.LASF15: + .ascii "char\000" +.LASF44: + .ascii "_mode\000" +.LASF49: + .ascii "_IO_marker\000" +.LASF18: + .ascii "_IO_read_ptr\000" +.LASF56: + .ascii "ERROR_DEFAULT\000" +.LASF54: + .ascii "ssize_t\000" +.LASF73: + .ascii "pullup\000" +.LASF53: + .ascii "va_list\000" +.LASF21: + .ascii "_IO_write_base\000" +.LASF66: + .ascii "ERROR_INVALID_BSC\000" +.LASF6: + .ascii "long long int\000" +.LASF114: + .ascii "errorString\000" +.LASF26: + .ascii "_IO_save_base\000" +.LASF103: + .ascii "gpioSetPin\000" +.LASF63: + .ascii "ERROR_I2C_NACK\000" +.LASF131: + .ascii "__ap\000" +.LASF9: + .ascii "__quad_t\000" +.LASF129: + .ascii "gpio.c\000" +.LASF112: + .ascii "gpioErrToString\000" +.LASF68: + .ascii "errStatus\000" +.LASF39: + .ascii "__pad1\000" +.LASF40: + .ascii "__pad2\000" +.LASF41: + .ascii "__pad3\000" +.LASF42: + .ascii "__pad4\000" +.LASF43: + .ascii "__pad5\000" +.LASF124: + .ascii "validPinsForRev1\000" +.LASF107: + .ascii "resistorOption\000" +.LASF35: + .ascii "_vtable_offset\000" +.LASF127: + .ascii "pcbRev\000" +.LASF125: + .ascii "validPinsForRev2\000" +.LASF62: + .ascii "ERROR_ALREADY_INITIALISED\000" +.LASF115: + .ascii "dbgPrint\000" +.LASF130: + .ascii "/home/pi/RaspberryPi-GPIO/src\000" +.LASF93: + .ascii "mem_fd\000" +.LASF19: + .ascii "_IO_read_end\000" +.LASF5: + .ascii "short int\000" +.LASF11: + .ascii "long int\000" +.LASF57: + .ascii "ERROR_INVALID_PIN_NUMBER\000" +.LASF85: + .ascii "eFunction\000" +.LASF64: + .ascii "ERROR_I2C\000" +.LASF96: + .ascii "linelen\000" +.LASF72: + .ascii "pulldown\000" +.LASF14: + .ascii "__ssize_t\000" +.LASF126: + .ascii "gGpioMap\000" +.LASF94: + .ascii "cpuinfo\000" +.LASF61: + .ascii "ERROR_NOT_INITIALISED\000" +.LASF71: + .ascii "pullDisable\000" +.LASF110: + .ascii "gpioNumberScl\000" +.LASF48: + .ascii "__va_list\000" +.LASF37: + .ascii "_lock\000" +.LASF91: + .ascii "tv_sec\000" +.LASF3: + .ascii "long unsigned int\000" +.LASF70: + .ascii "eState\000" +.LASF33: + .ascii "_old_offset\000" +.LASF101: + .ascii "gpioNumber\000" +.LASF47: + .ascii "_IO_FILE\000" +.LASF128: + .ascii "GNU C 4.6.3\000" +.LASF111: + .ascii "gpioNumberSda\000" +.LASF1: + .ascii "unsigned char\000" +.LASF84: + .ascii "eFunctionMax\000" +.LASF102: + .ascii "function\000" +.LASF51: + .ascii "_sbuf\000" +.LASF95: + .ascii "line\000" +.LASF22: + .ascii "_IO_write_ptr\000" +.LASF74: + .ascii "eResistor\000" +.LASF99: + .ascii "gpioCleanup\000" +.LASF13: + .ascii "__time_t\000" +.LASF104: + .ascii "state\000" +.LASF87: + .ascii "pcbRev1\000" +.LASF88: + .ascii "pcbRev2\000" +.LASF10: + .ascii "__off_t\000" +.LASF106: + .ascii "gpioSetPullResistor\000" +.LASF4: + .ascii "signed char\000" +.LASF2: + .ascii "short unsigned int\000" +.LASF89: + .ascii "tPcbRev\000" +.LASF86: + .ascii "pcbRevError\000" +.LASF30: + .ascii "_chain\000" +.LASF16: + .ascii "FILE\000" +.LASF32: + .ascii "_flags2\000" +.LASF60: + .ascii "ERROR_EXTERNAL\000" +.LASF34: + .ascii "_cur_column\000" +.LASF12: + .ascii "__off64_t\000" +.LASF45: + .ascii "_unused2\000" +.LASF24: + .ascii "_IO_buf_base\000" +.LASF116: + .ascii "stream\000" + .ident "GCC: (Debian 4.6.3-14+rpi1) 4.6.3" + .section .note.GNU-stack,"",%progbits + + + /** + * @file + * @brief Contains source for the GPIO functionality. + * + * This is is part of https://github.com/alanbarr/RaspberryPi-GPIO + * a C library for basic control of the Raspberry Pi's GPIO pins. + * Copyright (C) Alan Barr 2012 + * + * This code was loosely based on the example code + * provided by Dom and Gert found at: + * http://elinux.org/RPi_Low-level_peripherals + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + + #include "gpio.h" + + /* Local / internal prototypes */ + static errStatus gpioValidatePin(int gpioNumber); + + /**** Globals ****/ + /** @brief Pointer which will be mmap'd to the GPIO memory in /dev/mem */ + static volatile uint32_t * gGpioMap = NULL; + + /** @brief PCB revision that executable is being run on */ + static tPcbRev pcbRev = pcbRevError; + + /** + * @brief Maps the memory used for GPIO access. This function must be called + * prior to any of the other GPIO calls. + * @return An error from #errStatus. */ + errStatus gpioSetup(void) + { + int mem_fd = 0; + errStatus rtn = ERROR_DEFAULT; + + if ((mem_fd = open("/dev/mem", O_RDWR)) < 0) + { + dbgPrint(DBG_INFO, "open() failed. /dev/mem. errno %s.", strerror(errno)); + rtn = ERROR_EXTERNAL; + } + + else if ((gGpioMap = (volatile uint32_t *)mmap(NULL, + GPIO_MAP_SIZE, + PROT_READ|PROT_WRITE, + MAP_SHARED, + mem_fd, + GPIO_BASE)) == MAP_FAILED) + { + dbgPrint(DBG_INFO, "mmap() failed. errno: %s.", strerror(errno)); + rtn = ERROR_EXTERNAL; + } + + /* Close the fd, we have now mapped it */ + else if (close(mem_fd) != OK) + { + dbgPrint(DBG_INFO, "close() failed. errno: %s.", strerror(errno)); + rtn = ERROR_EXTERNAL; + } + + else + { + FILE* cpuinfo = fopen("/proc/cpuinfo", "r"); + if (cpuinfo) + { + char* line = NULL; + ssize_t linelen; + size_t foo; + + while (((linelen = getline(&line, &foo, cpuinfo)) >= 0)) + { + if (strstr(line, "Revision") == line) + { + char* rev = strstr(line, ":"); + if (rev) + { + long revision = strtol(rev + 1, NULL, 16); + + if (revision <= 3) + { + pcbRev = pcbRev1; + } + + else + { + pcbRev = pcbRev2; + } + } + } + } /* while */ + if (pcbRev != pcbRevError) + { + rtn = OK; + } + else + { + dbgPrint(DBG_INFO, "did not find revision in cpuinfo."); + rtn = ERROR_EXTERNAL; + } + + if (line) + { + free(line); + } + fclose(cpuinfo); + } + else + { + dbgPrint(DBG_INFO, "can't open /proc/cpuinfo. errno: %s.", strerror(errno)); + rtn = ERROR_EXTERNAL; + } + } + + return rtn; + } + + + /** + * @brief Unmaps the memory used for the gpio pins. This function should be + * called when finished with the GPIO pins. + * @return An error from #errStatus. */ + errStatus gpioCleanup(void) + { + errStatus rtn = ERROR_DEFAULT; + + if (gGpioMap == NULL) + { + dbgPrint(DBG_INFO, "gGpioMap was NULL. Ensure gpioSetup() was called successfully."); + rtn = ERROR_NULL; + } + + else if (munmap((void *)gGpioMap, GPIO_MAP_SIZE) != OK) + { + dbgPrint(DBG_INFO, "mummap() failed. errno %s.", strerror(errno)); + rtn = ERROR_EXTERNAL; + } + + else + { + gGpioMap = NULL; + rtn = OK; + } + return rtn; + } + + + /** + * @brief Sets the functionality of the desired pin. + * @param gpioNumber The gpio pin number to change. + * @param function The desired functionality for the pin. + * @return An error from #errStatus. */ + errStatus gpioSetFunction(int gpioNumber, eFunction function) + { + errStatus rtn = ERROR_DEFAULT; + + if (gGpioMap == NULL) + { + dbgPrint(DBG_INFO, "gGpioMap was NULL. Ensure gpioSetup() called successfully."); + rtn = ERROR_NULL; + } + + else if (function < eFunctionMin || function > eFunctionMax) + { + dbgPrint(DBG_INFO, "eFunction was out of range. %d", function); + rtn = ERROR_RANGE; + } + + else if ((rtn = gpioValidatePin(gpioNumber)) != OK) + { + dbgPrint(DBG_INFO, "gpioValidatePin() failed. Ensure pin %d is valid.", gpioNumber); + } + + else + { + /* Clear what ever function bits currently exist - this puts the pin + * into input mode.*/ + *(gGpioMap + (gpioNumber / 10)) &= ~(GPFSEL_BITS << ((gpioNumber % 10) * 3)); + + /* Set the three pins for the pin to the desired value */ + *(gGpioMap + (gpioNumber / 10)) |= (function << ((gpioNumber % 10) * 3)); + + rtn = OK; + } + + return rtn; + } + + + /** + * @brief Sets a pin to high or low. + * @details The pin should be configured as an ouput with + * gpioSetFunction() prior to this. + * @param gpioNumber The pin to set. + * @param state The desired state of the pin. + * @return An error from #errStatus.*/ + errStatus gpioSetPin(int gpioNumber, eState state) + { + errStatus rtn = ERROR_DEFAULT; + + if (gGpioMap == NULL) + { + dbgPrint(DBG_INFO, "gGpioMap was NULL. Ensure gpioSetup() was called successfully."); + rtn = ERROR_NULL; + } + + else if ((rtn = gpioValidatePin(gpioNumber)) != OK) + { + dbgPrint(DBG_INFO, "gpioValidatePin() failed. Ensure pin %d is valid.", gpioNumber); + } + + else if (state == high) + { + /* The offsets are all in bytes. Divide by sizeof uint32_t to allow + * pointer addition. */ + GPIO_GPSET0 = 0x1 << gpioNumber; + rtn = OK; + } + + else if (state == low) + { + /* The offsets are all in bytes. Divide by sizeof uint32_t to allow + * pointer addition. */ + GPIO_GPCLR0 = 0x1 << gpioNumber; + rtn = OK; + } + + else + { + dbgPrint(DBG_INFO,"state %d should have been %d or %d", state, low, high); + rtn = ERROR_RANGE; + } + + return rtn; + } + + + /** + * @brief Reads the current state of a gpio pin. + * @param gpioNumber The number of the GPIO pin to read. + * @param[out] state Pointer to the variable in which the GPIO pin state is + * returned. + * @return An error from #errStatus. */ + errStatus gpioReadPin(int gpioNumber, eState * state) + { + errStatus rtn = ERROR_DEFAULT; + + if (gGpioMap == NULL) + { + dbgPrint(DBG_INFO, "gGpioMap was NULL. Ensure gpioSetup() was called successfully."); + rtn = ERROR_NULL; + } + + else if (state == NULL) + { + dbgPrint(DBG_INFO, "Parameter state was NULL."); + rtn = ERROR_NULL; + } + + else if ((rtn = gpioValidatePin(gpioNumber)) != OK) + { + dbgPrint(DBG_INFO, "gpioValidatePin() failed. Pin %d isn't valid.", gpioNumber); + } + + else + { + /* Check if the appropriate bit is high */ + if (GPIO_GPLEV0 & (0x1 << gpioNumber)) + { + *state = high; + } + + else + { + *state = low; + } + + rtn = OK; + } + + return rtn; + } + + /** + * @brief Allows configuration of the internal resistor at a GPIO pin. + * @details The GPIO pins on the BCM2835 have the option of configuring a + * pullup, pulldown or no resistor at the pin. + * @param gpioNumber The GPIO pin to configure. + * @param resistorOption The available resistor options. + * @return An error from #errStatus. */ + errStatus gpioSetPullResistor(int gpioNumber, eResistor resistorOption) + { + errStatus rtn = ERROR_DEFAULT; + struct timespec sleepTime; + + if (gGpioMap == NULL) + { + dbgPrint(DBG_INFO, "gGpioMap was NULL. Ensure gpioSetup() was called successfully."); + rtn = ERROR_NULL; + } + + else if ((rtn = gpioValidatePin(gpioNumber)) != OK) + { + dbgPrint(DBG_INFO, "gpioValidatePin() failed. Pin %d isn't valid.", gpioNumber); + } + + else if (resistorOption < pullDisable || resistorOption > pullup) + { + dbgPrint(DBG_INFO, "resistorOption value: %d was out of range.", resistorOption); + rtn = ERROR_RANGE; + } + + else + { + sleepTime.tv_sec = 0; + sleepTime.tv_nsec = 1000 * RESISTOR_SLEEP_US; + + /* Set the GPPUD register with the desired resistor type */ + GPIO_GPPUD = resistorOption; + /* Wait for control signal to be set up */ + nanosleep(&sleepTime, NULL); + /* Clock the control signal for desired resistor */ + GPIO_GPPUDCLK0 = (0x1 << gpioNumber); + /* Hold to set */ + nanosleep(&sleepTime, NULL); + GPIO_GPPUD = 0; + GPIO_GPPUDCLK0 = 0; + + rtn = OK; + } + + + return rtn; + } + + /** + * @brief Get the correct I2C pins. + * @details The different revisions of the PI have their I2C + * ports on different GPIO + * pins which require different BSC modules. + * @param[out] gpioNumberScl Integer to be populated with scl gpio number. + * @param[out] gpioNumberSda Integer to be populated with sda gpio number. + * @todo TODO Does this need to be public or internal only? + * @return An error from #errStatus. */ + errStatus gpioGetI2cPins(int * gpioNumberScl, int * gpioNumberSda) + { + errStatus rtn = ERROR_DEFAULT; + + if (gGpioMap == NULL) + { + dbgPrint(DBG_INFO, "gGpioMap was NULL. Ensure gpioSetup() was called successfully."); + rtn = ERROR_NULL; + } + + else if (gpioNumberScl == NULL) + { + dbgPrint(DBG_INFO, "Parameter gpioNumberScl is NULL."); + rtn = ERROR_NULL; + } + + else if (gpioNumberSda == NULL) + { + dbgPrint(DBG_INFO, "Parameter gpioNumberSda is NULL."); + rtn = ERROR_NULL; + } + + else if (pcbRev == pcbRev1) + { + *gpioNumberScl = REV1_SCL; + *gpioNumberSda = REV1_SDA; + rtn = OK; + } + + else if (pcbRev == pcbRev2) + { + *gpioNumberScl = REV2_SCL; + *gpioNumberSda = REV2_SDA; + rtn = OK; + } + + return rtn; + } + + + #undef ERROR + /** Redefining to replace macro with x as a string, i.e. "x". For use in + * gpioErrToString() */ + #define ERROR(x) #x, + + /** + * @brief Debug function which converts an error from errStatus to a string. + * @param error Error from #errStatus. + * @return String representation of errStatus parameter error. */ + const char * gpioErrToString(errStatus error) + { + static const char * errorString[] = { ERRORS }; + + if (error < 0 || error >= ERROR_MAX) + { + return "InvalidError"; + } + + else + { + return errorString[error]; + } + } + + + /** + * @brief Debug function wrapper for fprintf(). + * @details Allows file and line information to be added easier + * to output strings. #DBG_INFO is a macro which is useful + * to call as the "first" parameter to this function. Note + * this function will add on a newline to the end of a format + * string so one is generally not required in \p format. + * @param[in] stream Output stream for strings, e.g. stderr, stdout. + * @param[in] file Name of file to be printed. Should be retrieved with __FILE__. + * @param line Line number to print. Should be retrieved with __LINE__. + * @param[in] format Formatted string in the format which printf() would accept. + * @param ... Additional arguments - to fill in placeholders in parameter + * \p format. + * @return This function uses the printf() family functions and the + * returned integer is what is returned from these calls: If + * successful the number or characters printed is returned, + * if unsuccessful a negative value. + */ + int dbgPrint(FILE * stream, const char * file, int line, const char * format, ...) + { + va_list arguments; + int rtn = 0; + int tempRtn = 0; + + if (stream != NULL) + { + if ((tempRtn = fprintf(stream,"[%s:%d] ", file, line)) < 0) + { + return tempRtn; + } + rtn += tempRtn; + + va_start(arguments, format); + if ((tempRtn = vfprintf(stream, format, arguments)) < 0) + { + return tempRtn; + } + rtn += tempRtn; + va_end(arguments); + + if ((tempRtn = fprintf(stream,"\n")) < 0) + { + return tempRtn; + } + rtn += tempRtn; + + } + return rtn; + } + + /****************************** Internal Functions ******************************/ + + /** + * @brief Internal function which Validates that the pin + * \p gpioNumber is valid for the Raspberry Pi. + * @details The first time this function is called it will perform + * some basic initalisation on internal variables. + * @param gpioNumber The pin number to check. + * @return An error from #errStatus. */ + static errStatus gpioValidatePin(int gpioNumber) + { + errStatus rtn = ERROR_INVALID_PIN_NUMBER; + int index = 0; + /* TODO REV1 and REV2 have the same pincount. REV2 technically has more if + * P5 is supported. If there is a REV3 the size of this array will need to + * be addressed. */ + static uint32_t validPins[REV2_PINCNT] = {0}; + static uint32_t pinCnt = 0; + + if (pinCnt == 0) + { + if (pcbRev == pcbRevError) + { + rtn = ERROR_RANGE; + } + + else if (pcbRev == pcbRev1) + { + const uint32_t validPinsForRev1[REV1_PINCNT] = REV1_PINS; + memcpy(validPins, validPinsForRev1, sizeof(validPinsForRev1)); + pinCnt = REV1_PINCNT; + } + else if (pcbRev == pcbRev2) + { + const uint32_t validPinsForRev2[REV2_PINCNT] = REV2_PINS; + memcpy(validPins, validPinsForRev2, sizeof(validPinsForRev2)); + pinCnt = REV2_PINCNT; + } + } + + for (index = 0; index < pinCnt; index++) + { + if (gpioNumber == validPins[index]) + { + rtn = OK; + break; + } + } + + return rtn; + } + +