/* $Id: drv_generic_gpio.c,v 1.2 2005/12/20 07:07:44 reinelt Exp $ * * generic driver helper for GPO's * * Copyright (C) 2005 Michael Reinelt * Copyright (C) 2005 The LCD4Linux Team * * This file is part of LCD4Linux. * * LCD4Linux 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 2, or (at your option) * any later version. * * LCD4Linux 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * * $Log: drv_generic_gpio.c,v $ * Revision 1.2 2005/12/20 07:07:44 reinelt * further work on GPO's, HD44780 GPO support * * Revision 1.1 2005/12/18 16:18:36 reinelt * GPO's added again * */ /* * * exported variables: * * extern int GPIS, GPOS; number of Inputs and Outputs * * * these functions must be implemented by the real driver: * * int (*drv_generic_gpio_real_set) (const int num, const int val); * sets GPO num to val, returns the actal value * * int (*drv_generic_gpio_real_get) (const int num); * reads GPI num * * * exported fuctions: * * int drv_generic_gpio_init(const char *section, const char *driver); * initializes the generic GPIO driver * * int drv_generic_gpio_clear(void); * resets all GPO's * * int drv_generic_gpio_draw(WIDGET * W); * 'draws' GPO widget * calls drv_generic_gpio_real_set() * * int drv_generic_gpio_quit(void); * closes the generic GPIO driver * */ #include "config.h" #include #include "debug.h" #include "plugin.h" #include "widget.h" #include "widget_gpo.h" #include "drv_generic_gpio.h" #ifdef WITH_DMALLOC #include #endif #define MAX_GPOS 32 static char *Section = NULL; static char *Driver = NULL; static int GPO[MAX_GPOS]; int GPOS = 0; int GPIS = 0; static void drv_generic_gpio_plugin_gpo(RESULT * result, const int argc, RESULT * argv[]) { int num, val; double gpo; switch (argc) { case 1: num = R2N(argv[0]); if (num <= 0 || num > GPOS) { error("%s::GPO(%d): GPO out of range (1..%d)", Driver, num, GPOS); SetResult(&result, R_STRING, ""); return; } gpo = GPO[num-1]; SetResult(&result, R_NUMBER, &gpo); break; case 2: num = R2N(argv[0]); val = R2N(argv[1]); if (num <= 0 || num > GPOS) { error("%s::GPO(%d): GPO out of range (1..%d)", Driver, num, GPOS); SetResult(&result, R_STRING, ""); return; } if (GPO[num-1] != val) { GPO[num-1] = drv_generic_gpio_real_set(num-1, val); } gpo = GPO[num-1]; SetResult(&result, R_NUMBER, &gpo); break; default: error("%s::GPO(): wrong number of parameters", Driver); SetResult(&result, R_STRING, ""); } } int drv_generic_gpio_init(const char *section, const char *driver) { WIDGET_CLASS wc; Section = (char *) section; Driver = (char *) driver; if (GPIS <= 0 && GPOS <= 0) { error("%s: Huh? gpio_init(GPIS=%d, GPOS=%d)", Driver, GPIS, GPOS); } /* reset all GPO's */ drv_generic_gpio_clear(); /* register gpo widget */ wc = Widget_GPO; wc.draw = drv_generic_gpio_draw; widget_register(&wc); /* register plugins */ AddFunction("LCD::GPO", -1, drv_generic_gpio_plugin_gpo); return 0; } int drv_generic_gpio_clear(void) { int i; /* init GPO bufferr */ for (i = 0; i < MAX_GPOS; i++) { GPO[i] = 0; } /* really clear GPO's */ for (i = 0; i < GPOS; i++) { GPO[i] = drv_generic_gpio_real_set(i, 0); } return 0; } int drv_generic_gpio_draw(WIDGET * W) { WIDGET_GPO *gpo = W->data; int num = gpo->num; int val = gpo->val; if (num < 0 || num >= GPOS) { error("%s: gpio_draw(%d): GPO out of range (0..%d)", Driver, num + 1, GPOS); return -1; } if (GPO[num] != val) { GPO[num] = drv_generic_gpio_real_set(num, val); } return 0; } int drv_generic_gpio_quit(void) { return 0; }