/* wiringPiFindNode * * Parameters: * - pin: int * Return Type: struct wiringPiNodeStruct * */ mrb_value mrb_Pi_wiringPiFindNode(mrb_state* mrb, mrb_value self) { mrb_int native_pin; /* Fetch the args */ mrb_get_args(mrb, "i", &native_pin); /* Invocation */ struct wiringPiNodeStruct * result = wiringPiFindNode(native_pin); /* Box the return value */ mrb_value return_value = (result == NULL ? mrb_nil_value() : mruby_box_wiringPiNodeStruct(mrb, result)); return return_value; }
int init_zyncoder() { int i,j; for (i=0;i<MAX_NUM_ZYNSWITCHES;i++) { zynswitches[i].enabled=0; zynswitches[i].midi_cc=0; } for (i=0;i<MAX_NUM_ZYNCODERS;i++) { zyncoders[i].enabled=0; for (j=0;j<ZYNCODER_TICKS_PER_RETENT;j++) zyncoders[i].dtus[j]=0; } wiringPiSetup(); #ifdef MCP23017_ENCODERS uint8_t reg; mcp23017Setup(MCP23017_BASE_PIN, 0x20); // get the node cooresponding to our mcp23017 so we can do direct writes mcp23017_node = wiringPiFindNode(MCP23017_BASE_PIN); // setup all the pins on the banks as inputs and disable pullups on // the zyncoder input reg = 0xff; wiringPiI2CWriteReg8(mcp23017_node->fd, MCP23x17_IODIRA, reg); wiringPiI2CWriteReg8(mcp23017_node->fd, MCP23x17_IODIRB, reg); // enable pullups on the unused pins (high two bits on each bank) reg = 0xff; //reg = 0xc0; //reg = 0x60; wiringPiI2CWriteReg8(mcp23017_node->fd, MCP23x17_GPPUA, reg); wiringPiI2CWriteReg8(mcp23017_node->fd, MCP23x17_GPPUB, reg); // disable polarity inversion reg = 0; wiringPiI2CWriteReg8(mcp23017_node->fd, MCP23x17_IPOLA, reg); wiringPiI2CWriteReg8(mcp23017_node->fd, MCP23x17_IPOLB, reg); // disable the comparison to DEFVAL register reg = 0; wiringPiI2CWriteReg8(mcp23017_node->fd, MCP23x17_INTCONA, reg); wiringPiI2CWriteReg8(mcp23017_node->fd, MCP23x17_INTCONB, reg); // configure the interrupt behavior for bank A uint8_t ioconf_value = wiringPiI2CReadReg8(mcp23017_node->fd, MCP23x17_IOCON); bitWrite(ioconf_value, 6, 0); // banks are not mirrored bitWrite(ioconf_value, 2, 0); // interrupt pin is not floating bitWrite(ioconf_value, 1, 1); // interrupt is signaled by high wiringPiI2CWriteReg8(mcp23017_node->fd, MCP23x17_IOCON, ioconf_value); // configure the interrupt behavior for bank B ioconf_value = wiringPiI2CReadReg8(mcp23017_node->fd, MCP23x17_IOCONB); bitWrite(ioconf_value, 6, 0); // banks are not mirrored bitWrite(ioconf_value, 2, 0); // interrupt pin is not floating bitWrite(ioconf_value, 1, 1); // interrupt is signaled by high wiringPiI2CWriteReg8(mcp23017_node->fd, MCP23x17_IOCONB, ioconf_value); // finally, enable the interrupt pins for banks a and b // enable interrupts on all pins reg = 0xff; wiringPiI2CWriteReg8(mcp23017_node->fd, MCP23x17_GPINTENA, reg); wiringPiI2CWriteReg8(mcp23017_node->fd, MCP23x17_GPINTENB, reg); // pi ISRs for the 23017 // bank A wiringPiISR(MCP23017_INTA_PIN, INT_EDGE_RISING, mcp23017_bank_ISRs[0]); // bank B wiringPiISR(MCP23017_INTB_PIN, INT_EDGE_RISING, mcp23017_bank_ISRs[1]); #ifdef DEBUG printf("MCP23017 initialized: INTA %d, INTB %d\n",MCP23017_INTA_PIN,MCP23017_INTB_PIN); #endif #else mcp23008Setup (100, 0x20); init_poll_zynswitches(); #endif return 1; }