diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index a8a71f6b..576be688 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -17,15 +17,29 @@ jobs: - uses: actions/checkout@v2 with: submodules: true - - uses: actions/setup-python@v2 - with: - python-version: '3.x' - name: Run codespell uses: codespell-project/actions-codespell@master with: skip: ./pico-extras,./ArduinoCore-API,./libraries/SdFat,./libraries/Adafruit_TinyUSB_Arduino,./libraries/LittleFS/lib,./tools/pyserial,./pico-sdk,./.github,./docs/i2s.rst ignore_words_list: ser,DOUT +# Consistent style + astyle: + name: Style, Boards, Package + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + submodules: false + - run: | + ./tests/ci/pkgrefs_test.sh + ./tools/makeboards.py > boards.txt + sudo apt update + sudo apt install astyle + ./tests/restyle.sh + # If anything changed, GIT should return an error and fail the test + git diff --quiet --exit-code + # Build all examples on linux (core and Arduino IDE) build-linux: name: Build ${{ matrix.chunk }} diff --git a/cores/rp2040/Arduino.h b/cores/rp2040/Arduino.h index 5c6ca538..6c1fd47c 100644 --- a/cores/rp2040/Arduino.h +++ b/cores/rp2040/Arduino.h @@ -1,22 +1,22 @@ /* - * Arduino header for the Raspberry Pi Pico RP2040 - * - * Copyright (c) 2021 Earle F. Philhower, III - * - * 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 St, Fifth Floor, Boston, MA 02110-1301 USA - */ + Arduino header for the Raspberry Pi Pico RP2040 + + Copyright (c) 2021 Earle F. Philhower, III + + 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 St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #ifndef Arduino_h #define Arduino_h @@ -49,7 +49,7 @@ using std::abs; #endif #ifdef __cplusplus -extern "C"{ +extern "C" { #endif // __cplusplus // For compatibility to many platforms and libraries @@ -109,10 +109,10 @@ unsigned long millis(); #ifdef __cplusplus #ifdef USE_TINYUSB - // Needed for declaring Serial - #include "Adafruit_USBD_CDC.h" +// Needed for declaring Serial +#include "Adafruit_USBD_CDC.h" #else - #include "SerialUSB.h" +#include "SerialUSB.h" #endif #include "SerialUART.h" @@ -123,7 +123,7 @@ unsigned long millis(); // with the specified bits set. template constexpr uint32_t __bitset(const int (&a)[N], size_t i = 0U) { - return i < N ? (1L << a[i]) | __bitset(a, i+1) : 0; + return i < N ? (1L << a[i]) | __bitset(a, i + 1) : 0; } #endif diff --git a/cores/rp2040/Bootsel.cpp b/cores/rp2040/Bootsel.cpp index a9e59599..fea2c6ae 100644 --- a/cores/rp2040/Bootsel.cpp +++ b/cores/rp2040/Bootsel.cpp @@ -1,8 +1,8 @@ /** - * Copyright (c) 2020 Raspberry Pi (Trading) Ltd. - * - * SPDX-License-Identifier: BSD-3-Clause - */ + Copyright (c) 2020 Raspberry Pi (Trading) Ltd. + + SPDX-License-Identifier: BSD-3-Clause +*/ #include #include "pico/stdlib.h" #include "hardware/gpio.h" diff --git a/cores/rp2040/Bootsel.h b/cores/rp2040/Bootsel.h index b081ed6a..01ccc604 100644 --- a/cores/rp2040/Bootsel.h +++ b/cores/rp2040/Bootsel.h @@ -1,22 +1,22 @@ /* - * Simple BOOTSEL reader object - * - * Copyright (c) 2021 Earle F. Philhower, III - * - * 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 St, Fifth Floor, Boston, MA 02110-1301 USA - */ + Simple BOOTSEL reader object + + Copyright (c) 2021 Earle F. Philhower, III + + 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 St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #pragma once diff --git a/cores/rp2040/CoreMutex.h b/cores/rp2040/CoreMutex.h index 5ff4cf83..f504a912 100644 --- a/cores/rp2040/CoreMutex.h +++ b/cores/rp2040/CoreMutex.h @@ -1,25 +1,25 @@ /* - * CoreMutex for the Raspberry Pi Pico RP2040 - * - * Implements a deadlock-safe multicore mutex for sharing things like the - * USB or UARTs. - * - * Copyright (c) 2021 Earle F. Philhower, III - * - * 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 St, Fifth Floor, Boston, MA 02110-1301 USA - */ + CoreMutex for the Raspberry Pi Pico RP2040 + + Implements a deadlock-safe multicore mutex for sharing things like the + USB or UARTs. + + Copyright (c) 2021 Earle F. Philhower, III + + 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 St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #pragma once diff --git a/cores/rp2040/FS.cpp b/cores/rp2040/FS.cpp index d9e4209c..0f352efe 100644 --- a/cores/rp2040/FS.cpp +++ b/cores/rp2040/FS.cpp @@ -1,22 +1,22 @@ /* - FS.cpp - file system wrapper - Copyright (c) 2015 Ivan Grokhotkov. All rights reserved. - This file is part of the esp8266 core for Arduino environment. + FS.cpp - file system wrapper + Copyright (c) 2015 Ivan Grokhotkov. All rights reserved. + This file is part of the esp8266 core for Arduino environment. - 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 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. + 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 St, Fifth Floor, Boston, MA 02110-1301 USA - */ + 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 St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #include "FS.h" #include "FSImpl.h" @@ -26,37 +26,42 @@ using namespace fs; static bool sflags(const char* mode, OpenMode& om, AccessMode& am); size_t File::write(uint8_t c) { - if (!_p) + if (!_p) { return 0; + } return _p->write(&c, 1); } size_t File::write(const uint8_t *buf, size_t size) { - if (!_p) + if (!_p) { return 0; + } return _p->write(buf, size); } int File::available() { - if (!_p) + if (!_p) { return false; + } return _p->size() - _p->position(); } int File::availableForWrite() { - if (!_p) + if (!_p) { return false; + } return _p->availableForWrite(); } int File::read() { - if (!_p) + if (!_p) { return -1; + } uint8_t result; if (_p->read(&result, 1) != 1) { @@ -67,15 +72,17 @@ int File::read() { } int File::read(uint8_t* buf, size_t size) { - if (!_p) + if (!_p) { return 0; + } return _p->read(buf, size); } int File::peek() { - if (!_p) + if (!_p) { return -1; + } size_t curPos = _p->position(); int result = read(); @@ -84,29 +91,33 @@ int File::peek() { } void File::flush() { - if (!_p) + if (!_p) { return; + } _p->flush(); } bool File::seek(uint32_t pos, SeekMode mode) { - if (!_p) + if (!_p) { return false; + } return _p->seek(pos, mode); } size_t File::position() const { - if (!_p) + if (!_p) { return 0; + } return _p->position(); } size_t File::size() const { - if (!_p) + if (!_p) { return 0; + } return _p->size(); } @@ -123,36 +134,41 @@ File::operator bool() const { } bool File::truncate(uint32_t size) { - if (!_p) + if (!_p) { return false; + } return _p->truncate(size); } const char* File::name() const { - if (!_p) + if (!_p) { return nullptr; + } return _p->name(); } const char* File::fullName() const { - if (!_p) + if (!_p) { return nullptr; + } return _p->fullName(); } bool File::isFile() const { - if (!_p) + if (!_p) { return false; + } return _p->isFile(); } bool File::isDirectory() const { - if (!_p) + if (!_p) { return false; + } return _p->isDirectory(); } @@ -162,7 +178,7 @@ void File::rewindDirectory() { _fakeDir = std::make_shared(_baseFS->openDir(fullName())); } else { _fakeDir->rewind(); - } + } } File File::openNextFile() { @@ -173,38 +189,39 @@ File File::openNextFile() { return _fakeDir->openFile("r"); } -String File::readString() -{ +String File::readString() { String ret; ret.reserve(size() - position()); - char temp[256+1]; - int countRead = readBytes(temp, sizeof(temp)-1); - while (countRead > 0) - { + char temp[256 + 1]; + int countRead = readBytes(temp, sizeof(temp) - 1); + while (countRead > 0) { temp[countRead] = 0; ret += temp; - countRead = readBytes(temp, sizeof(temp)-1); + countRead = readBytes(temp, sizeof(temp) - 1); } return ret; } time_t File::getLastWrite() { - if (!_p) + if (!_p) { return 0; + } return _p->getLastWrite(); } time_t File::getCreationTime() { - if (!_p) + if (!_p) { return 0; + } return _p->getCreationTime(); } void File::setTimeCallback(time_t (*cb)(void)) { - if (!_p) + if (!_p) { return; + } _p->setTimeCallback(cb); _timeCallback = cb; } @@ -235,14 +252,16 @@ String Dir::fileName() { } time_t Dir::fileTime() { - if (!_impl) + if (!_impl) { return 0; + } return _impl->fileTime(); } time_t Dir::fileCreationTime() { - if (!_impl) + if (!_impl) { return 0; + } return _impl->fileCreationTime(); } @@ -255,15 +274,17 @@ size_t Dir::fileSize() { } bool Dir::isFile() const { - if (!_impl) + if (!_impl) { return false; + } return _impl->isFile(); } bool Dir::isDirectory() const { - if (!_impl) + if (!_impl) { return false; + } return _impl->isDirectory(); } @@ -285,8 +306,9 @@ bool Dir::rewind() { } void Dir::setTimeCallback(time_t (*cb)(void)) { - if (!_impl) + if (!_impl) { return; + } _impl->setTimeCallback(cb); _timeCallback = cb; } @@ -307,7 +329,7 @@ bool FS::begin() { } _impl->setTimeCallback(_timeCallback); bool ret = _impl->begin(); - DEBUGV("%s\n", ret? "": "#error: FS could not start"); + DEBUGV("%s\n", ret ? "" : "#error: FS could not start"); return ret; } @@ -338,14 +360,14 @@ bool FS::format() { return _impl->format(); } -bool FS::info(FSInfo& info){ +bool FS::info(FSInfo& info) { if (!_impl) { return false; } return _impl->info(info); } -bool FS::info64(FSInfo64& info){ +bool FS::info64(FSInfo64& info) { if (!_impl) { return false; } @@ -449,8 +471,9 @@ time_t FS::getCreationTime() { } void FS::setTimeCallback(time_t (*cb)(void)) { - if (!_impl) + if (!_impl) { return; + } _impl->setTimeCallback(cb); _timeCallback = cb; } @@ -458,29 +481,29 @@ void FS::setTimeCallback(time_t (*cb)(void)) { static bool sflags(const char* mode, OpenMode& om, AccessMode& am) { switch (mode[0]) { - case 'r': - am = AM_READ; - om = OM_DEFAULT; - break; - case 'w': - am = AM_WRITE; - om = (OpenMode) (OM_CREATE | OM_TRUNCATE); - break; - case 'a': - am = AM_WRITE; - om = (OpenMode) (OM_CREATE | OM_APPEND); - break; - default: - return false; + case 'r': + am = AM_READ; + om = OM_DEFAULT; + break; + case 'w': + am = AM_WRITE; + om = (OpenMode)(OM_CREATE | OM_TRUNCATE); + break; + case 'a': + am = AM_WRITE; + om = (OpenMode)(OM_CREATE | OM_APPEND); + break; + default: + return false; } - switch(mode[1]) { - case '+': - am = (AccessMode) (AM_WRITE | AM_READ); - break; - case 0: - break; - default: - return false; + switch (mode[1]) { + case '+': + am = (AccessMode)(AM_WRITE | AM_READ); + break; + case 0: + break; + default: + return false; } return true; } @@ -489,7 +512,7 @@ static bool sflags(const char* mode, OpenMode& om, AccessMode& am) { #if defined(FS_FREESTANDING_FUNCTIONS) /* -TODO: move these functions to public API: + TODO: move these functions to public API: */ File open(const char* path, const char* mode); File open(String& path, const char* mode); @@ -545,8 +568,9 @@ File open(const char* path, const char* mode) { size_t offset = entry->path.length(); if (strstr(path, entry->path.c_str())) { File result = entry->fs->open(path + offset); - if (result) + if (result) { return result; + } } } diff --git a/cores/rp2040/FS.h b/cores/rp2040/FS.h index 576fbad1..81d29efc 100644 --- a/cores/rp2040/FS.h +++ b/cores/rp2040/FS.h @@ -1,22 +1,22 @@ /* - FS.h - file system wrapper - Copyright (c) 2015 Ivan Grokhotkov. All rights reserved. - This file is part of the esp8266 core for Arduino environment. + FS.h - file system wrapper + Copyright (c) 2015 Ivan Grokhotkov. All rights reserved. + This file is part of the esp8266 core for Arduino environment. - 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 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. + 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 St, Fifth Floor, Boston, MA 02110-1301 USA - */ + 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 St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #ifndef FS_H #define FS_H @@ -49,8 +49,7 @@ enum SeekMode { SeekEnd = 2 }; -class File : public Stream -{ +class File : public Stream { public: File(FileImplPtr p = FileImplPtr(), FS *baseFS = nullptr) : _p(p), _fakeDir(nullptr), _baseFS(baseFS) { } @@ -74,7 +73,9 @@ public: } size_t position() const; size_t size() const; - virtual ssize_t streamRemaining() { return (ssize_t)size() - (ssize_t)position(); } + virtual ssize_t streamRemaining() { + return (ssize_t)size() - (ssize_t)position(); + } void close(); operator bool() const; const char* name() const; @@ -86,26 +87,26 @@ public: // Arduino "class SD" methods for compatibility //TODO use stream::send / check read(buf,size) result - template size_t write(T &src){ - uint8_t obuf[256]; - size_t doneLen = 0; - size_t sentLen; - int i; + template size_t write(T &src) { + uint8_t obuf[256]; + size_t doneLen = 0; + size_t sentLen; + int i; - while (src.available() > sizeof(obuf)){ - src.read(obuf, sizeof(obuf)); - sentLen = write(obuf, sizeof(obuf)); - doneLen = doneLen + sentLen; - if(sentLen != sizeof(obuf)){ - return doneLen; + while (src.available() > sizeof(obuf)) { + src.read(obuf, sizeof(obuf)); + sentLen = write(obuf, sizeof(obuf)); + doneLen = doneLen + sentLen; + if (sentLen != sizeof(obuf)) { + return doneLen; + } } - } - size_t leftLen = src.available(); - src.read(obuf, leftLen); - sentLen = write(obuf, leftLen); - doneLen = doneLen + sentLen; - return doneLen; + size_t leftLen = src.available(); + src.read(obuf, leftLen); + sentLen = write(obuf, leftLen); + doneLen = doneLen + sentLen; + return doneLen; } using Print::write; @@ -172,8 +173,7 @@ struct FSInfo64 { }; -class FSConfig -{ +class FSConfig { public: static constexpr uint32_t FSId = 0x00000000; @@ -188,8 +188,7 @@ public: bool _autoFormat; }; -class SPIFFSConfig : public FSConfig -{ +class SPIFFSConfig : public FSConfig { public: static constexpr uint32_t FSId = 0x53504946; SPIFFSConfig(bool autoFormat = true) : FSConfig(FSId, autoFormat) { } @@ -198,10 +197,11 @@ public: // nothing yet, enableTime TBD when SPIFFS has metadate }; -class FS -{ +class FS { public: - FS(FSImplPtr impl) : _impl(impl) { _timeCallback = _defaultTimeCB; } + FS(FSImplPtr impl) : _impl(impl) { + _timeCallback = _defaultTimeCB; + } bool setConfig(const FSConfig &cfg); @@ -244,18 +244,22 @@ public: friend class ::SDClass; // More of a frenemy, but SD needs internal implementation to get private FAT bits protected: FSImplPtr _impl; - FSImplPtr getImpl() { return _impl; } + FSImplPtr getImpl() { + return _impl; + } time_t (*_timeCallback)(void) = nullptr; - static time_t _defaultTimeCB(void) { return time(NULL); } + static time_t _defaultTimeCB(void) { + return time(NULL); + } }; } // namespace fs extern "C" { -void close_all_fs(void); -void littlefs_request_end(void); -void spiffs_request_end(void); + void close_all_fs(void); + void littlefs_request_end(void); + void spiffs_request_end(void); } #ifndef FS_NO_GLOBALS diff --git a/cores/rp2040/FSImpl.h b/cores/rp2040/FSImpl.h index 22a058f7..7ea07ad2 100644 --- a/cores/rp2040/FSImpl.h +++ b/cores/rp2040/FSImpl.h @@ -1,22 +1,22 @@ /* - FSImpl.h - base file system interface - Copyright (c) 2015 Ivan Grokhotkov. All rights reserved. - This file is part of the esp8266 core for Arduino environment. + FSImpl.h - base file system interface + Copyright (c) 2015 Ivan Grokhotkov. All rights reserved. + This file is part of the esp8266 core for Arduino environment. - 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 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. + 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 St, Fifth Floor, Boston, MA 02110-1301 USA - */ + 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 St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #ifndef FSIMPL_H #define FSIMPL_H @@ -35,7 +35,9 @@ public: virtual bool seek(uint32_t pos, SeekMode mode) = 0; virtual size_t position() const = 0; virtual size_t size() const = 0; - virtual int availableForWrite() { return 0; } + virtual int availableForWrite() { + return 0; + } virtual bool truncate(uint32_t size) = 0; virtual void close() = 0; virtual const char* name() const = 0; @@ -46,14 +48,20 @@ public: // Filesystems *may* support a timestamp per-file, so allow the user to override with // their own callback for *this specific* file (as opposed to the FSImpl call of the // same name. The default implementation simply returns time(null) - virtual void setTimeCallback(time_t (*cb)(void)) { _timeCallback = cb; } + virtual void setTimeCallback(time_t (*cb)(void)) { + _timeCallback = cb; + } // Return the last written time for a file. Undefined when called on a writable file // as the FS is allowed to return either the time of the last write() operation or the // time present in the filesystem metadata (often the last time the file was closed) - virtual time_t getLastWrite() { return 0; } // Default is to not support timestamps + virtual time_t getLastWrite() { + return 0; // Default is to not support timestamps + } // Same for creation time. - virtual time_t getCreationTime() { return 0; } // Default is to not support timestamps + virtual time_t getCreationTime() { + return 0; // Default is to not support timestamps + } protected: time_t (*_timeCallback)(void) = nullptr; @@ -81,8 +89,12 @@ public: // Return the last written time for a file. Undefined when called on a writable file // as the FS is allowed to return either the time of the last write() operation or the // time present in the filesystem metadata (often the last time the file was closed) - virtual time_t fileTime() { return 0; } // By default, FS doesn't report file times - virtual time_t fileCreationTime() { return 0; } // By default, FS doesn't report file times + virtual time_t fileTime() { + return 0; // By default, FS doesn't report file times + } + virtual time_t fileCreationTime() { + return 0; // By default, FS doesn't report file times + } virtual bool isFile() const = 0; virtual bool isDirectory() const = 0; virtual bool next() = 0; @@ -91,7 +103,9 @@ public: // Filesystems *may* support a timestamp per-file, so allow the user to override with // their own callback for *this specific* file (as opposed to the FSImpl call of the // same name. The default implementation simply returns time(null) - virtual void setTimeCallback(time_t (*cb)(void)) { _timeCallback = cb; } + virtual void setTimeCallback(time_t (*cb)(void)) { + _timeCallback = cb; + } protected: time_t (*_timeCallback)(void) = nullptr; @@ -99,7 +113,7 @@ protected: class FSImpl { public: - virtual ~FSImpl () { } + virtual ~FSImpl() { } virtual bool setConfig(const FSConfig &cfg) = 0; virtual bool begin() = 0; virtual void end() = 0; @@ -113,14 +127,22 @@ public: virtual bool remove(const char* path) = 0; virtual bool mkdir(const char* path) = 0; virtual bool rmdir(const char* path) = 0; - virtual bool gc() { return true; } // May not be implemented in all file systems. - virtual bool check() { return true; } // May not be implemented in all file systems. - virtual time_t getCreationTime() { return 0; } // May not be implemented in all file systems. + virtual bool gc() { + return true; // May not be implemented in all file systems. + } + virtual bool check() { + return true; // May not be implemented in all file systems. + } + virtual time_t getCreationTime() { + return 0; // May not be implemented in all file systems. + } // Filesystems *may* support a timestamp per-file, so allow the user to override with // their own callback for all files on this FS. The default implementation simply // returns the present time as reported by time(null) - virtual void setTimeCallback(time_t (*cb)(void)) { _timeCallback = cb; } + virtual void setTimeCallback(time_t (*cb)(void)) { + _timeCallback = cb; + } protected: time_t (*_timeCallback)(void) = nullptr; diff --git a/cores/rp2040/RP2040.h b/cores/rp2040/RP2040.h index 3d793387..32fc8db5 100644 --- a/cores/rp2040/RP2040.h +++ b/cores/rp2040/RP2040.h @@ -1,22 +1,22 @@ /* - * RP2040 utility class - * - * Copyright (c) 2021 Earle F. Philhower, III - * - * 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 St, Fifth Floor, Boston, MA 02110-1301 USA - */ + RP2040 utility class + + Copyright (c) 2021 Earle F. Philhower, III + + 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 St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #include #include @@ -54,7 +54,7 @@ public: bool push_nb(uint32_t val) { // Push to the other FIFO - return queue_try_add(&_queue[get_core_num()^1], &val); + return queue_try_add(&_queue[get_core_num() ^ 1], &val); } uint32_t pop() { @@ -73,7 +73,9 @@ public: } void idleOtherCore() { - if (!_multicore) return; + if (!_multicore) { + return; + } mutex_enter_blocking(&_idleMutex); _otherIdled = false; multicore_fifo_push_blocking(_GOTOSLEEP); @@ -81,7 +83,9 @@ public: } void resumeOtherCore() { - if (!_multicore) return; + if (!_multicore) { + return; + } mutex_exit(&_idleMutex); _otherIdled = false; // Other core will exit busy-loop and return to operation @@ -115,7 +119,7 @@ public: // Convert from microseconds to PIO clock cycles static int usToPIOCycles(int us) { // Parenthesis needed to guarantee order of operations to avoid 32bit overflow - return (us * ( clock_get_hz(clk_sys) / 1000000 )); + return (us * (clock_get_hz(clk_sys) / 1000000)); } // Get current clock frequency @@ -123,8 +127,12 @@ public: return clock_get_hz(clk_sys); } - void idleOtherCore() { fifo.idleOtherCore(); } - void resumeOtherCore() { fifo.resumeOtherCore(); } + void idleOtherCore() { + fifo.idleOtherCore(); + } + void resumeOtherCore() { + fifo.resumeOtherCore(); + } // Multicore comms FIFO _MFIFO fifo; @@ -136,18 +144,24 @@ extern RP2040 rp2040; // TODO - Add unload/destructor class PIOProgram { public: - PIOProgram(const pio_program_t *pgm) { _pgm = pgm; } + PIOProgram(const pio_program_t *pgm) { + _pgm = pgm; + } // Possibly load into a PIO and allocate a SM bool prepare(PIO *pio, int *sm, int *offset) { extern mutex_t _pioMutex; CoreMutex m(&_pioMutex); // Is there an open slot to run in, first? - if (!_findFreeSM(pio, sm)) return false; - // Is it loaded on that PIO? + if (!_findFreeSM(pio, sm)) { + return false; + } + // Is it loaded on that PIO? if (_offset[pio_get_index(*pio)] < 0) { // Nope, need to load it - if (!pio_can_add_program(*pio, _pgm)) return false; + if (!pio_can_add_program(*pio, _pgm)) { + return false; + } _offset[pio_get_index(*pio)] = pio_add_program(*pio, _pgm); } // Here it's guaranteed loaded, return values diff --git a/cores/rp2040/RP2040USB.cpp b/cores/rp2040/RP2040USB.cpp index 25f5b748..13086f00 100644 --- a/cores/rp2040/RP2040USB.cpp +++ b/cores/rp2040/RP2040USB.cpp @@ -1,23 +1,23 @@ /* - * Shared USB for the Raspberry Pi Pico RP2040 - * Allows for multiple endpoints to share the USB controller - * - * Copyright (c) 2021 Earle F. Philhower, III - * - * 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 St, Fifth Floor, Boston, MA 02110-1301 USA - */ + Shared USB for the Raspberry Pi Pico RP2040 + Allows for multiple endpoints to share the USB controller + + Copyright (c) 2021 Earle F. Philhower, III + + 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 St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #ifndef USE_TINYUSB @@ -46,9 +46,9 @@ mutex_t __usb_mutex; #define USBD_VID (0x2E8A) // Raspberry Pi #ifdef SERIALUSB_PID - #define USBD_PID (SERIALUSB_PID) +#define USBD_PID (SERIALUSB_PID) #else - #define USBD_PID (0x000a) // Raspberry Pi Pico SDK CDC +#define USBD_PID (0x000a) // Raspberry Pi Pico SDK CDC #endif #define USBD_DESC_LEN (TUD_CONFIG_DESC_LEN + TUD_CDC_DESC_LEN) @@ -124,8 +124,8 @@ int __USBGetMouseReportID() { static uint8_t *GetDescHIDReport(int *len) { if (__USBInstallKeyboard && __USBInstallMouse) { static uint8_t desc_hid_report[] = { - TUD_HID_REPORT_DESC_KEYBOARD( HID_REPORT_ID(1) ), - TUD_HID_REPORT_DESC_MOUSE ( HID_REPORT_ID(2) ) + TUD_HID_REPORT_DESC_KEYBOARD(HID_REPORT_ID(1)), + TUD_HID_REPORT_DESC_MOUSE(HID_REPORT_ID(2)) }; if (len) { *len = sizeof(desc_hid_report); @@ -133,7 +133,7 @@ static uint8_t *GetDescHIDReport(int *len) { return desc_hid_report; } else if (__USBInstallKeyboard && ! __USBInstallMouse) { static uint8_t desc_hid_report[] = { - TUD_HID_REPORT_DESC_KEYBOARD( HID_REPORT_ID(1) ) + TUD_HID_REPORT_DESC_KEYBOARD(HID_REPORT_ID(1)) }; if (len) { *len = sizeof(desc_hid_report); @@ -141,7 +141,7 @@ static uint8_t *GetDescHIDReport(int *len) { return desc_hid_report; } else { // if (!__USBInstallKeyboard && __USBInstallMouse) { static uint8_t desc_hid_report[] = { - TUD_HID_REPORT_DESC_MOUSE( HID_REPORT_ID(1) ) + TUD_HID_REPORT_DESC_MOUSE(HID_REPORT_ID(1)) }; if (len) { *len = sizeof(desc_hid_report); @@ -153,16 +153,15 @@ static uint8_t *GetDescHIDReport(int *len) { // Invoked when received GET HID REPORT DESCRIPTOR // Application return pointer to descriptor // Descriptor contents must exist long enough for transfer to complete -uint8_t const * tud_hid_descriptor_report_cb(void) -{ +uint8_t const * tud_hid_descriptor_report_cb(void) { return GetDescHIDReport(nullptr); -} +} const uint8_t *tud_descriptor_configuration_cb(uint8_t index) { (void)index; static uint8_t *usbd_desc_cfg; - + if (!usbd_desc_cfg) { bool hasHID = __USBInstallKeyboard || __USBInstallMouse; @@ -217,7 +216,7 @@ const uint8_t *tud_descriptor_configuration_cb(uint8_t index) { const uint16_t *tud_descriptor_string_cb(uint8_t index, uint16_t langid) { (void) langid; - #define DESC_STR_MAX (20) +#define DESC_STR_MAX (20) static uint16_t desc_str[DESC_STR_MAX]; static char idString[PICO_UNIQUE_BOARD_ID_SIZE_BYTES * 2 + 1]; @@ -297,26 +296,24 @@ void __USBStart() { // Invoked when received GET_REPORT control request // Application must fill buffer report's content and return its length. // Return zero will cause the stack to STALL request -uint16_t tud_hid_get_report_cb(uint8_t report_id, hid_report_type_t report_type, uint8_t* buffer, uint16_t reqlen) -{ - // TODO not Implemented - (void) report_id; - (void) report_type; - (void) buffer; - (void) reqlen; +uint16_t tud_hid_get_report_cb(uint8_t report_id, hid_report_type_t report_type, uint8_t* buffer, uint16_t reqlen) { + // TODO not Implemented + (void) report_id; + (void) report_type; + (void) buffer; + (void) reqlen; - return 0; + return 0; } // Invoked when received SET_REPORT control request or // received data on OUT endpoint ( Report ID = 0, Type = 0 ) -void tud_hid_set_report_cb(uint8_t report_id, hid_report_type_t report_type, uint8_t const* buffer, uint16_t bufsize) -{ - // TODO set LED based on CAPLOCK, NUMLOCK etc... - (void) report_id; - (void) report_type; - (void) buffer; - (void) bufsize; +void tud_hid_set_report_cb(uint8_t report_id, hid_report_type_t report_type, uint8_t const* buffer, uint16_t bufsize) { + // TODO set LED based on CAPLOCK, NUMLOCK etc... + (void) report_id; + (void) report_type; + (void) buffer; + (void) bufsize; } #endif diff --git a/cores/rp2040/RP2040USB.h b/cores/rp2040/RP2040USB.h index dd0c9dfe..150b7577 100644 --- a/cores/rp2040/RP2040USB.h +++ b/cores/rp2040/RP2040USB.h @@ -1,23 +1,23 @@ /* - * Shared USB for the Raspberry Pi Pico RP2040 - * Allows for multiple endpoints to share the USB controller - * - * Copyright (c) 2021 Earle F. Philhower, III - * - * 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 St, Fifth Floor, Boston, MA 02110-1301 USA - */ + Shared USB for the Raspberry Pi Pico RP2040 + Allows for multiple endpoints to share the USB controller + + Copyright (c) 2021 Earle F. Philhower, III + + 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 St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #include "pico/mutex.h" diff --git a/cores/rp2040/SerialUART.cpp b/cores/rp2040/SerialUART.cpp index e989121c..3bee691a 100644 --- a/cores/rp2040/SerialUART.cpp +++ b/cores/rp2040/SerialUART.cpp @@ -1,22 +1,22 @@ /* - * Serial-over-UART for the Raspberry Pi Pico RP2040 - * - * Copyright (c) 2021 Earle F. Philhower, III - * - * 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 St, Fifth Floor, Boston, MA 02110-1301 USA - */ + Serial-over-UART for the Raspberry Pi Pico RP2040 + + Copyright (c) 2021 Earle F. Philhower, III + + 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 St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #include "SerialUART.h" #include "CoreMutex.h" @@ -33,7 +33,8 @@ extern void serialEvent2() __attribute__((weak)); bool SerialUART::setRX(pin_size_t rx) { constexpr uint32_t valid[2] = { __bitset({1, 13, 17, 29}) /* UART0 */, - __bitset({5, 9, 21, 25}) /* UART1 */}; + __bitset({5, 9, 21, 25}) /* UART1 */ + }; if (_running) { DEBUGCORE("ERROR: SerialUART setRX while running\n"); return false; @@ -48,7 +49,8 @@ bool SerialUART::setRX(pin_size_t rx) { bool SerialUART::setTX(pin_size_t tx) { constexpr uint32_t valid[2] = { __bitset({0, 12, 16, 28}) /* UART0 */, - __bitset({4, 8, 20, 24}) /* UART1 */}; + __bitset({4, 8, 20, 24}) /* UART1 */ + }; if (_running) { DEBUGCORE("ERROR: SerialUART setTX while running\n"); return false; @@ -74,19 +76,19 @@ void SerialUART::begin(unsigned long baud, uint16_t config) { int bits, stop; uart_parity_t parity; switch (config & SERIAL_PARITY_MASK) { - case SERIAL_PARITY_EVEN: parity = UART_PARITY_EVEN; break; - case SERIAL_PARITY_ODD: parity = UART_PARITY_ODD; break; - default: parity = UART_PARITY_NONE; break; + case SERIAL_PARITY_EVEN: parity = UART_PARITY_EVEN; break; + case SERIAL_PARITY_ODD: parity = UART_PARITY_ODD; break; + default: parity = UART_PARITY_NONE; break; } - switch ( config & SERIAL_STOP_BIT_MASK) { - case SERIAL_STOP_BIT_1: stop = 1; break; - default: stop = 2; break; + switch (config & SERIAL_STOP_BIT_MASK) { + case SERIAL_STOP_BIT_1: stop = 1; break; + default: stop = 2; break; } switch (config & SERIAL_DATA_MASK) { - case SERIAL_DATA_5: bits = 5; break; - case SERIAL_DATA_6: bits = 6; break; - case SERIAL_DATA_7: bits = 7; break; - default: bits = 8; break; + case SERIAL_DATA_5: bits = 5; break; + case SERIAL_DATA_6: bits = 6; break; + case SERIAL_DATA_7: bits = 7; break; + default: bits = 8; break; } uart_set_format(_uart, bits, stop, parity); gpio_set_function(_tx, GPIO_FUNC_UART); @@ -184,12 +186,12 @@ SerialUART Serial2(uart1, PIN_SERIAL2_TX, PIN_SERIAL2_RX); void arduino::serialEvent1Run(void) { if (serialEvent1 && Serial1.available()) { - serialEvent1(); + serialEvent1(); } } void arduino::serialEvent2Run(void) { if (serialEvent2 && Serial2.available()) { - serialEvent2(); + serialEvent2(); } } diff --git a/cores/rp2040/SerialUART.h b/cores/rp2040/SerialUART.h index 619b886b..6c8cdebf 100644 --- a/cores/rp2040/SerialUART.h +++ b/cores/rp2040/SerialUART.h @@ -1,22 +1,22 @@ /* - * Serial-over-UART for the Raspberry Pi Pico RP2040 - * - * Copyright (c) 2021 Earle F. Philhower, III - * - * 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 St, Fifth Floor, Boston, MA 02110-1301 USA - */ + Serial-over-UART for the Raspberry Pi Pico RP2040 + + Copyright (c) 2021 Earle F. Philhower, III + + 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 St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #pragma once @@ -30,13 +30,19 @@ extern "C" typedef struct uart_inst uart_inst_t; class SerialUART : public HardwareSerial { public: SerialUART(uart_inst_t *uart, pin_size_t tx, pin_size_t rx); - + // Select the pinout. Call before .begin() bool setRX(pin_size_t pin); bool setTX(pin_size_t pin); - bool setPinout(pin_size_t tx, pin_size_t rx) { bool ret = setRX(rx); ret &= setTX(tx); return ret; } + bool setPinout(pin_size_t tx, pin_size_t rx) { + bool ret = setRX(rx); + ret &= setTX(tx); + return ret; + } - void begin(unsigned long baud = 115200) override { begin(baud, SERIAL_8N1); }; + void begin(unsigned long baud = 115200) override { + begin(baud, SERIAL_8N1); + }; void begin(unsigned long baud, uint16_t config) override; void end() override; @@ -63,6 +69,6 @@ extern SerialUART Serial1; // HW UART 0 extern SerialUART Serial2; // HW UART 1 namespace arduino { - extern void serialEvent1Run(void) __attribute__((weak)); - extern void serialEvent2Run(void) __attribute__((weak)); +extern void serialEvent1Run(void) __attribute__((weak)); +extern void serialEvent2Run(void) __attribute__((weak)); }; diff --git a/cores/rp2040/SerialUSB.cpp b/cores/rp2040/SerialUSB.cpp index 4f38529e..44fc63af 100644 --- a/cores/rp2040/SerialUSB.cpp +++ b/cores/rp2040/SerialUSB.cpp @@ -1,24 +1,24 @@ /* - * Serial-Over-USB for the Raspberry Pi Pico RP2040 - * Implements an ACM which will reboot into UF2 mode on a 1200bps DTR toggle. - * Much of this was modified from the Raspberry Pi Pico SDK stdio_usb.c file. - * - * Copyright (c) 2021 Earle F. Philhower, III - * - * 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 St, Fifth Floor, Boston, MA 02110-1301 USA - */ + Serial-Over-USB for the Raspberry Pi Pico RP2040 + Implements an ACM which will reboot into UF2 mode on a 1200bps DTR toggle. + Much of this was modified from the Raspberry Pi Pico SDK stdio_usb.c file. + + Copyright (c) 2021 Earle F. Philhower, III + + 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 St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #ifndef USE_TINYUSB @@ -35,8 +35,8 @@ #include "pico/unique_id.h" #ifndef DISABLE_USB_SERIAL - // Ensure we are installed in the USB chain - void __USBInstallSerial() { /* noop */ } +// Ensure we are installed in the USB chain +void __USBInstallSerial() { /* noop */ } #endif // SerialEvent functions are weak, so when the user doesn't define them, @@ -128,7 +128,9 @@ size_t SerialUSB::write(const uint8_t *buf, size_t length) { for (size_t i = 0; i < length;) { int n = length - i; int avail = tud_cdc_write_available(); - if (n > avail) n = avail; + if (n > avail) { + n = avail; + } if (n) { int n2 = tud_cdc_write(buf + i, n); tud_task(); @@ -139,7 +141,7 @@ size_t SerialUSB::write(const uint8_t *buf, size_t length) { tud_task(); tud_cdc_write_flush(); if (!tud_cdc_connected() || - (!tud_cdc_write_available() && time_us_64() > last_avail_time + 1000000 /* 1 second */)) { + (!tud_cdc_write_available() && time_us_64() > last_avail_time + 1000000 /* 1 second */)) { break; } } @@ -167,8 +169,8 @@ static bool _rts = false; static int _bps = 115200; static void CheckSerialReset() { if ((_bps == 1200) && (!_dtr)) { - reset_usb_boot(0,0); - while (1); // WDT will fire here + reset_usb_boot(0, 0); + while (1); // WDT will fire here } } @@ -187,10 +189,9 @@ extern "C" void tud_cdc_line_coding_cb(uint8_t itf, cdc_line_coding_t const* p_l SerialUSB Serial; -void arduino::serialEventRun(void) -{ +void arduino::serialEventRun(void) { if (serialEvent && Serial.available()) { - serialEvent(); + serialEvent(); } } diff --git a/cores/rp2040/SerialUSB.h b/cores/rp2040/SerialUSB.h index c3d0ea56..d3f445ba 100644 --- a/cores/rp2040/SerialUSB.h +++ b/cores/rp2040/SerialUSB.h @@ -1,22 +1,22 @@ /* - * Serial-over-USB for the Raspberry Pi Pico RP2040 - * - * Copyright (c) 2021 Earle F. Philhower, III - * - * 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 St, Fifth Floor, Boston, MA 02110-1301 USA - */ + Serial-over-USB for the Raspberry Pi Pico RP2040 + + Copyright (c) 2021 Earle F. Philhower, III + + 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 St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #ifndef __SERIALUSB_H__ #define __SERIALUSB_H__ @@ -29,7 +29,10 @@ class SerialUSB : public HardwareSerial { public: SerialUSB() { } void begin(unsigned long baud = 115200) override; - void begin(unsigned long baud, uint16_t config) override { (void) config; begin(baud); }; + void begin(unsigned long baud, uint16_t config) override { + (void) config; + begin(baud); + }; void end() override; virtual int peek() override; @@ -49,7 +52,7 @@ private: extern SerialUSB Serial; namespace arduino { - extern void serialEventRun(void) __attribute__((weak)); +extern void serialEventRun(void) __attribute__((weak)); }; #endif diff --git a/cores/rp2040/TinyUSB/tusb_config.h b/cores/rp2040/TinyUSB/tusb_config.h index cd88643a..96b77c21 100644 --- a/cores/rp2040/TinyUSB/tusb_config.h +++ b/cores/rp2040/TinyUSB/tusb_config.h @@ -1,90 +1,90 @@ -/* - * The MIT License (MIT) - * - * Copyright (c) 2018, hathach for Adafruit - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#ifndef _TUSB_CONFIG_H_ -#define _TUSB_CONFIG_H_ - -#ifdef __cplusplus - extern "C" { -#endif - -//-------------------------------------------------------------------- -// COMMON CONFIGURATION -//-------------------------------------------------------------------- -#ifdef USE_TINYUSB - #define CFG_TUSB_RHPORT0_MODE OPT_MODE_DEVICE -#else - #define CFG_TUSB_RHPORT0_MODE OPT_MODE_NONE -#endif - -//#ifndef CFG_TUSB_MCU -// #define CFG_TUSB_MCU OPT_MCU_RP2040 -//#endif -#define CFG_TUSB_OS OPT_OS_PICO - -#define CFG_TUSB_DEBUG 0 -//#if CFG_TUSB_DEBUG -// #define tu_printf serial1_printf -// extern int serial1_printf(const char *__restrict __format, ...); -//#endif - -#define CFG_TUSB_MEM_SECTION -#define CFG_TUSB_MEM_ALIGN TU_ATTR_ALIGNED(4) - -//-------------------------------------------------------------------- -// DEVICE CONFIGURATION -//-------------------------------------------------------------------- - -#define CFG_TUD_ENDOINT0_SIZE 64 - -//------------- CLASS -------------// -#define CFG_TUD_CDC 1 -#define CFG_TUD_MSC 1 -#define CFG_TUD_HID 1 -#define CFG_TUD_MIDI 1 -#define CFG_TUD_VENDOR 1 - -// CDC FIFO size of TX and RX -#define CFG_TUD_CDC_RX_BUFSIZE 256 -#define CFG_TUD_CDC_TX_BUFSIZE 256 - -// MSC Buffer size of Device Mass storage -#define CFG_TUD_MSC_BUFSIZE 512 - -// HID buffer size Should be sufficient to hold ID (if any) + Data -#define CFG_TUD_HID_BUFSIZE 64 - -// MIDI FIFO size of TX and RX +/* + The MIT License (MIT) + + Copyright (c) 2018, hathach for Adafruit + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +#ifndef _TUSB_CONFIG_H_ +#define _TUSB_CONFIG_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +//-------------------------------------------------------------------- +// COMMON CONFIGURATION +//-------------------------------------------------------------------- +#ifdef USE_TINYUSB +#define CFG_TUSB_RHPORT0_MODE OPT_MODE_DEVICE +#else +#define CFG_TUSB_RHPORT0_MODE OPT_MODE_NONE +#endif + +//#ifndef CFG_TUSB_MCU +// #define CFG_TUSB_MCU OPT_MCU_RP2040 +//#endif +#define CFG_TUSB_OS OPT_OS_PICO + +#define CFG_TUSB_DEBUG 0 +//#if CFG_TUSB_DEBUG +// #define tu_printf serial1_printf +// extern int serial1_printf(const char *__restrict __format, ...); +//#endif + +#define CFG_TUSB_MEM_SECTION +#define CFG_TUSB_MEM_ALIGN TU_ATTR_ALIGNED(4) + +//-------------------------------------------------------------------- +// DEVICE CONFIGURATION +//-------------------------------------------------------------------- + +#define CFG_TUD_ENDOINT0_SIZE 64 + +//------------- CLASS -------------// +#define CFG_TUD_CDC 1 +#define CFG_TUD_MSC 1 +#define CFG_TUD_HID 1 +#define CFG_TUD_MIDI 1 +#define CFG_TUD_VENDOR 1 + +// CDC FIFO size of TX and RX +#define CFG_TUD_CDC_RX_BUFSIZE 256 +#define CFG_TUD_CDC_TX_BUFSIZE 256 + +// MSC Buffer size of Device Mass storage +#define CFG_TUD_MSC_BUFSIZE 512 + +// HID buffer size Should be sufficient to hold ID (if any) + Data +#define CFG_TUD_HID_BUFSIZE 64 + +// MIDI FIFO size of TX and RX #define CFG_TUD_MIDI_RX_BUFSIZE 128 #define CFG_TUD_MIDI_TX_BUFSIZE 128 - -// Vendor FIFO size of TX and RX -#define CFG_TUD_VENDOR_RX_BUFSIZE 64 -#define CFG_TUD_VENDOR_TX_BUFSIZE 64 - -#ifdef __cplusplus - } -#endif - -#endif /* _TUSB_CONFIG_H_ */ + +// Vendor FIFO size of TX and RX +#define CFG_TUD_VENDOR_RX_BUFSIZE 64 +#define CFG_TUD_VENDOR_TX_BUFSIZE 64 + +#ifdef __cplusplus +} +#endif + +#endif /* _TUSB_CONFIG_H_ */ diff --git a/cores/rp2040/Tone.cpp b/cores/rp2040/Tone.cpp index f76fd0f2..96d3e6f1 100644 --- a/cores/rp2040/Tone.cpp +++ b/cores/rp2040/Tone.cpp @@ -1,22 +1,22 @@ /* - * Tone for the Raspberry Pi Pico RP2040 - * - * Copyright (c) 2021 Earle F. Philhower, III - * - * 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 St, Fifth Floor, Boston, MA 02110-1301 USA - */ + Tone for the Raspberry Pi Pico RP2040 + + Copyright (c) 2021 Earle F. Philhower, III + + 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 St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #include #include "CoreMutex.h" @@ -50,7 +50,9 @@ void tone(uint8_t pin, unsigned int frequency, unsigned long duration) { // Ensure only 1 core can start or stop at a time CoreMutex m(&_toneMutex); - if (!m) return; // Weird deadlock case + if (!m) { + return; // Weird deadlock case + } int us = 1000000 / frequency / 2; if (us < 5) { @@ -70,7 +72,7 @@ void tone(uint8_t pin, unsigned int frequency, unsigned long duration) { if (!_tonePgm.prepare(&newTone->pio, &newTone->sm, &off)) { DEBUGCORE("ERROR: tone unable to start, out of PIO resources\n"); // ERROR, no free slots - delete newTone; + delete newTone; return; } tone_program_init(newTone->pio, newTone->sm, off, pin); @@ -94,7 +96,7 @@ void noTone(uint8_t pin) { auto entry = _toneMap.find(pin); if (entry != _toneMap.end()) { pio_sm_set_enabled(entry->second->pio, entry->second->sm, false); - pio_sm_unclaim(entry->second->pio, entry->second->sm); + pio_sm_unclaim(entry->second->pio, entry->second->sm); delete entry->second; _toneMap.erase(entry); pinMode(pin, OUTPUT); diff --git a/cores/rp2040/WMath.cpp b/cores/rp2040/WMath.cpp index 27ac4816..ca936659 100644 --- a/cores/rp2040/WMath.cpp +++ b/cores/rp2040/WMath.cpp @@ -1,44 +1,44 @@ /* - Copyright (c) 2014 Arduino. All right reserved. + Copyright (c) 2014 Arduino. All right 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 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. + 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 St, Fifth Floor, Boston, MA 02110-1301 USA + 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 St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "stdlib.h" #include "stdint.h" -void randomSeed( uint32_t dwSeed ) { - if ( dwSeed != 0 ) { - srand( dwSeed ) ; - } +void randomSeed(uint32_t dwSeed) { + if (dwSeed != 0) { + srand(dwSeed) ; + } } -long random( long howbig ) { - if ( howbig == 0 ) { - return 0 ; - } +long random(long howbig) { + if (howbig == 0) { + return 0 ; + } - return rand() % howbig; + return rand() % howbig; } -long random( long howsmall, long howbig ) { - if (howsmall >= howbig) { - return howsmall; - } +long random(long howsmall, long howbig) { + if (howsmall >= howbig) { + return howsmall; + } - long diff = howbig - howsmall; + long diff = howbig - howsmall; - return random(diff) + howsmall; + return random(diff) + howsmall; } diff --git a/cores/rp2040/debug_internal.h b/cores/rp2040/debug_internal.h index 4c83bea8..4f5f8d64 100644 --- a/cores/rp2040/debug_internal.h +++ b/cores/rp2040/debug_internal.h @@ -1,46 +1,46 @@ /* - * Core debug macros header for the Raspberry Pi Pico RP2040 - * - * Copyright (c) 2021 Earle F. Philhower, III - * - * 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 St, Fifth Floor, Boston, MA 02110-1301 USA - */ + Core debug macros header for the Raspberry Pi Pico RP2040 + + Copyright (c) 2021 Earle F. Philhower, III + + 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 St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #if !defined(DEBUG_RP2040_PORT) - #define DEBUGV(...) do { } while(0) - #define DEBUGCORE(...) do { } while(0) - #define DEBUGWIRE(...) do { } while(0) - #define DEBUGSPI(...) do { } while(0) +#define DEBUGV(...) do { } while(0) +#define DEBUGCORE(...) do { } while(0) +#define DEBUGWIRE(...) do { } while(0) +#define DEBUGSPI(...) do { } while(0) #else - #define DEBUGV(fmt, ...) do { DEBUG_RP2040_PORT.printf(fmt, ## __VA_ARGS__); DEBUG_RP2040_PORT.flush(); } while (0) +#define DEBUGV(fmt, ...) do { DEBUG_RP2040_PORT.printf(fmt, ## __VA_ARGS__); DEBUG_RP2040_PORT.flush(); } while (0) - #if defined(DEBUG_RP2040_CORE) - #define DEBUGCORE(fmt, ...) do { DEBUG_RP2040_PORT.printf(fmt, ## __VA_ARGS__); DEBUG_RP2040_PORT.flush(); } while (0) - #else - #define DEBUGCORE(...) do { } while(0) - #endif +#if defined(DEBUG_RP2040_CORE) +#define DEBUGCORE(fmt, ...) do { DEBUG_RP2040_PORT.printf(fmt, ## __VA_ARGS__); DEBUG_RP2040_PORT.flush(); } while (0) +#else +#define DEBUGCORE(...) do { } while(0) +#endif - #if defined(DEBUG_RP2040_WIRE) - #define DEBUGWIRE(fmt, ...) do { DEBUG_RP2040_PORT.printf(fmt, ## __VA_ARGS__); DEBUG_RP2040_PORT.flush(); } while (0) - #else - #define DEBUGWIRE(...) do { } while(0) - #endif +#if defined(DEBUG_RP2040_WIRE) +#define DEBUGWIRE(fmt, ...) do { DEBUG_RP2040_PORT.printf(fmt, ## __VA_ARGS__); DEBUG_RP2040_PORT.flush(); } while (0) +#else +#define DEBUGWIRE(...) do { } while(0) +#endif - #if defined(DEBUG_RP2040_SPI) - #define DEBUGSPI(fmt, ...) do { DEBUG_RP2040_PORT.printf(fmt, ## __VA_ARGS__); DEBUG_RP2040_PORT.flush(); } while (0) - #else - #define DEBUGSPI(...) do { } while(0) - #endif +#if defined(DEBUG_RP2040_SPI) +#define DEBUGSPI(fmt, ...) do { DEBUG_RP2040_PORT.printf(fmt, ## __VA_ARGS__); DEBUG_RP2040_PORT.flush(); } while (0) +#else +#define DEBUGSPI(...) do { } while(0) +#endif #endif diff --git a/cores/rp2040/delay.cpp b/cores/rp2040/delay.cpp index eb5d571e..3e9dc1bf 100644 --- a/cores/rp2040/delay.cpp +++ b/cores/rp2040/delay.cpp @@ -1,22 +1,22 @@ /* - * delay() for the Raspberry Pi Pico RP2040 - * - * Copyright (c) 2021 Earle F. Philhower, III - * - * 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 St, Fifth Floor, Boston, MA 02110-1301 USA - */ + delay() for the Raspberry Pi Pico RP2040 + + Copyright (c) 2021 Earle F. Philhower, III + + 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 St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #include #include @@ -28,35 +28,35 @@ extern "C" { -void delay( unsigned long ms ) { - if (!ms) { - return; + void delay(unsigned long ms) { + if (!ms) { + return; + } + + sleep_ms(ms); } - sleep_ms(ms); -} - -void delayMicroseconds( unsigned int usec ) { - if (!usec) { - return; + void delayMicroseconds(unsigned int usec) { + if (!usec) { + return; + } + sleep_us(usec); } - sleep_us(usec); -} -void yield() { + void yield() { #ifdef USE_TINYUSB - TinyUSB_Device_Task(); - TinyUSB_Device_FlushCDC(); + TinyUSB_Device_Task(); + TinyUSB_Device_FlushCDC(); #endif -} + } -uint32_t millis() { - return to_ms_since_boot(get_absolute_time()); -} + uint32_t millis() { + return to_ms_since_boot(get_absolute_time()); + } -uint32_t micros() { - return to_us_since_boot(get_absolute_time()); -} + uint32_t micros() { + return to_us_since_boot(get_absolute_time()); + } } // extern C diff --git a/cores/rp2040/main.cpp b/cores/rp2040/main.cpp index 1495ce1e..fd22ebf8 100644 --- a/cores/rp2040/main.cpp +++ b/cores/rp2040/main.cpp @@ -1,22 +1,22 @@ /* - * Main handler for the Raspberry Pi Pico RP2040 - * - * Copyright (c) 2021 Earle F. Philhower, III - * - * 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 St, Fifth Floor, Boston, MA 02110-1301 USA - */ + Main handler for the Raspberry Pi Pico RP2040 + + Copyright (c) 2021 Earle F. Philhower, III + + 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 St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #include #include "RP2040USB.h" @@ -67,10 +67,10 @@ extern "C" int main() { #else __USBStart(); - #ifndef DISABLE_USB_SERIAL +#ifndef DISABLE_USB_SERIAL // Enable serial port for reset/upload always Serial.begin(); - #endif +#endif #endif #if defined DEBUG_RP2040_PORT diff --git a/cores/rp2040/millis.cpp b/cores/rp2040/millis.cpp index 143de387..194ab4c6 100644 --- a/cores/rp2040/millis.cpp +++ b/cores/rp2040/millis.cpp @@ -1,22 +1,22 @@ /* - * Millis() for the Raspberry Pi Pico RP2040 - * - * Copyright (c) 2021 Earle F. Philhower, III - * - * 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 St, Fifth Floor, Boston, MA 02110-1301 USA - */ + Millis() for the Raspberry Pi Pico RP2040 + + Copyright (c) 2021 Earle F. Philhower, III + + 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 St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #include diff --git a/cores/rp2040/posix.cpp b/cores/rp2040/posix.cpp index b3829ce5..2fc55e7f 100644 --- a/cores/rp2040/posix.cpp +++ b/cores/rp2040/posix.cpp @@ -1,22 +1,22 @@ /* - * NEWLIB syscall implementations - * - * Copyright (c) 2021 Earle F. Philhower, III - * - * 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 St, Fifth Floor, Boston, MA 02110-1301 USA - */ + NEWLIB syscall implementations + + Copyright (c) 2021 Earle F. Philhower, III + + 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 St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #include #include @@ -45,7 +45,7 @@ extern "C" ssize_t _write(int fd, const void *buf, size_t count) { #endif } -extern "C" int _chown (const char *path, uid_t owner, gid_t group) { +extern "C" int _chown(const char *path, uid_t owner, gid_t group) { (void) path; (void) owner; (void) group; @@ -53,13 +53,13 @@ extern "C" int _chown (const char *path, uid_t owner, gid_t group) { return -1; } -extern "C" int _close (int fd) { +extern "C" int _close(int fd) { (void) fd; errno = ENOSYS; return -1; } -extern "C" int _execve (char *name, char **argv, char **env) { +extern "C" int _execve(char *name, char **argv, char **env) { (void) name; (void) argv; (void) env; @@ -67,26 +67,26 @@ extern "C" int _execve (char *name, char **argv, char **env) { return -1; } -extern "C" int _fork (void) { +extern "C" int _fork(void) { errno = ENOSYS; return -1; } -extern "C" int _fstat (int fd, struct stat *st) { +extern "C" int _fstat(int fd, struct stat *st) { (void) fd; (void) st; errno = ENOSYS; return -1; } -extern "C" int _getpid (void) { +extern "C" int _getpid(void) { errno = ENOSYS; return -1; } static int64_t __timedelta_us = 0.0; -extern "C" int _gettimeofday (struct timeval *tv, void *tz) { +extern "C" int _gettimeofday(struct timeval *tv, void *tz) { (void) tz; uint64_t now_us = to_us_since_boot(get_absolute_time()) + __timedelta_us; if (tv) { @@ -96,7 +96,7 @@ extern "C" int _gettimeofday (struct timeval *tv, void *tz) { return 0; } -extern "C" int settimeofday (const struct timeval *tv, const struct timezone *tz) { +extern "C" int settimeofday(const struct timeval *tv, const struct timezone *tz) { (void) tz; uint64_t now_us = to_us_since_boot(get_absolute_time()); if (tv) { @@ -108,27 +108,27 @@ extern "C" int settimeofday (const struct timeval *tv, const struct timezone *tz return 0; } -extern "C" int _isatty (int file) { +extern "C" int _isatty(int file) { (void) file; errno = ENOSYS; return 0; } -extern "C" int _kill (int pid, int sig) { +extern "C" int _kill(int pid, int sig) { (void) pid; (void) sig; errno = ENOSYS; return -1; } -extern "C" int _link (char *existing, char *newlink) { +extern "C" int _link(char *existing, char *newlink) { (void) existing; (void) newlink; errno = ENOSYS; return -1; } -extern "C" int _lseek (int file, int ptr, int dir) { +extern "C" int _lseek(int file, int ptr, int dir) { (void) file; (void) ptr; (void) dir; @@ -136,7 +136,7 @@ extern "C" int _lseek (int file, int ptr, int dir) { return -1; } -extern "C" int _open (char *file, int flags, int mode) { +extern "C" int _open(char *file, int flags, int mode) { (void) file; (void) flags; (void) mode; @@ -144,16 +144,15 @@ extern "C" int _open (char *file, int flags, int mode) { return -1; } -extern "C" int _read (int file, char *ptr, int len) -{ +extern "C" int _read(int file, char *ptr, int len) { (void) file; (void) ptr; (void) len; -// return Serial.read(ptr, len); + // return Serial.read(ptr, len); return -1; } -extern "C" int _readlink (const char *path, char *buf, size_t bufsize) { +extern "C" int _readlink(const char *path, char *buf, size_t bufsize) { (void) path; (void) buf; (void) bufsize; @@ -161,33 +160,33 @@ extern "C" int _readlink (const char *path, char *buf, size_t bufsize) { return -1; } -extern "C" int _stat (const char *file, struct stat *st) { +extern "C" int _stat(const char *file, struct stat *st) { (void) file; (void) st; errno = ENOSYS; return -1; } -extern "C" int _symlink (const char *path1, const char *path2) { +extern "C" int _symlink(const char *path1, const char *path2) { (void) path1; (void) path2; errno = ENOSYS; return -1; } -extern "C" clock_t _times (struct tms *buf) { +extern "C" clock_t _times(struct tms *buf) { (void) buf; errno = ENOSYS; return -1; } -extern "C" int _unlink (char *name) { +extern "C" int _unlink(char *name) { (void) name; errno = ENOSYS; return -1; } -extern "C" int _wait (int *status) { +extern "C" int _wait(int *status) { (void) status; errno = ENOSYS; return -1; diff --git a/cores/rp2040/stdlib_noniso.cpp b/cores/rp2040/stdlib_noniso.cpp index fbed0a8d..bea032ae 100644 --- a/cores/rp2040/stdlib_noniso.cpp +++ b/cores/rp2040/stdlib_noniso.cpp @@ -1,23 +1,23 @@ /* - stdlib_noniso.h - nonstandard (but useful) conversion functions + stdlib_noniso.h - nonstandard (but useful) conversion functions - Copyright (c) 2014 Ivan Grokhotkov. All rights reserved. - Copyright (c) 2021 David Gauchard. All rights reserved. - This file is part of the esp8266 core for Arduino environment. + Copyright (c) 2014 Ivan Grokhotkov. All rights reserved. + Copyright (c) 2021 David Gauchard. All rights reserved. + This file is part of the esp8266 core for Arduino environment. - 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 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. + 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 St, Fifth Floor, Boston, MA 02110-1301 USA + 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 St, Fifth Floor, Boston, MA 02110-1301 USA */ #include @@ -32,37 +32,31 @@ // but is smaller by ~800B/flash and ~250B/rodata // ulltoa fills str backwards and can return a pointer different from str -extern "C" char* ulltoa(unsigned long long val, char* str, int slen, unsigned int radix) -{ +extern "C" char* ulltoa(unsigned long long val, char* str, int slen, unsigned int radix) { str += --slen; *str = 0; - do - { + do { auto mod = val % radix; val /= radix; *--str = mod + ((mod > 9) ? ('a' - 10) : '0'); } while (--slen && val); - return val? nullptr: str; + return val ? nullptr : str; } // lltoa fills str backwards and can return a pointer different from str -extern "C" char* lltoa (long long val, char* str, int slen, unsigned int radix) -{ +extern "C" char* lltoa(long long val, char* str, int slen, unsigned int radix) { bool neg; - if (val < 0) - { + if (val < 0) { val = -val; neg = true; - } - else - { + } else { neg = false; } char* ret = ulltoa(val, str, slen, radix); - if (neg) - { - if (ret == str || ret == nullptr) + if (neg) { + if (ret == str || ret == nullptr) { return nullptr; + } *--ret = '-'; } return ret; @@ -92,7 +86,7 @@ extern "C" char * dtostrf(double number, signed char width, unsigned char prec, int fillme = width; // how many cells to fill for the integer part if (prec > 0) { - fillme -= (prec+1); + fillme -= (prec + 1); } // Handle negative numbers @@ -105,8 +99,9 @@ extern "C" char * dtostrf(double number, signed char width, unsigned char prec, // Round correctly so that print(1.999, 2) prints as "2.00" // I optimized out most of the divisions double rounding = 2.0; - for (uint8_t i = 0; i < prec; ++i) + for (uint8_t i = 0; i < prec; ++i) { rounding *= 10.0; + } rounding = 1.0 / rounding; number += rounding; @@ -132,14 +127,18 @@ extern "C" char * dtostrf(double number, signed char width, unsigned char prec, } // Handle negative sign - if (negative) *out++ = '-'; + if (negative) { + *out++ = '-'; + } // Print the digits, and if necessary, the decimal point digitcount += prec; int8_t digit = 0; while (digitcount-- > 0) { digit = (int8_t)number; - if (digit > 9) digit = 9; // insurance + if (digit > 9) { + digit = 9; // insurance + } *out++ = (char)('0' | digit); if ((digitcount == prec) && (prec > 0)) { *out++ = '.'; @@ -161,8 +160,7 @@ extern "C" char * dtostrf(double number, signed char width, unsigned char prec, */ extern "C" const char* strrstr(const char*__restrict p_pcString, - const char*__restrict p_pcPattern) -{ + const char*__restrict p_pcPattern) { const char* pcResult = 0; size_t stStringLength = (p_pcString ? strlen(p_pcString) : 0); @@ -170,13 +168,10 @@ extern "C" const char* strrstr(const char*__restrict p_pcString, if ((stStringLength) && (stPatternLength) && - (stPatternLength <= stStringLength)) - { + (stPatternLength <= stStringLength)) { // Pattern is shorter or has the same length than the string - for (const char* s = (p_pcString + stStringLength - stPatternLength); s >= p_pcString; --s) - { - if (0 == strncmp(s, p_pcPattern, stPatternLength)) - { + for (const char* s = (p_pcString + stStringLength - stPatternLength); s >= p_pcString; --s) { + if (0 == strncmp(s, p_pcPattern, stPatternLength)) { pcResult = s; break; } diff --git a/cores/rp2040/stdlib_noniso.h b/cores/rp2040/stdlib_noniso.h index f86f78be..f350ea4a 100644 --- a/cores/rp2040/stdlib_noniso.h +++ b/cores/rp2040/stdlib_noniso.h @@ -1,29 +1,29 @@ /* - stdlib_noniso.h - nonstandard (but useful) conversion functions + stdlib_noniso.h - nonstandard (but useful) conversion functions - Copyright (c) 2014 Ivan Grokhotkov. All rights reserved. - This file is part of the esp8266 core for Arduino environment. + Copyright (c) 2014 Ivan Grokhotkov. All rights reserved. + This file is part of the esp8266 core for Arduino environment. - 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 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. + 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 St, Fifth Floor, Boston, MA 02110-1301 USA + 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 St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef STDLIB_NONISO_H #define STDLIB_NONISO_H #ifdef __cplusplus -extern "C"{ +extern "C" { #endif int atoi(const char *s); @@ -32,19 +32,19 @@ long atol(const char* s); double atof(const char* s); -char* itoa (int val, char *s, int radix); +char* itoa(int val, char *s, int radix); -char* ltoa (long val, char *s, int radix); +char* ltoa(long val, char *s, int radix); -char* lltoa (long long val, char* str, int slen, unsigned int radix); +char* lltoa(long long val, char* str, int slen, unsigned int radix); -char* utoa (unsigned int val, char *s, int radix); +char* utoa(unsigned int val, char *s, int radix); -char* ultoa (unsigned long val, char *s, int radix); +char* ultoa(unsigned long val, char *s, int radix); -char* ulltoa (unsigned long long val, char* str, int slen, unsigned int radix); +char* ulltoa(unsigned long long val, char* str, int slen, unsigned int radix); -char* dtostrf (double val, signed char width, unsigned char prec, char *s); +char* dtostrf(double val, signed char width, unsigned char prec, char *s); void reverse(char* begin, char* end); diff --git a/cores/rp2040/tone.pio.h b/cores/rp2040/tone.pio.h index 8fbc4d78..5d427daf 100644 --- a/cores/rp2040/tone.pio.h +++ b/cores/rp2040/tone.pio.h @@ -14,16 +14,16 @@ #define tone_wrap 7 static const uint16_t tone_program_instructions[] = { - // .wrap_target - 0x80a0, // 0: pull block - 0xa027, // 1: mov x, osr - 0xb846, // 2: mov y, isr side 1 - 0x0083, // 3: jmp y--, 3 - 0x0045, // 4: jmp x--, 5 - 0xb046, // 5: mov y, isr side 0 - 0x0086, // 6: jmp y--, 6 - 0x0042, // 7: jmp x--, 2 - // .wrap + // .wrap_target + 0x80a0, // 0: pull block + 0xa027, // 1: mov x, osr + 0xb846, // 2: mov y, isr side 1 + 0x0083, // 3: jmp y--, 3 + 0x0045, // 4: jmp x--, 5 + 0xb046, // 5: mov y, isr side 0 + 0x0086, // 6: jmp y--, 6 + 0x0042, // 7: jmp x--, 2 + // .wrap }; #if !PICO_NO_HARDWARE @@ -41,11 +41,11 @@ static inline pio_sm_config tone_program_get_default_config(uint offset) { } static inline void tone_program_init(PIO pio, uint sm, uint offset, uint pin) { - pio_gpio_init(pio, pin); - pio_sm_set_consecutive_pindirs(pio, sm, pin, 1, true); - pio_sm_config c = tone_program_get_default_config(offset); - sm_config_set_sideset_pins(&c, pin); - pio_sm_init(pio, sm, offset, &c); + pio_gpio_init(pio, pin); + pio_sm_set_consecutive_pindirs(pio, sm, pin, 1, true); + pio_sm_config c = tone_program_get_default_config(offset); + sm_config_set_sideset_pins(&c, pin); + pio_sm_init(pio, sm, offset, &c); } #endif diff --git a/cores/rp2040/wiring_analog.cpp b/cores/rp2040/wiring_analog.cpp index d3110187..23a49002 100644 --- a/cores/rp2040/wiring_analog.cpp +++ b/cores/rp2040/wiring_analog.cpp @@ -1,22 +1,22 @@ /* - * PWM and analogRead for the Raspberry Pi Pico RP2040 - * - * Copyright (c) 2021 Earle F. Philhower, III - * - * 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 St, Fifth Floor, Boston, MA 02110-1301 USA - */ + PWM and analogRead for the Raspberry Pi Pico RP2040 + + Copyright (c) 2021 Earle F. Philhower, III + + 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 St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #include #include @@ -78,14 +78,14 @@ extern "C" void analogWrite(pin_size_t pin, int val) { } if (!pwmInitted) { pwm_config c = pwm_get_default_config(); - pwm_config_set_clkdiv( &c, clock_get_hz(clk_sys) / (float) (analogScale * analogFreq) ); - pwm_config_set_wrap( &c, analogScale ); - for (int i=0; i<30; i++) { + pwm_config_set_clkdiv(&c, clock_get_hz(clk_sys) / (float)(analogScale * analogFreq)); + pwm_config_set_wrap(&c, analogScale); + for (int i = 0; i < 30; i++) { pwm_init(pwm_gpio_to_slice_num(i), &c, true); } pwmInitted = true; } - + if (val < 0) { val = 0; } else if ((uint32_t)val > analogScale) { diff --git a/cores/rp2040/wiring_digital.cpp b/cores/rp2040/wiring_digital.cpp index 67d83576..999bd953 100644 --- a/cores/rp2040/wiring_digital.cpp +++ b/cores/rp2040/wiring_digital.cpp @@ -1,54 +1,54 @@ /* - * pinMode and digitalRead/Write for the Raspberry Pi Pico RP2040 - * - * Copyright (c) 2021 Earle F. Philhower, III - * - * 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 St, Fifth Floor, Boston, MA 02110-1301 USA - */ + pinMode and digitalRead/Write for the Raspberry Pi Pico RP2040 + + Copyright (c) 2021 Earle F. Philhower, III + + 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 St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #include "Arduino.h" #include static PinMode _pm[30]; -extern "C" void pinMode( pin_size_t ulPin, PinMode ulMode ) { +extern "C" void pinMode(pin_size_t ulPin, PinMode ulMode) { switch (ulMode) { - case INPUT: - gpio_init(ulPin); - gpio_set_dir(ulPin, false); - break; - case INPUT_PULLUP: - gpio_init(ulPin); - gpio_set_dir(ulPin, false); - gpio_pull_up(ulPin); - gpio_put(ulPin, 0); - break; - case INPUT_PULLDOWN: - gpio_init(ulPin); - gpio_set_dir(ulPin, false); - gpio_pull_down(ulPin); - gpio_put(ulPin, 1); - break; - case OUTPUT: - gpio_init(ulPin); - gpio_set_dir(ulPin, true); - break; - default: - DEBUGCORE("ERROR: Illegal pinMode mode (%d)\n", ulMode); - // Error - return; + case INPUT: + gpio_init(ulPin); + gpio_set_dir(ulPin, false); + break; + case INPUT_PULLUP: + gpio_init(ulPin); + gpio_set_dir(ulPin, false); + gpio_pull_up(ulPin); + gpio_put(ulPin, 0); + break; + case INPUT_PULLDOWN: + gpio_init(ulPin); + gpio_set_dir(ulPin, false); + gpio_pull_down(ulPin); + gpio_put(ulPin, 1); + break; + case OUTPUT: + gpio_init(ulPin); + gpio_set_dir(ulPin, true); + break; + default: + DEBUGCORE("ERROR: Illegal pinMode mode (%d)\n", ulMode); + // Error + return; } if (ulPin > 29) { @@ -58,7 +58,7 @@ extern "C" void pinMode( pin_size_t ulPin, PinMode ulMode ) { _pm[ulPin] = ulMode; } -extern "C" void digitalWrite( pin_size_t ulPin, PinStatus ulVal ) { +extern "C" void digitalWrite(pin_size_t ulPin, PinStatus ulVal) { if (ulPin > 29) { DEBUGCORE("ERROR: Illegal pin in pinMode (%d)\n", ulPin); return; @@ -80,7 +80,7 @@ extern "C" void digitalWrite( pin_size_t ulPin, PinStatus ulVal ) { } } -extern "C" PinStatus digitalRead( pin_size_t ulPin ) { +extern "C" PinStatus digitalRead(pin_size_t ulPin) { if (ulPin > 29) { DEBUGCORE("ERROR: Illegal pin in digitalRead (%d)\n", ulPin); return LOW; diff --git a/cores/rp2040/wiring_private.cpp b/cores/rp2040/wiring_private.cpp index 1ceeedc7..8d18d2b3 100644 --- a/cores/rp2040/wiring_private.cpp +++ b/cores/rp2040/wiring_private.cpp @@ -1,22 +1,22 @@ /* - * wiring_private for the Raspberry Pi Pico RP2040 - * - * Copyright (c) 2021 Earle F. Philhower, III - * - * 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 St, Fifth Floor, Boston, MA 02110-1301 USA - */ + wiring_private for the Raspberry Pi Pico RP2040 + + Copyright (c) 2021 Earle F. Philhower, III + + 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 St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #include #include @@ -52,7 +52,7 @@ void _gpioInterruptDispatcher(uint gpio, uint32_t events) { // Only need to lock around the std::map check, not the whole IRQ callback voidFuncPtr cb = nullptr; { - CoreMutex m(&_irqMutex); + CoreMutex m(&_irqMutex); if (m) { auto irq = _map.find(gpio); if (irq != _map.end()) { @@ -75,12 +75,12 @@ extern "C" void attachInterrupt(pin_size_t pin, voidFuncPtr callback, PinStatus uint32_t events; switch (mode) { - case LOW: events = 1; break; - case HIGH: events = 2; break; - case FALLING: events = 4; break; - case RISING: events = 8; break; - case CHANGE: events = 4 | 8; break; - default: return; // ERROR + case LOW: events = 1; break; + case HIGH: events = 2; break; + case FALLING: events = 4; break; + case RISING: events = 8; break; + case CHANGE: events = 4 | 8; break; + default: return; // ERROR } noInterrupts(); detachInterrupt(pin); diff --git a/cores/rp2040/wiring_pulse.cpp b/cores/rp2040/wiring_pulse.cpp index 1d198d96..7f162933 100644 --- a/cores/rp2040/wiring_pulse.cpp +++ b/cores/rp2040/wiring_pulse.cpp @@ -1,29 +1,28 @@ /* - * pulseIn for the Raspberry Pi Pico RP2040 - * - * Copyright (c) 2021 Earle F. Philhower, III - * - * 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 St, Fifth Floor, Boston, MA 02110-1301 USA - */ + pulseIn for the Raspberry Pi Pico RP2040 + + Copyright (c) 2021 Earle F. Philhower, III + + 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 St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #include #include #include -extern "C" unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout) -{ +extern "C" unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout) { uint64_t start = time_us_64(); uint64_t abort = start + timeout; @@ -33,23 +32,28 @@ extern "C" unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeo } // Wait for deassert, if needed - while ((!!gpio_get(pin) != !state) && (time_us_64() < abort) ); - if (time_us_64() >= abort) return 0; + while ((!!gpio_get(pin) != !state) && (time_us_64() < abort)); + if (time_us_64() >= abort) { + return 0; + } // Wait for assert - while ((!!gpio_get(pin) != !state) && (time_us_64() < abort) ); + while ((!!gpio_get(pin) != !state) && (time_us_64() < abort)); uint64_t begin = time_us_64(); - if (begin >= abort) return 0; + if (begin >= abort) { + return 0; + } // Wait for deassert - while ((!!gpio_get(pin) != !state) && (time_us_64() < abort) ); + while ((!!gpio_get(pin) != !state) && (time_us_64() < abort)); uint64_t end = time_us_64(); - if (end >= abort) return 0; + if (end >= abort) { + return 0; + } return end - begin; } -extern "C" unsigned long pulseInLong(uint8_t pin, uint8_t state, unsigned long timeout) -{ +extern "C" unsigned long pulseInLong(uint8_t pin, uint8_t state, unsigned long timeout) { return pulseIn(pin, state, timeout); } diff --git a/cores/rp2040/wiring_shift.cpp b/cores/rp2040/wiring_shift.cpp index e8a61ea4..16ba7c75 100644 --- a/cores/rp2040/wiring_shift.cpp +++ b/cores/rp2040/wiring_shift.cpp @@ -1,22 +1,22 @@ /* - * wiring_shift.c - shiftOut() function - * Part of Arduino - http://www.arduino.cc/ - * - * Copyright (c) 2005-2006 David A. Mellis - * - * 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., 59 Temple Place, Suite 330, - * Boston, MA 02111-1307 USA + wiring_shift.c - shiftOut() function + Part of Arduino - http://www.arduino.cc/ + + Copyright (c) 2005-2006 David A. Mellis + + 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., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA */ #include @@ -33,13 +33,13 @@ extern "C" uint8_t shiftIn(pin_size_t dataPin, pin_size_t clockPin, BitOrder bit return 0; } for (i = 0; i < 8; ++i) { - digitalWrite(clockPin, HIGH); - if (bitOrder == LSBFIRST) { - value |= digitalRead(dataPin) << i; - } else { - value |= digitalRead(dataPin) << (7 - i); - } - digitalWrite(clockPin, LOW); + digitalWrite(clockPin, HIGH); + if (bitOrder == LSBFIRST) { + value |= digitalRead(dataPin) << i; + } else { + value |= digitalRead(dataPin) << (7 - i); + } + digitalWrite(clockPin, LOW); } return value; } @@ -55,13 +55,13 @@ extern "C" void shiftOut(pin_size_t dataPin, pin_size_t clockPin, BitOrder bitOr return; } for (i = 0; i < 8; i++) { - if (bitOrder == LSBFIRST) { + if (bitOrder == LSBFIRST) { digitalWrite(dataPin, !!(val & (1 << i))); } else { digitalWrite(dataPin, !!(val & (1 << (7 - i)))); } - + digitalWrite(clockPin, HIGH); - digitalWrite(clockPin, LOW); + digitalWrite(clockPin, LOW); } } diff --git a/libraries/EEPROM/EEPROM.cpp b/libraries/EEPROM/EEPROM.cpp index 3cab68c3..a8c70f34 100644 --- a/libraries/EEPROM/EEPROM.cpp +++ b/libraries/EEPROM/EEPROM.cpp @@ -1,23 +1,23 @@ /* - * EEPROM.cpp - RP2040 EEPROM emulation - * Copyright (c) 2021 Earle F. Philhower III. All rights reserved. - * - * Based on ESP8266 EEPROM library, which is - * Copyright (c) 2014 Ivan Grokhotkov. 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 St, Fifth Floor, Boston, MA 02110-1301 USA + EEPROM.cpp - RP2040 EEPROM emulation + Copyright (c) 2021 Earle F. Philhower III. All rights reserved. + + Based on ESP8266 EEPROM library, which is + Copyright (c) 2014 Ivan Grokhotkov. 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 St, Fifth Floor, Boston, MA 02110-1301 USA */ #include @@ -28,8 +28,7 @@ extern "C" uint8_t _EEPROM_start; EEPROMClass::EEPROMClass(void) -: _sector(&_EEPROM_start) -{ + : _sector(&_EEPROM_start) { } void EEPROMClass::begin(size_t size) { @@ -43,7 +42,7 @@ void EEPROMClass::begin(size_t size) { if (_data && size != _size) { delete[] _data; _data = new uint8_t[size]; - } else if(!_data) { + } else if (!_data) { _data = new uint8_t[size]; } @@ -60,7 +59,7 @@ bool EEPROMClass::end() { } retval = commit(); - if (_data) { + if (_data) { delete[] _data; } _data = 0; @@ -98,12 +97,15 @@ void EEPROMClass::write(int const address, uint8_t const value) { } bool EEPROMClass::commit() { - if (!_size) + if (!_size) { return false; - if (!_dirty) + } + if (!_dirty) { return true; - if (!_data) + } + if (!_data) { return false; + } noInterrupts(); rp2040.idleOtherCore(); diff --git a/libraries/EEPROM/EEPROM.h b/libraries/EEPROM/EEPROM.h index 7d705742..21d8be91 100644 --- a/libraries/EEPROM/EEPROM.h +++ b/libraries/EEPROM/EEPROM.h @@ -1,22 +1,22 @@ -/* - EEPROM.cpp - RPI2040 EEPROM emulation +/* + EEPROM.cpp - RPI2040 EEPROM emulation - Copyright (c) 2014 Ivan Grokhotkov. All rights reserved. - This file is part of the esp8266 core for Arduino environment. - - 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. + Copyright (c) 2014 Ivan Grokhotkov. All rights reserved. + This file is part of the esp8266 core for Arduino environment. - 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. + 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. - 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 St, Fifth Floor, Boston, MA 02110-1301 USA + 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 St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef EEPROM_h @@ -28,48 +28,56 @@ class EEPROMClass { public: - EEPROMClass(void); + EEPROMClass(void); - void begin(size_t size); - uint8_t read(int const address); - void write(int const address, uint8_t const val); - bool commit(); - bool end(); + void begin(size_t size); + uint8_t read(int const address); + void write(int const address, uint8_t const val); + bool commit(); + bool end(); - uint8_t * getDataPtr(); - uint8_t const * getConstDataPtr() const; + uint8_t * getDataPtr(); + uint8_t const * getConstDataPtr() const; - template - T &get(int const address, T &t) { - if (address < 0 || address + sizeof(T) > _size) - return t; + template + T &get(int const address, T &t) { + if (address < 0 || address + sizeof(T) > _size) { + return t; + } - memcpy((uint8_t*) &t, _data + address, sizeof(T)); - return t; - } - - template - const T &put(int const address, const T &t) { - if (address < 0 || address + sizeof(T) > _size) - return t; - if (memcmp(_data + address, (const uint8_t*)&t, sizeof(T)) != 0) { - _dirty = true; - memcpy(_data + address, (const uint8_t*)&t, sizeof(T)); + memcpy((uint8_t*) &t, _data + address, sizeof(T)); + return t; } - return t; - } + template + const T &put(int const address, const T &t) { + if (address < 0 || address + sizeof(T) > _size) { + return t; + } + if (memcmp(_data + address, (const uint8_t*)&t, sizeof(T)) != 0) { + _dirty = true; + memcpy(_data + address, (const uint8_t*)&t, sizeof(T)); + } - size_t length() {return _size;} + return t; + } - uint8_t& operator[](int const address) {return getDataPtr()[address];} - uint8_t const & operator[](int const address) const {return getConstDataPtr()[address];} + size_t length() { + return _size; + } + + uint8_t& operator[](int const address) { + return getDataPtr()[address]; + } + uint8_t const & operator[](int const address) const { + return getConstDataPtr()[address]; + } protected: - uint8_t* _sector; - uint8_t* _data = nullptr; - size_t _size = 0; - bool _dirty = false; + uint8_t* _sector; + uint8_t* _data = nullptr; + size_t _size = 0; + bool _dirty = false; }; extern EEPROMClass EEPROM; diff --git a/libraries/I2S/src/I2S.cpp b/libraries/I2S/src/I2S.cpp index 1e0b5410..75341e01 100644 --- a/libraries/I2S/src/I2S.cpp +++ b/libraries/I2S/src/I2S.cpp @@ -1,22 +1,22 @@ /* - * I2S Master library for the Raspberry Pi Pico RP2040 - * - * Copyright (c) 2021 Earle F. Philhower, III - * - * 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 St, Fifth Floor, Boston, MA 02110-1301 USA - */ + I2S Master library for the Raspberry Pi Pico RP2040 + + Copyright (c) 2021 Earle F. Philhower, III + + 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 St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #include #include "I2S.h" @@ -206,7 +206,7 @@ size_t I2SClass::write(const void *buffer, size_t size) { _curBuff->sample_count += writeSize; inSamples += writeSize; written += writeSize; - wantToWrite -= writeSize; + wantToWrite -= writeSize; if (_curBuff->sample_count == _curBuff->max_sample_count) { _audio_format.sample_freq = _freq; give_audio_buffer(_pool, _curBuff); diff --git a/libraries/I2S/src/I2S.h b/libraries/I2S/src/I2S.h index 52f507bd..96a4cfe1 100644 --- a/libraries/I2S/src/I2S.h +++ b/libraries/I2S/src/I2S.h @@ -1,65 +1,70 @@ /* - * I2S Master library for the Raspberry Pi Pico RP2040 - * - * Copyright (c) 2021 Earle F. Philhower, III - * - * 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 St, Fifth Floor, Boston, MA 02110-1301 USA - */ + I2S Master library for the Raspberry Pi Pico RP2040 + + Copyright (c) 2021 Earle F. Philhower, III + + 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 St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #pragma once #include #include "pico/audio_i2s.h" -class I2SClass : public Stream -{ +class I2SClass : public Stream { public: - I2SClass(); + I2SClass(); - // Only 16 bitsPerSample are allowed by the PIO code. Only write, no read. - bool setBCLK(pin_size_t pin); - bool setDOUT(pin_size_t pin); - bool begin(long sampleRate); - void end(); + // Only 16 bitsPerSample are allowed by the PIO code. Only write, no read. + bool setBCLK(pin_size_t pin); + bool setDOUT(pin_size_t pin); + bool begin(long sampleRate); + void end(); - // from Stream - virtual int available() override { return -1; } - virtual int read() override { return -1; } - virtual int peek() override { return -1; } - virtual void flush() override; + // from Stream + virtual int available() override { + return -1; + } + virtual int read() override { + return -1; + } + virtual int peek() override { + return -1; + } + virtual void flush() override; - // from Print (see notes on write() methods below) - virtual size_t write(uint8_t) override; - virtual size_t write(const uint8_t *buffer, size_t size) override; - virtual int availableForWrite() override; + // from Print (see notes on write() methods below) + virtual size_t write(uint8_t) override; + virtual size_t write(const uint8_t *buffer, size_t size) override; + virtual int availableForWrite() override; - bool setFrequency(int newFreq); + bool setFrequency(int newFreq); - // Write a single L:R sample to the I2S device. Blocking until write succeeds - size_t write(int16_t); - // Write up to size samples to the I2S device. Non-blocking, will write - // from 0...size samples and return that count. Be sure your app handles - // partial writes (i.e. by yield()ing and then retrying to write the - // remaining data. - size_t write(const void *buffer, size_t lrsamples); + // Write a single L:R sample to the I2S device. Blocking until write succeeds + size_t write(int16_t); + // Write up to size samples to the I2S device. Non-blocking, will write + // from 0...size samples and return that count. Be sure your app handles + // partial writes (i.e. by yield()ing and then retrying to write the + // remaining data. + size_t write(const void *buffer, size_t lrsamples); - // Note that these callback are called from **INTERRUPT CONTEXT** and hence - // must be both stored in IRAM and not perform anything that's not legal in - // an interrupt - //void onTransmit(void(*)(void)); -- Not yet implemented, need to edit pico-extra to get callback - //void onReceive(void(*)(void)); -- no I2S input yet + // Note that these callback are called from **INTERRUPT CONTEXT** and hence + // must be both stored in IRAM and not perform anything that's not legal in + // an interrupt + //void onTransmit(void(*)(void)); -- Not yet implemented, need to edit pico-extra to get callback + //void onReceive(void(*)(void)); -- no I2S input yet private: pin_size_t _pinBCLK; diff --git a/libraries/LittleFS/src/LittleFS.cpp b/libraries/LittleFS/src/LittleFS.cpp index 18ee9144..52dfe481 100644 --- a/libraries/LittleFS/src/LittleFS.cpp +++ b/libraries/LittleFS/src/LittleFS.cpp @@ -1,24 +1,24 @@ /* - LittleFS.cpp - Wrapper for LittleFS for RP2040 - Copyright (c) 2021 Earle F. Philhower, III. All rights reserved. + LittleFS.cpp - Wrapper for LittleFS for RP2040 + Copyright (c) 2021 Earle F. Philhower, III. All rights reserved. - Based extensively off of the ESP8266 SPIFFS code, which is - Copyright (c) 2015 Ivan Grokhotkov. All rights reserved. + Based extensively off of the ESP8266 SPIFFS code, which is + Copyright (c) 2015 Ivan Grokhotkov. 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 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. + 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 St, Fifth Floor, Boston, MA 02110-1301 USA - */ + 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 St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #include #include @@ -60,7 +60,7 @@ FileImplPtr LittleFSImpl::open(const char* path, OpenMode openMode, AccessMode a *ptr = 0; lfs_mkdir(&_lfs, pathStr); *ptr = '/'; - ptr = strchr(ptr+1, '/'); + ptr = strchr(ptr + 1, '/'); } } free(pathStr); @@ -71,7 +71,7 @@ FileImplPtr LittleFSImpl::open(const char* path, OpenMode openMode, AccessMode a // O_CREATE means we *may* make the file, but not if it already exists. // See if it exists, and only if not update the creation time int rc = lfs_file_open(&_lfs, fd.get(), path, LFS_O_RDONLY); - if (rc == 0) { + if (rc == 0) { lfs_file_close(&_lfs, fd.get()); // It exists, don't update create time } else { creation = _timeCallback(); // File didn't exist or otherwise, so we're going to create this time @@ -99,8 +99,8 @@ DirImplPtr LittleFSImpl::openDir(const char *path) { } char *pathStr = strdup(path); // Allow edits on our scratch copy // Get rid of any trailing slashes - while (strlen(pathStr) && (pathStr[strlen(pathStr)-1]=='/')) { - pathStr[strlen(pathStr)-1] = 0; + while (strlen(pathStr) && (pathStr[strlen(pathStr) - 1] == '/')) { + pathStr[strlen(pathStr) - 1] = 0; } // At this point we have a name of "blah/blah/blah" or "blah" or "" // If that references a directory, just open it and we're done. @@ -116,34 +116,34 @@ DirImplPtr LittleFSImpl::openDir(const char *path) { if (info.type == LFS_TYPE_DIR) { // Easy peasy, path specifies an existing dir! rc = lfs_dir_open(&_lfs, dir.get(), pathStr); - filter = ""; + filter = ""; } else { // This is a file, so open the containing dir char *ptr = strrchr(pathStr, '/'); if (!ptr) { // No slashes, open the root dir rc = lfs_dir_open(&_lfs, dir.get(), "/"); - filter = pathStr; + filter = pathStr; } else { // We've got slashes, open the dir one up *ptr = 0; // Remove slash, truncate string rc = lfs_dir_open(&_lfs, dir.get(), pathStr); - filter = ptr + 1; + filter = ptr + 1; } } - } else { + } else { // Name doesn't exist, so use the parent dir of whatever was sent in // This is a file, so open the containing dir char *ptr = strrchr(pathStr, '/'); if (!ptr) { // No slashes, open the root dir rc = lfs_dir_open(&_lfs, dir.get(), "/"); - filter = pathStr; + filter = pathStr; } else { // We've got slashes, open the dir one up *ptr = 0; // Remove slash, truncate string rc = lfs_dir_open(&_lfs, dir.get(), pathStr); - filter = ptr + 1; + filter = ptr + 1; } } if (rc < 0) { @@ -162,20 +162,20 @@ DirImplPtr LittleFSImpl::openDir(const char *path) { } int LittleFSImpl::lfs_flash_read(const struct lfs_config *c, - lfs_block_t block, lfs_off_t off, void *dst, lfs_size_t size) { + lfs_block_t block, lfs_off_t off, void *dst, lfs_size_t size) { LittleFSImpl *me = reinterpret_cast(c->context); -// Serial.printf(" READ: %p, %d\n", me->_start + (block * me->_blockSize) + off, size); + // Serial.printf(" READ: %p, %d\n", me->_start + (block * me->_blockSize) + off, size); memcpy(dst, me->_start + (block * me->_blockSize) + off, size); return 0; } int LittleFSImpl::lfs_flash_prog(const struct lfs_config *c, - lfs_block_t block, lfs_off_t off, const void *buffer, lfs_size_t size) { + lfs_block_t block, lfs_off_t off, const void *buffer, lfs_size_t size) { LittleFSImpl *me = reinterpret_cast(c->context); uint8_t *addr = me->_start + (block * me->_blockSize) + off; noInterrupts(); rp2040.idleOtherCore(); -// Serial.printf("WRITE: %p, $d\n", (intptr_t)addr - (intptr_t)XIP_BASE, size); + // Serial.printf("WRITE: %p, $d\n", (intptr_t)addr - (intptr_t)XIP_BASE, size); flash_range_program((intptr_t)addr - (intptr_t)XIP_BASE, (const uint8_t *)buffer, size); rp2040.resumeOtherCore(); interrupts(); @@ -185,7 +185,7 @@ int LittleFSImpl::lfs_flash_prog(const struct lfs_config *c, int LittleFSImpl::lfs_flash_erase(const struct lfs_config *c, lfs_block_t block) { LittleFSImpl *me = reinterpret_cast(c->context); uint8_t *addr = me->_start + (block * me->_blockSize); -// Serial.printf("ERASE: %p, %d\n", (intptr_t)addr - (intptr_t)XIP_BASE, me->_blockSize); + // Serial.printf("ERASE: %p, %d\n", (intptr_t)addr - (intptr_t)XIP_BASE, me->_blockSize); noInterrupts(); rp2040.idleOtherCore(); flash_range_erase((intptr_t)addr - (intptr_t)XIP_BASE, me->_blockSize); diff --git a/libraries/LittleFS/src/LittleFS.h b/libraries/LittleFS/src/LittleFS.h index 7d610835..62d7d740 100644 --- a/libraries/LittleFS/src/LittleFS.h +++ b/libraries/LittleFS/src/LittleFS.h @@ -1,27 +1,27 @@ /* - LittleFS.h - Filesystem wrapper for LittleFS on the RP2040 - Copyright (c) 2019 Earle F. Philhower, III. All rights reserved. + LittleFS.h - Filesystem wrapper for LittleFS on the RP2040 + Copyright (c) 2019 Earle F. Philhower, III. All rights reserved. - Based heavily off of the SPIFFS equivalent code in the ESP8266 core - "Copyright (c) 2015 Ivan Grokhotkov. All rights reserved." + Based heavily off of the SPIFFS equivalent code in the ESP8266 core + "Copyright (c) 2015 Ivan Grokhotkov. All rights reserved." - This code was influenced by NodeMCU and Sming libraries, and first version of - Arduino wrapper written by Hristo Gochkov. + This code was influenced by NodeMCU and Sming libraries, and first version of + Arduino wrapper written by Hristo Gochkov. - 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 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. + 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 St, Fifth Floor, Boston, MA 02110-1301 USA - */ + 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 St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #ifndef __LITTLEFS_H @@ -41,18 +41,16 @@ namespace littlefs_impl { class LittleFSFileImpl; class LittleFSDirImpl; -class LittleFSConfig : public FSConfig -{ +class LittleFSConfig : public FSConfig { public: static constexpr uint32_t FSId = 0x4c495454; LittleFSConfig(bool autoFormat = true) : FSConfig(FSId, autoFormat) { } }; -class LittleFSImpl : public FSImpl -{ +class LittleFSImpl : public FSImpl { public: LittleFSImpl(uint8_t *start, uint32_t size, uint32_t pageSize, uint32_t blockSize, uint32_t maxOpenFds) - : _start(start) , _size(size) , _pageSize(pageSize) , _blockSize(blockSize) , _maxOpenFds(maxOpenFds), + : _start(start), _size(size), _pageSize(pageSize), _blockSize(blockSize), _maxOpenFds(maxOpenFds), _mounted(false) { memset(&_lfs, 0, sizeof(_lfs)); memset(&_lfs_cfg, 0, sizeof(_lfs_cfg)); @@ -64,7 +62,7 @@ public: _lfs_cfg.read_size = 256; _lfs_cfg.prog_size = 256; _lfs_cfg.block_size = _blockSize; - _lfs_cfg.block_count =_blockSize? _size / _blockSize: 0; + _lfs_cfg.block_count = _blockSize ? _size / _blockSize : 0; _lfs_cfg.block_cycles = 16; // TODO - need better explanation _lfs_cfg.cache_size = 256; _lfs_cfg.lookahead_size = 256; @@ -162,7 +160,7 @@ public: return false; } int rc = lfs_mkdir(&_lfs, path); - return (rc==0); + return (rc == 0); } bool rmdir(const char* path) override { @@ -174,7 +172,7 @@ public: return false; } _cfg = *static_cast(&cfg); - return true; + return true; } bool begin() override { @@ -218,7 +216,7 @@ public: return false; } - if(_timeCallback && _tryMount()) { + if (_timeCallback && _tryMount()) { // Mounting is required to set attributes time_t t = _timeCallback(); @@ -233,7 +231,7 @@ public: DEBUGV("lfs_format, lfs_setattr 't': rc=%d\n", rc); return false; } - + lfs_unmount(&_lfs); _mounted = false; } @@ -274,7 +272,7 @@ protected: } memset(&_lfs, 0, sizeof(_lfs)); int rc = lfs_mount(&_lfs, &_lfs_cfg); - if (rc==0) { + if (rc == 0) { _mounted = true; } return _mounted; @@ -302,7 +300,7 @@ protected: mode |= LFS_O_RDONLY; } if (accessMode & AM_WRITE) { - mode |= LFS_O_WRONLY; + mode |= LFS_O_WRONLY; } return mode; } @@ -350,8 +348,7 @@ protected: }; -class LittleFSFileImpl : public FileImpl -{ +class LittleFSFileImpl : public FileImpl { public: LittleFSFileImpl(LittleFSImpl* fs, const char *name, std::shared_ptr fd, int flags, time_t creation) : _fs(fs), _fd(fd), _opened(true), _flags(flags), _creation(creation) { _name = std::shared_ptr(new char[strlen(name) + 1], std::default_delete()); @@ -434,7 +431,7 @@ public: } size_t size() const override { - return (_opened && _fd)? lfs_file_size(_fs->getFS(), _getFD()) : 0; + return (_opened && _fd) ? lfs_file_size(_fs->getFS(), _getFD()) : 0; } bool truncate(uint32_t size) override { @@ -476,8 +473,9 @@ public: time_t ftime = 0; if (_opened && _fd) { int rc = lfs_getattr(_fs->getFS(), _name.get(), 't', (void *)&ftime, sizeof(ftime)); - if (rc != sizeof(ftime)) - ftime = 0; // Error, so clear read value + if (rc != sizeof(ftime)) { + ftime = 0; // Error, so clear read value + } } return ftime; } @@ -486,8 +484,9 @@ public: time_t ftime = 0; if (_opened && _fd) { int rc = lfs_getattr(_fs->getFS(), _name.get(), 'c', (void *)&ftime, sizeof(ftime)); - if (rc != sizeof(ftime)) - ftime = 0; // Error, so clear read value + if (rc != sizeof(ftime)) { + ftime = 0; // Error, so clear read value + } } return ftime; } @@ -539,12 +538,10 @@ protected: time_t _creation; }; -class LittleFSDirImpl : public DirImpl -{ +class LittleFSDirImpl : public DirImpl { public: LittleFSDirImpl(const String& pattern, LittleFSImpl* fs, std::shared_ptr dir, const char *dirPath = nullptr) - : _pattern(pattern) , _fs(fs) , _dir(dir) , _dirPath(nullptr), _valid(false), _opened(true) - { + : _pattern(pattern), _fs(fs), _dir(dir), _dirPath(nullptr), _valid(false), _opened(true) { memset(&_dirent, 0, sizeof(_dirent)); if (dirPath) { _dirPath = std::shared_ptr(new char[strlen(dirPath) + 1], std::default_delete()); @@ -566,7 +563,7 @@ public: nameLen += _dirPath.get() ? strlen(_dirPath.get()) : 0; nameLen += strlen(_dirent.name); char tmpName[nameLen]; - snprintf(tmpName, nameLen, "%s%s%s", _dirPath.get() ? _dirPath.get() : "", _dirPath.get()&&_dirPath.get()[0]?"/":"", _dirent.name); + snprintf(tmpName, nameLen, "%s%s%s", _dirPath.get() ? _dirPath.get() : "", _dirPath.get() && _dirPath.get()[0] ? "/" : "", _dirent.name); auto ret = _fs->open((const char *)tmpName, openMode, accessMode); return ret; } @@ -661,7 +658,7 @@ protected: nameLen += _dirPath.get() ? strlen(_dirPath.get()) : 0; nameLen += strlen(_dirent.name); char tmpName[nameLen]; - snprintf(tmpName, nameLen, "%s%s%s", _dirPath.get() ? _dirPath.get() : "", _dirPath.get()&&_dirPath.get()[0]?"/":"", _dirent.name); + snprintf(tmpName, nameLen, "%s%s%s", _dirPath.get() ? _dirPath.get() : "", _dirPath.get() && _dirPath.get()[0] ? "/" : "", _dirent.name); int rc = lfs_getattr(_fs->getFS(), tmpName, attr, dest, len); return (rc == len); } diff --git a/libraries/SD/src/SD.h b/libraries/SD/src/SD.h index 52a95589..de07c2b8 100644 --- a/libraries/SD/src/SD.h +++ b/libraries/SD/src/SD.h @@ -1,20 +1,20 @@ /* - SD.h - A thin shim for Arduino ESP8266 Filesystems - Copyright (c) 2019 Earle F. Philhower, III. All rights reserved. + SD.h - A thin shim for Arduino ESP8266 Filesystems + Copyright (c) 2019 Earle F. Philhower, III. 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 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. + 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 St, Fifth Floor, Boston, MA 02110-1301 USA + 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 St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef __SD_H__ @@ -33,7 +33,7 @@ class SDClass { public: boolean begin(uint8_t csPin, uint32_t cfg = SPI_HALF_SPEED) { - SDFS.setConfig(SDFSConfig(csPin, cfg)); + SDFS.setConfig(SDFSConfig(csPin, cfg)); return (boolean)SDFS.begin(); } @@ -83,7 +83,7 @@ public: boolean mkdir(const String &filepath) { return (boolean)SDFS.mkdir(filepath.c_str()); } - + boolean remove(const char *filepath) { return (boolean)SDFS.remove(filepath); } @@ -91,7 +91,7 @@ public: boolean remove(const String &filepath) { return remove(filepath.c_str()); } - + boolean rmdir(const char *filepath) { return (boolean)SDFS.rmdir(filepath); } @@ -135,7 +135,7 @@ public: size_t size() { uint64_t sz = size64(); #ifdef DEBUG_ESP_PORT - if (sz > (uint64_t)SIZE_MAX) { + if (sz > (uint64_t)SIZE_MAX) { DEBUG_ESP_PORT.printf_P(PSTR("WARNING: SD card size overflow (%lld>= 4GB). Please update source to use size64().\n"), sz); } #endif @@ -154,7 +154,7 @@ public: void dateTimeCallback(void (*cb)(uint16_t*, uint16_t*)) { extern void (*__SD__userDateTimeCB)(uint16_t*, uint16_t*); __SD__userDateTimeCB = cb; - SDFS.setTimeCallback(wrapperTimeCB); + SDFS.setTimeCallback(wrapperTimeCB); } private: @@ -162,12 +162,19 @@ private: bool read = (mode & O_READ) ? true : false; bool write = (mode & O_WRITE) ? true : false; bool append = (mode & O_APPEND) ? true : false; - if ( read & !write ) { return "r"; } - else if ( !read & write & !append ) { return "w+"; } - else if ( !read & write & append ) { return "a"; } - else if ( read & write & !append ) { return "w+"; } // may be a bug in FS::mode interpretation, "r+" seems proper - else if ( read & write & append ) { return "a+"; } - else { return "r"; } + if (read & !write) { + return "r"; + } else if (!read & write & !append) { + return "w+"; + } else if (!read & write & append) { + return "a"; + } else if (read & write & !append) { + return "w+"; // may be a bug in FS::mode interpretation, "r+" seems proper + } else if (read & write & append) { + return "a+"; + } else { + return "r"; + } } static time_t wrapperTimeCB(void) { @@ -185,28 +192,28 @@ private: // Expose FatStructs.h helpers for MS-DOS date/time for use with dateTimeCallback static inline uint16_t FAT_DATE(uint16_t year, uint8_t month, uint8_t day) { - return (year - 1980) << 9 | month << 5 | day; + return (year - 1980) << 9 | month << 5 | day; } static inline uint16_t FAT_YEAR(uint16_t fatDate) { - return 1980 + (fatDate >> 9); + return 1980 + (fatDate >> 9); } static inline uint8_t FAT_MONTH(uint16_t fatDate) { - return (fatDate >> 5) & 0XF; + return (fatDate >> 5) & 0XF; } static inline uint8_t FAT_DAY(uint16_t fatDate) { - return fatDate & 0X1F; + return fatDate & 0X1F; } static inline uint16_t FAT_TIME(uint8_t hour, uint8_t minute, uint8_t second) { - return hour << 11 | minute << 5 | second >> 1; + return hour << 11 | minute << 5 | second >> 1; } static inline uint8_t FAT_HOUR(uint16_t fatTime) { - return fatTime >> 11; + return fatTime >> 11; } static inline uint8_t FAT_MINUTE(uint16_t fatTime) { - return (fatTime >> 5) & 0X3F; + return (fatTime >> 5) & 0X3F; } static inline uint8_t FAT_SECOND(uint16_t fatTime) { - return 2*(fatTime & 0X1F); + return 2 * (fatTime & 0X1F); } diff --git a/libraries/SPI/SPI.cpp b/libraries/SPI/SPI.cpp index b28b766b..596a0594 100644 --- a/libraries/SPI/SPI.cpp +++ b/libraries/SPI/SPI.cpp @@ -1,22 +1,22 @@ /* - * SPI Master library for the Raspberry Pi Pico RP2040 - * - * Copyright (c) 2021 Earle F. Philhower, III - * - * 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 St, Fifth Floor, Boston, MA 02110-1301 USA - */ + SPI Master library for the Raspberry Pi Pico RP2040 + + Copyright (c) 2021 Earle F. Philhower, III + + 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 St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #include "SPI.h" #include @@ -34,26 +34,26 @@ SPIClassRP2040::SPIClassRP2040(spi_inst_t *spi, pin_size_t rx, pin_size_t cs, pi } inline spi_cpol_t SPIClassRP2040::cpol() { - switch(_spis.getDataMode()) { - case SPI_MODE0: return SPI_CPOL_0; - case SPI_MODE1: return SPI_CPOL_0; - case SPI_MODE2: return SPI_CPOL_1; - case SPI_MODE3: return SPI_CPOL_1; + switch (_spis.getDataMode()) { + case SPI_MODE0: return SPI_CPOL_0; + case SPI_MODE1: return SPI_CPOL_0; + case SPI_MODE2: return SPI_CPOL_1; + case SPI_MODE3: return SPI_CPOL_1; } // Error return SPI_CPOL_0; } inline spi_cpha_t SPIClassRP2040::cpha() { - switch(_spis.getDataMode()) { - case SPI_MODE0: return SPI_CPHA_0; - case SPI_MODE1: return SPI_CPHA_1; - case SPI_MODE2: return SPI_CPHA_0; - case SPI_MODE3: return SPI_CPHA_1; + switch (_spis.getDataMode()) { + case SPI_MODE0: return SPI_CPHA_0; + case SPI_MODE1: return SPI_CPHA_1; + case SPI_MODE2: return SPI_CPHA_0; + case SPI_MODE3: return SPI_CPHA_1; } // Error return SPI_CPHA_0; -} +} inline uint8_t SPIClassRP2040::reverseByte(uint8_t b) { b = (b & 0xF0) >> 4 | (b & 0x0F) << 4; @@ -63,31 +63,33 @@ inline uint8_t SPIClassRP2040::reverseByte(uint8_t b) { } inline uint16_t SPIClassRP2040::reverse16Bit(uint16_t w) { - return ( reverseByte(w & 0xff) << 8 ) | ( reverseByte(w >> 8) ); + return (reverseByte(w & 0xff) << 8) | (reverseByte(w >> 8)); } // The HW can't do LSB first, only MSB first, so need to bitreverse void SPIClassRP2040::adjustBuffer(const void *s, void *d, size_t cnt, bool by16) { if (_spis.getBitOrder() == MSBFIRST) { - memcpy(d, s, cnt * (by16? 2 : 1)); + memcpy(d, s, cnt * (by16 ? 2 : 1)); } else if (!by16) { const uint8_t *src = (const uint8_t *)s; uint8_t *dst = (uint8_t *)d; for (size_t i = 0; i < cnt; i++) { - *(dst++) = reverseByte( *(src++) ); + *(dst++) = reverseByte(*(src++)); } } else { /* by16 */ const uint16_t *src = (const uint16_t *)s; uint16_t *dst = (uint16_t *)d; for (size_t i = 0; i < cnt; i++) { - *(dst++) = reverse16Bit( *(src++) ); + *(dst++) = reverse16Bit(*(src++)); } } } byte SPIClassRP2040::transfer(uint8_t data) { uint8_t ret; - if (!_initted) return 0; + if (!_initted) { + return 0; + } data = (_spis.getBitOrder() == MSBFIRST) ? data : reverseByte(data); spi_set_format(_spi, 8, cpol(), cpha(), SPI_MSB_FIRST); DEBUGSPI("SPI::transfer(%02x), cpol=%d, cpha=%d\n", data, cpol(), cpha()); @@ -123,7 +125,7 @@ void SPIClassRP2040::transfer(void *buf, size_t count) { } void SPIClassRP2040::beginTransaction(SPISettings settings) { - DEBUGSPI("SPI::beginTransaction(clk=%d, bo=%s\n", _spis.getClockFreq(), (_spis.getBitOrder() == MSBFIRST) ? "MSB":"LSB"); + DEBUGSPI("SPI::beginTransaction(clk=%d, bo=%s\n", _spis.getClockFreq(), (_spis.getBitOrder() == MSBFIRST) ? "MSB" : "LSB"); _spis = settings; if (_initted) { DEBUGSPI("SPI: deinitting currently active SPI\n"); @@ -145,7 +147,8 @@ void SPIClassRP2040::endTransaction(void) { bool SPIClassRP2040::setRX(pin_size_t pin) { constexpr uint32_t valid[2] = { __bitset({0, 4, 16, 20}) /* SPI0 */, - __bitset({8, 12, 24, 28}) /* SPI1 */}; + __bitset({8, 12, 24, 28}) /* SPI1 */ + }; if (_running) { return false; } else if ((1 << pin) & valid[spi_get_index(_spi)]) { @@ -158,7 +161,8 @@ bool SPIClassRP2040::setRX(pin_size_t pin) { bool SPIClassRP2040::setCS(pin_size_t pin) { constexpr uint32_t valid[2] = { __bitset({1, 5, 17, 21}) /* SPI0 */, - __bitset({9, 13, 25, 29}) /* SPI1 */}; + __bitset({9, 13, 25, 29}) /* SPI1 */ + }; if (_running) { return false; } else if ((1 << pin) & valid[spi_get_index(_spi)]) { @@ -171,7 +175,8 @@ bool SPIClassRP2040::setCS(pin_size_t pin) { bool SPIClassRP2040::setSCK(pin_size_t pin) { constexpr uint32_t valid[2] = { __bitset({2, 6, 18, 22}) /* SPI0 */, - __bitset({10, 14, 26}) /* SPI1 */}; + __bitset({10, 14, 26}) /* SPI1 */ + }; if (_running) { return false; } else if ((1 << pin) & valid[spi_get_index(_spi)]) { @@ -184,7 +189,8 @@ bool SPIClassRP2040::setSCK(pin_size_t pin) { bool SPIClassRP2040::setTX(pin_size_t pin) { constexpr uint32_t valid[2] = { __bitset({3, 7, 19, 23}) /* SPI0 */, - __bitset({11, 15, 27}) /* SPI1 */}; + __bitset({11, 15, 27}) /* SPI1 */ + }; if (_running) { return false; } else if ((1 << pin) & valid[spi_get_index(_spi)]) { @@ -219,17 +225,17 @@ void SPIClassRP2040::end() { } void SPIClassRP2040::setBitOrder(BitOrder order) { - _spis = SPISettings( _spis.getClockFreq(), order, _spis.getDataMode() ); + _spis = SPISettings(_spis.getClockFreq(), order, _spis.getDataMode()); beginTransaction(_spis); } void SPIClassRP2040::setDataMode(uint8_t uc_mode) { - _spis = SPISettings( _spis.getClockFreq(), _spis.getBitOrder(), uc_mode ); + _spis = SPISettings(_spis.getClockFreq(), _spis.getBitOrder(), uc_mode); beginTransaction(_spis); } void SPIClassRP2040::setClockDivider(uint8_t uc_div) { - (void) uc_div; // no-op + (void) uc_div; // no-op } SPIClassRP2040 SPI(spi0, PIN_SPI0_MISO, PIN_SPI0_SS, PIN_SPI0_SCK, PIN_SPI0_MOSI); diff --git a/libraries/SPI/SPI.h b/libraries/SPI/SPI.h index 9933e24c..af102282 100644 --- a/libraries/SPI/SPI.h +++ b/libraries/SPI/SPI.h @@ -1,22 +1,22 @@ /* - * SPI Master library for the Raspberry Pi Pico RP2040 - * - * Copyright (c) 2021 Earle F. Philhower, III - * - * 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 St, Fifth Floor, Boston, MA 02110-1301 USA - */ + SPI Master library for the Raspberry Pi Pico RP2040 + + Copyright (c) 2021 Earle F. Philhower, III + + 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 St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #pragma once @@ -46,7 +46,9 @@ public: bool setTX(pin_size_t pin); // Call once to init/deinit SPI class, select pins, etc. - virtual void begin() override { begin(false); } + virtual void begin() override { + begin(false); + } void begin(bool hwCS); void end() override; @@ -56,8 +58,12 @@ public: void setClockDivider(uint8_t uc_div) __attribute__((deprecated)); // Unimplemented - virtual void usingInterrupt(int interruptNumber) override { (void) interruptNumber; } - virtual void notUsingInterrupt(int interruptNumber) override { (void) interruptNumber; } + virtual void usingInterrupt(int interruptNumber) override { + (void) interruptNumber; + } + virtual void notUsingInterrupt(int interruptNumber) override { + (void) interruptNumber; + } virtual void attachInterrupt() override { /* noop */ } virtual void detachInterrupt() override { /* noop */ } diff --git a/libraries/Servo/src/Servo.cpp b/libraries/Servo/src/Servo.cpp index f31045ed..89f527c3 100644 --- a/libraries/Servo/src/Servo.cpp +++ b/libraries/Servo/src/Servo.cpp @@ -1,23 +1,23 @@ /* - * PIO-based Servo class for Rasperry Pi Pico RP2040 - * - * Copyright (c) 2021 Earle F. Philhower, III - * Original Copyright (c) 2015 Michael C. Miller. All right 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 St, Fifth Floor, Boston, MA 02110-1301 USA - */ + PIO-based Servo class for Rasperry Pi Pico RP2040 + + Copyright (c) 2021 Earle F. Philhower, III + Original Copyright (c) 2015 Michael C. Miller. All right 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 St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #include #include @@ -29,8 +29,7 @@ static PIOProgram _servoPgm(&servo_program); // Similar to map but will have increased accuracy that provides a more // symmetrical api (call it and use result to reverse will provide the original value) -int improved_map(int value, int minIn, int maxIn, int minOut, int maxOut) -{ +int improved_map(int value, int minIn, int maxIn, int minOut, int maxOut) { const int rangeIn = maxIn - minIn; const int rangeOut = maxOut - minOut; const int deltaIn = value - minIn; @@ -44,8 +43,7 @@ int improved_map(int value, int minIn, int maxIn, int minOut, int maxOut) //------------------------------------------------------------------- // Servo class methods -Servo::Servo() -{ +Servo::Servo() { _attached = false; _valueUs = DEFAULT_NEUTRAL_PULSE_WIDTH; _minUs = DEFAULT_MIN_PULSE_WIDTH; @@ -59,18 +57,15 @@ Servo::~Servo() { detach(); } -int Servo::attach(pin_size_t pin) -{ +int Servo::attach(pin_size_t pin) { return attach(pin, DEFAULT_MIN_PULSE_WIDTH, DEFAULT_MAX_PULSE_WIDTH); } -int Servo::attach(pin_size_t pin, int minUs, int maxUs) -{ +int Servo::attach(pin_size_t pin, int minUs, int maxUs) { return attach(pin, minUs, maxUs, _valueUs); } -int Servo::attach(pin_size_t pin, int minUs, int maxUs, int value) -{ +int Servo::attach(pin_size_t pin, int minUs, int maxUs, int value) { // keep the min and max within 200-3000 us, these are extreme // ranges and should support extreme servos while maintaining // reasonable ranges @@ -85,7 +80,7 @@ int Servo::attach(pin_size_t pin, int minUs, int maxUs, int value) // ERROR, no free slots return -1; } - _attached = true; + _attached = true; servo_program_init(_pio, _smIdx, _pgmOffset, pin); pio_sm_set_enabled(_pio, _smIdx, false); pio_sm_put_blocking(_pio, _smIdx, RP2040::usToPIOCycles(REFRESH_INTERVAL) / 3); @@ -102,8 +97,7 @@ int Servo::attach(pin_size_t pin, int minUs, int maxUs, int value) return pin; } -void Servo::detach() -{ +void Servo::detach() { if (_attached) { // Set a 0 for the width and then wait for the halt loop pio_sm_put_blocking(_pio, _smIdx, 0); @@ -118,8 +112,7 @@ void Servo::detach() } } -void Servo::write(int value) -{ +void Servo::write(int value) { // treat any value less than 200 as angle in degrees (values equal or larger are handled as microseconds) if (value < 200) { // assumed to be 0-180 degrees servo @@ -129,8 +122,7 @@ void Servo::write(int value) writeMicroseconds(value); } -void Servo::writeMicroseconds(int value) -{ +void Servo::writeMicroseconds(int value) { value = constrain(value, _minUs, _maxUs); _valueUs = value; if (_attached) { @@ -138,18 +130,15 @@ void Servo::writeMicroseconds(int value) } } -int Servo::read() // return the value as degrees -{ +int Servo::read() { // return the value as degrees // read returns the angle for an assumed 0-180 return improved_map(readMicroseconds(), _minUs, _maxUs, 0, 180); } -int Servo::readMicroseconds() -{ +int Servo::readMicroseconds() { return _valueUs; } -bool Servo::attached() -{ +bool Servo::attached() { return _attached; } diff --git a/libraries/Servo/src/Servo.h b/libraries/Servo/src/Servo.h index 2ed96534..0e389878 100644 --- a/libraries/Servo/src/Servo.h +++ b/libraries/Servo/src/Servo.h @@ -1,41 +1,41 @@ /* - * PIO-based Servo class for Rasperry Pi Pico RP2040 - * - * Copyright (c) 2021 Earle F. Philhower, III - * - * 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 St, Fifth Floor, Boston, MA 02110-1301 USA - */ + PIO-based Servo class for Rasperry Pi Pico RP2040 + + Copyright (c) 2021 Earle F. Philhower, III + + 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 St, Fifth Floor, Boston, MA 02110-1301 USA +*/ /* - * A servo is activated by creating an instance of the Servo class passing - * the desired pin to the attach() method. - * The servos are pulsed in the background using the value most recently - * written using the write() method. - * - * The methods are: - * Servo - Class for manipulating servo motors connected to Arduino pins. - * attach(pin) - Attaches a servo motor to an i/o pin. - * attach(pin, min, max) - Attaches to a pin setting min and max values in microseconds - * default min is 1000, max is 2000 - * write() - Sets the servo angle in degrees. (invalid angle that is valid as pulse in microseconds is treated as microseconds) - * writeMicroseconds() - Sets the servo pulse width in microseconds - * read() - Gets the last written servo pulse width as an angle between 0 and 180. - * readMicroseconds() - Gets the last written servo pulse width in microseconds. (was read_us() in first release) - * attached() - Returns true if there is a servo attached. - * detach() - Stops an attached servos from pulsing its i/o pin. - */ + A servo is activated by creating an instance of the Servo class passing + the desired pin to the attach() method. + The servos are pulsed in the background using the value most recently + written using the write() method. + + The methods are: + Servo - Class for manipulating servo motors connected to Arduino pins. + attach(pin) - Attaches a servo motor to an i/o pin. + attach(pin, min, max) - Attaches to a pin setting min and max values in microseconds + default min is 1000, max is 2000 + write() - Sets the servo angle in degrees. (invalid angle that is valid as pulse in microseconds is treated as microseconds) + writeMicroseconds() - Sets the servo pulse width in microseconds + read() - Gets the last written servo pulse width as an angle between 0 and 180. + readMicroseconds() - Gets the last written servo pulse width in microseconds. (was read_us() in first release) + attached() - Returns true if there is a servo attached. + detach() - Stops an attached servos from pulsing its i/o pin. +*/ #ifndef Servo_h #define Servo_h @@ -71,11 +71,11 @@ public: // returns channel number or 0 if failure. int attach(pin_size_t pin, int min, int max, int value); void detach(); - void write(int value); // if value is < 200 its treated as an angle, otherwise as pulse width in microseconds - void writeMicroseconds(int value); // Write pulse width in microseconds + void write(int value); // if value is < 200 its treated as an angle, otherwise as pulse width in microseconds + void writeMicroseconds(int value); // Write pulse width in microseconds int read(); // returns current pulse width as an angle between 0 and 180 degrees int readMicroseconds(); // returns current pulse width in microseconds for this servo (was read_us() in first release) - bool attached(); // return true if this servo is attached, otherwise false + bool attached(); // return true if this servo is attached, otherwise false private: bool _attached; @@ -87,7 +87,7 @@ private: int _maxUs; int _valueUs; - + }; #endif diff --git a/libraries/Servo/src/servo.pio.h b/libraries/Servo/src/servo.pio.h index 0a08b431..4280e06a 100644 --- a/libraries/Servo/src/servo.pio.h +++ b/libraries/Servo/src/servo.pio.h @@ -16,16 +16,16 @@ #define servo_offset_halt 2u static const uint16_t servo_program_instructions[] = { - // .wrap_target - 0x9080, // 0: pull noblock side 0 - 0xa027, // 1: mov x, osr - 0x0022, // 2: jmp !x, 2 - 0xa046, // 3: mov y, isr - 0x00a6, // 4: jmp x != y, 6 - 0x1807, // 5: jmp 7 side 1 - 0xa042, // 6: nop - 0x0084, // 7: jmp y--, 4 - // .wrap + // .wrap_target + 0x9080, // 0: pull noblock side 0 + 0xa027, // 1: mov x, osr + 0x0022, // 2: jmp !x, 2 + 0xa046, // 3: mov y, isr + 0x00a6, // 4: jmp x != y, 6 + 0x1807, // 5: jmp 7 side 1 + 0xa042, // 6: nop + 0x0084, // 7: jmp y--, 4 + // .wrap }; #if !PICO_NO_HARDWARE @@ -43,11 +43,11 @@ static inline pio_sm_config servo_program_get_default_config(uint offset) { } static inline void servo_program_init(PIO pio, uint sm, uint offset, uint pin) { - pio_gpio_init(pio, pin); - pio_sm_set_consecutive_pindirs(pio, sm, pin, 1, true); - pio_sm_config c = servo_program_get_default_config(offset); - sm_config_set_sideset_pins(&c, pin); - pio_sm_init(pio, sm, offset, &c); + pio_gpio_init(pio, pin); + pio_sm_set_consecutive_pindirs(pio, sm, pin, 1, true); + pio_sm_config c = servo_program_get_default_config(offset); + sm_config_set_sideset_pins(&c, pin); + pio_sm_init(pio, sm, offset, &c); } #endif diff --git a/libraries/Wire/Wire.cpp b/libraries/Wire/Wire.cpp index 2cb150d3..b9bd2bc3 100644 --- a/libraries/Wire/Wire.cpp +++ b/libraries/Wire/Wire.cpp @@ -1,25 +1,25 @@ /* - * I2C Master/Slave library for the Raspberry Pi Pico RP2040 - * - * Copyright (c) 2021 Earle F. Philhower, III - * - * Based off of TWI/I2C library for Arduino Zero - * Copyright (c) 2015 Arduino LLC. 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 St, Fifth Floor, Boston, MA 02110-1301 USA - */ + I2C Master/Slave library for the Raspberry Pi Pico RP2040 + + Copyright (c) 2021 Earle F. Philhower, III + + Based off of TWI/I2C library for Arduino Zero + Copyright (c) 2015 Arduino LLC. 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 St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #include #include @@ -40,7 +40,8 @@ TwoWire::TwoWire(i2c_inst_t *i2c, pin_size_t sda, pin_size_t scl) { bool TwoWire::setSDA(pin_size_t pin) { constexpr uint32_t valid[2] = { __bitset({0, 4, 8, 12, 16, 20, 24, 28}) /* I2C0 */, - __bitset({2, 6, 10, 14, 18, 22, 26}) /* I2C1 */}; + __bitset({2, 6, 10, 14, 18, 22, 26}) /* I2C1 */ + }; if (_running) { return false; } else if ((1 << pin) & valid[i2c_hw_index(_i2c)]) { @@ -53,7 +54,8 @@ bool TwoWire::setSDA(pin_size_t pin) { bool TwoWire::setSCL(pin_size_t pin) { constexpr uint32_t valid[2] = { __bitset({1, 5, 9, 13, 17, 21, 25, 29}) /* I2C0 */, - __bitset({3, 7, 11, 15, 19, 23, 27}) /* I2C1 */}; + __bitset({3, 7, 11, 15, 19, 23, 27}) /* I2C1 */ + }; if (_running) { return false; } else if ((1 << pin) & valid[i2c_hw_index(_i2c)]) { @@ -106,7 +108,7 @@ void TwoWire::begin(uint8_t addr) { i2c_set_slave_mode(_i2c, true, addr); // Our callback IRQ - _i2c->hw->intr_mask = (1<<10) | (1<<9) | (1<<5)| (1<<2); + _i2c->hw->intr_mask = (1 << 10) | (1 << 9) | (1 << 5) | (1 << 2); int irqNo = I2C0_IRQ + i2c_hw_index(_i2c); irq_set_exclusive_handler(irqNo, i2c_hw_index(_i2c) == 0 ? _handler0 : _handler1); @@ -122,29 +124,29 @@ void TwoWire::begin(uint8_t addr) { } void TwoWire::onIRQ() { - if (_i2c->hw->intr_stat & (1<<10)) { + if (_i2c->hw->intr_stat & (1 << 10)) { _buffLen = 0; _buffOff = 0; _slaveStartDet = true; _i2c->hw->clr_start_det; } - if (_i2c->hw->intr_stat & (1<<9)) { + if (_i2c->hw->intr_stat & (1 << 9)) { if (_onReceiveCallback) { _onReceiveCallback(_buffLen); } _buffLen = 0; - _buffOff = 0; + _buffOff = 0; _slaveStartDet = false; _i2c->hw->clr_stop_det; } - if (_i2c->hw->intr_stat & (1<<5)) { + if (_i2c->hw->intr_stat & (1 << 5)) { // RD_REQ if (_onRequestCallback) { _onRequestCallback(); } _i2c->hw->clr_rd_req; } - if (_i2c->hw->intr_stat & (1<<2)) { + if (_i2c->hw->intr_stat & (1 << 2)) { // RX_FULL if (_slaveStartDet && (_buffLen < (int)sizeof(_buff))) { _buff[_buffLen++] = _i2c->hw->data_cmd & 0xff; @@ -206,18 +208,22 @@ bool _probe(int addr, pin_size_t sda, pin_size_t scl, int freq) { digitalWrite(sda, HIGH); sleep_us(delay); digitalWrite(scl, HIGH); - if (!_clockStretch(scl)) goto stop; + if (!_clockStretch(scl)) { + goto stop; + } digitalWrite(sda, LOW); sleep_us(delay); digitalWrite(scl, LOW); sleep_us(delay); - for (int i=0; i<8; i++) { + for (int i = 0; i < 8; i++) { addr <<= 1; - digitalWrite(sda, (addr & (1<<7)) ? HIGH : LOW); + digitalWrite(sda, (addr & (1 << 7)) ? HIGH : LOW); sleep_us(delay); digitalWrite(scl, HIGH); sleep_us(delay); - if (!_clockStretch(scl)) goto stop; + if (!_clockStretch(scl)) { + goto stop; + } digitalWrite(scl, LOW); sleep_us(5); // Ensure we don't change too close to clock edge } @@ -225,7 +231,9 @@ bool _probe(int addr, pin_size_t sda, pin_size_t scl, int freq) { digitalWrite(sda, HIGH); sleep_us(delay); digitalWrite(scl, HIGH); - if (!_clockStretch(scl)) goto stop; + if (!_clockStretch(scl)) { + goto stop; + } ack = digitalRead(sda) == LOW; sleep_us(delay); @@ -253,7 +261,7 @@ stop: // 4 : Other error uint8_t TwoWire::endTransmission(bool stopBit) { if (!_running || !_txBegun) { - return 4; + return 4; } _txBegun = false; if (!_buffLen) { @@ -268,7 +276,7 @@ uint8_t TwoWire::endTransmission(bool stopBit) { } uint8_t TwoWire::endTransmission() { - return endTransmission(true); + return endTransmission(true); } size_t TwoWire::write(uint8_t ucData) { @@ -278,7 +286,7 @@ size_t TwoWire::write(uint8_t ucData) { if (_slave) { // Wait for a spot in the TX FIFO - while (0 == (_i2c->hw->status & (1<<1))) { /* noop wait */ } + while (0 == (_i2c->hw->status & (1 << 1))) { /* noop wait */ } _i2c->hw->data_cmd = ucData; return 1; } else { @@ -324,13 +332,11 @@ void TwoWire::flush(void) { } -void TwoWire::onReceive(void(*function)(int)) -{ +void TwoWire::onReceive(void(*function)(int)) { _onReceiveCallback = function; } -void TwoWire::onRequest(void(*function)(void)) -{ +void TwoWire::onRequest(void(*function)(void)) { _onRequestCallback = function; } diff --git a/libraries/Wire/Wire.h b/libraries/Wire/Wire.h index 5d8544d6..68f3f431 100644 --- a/libraries/Wire/Wire.h +++ b/libraries/Wire/Wire.h @@ -1,25 +1,25 @@ /* - * I2C Master/Slave library for the Raspberry Pi Pico RP2040 - * - * Copyright (c) 2021 Earle F. Philhower, III - * - * Based off of TWI/I2C library for Arduino Zero - * Copyright (c) 2015 Arduino LLC. 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 St, Fifth Floor, Boston, MA 02110-1301 USA - */ + I2C Master/Slave library for the Raspberry Pi Pico RP2040 + + Copyright (c) 2021 Earle F. Philhower, III + + Based off of TWI/I2C library for Arduino Zero + Copyright (c) 2015 Arduino LLC. 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 St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #pragma once @@ -27,11 +27,11 @@ #include "api/HardwareI2C.h" #include - // WIRE_HAS_END means Wire has end() +// WIRE_HAS_END means Wire has end() #define WIRE_HAS_END 1 #ifndef WIRE_BUFFER_SIZE - #define WIRE_BUFFER_SIZE 128 +#define WIRE_BUFFER_SIZE 128 #endif class TwoWire : public HardwareI2C { @@ -68,10 +68,18 @@ public: void onReceive(void(*)(int)); void onRequest(void(*)(void)); - inline size_t write(unsigned long n) { return write((uint8_t)n); } - inline size_t write(long n) { return write((uint8_t)n); } - inline size_t write(unsigned int n) { return write((uint8_t)n); } - inline size_t write(int n) { return write((uint8_t)n); } + inline size_t write(unsigned long n) { + return write((uint8_t)n); + } + inline size_t write(long n) { + return write((uint8_t)n); + } + inline size_t write(unsigned int n) { + return write((uint8_t)n); + } + inline size_t write(int n) { + return write((uint8_t)n); + } using Print::write; // IRQ callback diff --git a/libraries/Wire/examples/TalkingToMyself/TalkingToMyself.ino b/libraries/Wire/examples/TalkingToMyself/TalkingToMyself.ino index a32368ad..f9726f85 100644 --- a/libraries/Wire/examples/TalkingToMyself/TalkingToMyself.ino +++ b/libraries/Wire/examples/TalkingToMyself/TalkingToMyself.ino @@ -1,6 +1,6 @@ // Simple I2C master and slave demo - Earle F. Philhower, III // Released into the public domain -// +// // Using both onboard I2C interfaces, have one master and one slave // and send data both ways between them // @@ -9,42 +9,42 @@ #include void setup() { - Serial.begin(115200); - delay(5000); - Wire.setSDA(0); - Wire.setSCL(1); - Wire.begin(); - Wire1.setSDA(2); - Wire1.setSCL(3); - Wire1.begin(0x30); - Wire1.onReceive(recv); - Wire1.onRequest(req); + Serial.begin(115200); + delay(5000); + Wire.setSDA(0); + Wire.setSCL(1); + Wire.begin(); + Wire1.setSDA(2); + Wire1.setSCL(3); + Wire1.begin(0x30); + Wire1.onReceive(recv); + Wire1.onRequest(req); } static char buff[100]; void loop() { - static int p; - char b[90]; + static int p; + char b[90]; - // Write a value over I2C to the slave - Serial.println("Sending..."); - Wire.beginTransmission(0x30); - sprintf(b, "pass %d", p++); - Wire.write(b, strlen(b)); - Wire.endTransmission(); + // Write a value over I2C to the slave + Serial.println("Sending..."); + Wire.beginTransmission(0x30); + sprintf(b, "pass %d", p++); + Wire.write(b, strlen(b)); + Wire.endTransmission(); - // Ensure the slave processing is done and print it out - delay(1000); - Serial.printf("buff: '%s'\r\n", buff); + // Ensure the slave processing is done and print it out + delay(1000); + Serial.printf("buff: '%s'\r\n", buff); - // Read from the slave and print out - Wire.requestFrom(0x30, 6); - Serial.print("\nrecv: '"); - while(Wire.available()) { - Serial.print((char)Wire.read()); - } - Serial.println("'"); - delay(1000); + // Read from the slave and print out + Wire.requestFrom(0x30, 6); + Serial.print("\nrecv: '"); + while (Wire.available()) { + Serial.print((char)Wire.read()); + } + Serial.println("'"); + delay(1000); } // These are called in an **INTERRUPT CONTEXT** which means NO serial port @@ -52,17 +52,19 @@ void loop() { // Called when the I2C slave gets written to void recv(int len) { - int i; - // Just stuff the sent bytes into a global the main routine can pick up and use - for (i=0; i