static int __init it8761e_gpio_init(void) { int i, id, err; /* chip and port detection */ for (i = 0; i < ARRAY_SIZE(ports); i++) { spin_lock(&sio_lock); enter_conf_mode(ports[i]); id = (read_reg(CHIP_ID_HIGH_BYTE, ports[i]) << 8) + read_reg(CHIP_ID_LOW_BYTE, ports[i]); exit_conf_mode(ports[i]); spin_unlock(&sio_lock); if (id == SIO_CHIP_ID) { port = ports[i]; break; } } if (!port) return -ENODEV; /* fetch GPIO base address */ enter_conf_mode(port); enter_gpio_mode(port); gpio_ba = (read_reg(GPIO_BA_HIGH_BYTE, port) << 8) + read_reg(GPIO_BA_LOW_BYTE, port); exit_conf_mode(port); if (!request_region(gpio_ba, GPIO_IOSIZE, GPIO_NAME)) return -EBUSY; it8761e_gpio_chip.base = -1; it8761e_gpio_chip.ngpio = 16; err = gpiochip_add(&it8761e_gpio_chip); if (err < 0) goto gpiochip_add_err; return 0; gpiochip_add_err: release_region(gpio_ba, GPIO_IOSIZE); gpio_ba = 0; return err; }
static int it8761e_gpio_direction_out(struct gpio_chip *gc, unsigned gpio_num, int val) { u8 curr_dirs, io_reg, bit; bit = gpio_num % 8; io_reg = (gpio_num >= 8) ? GPIO2X_IO : GPIO1X_IO; it8761e_gpio_set(gc, gpio_num, val); spin_lock(&sio_lock); enter_conf_mode(port); enter_gpio_mode(port); curr_dirs = read_reg(io_reg, port); if (!(curr_dirs & (1 << bit))) write_reg(curr_dirs | (1 << bit), io_reg, port); exit_conf_mode(port); spin_unlock(&sio_lock); return 0; }
static void control_task(void *params) { #ifdef US_UNIT uint8_t initialized=0; int timeOut = TWO_SECOND; #else int timeOut = FIVE_MINUTE; #endif controllerQueueS current_message; //uint8_t value; for(;;) { if (xQueueReceive(controllerQueue, ¤t_message, timeOut)) { port_pin_set_output_level(SME_LED_Y2_PIN, SME_LED_Y2_INACTIVE); port_pin_set_output_level(SME_LED_Y1_PIN, SME_LED_Y1_INACTIVE); switch(current_message.intE) { case button1Int: button1Execution(); break; case button2Int: button2Execution(); break; // check on the I/O expander which is the interrupt case externalInt: performExecution(interruptDetection()); break; case gpsData: sfxSendExecution(SME_SFX_GPS_1_MSG); break; case allSensorSend: sfxSendExecution(SME_SFX_DEBUG_MSG); break; default: print_dbg("Interrupt Not Handled\n"); } clearInt(current_message.intE); } else { #ifdef US_UNIT switch (initialized){ case 0: enter_conf_mode(); initialized++; break; case 1: conf_sfx_freq(SFX_US_FREQ); initialized++; break; case 2: timeOut = CONTROL_TASK_DELAY; enter_in_data_mode(); initialized++; break; default: sfxTimeOut(); break; } #else sfxTimeOut(); #endif } } }