Skip to content

Commit bb77ad5

Browse files
committed
[nRF52] Arduinize some APIs and implement missing methods
1 parent 506a945 commit bb77ad5

File tree

15 files changed

+300
-47
lines changed

15 files changed

+300
-47
lines changed

Diff for: cores/arduino/Arduino.h

+15-2
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ using namespace arduino;
4545
extern "C"{
4646
#endif
4747

48-
// avr-libc defines _NOP() since 1.6.2
4948
#ifndef _NOP
5049
#define _NOP() do { __asm__ volatile ("nop"); } while (0)
5150
#endif
@@ -65,12 +64,25 @@ extern "C"{
6564
#endif // abs
6665
#define abs(x) ((x)>0?(x):-(x))
6766

67+
#define interrupts() __enable_irq()
68+
#define noInterrupts() __disable_irq()
69+
6870
#ifdef __cplusplus
6971
} // extern "C"
7072
#endif
7173

7274
#include "pins_arduino.h"
7375

76+
/* Types used for the table below */
77+
typedef struct _PinDescription
78+
{
79+
PinName name;
80+
mbed::InterruptIn* irq;
81+
} PinDescription ;
82+
83+
/* Pins table to be instantiated into variant.cpp */
84+
extern PinDescription g_APinDescription[];
85+
7486
#include "Serial.h"
7587
#if defined(SERIAL_CDC)
7688
#define Serial SerialUSB
@@ -83,6 +95,7 @@ extern "C"{
8395
#define Serial2 UART3
8496
#endif
8597

86-
#include "RPC.h"
98+
#include "RPC_internal.h"
99+
#include "overloads.h"
87100

88101
#endif

Diff for: cores/arduino/Interrupts.cpp

+13
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,19 @@
1818

1919
#include "Arduino.h"
2020

21+
void attachInterruptParam(PinName interruptNum, voidFuncPtrParam func, PinStatus mode, void* param) {
22+
mbed::InterruptIn* irq = new mbed::InterruptIn(interruptNum);
23+
if (mode == FALLING) {
24+
irq->fall(mbed::callback(func, param));
25+
} else {
26+
irq->rise(mbed::callback(func, param));
27+
}
28+
}
29+
30+
void attachInterrupt(PinName interruptNum, voidFuncPtr func, PinStatus mode) {
31+
attachInterruptParam(interruptNum, (voidFuncPtrParam)func, mode, NULL);
32+
}
33+
2134
void attachInterruptParam(pin_size_t interruptNum, voidFuncPtrParam func, PinStatus mode, void* param) {
2235
mbed::InterruptIn* irq = new mbed::InterruptIn((PinName)interruptNum);
2336
if (mode == FALLING) {

Diff for: cores/arduino/Serial.cpp

+6-9
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,15 @@ void UART::begin(unsigned long baudrate, uint16_t config) {
1313

1414
void UART::begin(unsigned long baudrate) {
1515
if (_serial == NULL) {
16-
_serial = new mbed::Serial(tx, rx, baudrate);
16+
_serial = new mbed::RawSerial(tx, rx, baudrate);
1717
}
18-
#ifdef DEVICE_SERIAL_ASYNCH
19-
_serial->read(intermediate_buf, 1, mbed::callback(this, &UART::on_rx));
20-
#endif
18+
_serial->attach(mbed::callback(this, &UART::on_rx), mbed::SerialBase::RxIrq);
2119
}
2220

23-
void UART::on_rx(int howmany) {
24-
rx_buffer.store_char(intermediate_buf[0]);
25-
#ifdef DEVICE_SERIAL_ASYNCH
26-
_serial->read(intermediate_buf, 1, mbed::callback(this, &UART::on_rx));
27-
#endif
21+
void UART::on_rx() {
22+
while(_serial->readable()) {
23+
rx_buffer.store_char(_serial->getc());
24+
}
2825
}
2926

3027
void UART::end() {

Diff for: cores/arduino/Serial.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ class UART : public HardwareSerial {
2424
operator bool();
2525

2626
private:
27-
void on_rx(int howmany);
28-
mbed::Serial* _serial = NULL;
27+
void on_rx();
28+
mbed::RawSerial* _serial = NULL;
2929
PinName tx, rx;
3030
RingBufferN<256> rx_buffer;
3131
uint8_t intermediate_buf[4];

Diff for: cores/arduino/macros.h

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#define analogPinToPinName(P) (P < A0 ? g_APinDescription[P+A0].name : g_APinDescription[P].name)
2+
#define digitalPinToPinName(P) (g_APinDescription[P].name)
3+
#define digitalPinToInterrupt(P) (P)

Diff for: cores/arduino/mbed/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52840/TARGET_NRF52840_DK/PinNames.h

-7
Original file line numberDiff line numberDiff line change
@@ -218,13 +218,6 @@ typedef enum {
218218
D14 = p26,
219219
D15 = p27,
220220

221-
A0 = p3,
222-
A1 = p4,
223-
A2 = p28,
224-
A3 = p29,
225-
A4 = p30,
226-
A5 = p31,
227-
228221
/**** QSPI pins ****/
229222
QSPI1_IO0 = P0_20,
230223
QSPI1_IO1 = P0_21,

Diff for: cores/arduino/overloads.h

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
void pinMode(PinName pinNumber, PinMode pinMode);
2+
void digitalWrite(PinName pinNumber, PinStatus status);
3+
PinStatus digitalRead(PinName pinNumber);
4+
int analogRead(PinName pinNumber);
5+
void analogWrite(PinName pinNumber, int value);
6+
7+
unsigned long pulseIn(PinName pin, uint8_t state, unsigned long timeout);
8+
unsigned long pulseInLong(PinName pin, uint8_t state, unsigned long timeout);
9+
10+
void shiftOut(PinName dataPin, PinName clockPin, BitOrder bitOrder, uint8_t val);
11+
uint8_t shiftIn(PinName dataPin, PinName clockPin, BitOrder bitOrder);
12+
13+
void attachInterrupt(PinName interruptNumber, voidFuncPtr callback, PinStatus mode);
14+
void attachInterruptParam(PinName interruptNumber, voidFuncPtrParam callback, PinStatus mode, void* param);
15+
void detachInterrupt(PinName interruptNumber);

Diff for: cores/arduino/wiring.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,12 @@ unsigned long micros() {
3333

3434
void delay(unsigned long ms)
3535
{
36-
wait((float)ms / 1000.0f);
36+
wait_ms(ms);
3737
}
3838

39-
/* Delay for the given number of microseconds. Assumes a 1, 8, 12, 16, 20 or 24 MHz clock. */
4039
void delayMicroseconds(unsigned int us)
4140
{
41+
wait_us(us);
4242
}
4343

4444
void init()

Diff for: cores/arduino/wiring_analog.cpp

+26-4
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,37 @@
2323
#include "Arduino.h"
2424
#include "pins_arduino.h"
2525

26-
static int resolution = 10;
26+
static int write_resolution = 10;
27+
static int read_resolution = 10;
28+
29+
void analogWrite(PinName pin, int val)
30+
{
31+
float percent = (float)val/(float)(1 << write_resolution);
32+
mbed::PwmOut(pin).write(percent);
33+
}
2734

2835
void analogWrite(pin_size_t pin, int val)
2936
{
30-
float percent = (float)val/(float)(1 << resolution);
31-
mbed::PwmOut((PinName)pin).write(percent);
37+
float percent = (float)val/(float)(1 << write_resolution);
38+
mbed::PwmOut(digitalPinToPinName(pin)).write(percent);
39+
}
40+
41+
void analogWriteResolution(int bits)
42+
{
43+
write_resolution = bits;
44+
}
45+
46+
int analogRead(PinName pin)
47+
{
48+
return mbed::AnalogIn(pin).read_u16() >> (16 - read_resolution);
3249
}
3350

3451
int analogRead(pin_size_t pin)
3552
{
36-
return mbed::AnalogIn((PinName)pin).read_u16();
53+
return mbed::AnalogIn(analogPinToPinName(pin)).read_u16() >> (16 - read_resolution);
54+
}
55+
56+
void analogReadResolution(int bits)
57+
{
58+
read_resolution = bits;
3759
}

Diff for: cores/arduino/wiring_digital.cpp

+33-6
Original file line numberDiff line numberDiff line change
@@ -23,31 +23,58 @@
2323
#include "Arduino.h"
2424
#include "pins_arduino.h"
2525

26+
void pinMode(PinName pin, PinMode mode)
27+
{
28+
switch (mode) {
29+
case INPUT:
30+
mbed::DigitalIn(pin).mode(PullNone);
31+
break;
32+
case OUTPUT:
33+
mbed::DigitalOut(pin, 0);
34+
break;
35+
case INPUT_PULLUP:
36+
mbed::DigitalIn(pin).mode(PullUp);
37+
break;
38+
case INPUT_PULLDOWN:
39+
mbed::DigitalIn(pin).mode(PullDown);
40+
break;
41+
}
42+
}
43+
2644
void pinMode(pin_size_t pin, PinMode mode)
2745
{
2846
switch (mode) {
2947
case INPUT:
30-
mbed::DigitalIn((PinName)pin).mode(PullNone);
48+
mbed::DigitalIn(digitalPinToPinName(pin)).mode(PullNone);
3149
break;
3250
case OUTPUT:
33-
mbed::DigitalOut((PinName)pin);
51+
mbed::DigitalOut(digitalPinToPinName(pin));
3452
break;
3553
case INPUT_PULLUP:
36-
mbed::DigitalIn((PinName)pin).mode(PullUp);
54+
mbed::DigitalIn(digitalPinToPinName(pin)).mode(PullUp);
3755
break;
3856
case INPUT_PULLDOWN:
39-
mbed::DigitalIn((PinName)pin).mode(PullDown);
57+
mbed::DigitalIn(digitalPinToPinName(pin)).mode(PullDown);
4058
break;
4159
}
4260
}
4361

62+
void digitalWrite(PinName pin, PinStatus val)
63+
{
64+
mbed::DigitalOut(pin).write((int)val);
65+
}
4466

4567
void digitalWrite(pin_size_t pin, PinStatus val)
4668
{
47-
mbed::DigitalOut((PinName)pin).write((int)val);
69+
mbed::DigitalOut(digitalPinToPinName(pin)).write((int)val);
70+
}
71+
72+
PinStatus digitalRead(PinName pin)
73+
{
74+
return (PinStatus)mbed::DigitalIn(pin).read();
4875
}
4976

5077
PinStatus digitalRead(pin_size_t pin)
5178
{
52-
return (PinStatus)mbed::DigitalIn((PinName)pin).read();
79+
return (PinStatus)mbed::DigitalIn(digitalPinToPinName(pin)).read();
5380
}

Diff for: libraries/openamp/examples/Create_openamp_library/Create_openamp_library.ino

+17
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,27 @@
22

33
#include "arduino_openamp.h"
44
#include "RPC.h"
5+
#include <iostream>
6+
#include "rpc/server.h"
57

68
void setup() {
79
RPC1.begin();
810
Serial.begin(115200);
11+
12+
rpc::server srv(8080);
13+
14+
// Binding the name "foo" to free function foo.
15+
// note: the signature is automatically captured
16+
srv.bind("foo", &foo);
17+
18+
// Binding a lambda function to the name "add".
19+
srv.bind("add", [](int a, int b) {
20+
return a + b;
21+
});
22+
23+
// Run the server loop.
24+
srv.run();
25+
926
}
1027

1128
void loop() {

Diff for: libraries/rpclib/src/rpc/client.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -144,4 +144,4 @@ class client {
144144
};
145145
}
146146

147-
#include "rpc/client.inl"
147+
//#include "rpc/client.inl"

Diff for: platform.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ build.zip.pattern={recipe.size.pattern}
6969
recipe.c.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.c.flags} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {build.extra_flags} {compiler.c.extra_flags} "-I{build.core.path}/api/deprecated" {includes} "-iprefix{build.core.path}" "@{compiler.mbed.includes}" -o "{object_file}" "{source_file}"
7070

7171
## Compile c++ files
72-
recipe.cpp.o.pattern="{compiler.path}{compiler.cpp.cmd}" {compiler.cpp.flags} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {build.extra_flags} {compiler.cpp.extra_flags} "-I{build.core.path}/api/deprecated" {includes} "-iprefix{build.core.path}" "@{compiler.mbed.includes}" "{source_file}" -o "{object_file}"
72+
recipe.cpp.o.pattern="{compiler.path}{compiler.cpp.cmd}" {compiler.cpp.flags} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {includes} {build.extra_flags} {compiler.cpp.extra_flags} "-I{build.core.path}/api/deprecated" "-iprefix{build.core.path}" "@{compiler.mbed.includes}" "{source_file}" -o "{object_file}"
7373

7474
## Create archives
7575
recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} {compiler.ar.extra_flags} "{archive_file_path}" "{object_file}"

0 commit comments

Comments
 (0)