Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
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, &current_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
        }
    }
}