From 172cf16f8f494add5f0910951d9b71901efe56ce Mon Sep 17 00:00:00 2001 From: Dino Tinitigan Date: Tue, 2 Aug 2016 11:58:32 -0700 Subject: [PATCH 1/9] CODK-M firmware changes -add CurieSMC library -changes for cdc-acm compatibility -changes for zephyr based firmware compatibility --- libraries/CurieSMC/keywords.txt | 23 ++++++ libraries/CurieSMC/library.properties | 9 +++ libraries/CurieSMC/src/CurieSMC.cpp | 78 +++++++++++++++++++ libraries/CurieSMC/src/CurieSMC.h | 31 ++++++++ .../framework/include/platform.h | 37 +++++++++ variants/arduino_101/linker_scripts/flash.ld | 2 +- 6 files changed, 179 insertions(+), 1 deletion(-) create mode 100644 libraries/CurieSMC/keywords.txt create mode 100644 libraries/CurieSMC/library.properties create mode 100644 libraries/CurieSMC/src/CurieSMC.cpp create mode 100644 libraries/CurieSMC/src/CurieSMC.h diff --git a/libraries/CurieSMC/keywords.txt b/libraries/CurieSMC/keywords.txt new file mode 100644 index 00000000..74472aa0 --- /dev/null +++ b/libraries/CurieSMC/keywords.txt @@ -0,0 +1,23 @@ +####################################### +# Syntax Coloring Map For CurieSMC +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +CurieSMC KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +write KEYWORD2 +reaD KEYWORD2 +begin KEYWORD2 +end KEYWORD2 +availableForRead KEYWORD2 +availableForWrite KEYWORD2 +####################################### +# Constants (LITERAL1) +####################################### diff --git a/libraries/CurieSMC/library.properties b/libraries/CurieSMC/library.properties new file mode 100644 index 00000000..1110f35a --- /dev/null +++ b/libraries/CurieSMC/library.properties @@ -0,0 +1,9 @@ +name=CurieSMC +version=1.0 +author=Intel +maintainer=Intel +sentence=Enables passing of data between the quark and ARC cores +paragraph= +category=Communication +url= +architectures=arc32 diff --git a/libraries/CurieSMC/src/CurieSMC.cpp b/libraries/CurieSMC/src/CurieSMC.cpp new file mode 100644 index 00000000..c62986cd --- /dev/null +++ b/libraries/CurieSMC/src/CurieSMC.cpp @@ -0,0 +1,78 @@ + +#include "CurieSMC.h" + +CurieSMC SMC; +void CurieSMC::begin() +{ + QUARK_BUFF_HEAD = 0; + QUARK_BUFF_TAIL = 0; + QUARK_BUFF_FLAG = 2; + ARC_BUFF_HEAD = 0; + ARC_BUFF_TAIL = 0; + ARC_BUFF_FLAG = 2; +} +int CurieSMC::write(uint8_t data) +{ + //check if buffer is available + if(ARC_BUFF_FLAG == 1) + { + return 1; + } + + //lock the buffer + ARC_BUFF_FLAG = 0; + + int new_head = (int)(ARC_BUFF_HEAD+1)%SHARED_BUFFER_SIZE; + if(new_head != ARC_BUFF_TAIL) + { + ARC_BUFF[ARC_BUFF_HEAD] = data; + ARC_BUFF_HEAD = new_head; + } + else + { + return 2; //buffer is full + } + + //unlock the buffer + ARC_BUFF_FLAG = 2; + + return 0; +} + +uint8_t CurieSMC::read() +{ + //check if buffer is available + if(QUARK_BUFF_FLAG == 1) + return 0; + + //lock the buffer + QUARK_BUFF_FLAG = 0; + + if(availableForRead()) + { + uint8_t data = QUARK_BUFF[QUARK_BUFF_TAIL]; + QUARK_BUFF_TAIL = (QUARK_BUFF_TAIL + 1) % SHARED_BUFFER_SIZE; + QUARK_BUFF_FLAG = 2; //unlock the buffer + return data; + } + else + { + QUARK_BUFF_FLAG = 2; //unlock the buffer + return 0; + } +} + +int CurieSMC::availableForWrite() +{ + int head = ARC_BUFF_HEAD; + int tail = ARC_BUFF_TAIL; + + if(head >= tail) + return SHARED_BUFFER_SIZE - head + tail - 1; + return tail - head - 1; +} + +int CurieSMC::availableForRead() +{ + return (int)(SHARED_BUFFER_SIZE + QUARK_BUFF_HEAD-QUARK_BUFF_TAIL) % SHARED_BUFFER_SIZE; +} diff --git a/libraries/CurieSMC/src/CurieSMC.h b/libraries/CurieSMC/src/CurieSMC.h new file mode 100644 index 00000000..32219239 --- /dev/null +++ b/libraries/CurieSMC/src/CurieSMC.h @@ -0,0 +1,31 @@ + +#define QUARK_BUFF shared_data->quark_to_ARC.data +#define QUARK_BUFF_HEAD shared_data->quark_to_ARC.head +#define QUARK_BUFF_TAIL shared_data->quark_to_ARC.tail +#define QUARK_BUFF_FLAG shared_data->quark_to_ARC.flag +#define ARC_BUFF shared_data->ARC_to_quark.data +#define ARC_BUFF_HEAD shared_data->ARC_to_quark.head +#define ARC_BUFF_TAIL shared_data->ARC_to_quark.tail +#define ARC_BUFF_FLAG shared_data->ARC_to_quark.flag + +#include "Arduino.h" +#include "platform.h" + +class CurieSMC +{ +public: + CurieSMC() + { + } + + void begin(); + void end(); + int write(uint8_t data); + uint8_t read(); + int availableForWrite(); + int availableForRead(); + +private: +}; + +extern CurieSMC SMC; \ No newline at end of file diff --git a/system/libarc32_arduino101/framework/include/platform.h b/system/libarc32_arduino101/framework/include/platform.h index 583fcf71..3fe25184 100644 --- a/system/libarc32_arduino101/framework/include/platform.h +++ b/system/libarc32_arduino101/framework/include/platform.h @@ -40,6 +40,7 @@ #define NUM_CPU 4 #define CDCACM_BUFFER_SIZE 256 +#define SHARED_BUFFER_SIZE 64 struct cdc_ring_buffer { @@ -62,6 +63,30 @@ struct cdc_acm_shared_data { int device_open; }; +struct shared_ring_buffer +{ + /** Ring buffer data */ + volatile uint8_t data[SHARED_BUFFER_SIZE]; + /** Ring buffer head index, modified by producer */ + volatile int head; + /** Ring buffer tail index, modified by consumer */ + volatile int tail; + + /** Buffer status + * 0 - locked by X86 core + * 1 - locked by arc core + * 2 - available to be taken by any core + **/ + volatile int flag; +}; + +struct ipm_shared_data +{ + struct shared_ring_buffer *quark_buffer; + struct shared_ring_buffer *arc_buffer; +}; + + /** * LMT / ARC global shared structure. This structure lies in the beginning of * the RAM. @@ -109,6 +134,18 @@ struct platform_shared_block_ { * The ARC core counts on QRK to find valid pointers in place. */ struct cdc_acm_shared_data * cdc_acm_buffers; + + struct cdc_acm_shared_data cdc_acm_buffers_obj; + + struct cdc_ring_buffer cdc_acm_shared_rx_buffer; + struct cdc_ring_buffer cdc_acm_shared_tx_buffer; + + struct ipm_shared_data *ipm_shared_data_ptr; + + struct ipm_shared_data ipm_shared_data_obj; + + struct shared_ring_buffer quark_to_ARC; + struct shared_ring_buffer ARC_to_quark; }; #define RAM_START 0xA8000000 diff --git a/variants/arduino_101/linker_scripts/flash.ld b/variants/arduino_101/linker_scripts/flash.ld index e75a7059..d506a5a4 100644 --- a/variants/arduino_101/linker_scripts/flash.ld +++ b/variants/arduino_101/linker_scripts/flash.ld @@ -40,7 +40,7 @@ OUTPUT_FORMAT("elf32-littlearc", "elf32-bigarc", "elf32-littlearc") MEMORY { FLASH (rx) : ORIGIN = 0x40034000, LENGTH = 152K - SRAM (wx) : ORIGIN = 0xa800e000, LENGTH = 24K + SRAM (wx) : ORIGIN = 0xa8000400, LENGTH = 24K DCCM (wx) : ORIGIN = 0x80000000, LENGTH = 8K } From 74187c1901bff59071d6152dd0c8860e95e65afd Mon Sep 17 00:00:00 2001 From: Dino Tinitigan Date: Mon, 8 Aug 2016 16:39:47 -0700 Subject: [PATCH 2/9] CurieSMC library fixes -properly set flags for both cores during read() and write() -add example sketch for CurieSMC library --- .../CurieSMC/examples/smcTest/smcTest.ino | 60 +++++++++++++++++++ libraries/CurieSMC/src/CurieSMC.cpp | 18 +++--- 2 files changed, 67 insertions(+), 11 deletions(-) create mode 100644 libraries/CurieSMC/examples/smcTest/smcTest.ino diff --git a/libraries/CurieSMC/examples/smcTest/smcTest.ino b/libraries/CurieSMC/examples/smcTest/smcTest.ino new file mode 100644 index 00000000..4b56df97 --- /dev/null +++ b/libraries/CurieSMC/examples/smcTest/smcTest.ino @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2016 Intel Corporation. All rights reserved. + * See the bottom of this file for the license terms. + */ + +/* + * This sketch example demonstrates a simple way to use the Shared Memory Communication library between + * the ARC and Quark cores. + * It requires that the firmware be upgraded to one that supports the Shared Memory Communication library. + * This sketch example will need to be used with the smc example built using the CODK-M tree. + * + * This sketch sends values to the Quark core which then reads those values, doubles them and sends it back to the ARC core. + * This sketch then reads those values and displays the doubled values. + */ + +#include + +void setup() +{ + Serial.begin(384000); + while(!Serial); + SMC.begin(); +} + +void loop() +{ + for(int i = 0; i < 32; i++) + { + Serial.print("writing : "); + Serial.println(i); + SMC.write(i); + } + while(SMC.availableForRead()) + { + Serial.print("data: "); + Serial.println(SMC.read()); + } + + delay(1000); +} + +/* + Copyright (c) 2016 Intel Corporation. All rights reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +*/ + diff --git a/libraries/CurieSMC/src/CurieSMC.cpp b/libraries/CurieSMC/src/CurieSMC.cpp index c62986cd..a7ec3124 100644 --- a/libraries/CurieSMC/src/CurieSMC.cpp +++ b/libraries/CurieSMC/src/CurieSMC.cpp @@ -14,13 +14,11 @@ void CurieSMC::begin() int CurieSMC::write(uint8_t data) { //check if buffer is available - if(ARC_BUFF_FLAG == 1) - { + if(ARC_BUFF_FLAG == 0) return 1; - } //lock the buffer - ARC_BUFF_FLAG = 0; + ARC_BUFF_FLAG = 1; int new_head = (int)(ARC_BUFF_HEAD+1)%SHARED_BUFFER_SIZE; if(new_head != ARC_BUFF_TAIL) @@ -30,23 +28,21 @@ int CurieSMC::write(uint8_t data) } else { + ARC_BUFF_FLAG = 2; //unlock the buffer return 2; //buffer is full } - - //unlock the buffer - ARC_BUFF_FLAG = 2; - + + ARC_BUFF_FLAG = 2; //unlock the buffer return 0; } uint8_t CurieSMC::read() { //check if buffer is available - if(QUARK_BUFF_FLAG == 1) - return 0; + while(QUARK_BUFF_FLAG == 0); //wait for Quark core to release the buffer //lock the buffer - QUARK_BUFF_FLAG = 0; + QUARK_BUFF_FLAG = 1; if(availableForRead()) { From 907faf7f297e73e616a8cb4f2d43cb3e5e856a78 Mon Sep 17 00:00:00 2001 From: "erik.nyquist" Date: Thu, 1 Sep 2016 10:36:11 -0700 Subject: [PATCH 3/9] Add CurieMailbox library Zephyr sample applications to go with the example sketches can be found in CODK-M-X86-Samples --- libraries/CurieMailbox/CurieMailbox.cpp | 211 ++++++++++++++++++ libraries/CurieMailbox/CurieMailbox.h | 23 ++ libraries/CurieMailbox/CurieMailboxMsg.h | 13 ++ libraries/CurieMailbox/README.txt | 111 +++++++++ .../examples/SharedCounter/SharedCounter.ino | 82 +++++++ .../CurieMailbox/examples/String/String.ino | 64 ++++++ libraries/CurieMailbox/keywords.txt | 22 ++ libraries/CurieMailbox/library.properties | 11 + 8 files changed, 537 insertions(+) create mode 100644 libraries/CurieMailbox/CurieMailbox.cpp create mode 100644 libraries/CurieMailbox/CurieMailbox.h create mode 100644 libraries/CurieMailbox/CurieMailboxMsg.h create mode 100644 libraries/CurieMailbox/README.txt create mode 100644 libraries/CurieMailbox/examples/SharedCounter/SharedCounter.ino create mode 100644 libraries/CurieMailbox/examples/String/String.ino create mode 100644 libraries/CurieMailbox/keywords.txt create mode 100644 libraries/CurieMailbox/library.properties diff --git a/libraries/CurieMailbox/CurieMailbox.cpp b/libraries/CurieMailbox/CurieMailbox.cpp new file mode 100644 index 00000000..c0113122 --- /dev/null +++ b/libraries/CurieMailbox/CurieMailbox.cpp @@ -0,0 +1,211 @@ +#include "interrupt.h" +#include "scss_registers.h" +#include "CurieMailboxMsg.h" +#include "CurieMailbox.h" + +#define BUFSIZE 33 +#define NUM_CHANNELS 8 +#define CHANNEL_STS_MASK 0x1 +#define CHANNEL_INT_MASK 0x2 +#define CTRL_WORD_MASK 0x7FFFFFFF +#define CHALL_STATUS_MASK 0xFFFF +#define CHANNEL_STS_BITS (CHANNEL_STS_MASK | CHANNEL_INT_MASK) + +#define CAP_CHAN(chan) chan = (chan >= NUM_CHANNELS) ? \ + NUM_CHANNELS - 1 : chan + +/* Mailbox channel status register */ +#define IO_REG_MAILBOX_CHALL_STS (SCSS_REGISTER_BASE + 0xAC0) + +static CurieMailboxMsg buf[BUFSIZE]; +static volatile unsigned int head; +static unsigned int tail; + +typedef struct mbox_channel mbox_channel_t; +typedef struct mbox_intmask mbox_intmask_t; + +/* Represents the registers for a single mailbox channel */ +struct mbox_channel { + uint32_t ctrl; + uint32_t data[CHANNEL_DATA_WORDS]; + uint32_t sts; +}; + +/* Mailbox interrupt mask; right now we only care about the + * second byte, for SS mailbox interrupts (one bit per mailbox channel) */ +struct mbox_intmask { + uint8_t lmt_intmask; + uint8_t ss_intmask; + uint8_t lmt_halt; + uint8_t ss_halt; +}; + +static volatile mbox_intmask_t *intmask; +static volatile mbox_channel_t *mbox; + +CurieMailboxClass::CurieMailboxClass (void) +{ + intmask = (mbox_intmask_t *)IO_REG_MAILBOX_INT_MASK; + mbox = (mbox_channel_t *)IO_REG_MAILBOX_BASE; + head = 0; + tail = 0; +} + +CurieMailboxClass CurieMailbox = CurieMailboxClass(); + +static void buf_put (CurieMailboxMsg msg) +{ + if (CurieMailbox.available() == (BUFSIZE - 1)) { + /* Full- drop the new message */ + return; + } + + buf[head] = msg; + head = (head + 1) % BUFSIZE; +} + +static uint16_t get_chall_sts (void) +{ + return MMIO_REG_VAL(IO_REG_MAILBOX_CHALL_STS) & CHALL_STATUS_MASK; +} + +static void read_channel (int channel) +{ + int i; + CurieMailboxMsg msg; + + /* Copy channel data into CurieMailboxMsg object */ + msg.id = mbox[channel].ctrl & CTRL_WORD_MASK; + msg.channel = channel; + + for (i = 0; i < CHANNEL_DATA_WORDS; ++i) { + msg.data[i] = mbox[channel].data[i]; + } + + /* Add CurieMailboxMsg object to buffer */ + buf_put(msg); + + /* Clear channel status & interrupt flags */ + mbox[channel].sts |= CHANNEL_STS_BITS; +} + +static void write_channel (CurieMailboxMsg msg) +{ + int i; + uint32_t key; + + /* Can't write if channel status flag is set */ + while ((mbox[msg.channel].sts & CHANNEL_STS_MASK)); + + key = interrupt_lock(); + /* Poplate channel payload */ + mbox[msg.channel].ctrl |= (msg.id & CTRL_WORD_MASK); + for (i = 0; i < CHANNEL_DATA_WORDS; ++i) { + mbox[msg.channel].data[i] = msg.data[i]; + } + + /* Trigger interupt to host */ + mbox[msg.channel].ctrl |= ~(CTRL_WORD_MASK); + + /* Wait for HW to set the channel status bit */ + while (!(mbox[msg.channel].sts & CHANNEL_STS_MASK)); + + /* Wait for destination processor to clear channel status bit */ + while ((mbox[msg.channel].sts & CHANNEL_STS_MASK)); + interrupt_unlock(key); +} + +static void mbox_isr (void) +{ + int i; + uint32_t sts; + + sts = get_chall_sts(); + /* Get channel number */ + for (i = 0; i < NUM_CHANNELS; ++i) { + if (sts & (1 << (i * 2 + 1))) { + break; + } + } + + read_channel(i); +} + +static void mbox_hardware_init (void) +{ + int i; + + for (i = 0; i < NUM_CHANNELS; ++i) { + mbox[i].sts &= ~(CHANNEL_STS_BITS); + } +} + +static void mbox_interrupts_init (bool master) +{ + interrupt_disable(SOC_MBOX_INTERRUPT); + + /* Mask SS mailbox interrupts for all channels; + * Unmasking is done by enableReceive */ + intmask->ss_intmask = 0xFF; + + if (master) mbox_hardware_init(); + interrupt_connect(SOC_MBOX_INTERRUPT, mbox_isr); + interrupt_enable(SOC_MBOX_INTERRUPT); +} + +int CurieMailboxClass::available (void) +{ + return ((head + BUFSIZE) - tail) % BUFSIZE; +} + +void CurieMailboxClass::enableReceive (unsigned int channel) +{ + CAP_CHAN(channel); + intmask->ss_intmask &= ~(1 << channel); +} + +void CurieMailboxClass::disableReceive (unsigned int channel) +{ + CAP_CHAN(channel); + intmask->ss_intmask |= 1 << channel; +} + +void CurieMailboxClass::begin (void) +{ + mbox_interrupts_init(false); +} + +void CurieMailboxClass::begin (bool master) +{ + mbox_interrupts_init(master); +} + +void CurieMailboxClass::end (void) +{ + /* Wait for all channels to be inactive */ + while (get_chall_sts()); + + interrupt_disable(SOC_MBOX_INTERRUPT); + interrupt_disconnect(SOC_MBOX_INTERRUPT); +} + +void CurieMailboxClass::put (CurieMailboxMsg msg) +{ + if (msg.channel > (NUM_CHANNELS - 1)) { + msg.channel = NUM_CHANNELS - 1; + } + + write_channel(msg); +} + +CurieMailboxMsg CurieMailboxClass::get (void) +{ + CurieMailboxMsg msg; + + if (head != tail) { + msg = buf[tail]; + tail = (tail + 1) % BUFSIZE; + } + + return msg; +} diff --git a/libraries/CurieMailbox/CurieMailbox.h b/libraries/CurieMailbox/CurieMailbox.h new file mode 100644 index 00000000..e6460809 --- /dev/null +++ b/libraries/CurieMailbox/CurieMailbox.h @@ -0,0 +1,23 @@ +#ifndef _CURIEMAILBOX_H_ +#define _CURIEMAILBOX_H_ + +#include "CurieMailboxMsg.h" + +class CurieMailboxClass { +public: + CurieMailboxClass (void); + void begin (void); + void begin (bool master); + void end (void); + + void enableReceive (unsigned int channel); + void disableReceive (unsigned int channel); + + int available (void); + void put (CurieMailboxMsg msg); + CurieMailboxMsg get (void); +}; + +extern CurieMailboxClass CurieMailbox; + +#endif diff --git a/libraries/CurieMailbox/CurieMailboxMsg.h b/libraries/CurieMailbox/CurieMailboxMsg.h new file mode 100644 index 00000000..c0399f9a --- /dev/null +++ b/libraries/CurieMailbox/CurieMailboxMsg.h @@ -0,0 +1,13 @@ +#ifndef _CURIEMAILBOXMSG_H_ +#define _CURIEMAILBOXMSG_H_ + +#define CHANNEL_DATA_WORDS 4 + +class CurieMailboxMsg { +public: + uint32_t data[CHANNEL_DATA_WORDS]; + uint32_t id; + unsigned int channel = 0; +}; + +#endif diff --git a/libraries/CurieMailbox/README.txt b/libraries/CurieMailbox/README.txt new file mode 100644 index 00000000..e89af393 --- /dev/null +++ b/libraries/CurieMailbox/README.txt @@ -0,0 +1,111 @@ +CurieMailbox library for Arduino/Genuino 101 + +Overview: + +This library provides access to the inter-processor mailbox that allows +interrupt-based communication between the x86 and ARC cores contained in the +Curie module (in such a transaction, the message sender is referred to as the +"source" processor, and the recipient as the destination processor). Note that +using this library to send a message to the mailbox, when there is no +application running at the destination to receive it, will cause the source +processor busy-wait indefinitely. + +Message format: + +The CurieMailbox library uses the CurieMailboxMsg class to describe a message +for the mailbox. In total, a mailbox message contains 17 bytes of data that you +can fill. Here's how you might populate a CurieMailboxMsg; + + #include "CurieMailbox.h" + CurieMailboxMsg msg; + + /* ID can be any 31-bit value */ + msg.id = 0x7FFFFF; + + /* Data payload is an array of 4 32-bit values */ + msg.data[0] = 0xDEADBEEF; + msg.data[1] = 0xCAFEBABE; + msg.data[2] = 0xFFFFFFFF; + msg.data[3] = 0x00000000; + + /* And the channel on which the message will be sent */ + msg.channel = 6; + +API reference: + + +void CurieMailbox::begin (bool master) + + Enable interrupts for the mailbox, and optionally initialise the + mailbox hardware. + +Params: + + bool master: flag indicating whether mailbox hardware should be initialised. + The first processor to access the mailbox should do this; if in doubt, set + to false (default is false, no initialisation). + + + +void CurieMailbox::begin (void) + + Enable interrupts for the mailbox, and do not initialise the hardware. + +Params: + + None. + + + +void CurieMailbox::enableReceive (unsigned int channel) + + Unmask interrupts for mailbox channel 'channel', allowing it to receive + messages (channels can always send, only reception has to be enabled). + +Params: + + int channel: integer value (0-7) representing the channel to be enabled. + If the passed value does not represent a valid channel, then the highest + channel will be used instead. + + + +void CurieMailbox::disableReceive (unsigned int channel) + + Mask interrupts for mailbox channel 'channel', so that messages can no longer + be received (but they can still be sent). + +Params: + + int channel: integer value (0-7) representing the channel to be enabled. + If the passed value does not represent a valid channel, then the highest + channel will be used instead. + + +int CurieMailbox::available (void) + + Returns the number of received mailbox messages available for reading. + +Params: + + None + + + +void CurieMailbox::put (CurieMailboxMsg msg) + + Writes the message 'msg' to the mailbox. + +Params: + + CurieMailboxMsg msg: the message to send + + + +CurieMailboxMsg CurieMailbox::get (void) + + Gets the most recently received unread message from the mailbox. + +Params: + + None. diff --git a/libraries/CurieMailbox/examples/SharedCounter/SharedCounter.ino b/libraries/CurieMailbox/examples/SharedCounter/SharedCounter.ino new file mode 100644 index 00000000..23f2e56f --- /dev/null +++ b/libraries/CurieMailbox/examples/SharedCounter/SharedCounter.ino @@ -0,0 +1,82 @@ +/* + * CurieMailbox: Shared Counter example + * + * Requires sample Zephyr application CurieMailbox_SharedCounter running on x86 + * core (get it from https://github.com/01org/CODK-M-X86-Samples) + * + * This example demonstrates sharing a single integer value between the x86 + * and ARC core. This sketch (ARC core) starts by sending a value of 0 using + * CurieMailbox.put(). This is received by the application running on the x86 + * core, which increments the value by 1 and sends it back via the mailbox. + * + * This sketch will read the reply, and again increment it by one and send + * it back to the x86 core through the mailbox. In this way the count value + * will increase indefinitely, with each core performing alternate increments + * and using the mailbox to pass the value in between. + * + * Copyright (c) 2016 Intel Corporation. All rights reserved. + * See the bottom of this file for the license terms. + */ + +#include "CurieMailbox.h" + +uint32_t count = 0; + +int sendChannel = 0; /* We'll send mailbox messages on this channel */ +int receiveChannel = 1; /* And receive them on this channel */ + +void setup (void) { + /* Printing to Serial1, since this example uses custom x86 firmware + * which lacks the CDC-ACM driver that makes the Serial class work */ + Serial1.begin(9600); + + /* Enable the mailbox */ + CurieMailbox.begin(); + + /* Enable channel for receiving messages */ + CurieMailbox.enableReceive(receiveChannel); +} + +void loop (void) { + CurieMailboxMsg outMsg; /* This will store the message we are sending */ + CurieMailboxMsg inMsg; /* This will store the received message */ + + delay(1000); + + outMsg.id = 0; /* ID can be whatever you like */ + outMsg.data[0] = count; /* Data is an array of 4 uint32_t types */ + outMsg.channel = sendChannel; /* Sending this message to sendChannel */ + + CurieMailbox.put(outMsg); /* Send the message */ + + /* Wait for the response */ + while (CurieMailbox.available() == 0); + + /* Read the response */ + inMsg = CurieMailbox.get(); + + Serial1.print("Sent '" + String(outMsg.data[0]) + "' on channel "); + Serial1.print(String(outMsg.channel) + ", got reply '" + String(inMsg.data[0])); + Serial1.println("' on channel " + String(inMsg.channel)); + + /* Update our count value with the value received from mailbox */ + count = inMsg.data[0] + 1; +} + +/* + * Copyright (c) 2016 Intel Corporation. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ diff --git a/libraries/CurieMailbox/examples/String/String.ino b/libraries/CurieMailbox/examples/String/String.ino new file mode 100644 index 00000000..37d0022a --- /dev/null +++ b/libraries/CurieMailbox/examples/String/String.ino @@ -0,0 +1,64 @@ +/* + * CurieMailbox: String example + * + * Requires sample Zephyr application CurieMailbox_String running on x86 core + * (Get it from https://github.com/01org/CODK-M-X86-Samples) + * + * This example demonstrates sending a short (< 16 chars) string from the x86 + * core to the ARC core. The sketch below enables mailbox channnel 0 for + * receiving messages, and for each received message prints out the channel + * payload as a string of ASCII characters. + * + * Copyright (c) 2016 Intel Corporation. All rights reserved. + * See the bottom of this file for the license terms. + */ + +#include "CurieMailbox.h" + +int receiveChannel = 0; /* Receiving messages on this channel */ + +void setup (void) { + /* Printing to Serial1, since this example uses custom x86 firmware + * which lacks the CDC-ACM driver that makes the Serial class work */ + Serial1.begin(9600); + + /* Enable the mailbox */ + CurieMailbox.begin(); + + /* Enable channel for receiving messages */ + CurieMailbox.enableReceive(receiveChannel); +} + +void printMessageAsString (CurieMailboxMsg msg) +{ + char *p = (char *)msg.data; + Serial1.print("Received message '" + String(p) + "' from channel "); + Serial1.println(msg.channel); +} + +void loop (void) { + CurieMailboxMsg inMsg; /* This will store the received message */ + + while (CurieMailbox.available() > 0) { + inMsg = CurieMailbox.get(); + printMessageAsString(inMsg); + } +} + +/* + * Copyright (c) 2016 Intel Corporation. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ diff --git a/libraries/CurieMailbox/keywords.txt b/libraries/CurieMailbox/keywords.txt new file mode 100644 index 00000000..20d9b4e9 --- /dev/null +++ b/libraries/CurieMailbox/keywords.txt @@ -0,0 +1,22 @@ +####################################### +# Syntax Coloring Map CurieMailbox +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +CurieMailbox KEYWORD1 +CurieMailboxMsg KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +begin KEYWORD2 +end KEYWORD2 +enableReceive KEYWORD2 +disableReceive KEYWORD2 +available KEYWORD2 +put KEYWORD2 +get KEYWORD2 diff --git a/libraries/CurieMailbox/library.properties b/libraries/CurieMailbox/library.properties new file mode 100644 index 00000000..29f342b7 --- /dev/null +++ b/libraries/CurieMailbox/library.properties @@ -0,0 +1,11 @@ +name=CurieMailbox +version=1.0 +author=Intel +maintainer=Intel +email=erik.nyquist@intel.com +sentence=Curie Inter-Processor Mailbox Library for Arduino/Genuino 101 +paragraph= +category=Communication +url=http://makers.intel.com +architectures=arc32 +core-dependencies=arduino (>=1.6.3) From af649181217f301182f99145f06a1100b3c57748 Mon Sep 17 00:00:00 2001 From: Erik Nyquist Date: Thu, 15 Sep 2016 15:57:03 -0700 Subject: [PATCH 4/9] Move CurieMailbox files to 'src' directory (#294) --- libraries/CurieMailbox/{ => src}/CurieMailbox.cpp | 0 libraries/CurieMailbox/{ => src}/CurieMailbox.h | 0 libraries/CurieMailbox/{ => src}/CurieMailboxMsg.h | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename libraries/CurieMailbox/{ => src}/CurieMailbox.cpp (100%) rename libraries/CurieMailbox/{ => src}/CurieMailbox.h (100%) rename libraries/CurieMailbox/{ => src}/CurieMailboxMsg.h (100%) diff --git a/libraries/CurieMailbox/CurieMailbox.cpp b/libraries/CurieMailbox/src/CurieMailbox.cpp similarity index 100% rename from libraries/CurieMailbox/CurieMailbox.cpp rename to libraries/CurieMailbox/src/CurieMailbox.cpp diff --git a/libraries/CurieMailbox/CurieMailbox.h b/libraries/CurieMailbox/src/CurieMailbox.h similarity index 100% rename from libraries/CurieMailbox/CurieMailbox.h rename to libraries/CurieMailbox/src/CurieMailbox.h diff --git a/libraries/CurieMailbox/CurieMailboxMsg.h b/libraries/CurieMailbox/src/CurieMailboxMsg.h similarity index 100% rename from libraries/CurieMailbox/CurieMailboxMsg.h rename to libraries/CurieMailbox/src/CurieMailboxMsg.h From 589f5d587d15af21b4eead191d08a963517a3d76 Mon Sep 17 00:00:00 2001 From: Erik Nyquist Date: Thu, 29 Sep 2016 13:28:55 -0700 Subject: [PATCH 5/9] CurieMailbox examples: use Serial instead of Serial1 Mailbox X86 examples now have CDC-ACM support --- .../examples/SharedCounter/SharedCounter.ino | 10 ++++------ libraries/CurieMailbox/examples/String/String.ino | 8 +++----- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/libraries/CurieMailbox/examples/SharedCounter/SharedCounter.ino b/libraries/CurieMailbox/examples/SharedCounter/SharedCounter.ino index 23f2e56f..4e49d108 100644 --- a/libraries/CurieMailbox/examples/SharedCounter/SharedCounter.ino +++ b/libraries/CurieMailbox/examples/SharedCounter/SharedCounter.ino @@ -26,9 +26,7 @@ int sendChannel = 0; /* We'll send mailbox messages on this channel */ int receiveChannel = 1; /* And receive them on this channel */ void setup (void) { - /* Printing to Serial1, since this example uses custom x86 firmware - * which lacks the CDC-ACM driver that makes the Serial class work */ - Serial1.begin(9600); + Serial.begin(9600); /* Enable the mailbox */ CurieMailbox.begin(); @@ -55,9 +53,9 @@ void loop (void) { /* Read the response */ inMsg = CurieMailbox.get(); - Serial1.print("Sent '" + String(outMsg.data[0]) + "' on channel "); - Serial1.print(String(outMsg.channel) + ", got reply '" + String(inMsg.data[0])); - Serial1.println("' on channel " + String(inMsg.channel)); + Serial.print("Sent '" + String(outMsg.data[0]) + "' on channel "); + Serial.print(String(outMsg.channel) + ", got reply '" + String(inMsg.data[0])); + Serial.println("' on channel " + String(inMsg.channel)); /* Update our count value with the value received from mailbox */ count = inMsg.data[0] + 1; diff --git a/libraries/CurieMailbox/examples/String/String.ino b/libraries/CurieMailbox/examples/String/String.ino index 37d0022a..83d08be5 100644 --- a/libraries/CurieMailbox/examples/String/String.ino +++ b/libraries/CurieMailbox/examples/String/String.ino @@ -18,9 +18,7 @@ int receiveChannel = 0; /* Receiving messages on this channel */ void setup (void) { - /* Printing to Serial1, since this example uses custom x86 firmware - * which lacks the CDC-ACM driver that makes the Serial class work */ - Serial1.begin(9600); + Serial.begin(9600); /* Enable the mailbox */ CurieMailbox.begin(); @@ -32,8 +30,8 @@ void setup (void) { void printMessageAsString (CurieMailboxMsg msg) { char *p = (char *)msg.data; - Serial1.print("Received message '" + String(p) + "' from channel "); - Serial1.println(msg.channel); + Serial.print("Received message '" + String(p) + "' from channel "); + Serial.println(msg.channel); } void loop (void) { From 6b5051f8b091d3dd3fcc3af6ec6874e770de70e3 Mon Sep 17 00:00:00 2001 From: Erik Nyquist Date: Fri, 30 Sep 2016 16:42:23 -0700 Subject: [PATCH 6/9] Use ints for public function parameters Arduino users are more comfortable with ints. Use ints instead of 'unsigned' or 'uint*', and the extra check for non-negativity, wherever possible. --- libraries/CurieMailbox/src/CurieMailbox.cpp | 11 ++++------- libraries/CurieMailbox/src/CurieMailbox.h | 4 ++-- libraries/CurieMailbox/src/CurieMailboxMsg.h | 2 +- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/libraries/CurieMailbox/src/CurieMailbox.cpp b/libraries/CurieMailbox/src/CurieMailbox.cpp index c0113122..6d2a732d 100644 --- a/libraries/CurieMailbox/src/CurieMailbox.cpp +++ b/libraries/CurieMailbox/src/CurieMailbox.cpp @@ -12,7 +12,7 @@ #define CHANNEL_STS_BITS (CHANNEL_STS_MASK | CHANNEL_INT_MASK) #define CAP_CHAN(chan) chan = (chan >= NUM_CHANNELS) ? \ - NUM_CHANNELS - 1 : chan + NUM_CHANNELS - 1 : ((chan < 0) ? 0 : chan) /* Mailbox channel status register */ #define IO_REG_MAILBOX_CHALL_STS (SCSS_REGISTER_BASE + 0xAC0) @@ -158,13 +158,13 @@ int CurieMailboxClass::available (void) return ((head + BUFSIZE) - tail) % BUFSIZE; } -void CurieMailboxClass::enableReceive (unsigned int channel) +void CurieMailboxClass::enableReceive (int channel) { CAP_CHAN(channel); intmask->ss_intmask &= ~(1 << channel); } -void CurieMailboxClass::disableReceive (unsigned int channel) +void CurieMailboxClass::disableReceive (int channel) { CAP_CHAN(channel); intmask->ss_intmask |= 1 << channel; @@ -191,10 +191,7 @@ void CurieMailboxClass::end (void) void CurieMailboxClass::put (CurieMailboxMsg msg) { - if (msg.channel > (NUM_CHANNELS - 1)) { - msg.channel = NUM_CHANNELS - 1; - } - + CAP_CHAN(msg.channel); write_channel(msg); } diff --git a/libraries/CurieMailbox/src/CurieMailbox.h b/libraries/CurieMailbox/src/CurieMailbox.h index e6460809..8f0da06c 100644 --- a/libraries/CurieMailbox/src/CurieMailbox.h +++ b/libraries/CurieMailbox/src/CurieMailbox.h @@ -10,8 +10,8 @@ class CurieMailboxClass { void begin (bool master); void end (void); - void enableReceive (unsigned int channel); - void disableReceive (unsigned int channel); + void enableReceive (int channel); + void disableReceive (int channel); int available (void); void put (CurieMailboxMsg msg); diff --git a/libraries/CurieMailbox/src/CurieMailboxMsg.h b/libraries/CurieMailbox/src/CurieMailboxMsg.h index c0399f9a..f9e887d2 100644 --- a/libraries/CurieMailbox/src/CurieMailboxMsg.h +++ b/libraries/CurieMailbox/src/CurieMailboxMsg.h @@ -7,7 +7,7 @@ class CurieMailboxMsg { public: uint32_t data[CHANNEL_DATA_WORDS]; uint32_t id; - unsigned int channel = 0; + int channel = 0; }; #endif From bdc354de119883a5b4bdce6d67aa56adf4a5b206 Mon Sep 17 00:00:00 2001 From: Erik Nyquist Date: Fri, 30 Sep 2016 16:49:17 -0700 Subject: [PATCH 7/9] Add CODK Makefile to CurieMailbox examples This allows the examples to be used immediately in CODK-M, without editing any Makefiles. --- .../examples/SharedCounter/Makefile | 17 +++++++++++++++++ libraries/CurieMailbox/examples/String/Makefile | 17 +++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 libraries/CurieMailbox/examples/SharedCounter/Makefile create mode 100644 libraries/CurieMailbox/examples/String/Makefile diff --git a/libraries/CurieMailbox/examples/SharedCounter/Makefile b/libraries/CurieMailbox/examples/SharedCounter/Makefile new file mode 100644 index 00000000..d23e005d --- /dev/null +++ b/libraries/CurieMailbox/examples/SharedCounter/Makefile @@ -0,0 +1,17 @@ +ifeq ("$(strip $(CODK_DIR))", "") + $(error Please set the CODK_DIR variable.) +endif + +ARDUINOSW_DIR ?= $(CODK_DIR)/arc + +current_dir = $(shell pwd) + +VERBOSE = true + +LIBDIRS = $(ARDUINOSW_DIR)/corelibs/libraries/CurieMailbox/src + +include $(ARDUINOSW_DIR)/Makefile.inc + +all: compile + +.DEFAULT_GOAL := all diff --git a/libraries/CurieMailbox/examples/String/Makefile b/libraries/CurieMailbox/examples/String/Makefile new file mode 100644 index 00000000..d23e005d --- /dev/null +++ b/libraries/CurieMailbox/examples/String/Makefile @@ -0,0 +1,17 @@ +ifeq ("$(strip $(CODK_DIR))", "") + $(error Please set the CODK_DIR variable.) +endif + +ARDUINOSW_DIR ?= $(CODK_DIR)/arc + +current_dir = $(shell pwd) + +VERBOSE = true + +LIBDIRS = $(ARDUINOSW_DIR)/corelibs/libraries/CurieMailbox/src + +include $(ARDUINOSW_DIR)/Makefile.inc + +all: compile + +.DEFAULT_GOAL := all From dc4c873eaee754f8afdfbf3bb9b1d8bc29fcae00 Mon Sep 17 00:00:00 2001 From: Erik Nyquist Date: Wed, 26 Oct 2016 15:08:55 -0700 Subject: [PATCH 8/9] Rebuild libarc32drv_arduino101.a --- variants/arduino_101/libarc32drv_arduino101.a | Bin 782628 -> 781392 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/variants/arduino_101/libarc32drv_arduino101.a b/variants/arduino_101/libarc32drv_arduino101.a index e0cb6b8ebca696bb969e406b16df05c24693f4f2..e88b594708c79d78fad6bf2ca4b9b652341dda2a 100644 GIT binary patch delta 86419 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 Izcq*d3-zu>q5uE@ delta 87994 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

G45xryLX zI0Z8|5zM7R3sj$@Ca)=@*^4CEQ$nRcx+^{^Kh#_>5!^J}tg}XN__u~Xb{QL)?)o;| zVrZ0K{1x|i>*Mm;t?GFBqjeBcRN6&bC1eV}CpNb)CZ9KwO?@%%q^&smVG{ToGN~Vq zV&wpxMiP^Wi5KMq-_-4y>59O}+V0jDCFYJZh=*rrQCmW^VXpP@>`jD()gVRU%?h2+7iCojn zS1y++aFpLXUf}wW@oj3R3`oYs(8wGc?j!T0!JFSQt);;@>87djE|_bhyZ~-TKU8@=T=Rs%{s+*Rs`3udd72G=rjb>-=hcIc;H%19mG`>x4Y;2w--G^l z${Pirg5W-Sb?Uk!>rBGgnyJIES_V;+#~)+32W?K#CuhKItegs$Num60nFkX&xiDcK zOo)C$u&32~1QPRtGB?Ipsr(Y;EC^`gcgXz@=mZkZR9*r17aQw< zFq8_TEFs8S;pSDQQZeOX;4;dL)J!af{%9n^e3T2!nwXhb4E_)&)B6ECgOz`P&g04> zLI;P0OxFXB8JS(N5qKt)_Nkn?6Z{Se$7Ia}V(6?w1ZD^n%*-wdKb`<{F;V$hB(Ab@ zLCIg=9odN`rv*0(CYr-}A8=!i`-}VP|z7DcXs_(AlJBHXw z;xAZXHM{B|n)PzHzB}2s6x!TqBDjud78%~l#n-@{jAm%F2JTu>SxBD?SwWwZh>t4= z$@@e7uQqUhZ)?V>UBN>3d$J}TSM$$mGdsY8%a|g`C?omfn=TmrBmTXQxIYWUtgjcE zV4}!UIY(!wq&00n_^b4)4e5?I$hu{q|943Rm_ z-K8AoP}cX82G3aqWk1DD(Fq3eY?KZ+ObLCcIHWtILJLR-#c=m|E@+n>FJeW~losxi zj=4C~o2G<*rT^bmFRE5g(dtE4|K0wsKU^+OWZ?3g|KkGMEaE@`Tj0M~2;#>sLGRea zKGN0iq4gJ2yU85sdgP(&hFr;G#$<8L(5jKB&73TsM_Rq&?I2jKk;lJdl&gSGgn%ZC73-F=Jhk zn8l=1Kw$0@FpFBAALWVoBXf>hH|4?7f2`}h@ZvZ$%OBvKE{Wq%>bjKd7Y^-!+H z=NLX@v(NxMf!|n5_TL-lT5orCgEW|C{1BQqa* zGbJ?xtCrSG!u6<9K=Mw8_g3jO8TFadvUW1+GdlzInM;$gaxJ2;{65*0m+~HX)J%0a#pMVrDpPMdCM6p zhm)-l4}C8FU9XqeRI8XYNU>U21IDFeqp8dx{Uv3AyRf{LVwIB6F^)%MDe~1nH`Quu z_i+V{sg54!Ew^uFWrPP~q0CwS*Q zfdE~CI*<=g<{Fi;%Dup%ybA8?%14nCA1d>Gy+`>F;yOiUWLITLniZK-4aaWiP_z

94`my8pfbCG%uWrA3wCChJ)Cgx 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 From 01ded9acca6e3f91b95ce1ac5f3396ecb8ded7a6 Mon Sep 17 00:00:00 2001 From: Erik Nyquist Date: Fri, 9 Dec 2016 13:48:52 -0800 Subject: [PATCH 9/9] CurieMailbox/examples/String.ino: receive on all channels Also, add public 'numChannels' constant to CurieMailbox class, so all channels can be easily iterated over --- libraries/CurieMailbox/examples/String/String.ino | 12 ++++++------ libraries/CurieMailbox/src/CurieMailbox.cpp | 10 +++++----- libraries/CurieMailbox/src/CurieMailbox.h | 2 ++ 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/libraries/CurieMailbox/examples/String/String.ino b/libraries/CurieMailbox/examples/String/String.ino index 83d08be5..48598ba6 100644 --- a/libraries/CurieMailbox/examples/String/String.ino +++ b/libraries/CurieMailbox/examples/String/String.ino @@ -15,23 +15,23 @@ #include "CurieMailbox.h" -int receiveChannel = 0; /* Receiving messages on this channel */ - void setup (void) { Serial.begin(9600); /* Enable the mailbox */ CurieMailbox.begin(); - /* Enable channel for receiving messages */ - CurieMailbox.enableReceive(receiveChannel); + /* Enable all channels for receiving messages */ + for (int i = 0; i < CurieMailbox.numChannels; ++i) { + CurieMailbox.enableReceive(i); + } } void printMessageAsString (CurieMailboxMsg msg) { char *p = (char *)msg.data; - Serial.print("Received message '" + String(p) + "' from channel "); - Serial.println(msg.channel); + Serial.print("Received message from channel " + String(msg.channel) + ": "); + Serial.println(String(p)); } void loop (void) { diff --git a/libraries/CurieMailbox/src/CurieMailbox.cpp b/libraries/CurieMailbox/src/CurieMailbox.cpp index 6d2a732d..09b73c08 100644 --- a/libraries/CurieMailbox/src/CurieMailbox.cpp +++ b/libraries/CurieMailbox/src/CurieMailbox.cpp @@ -4,15 +4,15 @@ #include "CurieMailbox.h" #define BUFSIZE 33 -#define NUM_CHANNELS 8 #define CHANNEL_STS_MASK 0x1 #define CHANNEL_INT_MASK 0x2 #define CTRL_WORD_MASK 0x7FFFFFFF #define CHALL_STATUS_MASK 0xFFFF #define CHANNEL_STS_BITS (CHANNEL_STS_MASK | CHANNEL_INT_MASK) -#define CAP_CHAN(chan) chan = (chan >= NUM_CHANNELS) ? \ - NUM_CHANNELS - 1 : ((chan < 0) ? 0 : chan) +#define CAP_CHAN(chan) chan = (chan >= CurieMailbox.numChannels) ?\ + CurieMailbox.numChannels - 1 : ((chan < 0) \ + ? 0 : chan) /* Mailbox channel status register */ #define IO_REG_MAILBOX_CHALL_STS (SCSS_REGISTER_BASE + 0xAC0) @@ -122,7 +122,7 @@ static void mbox_isr (void) sts = get_chall_sts(); /* Get channel number */ - for (i = 0; i < NUM_CHANNELS; ++i) { + for (i = 0; i < CurieMailbox.numChannels; ++i) { if (sts & (1 << (i * 2 + 1))) { break; } @@ -135,7 +135,7 @@ static void mbox_hardware_init (void) { int i; - for (i = 0; i < NUM_CHANNELS; ++i) { + for (i = 0; i < CurieMailbox.numChannels; ++i) { mbox[i].sts &= ~(CHANNEL_STS_BITS); } } diff --git a/libraries/CurieMailbox/src/CurieMailbox.h b/libraries/CurieMailbox/src/CurieMailbox.h index 8f0da06c..eb45e425 100644 --- a/libraries/CurieMailbox/src/CurieMailbox.h +++ b/libraries/CurieMailbox/src/CurieMailbox.h @@ -5,6 +5,8 @@ class CurieMailboxClass { public: + const int numChannels = 8; + CurieMailboxClass (void); void begin (void); void begin (bool master);