forked from wirtz/BALibrary
parent
75d7ef0aaf
commit
8da7c42d98
@ -0,0 +1,51 @@ |
||||
SPI writing DONE! |
||||
SPI TEST PASSED!!! |
||||
SPI writing DONE! |
||||
SPI TEST PASSED!!! |
||||
SPI writing DONE! |
||||
SPI TEST PASSED!!! |
||||
MIDI IS WORKING!!! |
||||
Message, type=176, data = 32 10 |
||||
SPI writing DONE! |
||||
SPI TEST PASSED!!! |
||||
SPI writing DONE! |
||||
SPI TEST PASSED!!! |
||||
SPI writing DONE! |
||||
SPI TEST PASSED!!! |
||||
MIDI IS WORKING!!! |
||||
Note On: ch=2, note=10, velocity=100 |
||||
SPI writing DONE! |
||||
SPI TEST PASSED!!! |
||||
SPI writing DONE! |
||||
SPI TEST PASSED!!! |
||||
SPI writing DONE! |
||||
SPI TEST PASSED!!! |
||||
MIDI IS WORKING!!! |
||||
Message, type=176, data = 33 11 |
||||
SPI writing DONE! |
||||
SPI TEST PASSED!!! |
||||
SPI writing DONE! |
||||
SPI TEST PASSED!!! |
||||
SPI writing DONE! |
||||
SPI TEST PASSED!!! |
||||
MIDI IS WORKING!!! |
||||
Note On: ch=3, note=10, velocity=100 |
||||
SPI writing DONE! |
||||
SPI TEST PASSED!!! |
||||
SPI writing DONE! |
||||
SPI TEST PASSED!!! |
||||
SPI writing DONE! |
||||
SPI TEST PASSED!!! |
||||
MIDI IS WORKING!!! |
||||
Message, type=176, data = 34 12 |
||||
SPI writing DONE! |
||||
SPI TEST PASSED!!! |
||||
SPI writing DONE! |
||||
SPI TEST PASSED!!! |
||||
SPI writing DONE! |
||||
SPI TEST PASSED!!! |
||||
MIDI IS WORKING!!! |
||||
Note On: ch=4, note=10, velocity=100 |
||||
SPI writing DONE! |
||||
SPI TEST PASSED!!! |
||||
|
@ -0,0 +1,153 @@ |
||||
#include <Wire.h> |
||||
#include <Audio.h> |
||||
#include <MIDI.h> |
||||
#include "BAGuitar.h" |
||||
|
||||
using namespace BAGuitar; |
||||
|
||||
AudioInputI2S i2sIn; |
||||
AudioOutputI2S i2sOut; |
||||
|
||||
// Audio Thru Connection
|
||||
AudioConnection patch0(i2sIn,0, i2sOut, 0); |
||||
AudioConnection patch1(i2sIn,1, i2sOut, 1); |
||||
|
||||
BAAudioControlWM8731 codecControl; |
||||
BAGpio gpio; // access to User LED
|
||||
BASpiMemory spiMem0(SpiDeviceId::SPI_DEVICE0); |
||||
|
||||
unsigned long t=0; |
||||
|
||||
// SPI stuff
|
||||
int spiAddress = 0; |
||||
int spiData = 0xff; |
||||
int spiErrorCount = 0; |
||||
|
||||
|
||||
void setup() { |
||||
|
||||
MIDI.begin(MIDI_CHANNEL_OMNI); |
||||
Serial.begin(57600); |
||||
delay(5); |
||||
|
||||
// If the codec was already powered up (due to reboot) power itd own first
|
||||
codecControl.disable(); |
||||
delay(100); |
||||
AudioMemory(24); |
||||
|
||||
Serial.println("Enabling codec...\n"); |
||||
codecControl.enable(); |
||||
delay(100); |
||||
|
||||
|
||||
} |
||||
|
||||
void loop() {
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Write test data to the SPI Memory
|
||||
//////////////////////////////////////////////////////////////////
|
||||
for (spiAddress=0; spiAddress <= SPI_MAX_ADDR; spiAddress++) { |
||||
if ((spiAddress % 32768) == 0) { |
||||
//Serial.print("Writing to ");
|
||||
//Serial.println(spiAddress, HEX);
|
||||
} |
||||
|
||||
//mem0Write(spiAddress, spiData);
|
||||
spiMem0.write(spiAddress, spiData); |
||||
spiData = (spiData-1) & 0xff; |
||||
} |
||||
Serial.println("SPI writing DONE!"); |
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
// Read back from the SPI memory
|
||||
///////////////////////////////////////////////////////////////////
|
||||
spiErrorCount = 0; |
||||
spiAddress = 0; |
||||
spiData = 0xff; |
||||
|
||||
for (spiAddress=0; spiAddress <= SPI_MAX_ADDR; spiAddress++) { |
||||
if ((spiAddress % 32768) == 0) { |
||||
//Serial.print("Reading ");
|
||||
//Serial.print(spiAddress, HEX);
|
||||
} |
||||
|
||||
//int data = mem0Read(spiAddress);
|
||||
int data = spiMem0.read(spiAddress); |
||||
if (data != spiData) { |
||||
spiErrorCount++; |
||||
Serial.println(""); |
||||
Serial.print("ERROR MEM0: (expected) (actual):"); |
||||
Serial.print(spiData, HEX); Serial.print(":"); |
||||
Serial.println(data, HEX); |
||||
delay(100); |
||||
} |
||||
|
||||
if ((spiAddress % 32768) == 0) { |
||||
//Serial.print(", data = ");
|
||||
//Serial.println(data, HEX);
|
||||
} |
||||
|
||||
spiData = (spiData-1) & 0xff; |
||||
|
||||
// Break out of test once the error count reaches 10
|
||||
if (spiErrorCount > 10) { break; } |
||||
|
||||
} |
||||
|
||||
if (spiErrorCount == 0) { Serial.println("SPI TEST PASSED!!!"); } |
||||
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
// MIDI TESTING
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
int type, note, velocity, channel, d1, d2; |
||||
|
||||
// Send MIDI OUT
|
||||
int cc, val=0xA, channelSend = 1; |
||||
for (cc=32; cc<40; cc++) { |
||||
MIDI.sendControlChange(cc, val, channelSend); val++; channelSend++; |
||||
delay(100); |
||||
MIDI.sendNoteOn(10, 100, channelSend); |
||||
delay(100); |
||||
} |
||||
|
||||
if (MIDI.read()) { // Is there a MIDI message incoming ?
|
||||
byte type = MIDI.getType(); |
||||
Serial.println(String("MIDI IS WORKING!!!")); |
||||
switch (type) { |
||||
case NoteOn: |
||||
note = MIDI.getData1(); |
||||
velocity = MIDI.getData2(); |
||||
channel = MIDI.getChannel(); |
||||
if (velocity > 0) { |
||||
Serial.println(String("Note On: ch=") + channel + ", note=" + note + ", velocity=" + velocity); |
||||
} else { |
||||
Serial.println(String("Note Off: ch=") + channel + ", note=" + note); |
||||
} |
||||
break; |
||||
case NoteOff: |
||||
note = MIDI.getData1(); |
||||
velocity = MIDI.getData2(); |
||||
channel = MIDI.getChannel(); |
||||
Serial.println(String("Note Off: ch=") + channel + ", note=" + note + ", velocity=" + velocity); |
||||
break; |
||||
default: |
||||
d1 = MIDI.getData1(); |
||||
d2 = MIDI.getData2(); |
||||
Serial.println(String("Message, type=") + type + ", data = " + d1 + " " + d2); |
||||
} |
||||
t = millis(); |
||||
} |
||||
|
||||
if (millis() - t > 10000) { |
||||
t += 10000; |
||||
Serial.println("(no MIDI activity, check cables)"); |
||||
} |
||||
|
||||
// Toggle the USR LED state
|
||||
gpio.toggleLed(); |
||||
|
||||
} |
||||
|
@ -0,0 +1,24 @@ |
||||
####################################### |
||||
# Syntax Coloring Map For ExampleLibrary |
||||
####################################### |
||||
|
||||
####################################### |
||||
# Datatypes (KEYWORD1) |
||||
####################################### |
||||
|
||||
BAAudioControlWM8731 KEYWORD1 |
||||
BASpiMemory KEYWORD1 |
||||
|
||||
####################################### |
||||
# Methods and Functions (KEYWORD2) |
||||
####################################### |
||||
|
||||
doSomething KEYWORD2 |
||||
|
||||
####################################### |
||||
# Instances (KEYWORD2) |
||||
####################################### |
||||
|
||||
####################################### |
||||
# Constants (LITERAL1) |
||||
####################################### |
@ -0,0 +1,10 @@ |
||||
name=BAGuitar |
||||
version=0.1 |
||||
author=Steve Lascos <steve@blackaddr.com> |
||||
maintainer=Steve Lascos <steve@blackaddr.com> |
||||
sentence=A library for using the Blackaddr Audio Teensy Guitar Board. |
||||
paragraph=Extends the Teensy Audio Library. |
||||
category=Communication |
||||
url=www.blackaddr.com |
||||
architectures=avr |
||||
includes=BAGuitar.h |
@ -0,0 +1,250 @@ |
||||
/*
|
||||
* BAAudioControlWM8731.h |
||||
* |
||||
* Created on: May 22, 2017 |
||||
* Author: slascos |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 3 of the License, or |
||||
* (at your option) any later version.* |
||||
* |
||||
* This program 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 General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#include <Wire.h> |
||||
#include "BAAudioControlWM8731.h" |
||||
|
||||
namespace BAGuitar { |
||||
|
||||
void BAAudioControlWM8731::resetInternalReg(void) { |
||||
// Set to reset state
|
||||
regArray[0] = 0x97; |
||||
regArray[1] = 0x97; |
||||
regArray[2] = 0x79; |
||||
regArray[3] = 0x79; |
||||
regArray[4] = 0x0a; |
||||
regArray[5] = 0x8; |
||||
regArray[6] = 0x9f; |
||||
regArray[7] = 0xa; |
||||
regArray[8] = 0; |
||||
regArray[9] = 0; |
||||
} |
||||
|
||||
BAAudioControlWM8731::BAAudioControlWM8731() |
||||
{ |
||||
resetInternalReg(); |
||||
Wire.begin(); // start the I2C service
|
||||
} |
||||
|
||||
BAAudioControlWM8731::~BAAudioControlWM8731() |
||||
{ |
||||
} |
||||
|
||||
void BAAudioControlWM8731::disable(void) |
||||
{ |
||||
|
||||
// set OUTPD to '1' (powerdown), which is bit 4
|
||||
regArray[WM8731_REG_POWERDOWN] |= 0x10; |
||||
write(WM8731_REG_POWERDOWN, regArray[WM8731_REG_POWERDOWN]); |
||||
delay(100); // wait for power down
|
||||
|
||||
// power down the rest of the supplies
|
||||
write(WM8731_REG_POWERDOWN, 0x9f); // complete codec powerdown
|
||||
delay(100); |
||||
|
||||
resetCodec(); |
||||
} |
||||
|
||||
|
||||
bool BAAudioControlWM8731::enable(void) |
||||
{ |
||||
|
||||
// Sequence from WAN0111.pdf
|
||||
|
||||
// Begin configuring the codec
|
||||
resetCodec(); |
||||
delay(100); // wait for reset
|
||||
|
||||
// Power up all domains except OUTPD and microphone
|
||||
regArray[WM8731_REG_POWERDOWN] = 0x12; |
||||
write(WM8731_REG_POWERDOWN, regArray[WM8731_REG_POWERDOWN]); |
||||
delay(100); // wait for codec powerup
|
||||
|
||||
|
||||
setAdcBypass(false); // causes a slight click
|
||||
setDacSelect(true); |
||||
setHPFDisable(true); |
||||
setLeftInputGain(0x17); // default input gain
|
||||
setRightInputGain(0x17); |
||||
setLeftInMute(false); // no input mute
|
||||
setRightInMute(false); |
||||
setDacMute(false); // unmute the DAC
|
||||
|
||||
// mute the headphone outputs
|
||||
write(WM8731_REG_LHEADOUT, 0x00); // volume off
|
||||
regArray[WM8731_REG_LHEADOUT] = 0x00; |
||||
write(WM8731_REG_RHEADOUT, 0x00); |
||||
regArray[WM8731_REG_RHEADOUT] = 0x00; |
||||
|
||||
/// Configure the audio interface
|
||||
write(WM8731_REG_INTERFACE, 0x02); // I2S, 16 bit, MCLK slave
|
||||
regArray[WM8731_REG_INTERFACE] = 0x2; |
||||
|
||||
write(WM8731_REG_SAMPLING, 0x20); // 256*Fs, 44.1 kHz, MCLK/1
|
||||
regArray[WM8731_REG_SAMPLING] = 0x20; |
||||
delay(100); // wait for interface config
|
||||
|
||||
// Activate the audio interface
|
||||
setActivate(true); |
||||
delay(100); |
||||
|
||||
write(WM8731_REG_POWERDOWN, 0x02); // power up outputs
|
||||
regArray[WM8731_REG_POWERDOWN] = 0x02; |
||||
delay(500); // wait for output to power up
|
||||
|
||||
// // Activate the audio interface
|
||||
// setActivate(true);
|
||||
// delay(10);
|
||||
|
||||
//setDacMute(false);
|
||||
delay(100); // wait for mute ramp
|
||||
|
||||
return true; |
||||
|
||||
} |
||||
|
||||
|
||||
void BAAudioControlWM8731::setLeftInputGain(int val) |
||||
{ |
||||
regArray[WM8731_LEFT_INPUT_GAIN_ADDR] &= ~WM8731_LEFT_INPUT_GAIN_MASK; |
||||
regArray[WM8731_LEFT_INPUT_GAIN_ADDR] |= |
||||
((val << WM8731_LEFT_INPUT_GAIN_SHIFT) & WM8731_LEFT_INPUT_GAIN_MASK); |
||||
write(WM8731_LEFT_INPUT_GAIN_ADDR, regArray[WM8731_LEFT_INPUT_GAIN_ADDR]); |
||||
} |
||||
|
||||
void BAAudioControlWM8731::setLeftInMute(bool val) |
||||
{ |
||||
if (val) { |
||||
regArray[WM8731_LEFT_INPUT_MUTE_ADDR] |= WM8731_LEFT_INPUT_MUTE_MASK; |
||||
} else { |
||||
regArray[WM8731_LEFT_INPUT_MUTE_ADDR] &= ~WM8731_LEFT_INPUT_MUTE_MASK; |
||||
} |
||||
write(WM8731_LEFT_INPUT_MUTE_ADDR, regArray[WM8731_LEFT_INPUT_MUTE_ADDR]); |
||||
} |
||||
|
||||
void BAAudioControlWM8731::setLinkLeftRightIn(bool val) |
||||
{ |
||||
if (val) { |
||||
regArray[WM8731_LINK_LEFT_RIGHT_IN_ADDR] |= WM8731_LINK_LEFT_RIGHT_IN_MASK; |
||||
regArray[WM8731_LINK_RIGHT_LEFT_IN_ADDR] |= WM8731_LINK_RIGHT_LEFT_IN_MASK; |
||||
} else { |
||||
regArray[WM8731_LINK_LEFT_RIGHT_IN_ADDR] &= ~WM8731_LINK_LEFT_RIGHT_IN_MASK; |
||||
regArray[WM8731_LINK_RIGHT_LEFT_IN_ADDR] &= ~WM8731_LINK_RIGHT_LEFT_IN_MASK; |
||||
} |
||||
write(WM8731_LINK_LEFT_RIGHT_IN_ADDR, regArray[WM8731_LINK_LEFT_RIGHT_IN_ADDR]); |
||||
write(WM8731_LINK_RIGHT_LEFT_IN_ADDR, regArray[WM8731_LINK_RIGHT_LEFT_IN_ADDR]); |
||||
} |
||||
|
||||
void BAAudioControlWM8731::setRightInputGain(int val) |
||||
{ |
||||
regArray[WM8731_RIGHT_INPUT_GAIN_ADDR] &= ~WM8731_RIGHT_INPUT_GAIN_MASK; |
||||
regArray[WM8731_RIGHT_INPUT_GAIN_ADDR] |= |
||||
((val << WM8731_RIGHT_INPUT_GAIN_SHIFT) & WM8731_RIGHT_INPUT_GAIN_MASK); |
||||
write(WM8731_RIGHT_INPUT_GAIN_ADDR, regArray[WM8731_RIGHT_INPUT_GAIN_ADDR]); |
||||
} |
||||
|
||||
void BAAudioControlWM8731::setRightInMute(bool val) |
||||
{ |
||||
if (val) { |
||||
regArray[WM8731_RIGHT_INPUT_MUTE_ADDR] |= WM8731_RIGHT_INPUT_MUTE_MASK; |
||||
} else { |
||||
regArray[WM8731_RIGHT_INPUT_MUTE_ADDR] &= ~WM8731_RIGHT_INPUT_MUTE_MASK; |
||||
} |
||||
write(WM8731_RIGHT_INPUT_MUTE_ADDR, regArray[WM8731_RIGHT_INPUT_MUTE_ADDR]); |
||||
} |
||||
|
||||
void BAAudioControlWM8731::setDacMute(bool val) |
||||
{ |
||||
if (val) { |
||||
regArray[WM8731_DAC_MUTE_ADDR] |= WM8731_DAC_MUTE_MASK; |
||||
} else { |
||||
regArray[WM8731_DAC_MUTE_ADDR] &= ~WM8731_DAC_MUTE_MASK; |
||||
} |
||||
write(WM8731_DAC_MUTE_ADDR, regArray[WM8731_DAC_MUTE_ADDR]); |
||||
} |
||||
|
||||
void BAAudioControlWM8731::setDacSelect(bool val) |
||||
{ |
||||
if (val) { |
||||
regArray[WM8731_DAC_SELECT_ADDR] |= WM8731_DAC_SELECT_MASK; |
||||
} else { |
||||
regArray[WM8731_DAC_SELECT_ADDR] &= ~WM8731_DAC_SELECT_MASK; |
||||
} |
||||
write(WM8731_DAC_SELECT_ADDR, regArray[WM8731_DAC_SELECT_ADDR]); |
||||
} |
||||
|
||||
void BAAudioControlWM8731::setAdcBypass(bool val) |
||||
{ |
||||
if (val) { |
||||
regArray[WM8731_ADC_BYPASS_ADDR] |= WM8731_ADC_BYPASS_MASK; |
||||
} else { |
||||
regArray[WM8731_ADC_BYPASS_ADDR] &= ~WM8731_ADC_BYPASS_MASK; |
||||
} |
||||
write(WM8731_ADC_BYPASS_ADDR, regArray[WM8731_ADC_BYPASS_ADDR]); |
||||
} |
||||
|
||||
void BAAudioControlWM8731::setHPFDisable(bool val) |
||||
{ |
||||
if (val) { |
||||
regArray[WM8731_HPF_DISABLE_ADDR] |= WM8731_HPF_DISABLE_MASK; |
||||
} else { |
||||
regArray[WM8731_HPF_DISABLE_ADDR] &= ~WM8731_HPF_DISABLE_MASK; |
||||
} |
||||
write(WM8731_HPF_DISABLE_ADDR, regArray[WM8731_HPF_DISABLE_ADDR]); |
||||
} |
||||
|
||||
void BAAudioControlWM8731::setActivate(bool val) |
||||
{ |
||||
if (val) { |
||||
write(WM8731_ACTIVATE_ADDR, WM8731_ACTIVATE_MASK); |
||||
} else { |
||||
write(WM8731_ACTIVATE_ADDR, 0); |
||||
} |
||||
|
||||
} |
||||
|
||||
|
||||
void BAAudioControlWM8731::resetCodec(void) |
||||
{ |
||||
write(WM8731_REG_RESET, 0x0); |
||||
resetInternalReg(); |
||||
} |
||||
|
||||
void BAAudioControlWM8731::writeI2C(unsigned int addr, unsigned int val) |
||||
{ |
||||
write(addr, val); |
||||
} |
||||
|
||||
bool BAAudioControlWM8731::write(unsigned int reg, unsigned int val) |
||||
{ |
||||
Wire.beginTransmission(WM8731_I2C_ADDR); |
||||
Wire.write((reg << 1) | ((val >> 8) & 1)); |
||||
Wire.write(val & 0xFF); |
||||
Wire.endTransmission(); |
||||
// Serial.print(String("Wrote "));
|
||||
// Serial.print((reg << 1) | ((val >> 8) & 1), HEX);
|
||||
// Serial.print(" ");
|
||||
// Serial.print(val & 0xFF, HEX);
|
||||
// Serial.print("\n");
|
||||
|
||||
return true; |
||||
} |
||||
|
||||
} /* namespace BAGuitar */ |
@ -0,0 +1,118 @@ |
||||
/*
|
||||
* BAAudioControlWM8731.h |
||||
* |
||||
* Created on: May 22, 2017 |
||||
* Author: slascos |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 3 of the License, or |
||||
* (at your option) any later version.* |
||||
* |
||||
* This program 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 General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#ifndef INC_BAAUDIOCONTROLWM8731_H_ |
||||
#define INC_BAAUDIOCONTROLWM8731_H_ |
||||
|
||||
#include <Audio.h> |
||||
|
||||
namespace BAGuitar { |
||||
|
||||
// use const instead of define for proper scoping
|
||||
constexpr int WM8731_I2C_ADDR = 0x1A; |
||||
constexpr int WM8731_NUM_REGS = 10; |
||||
|
||||
constexpr int WM8731_REG_LLINEIN = 0; |
||||
constexpr int WM8731_REG_RLINEIN = 1; |
||||
constexpr int WM8731_REG_LHEADOUT = 2; |
||||
constexpr int WM8731_REG_RHEADOUT = 3; |
||||
constexpr int WM8731_REG_ANALOG =4; |
||||
constexpr int WM8731_REG_DIGITAL = 5; |
||||
constexpr int WM8731_REG_POWERDOWN = 6; |
||||
constexpr int WM8731_REG_INTERFACE = 7; |
||||
constexpr int WM8731_REG_SAMPLING = 8; |
||||
constexpr int WM8731_REG_ACTIVE = 9; |
||||
constexpr int WM8731_REG_RESET = 15; |
||||
|
||||
// Register Masks and Shifts
|
||||
// Register 0
|
||||
constexpr int WM8731_LEFT_INPUT_GAIN_ADDR = 0; |
||||
constexpr int WM8731_LEFT_INPUT_GAIN_MASK = 0x1F; |
||||
constexpr int WM8731_LEFT_INPUT_GAIN_SHIFT = 0; |
||||
constexpr int WM8731_LEFT_INPUT_MUTE_ADDR = 0; |
||||
constexpr int WM8731_LEFT_INPUT_MUTE_MASK = 0x80; |
||||
constexpr int WM8731_LEFT_INPUT_MUTE_SHIFT = 7; |
||||
constexpr int WM8731_LINK_LEFT_RIGHT_IN_ADDR = 0; |
||||
constexpr int WM8731_LINK_LEFT_RIGHT_IN_MASK = 0x100; |
||||
constexpr int WM8731_LINK_LEFT_RIGHT_IN_SHIFT = 8; |
||||
// Register 1
|
||||
constexpr int WM8731_RIGHT_INPUT_GAIN_ADDR = 1; |
||||
constexpr int WM8731_RIGHT_INPUT_GAIN_MASK = 0x1F; |
||||
constexpr int WM8731_RIGHT_INPUT_GAIN_SHIFT = 0; |
||||
constexpr int WM8731_RIGHT_INPUT_MUTE_ADDR = 1; |
||||
constexpr int WM8731_RIGHT_INPUT_MUTE_MASK = 0x80; |
||||
constexpr int WM8731_RIGHT_INPUT_MUTE_SHIFT = 7; |
||||
constexpr int WM8731_LINK_RIGHT_LEFT_IN_ADDR = 1; |
||||
constexpr int WM8731_LINK_RIGHT_LEFT_IN_MASK = 0x100; |
||||
constexpr int WM8731_LINK_RIGHT_LEFT_IN_SHIFT = 8; |
||||
// Register 4
|
||||
constexpr int WM8731_ADC_BYPASS_ADDR = 4; |
||||
constexpr int WM8731_ADC_BYPASS_MASK = 0x8; |
||||
constexpr int WM8731_ADC_BYPASS_SHIFT = 3; |
||||
constexpr int WM8731_DAC_SELECT_ADDR = 4; |
||||
constexpr int WM8731_DAC_SELECT_MASK = 0x10; |
||||
constexpr int WM8731_DAC_SELECT_SHIFT = 4; |
||||
// Register 5
|
||||
constexpr int WM8731_DAC_MUTE_ADDR = 5; |
||||
constexpr int WM8731_DAC_MUTE_MASK = 0x8; |
||||
constexpr int WM8731_DAC_MUTE_SHIFT = 3; |
||||
constexpr int WM8731_HPF_DISABLE_ADDR = 5; |
||||
constexpr int WM8731_HPF_DISABLE_MASK = 0x1; |
||||
constexpr int WM8731_HPF_DISABLE_SHIFT = 0; |
||||
|
||||
// Register 9
|
||||
constexpr int WM8731_ACTIVATE_ADDR = 9; |
||||
constexpr int WM8731_ACTIVATE_MASK = 0x1; |
||||
|
||||
|
||||
class BAAudioControlWM8731 { |
||||
public: |
||||
BAAudioControlWM8731(); |
||||
virtual ~BAAudioControlWM8731(); |
||||
|
||||
void disable(void); |
||||
bool enable(void); |
||||
void setLeftInputGain(int val); |
||||
void setRightInputGain(int val); |
||||
void setLeftInMute(bool val); |
||||
void setRightInMute(bool val); |
||||
void setLinkLeftRightIn(bool val); |
||||
void setDacMute(bool val); |
||||
void setDacSelect(bool val); |
||||
void setAdcBypass(bool val); |
||||
void setHPFDisable(bool val); |
||||
|
||||
|
||||
void setActivate(bool val); |
||||
void resetCodec(void); |
||||
|
||||
void writeI2C(unsigned int addr, unsigned int val); |
||||
protected: |
||||
int regArray[WM8731_NUM_REGS]; |
||||
|
||||
private: |
||||
bool write(unsigned int reg, unsigned int val); |
||||
void resetInternalReg(void); |
||||
|
||||
}; |
||||
|
||||
} /* namespace BAGuitar */ |
||||
|
||||
#endif /* INC_BAAUDIOCONTROLWM8731_H_ */ |
@ -0,0 +1,77 @@ |
||||
/*
|
||||
* BAGpio.cpp |
||||
* |
||||
* Created on: Sep 17, 2017 |
||||
* Author: slascos |
||||
*/ |
||||
|
||||
#include "Arduino.h" |
||||
#include "BAGpio.h" |
||||
|
||||
namespace BAGuitar { |
||||
|
||||
BAGpio::BAGpio() |
||||
{ |
||||
// Set all GPIOs to input
|
||||
// for (auto i=0; i<NUM_GPIO; i++) {
|
||||
// m_gpioState = 1;
|
||||
// }
|
||||
|
||||
pinMode(static_cast<uint8_t>(GPIO::GPIO0), INPUT); |
||||
pinMode(static_cast<uint8_t>(GPIO::GPIO1), INPUT); |
||||
pinMode(static_cast<uint8_t>(GPIO::GPIO2), INPUT); |
||||
pinMode(static_cast<uint8_t>(GPIO::GPIO3), INPUT); |
||||
pinMode(static_cast<uint8_t>(GPIO::GPIO4), INPUT); |
||||
pinMode(static_cast<uint8_t>(GPIO::GPIO5), INPUT); |
||||
pinMode(static_cast<uint8_t>(GPIO::GPIO6), INPUT); |
||||
pinMode(static_cast<uint8_t>(GPIO::GPIO7), INPUT); |
||||
pinMode(static_cast<uint8_t>(GPIO::TP1), INPUT); |
||||
pinMode(static_cast<uint8_t>(GPIO::TP2), INPUT); |
||||
|
||||
pinMode(USR_LED_ID, OUTPUT); |
||||
m_ledState = 0; |
||||
|
||||
|
||||
} |
||||
|
||||
BAGpio::~BAGpio() |
||||
{ |
||||
} |
||||
|
||||
void BAGpio::setGPIODirection(GPIO gpioId, int direction) |
||||
{ |
||||
pinMode(static_cast<uint8_t>(gpioId), direction); |
||||
} |
||||
void BAGpio::setGPIO(GPIO gpioId) |
||||
{ |
||||
digitalWrite(static_cast<uint8_t>(gpioId), 0x1); |
||||
} |
||||
void BAGpio::clearGPIO(GPIO gpioId) |
||||
{ |
||||
digitalWrite(static_cast<uint8_t>(gpioId), 0); |
||||
|
||||
} |
||||
void BAGpio::toggleGPIO(GPIO gpioId) |
||||
{ |
||||
int data = digitalRead(static_cast<uint8_t>(gpioId)); |
||||
digitalWrite(static_cast<uint8_t>(gpioId), ~data); |
||||
} |
||||
|
||||
void BAGpio::setLed() |
||||
{ |
||||
digitalWrite(USR_LED_ID, 0x1); |
||||
m_ledState = 1; |
||||
} |
||||
void BAGpio::clearLed() |
||||
{ |
||||
digitalWrite(USR_LED_ID, 0); |
||||
m_ledState = 0; |
||||
} |
||||
void BAGpio::toggleLed() |
||||
{ |
||||
m_ledState = ~m_ledState; |
||||
digitalWrite(USR_LED_ID, m_ledState); |
||||
} |
||||
|
||||
|
||||
} /* namespace BAGuitar */ |
@ -0,0 +1,82 @@ |
||||
/*
|
||||
* BAGpio.h |
||||
* |
||||
* Created on: May 22, 2017 |
||||
* Author: slascos |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 3 of the License, or |
||||
* (at your option) any later version.* |
||||
* |
||||
* This program 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 General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#ifndef SRC_BAGPIO_H_ |
||||
#define SRC_BAGPIO_H_ |
||||
|
||||
namespace BAGuitar { |
||||
|
||||
//constexpr int NUM_GPIO = 10;
|
||||
|
||||
constexpr uint8_t USR_LED_ID = 16; |
||||
|
||||
enum class GPIO : uint8_t { |
||||
GPIO0 = 2, |
||||
GPIO1 = 3, |
||||
GPIO2 = 4, |
||||
GPIO3 = 6, |
||||
|
||||
GPIO4 = 12, |
||||
GPIO5 = 32, |
||||
GPIO6 = 27, |
||||
GPIO7 = 28, |
||||
|
||||
TP1 = 34, |
||||
TP2 = 33 |
||||
}; |
||||
//// J3 - GPIO Header
|
||||
//constexpr int GPIO0 = 2;
|
||||
//constexpr int GPIO1 = 3;
|
||||
//constexpr int GPIO2 = 4;
|
||||
//constexpr int GPIO3 = 6;
|
||||
//
|
||||
//// J6 - GPIO Header
|
||||
//constexpr int GPIO4 = 12;
|
||||
//constexpr int GPIO5 = 32;
|
||||
//constexpr int GPIO6 = 27;
|
||||
//constexpr int GPIO7 = 28;
|
||||
|
||||
|
||||
// Test points
|
||||
//constexpr int TP1 = 34;
|
||||
//constexpr int TP2 = 33;
|
||||
|
||||
class BAGpio { |
||||
public: |
||||
BAGpio(); |
||||
virtual ~BAGpio(); |
||||
|
||||
void setGPIODirection(GPIO gpioId, int direction); |
||||
void setGPIO(GPIO gpioId); |
||||
void clearGPIO(GPIO gpioId); |
||||
void toggleGPIO(GPIO gpioId); |
||||
|
||||
void setLed(); |
||||
void clearLed(); |
||||
void toggleLed(); |
||||
|
||||
private: |
||||
//bool m_gpioState[NUM_GPIO];
|
||||
uint8_t m_ledState; |
||||
}; |
||||
|
||||
} /* namespace BAGuitar */ |
||||
|
||||
#endif /* SRC_BAGPIO_H_ */ |
@ -0,0 +1,40 @@ |
||||
/*
|
||||
* BAGuitar.h |
||||
* |
||||
* Created on: May 22, 2017 |
||||
* Author: slascos |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 3 of the License, or |
||||
* (at your option) any later version.* |
||||
* |
||||
* This program 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 General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#ifndef SRC_BATGUITAR_H_ |
||||
#define SRC_BATGUITAR_H_ |
||||
|
||||
#include "BAAudioControlWM8731.h" // Codec Control |
||||
#include "BASpiMemory.h" |
||||
#include "BAGpio.h" |
||||
|
||||
namespace BAGuitar { |
||||
|
||||
#define AUDIO_BLOCK_SIZE 128 |
||||
|
||||
// Spi Memory
|
||||
constexpr int SPI_MAX_ADDR = 131071; |
||||
|
||||
// LED
|
||||
constexpr int usrLED = 16; |
||||
|
||||
} |
||||
|
||||
#endif /* SRC_BATGUITAR_H_ */ |
@ -0,0 +1,170 @@ |
||||
/*
|
||||
* BASpiMemory.cpp |
||||
* |
||||
* Created on: May 22, 2017 |
||||
* Author: slascos |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 3 of the License, or |
||||
* (at your option) any later version.* |
||||
* |
||||
* This program 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 General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
|
||||
#include "Arduino.h" |
||||
#include "BASpiMemory.h" |
||||
|
||||
namespace BAGuitar { |
||||
|
||||
// MEM0 Settings
|
||||
constexpr int SPI_CS_MEM0 = 15; |
||||
constexpr int SPI_MOSI_MEM0 = 7; |
||||
constexpr int SPI_MISO_MEM0 = 8; |
||||
constexpr int SPI_SCK_MEM0 = 14; |
||||
|
||||
// MEM1 Settings
|
||||
constexpr int SPI_CS_MEM1 = 31; |
||||
constexpr int SPI_MOSI_MEM1 = 21; |
||||
constexpr int SPI_MISO_MEM1 = 5; |
||||
constexpr int SPI_SCK_MEM1 = 20; |
||||
|
||||
// SPI Constants
|
||||
constexpr int SPI_WRITE_CMD = 0x2; |
||||
constexpr int SPI_READ_CMD = 0x3; |
||||
constexpr int SPI_ADDR_2_MASK = 0xFF0000; |
||||
constexpr int SPI_ADDR_2_SHIFT = 16; |
||||
constexpr int SPI_ADDR_1_MASK = 0x00FF00; |
||||
constexpr int SPI_ADDR_1_SHIFT = 8; |
||||
constexpr int SPI_ADDR_0_MASK = 0x0000FF; |
||||
|
||||
|
||||
|
||||
|
||||
BASpiMemory::BASpiMemory(SpiDeviceId memDeviceId) |
||||
{ |
||||
m_memDeviceId = memDeviceId; |
||||
m_settings = {20000000, MSBFIRST, SPI_MODE0}; |
||||
m_Init(); |
||||
} |
||||
|
||||
BASpiMemory::BASpiMemory(SpiDeviceId memDeviceId, uint32_t speedHz) |
||||
{ |
||||
m_memDeviceId = memDeviceId; |
||||
m_settings = {speedHz, MSBFIRST, SPI_MODE0}; |
||||
m_Init(); |
||||
} |
||||
|
||||
void BASpiMemory::m_Init() |
||||
{ |
||||
|
||||
switch (m_memDeviceId) { |
||||
case SpiDeviceId::SPI_DEVICE0 : |
||||
m_csPin = SPI_CS_MEM0; |
||||
SPI.setMOSI(SPI_MOSI_MEM0); |
||||
SPI.setMISO(SPI_MISO_MEM0); |
||||
SPI.setSCK(SPI_SCK_MEM0); |
||||
break; |
||||
|
||||
#if defined(__MK64FX512__) || defined(__MK66FX1M0__) |
||||
case SpiDeviceId::SPI_DEVICE1 : |
||||
m_csPin = SPI_CS_MEM1; |
||||
SPI1.setMOSI(SPI_MOSI_MEM1); |
||||
SPI1.setMISO(SPI_MISO_MEM1); |
||||
SPI1.setSCK(SPI_SCK_MEM1); |
||||
break; |
||||
#endif |
||||
|
||||
default : |
||||
// unreachable since memDeviceId is an enumerated class
|
||||
return; |
||||
} |
||||
|
||||
SPI.begin(); |
||||
pinMode(m_csPin, OUTPUT); |
||||
digitalWrite(m_csPin, HIGH); |
||||
|
||||
} |
||||
|
||||
BASpiMemory::~BASpiMemory() { |
||||
// TODO Auto-generated destructor stub
|
||||
} |
||||
|
||||
void BASpiMemory::write(int address, int data) |
||||
{ |
||||
|
||||
SPI.beginTransaction(m_settings); |
||||
digitalWrite(m_csPin, LOW); |
||||
|
||||
switch (m_memDeviceId) { |
||||
case SpiDeviceId::SPI_DEVICE0 : |
||||
SPI.transfer(SPI_WRITE_CMD); |
||||
SPI.transfer((address & SPI_ADDR_2_MASK) >> SPI_ADDR_2_SHIFT); |
||||
SPI.transfer((address & SPI_ADDR_1_MASK) >> SPI_ADDR_1_SHIFT); |
||||
SPI.transfer((address & SPI_ADDR_0_MASK)); |
||||
SPI.transfer(data); |
||||
SPI.endTransaction(); |
||||
break; |
||||
|
||||
#if defined(__MK64FX512__) || defined(__MK66FX1M0__) |
||||
case SpiDeviceId::SPI_DEVICE1 : |
||||
digitalWrite(m_csPin, HIGH); |
||||
SPI1.transfer(SPI_WRITE_CMD); |
||||
SPI1.transfer((address & SPI_ADDR_2_MASK) >> SPI_ADDR_2_SHIFT); |
||||
SPI1.transfer((address & SPI_ADDR_1_MASK) >> SPI_ADDR_1_SHIFT); |
||||
SPI1.transfer((address & SPI_ADDR_0_MASK)); |
||||
SPI1.transfer(data); |
||||
SPI1.endTransaction(); |
||||
break; |
||||
#endif |
||||
|
||||
default : |
||||
break; |
||||
// unreachable
|
||||
} |
||||
digitalWrite(m_csPin, HIGH); |
||||
} |
||||
|
||||
int BASpiMemory::read(int address) |
||||
{ |
||||
|
||||
int data = -1; |
||||
SPI.beginTransaction(m_settings); |
||||
digitalWrite(m_csPin, LOW); |
||||
switch (m_memDeviceId) { |
||||
case SpiDeviceId::SPI_DEVICE0 : |
||||
SPI.transfer(SPI_READ_CMD); |
||||
SPI.transfer((address & SPI_ADDR_2_MASK) >> SPI_ADDR_2_SHIFT); |
||||
SPI.transfer((address & SPI_ADDR_1_MASK) >> SPI_ADDR_1_SHIFT); |
||||
SPI.transfer((address & SPI_ADDR_0_MASK)); |
||||
data = SPI.transfer(0); |
||||
SPI.endTransaction(); |
||||
break; |
||||
|
||||
#if defined(__MK64FX512__) || defined(__MK66FX1M0__) |
||||
case SpiDeviceId::SPI_DEVICE1 : |
||||
SPI1.transfer(SPI_READ_CMD); |
||||
SPI1.transfer((address & SPI_ADDR_2_MASK) >> SPI_ADDR_2_SHIFT); |
||||
SPI1.transfer((address & SPI_ADDR_1_MASK) >> SPI_ADDR_1_SHIFT); |
||||
SPI1.transfer((address & SPI_ADDR_0_MASK)); |
||||
data = SPI.transfer(0); |
||||
SPI1.endTransaction(); |
||||
break; |
||||
#endif |
||||
|
||||
default: |
||||
break; |
||||
// unreachable
|
||||
} |
||||
|
||||
digitalWrite(m_csPin, HIGH); |
||||
return data; |
||||
} |
||||
|
||||
} /* namespace BAGuitar */ |
@ -0,0 +1,54 @@ |
||||
/*
|
||||
* BASpiMemory.h |
||||
* |
||||
* Created on: May 22, 2017 |
||||
* Author: slascos |
||||
* |
||||
* This program is free software: you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation, either version 3 of the License, or |
||||
* (at your option) any later version.* |
||||
* |
||||
* This program 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 General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/ |
||||
#ifndef SRC_BASPIMEMORY_H_ |
||||
#define SRC_BASPIMEMORY_H_ |
||||
|
||||
#include <SPI.h> |
||||
|
||||
namespace BAGuitar { |
||||
|
||||
enum class SpiDeviceId { |
||||
SPI_DEVICE0, |
||||
SPI_DEVICE1 |
||||
}; |
||||
|
||||
class BASpiMemory { |
||||
public: |
||||
BASpiMemory() = delete; |
||||
BASpiMemory(SpiDeviceId memDeviceId); |
||||
BASpiMemory(SpiDeviceId memDeviceId, uint32_t speedHz); |
||||
virtual ~BASpiMemory(); |
||||
|
||||
void write(int address, int data); |
||||
int read(int address); |
||||
|
||||
private: |
||||
SpiDeviceId m_memDeviceId; |
||||
uint8_t m_csPin; |
||||
SPISettings m_settings; |
||||
void m_Init(); |
||||
|
||||
}; |
||||
|
||||
class BASpiMemoryException {}; |
||||
|
||||
} /* namespace BAGuitar */ |
||||
|
||||
#endif /* SRC_BASPIMEMORY_H_ */ |
Loading…
Reference in new issue