Annotation of embedtools/src/pceng_run.c, revision 1.1.2.5
1.1.2.1 misho 1: /*************************************************************************
2: * (C) 2011 AITNET - Sofia/Bulgaria - <office@aitbg.com>
3: * by Michael Pounov <misho@aitbg.com>
4: *
5: * $Author: misho $
1.1.2.5 ! misho 6: * $Id: pceng_run.c,v 1.1.2.4 2011/07/25 09:13:34 misho Exp $
1.1.2.1 misho 7: *
8: *************************************************************************
9: The ELWIX and AITNET software is distributed under the following
10: terms:
11:
12: All of the documentation and software included in the ELWIX and AITNET
13: Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
14:
15: Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
16: by Michael Pounov <misho@elwix.org>. All rights reserved.
17:
18: Redistribution and use in source and binary forms, with or without
19: modification, are permitted provided that the following conditions
20: are met:
21: 1. Redistributions of source code must retain the above copyright
22: notice, this list of conditions and the following disclaimer.
23: 2. Redistributions in binary form must reproduce the above copyright
24: notice, this list of conditions and the following disclaimer in the
25: documentation and/or other materials provided with the distribution.
26: 3. All advertising materials mentioning features or use of this software
27: must display the following acknowledgement:
28: This product includes software developed by Michael Pounov <misho@elwix.org>
29: ELWIX - Embedded LightWeight unIX and its contributors.
30: 4. Neither the name of AITNET nor the names of its contributors
31: may be used to endorse or promote products derived from this software
32: without specific prior written permission.
33:
34: THIS SOFTWARE IS PROVIDED BY AITNET AND CONTRIBUTORS ``AS IS'' AND
35: ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
36: IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
37: ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
38: FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
39: DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
40: OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
41: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
42: LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
43: OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
44: SUCH DAMAGE.
45: */
46: #include "global.h"
47: #include "pceng.h"
48:
49:
1.1.2.5 ! misho 50: const u_int led_base[2][MAX_GPIO_PINS] = {{0xf410, 0xf400, 0xf400, 0xf400},
1.1.2.3 misho 51: {0x61b0, 0x6100, 0x6180, 0x6180}};
1.1.2.5 ! misho 52: const int led_bit[2][MAX_GPIO_PINS] = {{8, 2, 3, 18}, {8, 6, 9, 11}};
1.1.2.3 misho 53: const int gpio_off[2] = { 0x4, 0x10 };
54:
55:
56: static inline board_t
57: getBoard()
58: {
59: board_t type;
60: char szStr[STRSIZ];
61:
62: FTRACE(3);
63:
64: cfg_LoadAttribute(&cfg, CFG("pceng"), CFG("board"), CFG(szStr), sizeof szStr, DEFAULT_BOARD);
65: if (!strcasecmp(szStr, "alix"))
66: type = alix;
67: else if (!strcasecmp(szStr, "wrap"))
68: type = wrap;
69: else {
70: type = unknown;
71: syslog(LOG_ERR, "Error:: unknown board type %s", szStr);
72: }
73:
74: return type;
75: }
76:
77: static u_int
1.1.2.5 ! misho 78: gpioRead(u_char ledno)
1.1.2.3 misho 79: {
80: u_int n;
81: board_t type = getBoard();
82:
83: FTRACE(3);
84:
85: switch (type) {
86: case wrap:
87: n = inl(led_base[type - 1][ledno] + gpio_off[type - 1]);
88: if (n & (1 << led_bit[type - 1][ledno]))
89: n = 1;
90: else
91: n = 0;
92: break;
93: case alix:
94: n = inl(led_base[type - 1][ledno]);
95: if (n & (1 << led_bit[type - 1][ledno]))
96: n = 0;
97: else
98: n = 1;
99: break;
100: default:
101: return -1;
102: }
103:
104: return n;
105: }
106:
107:
1.1.2.1 misho 108: int
1.1.2.3 misho 109: LED(u_char ledno, u_char state)
1.1.2.2 misho 110: {
1.1.2.3 misho 111: u_int n;
112: board_t type = getBoard();
113:
1.1.2.2 misho 114: FTRACE(3);
115:
1.1.2.3 misho 116: switch (type) {
117: case wrap:
118: n = inl(led_base[type - 1][ledno]);
1.1.2.4 misho 119: if (state == (u_char) -1)
120: return (n &= (1 << led_bit[type - 1][ledno]));
121:
1.1.2.3 misho 122: if (state)
123: n |= (1 << led_bit[type - 1][ledno]);
124: else
125: n &= ~(1 << led_bit[type - 1][ledno]);
126: break;
127: case alix:
1.1.2.4 misho 128: if (state == (u_char) -1) {
129: n = inl(led_base[type - 1][ledno]);
130: return !(n &= (1 << led_bit[type - 1][ledno]));
131: }
132:
1.1.2.3 misho 133: if (state)
134: n = (1 << (led_bit[type - 1][ledno] + gpio_off[type - 1]));
135: else
136: n = (1 << led_bit[type - 1][ledno]);
137: break;
138: default:
139: return -1;
140: }
141:
142: outl(led_base[type - 1][ledno], n);
1.1.2.2 misho 143: return 0;
144: }
145:
1.1.2.5 ! misho 146: static int
! 147: RunCmd(u_char pin, u_int state)
! 148: {
! 149: char szStr[STRSIZ], szArg[STRSIZ] = { 0 };
! 150:
! 151: FTRACE(3);
! 152:
! 153: switch (pin) {
! 154: case 0: /* button */
! 155: cfg_LoadAttribute(&cfg, CFG("event"), CFG("button_exec"),
! 156: CFG(szStr), sizeof szStr, NULL);
! 157: break;
! 158: case 1: /* LEDs */
! 159: case 2:
! 160: case 3:
! 161: cfg_LoadAttribute(&cfg, CFG("event"), CFG("led_exec"),
! 162: CFG(szStr), sizeof szStr, NULL);
! 163: break;
! 164: }
! 165: if (!*szStr)
! 166: return 0;
! 167: else
! 168: snprintf(szArg, sizeof szArg, "%d", state);
! 169:
! 170: switch (vfork()) {
! 171: case -1:
! 172: syslog(LOG_ERR, "Error:: RunCmd #%d - %s\n", errno, strerror(errno));
! 173: return -1;
! 174: case 0: /* execute command */
! 175: return execl(szStr, szStr, szArg, NULL);
! 176: }
! 177:
! 178: return 0;
! 179: }
! 180:
1.1.2.2 misho 181: int
1.1.2.3 misho 182: Run()
1.1.2.1 misho 183: {
1.1.2.5 ! misho 184: register u_char i;
! 185: u_int ret, t, slice, states = 0;
! 186: char szStr[STRSIZ];
! 187:
1.1.2.1 misho 188: FTRACE(3);
189:
1.1.2.5 ! misho 190: /* init array */
! 191: for (i = 0; i < MAX_GPIO_PINS; i++)
! 192: if ((ret = gpioRead(i)) == -1)
! 193: return 126;
! 194: else
! 195: states |= (1 << i);
! 196:
! 197: /* state machine */
! 198: while (!Kill) {
! 199: cfg_LoadAttribute(&cfg, CFG("event"), CFG("button_slice"),
! 200: CFG(szStr), sizeof szStr, DEFAULT_SLICE);
! 201: slice = strtol(szStr, NULL, 0);
! 202: if (!slice)
! 203: slice = strtol(DEFAULT_SLICE, NULL, 0);
! 204: slice *= 1000;
! 205:
! 206: for (i = t = 0; i < MAX_GPIO_PINS; t = 0, i++) {
! 207: if ((ret = gpioRead(i)) == -1)
! 208: return 127;
! 209:
! 210: if (ret != ((states >> i) & 0x1)) {
! 211: if (!i) {
! 212: t = 0;
! 213: do {
! 214: t++;
! 215: usleep(slice);
! 216: if (gpioRead(i) != ret)
! 217: break;
! 218: } while (!Kill);
! 219: } else {
! 220: t = ret;
! 221: if (ret)
! 222: states |= (1 << i);
! 223: else
! 224: states &= ~(1 << i);
! 225: }
! 226:
! 227: RunCmd(i, t);
! 228: }
! 229: }
! 230: }
! 231:
1.1.2.1 misho 232: return 0;
233: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>