VMINT32 analogRead(VMUINT8 ulPin)
{
	vm_dcl_adc_control_create_object_t obj_data;
	VMINT status = 0 , i;
	vm_dcl_adc_control_send_start_t start_data;

	if(ulPin > 3)// for ADC0 ADC1 ADC2 ADC3
	{
		vm_log_info("ADC pin number is error");
		return -1;
	}

	vm_dcl_close(g_adc_handle);

	g_adc_handle = vm_dcl_open(VM_DCL_GPIO, ulPin);

	vm_dcl_control(g_adc_handle,VM_DCL_GPIO_COMMAND_SET_MODE_2,NULL);
	vm_dcl_close(g_adc_handle);

	// Open ADC device
	g_adc_handle = vm_dcl_open(VM_DCL_ADC,0);
	// register ADC result callback
	status = vm_dcl_register_callback(g_adc_handle, VM_DCL_ADC_GET_RESULT ,(vm_dcl_callback)adc_callback, (void *)NULL);

	// Indicate to the ADC module driver to notify the result.
	obj_data.owner_id = vm_dcl_get_owner_id();
	// Set physical ADC channel which should be measured.
	obj_data.channel = PIN2CHANNEL(ulPin);
	// Set measurement period, the unit is in ticks.
	obj_data.period = 1;
	// Measurement count.
	obj_data.evaluate_count = 1;
	// Whether to send message to owner module or not.
	obj_data.send_message_primitive = 1;

	// setup ADC object
	status = vm_dcl_control(g_adc_handle,VM_DCL_ADC_COMMAND_CREATE_OBJECT,(void *)&obj_data);

	// start ADC
	start_data.owner_id = vm_dcl_get_owner_id();
	status = vm_dcl_control(g_adc_handle,VM_DCL_ADC_COMMAND_SEND_START,(void *)&start_data);

	return g_adc_result;
}
void key_init(void){
    VM_DCL_HANDLE kbd_handle;
    vm_dcl_kbd_control_pin_t kbdmap;

    kbd_handle = vm_dcl_open(VM_DCL_KBD,0);
    kbdmap.col_map = 0x09;
    kbdmap.row_map =0x05;
    vm_dcl_control(kbd_handle,VM_DCL_KBD_COMMAND_CONFIG_PIN, (void *)(&kbdmap));

    vm_dcl_close(kbd_handle);
}
void detachInterrupt(uint32_t pin)
{
    if(VM_DCL_HANDLE_INVALID != gExinterruptsPio[pin].handle)
    {
    	vm_dcl_close(gExinterruptsPio[pin].handle);
    }
	gExinterruptsPio[pin].handle = VM_DCL_HANDLE_INVALID;
       gExinterruptsPio[pin].cb = NULL;
	g_APinDescription[gExinterruptsPio[pin].pin].ulHandle = VM_DCL_HANDLE_INVALID;
	g_APinDescription[gExinterruptsPio[pin].pin].ulPinType= PIO_DIGITAL;
}
ADC_HANDLE open_hx711(int scl_pin, int sda_pin)
{
	ADC_HANDLE handle = 0;
	handle_details* details;
	hx711_task* task;

	while (open_handles[handle] != NULL)
	{
		handle++;
		if (handle > MAX_HANDLE)
		{
			return ADC_HANDLE_INVALID;
		}
	}

	details = vm_calloc(sizeof(handle_details));
	if (details == NULL)
	{
		return ADC_HANDLE_INVALID;
	}

	task = &details->task;
	task->scl_handle = vm_dcl_open(VM_DCL_GPIO, scl_pin);
	if (task->scl_handle == VM_DCL_HANDLE_INVALID)
	{
		vm_free(details);
		return ADC_HANDLE_INVALID;
	}
	vm_dcl_control(task->scl_handle, VM_DCL_GPIO_COMMAND_SET_MODE_0, NULL);
	vm_dcl_control(task->scl_handle, VM_DCL_GPIO_COMMAND_SET_DIRECTION_OUT, NULL);
	vm_dcl_control(task->scl_handle, VM_DCL_GPIO_COMMAND_WRITE_HIGH, NULL);

	task->sda_handle = vm_dcl_open(VM_DCL_GPIO, sda_pin);
	if (task->sda_handle == VM_DCL_HANDLE_INVALID)
	{
		vm_dcl_close(task->scl_handle);
		vm_free(details);
		return ADC_HANDLE_INVALID;
	}
	vm_dcl_control(task->sda_handle, VM_DCL_GPIO_COMMAND_SET_MODE_0, NULL);
	vm_dcl_control(task->sda_handle, VM_DCL_GPIO_COMMAND_SET_DIRECTION_IN, NULL);

	vm_mutex_init(&details->mutex);
	task->op = WAIT;
	task->delay = 100;
	task->callback = dummy_callback;
	task->callback_env = NULL;
	open_handles[handle] = details;
	write_console("open\n");
	vm_thread_create(measurement, (void*) details, (VM_THREAD_PRIORITY) 0);
	return handle;
}
void UARTClass::end( void )
{
// clear any received data
    _rx_buffer->_iHead = _rx_buffer->_iTail ;
    vm_dcl_close(uart_handle);
  
    if(_usbNum == 2)
    {
        g_APinDescription[0].ulHandle = VM_DCL_HANDLE_INVALID;
        g_APinDescription[0].ulPinType = PIO_DIGITAL;
    }
    else
    {
        usb_device_handle = -1;
    }
}
VMINT8 pinMode(VMUINT8 ulPin,VMUINT8 ulMode)
{
	VM_DCL_HANDLE gpio_handle;
	gpio_handle = vm_dcl_open(VM_DCL_GPIO, ulPin);

    if(gpio_handle != VM_DCL_HANDLE_INVALID)
    {
		switch(ulMode)
		{
			case INPUT:
				vm_dcl_control(gpio_handle, VM_DCL_GPIO_COMMAND_SET_MODE_0, NULL);
				vm_dcl_control(gpio_handle, VM_DCL_GPIO_COMMAND_SET_DIRECTION_IN, NULL);
			break;

			case OUTPUT:
				vm_dcl_control(gpio_handle, VM_DCL_GPIO_COMMAND_SET_MODE_0, NULL);
				vm_dcl_control(gpio_handle, VM_DCL_GPIO_COMMAND_SET_DIRECTION_OUT, NULL);
			break;

			case INPUT_PULLUP:
				vm_dcl_control(gpio_handle, VM_DCL_GPIO_COMMAND_SET_MODE_0, NULL);
				vm_dcl_control(gpio_handle, VM_DCL_GPIO_COMMAND_SET_DIRECTION_IN, NULL);
				vm_dcl_control(gpio_handle, VM_DCL_GPIO_COMMAND_ENABLE_PULL, NULL);
				vm_dcl_control(gpio_handle, VM_DCL_GPIO_COMMAND_SET_PULL_HIGH, NULL);
			break;

			case INPUT_PULLDN:
				vm_dcl_control(gpio_handle, VM_DCL_GPIO_COMMAND_SET_MODE_0, NULL);
				vm_dcl_control(gpio_handle, VM_DCL_GPIO_COMMAND_SET_DIRECTION_IN, NULL);
				vm_dcl_control(gpio_handle, VM_DCL_GPIO_COMMAND_ENABLE_PULL, NULL);
				vm_dcl_control(gpio_handle, VM_DCL_GPIO_COMMAND_SET_PULL_LOW, NULL);
			break;

			default:
			break;
		}
    }
    else
    {
    	vm_log_info("gpio set pin mode fail");
    	return -1;
    }

	vm_dcl_close(gpio_handle);
	return TRUE;
}
void lcd_backlight_level(VMUINT32 ulValue)
{
    VM_DCL_HANDLE pwm_handle;
    vm_dcl_pwm_set_clock_t pwm_clock;
    vm_dcl_pwm_set_counter_threshold_t pwm_config_adv;
    vm_dcl_config_pin_mode(3, VM_DCL_PIN_MODE_PWM);
    pwm_handle = vm_dcl_open(PIN2PWM(3), vm_dcl_get_owner_id());
    vm_dcl_control(pwm_handle, VM_PWM_CMD_START, 0);
    pwm_config_adv.counter = 100;
    pwm_config_adv.threshold = ulValue;
    pwm_clock.source_clock = 0;
    pwm_clock.source_clock_division = 3;
    vm_dcl_control(pwm_handle, VM_PWM_CMD_SET_CLOCK, (void *) (&pwm_clock));
    vm_dcl_control(pwm_handle, VM_PWM_CMD_SET_COUNTER_AND_THRESHOLD,
            (void *) (&pwm_config_adv));
    vm_dcl_close(pwm_handle);
}
VMINT8 digitalWrite(VMUINT8 ulPin,VMUINT8 ulData)
{
	VM_DCL_HANDLE gpio_handle;
	gpio_handle = vm_dcl_open(VM_DCL_GPIO, ulPin);

    if(gpio_handle != VM_DCL_HANDLE_INVALID)
    {
		if(ulData == LOW)
			vm_dcl_control(gpio_handle, VM_DCL_GPIO_COMMAND_WRITE_LOW, NULL);
		else if(ulData == HIGH)
			vm_dcl_control(gpio_handle, VM_DCL_GPIO_COMMAND_WRITE_HIGH, NULL);
    }
    else
    {
    	vm_log_info("gpio write pin fail");
    	return -1;
    }

	vm_dcl_close(gpio_handle);
	return TRUE;
}
VMINT8 digitalRead(VMUINT8 ulPin)
{
	VM_DCL_HANDLE gpio_handle;
	vm_dcl_gpio_control_level_status_t data;
	VMUINT8 ret;

	gpio_handle = vm_dcl_open(VM_DCL_GPIO, ulPin);

    if(gpio_handle != VM_DCL_HANDLE_INVALID)
    {
		vm_dcl_control(gpio_handle, VM_DCL_GPIO_COMMAND_READ, (void*)&data);

		if (data.level_status == 1)ret = HIGH;
		else ret = LOW;
    }
    else
    {
    	vm_log_info("gpio read pin fail");
    	return -1;
    }

    vm_dcl_close(gpio_handle);
    return ret;
}
Exemple #10
0
void attachInterrupt(VMUINT32 pin, void (*callback)(void), VMUINT32 mode)
{

	VM_DCL_HANDLE gpio_handle;
    VM_DCL_HANDLE eint_handle;
    vm_dcl_eint_control_config_t eint_config;
    vm_dcl_eint_control_sensitivity_t sens_data;
    vm_dcl_eint_control_hw_debounce_t deboun_time;
    VM_DCL_STATUS status;

    VMUINT8 i;
    for(i=0;i<EXTERNAL_NUM_INTERRUPTS;i++)
	{
    	if(gExinterruptsPio[i].pin == pin)
		{
    		vm_log_info("open EINT number is %d",gExinterruptsPio[i].eint);
			break;
		}
	}
    if(i == EXTERNAL_NUM_INTERRUPTS)
	{
    	vm_log_info("open EINT number error");
    	return;
	}

	detachInterrupt(pin);

	gpio_handle = vm_dcl_open(VM_DCL_GPIO,pin);
	if(gpio_handle == VM_DCL_HANDLE_INVALID)
	{
		vm_log_info("open eint gpio error, gpio_handle is %d", gpio_handle);
		return;
	}
	switch(pin)
	{
		case 0:case 1:case 2:
			vm_log_info("VM_DCL_GPIO_COMMAND_SET_MODE_1");
			vm_dcl_control(gpio_handle,VM_DCL_GPIO_COMMAND_SET_MODE_1,NULL);
		break;

		case 13:case 18:case 46:case 52:
			vm_log_info("VM_DCL_GPIO_COMMAND_SET_MODE_2");
			vm_dcl_control(gpio_handle,VM_DCL_GPIO_COMMAND_SET_MODE_2,NULL);
		break;

		case 10:case 11:
			vm_log_info("VM_DCL_GPIO_COMMAND_SET_MODE_3");
			vm_dcl_control(gpio_handle,VM_DCL_GPIO_COMMAND_SET_MODE_3,NULL);
		break;

		case 25:
			vm_log_info("VM_DCL_GPIO_COMMAND_SET_MODE_4");
			vm_dcl_control(gpio_handle,VM_DCL_GPIO_COMMAND_SET_MODE_4,NULL);
		break;

		default:
		break;
	}
	vm_dcl_control(gpio_handle,VM_DCL_GPIO_COMMAND_SET_DIRECTION_IN, NULL);
	vm_dcl_close(gpio_handle);


    memset(&eint_config,0, sizeof(vm_dcl_eint_control_config_t));
    memset(&sens_data,0, sizeof(vm_dcl_eint_control_sensitivity_t));
    memset(&deboun_time,0, sizeof(vm_dcl_eint_control_hw_debounce_t));

	eint_handle = vm_dcl_open(VM_DCL_EINT,gExinterruptsPio[i].eint);

    if(VM_DCL_HANDLE_INVALID == eint_handle)
    {
        vm_log_info("open EINT error, eint_handle is %d",eint_handle);
        return;
    }

    gExinterruptsPio[i].handle = eint_handle;
    gExinterruptsPio[i].cb = callback;

    status = vm_dcl_control(eint_handle ,VM_DCL_EINT_COMMAND_MASK,NULL);  // Usually, before we config eint, we mask it firstly.
    if(status != VM_DCL_STATUS_OK)
    {
    	vm_log_info("VM_DCL_EINT_COMMAND_MASK  = %d", status);
    }

	status = vm_dcl_register_callback(eint_handle , VM_DCL_EINT_EVENT_TRIGGER,(vm_dcl_callback)eint_callback,(void*)NULL );
	if(status != VM_DCL_STATUS_OK)
	{
		vm_log_info("VM_DCL_EINT_EVENT_TRIGGER = %d", status);
	}

    if(gExinterruptsPio[i].first == 0)
    {
	    if (mode == CHANGE)
	    {
			sens_data.sensitivity = 0;
			eint_config.act_polarity = 0;
			eint_config.auto_unmask = 1;
	    }
	    else
	    {
			if(mode == FALLING)
			{
				sens_data.sensitivity = 0;
				eint_config.act_polarity = 0;
				eint_config.auto_unmask = 1;
			}
			else if(mode == RISING)
			{
				sens_data.sensitivity = 0;
				eint_config.act_polarity = 1;
				eint_config.auto_unmask = 1;
			}
			else
			{
				vm_log_info("mode not support = %d", mode);
			}
	    }

	    status = vm_dcl_control(eint_handle ,VM_DCL_EINT_COMMAND_SET_SENSITIVITY,(void *)&sens_data);  /* set eint sensitivity */
	    if(status != VM_DCL_STATUS_OK)
	    {
	        vm_log_info("VM_DCL_EINT_COMMAND_SET_SENSITIVITY = %d", status);
	    }

	    deboun_time.debounce_time = 1;  // debounce time 1ms
	    status = vm_dcl_control(eint_handle ,VM_DCL_EINT_COMMAND_SET_HW_DEBOUNCE,(void *)&deboun_time); /* set debounce time */
	    if(status != VM_DCL_STATUS_OK)
	    {
	        vm_log_info("VM_DCL_EINT_COMMAND_SET_HW_DEBOUNCE = %d", status);
	    }

	    status = vm_dcl_control(eint_handle ,VM_DCL_EINT_COMMAND_MASK,NULL);  /* Usually, before we config eint, we mask it firstly. */
	    if(status != VM_DCL_STATUS_OK)
	    {
	    	vm_log_info("VM_DCL_EINT_COMMAND_MASK  = %d", status);
	    }

	    eint_config.debounce_enable = 0;    // 1 means enable hw debounce, 0 means disable.

	    status = vm_dcl_control(eint_handle ,VM_DCL_EINT_COMMAND_CONFIG,(void *)&eint_config);   // Please call this api finally, because we will unmask eint in this command.
	    if(status != VM_DCL_STATUS_OK)
	    {
	        vm_log_info("VM_DCL_EINT_COMMAND_CONFIG = %d", status);
	    }

	    if (mode == CHANGE)
	    {
	    	vm_dcl_eint_control_auto_change_polarity_t auto_change;
		    auto_change.auto_change_polarity = 1;
	        status = vm_dcl_control(eint_handle ,VM_DCL_EINT_COMMAND_SET_AUTO_CHANGE_POLARITY,(void *)&auto_change);   // Please call this api finally, because we will unmask eint in this command.
	        if(status != VM_DCL_STATUS_OK)
	        {
	            vm_log_info("VM_DCL_EINT_COMMAND_CONFIG change = %d", status);
	        }
	    }

	    gExinterruptsPio[i].first ++;

	    vm_log_info("attach Interrupt ok.");
    }
    else
    {
        status = vm_dcl_control(eint_handle,VM_DCL_EINT_COMMAND_UNMASK,NULL);  // call this function to unmask this eint.
        if(status != VM_DCL_STATUS_OK)
        {
             vm_log_info("VM_DCL_EINT_COMMAND_CONFIG = %d", status);
        }
    }
}
static VM_DRV_TP_BOOL ctp_goodix_gt9xx_init(void) {
	VM_DCL_HANDLE sda_handle, scl_handle;
	VM_DCL_HANDLE eint_handle, reset_handle;
	VM_DRV_TP_BOOL ack;
	ctp_info_t ctp_info;
	VMUINT16 reg_value;

	VMUINT8 i = 0;

	//turn on VSIM1
	*VSIM1_CON2 = *VSIM1_CON2 | 0x0002;
	*VSIM1_CON0 = *VSIM1_CON0 | 0x0001;

	// init i2c
	if (gpio_ctp_i2c_sda_pin != 0xFF) {
		sda_handle = vm_dcl_open(VM_DCL_GPIO, gpio_ctp_i2c_sda_pin);
		scl_handle = vm_dcl_open(VM_DCL_GPIO, gpio_ctp_i2c_scl_pin);

		vm_dcl_control(sda_handle, VM_DCL_GPIO_COMMAND_SET_MODE_0, NULL);
		vm_dcl_control(scl_handle, VM_DCL_GPIO_COMMAND_SET_MODE_0, NULL);
		CTP_DELAY_TIME = 3;
	}

	ctp_i2c_configure(CTP_SLAVE_ADDR, CTP_DELAY_TIME);

	eint_handle = vm_dcl_open(VM_DCL_GPIO, gpio_ctp_eint_pin);
	reset_handle = vm_dcl_open(VM_DCL_GPIO, gpio_ctp_reset_pin);

	////////////////////////////reset//////////////////////////////////
	vm_dcl_control(eint_handle, VM_DCL_GPIO_COMMAND_SET_DIRECTION_OUT, NULL);
	vm_dcl_control(eint_handle, VM_DCL_GPIO_COMMAND_WRITE_LOW, NULL);

	vm_dcl_control(reset_handle, VM_DCL_GPIO_COMMAND_SET_MODE_0, NULL);
	vm_dcl_control(reset_handle, VM_DCL_GPIO_COMMAND_SET_DIRECTION_OUT, NULL);
	vm_dcl_control(reset_handle, VM_DCL_GPIO_COMMAND_WRITE_LOW, NULL);
	delay_ms(5);
	vm_dcl_control(reset_handle, VM_DCL_GPIO_COMMAND_WRITE_HIGH, NULL);
	delay_ms(10);
	//////////////////////////////////////////////////////////////////
	vm_dcl_close(eint_handle);
	vm_dcl_close(reset_handle);

	//vm_dcl_control(eint_handle, VM_DCL_GPIO_COMMAND_SET_DIRECTION_IN, NULL);
	//vm_dcl_control(eint_handle, gpio_ctp_eint_pin_M_EINT, NULL);
	//EINT_Set_Sensitivity(custom_eint_get_channel(touch_panel_eint_chann), EDGE_SENSITIVE);
	ctp_init_EINT();

	ack = ctp_goodix_gt9xx_set_configuration();
	if (ack == VM_DRV_TP_FALSE) {
		vm_log_info("ctp_goodix_gt9xx_set_configuration fail!!!");
		return VM_DRV_TP_FALSE;
	}
	vm_log_info("ctp_goodix_gt9xx_set_configuration OK!!!");

	ack = ctp_goodix_gt9xx_get_information(&ctp_info);

	if (ack == VM_DRV_TP_FALSE) {
		vm_log_info("read information fail");
		return VM_DRV_TP_FALSE;
	}

	return VM_DRV_TP_TRUE;

}