Skip to content

Commit 822828b

Browse files
author
Joe Bakalor
authored
Merge pull request #6 from adafruit/master
Pull master
2 parents 2abccc1 + 83d1aac commit 822828b

File tree

14 files changed

+271
-3
lines changed

14 files changed

+271
-3
lines changed

.github/workflows/build.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,8 @@ jobs:
162162
- "uchip"
163163
- "ugame10"
164164
- "winterbloom_sol"
165+
- "xinabox_cc03"
166+
- "xinabox_cs11"
165167

166168
steps:
167169
- name: Set up Python 3.5

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,9 @@
102102
[submodule "ports/cxd56/spresense-exported-sdk"]
103103
path = ports/cxd56/spresense-exported-sdk
104104
url = https://github.com/sonydevworld/spresense-exported-sdk.git
105+
[submodule "frozen/Adafruit_CircuitPython_SD"]
106+
path = frozen/Adafruit_CircuitPython_SD
107+
url = https://github.com/adafruit/Adafruit_CircuitPython_SD.git
105108
[submodule "lib/mp3"]
106109
path = lib/mp3
107110
url = https://github.com/adafruit/Adafruit_MP3

frozen/Adafruit_CircuitPython_SD

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*
2+
* This file is part of the MicroPython project, http://micropython.org/
3+
*
4+
* The MIT License (MIT)
5+
*
6+
* Copyright (c) 2017 Scott Shawcroft for Adafruit Industries
7+
*
8+
* Permission is hereby granted, free of charge, to any person obtaining a copy
9+
* of this software and associated documentation files (the "Software"), to deal
10+
* in the Software without restriction, including without limitation the rights
11+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12+
* copies of the Software, and to permit persons to whom the Software is
13+
* furnished to do so, subject to the following conditions:
14+
*
15+
* The above copyright notice and this permission notice shall be included in
16+
* all copies or substantial portions of the Software.
17+
*
18+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24+
* THE SOFTWARE.
25+
*/
26+
27+
#include "boards/board.h"
28+
#include "mpconfigboard.h"
29+
#include "hal/include/hal_gpio.h"
30+
31+
void board_init(void)
32+
{
33+
}
34+
35+
bool board_requests_safe_mode(void) {
36+
return false;
37+
}
38+
39+
void reset_board(void) {
40+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#define MICROPY_HW_BOARD_NAME "XinaBox CC03"
2+
#define MICROPY_HW_MCU_NAME "samd21g18"
3+
4+
#define MICROPY_PORT_A (0)
5+
#define MICROPY_PORT_B (0)
6+
#define MICROPY_PORT_C (0)
7+
8+
#define CIRCUITPY_INTERNAL_NVM_SIZE 256
9+
10+
#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE)
11+
12+
#define DEFAULT_I2C_BUS_SCL (&pin_PA23)
13+
#define DEFAULT_I2C_BUS_SDA (&pin_PA22)
14+
15+
#define DEFAULT_SPI_BUS_SCK (&pin_PB11)
16+
#define DEFAULT_SPI_BUS_MOSI (&pin_PB10)
17+
#define DEFAULT_SPI_BUS_MISO (&pin_PA12)
18+
19+
#define DEFAULT_UART_BUS_RX (&pin_PA11)
20+
#define DEFAULT_UART_BUS_TX (&pin_PA10)
21+
22+
// USB is always used internally so skip the pin objects for it.
23+
#define IGNORE_PIN_PA24 1
24+
#define IGNORE_PIN_PA25 1
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
LD_FILE = boards/samd21x18-bootloader.ld
2+
USB_VID = 0x04D8
3+
USB_PID = 0xEC72
4+
USB_PRODUCT = "XinaBox CC03"
5+
USB_MANUFACTURER = "XinaBox"
6+
7+
CHIP_VARIANT = SAMD21G18A
8+
CHIP_FAMILY = samd21
9+
10+
INTERNAL_FLASH_FILESYSTEM = 1
11+
LONGINT_IMPL = MPZ
12+
CIRCUITPY_SMALL_BUILD = 1
13+
14+
SUPEROPT_GC = 0
15+
16+
# Make room for frozen libs.
17+
CIRCUITPY_FREQUENCYIO = 0
18+
CIRCUITPY_ANALOGIO=0
19+
CIRCUITPY_NEOPIXEL_WRITE=0
20+
CIRCUITPY_PULSEIO=0
21+
CIRCUITPY_ROTARYIO=0
22+
CIRCUITPY_TOUCHIO_USE_NATIVE=0
23+
CIRCUITPY_TOUCHIO=0
24+
25+
# Include these Python libraries in firmware.
26+
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_BusDevice
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#include "shared-bindings/board/__init__.h"
2+
3+
STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
4+
{ MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_PA11) },
5+
{ MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_PA10) },
6+
{ MP_ROM_QSTR(MP_QSTR_RED), MP_ROM_PTR(&pin_PA05) },
7+
{ MP_ROM_QSTR(MP_QSTR_GREEN), MP_ROM_PTR(&pin_PA06) },
8+
{ MP_ROM_QSTR(MP_QSTR_BLUE), MP_ROM_PTR(&pin_PA07) },
9+
{ MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_PA22) },
10+
{ MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_PA23) },
11+
{ MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) },
12+
{ MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) },
13+
{ MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }
14+
};
15+
MP_DEFINE_CONST_DICT(board_module_globals, board_global_dict_table);
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*
2+
* This file is part of the MicroPython project, http://micropython.org/
3+
*
4+
* The MIT License (MIT)
5+
*
6+
* Copyright (c) 2017 Scott Shawcroft for Adafruit Industries
7+
*
8+
* Permission is hereby granted, free of charge, to any person obtaining a copy
9+
* of this software and associated documentation files (the "Software"), to deal
10+
* in the Software without restriction, including without limitation the rights
11+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12+
* copies of the Software, and to permit persons to whom the Software is
13+
* furnished to do so, subject to the following conditions:
14+
*
15+
* The above copyright notice and this permission notice shall be included in
16+
* all copies or substantial portions of the Software.
17+
*
18+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24+
* THE SOFTWARE.
25+
*/
26+
27+
#include "boards/board.h"
28+
#include "mpconfigboard.h"
29+
#include "hal/include/hal_gpio.h"
30+
31+
void board_init(void)
32+
{
33+
}
34+
35+
bool board_requests_safe_mode(void) {
36+
return false;
37+
}
38+
39+
void reset_board(void) {
40+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#define MICROPY_HW_BOARD_NAME "XinaBox CS11"
2+
#define MICROPY_HW_MCU_NAME "samd21g18"
3+
4+
#define MICROPY_PORT_A (0)
5+
#define MICROPY_PORT_B (0)
6+
#define MICROPY_PORT_C (0)
7+
8+
#define CIRCUITPY_INTERNAL_NVM_SIZE 256
9+
10+
#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE)
11+
12+
#define DEFAULT_I2C_BUS_SCL (&pin_PA23)
13+
#define DEFAULT_I2C_BUS_SDA (&pin_PA22)
14+
15+
#define DEFAULT_SPI_BUS_SCK (&pin_PB11)
16+
#define DEFAULT_SPI_BUS_MOSI (&pin_PB10)
17+
#define DEFAULT_SPI_BUS_MISO (&pin_PA12)
18+
19+
#define DEFAULT_UART_BUS_RX (&pin_PA11)
20+
#define DEFAULT_UART_BUS_TX (&pin_PA10)
21+
22+
// USB is always used internally so skip the pin objects for it.
23+
#define IGNORE_PIN_PA24 1
24+
#define IGNORE_PIN_PA25 1
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
LD_FILE = boards/samd21x18-bootloader.ld
2+
USB_VID = 0x04D8
3+
USB_PID = 0xEC75
4+
USB_PRODUCT = "XinaBox CS11"
5+
USB_MANUFACTURER = "XinaBox"
6+
7+
CHIP_VARIANT = SAMD21G18A
8+
CHIP_FAMILY = samd21
9+
10+
INTERNAL_FLASH_FILESYSTEM = 1
11+
LONGINT_IMPL = MPZ
12+
CIRCUITPY_SMALL_BUILD = 1
13+
14+
SUPEROPT_GC = 0
15+
16+
# Make room for frozen libs.
17+
CIRCUITPY_FREQUENCYIO = 0
18+
CIRCUITPY_ANALOGIO=0
19+
CIRCUITPY_NEOPIXEL_WRITE=0
20+
CIRCUITPY_PULSEIO=0
21+
CIRCUITPY_ROTARYIO=0
22+
CIRCUITPY_TOUCHIO_USE_NATIVE=0
23+
CIRCUITPY_TOUCHIO=0
24+
CIRCUITPY_USB_MIDI=0
25+
CIRCUITPY_RTC=0
26+
27+
# Include these Python libraries in firmware.
28+
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_BusDevice
29+
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_SD
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#include "shared-bindings/board/__init__.h"
2+
3+
STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
4+
{ MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_PA11) },
5+
{ MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_PA10) },
6+
{ MP_ROM_QSTR(MP_QSTR_CS), MP_ROM_PTR(&pin_PA09) },
7+
{ MP_ROM_QSTR(MP_QSTR_ALERT), MP_ROM_PTR(&pin_PA07) },
8+
{ MP_ROM_QSTR(MP_QSTR_RED), MP_ROM_PTR(&pin_PA16) },
9+
{ MP_ROM_QSTR(MP_QSTR_GREEN), MP_ROM_PTR(&pin_PA19) },
10+
{ MP_ROM_QSTR(MP_QSTR_BLUE), MP_ROM_PTR(&pin_PA17) },
11+
{ MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_PA22) },
12+
{ MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_PA23) },
13+
{ MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_PB11) },
14+
{ MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_PB10) },
15+
{ MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_PA12) },
16+
{ MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) },
17+
{ MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) },
18+
{ MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }
19+
};
20+
MP_DEFINE_CONST_DICT(board_module_globals, board_global_dict_table);

shared-module/audiocore/__init__.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ uint8_t audiosample_channel_count(mp_obj_t sample_obj) {
5252

5353
void audiosample_reset_buffer(mp_obj_t sample_obj, bool single_channel, uint8_t audio_channel) {
5454
const audiosample_p_t *proto = mp_proto_get_or_throw(MP_QSTR_protocol_audiosample, sample_obj);
55-
proto->reset_buffer(MP_OBJ_TO_PTR(sample_obj));
55+
proto->reset_buffer(MP_OBJ_TO_PTR(sample_obj), single_channel, audio_channel);
5656
}
5757

5858
audioio_get_buffer_result_t audiosample_get_buffer(mp_obj_t sample_obj,

shared-module/audiocore/__init__.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ typedef enum {
4242
typedef uint32_t (*audiosample_sample_rate_fun)(mp_obj_t);
4343
typedef uint8_t (*audiosample_bits_per_sample_fun)(mp_obj_t);
4444
typedef uint8_t (*audiosample_channel_count_fun)(mp_obj_t);
45-
typedef void (*audiosample_reset_buffer_fun)(mp_obj_t);
45+
typedef void (*audiosample_reset_buffer_fun)(mp_obj_t,
46+
bool single_channel, uint8_t audio_channel);
4647
typedef audioio_get_buffer_result_t (*audiosample_get_buffer_fun)(mp_obj_t,
4748
bool single_channel, uint8_t channel, uint8_t** buffer,
4849
uint32_t* buffer_length);

shared-module/audiomp3/MP3File.c

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,39 @@ STATIC bool mp3file_update_inbuf(audiomp3_mp3file_obj_t* self) {
8888
#define BYTES_LEFT(self) (self->inbuf_length - self->inbuf_offset)
8989
#define CONSUME(self, n) (self->inbuf_offset += n)
9090

91+
// http://id3.org/d3v2.3.0
92+
// http://id3.org/id3v2.3.0
93+
STATIC void mp3file_skip_id3v2(audiomp3_mp3file_obj_t* self) {
94+
mp3file_update_inbuf(self);
95+
if (BYTES_LEFT(self) < 10) {
96+
return;
97+
}
98+
uint8_t *data = READ_PTR(self);
99+
if (!(
100+
data[0] == 'I' &&
101+
data[1] == 'D' &&
102+
data[2] == '3' &&
103+
data[3] != 0xff &&
104+
data[4] != 0xff &&
105+
(data[5] & 0x1f) == 0 &&
106+
(data[6] & 0x80) == 0 &&
107+
(data[7] & 0x80) == 0 &&
108+
(data[8] & 0x80) == 0 &&
109+
(data[9] & 0x80) == 0)) {
110+
return;
111+
}
112+
uint32_t size = (data[6] << 21) | (data[7] << 14) | (data[8] << 7) | (data[9]);
113+
size += 10; // size excludes the "header" (but not the "extended header")
114+
// First, deduct from size whatever is left in buffer
115+
uint32_t to_consume = MIN(size, BYTES_LEFT(self));
116+
CONSUME(self, to_consume);
117+
size -= to_consume;
118+
119+
// Next, seek in the file after the header
120+
f_lseek(&self->file->fp, f_tell(&self->file->fp) + size);
121+
return;
122+
}
123+
91124
/* If a sync word can be found, advance to it and return true. Otherwise,
92125
* return false.
93126
*/
@@ -106,7 +139,15 @@ STATIC bool mp3file_find_sync_word(audiomp3_mp3file_obj_t* self) {
106139
}
107140

108141
STATIC bool mp3file_get_next_frame_info(audiomp3_mp3file_obj_t* self, MP3FrameInfo* fi) {
109-
int err = MP3GetNextFrameInfo(self->decoder, fi, READ_PTR(self));
142+
int err;
143+
do {
144+
err = MP3GetNextFrameInfo(self->decoder, fi, READ_PTR(self));
145+
if (err == ERR_MP3_NONE) {
146+
break;
147+
}
148+
CONSUME(self, 1);
149+
mp3file_find_sync_word(self);
150+
} while (!self->eof);
110151
return err == ERR_MP3_NONE;
111152
}
112153

@@ -223,6 +264,7 @@ void audiomp3_mp3file_reset_buffer(audiomp3_mp3file_obj_t* self,
223264
self->eof = 0;
224265
self->other_channel = -1;
225266
mp3file_update_inbuf(self);
267+
mp3file_skip_id3v2(self);
226268
mp3file_find_sync_word(self);
227269
}
228270

@@ -253,6 +295,7 @@ audioio_get_buffer_result_t audiomp3_mp3file_get_buffer(audiomp3_mp3file_obj_t*
253295
self->buffer_index = !self->buffer_index;
254296
int16_t *buffer = (int16_t *)(void *)self->buffers[self->buffer_index];
255297

298+
mp3file_skip_id3v2(self);
256299
if (!mp3file_find_sync_word(self)) {
257300
return self->eof ? GET_BUFFER_DONE : GET_BUFFER_ERROR;
258301
}

0 commit comments

Comments
 (0)