From: Keith Packard Date: Sun, 24 Oct 2010 22:36:06 +0000 (-0700) Subject: altos: control TD GPIO pins directly with the 'o' command X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=commitdiff_plain;h=02373557cc112682139863fb20432287f5755780 altos: control TD GPIO pins directly with the 'o' command This adds direct access to the teledongle GPIO pins for output. Signed-off-by: Keith Packard --- diff --git a/src/Makefile.proto b/src/Makefile.proto index b23eb257..0c2a2392 100644 --- a/src/Makefile.proto +++ b/src/Makefile.proto @@ -166,11 +166,15 @@ TT_SRC = \ TD_MAIN_SRC = \ ao_teledongle.c +TD_DRIVER_SRC = \ + ao_pins.c + TD_SRC = \ $(ALTOS_SRC) \ $(ALTOS_DRIVER_SRC) \ $(TELE_RECEIVER_SRC) \ $(TELE_COMMON_SRC) \ + $(TD_DRIVER_SRC) \ $(TD_MAIN_SRC) include Makefile.defs diff --git a/src/ao_pins.c b/src/ao_pins.c new file mode 100644 index 00000000..80d647c1 --- /dev/null +++ b/src/ao_pins.c @@ -0,0 +1,76 @@ +/* + * Copyright © 2010 Keith Packard + * + * 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; version 2 of the License. + * + * 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, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +#include "ao.h" +#include "ao_pins.h" + +static void +ao_pins_enable(void) +{ +#if defined(TELEDONGLE_V_0_2) + P0DIR = 0xff; + P1DIR = 0x3f; + P2DIR = 0x1f; +#elif defined(TELEDONGLE_V_0_1) + P0DIR = 0xff; + P1DIR = 0x3f; + P2DIR = 0x1f; +#else +#error "ao_pins not configured for this device" +#endif +} + +static void +ao_pins_set(void) +{ + uint8_t reg, val; + + ao_pins_enable(); + for (;;) { + ao_cmd_white(); + if (ao_cmd_lex_c == '\n') + break; + ao_cmd_hex(); + reg = ao_cmd_lex_i; + ao_cmd_hex(); + val = ao_cmd_lex_i; + if (ao_cmd_status != ao_cmd_success) + break; + switch (reg) { + case 0: + P0 = val; + break; + case 1: + P1 = val; + break; + case 2: + P2 = val; + break; + } + } +} + +__code struct ao_cmds ao_pins_cmds[] = { + { 'o', ao_pins_set, "o <0|1|2> ... Set GPIO output" }, + { 0, ao_pins_set, 0 }, +}; + +void +ao_pins_init(void) +{ + ao_cmd_register(&ao_pins_cmds[0]); +} diff --git a/src/ao_teledongle.c b/src/ao_teledongle.c index 505dc0cb..e1f3b085 100644 --- a/src/ao_teledongle.c +++ b/src/ao_teledongle.c @@ -33,6 +33,7 @@ main(void) ao_radio_init(); ao_packet_slave_init(); ao_packet_master_init(); + ao_pins_init(); #if HAS_DBG ao_dbg_init(); #endif