/* Zipit LED control. * (c) 2005 Chris Studholme * GPL */ #include #include #include #include #include "hardware.h" volatile unsigned char* pbdr = (unsigned char*)(CLPS7111_VIRT_BASE+PBDR); volatile unsigned char* pbddr = (unsigned char*)(CLPS7111_VIRT_BASE+PBDDR); volatile unsigned char* pddr = (unsigned char*)(CLPS7111_VIRT_BASE+PDDR); volatile unsigned char* ledflsh = (unsigned char*)(CLPS7111_VIRT_BASE+LEDFLSH); static void read_both() { unsigned char g = *pbdr; unsigned char y = *pddr; printf("%d %d\n",(g>>1)&1,y&1); } static void read_green() { unsigned char g = *pbdr; printf("%d\n",(g>>1)&1); } static void read_yellow() { unsigned char y = *pddr; printf("%d\n",y&1); } int main(int argc, char **argv) { if (argc<=1) read_both(); else if (strncasecmp(argv[1],"g",1)==0) { // green if (argc>=3) { int i = atoi(argv[2]); if (i==0) { *pbddr |= 2; // force low (off) *pbdr &= ~2; } else if (i==1) { *pbddr |= 2; // force high (on) *pbdr |= 2; } else { *pbddr &= ~2; // hi-z, someone else drives it } } read_green(); } else if (strncasecmp(argv[1],"o",1)==0 || strncasecmp(argv[1],"y",1)==0) { // yellow/orange if (argc==3) { *ledflsh = 0; int i = atoi(argv[2]); if (i==0) *pddr &= ~1; else *pddr |= 1; } else if (argc>3) { int r = (atoi(argv[2])-1)&3; int d = atoi(argv[3])&15; if (d>0) *ledflsh = 64 + (d<<2) + r; else *ledflsh = 0; } read_yellow(); } else { printf("Usage:\n"); printf(" led g[reen] state\n"); printf(" state - 0/1/2 for off/on/hi-z\n"); printf(" led y[ellow]|o[range] state\n"); printf(" state - 0/1 for off/on\n"); printf(" led y[ellow]|o[range] period duty\n"); printf(" period - 1 to 4 seconds\n"); printf(" duty - 1 to 15 per 15 duty cycle\n"); return 1; } return 0; }