Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .drone.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ pipeline:
commands:
- curl https://apt.matrix.one/doc/apt-key.gpg | apt-key add -
- apt-get update
- apt-get install --yes libfftw3-dev wiringpi libgflags-dev
- apt-get install --yes libfftw3-dev libgpiod-dev libgflags-dev
- debuild -us -uc -b
- mv ../*.deb .

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ sudo apt-get update
sudo apt-get upgrade

# Install MATRIX HAL Packages and Build Prerequisites
sudo apt-get install cmake g++ git libfftw3-dev wiringpi libgflags-dev matrixio-creator-init
sudo apt-get install cmake g++ git libfftw3-dev libgpiod-dev libgflags-dev matrixio-creator-init

# Reboot your Pi
sudo reboot
Expand Down
12 changes: 7 additions & 5 deletions cpp/driver/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@ cmake_minimum_required(VERSION 2.8)
set(CMAKE_BUILD_TYPE Release)

find_library (FFTW_LIBRARIES NAMES fftw3f )
FIND_LIBRARY(WIRINGPI_LIB NAMES wiringPi)
FIND_LIBRARY(WIRINGPI_DEV_LIB NAMES wiringPiDev)
find_package(PkgConfig REQUIRED)
pkg_check_modules(GPIODCXX REQUIRED gpiodcxx)
FIND_LIBRARY(CRYPT_LIB NAMES crypt)

add_compile_options(-std=c++11)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Enable extra warnings. Not needed.
include (../../cmake/FatalWarnings.cmake)
Expand All @@ -18,6 +19,7 @@ find_package(Threads)

include_directories(
../..
${GPIODCXX_INCLUDE_DIRS}
)

set(matrix_creator_hal_src
Expand All @@ -43,10 +45,10 @@ set(matrix_creator_hal_src
)

add_library(matrix_creator_hal SHARED ${matrix_creator_hal_src})
set_property(TARGET matrix_creator_hal PROPERTY CXX_STANDARD 11)
set_property(TARGET matrix_creator_hal PROPERTY CXX_STANDARD 17)
target_link_libraries(matrix_creator_hal ${CMAKE_THREAD_LIBS_INIT} ${CMAKE_THREAD_LIBS_INIT})
target_link_libraries(matrix_creator_hal ${FFTW_LIBRARIES})
target_link_libraries(matrix_creator_hal ${WIRINGPI_LIB} ${WIRINGPI_DEV_LIB} ${CRYPT_LIB})
target_link_libraries(matrix_creator_hal ${GPIODCXX_LIBRARIES} ${CRYPT_LIB})

set (matrix_creator_hal_headers
circular_queue.h
Expand Down
41 changes: 28 additions & 13 deletions cpp/driver/microphone_array.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,30 +15,24 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

#include <wiringPi.h>
#include <cmath>
#include <condition_variable>
#include <cstdint>
#include <cstdlib>
#include <fstream>
#include <iostream>
#include <map>
#include <string>
#include <valarray>
#include <chrono>

#include "cpp/driver/creator_memory_map.h"
#include "cpp/driver/microphone_array.h"
#include "cpp/driver/microphone_array_location.h"

static std::mutex irq_m;
static std::condition_variable irq_cv;

void irq_callback(void) { irq_cv.notify_all(); }

namespace matrix_hal {

MicrophoneArray::MicrophoneArray(bool enable_beamforming)
: lock_(irq_m), gain_(3), sampling_frequency_(16000), enable_beamforming_(enable_beamforming) {
: gain_(3), sampling_frequency_(16000), enable_beamforming_(enable_beamforming) {
raw_data_.resize(kMicarrayBufferSize);

if (enable_beamforming_)
Expand All @@ -58,20 +52,41 @@ MicrophoneArray::~MicrophoneArray() {}
void MicrophoneArray::Setup(MatrixIOBus *bus) {
MatrixDriver::Setup(bus);

wiringPiSetup();
const char *chip_name = "gpiochip0";
gpiod::chip chip(chip_name);
gpiod::line line = chip.get_line(kMicrophoneArrayIRQ);

gpiod::request_config req_cfg;
req_cfg.consumer = "matrix-hal-micarray";

gpiod::line_settings settings;
settings.set_direction(gpiod::line::direction::INPUT);
settings.set_edge_detection(gpiod::line::edge::BOTH);

gpiod::line_config line_cfg;
line_cfg.add_line_settings(line, settings);

pinMode(kMicrophoneArrayIRQ, INPUT);
wiringPiISR(kMicrophoneArrayIRQ, INT_EDGE_BOTH, &irq_callback);
line_request_ = std::make_unique<gpiod::line_request>(chip.request_lines(req_cfg, line_cfg));

ReadConfValues();
}

// Read audio from the FPGA and calculate beam using delay & sum method
bool MicrophoneArray::Read() {
// TODO([email protected]): avoid double buffer
if (!bus_) return false;
if (!bus_ || !line_request_) return false;

irq_cv.wait(lock_);
try {
if (line_request_->wait_edge_events(std::chrono::seconds(1))) {
gpiod::edge_event_buffer events;
line_request_->read_edge_events(events);
} else {
return false;
}
} catch (const std::exception &e) {
std::cerr << "Error waiting for microphone interrupt: " << e.what() << std::endl;
return false;
}

if (!bus_->Read(kMicrophoneArrayBaseAddress,
reinterpret_cast<unsigned char *>(&raw_data_[0]),
Expand Down
7 changes: 4 additions & 3 deletions cpp/driver/microphone_array.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,10 @@
#ifndef CPP_DRIVER_MICROPHONE_ARRAY_H_
#define CPP_DRIVER_MICROPHONE_ARRAY_H_

#include <mutex>
#include <string>
#include <valarray>
#include <memory>
#include <gpiod.hpp>

#include "./circular_queue.h"
#include "./matrix_driver.h"
Expand All @@ -34,7 +35,7 @@ static const uint32_t MIC_sampling_frequencies[][3] = {
{96000, 30, 10}, {0, 0, 0}};

const uint16_t kMicarrayBufferSize = 4096;
const uint16_t kMicrophoneArrayIRQ = 22; // GPIO06 - WiringPi:22
const uint16_t kMicrophoneArrayIRQ = 6; // GPIO06
const uint16_t kMicrophoneChannels = 8;

class MicrophoneArray : public MatrixDriver {
Expand Down Expand Up @@ -76,7 +77,6 @@ class MicrophoneArray : public MatrixDriver {
float sound_speed_mmseg = 320 * 1000.0);

private:
std::unique_lock<std::mutex> lock_;
// delay and sum beamforming result
std::valarray<int16_t> beamformed_;
std::valarray<int16_t> raw_data_;
Expand All @@ -88,6 +88,7 @@ class MicrophoneArray : public MatrixDriver {

// beamforming delay and sum support
std::valarray<CircularQueue<int16_t>> fifos_;
std::unique_ptr<gpiod::line_request> line_request_;
};
}; // namespace matrix_hal
#endif // CPP_DRIVER_MICROPHONE_ARRAY_H_
36 changes: 27 additions & 9 deletions cpp/driver/uart_control.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

#include <wiringPi.h>
#include <iostream>
#include <string>
#include <chrono>

#include "cpp/driver/creator_memory_map.h"
#include "cpp/driver/uart_control.h"
Expand All @@ -28,12 +28,20 @@ const uint16_t kUartIRQ = 5;
const uint16_t UART_BUSY = 0x0010;

uint16_t UartControl::GetUartValue() {
if (!bus_) return false;
if (!bus_ || !line_request_) return false;
uint16_t value;
if (waitForInterrupt(kUartIRQ, -1) > 0) {
bus_->Read(kUartBaseAddress + 1, &value);
return value;

try {
if (line_request_->wait_edge_events(std::chrono::seconds(1))) {
gpiod::edge_event_buffer events;
line_request_->read_edge_events(events);
bus_->Read(kUartBaseAddress + 1, &value);
return value;
}
} catch (const std::exception &e) {
std::cerr << "Error waiting for UART interrupt: " << e.what() << std::endl;
}

return false;
}

Expand All @@ -58,11 +66,21 @@ UartControl::UartControl() : ucr_(0x0) {}

void UartControl::Setup(MatrixIOBus *bus) {
MatrixDriver::Setup(bus);
// TODO([email protected]): avoid systems calls
std::system("gpio edge 5 rising");

wiringPiSetupSys();
const char *chip_name = "gpiochip0";
gpiod::chip chip(chip_name);
gpiod::line line = chip.get_line(kUartIRQ);

gpiod::request_config req_cfg;
req_cfg.consumer = "matrix-hal-uart";

gpiod::line_settings settings;
settings.set_direction(gpiod::line::direction::INPUT);
settings.set_edge_detection(gpiod::line::edge::RISING);

gpiod::line_config line_cfg;
line_cfg.add_line_settings(line, settings);

pinMode(kUartIRQ, INPUT);
line_request_ = std::make_unique<gpiod::line_request>(chip.request_lines(req_cfg, line_cfg));
}
} // namespace matrix_hal
4 changes: 4 additions & 0 deletions cpp/driver/uart_control.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
#define CPP_DRIVER_UART_CONTROL_H_
#include <cstdint>
#include <vector>
#include <memory>
#include <gpiod.hpp>
#include "./matrix_driver.h"

namespace matrix_hal {
Expand All @@ -31,6 +33,8 @@ class UartControl : public MatrixDriver {
bool GetUartUCR();
bool SetUartValue(uint16_t data);
uint16_t ucr_;
private:
std::unique_ptr<gpiod::line_request> line_request_;
};

}; // namespace matrix_hal
Expand Down
4 changes: 2 additions & 2 deletions debian/control
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ Source: libmatrixio-creator-hal
Section: libs
Priority: optional
Maintainer: MATRIX Labs <[email protected]>
Build-Depends: debhelper (>= 9)
Build-Depends: debhelper (>= 9), libgpiod-dev
Standards-Version: 3.9.5
Homepage: https://github.com/matrix-io/matrix-creator-hal

Expand All @@ -12,7 +12,7 @@ Replaces: libmatrix-creator-hal
Architecture: any
Multi-Arch: same
Pre-Depends: ${misc:Pre-Depends}
Depends: ${shlibs:Depends}, ${misc:Depends}, wiringpi, libfftw3-dev, libgflags-dev
Depends: ${shlibs:Depends}, ${misc:Depends}, libgpiod2, libfftw3-dev, libgflags-dev
Description: Hardware Abstraction Layer for MATRIX.

Package: libmatrixio-creator-hal-dev
Expand Down
Loading