Enable REPL over USB.
All of the code was there except the linker was failing to clear the bss section because I added too many .zeros. The should have only been the exported globals that start with _ like _szero = .. Fixing that and turn on the usb transmit fixed everything.
This commit is contained in:
parent
386ab580cd
commit
0c4f9b878a
|
@ -7,11 +7,13 @@ M0 BLE.
|
||||||
## Building
|
## Building
|
||||||
|
|
||||||
The Makefile has the ability to build for a SAMD21x18, and by default
|
The Makefile has the ability to build for a SAMD21x18, and by default
|
||||||
includes some start-up code and also enables a UART for communication. To build:
|
includes some start-up code and also enables a UART for communication. To
|
||||||
|
build:
|
||||||
|
|
||||||
make CROSS=1
|
make CROSS=1
|
||||||
|
|
||||||
It will build for the Arduino Zero by default. You may change it by setting `BOARD`. For example:
|
It will build for the Arduino Zero by default. You may change it by setting
|
||||||
|
`BOARD`. For example:
|
||||||
|
|
||||||
make CROSS=1 BOARD=feather_m0_ble
|
make CROSS=1 BOARD=feather_m0_ble
|
||||||
|
|
||||||
|
@ -20,14 +22,17 @@ Board names are the directory names in the `boards` folder.
|
||||||
## Deploying
|
## Deploying
|
||||||
|
|
||||||
### Arduino Bootloader
|
### Arduino Bootloader
|
||||||
If your board has an existing Arduino bootloader on it then you can use bossac to flash MicroPython. After building run:
|
If your board has an existing Arduino bootloader on it then you can use bossac
|
||||||
|
to flash MicroPython. After building run:
|
||||||
|
|
||||||
tools/bossac_osx -e -w -v -b build-feather_m0_ble/firmware.bin
|
tools/bossac_osx -e -w -v -b build-feather_m0_ble/firmware.bin
|
||||||
|
|
||||||
### No Bootloader via GDB
|
### No Bootloader via GDB
|
||||||
This method works for loading MicroPython onto the Arduino Zero via the programming port rather than the native USB port.
|
This method works for loading MicroPython onto the Arduino Zero via the
|
||||||
|
programming port rather than the native USB port.
|
||||||
|
|
||||||
Note: These instructions are tested on Mac OSX and will vary for different platforms.
|
Note: These instructions are tested on Mac OSX and will vary for different
|
||||||
|
platforms.
|
||||||
|
|
||||||
openocd -f ~/Library/Arduino15/packages/arduino/hardware/samd/1.6.6/variants/arduino_zero/openocd_scripts/arduino_zero.cfg
|
openocd -f ~/Library/Arduino15/packages/arduino/hardware/samd/1.6.6/variants/arduino_zero/openocd_scripts/arduino_zero.cfg
|
||||||
|
|
||||||
|
@ -43,8 +48,10 @@ In another terminal from `micropython/atmel-samd`:
|
||||||
(gdb) continue
|
(gdb) continue
|
||||||
|
|
||||||
## Connecting
|
## Connecting
|
||||||
The current Atmel SAMD implementation only works over UART. To connect to it from OSX do something like this:
|
All boards are currently configured to work over USB rather than UART. To
|
||||||
|
connect to it from OSX do something like this:
|
||||||
|
|
||||||
screen /dev/tty.usbmodem142422 115200
|
screen /dev/tty.usbmodem142422 115200
|
||||||
|
|
||||||
You may not see a prompt immediately because it doesn't know you connected. To get one either hit enter to get `>>>` or do CTRL-B to get the full header.
|
You may not see a prompt immediately because it doesn't know you connected. To
|
||||||
|
get one either hit enter to get `>>>` or do CTRL-B to get the full header.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// LEDs
|
// LEDs
|
||||||
#define MICROPY_HW_LED1 PIN_PA17 // red
|
#define MICROPY_HW_LED1 PIN_PA17 // red
|
||||||
#define UART_REPL
|
// #define UART_REPL
|
||||||
// #define USB_REPL
|
#define USB_REPL
|
||||||
|
|
||||||
#define MICROPY_HW_BOARD_NAME "Arduino Zero"
|
#define MICROPY_HW_BOARD_NAME "Arduino Zero"
|
||||||
#define MICROPY_HW_MCU_NAME "samd21g18"
|
#define MICROPY_HW_MCU_NAME "samd21g18"
|
||||||
|
|
|
@ -40,6 +40,8 @@ SECTIONS
|
||||||
{
|
{
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
_srelocate = .; /* create a global symbol at data start; used by startup code in order to initialise the .data section in RAM */
|
_srelocate = .; /* create a global symbol at data start; used by startup code in order to initialise the .data section in RAM */
|
||||||
|
*(.ramfunc)
|
||||||
|
*(.ramfunc*)
|
||||||
*(.data) /* .data sections */
|
*(.data) /* .data sections */
|
||||||
*(.data*) /* .data* sections */
|
*(.data*) /* .data* sections */
|
||||||
|
|
||||||
|
@ -48,28 +50,18 @@ SECTIONS
|
||||||
} >RAM
|
} >RAM
|
||||||
|
|
||||||
/* Uninitialized data section */
|
/* Uninitialized data section */
|
||||||
.ramfunc :
|
.bss :
|
||||||
{
|
|
||||||
. = ALIGN(4);
|
|
||||||
_sramfunc = .; /* define a global symbol at ramfunc start; used by startup code */
|
|
||||||
*(.ramfunc)
|
|
||||||
*(.ramfunc*)
|
|
||||||
|
|
||||||
. = ALIGN(4);
|
|
||||||
_eramfunc = .; /* define a global symbol at ramfunc end; used by startup code */
|
|
||||||
} >RAM
|
|
||||||
|
|
||||||
/* Uninitialized data section */
|
|
||||||
.zero :
|
|
||||||
{
|
{
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
|
_sbss = .;
|
||||||
_szero = .; /* define a global symbol at bss start; used by startup code */
|
_szero = .; /* define a global symbol at bss start; used by startup code */
|
||||||
*(.zero)
|
*(.bss)
|
||||||
*(.zero*)
|
*(.bss*)
|
||||||
*(COMMON)
|
*(COMMON)
|
||||||
|
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
_ezero = .; /* define a global symbol at bss end; used by startup code */
|
_ezero = .; /* define a global symbol at bss end; used by startup code */
|
||||||
|
_ebss = .;
|
||||||
} >RAM
|
} >RAM
|
||||||
|
|
||||||
.ARM.attributes 0 : { *(.ARM.attributes) }
|
.ARM.attributes 0 : { *(.ARM.attributes) }
|
||||||
|
|
|
@ -28,10 +28,9 @@ SECTIONS
|
||||||
|
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
_etext = .; /* define a global symbol at end of code */
|
_etext = .; /* define a global symbol at end of code */
|
||||||
_sidata = _etext; /* This is used by the startup in order to initialize the .data secion */
|
_sidata = _etext; /* This is used by the startup in order to initialize the .data section */
|
||||||
} >FLASH
|
} >FLASH
|
||||||
|
|
||||||
|
|
||||||
/* This is the initialized data section
|
/* This is the initialized data section
|
||||||
The program executes knowing that the data is in the RAM
|
The program executes knowing that the data is in the RAM
|
||||||
but the loader puts the initial values in the FLASH (inidata).
|
but the loader puts the initial values in the FLASH (inidata).
|
||||||
|
@ -40,6 +39,8 @@ SECTIONS
|
||||||
{
|
{
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
_srelocate = .; /* create a global symbol at data start; used by startup code in order to initialise the .data section in RAM */
|
_srelocate = .; /* create a global symbol at data start; used by startup code in order to initialise the .data section in RAM */
|
||||||
|
*(.ramfunc)
|
||||||
|
*(.ramfunc*)
|
||||||
*(.data) /* .data sections */
|
*(.data) /* .data sections */
|
||||||
*(.data*) /* .data* sections */
|
*(.data*) /* .data* sections */
|
||||||
|
|
||||||
|
@ -48,28 +49,18 @@ SECTIONS
|
||||||
} >RAM
|
} >RAM
|
||||||
|
|
||||||
/* Uninitialized data section */
|
/* Uninitialized data section */
|
||||||
.ramfunc :
|
.bss :
|
||||||
{
|
|
||||||
. = ALIGN(4);
|
|
||||||
_sramfunc = .; /* define a global symbol at ramfunc start; used by startup code */
|
|
||||||
*(.ramfunc)
|
|
||||||
*(.ramfunc*)
|
|
||||||
|
|
||||||
. = ALIGN(4);
|
|
||||||
_eramfunc = .; /* define a global symbol at ramfunc end; used by startup code */
|
|
||||||
} >RAM
|
|
||||||
|
|
||||||
/* Uninitialized data section */
|
|
||||||
.zero :
|
|
||||||
{
|
{
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
|
_sbss = .;
|
||||||
_szero = .; /* define a global symbol at bss start; used by startup code */
|
_szero = .; /* define a global symbol at bss start; used by startup code */
|
||||||
*(.zero)
|
*(.bss)
|
||||||
*(.zero*)
|
*(.bss*)
|
||||||
*(COMMON)
|
*(COMMON)
|
||||||
|
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
_ezero = .; /* define a global symbol at bss end; used by startup code */
|
_ezero = .; /* define a global symbol at bss end; used by startup code */
|
||||||
|
_ebss = .;
|
||||||
} >RAM
|
} >RAM
|
||||||
|
|
||||||
.ARM.attributes 0 : { *(.ARM.attributes) }
|
.ARM.attributes 0 : { *(.ARM.attributes) }
|
||||||
|
|
|
@ -127,35 +127,22 @@ void samd21_init(void) {
|
||||||
|
|
||||||
delay_init();
|
delay_init();
|
||||||
|
|
||||||
struct port_config pin_conf;
|
// Uncomment to init PIN_PA17 for debugging.
|
||||||
port_get_config_defaults(&pin_conf);
|
// struct port_config pin_conf;
|
||||||
|
// port_get_config_defaults(&pin_conf);
|
||||||
|
//
|
||||||
|
// pin_conf.direction = PORT_PIN_DIR_OUTPUT;
|
||||||
|
// port_pin_set_config(MICROPY_HW_LED1, &pin_conf);
|
||||||
|
// port_pin_set_output_level(MICROPY_HW_LED1, false);
|
||||||
|
|
||||||
pin_conf.direction = PORT_PIN_DIR_OUTPUT;
|
|
||||||
port_pin_set_config(MICROPY_HW_LED1, &pin_conf);
|
|
||||||
port_pin_set_output_level(MICROPY_HW_LED1, false);
|
|
||||||
|
|
||||||
// Start USB stack to authorize VBus monitoring
|
|
||||||
for (int i = 0; i < 10; i++) {
|
|
||||||
port_pin_toggle_output_level(MICROPY_HW_LED1);
|
|
||||||
delay_ms(100);
|
|
||||||
}
|
|
||||||
#ifdef USB_REPL
|
#ifdef USB_REPL
|
||||||
udc_start();
|
udc_start();
|
||||||
#endif
|
#endif
|
||||||
for (int i = 0; i < 10; i++) {
|
|
||||||
port_pin_toggle_output_level(MICROPY_HW_LED1);
|
|
||||||
delay_ms(200);
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO(tannewt): Switch to proper pyb based UARTs.
|
// TODO(tannewt): Switch to proper pyb based UARTs.
|
||||||
#ifdef UART_REPL
|
#ifdef UART_REPL
|
||||||
configure_usart();
|
configure_usart();
|
||||||
#endif
|
#endif
|
||||||
for (int i = 0; i < 10; i++) {
|
|
||||||
port_pin_toggle_output_level(MICROPY_HW_LED1);
|
|
||||||
delay_ms(500);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -47,10 +47,15 @@ int mp_hal_stdin_rx_chr(void) {
|
||||||
//}
|
//}
|
||||||
|
|
||||||
void mp_hal_stdout_tx_strn(const char *str, size_t len) {
|
void mp_hal_stdout_tx_strn(const char *str, size_t len) {
|
||||||
|
#ifdef UART_REPL
|
||||||
usart_write_buffer_wait(&usart_instance, (uint8_t*) str, len);
|
usart_write_buffer_wait(&usart_instance, (uint8_t*) str, len);
|
||||||
// if (mp_cdc_enabled && udi_cdc_is_tx_ready()) {
|
#endif
|
||||||
// udi_cdc_write_buf(str, len);
|
|
||||||
// }
|
#ifdef USB_REPL
|
||||||
|
if (mp_cdc_enabled && udi_cdc_is_tx_ready()) {
|
||||||
|
udi_cdc_write_buf(str, len);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
//void mp_hal_stdout_tx_strn_cooked(const char *str, size_t len) {
|
//void mp_hal_stdout_tx_strn_cooked(const char *str, size_t len) {
|
||||||
|
|
Loading…
Reference in New Issue