Skip to content

Commit 0747186

Browse files
committed
pbio/drv/sound/sound_ev3: Set up hardware and IRQ handler
1 parent e92b5ac commit 0747186

File tree

1 file changed

+78
-1
lines changed

1 file changed

+78
-1
lines changed

lib/pbio/drv/sound/sound_ev3.c

Lines changed: 78 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,93 @@
77

88
#include <stdint.h>
99

10-
void pbdrv_sound_stop() {
10+
#include <tiam1808/armv5/am1808/interrupt.h>
11+
#include <tiam1808/ehrpwm.h>
12+
#include <tiam1808/hw/soc_AM1808.h>
13+
#include <tiam1808/hw/hw_syscfg0_AM1808.h>
14+
#include <tiam1808/psc.h>
15+
16+
#include "../drv/gpio/gpio_ev3.h"
17+
18+
// Audio amplifier enable
19+
static const pbdrv_gpio_t pin_sound_en = PBDRV_GPIO_EV3_PIN(13, 3, 0, 6, 15);
20+
// Audio output pin
21+
#define SYSCFG_PINMUX3_PINMUX3_7_4_GPIO0_0 0
22+
static const pbdrv_gpio_t pin_audio = PBDRV_GPIO_EV3_PIN(3, 7, 4, 0, 0);
1123

24+
// This hardware is not capable of producing 16 bits per sample
25+
// at an acceptable sampling rate. As a trade-off, use 12 bits per sample
26+
// giving a sampling rate of 150 MHz / 2**12 ~= 36 ksps
27+
//
28+
// Unlike other audio drivers, this one runs at a fixed sample rate.
29+
// This is because the AM1808 has relatively few possible clock division ratios,
30+
// and we do not want the usable bit depth to vary as the sample rate changes.
31+
static const unsigned N_BITS_PER_SAMPLE = 12;
32+
33+
static void sound_isr() {
34+
EHRPWMETIntClear(SOC_EHRPWM_0_REGS);
35+
IntSystemStatusClear(SYS_INT_EHRPWM0);
36+
37+
// TODO: Load samples
38+
}
39+
40+
void pbdrv_sound_stop() {
41+
// Turn speaker amplifier off
42+
pbdrv_gpio_out_low(&pin_sound_en);
43+
// Clean up counter
44+
HWREGH(SOC_EHRPWM_0_REGS + EHRPWM_TBCTL) |= EHRPWM_TBCTL_CTRMODE_STOPFREEZE;
45+
EHRPWMWriteTBCount(SOC_EHRPWM_0_REGS, 0);
46+
EHRPWMETIntDisable(SOC_EHRPWM_0_REGS);
47+
EHRPWMETIntClear(SOC_EHRPWM_0_REGS);
48+
// Disable shadowing and set the count to 0
49+
EHRPWMLoadCMPB(SOC_EHRPWM_0_REGS, 0, true, 0, true);
50+
// Re-enable shadowing
51+
EHRPWMLoadCMPB(SOC_EHRPWM_0_REGS, 0, false, EHRPWM_CMPCTL_LOADBMODE_TBCTRPRD, true);
1252
}
1353

1454
void pbdrv_sound_start(const uint16_t *data, uint32_t length, uint32_t sample_rate) {
1555

1656
}
1757

1858
void pbdrv_sound_init() {
59+
// Turn on EPWM
60+
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
61+
62+
// The stop function performs various initializations
63+
pbdrv_sound_stop();
64+
65+
// Set up settings which will stay consistent throughout
66+
EHRPWMTimebaseClkConfig(SOC_EHRPWM_0_REGS, SOC_EHRPWM_0_MODULE_FREQ, SOC_EHRPWM_0_MODULE_FREQ);
67+
// Set the period to go up to max of nbits
68+
HWREGH(SOC_EHRPWM_0_REGS + EHRPWM_TBCTL) |= EHRPWM_TBCTL_PRDLD;
69+
HWREGH(SOC_EHRPWM_0_REGS + EHRPWM_TBPRD) = (1 << N_BITS_PER_SAMPLE) - 1;
70+
// Pulse goes high @ t=0
71+
// Pulse goes low @ t=CMPB
72+
EHRPWMConfigureAQActionOnB(
73+
SOC_EHRPWM_0_REGS,
74+
EHRPWM_AQCTLB_ZRO_EPWMXBHIGH,
75+
EHRPWM_AQCTLB_PRD_DONOTHING,
76+
EHRPWM_AQCTLB_CAU_DONOTHING,
77+
EHRPWM_AQCTLB_CAD_DONOTHING,
78+
EHRPWM_AQCTLB_CBU_EPWMXBLOW,
79+
EHRPWM_AQCTLB_CBD_DONOTHING,
80+
EHRPWM_AQSFRC_ACTSFB_DONOTHING
81+
);
82+
// Disable unused features
83+
EHRPWMDBOutput(SOC_EHRPWM_0_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
84+
EHRPWMChopperDisable(SOC_EHRPWM_0_REGS);
85+
EHRPWMTZTripEventDisable(SOC_EHRPWM_0_REGS, false);
86+
EHRPWMTZTripEventDisable(SOC_EHRPWM_0_REGS, true);
87+
88+
// Interrupts
89+
IntRegister(SYS_INT_EHRPWM0, sound_isr);
90+
IntChannelSet(SYS_INT_EHRPWM0, 1);
91+
IntSystemEnable(SYS_INT_EHRPWM0);
92+
EHRPWMETIntSourceSelect(SOC_EHRPWM_0_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUPRD);
93+
EHRPWMETIntPrescale(SOC_EHRPWM_0_REGS, EHRPWM_ETPS_INTPRD_FIRSTEVENT);
1994

95+
// Configure IO pin mode
96+
pbdrv_gpio_alt(&pin_audio, SYSCFG_PINMUX3_PINMUX3_7_4_EPWM0B);
2097
}
2198

2299
#endif // PBDRV_CONFIG_SOUND_EV3

0 commit comments

Comments
 (0)