Exemplo n.º 1
0
/* Reads a page from the EEPROM using combined IRQ I2C transfer. */
void i2c_irq_combined_transaction_example()
{
	QM_PUTS("IRQ combined write + read");

	async_irq_read_xfer.tx = eeprom_read_addr;
	async_irq_read_xfer.tx_len = EEPROM_ADDR_SIZE_BYTES;
	async_irq_read_xfer.callback = i2c_0_irq_callback;
	async_irq_read_xfer.callback_data = &id_read;
	async_irq_read_xfer.rx = eeprom_read_buf;
	async_irq_read_xfer.rx_len = EEPROM_PAGE_SIZE_BYTES;
	async_irq_read_xfer.stop = true;

	i2c_0_irq_complete = false;
	i2c_0_irq_rc_error = false;

	if (qm_i2c_master_irq_transfer(QM_I2C_0, &async_irq_read_xfer,
				       EEPROM_SLAVE_ADDR)) {
		QM_PUTS("Error: IRQ read failed");
	}

	/* Wait until complete flag is set in callback. */
	while (!i2c_0_irq_complete)
		;

	if (i2c_0_irq_rc_error) {
		QM_PUTS("Error: I2C IRQ Transfer failed");
	} else {
		QM_PUTS("I2C IRQ Transfer complete");
	}
}
Exemplo n.º 2
0
/* Writes a page to the EEPROM using IRQ I2C transfer. */
void i2c_irq_write_example()
{
	QM_PUTS("IRQ write");

	async_irq_write_xfer.tx = eeprom_irq_write_data;
	async_irq_write_xfer.tx_len =
	    EEPROM_PAGE_SIZE_BYTES + EEPROM_ADDR_SIZE_BYTES;
	async_irq_write_xfer.callback = i2c_0_irq_callback;
	async_irq_write_xfer.callback_data = &id_write;
	async_irq_write_xfer.rx = NULL;
	async_irq_write_xfer.rx_len = 0;
	async_irq_write_xfer.stop = true;

	if (qm_i2c_master_irq_transfer(QM_I2C_0, &async_irq_write_xfer,
				       EEPROM_SLAVE_ADDR)) {
		QM_PUTS("Error: IRQ write failed");
	}

	/* Wait until complete flag is set in callback. */
	while (!i2c_0_irq_complete)
		;

	if (i2c_0_irq_rc_error) {
		QM_PUTS("Error: I2C IRQ Transfer failed");
	} else {
		QM_PUTS("I2C IRQ Transfer complete");
	}
	/* Wait for EEPROM to complete the write operation. */
	clk_sys_udelay(EEPROM_WRITE_WAIT_TIME_US);
}
Exemplo n.º 3
0
Arquivo: main.c Projeto: jeez/qmsi
int main(void)
{
	qm_gpio_port_config_t cfg;

	QM_PUTS("Starting: AON GPIO");

	/* Request IRQ and write GPIO port config. */
	cfg.direction = 0;		   /* Set all pins as inputs. */
	cfg.int_en = BIT(PIN_INTR);	/* Interrupt enabled. */
	cfg.int_type = BIT(PIN_INTR);      /* Edge sensitive interrupt. */
	cfg.int_polarity = ~BIT(PIN_INTR); /* Falling edge. */
	cfg.int_debounce = BIT(PIN_INTR);  /* Debounce enabled. */
	cfg.int_bothedge = 0;		   /* Both edge disabled. */
	cfg.callback = aon_gpio_example_callback;
	cfg.callback_data = NULL;

	qm_irq_request(QM_IRQ_AON_GPIO_0_INT, qm_aon_gpio_0_isr);

	qm_gpio_set_config(QM_AON_GPIO_0, &cfg);

	QM_PUTS("AON GPIO set up, press 'PB0' to trigger the interrupt");

	/* Wait for the AON GPIO callback to be invoked and print the status. */
	while (!callback_invoked)
		;

	QM_PRINTF("Status of AON GPIO callback = 0x%u \n", callback_status);

	QM_PUTS("Finished: AON GPIO");

	return 0;
}
Exemplo n.º 4
0
Arquivo: main.c Projeto: CurieBSP/qmsi
int main(void)
{
	/* Comparator example app
	 *
	 * This app sets up comparator 0 to fire an interrupt when the input
	 * voltage is greater than the reference voltage (0.95V)
	 *
	 * On the Intel(R) Quark(TM) Microcontroller D2000 Development Platform
	 * the pin used is marked "SSO 10"
	 */

	qm_ac_config_t ac_cfg;

	QM_PUTS("Analog Comparators example app start\n");

	/* Set up pin muxing and request IRQ*/
	qm_pmux_select(QM_PIN_ID_0, QM_PMUX_FN_1);
	qm_pmux_input_en(QM_PIN_ID_0, true);

	qm_irq_request(QM_IRQ_AC, qm_ac_isr);

	/* Write configs */
	ac_cfg.reference = BIT(0); /* Ref internal voltage */
	ac_cfg.polarity = 0x0;     /* Fire if greater than ref (high level) */
	ac_cfg.power = BIT(0);     /* Normal operation mode */
	ac_cfg.int_en = BIT(0);    /* AIN0 enable */
	ac_cfg.callback = ac_example_callback;

	qm_ac_set_config(&ac_cfg);

	QM_PUTS("Analog Comparators example app complete\n");

	return 0;
}
Exemplo n.º 5
0
/* Configures DMA. */
void i2c_dma_setup()
{
	/* Request interrupts for the DMA controller. */
	QM_IR_UNMASK_INT(QM_IRQ_DMA_0_INT_0);
	QM_IR_UNMASK_INT(QM_IRQ_DMA_0_INT_1);
	QM_IR_UNMASK_INT(QM_IRQ_DMA_0_ERROR_INT);
	QM_IRQ_REQUEST(QM_IRQ_DMA_0_INT_0, qm_dma_0_isr_0);
	QM_IRQ_REQUEST(QM_IRQ_DMA_0_INT_1, qm_dma_0_isr_1);
	QM_IRQ_REQUEST(QM_IRQ_DMA_0_ERROR_INT, qm_dma_0_error_isr);

	/* Init DMA controller. */
	if (qm_dma_init(QM_DMA_0)) {
		QM_PUTS("Error: DMAC init failed");
	}

	/* Configure the TX channel. */
	if (qm_i2c_dma_channel_config(QM_I2C_0, QM_DMA_0, I2C_DMA_TX_CHANNEL_ID,
				      QM_DMA_MEMORY_TO_PERIPHERAL)) {
		QM_PUTS("Error: TX channel configuring failed");
	}

	/* Configure the RX channel. */
	if (qm_i2c_dma_channel_config(QM_I2C_0, QM_DMA_0, I2C_DMA_RX_CHANNEL_ID,
				      QM_DMA_PERIPHERAL_TO_MEMORY)) {
		QM_PUTS("Error: Channel config failed");
	}
}
Exemplo n.º 6
0
/*
 * Waits for the previous DMA TX transfer to finish and starts a combined
 * transaction using the 2 channels previously configured.
 */
void i2c_dma_combined_transaction_example()
{
	QM_PUTS("I2C DMA Combined transaction");

	/* Set the ongoing TX and RX flags. */
	dma_read_done = false;
	dma_write_done = false;
	dma_error = false;

	/* Config the transfer. */
	async_dma_combined_xfer.tx = eeprom_read_addr;
	async_dma_combined_xfer.tx_len = EEPROM_ADDR_SIZE_BYTES;
	async_dma_combined_xfer.rx = eeprom_read_buf;
	async_dma_combined_xfer.rx_len = EEPROM_PAGE_SIZE_BYTES;
	async_dma_combined_xfer.callback = i2c_user_dma_combined_trans_callback;
	async_dma_combined_xfer.callback_data = NULL;
	async_dma_combined_xfer.stop = true;

	qm_i2c_master_dma_transfer(QM_I2C_0, &async_dma_combined_xfer,
				   EEPROM_SLAVE_ADDR);

	/* Wait for the operation to finish. */
	while ((!dma_write_done) || (!dma_read_done))
		;

	if (dma_error) {
		QM_PUTS("Error: I2C DMA transfer failed");
	} else {
		QM_PUTS("I2C DMA Transfer complete");
	}
}
Exemplo n.º 7
0
/* Configures the DMA TX channel and starts a TX transfer. */
void i2c_dma_write_example()
{
	QM_PUTS("I2C DMA TX");

	/* Set the ongoing TX flag. */
	dma_write_done = false;
	dma_error = false;

	/* Config the transfer. */
	async_dma_write_xfer.tx = eeprom_pio_write_data;
	async_dma_write_xfer.tx_len =
	    EEPROM_PAGE_SIZE_BYTES + EEPROM_ADDR_SIZE_BYTES;
	async_dma_write_xfer.rx = NULL;
	async_dma_write_xfer.rx_len = 0;
	async_dma_write_xfer.callback = i2c_user_dma_write_callback;
	async_dma_write_xfer.callback_data = NULL;
	async_dma_write_xfer.stop = true;

	/* Start TX */
	qm_i2c_master_dma_transfer(QM_I2C_0, &async_dma_write_xfer,
				   EEPROM_SLAVE_ADDR);

	/* Wait for the operation to finish. */
	while (!dma_write_done)
		;

	if (dma_error) {
		QM_PUTS("Error: I2C DMA transfer failed");
	} else {
		QM_PUTS("I2C DMA Transfer complete");
	}
}
Exemplo n.º 8
0
int main(void)
{
	qm_i2c_config_t cfg;

	QM_PUTS("Starting: I2C");

	QM_IR_UNMASK_INT(QM_IRQ_I2C_0_INT);
	QM_IRQ_REQUEST(QM_IRQ_I2C_0_INT, qm_i2c_0_irq_isr);

	/* Enable I2C 0. */
	clk_periph_enable(CLK_PERIPH_CLK | CLK_PERIPH_I2C_M0_REGISTER);

	pin_mux_setup();

	/* Configure I2C. */
	cfg.address_mode = QM_I2C_7_BIT;
	cfg.mode = QM_I2C_MASTER;
	cfg.speed = QM_I2C_SPEED_STD;

	if (qm_i2c_set_config(QM_I2C_0, &cfg)) {
		QM_PUTS("Error: I2C_0 config failed");
	}

	/* Add eeprom data address to the beginning of each message. */
	eeprom_pio_write_data[0] = EEPROM_ADDR_FIRST_PAGE_LO;
	eeprom_pio_write_data[1] = EEPROM_ADDR_FIRST_PAGE_HI;
	eeprom_irq_write_data[0] = EEPROM_ADDR_FIRST_PAGE_LO;
	eeprom_irq_write_data[1] = EEPROM_ADDR_FIRST_PAGE_HI;

	/* PIO example. */
	i2c_pio_write_example();
	i2c_pio_combined_transaction_example();
	eeprom_compare_page(eeprom_pio_write_data, eeprom_read_buf);

	/* IRQ example. */
	i2c_irq_write_example();
	i2c_irq_combined_transaction_example();
	eeprom_compare_page(eeprom_irq_write_data, eeprom_read_buf);

	/* DMA example. */

	/* Verify irq callback was fired before initiating a new request */
	while (!i2c_0_irq_complete)
		;

	QM_IRQ_REQUEST(QM_IRQ_I2C_0_INT, qm_i2c_0_dma_isr);
	i2c_dma_setup();
	i2c_dma_write_example();
	i2c_dma_combined_transaction_example();
	eeprom_compare_page(eeprom_pio_write_data, eeprom_read_buf);

	QM_PUTS("Finished: I2C");

	return 0;
}
Exemplo n.º 9
0
int main(void)
{
	qm_rtc_config_t rtc_cfg;
	unsigned int count = 0;
	/* loop_max : Maximum number of iterations.
	 * A value of 50 will run the application for roughly 30s.
	 */
	const unsigned int loop_max = 50;
	gpio_init();
	pin_mux_setup();
	gpio_set_out(BOARD_LED_PIN, 0); /* Configure the onboard LED pin. */

	/* Clear Screen. */
	QM_PUTS("Starting: Power Profiler");
	QM_PUTS("Low power mode example.");
	QM_PRINTF("Increment = %d\n", QM_RTC_ALARM_SECOND(CLK_RTC_DIV_1));

	clk_periph_enable(CLK_PERIPH_RTC_REGISTER | CLK_PERIPH_CLK);

	/* Initialise RTC configuration: Run, but don't interrupt. */
	rtc_cfg.init_val = 0;
	rtc_cfg.alarm_en = 0;
	rtc_cfg.alarm_val = QM_RTC_ALARM_SECOND(CLK_RTC_DIV_1);
	rtc_cfg.callback = rtc_example_callback;
	rtc_cfg.prescaler = CLK_RTC_DIV_1;
	qm_rtc_set_config(QM_RTC_0, &rtc_cfg);

	QM_IR_UNMASK_INT(QM_IRQ_RTC_0_INT);
	QM_IRQ_REQUEST(QM_IRQ_RTC_0_INT, qm_rtc_0_isr);

#if (!QM_SENSOR)
	test_clock_rates();
#endif

	/* Enable the RTC Interrupt. */
	rtc_cfg.alarm_en = 1;
	qm_rtc_set_config(QM_RTC_0, &rtc_cfg);

	count = 0;
	while (++count < loop_max) {
		QM_PRINTF("\nC:%d R:%d => ", count, rtc_tick);

		slow_mode_test();
		halt_test();
		core_sleep_test();
		/* TODO : Enable soc_sleep test for c1000. */
		soc_sleep_test();
		/* TODO : Enable soc_deep_sleep test for d2000 and c1000. */
		soc_deep_sleep_test();
	}
	SOC_WATCH_TRIGGER_FLUSH();
	QM_PUTS("Finished: Power Profiler");
	return 0;
}
Exemplo n.º 10
0
Arquivo: main.c Projeto: jeez/qmsi
static void spi_transfer_irq(void)
{
	QM_PUTS("Reading CHIPID in IRQ mode.");

	tx_buffer[0] = 0x80; /* Read chip ID. */

	/* Set up transfer values. */
	qm_ss_spi_async_transfer_t irq_trans;
	irq_trans.rx = rx_buffer;
	irq_trans.tx = tx_buffer;
	irq_trans.rx_len = BUFFER_SIZE;
	irq_trans.tx_len = BUFFER_SIZE;
	irq_trans.callback_data = NULL;
	irq_trans.callback = spi_cb;

	/* Register interrupts. */
	qm_ss_irq_request(QM_SS_IRQ_SPI_0_ERROR_INT, qm_ss_spi_0_error_isr);
	qm_ss_irq_request(QM_SS_IRQ_SPI_0_RX_AVAIL_INT,
			  qm_ss_spi_0_rx_avail_isr);
	qm_ss_irq_request(QM_SS_IRQ_SPI_0_TX_REQ_INT, qm_ss_spi_0_tx_req_isr);

	tx_buffer[0] = 0x80; /* Read chip ID. */

	err_code = 0;
	xfer_active = true;

	/* Set SPI configuration. */
	qm_ss_spi_set_config(spi, &conf);

	/* Enable clock for SPI 0. */
	ss_clk_spi_enable(QM_SS_SPI_0);

	/* Select slave and do the actual SPI transfer. */
	qm_ss_spi_slave_select(spi, select);
	qm_ss_spi_irq_transfer(spi, &irq_trans);
	while (xfer_active)
		;

	/* Disable clock for SPI 0. */
	ss_clk_spi_disable(QM_SS_SPI_0);

	if (err_code != 0) {
		QM_PRINTF(
		    "Error: SPI transfer failed. (%d frames transmitted)\n",
		    transfer_len);
	} else if (rx_buffer[1] == 0xd1) {
		QM_PUTS("CHIPID = 0x1d");
	} else {
		QM_PRINTF("Error: CHIPID doesn't match 0x%x != 0xd1.\n",
			  rx_buffer[1]);
	}
}
Exemplo n.º 11
0
void spi_rx_example_cb(uint32_t id, uint32_t len)
{
	int i;
	QM_PUTS("\nSPI RX DONE\n");
	/* Compare RX and TX buffers */
	for (i = 0; i < BUFFERSIZE; i++) {
		if (tx_buff[i] != rx_buff[i]) {
			QM_PUTS("\nERROR: RX/TX Buffers mismatch!\n");
		} else if (i == BUFFERSIZE - 1) {
			QM_PUTS("\nSUCCESS: Buffers match!\n");
		}
	}
}
Exemplo n.º 12
0
static void ss_gpio_interrupt_example(void)
{
	uint32_t i;

	QM_PUTS("Starting: SS GPIO interrupt");

	/* Enable clock to interrupt controller. */
	__builtin_arc_sr(BIT(31) + BIT(0),
			 QM_SS_GPIO_0_BASE + QM_SS_GPIO_LS_SYNC);

	/* Set SS GPIO pin 2 as OUTPUT. */
	__builtin_arc_sr(BIT(2), QM_SS_GPIO_0_BASE + QM_SS_GPIO_SWPORTA_DDR);

	/* Register the SS GPIO interrupt. */
	QM_IR_UNMASK_INTERRUPTS(QM_INTERRUPT_ROUTER->ss_gpio_0_int_mask);
	qm_ss_irq_request(QM_SS_IRQ_GPIO_0_INT, ss_gpio_interrupt_isr);

	/* Set the bit 3 to rising edge-sensitive. */
	__builtin_arc_sr(BIT(3), QM_SS_GPIO_0_BASE + QM_SS_GPIO_INTTYPE_LEVEL);
	/* Unmask SS GPIO pin 3 interrupt only. */
	__builtin_arc_sr(~BIT(3), QM_SS_GPIO_0_BASE + QM_SS_GPIO_INTMASK);
	/* Clear SS GPIO interrupt requests. */
	__builtin_arc_sr(BIT(3), QM_SS_GPIO_0_BASE + QM_SS_GPIO_PORTA_EOI);
	/* Enable SS GPIO interrupt. */
	__builtin_arc_sr(BIT(3), QM_SS_GPIO_0_BASE + QM_SS_GPIO_INTEN);

	for (i = 0; i < NUM_LOOPS; i++) {
		/*
		 * Toggle the SS GPIO 2, will trigger the interrupt on SS
		 * GPIO 3.
		 */
		clk_sys_udelay(DELAY);
		__builtin_arc_sr(BIT(2),
				 QM_SS_GPIO_0_BASE + QM_SS_GPIO_SWPORTA_DR);
		QM_GPIO[0]->gpio_swporta_dr |= BIT(LED_BIT);
		clk_sys_udelay(DELAY);
		__builtin_arc_sr(0, QM_SS_GPIO_0_BASE + QM_SS_GPIO_SWPORTA_DR);
		QM_GPIO[0]->gpio_swporta_dr &= ~BIT(LED_BIT);
	}
	/* Unmask all SS GPIO interrupts. */
	__builtin_arc_sr(0xff, QM_SS_GPIO_0_BASE + QM_SS_GPIO_INTMASK);
	if (counter == NUM_LOOPS) {
		QM_PUTS("Success");
	} else {
		QM_PUTS("Error: Check are pins 14 and 16 on J14 connector "
			"short connected?");
	}

	QM_PUTS("Finished: SS GPIO interrupt");
}
Exemplo n.º 13
0
int main(void)
{
	qm_ss_gpio_state_t state;
	qm_ss_gpio_port_config_t conf;

	QM_PUTS("Starting: SS GPIO");

	pin_mux_setup();

	/* Request IRQ and write SS GPIO port config. */
	conf.direction = BIT(PIN_OUT);      /* Set PIN_OUT to output. */
	conf.int_en = BIT(PIN_INTR);	/* Interrupt enabled. */
	conf.int_type = BIT(PIN_INTR);      /* Edge sensitive interrupt. */
	conf.int_polarity = ~BIT(PIN_INTR); /* Falling edge. */
	conf.int_debounce = BIT(PIN_INTR);  /* Debounce enabled. */
	conf.callback = gpio_example_callback;
	conf.callback_data = NULL;

	/* Enable clock. */
	ss_clk_gpio_enable(QM_SS_GPIO_0);

	QM_IR_UNMASK_INTERRUPTS(QM_INTERRUPT_ROUTER->ss_gpio_0_int_mask);
	qm_ss_irq_request(QM_SS_IRQ_GPIO_0_INT, qm_ss_gpio_0_isr);

	qm_ss_gpio_set_config(QM_SS_GPIO_0, &conf);

	/* Clear PIN_OUT to trigger PIN_INTR interrupt. */
	qm_ss_gpio_set_pin(QM_SS_GPIO_0, PIN_OUT);
	qm_ss_gpio_clear_pin(QM_SS_GPIO_0, PIN_OUT);

	/* Wait for callback to be invoked */
	while (!callback_invoked)
		;

	QM_PRINTF("Callback fired, status: 0x%x\n", callback_status);

	if (qm_ss_gpio_read_pin(QM_SS_GPIO_0, PIN_OUT, &state)) {
		QM_PUTS("Error: read pin failed");
		return 1;
	}
	if (state != QM_SS_GPIO_LOW) {
		QM_PUTS("Error: SS GPIO pin out comparison failed");
		return 1;
	}

	QM_PUTS("Finished: SS GPIO");

	return 0;
}
Exemplo n.º 14
0
Arquivo: main.c Projeto: jeez/qmsi
int main(void)
{
	qm_flash_config_t cfg;
	uint32_t wr_flash_addr, app_end, page_num, flash_base, flash_num;

#if (QUARK_D2000)
	flash_base = QM_FLASH_REGION_SYS_0_BASE;
	flash_num = QM_FLASH_0;
#elif(QUARK_SE)
	flash_base = QM_FLASH_REGION_SYS_1_BASE;
	flash_num = QM_FLASH_1;
#endif

	QM_PUTS("Starting: Flash");
	app_end = (uint32_t)__data_lma + (uint32_t)__data_size;

	/* Check there is at least one free flash page after the app code. */
	if ((app_end + QM_FLASH_PAGE_SIZE_BYTES) > FLASH_END) {
		QM_PUTS("Error: No free pages. Quitting.");
		return 1;
	}

	/*
	 * Calculate flash page number, and an MMIO address representing a
	 * location inside the page.
	 */
	page_num = ((app_end - flash_base) / QM_FLASH_PAGE_SIZE_BYTES) + 1;
	wr_flash_addr = (QM_FLASH_PAGE_SIZE_BYTES * page_num) + WR_PAGE_OFFSET;

	cfg.us_count = US_COUNT;
	cfg.wait_states = WAIT_STATES;
	cfg.write_disable = QM_FLASH_WRITE_ENABLE;

	qm_flash_set_config(flash_num, &cfg);

	/* Requires a 2KB buffer to store flash page. */
	qm_flash_page_update(flash_num, QM_FLASH_REGION_SYS, wr_flash_addr,
			     flash_page_buffer, flash_data, NUM_DATA_WORDS);

	qm_flash_page_erase(flash_num, QM_FLASH_REGION_SYS, page_num);

	qm_flash_page_write(flash_num, QM_FLASH_REGION_SYS, page_num,
			    flash_data, NUM_DATA_WORDS);

	QM_PUTS("Finished: Flash");

	return 0;
}
Exemplo n.º 15
0
Arquivo: main.c Projeto: jeez/qmsi
int main(void)
{
	qm_mpr_config_t cfg;
	uint8_t lower_bound;
	uint32_t heap_offset, mpr_base;

	QM_PUTS("Starting: MPR");

	/*
	 * The MPR is located in the heap in order to ensure it doesn't clash
	 * with anything so it is necessary to calculate the page number that
	 * corresponds to the start of the heap.
	 */
	heap_offset = (uint32_t)&__heap;
	lower_bound = (uint8_t)((heap_offset - SRAM_BASE) / MPR_PAGE_SIZE) + 1;

	/* Calculate the physical address of the start of the MPR. */
	mpr_base = SRAM_BASE + (lower_bound * MPR_PAGE_SIZE);

	/* Request the IRQ. */
	qm_irq_request(QM_IRQ_SRAM_MPR_0_INT, qm_sram_mpr_0_isr);

	/* Set the violation policy to trigger an interrupt. */
	qm_mpr_set_violation_policy(MPR_VIOL_MODE_INTERRUPT,
				    mpr_example_callback, NULL);

	/* Configure MPR to allow R/W from DMA agent only. */
	cfg.en_lock_mask = QM_SRAM_MPR_EN_MASK_ENABLE;
	cfg.agent_read_en_mask = QM_SRAM_MPR_AGENT_MASK_DMA;
	cfg.agent_write_en_mask = QM_SRAM_MPR_AGENT_MASK_DMA;
	cfg.up_bound = lower_bound;
	cfg.low_bound = lower_bound;

	qm_mpr_set_config(QM_MPR_0, &cfg);

	/* Trigger a violation event by attempting a write inside the MPR. */
	REG_VAL(mpr_base + 1) = 0xff;

	/* Wait for the callback to be invoked. */
	while (false == callback_invoked)
		;

	QM_PUTS("MPR Violation!");

	QM_PUTS("Finished: MPR");

	return 0;
}
Exemplo n.º 16
0
Arquivo: main.c Projeto: Hlotfy/qmsi
void uart_example_tx_callback(void *data, int error, qm_uart_status_t status,
			      uint32_t len)
{
	uint32_t id = *(uint32_t *)data;

	switch (id) {

	case BANNER_IRQ_ID:
		qm_uart_write_buffer(STDOUT_UART,
				     (uint8_t *)BANNER_IRQ_COMPLETE,
				     sizeof(BANNER_IRQ_COMPLETE));
		break;

	case BANNER_DMA_ID:
		qm_uart_write_buffer(STDOUT_UART,
				     (uint8_t *)BANNER_DMA_COMPLETE,
				     sizeof(BANNER_DMA_COMPLETE));
		break;

	default:
		break;
	}

	QM_PUTS("\n");
}
Exemplo n.º 17
0
/* Writes a page to the EEPROM using PIO I2C transfer. */
void i2c_pio_write_example()
{
	qm_i2c_status_t status;

	QM_PUTS("PIO write");

	/* Write EEPROM page address then the data. */
	if (qm_i2c_master_write(QM_I2C_0, EEPROM_SLAVE_ADDR,
				eeprom_pio_write_data,
				sizeof(eeprom_pio_write_data), true, &status)) {
		QM_PUTS("Error: PIO write failed");
	} else {
		QM_PUTS("I2C PIO TX Transfer complete");
	}
	clk_sys_udelay(EEPROM_WRITE_WAIT_TIME_US);
}
Exemplo n.º 18
0
Arquivo: main.c Projeto: CurieBSP/qmsi
int main(void)
{
	unsigned int cnt;

	QM_PUTS("Demonstrating QM_PUTS/QM_PRINTF functionality");

	for (cnt = 0; cnt < 10; cnt++) {
		QM_PRINTF("%d\n", cnt);
	}

	QM_PUTS("Demonstrating QM_ASSERT functionality");

	QM_ASSERT(1 == 0);

	return 0;
}
Exemplo n.º 19
0
Arquivo: main.c Projeto: jeez/qmsi
int main(void)
{
	uint32_t c_val = 0, pt_val = 0;
	qm_aonpt_config_t cfg;

	QM_PUTS("Starting: Always-on Counter");

	/* Always-on Counter enable and read value. */
	qm_aonc_enable(QM_AONC_0);

	if (qm_aonc_get_value(QM_AONC_0, &c_val) == 0) {
		QM_PRINTF("Always-on Counter value: %u\n", c_val);
	} else {
		QM_PUTS("Error: Could not read aonc value.");
	}

	/* Request an IRQ and write the Always-on Periodic Timer config. */
	cfg.count = 0x1000; /* 0.125 seconds. */
	cfg.int_en = true;  /* Interrupts enabled. */
	cfg.callback = aonpt_example_callback;

	qm_irq_request(QM_IRQ_AONPT_0_INT, qm_aonpt_0_isr);

	qm_aonpt_set_config(QM_AONC_0, &cfg);

	/* Wait for the defined number of callbacks be invoked. */
	while (NUM_CALLBACKS > callback_count)
		;

	QM_PRINTF("Periodic Timer callback fired %d times.\n", callback_count);

	/* Get the value of the Always-on Periodic Timer. */
	if (qm_aonpt_get_value(QM_AONC_0, &c_val) == 0) {
		QM_PRINTF("Always-on Periodic Timer value: %u\n", pt_val);
	} else {
		QM_PUTS("Error: Could not read Periodic timer value");
	}

	/* Disable the always-on periodic timer interrupt. */
	cfg.int_en = false;
	qm_aonpt_set_config(QM_AONC_0, &cfg);

	QM_PUTS("Finished: Always-on counter");

	return 0;
}
Exemplo n.º 20
0
Arquivo: main.c Projeto: jeez/qmsi
int main(void)
{
	qm_rtc_config_t rtc_cfg;
	unsigned int count = 0;
	/* Maximum number of 3-second iterations. */
	const unsigned int loop_max = 5;
	gpio_init();
	gpio_set_out(BOARD_LED_PIN, 0); /* Configure the onboard LED pin. */

	/* Clear Screen. */
	QM_PUTS("Starting: Power Profiler");
	QM_PUTS("Low power mode example.");
	QM_PRINTF("Increment = %d\n", QM_RTC_ALARM_SECOND(CLK_RTC_DIV_1));

	clk_periph_enable(CLK_PERIPH_RTC_REGISTER | CLK_PERIPH_CLK);

	/* Initialise RTC configuration: Run, but don't interrupt. */
	rtc_cfg.init_val = 0;
	rtc_cfg.alarm_en = 0;
	rtc_cfg.alarm_val = QM_RTC_ALARM_SECOND(CLK_RTC_DIV_1);
	rtc_cfg.callback = rtc_example_callback;
	rtc_cfg.prescaler = CLK_RTC_DIV_1;
	qm_rtc_set_config(QM_RTC_0, &rtc_cfg);

	qm_irq_request(QM_IRQ_RTC_0_INT, qm_rtc_0_isr);

	test_clock_rates();

	/* Enable the RTC Interrupt. */
	rtc_cfg.alarm_en = 1;
	qm_rtc_set_config(QM_RTC_0, &rtc_cfg);

	count = 0;
	while (++count < loop_max) {
		QM_PRINTF("\nC:%d R:%d => ", count, rtc_tick);

		slow_mode_test();
		halt_test();
		sleep_test();
#if DEEP_SLEEP
		deep_sleep_test();
#endif
	}
	QM_PUTS("Finished: Power Profiler");
	return 0;
}
Exemplo n.º 21
0
Arquivo: main.c Projeto: jeez/qmsi
int main(void)
{
	QM_PUTS("Starting: SS SPI");

	/* Set up SPI configuration. */
	conf.frame_size = QM_SS_SPI_FRAME_SIZE_8_BIT;
	conf.transfer_mode = QM_SS_SPI_TMOD_TX_RX;
	conf.clk_divider = 32; /* 1MHz. */
	conf.bus_mode = QM_SS_SPI_BMODE_0;

	spi_transfer_polled();
	spi_transfer_irq();

	QM_PUTS("Finished: SS SPI");

	return 0;
}
Exemplo n.º 22
0
static void soc_sleep_test(void)
{
#if SOC_SLEEP_TEST
	/* Go to sleep, (power down some IO). RTC will wake me up. */
	QM_PUTS("SOC Sleep");
	ENTER_SOC_SLEEP();
#endif
}
Exemplo n.º 23
0
Arquivo: main.c Projeto: jeez/qmsi
static void halt_test(void)
{
#if HALT_TEST
	/* Halt the CPU, RTC alarm will wake me up. */
	QM_PUTS("Halt");
	ENTER_C1();
#endif
}
Exemplo n.º 24
0
Arquivo: main.c Projeto: jeez/qmsi
int main(void)
{
	uint32_t rom_version = qm_ver_rom();

	QM_PUTS("Starting: Version");

	QM_PRINTF("QMSI API version number (int) is %u\n", QM_VER_API_UINT);
	QM_PRINTF("QMSI API version number (string) is %s\n",
		  QM_VER_API_STRING);

	QM_PRINTF("QMSI ROM version number (int) is %u\n",
		  (unsigned int)rom_version);

	QM_PUTS("Finished: Version");

	return 0;
}
Exemplo n.º 25
0
Arquivo: main.c Projeto: jeez/qmsi
int main(void)
{
	uint32_t baudrate, dtr = 0;
	int bytes_read;

	QM_PUTS("Starting: USB CDC ACM Example");

	qm_irq_request(QM_IRQ_USB_0_INT, qm_usb_0_isr);

	/* Enable the USB VBUS on Quark SE DevBoard. */
	enable_usb_vbus();

	/* Init USB CDC ACM. */
	cdc_acm_init();

	QM_PUTS("CDC ACM Initialized. Waiting for DTR.");
	do {
		cdc_acm_line_ctrl_get(LINE_CTRL_DTR, &dtr);
	} while (!dtr);

	QM_PUTS("DTR set, start test.");

	/* Wait 1 sec for the host to do all settings. */
	clk_sys_udelay(ONE_SEC_UDELAY);

	if (cdc_acm_line_ctrl_get(LINE_CTRL_BAUD_RATE, &baudrate)) {
		QM_PUTS("Failed to get baudrate, ret code.");
	} else {
		QM_PRINTF("Baudrate detected: %d\n", baudrate);
	}

	QM_PUTS("USB CDC ACM set. Switch to the USB Serial Console.");
	cdc_acm_irq_callback_set(interrupt_handler);
	write_data(banner1, strlen(banner1));
	write_data(banner2, strlen(banner2));

	/* Enable RX interrupts. */
	cdc_acm_irq_rx_enable();

	/* Echo the received data. */
	while (1) {
		read_and_echo_data(&bytes_read);
	}

	return 0;
}
Exemplo n.º 26
0
int main(void)
{
	volatile uint32_t delay;
	uint32_t c_val = 0, pt_val = 0;
	qm_aonpt_config_t cfg;

	QM_PUTS("\nAlways-on Counter example app\n");

	/* Always-on Counter enable, disable and read value */
	qm_aonc_disable(QM_SCSS_AON_0);
	qm_aonc_enable(QM_SCSS_AON_0);

	c_val = qm_aonc_get_value(QM_SCSS_AON_0);
	if (c_val) {
		QM_PRINTF("Always-on Counter value: %lu\n", c_val);
	} else {
		QM_PRINTF("ERROR: Could not read aonc value\n");
	}

	/* Request an IRQ and write the Always-on Periodic Timer config */
	cfg.count = 0x10000;
	cfg.int_en = true;
	cfg.callback = aonpt_example_callback;

	qm_irq_request(QM_IRQ_AONPT_0, qm_aonpt_isr_0);

	qm_aonpt_set_config(QM_SCSS_AON_0, &cfg);

	/* The AON Periodic Timer runs from the RTC clock at 32KHz (rather than
	 * the system clock which is 32MHz) so we need to spin for a few cycles
	 * allow the register change to propagate */
	for (delay = 500; delay--;) {
	}

	/* Get the value of the Always-on Periodic Timer */
	pt_val = qm_aonpt_get_value(QM_SCSS_AON_0);
	if (pt_val) {
		QM_PRINTF("Always-on Periodic Timer value: %lu\n", pt_val);
	} else {
		QM_PRINTF("ERROR: Could not read Periodic timer value\n\n");
	}

	QM_PUTS("Always-on counter example app complete\n");
	return 0;
}
Exemplo n.º 27
0
void soc_sleep_requested(bool ready_to_sleep)
{
	unsigned int key;

	QM_PUTS("SoC sleep requested");

	if (!ready_to_sleep) {
		QM_PUTS("Sleep NAK'd");
		send_msg(SLEEP_NAK);
	} else {
		key = qm_irq_lock();
		send_msg(SLEEP_ACK);
		soc_sleep(CORE_SLEEP);
		qm_irq_unlock(key);
	}

	return;
}
Exemplo n.º 28
0
static void core_sleep_test(void)
{
#if CORE_SLEEP_TEST
	/* Halt the CPU, RTC alarm will wake me up. */
	QM_PUTS("CPU C2");
#if (QM_SENSOR)
	/* switch rtc interrupt to level triggered.*/
	rtc_trigger = switch_rtc_to_level();
#endif
	ENTER_CORE_SLEEP_1();
#if (QM_SENSOR)
	/* restore rtc interrupt back to edge triggered.*/
	restore_rtc_trigger(rtc_trigger);
#endif
	QM_PUTS("CPU C2LP");
	ENTER_CORE_SLEEP_2();
#endif
}
Exemplo n.º 29
0
static void soc_deep_sleep_test(void)
{
#if SOC_DEEP_SLEEP_TEST
	/* Go to sleep, (power down some IO). RTC will wake me up. */
	QM_PUTS("SOC Deep Sleep");
	/* TODO : save/restore context soc_deep_sleep test. */
	ENTER_SOC_DEEP_SLEEP();
#endif
}
Exemplo n.º 30
0
static void slow_mode_test(void)
{
#if SLOW_MODE_TEST
	/* Drop into low-power compute mode. */
	QM_PUTS("\nSlow");
	clk_sys_set_mode(CLK_SYS_CRYSTAL_OSC, CLK_SYS_DIV_8);
	ENTER_HALT();
	clk_sys_set_mode(CLK_SYS_CRYSTAL_OSC, CLK_SYS_DIV_1);
#endif
}