/* Advance clock(s) */ static void adm_adclk(int clocks) { int i; for (i = 0; i < clocks; i++) { /* Clock high */ gpioout(eesk, eesk); udelay(EECK_EDGE_TIME); /* Clock low */ gpioout(eesk, 0); udelay(EECK_EDGE_TIME); } }
void okay(int on) { static int first; static int okled, polarity; char *p; if(!first++){ p = getconf("bcm2709.disk_led_gpio"); if(p == nil) p = getconf("bcm2708.disk_led_gpio"); if(p != nil) okled = strtol(p, 0, 0); else okled = 'v'; p = getconf("bcm2709.disk_led_active_low"); if(p == nil) p = getconf("bcm2708.disk_led_active_low"); polarity = (p == nil || *p == '1'); if(okled != 'v') gpiofuncset(okled, Output); } if(okled == 'v') vgpset(0, on); else if(okled != 0) gpioout(okled, on^polarity); }
void okay(int on) { static int first; if(!first++) gpiosel(OkLed, Output); gpioout(OkLed, !on); }
/* Enable outputs with specified value to the chip */ static void adm_enout(__u8 pins, __u8 val) { /* Prepare GPIO output value */ gpioout(pins, val); /* Enable GPIO outputs */ gpioouten(pins, pins); udelay(EECK_EDGE_TIME); }
static void adm_write(int cs, char *buf, unsigned int bits) { int i, len = (bits + 7) / 8; __u8 mask; gpioout(eecs, (cs ? eecs : 0)); udelay(EECK_EDGE_TIME); /* Byte assemble from MSB to LSB */ for (i = 0; i < len; i++) { /* Bit bang from MSB to LSB */ for (mask = 0x80; mask && bits > 0; mask >>= 1, bits --) { /* Clock low */ gpioout(eesk, 0); udelay(EECK_EDGE_TIME); /* Output on rising edge */ gpioout(eedi, ((mask & buf[i]) ? eedi : 0)); udelay(EEDI_SETUP_TIME); /* Clock high */ gpioout(eesk, eesk); udelay(EECK_EDGE_TIME); } } /* Clock low */ gpioout(eesk, 0); udelay(EECK_EDGE_TIME); if (cs) gpioout(eecs, 0); }
static void adm_read(int cs, char *buf, unsigned int bits) { int i, len = (bits + 7) / 8; __u8 mask; gpioout(eecs, (cs ? eecs : 0)); udelay(EECK_EDGE_TIME); /* Byte assemble from MSB to LSB */ for (i = 0; i < len; i++) { __u8 byte; /* Bit bang from MSB to LSB */ for (mask = 0x80, byte = 0; mask && bits > 0; mask >>= 1, bits --) { __u8 gp; /* Clock low */ gpioout(eesk, 0); udelay(EECK_EDGE_TIME); /* Input on rising edge */ gp = gpioin(); if (gp & eedi) byte |= mask; /* Clock high */ gpioout(eesk, eesk); udelay(EECK_EDGE_TIME); } *buf++ = byte; } /* Clock low */ gpioout(eesk, 0); udelay(EECK_EDGE_TIME); if (cs) gpioout(eecs, 0); }
void okay(int on) { static int first; static int okled, polarity; char *p; if(!first++){ p = getconf("bcm2709.disk_led_gpio"); if(p == nil) p = getconf("bcm2708.disk_led_gpio"); if(p != nil) okled = strtol(p, 0, 0); else okled = OkLed; p = getconf("bcm2709.disk_led_active_low"); if(p == nil) p = getconf("bcm2708.disk_led_active_low"); polarity = (p == nil || *p == '1'); gpiosel(okled, Output); } gpioout(okled, on^polarity); }
long gpiowrite(Chan *c, void *va, long n, vlong) { int type, i, scheme; uint pin; char *arg; Cmdbuf *cb; Cmdtab *ct; if(c->qid.type & QTDIR) { error(Eisdir); } type = FILE_TYPE(c->qid); scheme = SCHEME_TYPE(c->qid); if(scheme != Qgeneric && scheme != pinscheme) { error(nil); } cb = parsecmd(va, n); if(waserror()) { free(cb); nexterror(); } ct = lookupcmd(cb, gpiocmd, nelem(gpiocmd)); if(ct == nil) { error(Ebadctl); } switch(type) { case Qdata: pin = PIN_NUMBER(c->qid); switch(ct->index) { case CMzero: gpioout(pin, 0); break; case CMone: gpioout(pin, 1); break; default: error(Ebadctl); } break; case Qctl: switch(ct->index) { case CMscheme: arg = cb->f[1]; for(i = 0; i < nelem(schemename); i++) { if(strncmp(schemename[i], arg, strlen(schemename[i])) == 0) { pinscheme = i; break; } } break; case CMfunc: pin = getpin(cb->f[2]); arg = cb->f[1]; if(pin == -1) { error(Ebadctl); } for(i = 0; i < nelem(funcname); i++) { if(strncmp(funcname[i], arg, strlen(funcname[i])) == 0) { gpiofuncset(pin, i); break; } } break; case CMpull: pin = getpin(cb->f[2]); if(pin == -1) { error(Ebadctl); } arg = cb->f[1]; for(i = 0; i < nelem(pudname); i++) { if(strncmp(pudname[i], arg, strlen(pudname[i])) == 0) { gpiopullset(pin, i); break; } } break; case CMevent: pin = getpin(cb->f[3]); if(pin == -1) { error(Ebadctl); } arg = cb->f[1]; for(i = 0; i < nelem(evtypename); i++) { if(strncmp(evtypename[i], arg, strlen(evtypename[i])) == 0) { gpioevent(pin, i, (cb->f[2][0] == 'e')); break; } } break; default: error(Ebadctl); } break; } free(cb); poperror(); return n; }