Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 | /* * Copyright (c) 2012-2014 Wind River Systems, Inc. * Copyright (c) 2016 Intel Corporation * * SPDX-License-Identifier: Apache-2.0 */ #include <misc/printk.h> #include <zephyr.h> #include <ipm.h> #include <ipm/ipm_quark_se.h> QUARK_SE_IPM_DEFINE(ping_ipm, 0, QUARK_SE_IPM_OUTBOUND); QUARK_SE_IPM_DEFINE(message_ipm0, 1, QUARK_SE_IPM_OUTBOUND); QUARK_SE_IPM_DEFINE(message_ipm1, 2, QUARK_SE_IPM_OUTBOUND); QUARK_SE_IPM_DEFINE(message_ipm2, 3, QUARK_SE_IPM_OUTBOUND); /* specify delay between greetings (in ms); compute equivalent in ticks */ #define SLEEPTIME 1000 #define PING_TIME 1000 #define STACKSIZE 2000 #define MSG_FIBER_PRI 6 #define MAIN_FIBER_PRI 2 #define PING_FIBER_PRI 4 #define TASK_PRIO 7 K_THREAD_STACK_ARRAY_DEFINE(thread_stacks, 2, STACKSIZE); static struct k_thread threads[2]; u32_t scss_reg(u32_t offset) { volatile u32_t *ret = (volatile u32_t *)(SCSS_REGISTER_BASE + offset); return *ret; } static const char dat1[] = "abcdefghijklmno"; static const char dat2[] = "pqrstuvwxyz0123"; void message_source(struct device *ipm) { u8_t counter = 0; printk("sending messages for IPM device %p\n", ipm); while (1) { ipm_send(ipm, 1, counter++, dat1, 16); ipm_send(ipm, 1, counter++, dat2, 16); } } void message_source_task_0(void) { message_source(device_get_binding("message_ipm0")); } void message_source_task_1(void) { message_source(device_get_binding("message_ipm1")); } void message_source_task_2(void) { message_source(device_get_binding("message_ipm2")); } void ping_source_thread(void *arg1, void *arg2, void *arg3) { ARG_UNUSED(arg1); ARG_UNUSED(arg2); ARG_UNUSED(arg3); struct device *ipm = device_get_binding("ping_ipm"); while (1) { k_sleep(PING_TIME); printk("pinging sensor subsystem (ARC) for counter status\n"); ipm_send(ipm, 1, 0, NULL, 0); } } void main_thread(void *arg1, void *arg2, void *arg3) { ARG_UNUSED(arg1); ARG_UNUSED(arg2); ARG_UNUSED(arg3); int ctr = 0; u32_t ss_sts; while (1) { /* say "hello" */ printk("Hello from application processor (x86)! (%d) ", ctr++); ss_sts = scss_reg(SCSS_SS_STS); switch (ss_sts) { case 0x4000: printk("Sensor Subsystem (ARC) is halted"); break; case 0x0400: printk("Sensor Subsystem (ARC) is sleeping"); break; case 0: printk("Sensor Subsystem (ARC) is running"); break; default: printk("Sensor Subsystem (ARC) status: %x", ss_sts); break; } printk(", mailbox status: %x mask %x\n", scss_reg(0xac0), scss_reg(0x4a0)); /* wait a while, then let other task have a turn */ k_sleep(SLEEPTIME); } } K_THREAD_DEFINE(MSG_TASK0, STACKSIZE, message_source_task_0, NULL, NULL, NULL, TASK_PRIO, 0, K_NO_WAIT); K_THREAD_DEFINE(MSG_TASK1, STACKSIZE, message_source_task_1, NULL, NULL, NULL, TASK_PRIO, 0, K_NO_WAIT); K_THREAD_DEFINE(MSG_TASK2, STACKSIZE, message_source_task_2, NULL, NULL, NULL, TASK_PRIO, 0, K_NO_WAIT); void main(void) { printk("===== app started ========\n"); k_thread_create(&threads[0], &thread_stacks[0][0], STACKSIZE, main_thread, 0, 0, 0, K_PRIO_COOP(MAIN_FIBER_PRI), 0, 0); k_thread_create(&threads[1], &thread_stacks[1][0], STACKSIZE, ping_source_thread, 0, 0, 0, K_PRIO_COOP(PING_FIBER_PRI), 0, 0); } |