X-Git-Url: http://git.asbjorn.biz/?p=rapper.git;a=blobdiff_plain;f=bitbucket_lpc1768%2Fio-pin.ss;fp=bitbucket_lpc1768%2Fio-pin.ss;h=5b8cda92141e9cd673157176fc73dc80db18b84e;hp=0000000000000000000000000000000000000000;hb=4c765357d3685985fea2c360e681025c772e0472;hpb=81d357a0d5a52c468daa3b088028b04eb8b25db5 diff --git a/bitbucket_lpc1768/io-pin.ss b/bitbucket_lpc1768/io-pin.ss new file mode 100644 index 0000000..5b8cda9 --- /dev/null +++ b/bitbucket_lpc1768/io-pin.ss @@ -0,0 +1,76 @@ +#lang scribble/text +@(define ports '(P0 P1 P2 P3 P4)) +@(define registers '(LPC_GPIO0 LPC_GPIO1 LPC_GPIO2 LPC_GPIO3 LPC_GPIO4)) +/* + * IO functions for NXP LPC1768. (generated file, check io-pin.ss) + * + * See also: http://bitbucket.org/jpc/lpc1768/ + * + * Copyright (c) 2010 LoEE - Jakub Piotr Cłapa + * This program is released under the new BSD license. + */ +#ifndef IO_PIN_H +#define IO_PIN_H + +#include "CMSIS/LPC17xx.h" + +enum pin_port { +@(add-newlines + (for/list ([i (in-naturals)] + [port ports]) + @list{@port = @(* i 32),})) +}; + +enum pin_dir { + PIN_IN = 0, + PIN_OUT = 1, +}; + +extern void invalid_pin_error () __attribute__((error ("Invalid IO pin number."))); + +@(define INLINE "extern __inline__ __attribute__((always_inline))") +@(define-syntax-rule (switch pin_no i register template) + @list{switch(pin_no) { + @(add-newlines + (for/list ([i (in-naturals)] + [register registers]) + @list{case @(* i 32) ... @(sub1 (* (add1 i) 32)): + @template})) + default: + invalid_pin_error (); + break; + }}) + +@INLINE +int pin_read (int pin_no) +{ + @(switch @{pin_no} i register + @list{return @|register|->FIOPIN & (1 << (pin_no - @(* i 32)));}) + return 0; +} + +@INLINE +void pin_write (int pin_no, int value) +{ + @(switch @{pin_no} i register + @list{if (value) { + @|register|->FIOSET = (1 << (pin_no - @(* i 32))); + } else { + @|register|->FIOCLR = (1 << (pin_no - @(* i 32))); + } + break;}) +} + +@INLINE +void pin_dir (int pin_no, enum pin_dir dir) +{ + @(switch @{pin_no} i register + @list{if (dir == PIN_OUT) { + @|register|->FIODIR @"|=" (1 << (pin_no - @(* i 32))); + } else { + @|register|->FIODIR @"&=" (1 << (pin_no - @(* i 32))); + } + break;}) +} + +#endif \ No newline at end of file