@ 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 "<built-in>"
	.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 <http://www.gnu.org/licenses/>.
   *
   */

  #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;
  }