117ff8e18SSteffen Görtz /* 217ff8e18SSteffen Görtz * QTest testcase for Microbit board using the Nordic Semiconductor nRF51 SoC. 317ff8e18SSteffen Görtz * 417ff8e18SSteffen Görtz * nRF51: 517ff8e18SSteffen Görtz * Reference Manual: http://infocenter.nordicsemi.com/pdf/nRF51_RM_v3.0.pdf 617ff8e18SSteffen Görtz * Product Spec: http://infocenter.nordicsemi.com/pdf/nRF51822_PS_v3.1.pdf 717ff8e18SSteffen Görtz * 817ff8e18SSteffen Görtz * Microbit Board: http://microbit.org/ 917ff8e18SSteffen Görtz * 1017ff8e18SSteffen Görtz * Copyright 2018 Steffen Görtz <contrib@steffen-goertz.de> 1117ff8e18SSteffen Görtz * 1217ff8e18SSteffen Görtz * This code is licensed under the GPL version 2 or later. See 1317ff8e18SSteffen Görtz * the COPYING file in the top-level directory. 1417ff8e18SSteffen Görtz */ 1517ff8e18SSteffen Görtz 1617ff8e18SSteffen Görtz 1717ff8e18SSteffen Görtz #include "qemu/osdep.h" 1817ff8e18SSteffen Görtz #include "exec/hwaddr.h" 1917ff8e18SSteffen Görtz #include "libqtest.h" 2017ff8e18SSteffen Görtz 2117ff8e18SSteffen Görtz #include "hw/arm/nrf51.h" 2217ff8e18SSteffen Görtz #include "hw/gpio/nrf51_gpio.h" 237ec543e4SSteffen Görtz #include "hw/timer/nrf51_timer.h" 24*b36356f6SStefan Hajnoczi #include "hw/i2c/microbit_i2c.h" 25*b36356f6SStefan Hajnoczi 26*b36356f6SStefan Hajnoczi /* Read a byte from I2C device at @addr from register @reg */ 27*b36356f6SStefan Hajnoczi static uint32_t i2c_read_byte(uint32_t addr, uint32_t reg) 28*b36356f6SStefan Hajnoczi { 29*b36356f6SStefan Hajnoczi uint32_t val; 30*b36356f6SStefan Hajnoczi 31*b36356f6SStefan Hajnoczi writel(NRF51_TWI_BASE + NRF51_TWI_REG_ADDRESS, addr); 32*b36356f6SStefan Hajnoczi writel(NRF51_TWI_BASE + NRF51_TWI_TASK_STARTTX, 1); 33*b36356f6SStefan Hajnoczi writel(NRF51_TWI_BASE + NRF51_TWI_REG_TXD, reg); 34*b36356f6SStefan Hajnoczi val = readl(NRF51_TWI_BASE + NRF51_TWI_EVENT_TXDSENT); 35*b36356f6SStefan Hajnoczi g_assert_cmpuint(val, ==, 1); 36*b36356f6SStefan Hajnoczi writel(NRF51_TWI_BASE + NRF51_TWI_TASK_STOP, 1); 37*b36356f6SStefan Hajnoczi 38*b36356f6SStefan Hajnoczi writel(NRF51_TWI_BASE + NRF51_TWI_TASK_STARTRX, 1); 39*b36356f6SStefan Hajnoczi val = readl(NRF51_TWI_BASE + NRF51_TWI_EVENT_RXDREADY); 40*b36356f6SStefan Hajnoczi g_assert_cmpuint(val, ==, 1); 41*b36356f6SStefan Hajnoczi val = readl(NRF51_TWI_BASE + NRF51_TWI_REG_RXD); 42*b36356f6SStefan Hajnoczi writel(NRF51_TWI_BASE + NRF51_TWI_TASK_STOP, 1); 43*b36356f6SStefan Hajnoczi 44*b36356f6SStefan Hajnoczi return val; 45*b36356f6SStefan Hajnoczi } 46*b36356f6SStefan Hajnoczi 47*b36356f6SStefan Hajnoczi static void test_microbit_i2c(void) 48*b36356f6SStefan Hajnoczi { 49*b36356f6SStefan Hajnoczi uint32_t val; 50*b36356f6SStefan Hajnoczi 51*b36356f6SStefan Hajnoczi /* We don't program pins/irqs but at least enable the device */ 52*b36356f6SStefan Hajnoczi writel(NRF51_TWI_BASE + NRF51_TWI_REG_ENABLE, 5); 53*b36356f6SStefan Hajnoczi 54*b36356f6SStefan Hajnoczi /* MMA8653 magnetometer detection */ 55*b36356f6SStefan Hajnoczi val = i2c_read_byte(0x3A, 0x0D); 56*b36356f6SStefan Hajnoczi g_assert_cmpuint(val, ==, 0x5A); 57*b36356f6SStefan Hajnoczi 58*b36356f6SStefan Hajnoczi val = i2c_read_byte(0x3A, 0x0D); 59*b36356f6SStefan Hajnoczi g_assert_cmpuint(val, ==, 0x5A); 60*b36356f6SStefan Hajnoczi 61*b36356f6SStefan Hajnoczi /* LSM303 accelerometer detection */ 62*b36356f6SStefan Hajnoczi val = i2c_read_byte(0x3C, 0x4F); 63*b36356f6SStefan Hajnoczi g_assert_cmpuint(val, ==, 0x40); 64*b36356f6SStefan Hajnoczi 65*b36356f6SStefan Hajnoczi writel(NRF51_TWI_BASE + NRF51_TWI_REG_ENABLE, 0); 66*b36356f6SStefan Hajnoczi } 6717ff8e18SSteffen Görtz 6817ff8e18SSteffen Görtz static void test_nrf51_gpio(void) 6917ff8e18SSteffen Görtz { 7017ff8e18SSteffen Görtz size_t i; 7117ff8e18SSteffen Görtz uint32_t actual, expected; 7217ff8e18SSteffen Görtz 7317ff8e18SSteffen Görtz struct { 7417ff8e18SSteffen Görtz hwaddr addr; 7517ff8e18SSteffen Görtz uint32_t expected; 7617ff8e18SSteffen Görtz } const reset_state[] = { 7717ff8e18SSteffen Görtz {NRF51_GPIO_REG_OUT, 0x00000000}, {NRF51_GPIO_REG_OUTSET, 0x00000000}, 7817ff8e18SSteffen Görtz {NRF51_GPIO_REG_OUTCLR, 0x00000000}, {NRF51_GPIO_REG_IN, 0x00000000}, 7917ff8e18SSteffen Görtz {NRF51_GPIO_REG_DIR, 0x00000000}, {NRF51_GPIO_REG_DIRSET, 0x00000000}, 8017ff8e18SSteffen Görtz {NRF51_GPIO_REG_DIRCLR, 0x00000000} 8117ff8e18SSteffen Görtz }; 8217ff8e18SSteffen Görtz 8317ff8e18SSteffen Görtz /* Check reset state */ 8417ff8e18SSteffen Görtz for (i = 0; i < ARRAY_SIZE(reset_state); i++) { 8517ff8e18SSteffen Görtz expected = reset_state[i].expected; 8617ff8e18SSteffen Görtz actual = readl(NRF51_GPIO_BASE + reset_state[i].addr); 8717ff8e18SSteffen Görtz g_assert_cmpuint(actual, ==, expected); 8817ff8e18SSteffen Görtz } 8917ff8e18SSteffen Görtz 9017ff8e18SSteffen Görtz for (i = 0; i < NRF51_GPIO_PINS; i++) { 9117ff8e18SSteffen Görtz expected = 0x00000002; 9217ff8e18SSteffen Görtz actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START + i * 4); 9317ff8e18SSteffen Görtz g_assert_cmpuint(actual, ==, expected); 9417ff8e18SSteffen Görtz } 9517ff8e18SSteffen Görtz 9617ff8e18SSteffen Görtz /* Check dir bit consistency between dir and cnf */ 9717ff8e18SSteffen Görtz /* Check set via DIRSET */ 9817ff8e18SSteffen Görtz expected = 0x80000001; 9917ff8e18SSteffen Görtz writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_DIRSET, expected); 10017ff8e18SSteffen Görtz actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_DIR); 10117ff8e18SSteffen Görtz g_assert_cmpuint(actual, ==, expected); 10217ff8e18SSteffen Görtz actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START) & 0x01; 10317ff8e18SSteffen Görtz g_assert_cmpuint(actual, ==, 0x01); 10417ff8e18SSteffen Görtz actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_END) & 0x01; 10517ff8e18SSteffen Görtz g_assert_cmpuint(actual, ==, 0x01); 10617ff8e18SSteffen Görtz 10717ff8e18SSteffen Görtz /* Check clear via DIRCLR */ 10817ff8e18SSteffen Görtz writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_DIRCLR, 0x80000001); 10917ff8e18SSteffen Görtz actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_DIR); 11017ff8e18SSteffen Görtz g_assert_cmpuint(actual, ==, 0x00000000); 11117ff8e18SSteffen Görtz actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START) & 0x01; 11217ff8e18SSteffen Görtz g_assert_cmpuint(actual, ==, 0x00); 11317ff8e18SSteffen Görtz actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_END) & 0x01; 11417ff8e18SSteffen Görtz g_assert_cmpuint(actual, ==, 0x00); 11517ff8e18SSteffen Görtz 11617ff8e18SSteffen Görtz /* Check set via DIR */ 11717ff8e18SSteffen Görtz expected = 0x80000001; 11817ff8e18SSteffen Görtz writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_DIR, expected); 11917ff8e18SSteffen Görtz actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_DIR); 12017ff8e18SSteffen Görtz g_assert_cmpuint(actual, ==, expected); 12117ff8e18SSteffen Görtz actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START) & 0x01; 12217ff8e18SSteffen Görtz g_assert_cmpuint(actual, ==, 0x01); 12317ff8e18SSteffen Görtz actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_END) & 0x01; 12417ff8e18SSteffen Görtz g_assert_cmpuint(actual, ==, 0x01); 12517ff8e18SSteffen Görtz 12617ff8e18SSteffen Görtz /* Reset DIR */ 12717ff8e18SSteffen Görtz writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_DIR, 0x00000000); 12817ff8e18SSteffen Görtz 12917ff8e18SSteffen Görtz /* Check Input propagates */ 13017ff8e18SSteffen Görtz writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START, 0x00); 13117ff8e18SSteffen Görtz qtest_set_irq_in(global_qtest, "/machine/nrf51", "unnamed-gpio-in", 0, 0); 13217ff8e18SSteffen Görtz actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_IN) & 0x01; 13317ff8e18SSteffen Görtz g_assert_cmpuint(actual, ==, 0x00); 13417ff8e18SSteffen Görtz qtest_set_irq_in(global_qtest, "/machine/nrf51", "unnamed-gpio-in", 0, 1); 13517ff8e18SSteffen Görtz actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_IN) & 0x01; 13617ff8e18SSteffen Görtz g_assert_cmpuint(actual, ==, 0x01); 13717ff8e18SSteffen Görtz qtest_set_irq_in(global_qtest, "/machine/nrf51", "unnamed-gpio-in", 0, -1); 13817ff8e18SSteffen Görtz actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_IN) & 0x01; 13917ff8e18SSteffen Görtz g_assert_cmpuint(actual, ==, 0x01); 14017ff8e18SSteffen Görtz writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START, 0x02); 14117ff8e18SSteffen Görtz 14217ff8e18SSteffen Görtz /* Check pull-up working */ 14317ff8e18SSteffen Görtz qtest_set_irq_in(global_qtest, "/machine/nrf51", "unnamed-gpio-in", 0, 0); 14417ff8e18SSteffen Görtz writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START, 0b0000); 14517ff8e18SSteffen Görtz actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_IN) & 0x01; 14617ff8e18SSteffen Görtz g_assert_cmpuint(actual, ==, 0x00); 14717ff8e18SSteffen Görtz writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START, 0b1110); 14817ff8e18SSteffen Görtz actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_IN) & 0x01; 14917ff8e18SSteffen Görtz g_assert_cmpuint(actual, ==, 0x01); 15017ff8e18SSteffen Görtz writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START, 0x02); 15117ff8e18SSteffen Görtz 15217ff8e18SSteffen Görtz /* Check pull-down working */ 15317ff8e18SSteffen Görtz qtest_set_irq_in(global_qtest, "/machine/nrf51", "unnamed-gpio-in", 0, 1); 15417ff8e18SSteffen Görtz writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START, 0b0000); 15517ff8e18SSteffen Görtz actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_IN) & 0x01; 15617ff8e18SSteffen Görtz g_assert_cmpuint(actual, ==, 0x01); 15717ff8e18SSteffen Görtz writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START, 0b0110); 15817ff8e18SSteffen Görtz actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_IN) & 0x01; 15917ff8e18SSteffen Görtz g_assert_cmpuint(actual, ==, 0x00); 16017ff8e18SSteffen Görtz writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START, 0x02); 16117ff8e18SSteffen Görtz qtest_set_irq_in(global_qtest, "/machine/nrf51", "unnamed-gpio-in", 0, -1); 16217ff8e18SSteffen Görtz 16317ff8e18SSteffen Görtz /* Check Output propagates */ 16417ff8e18SSteffen Görtz irq_intercept_out("/machine/nrf51"); 16517ff8e18SSteffen Görtz writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START, 0b0011); 16617ff8e18SSteffen Görtz writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_OUTSET, 0x01); 16717ff8e18SSteffen Görtz g_assert_true(get_irq(0)); 16817ff8e18SSteffen Görtz writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_OUTCLR, 0x01); 16917ff8e18SSteffen Görtz g_assert_false(get_irq(0)); 17017ff8e18SSteffen Görtz 17117ff8e18SSteffen Görtz /* Check self-stimulation */ 17217ff8e18SSteffen Görtz writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START, 0b01); 17317ff8e18SSteffen Görtz writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_OUTSET, 0x01); 17417ff8e18SSteffen Görtz actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_IN) & 0x01; 17517ff8e18SSteffen Görtz g_assert_cmpuint(actual, ==, 0x01); 17617ff8e18SSteffen Görtz 17717ff8e18SSteffen Görtz writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_OUTCLR, 0x01); 17817ff8e18SSteffen Görtz actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_IN) & 0x01; 17917ff8e18SSteffen Görtz g_assert_cmpuint(actual, ==, 0x00); 18017ff8e18SSteffen Görtz 18117ff8e18SSteffen Görtz /* 18217ff8e18SSteffen Görtz * Check short-circuit - generates an guest_error which must be checked 18317ff8e18SSteffen Görtz * manually as long as qtest can not scan qemu_log messages 18417ff8e18SSteffen Görtz */ 18517ff8e18SSteffen Görtz writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START, 0b01); 18617ff8e18SSteffen Görtz writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_OUTSET, 0x01); 18717ff8e18SSteffen Görtz qtest_set_irq_in(global_qtest, "/machine/nrf51", "unnamed-gpio-in", 0, 0); 18817ff8e18SSteffen Görtz } 18917ff8e18SSteffen Görtz 1907ec543e4SSteffen Görtz static void timer_task(hwaddr task) 1917ec543e4SSteffen Görtz { 1927ec543e4SSteffen Görtz writel(NRF51_TIMER_BASE + task, NRF51_TRIGGER_TASK); 1937ec543e4SSteffen Görtz } 1947ec543e4SSteffen Görtz 1957ec543e4SSteffen Görtz static void timer_clear_event(hwaddr event) 1967ec543e4SSteffen Görtz { 1977ec543e4SSteffen Görtz writel(NRF51_TIMER_BASE + event, NRF51_EVENT_CLEAR); 1987ec543e4SSteffen Görtz } 1997ec543e4SSteffen Görtz 2007ec543e4SSteffen Görtz static void timer_set_bitmode(uint8_t mode) 2017ec543e4SSteffen Görtz { 2027ec543e4SSteffen Görtz writel(NRF51_TIMER_BASE + NRF51_TIMER_REG_BITMODE, mode); 2037ec543e4SSteffen Görtz } 2047ec543e4SSteffen Görtz 2057ec543e4SSteffen Görtz static void timer_set_prescaler(uint8_t prescaler) 2067ec543e4SSteffen Görtz { 2077ec543e4SSteffen Görtz writel(NRF51_TIMER_BASE + NRF51_TIMER_REG_PRESCALER, prescaler); 2087ec543e4SSteffen Görtz } 2097ec543e4SSteffen Görtz 2107ec543e4SSteffen Görtz static void timer_set_cc(size_t idx, uint32_t value) 2117ec543e4SSteffen Görtz { 2127ec543e4SSteffen Görtz writel(NRF51_TIMER_BASE + NRF51_TIMER_REG_CC0 + idx * 4, value); 2137ec543e4SSteffen Görtz } 2147ec543e4SSteffen Görtz 2157ec543e4SSteffen Görtz static void timer_assert_events(uint32_t ev0, uint32_t ev1, uint32_t ev2, 2167ec543e4SSteffen Görtz uint32_t ev3) 2177ec543e4SSteffen Görtz { 2187ec543e4SSteffen Görtz g_assert(readl(NRF51_TIMER_BASE + NRF51_TIMER_EVENT_COMPARE_0) == ev0); 2197ec543e4SSteffen Görtz g_assert(readl(NRF51_TIMER_BASE + NRF51_TIMER_EVENT_COMPARE_1) == ev1); 2207ec543e4SSteffen Görtz g_assert(readl(NRF51_TIMER_BASE + NRF51_TIMER_EVENT_COMPARE_2) == ev2); 2217ec543e4SSteffen Görtz g_assert(readl(NRF51_TIMER_BASE + NRF51_TIMER_EVENT_COMPARE_3) == ev3); 2227ec543e4SSteffen Görtz } 2237ec543e4SSteffen Görtz 2247ec543e4SSteffen Görtz static void test_nrf51_timer(void) 2257ec543e4SSteffen Görtz { 2267ec543e4SSteffen Görtz uint32_t steps_to_overflow = 408; 2277ec543e4SSteffen Görtz 2287ec543e4SSteffen Görtz /* Compare Match */ 2297ec543e4SSteffen Görtz timer_task(NRF51_TIMER_TASK_STOP); 2307ec543e4SSteffen Görtz timer_task(NRF51_TIMER_TASK_CLEAR); 2317ec543e4SSteffen Görtz 2327ec543e4SSteffen Görtz timer_clear_event(NRF51_TIMER_EVENT_COMPARE_0); 2337ec543e4SSteffen Görtz timer_clear_event(NRF51_TIMER_EVENT_COMPARE_1); 2347ec543e4SSteffen Görtz timer_clear_event(NRF51_TIMER_EVENT_COMPARE_2); 2357ec543e4SSteffen Görtz timer_clear_event(NRF51_TIMER_EVENT_COMPARE_3); 2367ec543e4SSteffen Görtz 2377ec543e4SSteffen Görtz timer_set_bitmode(NRF51_TIMER_WIDTH_16); /* 16 MHz Timer */ 2387ec543e4SSteffen Görtz timer_set_prescaler(0); 2397ec543e4SSteffen Görtz /* Swept over in first step */ 2407ec543e4SSteffen Görtz timer_set_cc(0, 2); 2417ec543e4SSteffen Görtz /* Barely miss on first step */ 2427ec543e4SSteffen Görtz timer_set_cc(1, 162); 2437ec543e4SSteffen Görtz /* Spot on on third step */ 2447ec543e4SSteffen Görtz timer_set_cc(2, 480); 2457ec543e4SSteffen Görtz 2467ec543e4SSteffen Görtz timer_assert_events(0, 0, 0, 0); 2477ec543e4SSteffen Görtz 2487ec543e4SSteffen Görtz timer_task(NRF51_TIMER_TASK_START); 2497ec543e4SSteffen Görtz clock_step(10000); 2507ec543e4SSteffen Görtz timer_assert_events(1, 0, 0, 0); 2517ec543e4SSteffen Görtz 2527ec543e4SSteffen Görtz /* Swept over on first overflow */ 2537ec543e4SSteffen Görtz timer_set_cc(3, 114); 2547ec543e4SSteffen Görtz 2557ec543e4SSteffen Görtz clock_step(10000); 2567ec543e4SSteffen Görtz timer_assert_events(1, 1, 0, 0); 2577ec543e4SSteffen Görtz 2587ec543e4SSteffen Görtz clock_step(10000); 2597ec543e4SSteffen Görtz timer_assert_events(1, 1, 1, 0); 2607ec543e4SSteffen Görtz 2617ec543e4SSteffen Görtz /* Wrap time until internal counter overflows */ 2627ec543e4SSteffen Görtz while (steps_to_overflow--) { 2637ec543e4SSteffen Görtz timer_assert_events(1, 1, 1, 0); 2647ec543e4SSteffen Görtz clock_step(10000); 2657ec543e4SSteffen Görtz } 2667ec543e4SSteffen Görtz 2677ec543e4SSteffen Görtz timer_assert_events(1, 1, 1, 1); 2687ec543e4SSteffen Görtz 2697ec543e4SSteffen Görtz timer_clear_event(NRF51_TIMER_EVENT_COMPARE_0); 2707ec543e4SSteffen Görtz timer_clear_event(NRF51_TIMER_EVENT_COMPARE_1); 2717ec543e4SSteffen Görtz timer_clear_event(NRF51_TIMER_EVENT_COMPARE_2); 2727ec543e4SSteffen Görtz timer_clear_event(NRF51_TIMER_EVENT_COMPARE_3); 2737ec543e4SSteffen Görtz timer_assert_events(0, 0, 0, 0); 2747ec543e4SSteffen Görtz 2757ec543e4SSteffen Görtz timer_task(NRF51_TIMER_TASK_STOP); 2767ec543e4SSteffen Görtz 2777ec543e4SSteffen Görtz /* Test Proposal: Stop/Shutdown */ 2787ec543e4SSteffen Görtz /* Test Proposal: Shortcut Compare -> Clear */ 2797ec543e4SSteffen Görtz /* Test Proposal: Shortcut Compare -> Stop */ 2807ec543e4SSteffen Görtz /* Test Proposal: Counter Mode */ 2817ec543e4SSteffen Görtz } 2827ec543e4SSteffen Görtz 28317ff8e18SSteffen Görtz int main(int argc, char **argv) 28417ff8e18SSteffen Görtz { 28517ff8e18SSteffen Görtz int ret; 28617ff8e18SSteffen Görtz 28717ff8e18SSteffen Görtz g_test_init(&argc, &argv, NULL); 28817ff8e18SSteffen Görtz 28917ff8e18SSteffen Görtz global_qtest = qtest_initf("-machine microbit"); 29017ff8e18SSteffen Görtz 29117ff8e18SSteffen Görtz qtest_add_func("/microbit/nrf51/gpio", test_nrf51_gpio); 2927ec543e4SSteffen Görtz qtest_add_func("/microbit/nrf51/timer", test_nrf51_timer); 293*b36356f6SStefan Hajnoczi qtest_add_func("/microbit/microbit/i2c", test_microbit_i2c); 29417ff8e18SSteffen Görtz 29517ff8e18SSteffen Görtz ret = g_test_run(); 29617ff8e18SSteffen Görtz 29717ff8e18SSteffen Görtz qtest_quit(global_qtest); 29817ff8e18SSteffen Görtz return ret; 29917ff8e18SSteffen Görtz } 300