Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cpu/sam0_common: flashpage: clean up implementation #14502

Merged
merged 2 commits into from
Aug 10, 2020

Conversation

benpicco
Copy link
Contributor

@benpicco benpicco commented Jul 12, 2020

Contribution description

periph/flashpage.c is a thicket of #ifdefs that makes it hard to extend functionality.
To clean this up, move all commands that differ between RWWEE and normal flash page writing into helper functions and rely on common code for both without the ifdefs, by using function pointers.

No functional changes so far, but will be the basis for writing to the config section of sam0 MCUs.

Testing procedure

Run tests/periph_flashpage and tests/mtd_flashpage on

  • saml1x
  • saml2x
  • samd2x
  • samd5x

Issues/PRs references

@benpicco benpicco added Type: cleanup The issue proposes a clean-up / The PR cleans-up parts of the codebase / documentation Area: cpu Area: CPU/MCU ports labels Jul 12, 2020
@benpicco benpicco requested a review from MrKevinWeiss as a code owner July 12, 2020 21:02
@benpicco benpicco requested review from dylad and haukepetersen July 12, 2020 21:03
@benpicco benpicco added the CI: ready for build If set, CI server will compile all applications for all available boards for the labeled PR label Jul 12, 2020
@benpicco benpicco force-pushed the cpu/sam0_common/flashpage_cleanup branch from a1fb41f to 1086c14 Compare July 12, 2020 21:25
@benpicco benpicco force-pushed the cpu/sam0_common/flashpage_cleanup branch 2 times, most recently from 39d1b46 to 2aadddf Compare July 14, 2020 21:02
@aabadie
Copy link
Contributor

aabadie commented Jul 21, 2020

Tested on samr34-xpro (saml21) and it doesn't work (it gets a hardfault). It works on master.

this PR:
BUILD_IN_DOCKER=1 make BOARD=samr34-xpro -C tests/periph_flashpage/ flash test
make: Entering directory '/work/riot/RIOT/tests/periph_flashpage'
Launching build container using image "riot/riotbuild:latest".
docker run --rm --tty --user $(id -u) -v '/usr/share/zoneinfo/Europe/Paris:/etc/localtime:ro' -v '/work/riot/RIOT:/data/riotbuild/riotbase:delegated' -e 'RIOTBASE=/data/riotbuild/riotbase' -e 'CCACHE_BASEDIR=/data/riotbuild/riotbase' -e 'BUILD_DIR=/data/riotbuild/riotbase/build' -e 'RIOTPROJECT=/data/riotbuild/riotbase' -e 'RIOTCPU=/data/riotbuild/riotbase/cpu' -e 'RIOTBOARD=/data/riotbuild/riotbase/boards' -e 'RIOTMAKE=/data/riotbuild/riotbase/makefiles'      -e 'BOARD=samr34-xpro'  -w '/data/riotbuild/riotbase/tests/periph_flashpage/' 'riot/riotbuild:latest' make 'BOARD=samr34-xpro'    
Building application "tests_periph_flashpage" for "samr34-xpro" with MCU "saml21".

"make" -C /data/riotbuild/riotbase/boards/samr34-xpro
"make" -C /data/riotbuild/riotbase/core
"make" -C /data/riotbuild/riotbase/cpu/saml21
"make" -C /data/riotbuild/riotbase/cpu/cortexm_common
"make" -C /data/riotbuild/riotbase/cpu/cortexm_common/periph
"make" -C /data/riotbuild/riotbase/cpu/sam0_common
"make" -C /data/riotbuild/riotbase/cpu/sam0_common/periph
"make" -C /data/riotbuild/riotbase/cpu/saml21/periph
"make" -C /data/riotbuild/riotbase/drivers
"make" -C /data/riotbuild/riotbase/drivers/periph_common
"make" -C /data/riotbuild/riotbase/sys
"make" -C /data/riotbuild/riotbase/sys/auto_init
"make" -C /data/riotbuild/riotbase/sys/isrpipe
"make" -C /data/riotbuild/riotbase/sys/newlib_syscalls_default
"make" -C /data/riotbuild/riotbase/sys/pm_layered
"make" -C /data/riotbuild/riotbase/sys/shell
"make" -C /data/riotbuild/riotbase/sys/stdio_uart
"make" -C /data/riotbuild/riotbase/sys/test_utils/interactive_sync
"make" -C /data/riotbuild/riotbase/sys/tsrb
   text	   data	    bss	    dec	    hex	filename
  16360	    136	   2936	  19432	   4be8	/data/riotbuild/riotbase/tests/periph_flashpage/bin/samr34-xpro/tests_periph_flashpage.elf
/work/riot/RIOT/dist/tools/edbg/edbg  --target samr34 --verbose --file /work/riot/RIOT/tests/periph_flashpage/bin/samr34-xpro/tests_periph_flashpage.bin --verify || /work/riot/RIOT/dist/tools/edbg/edbg  --target samr34 --verbose --file /work/riot/RIOT/tests/periph_flashpage/bin/samr34-xpro/tests_periph_flashpage.bin --verify --program
Debugger: ATMEL EDBG CMSIS-DAP ATML3167051800004264 03.25.01B6 (S)
Clock frequency: 16.0 MHz
Target: SAM R34J18B (Rev C)
Verification.................................................................... done.


/work/riot/RIOT/dist/tools/pyterm/pyterm -p "/dev/ttyACM0" -b "115200" --no-reconnect --noprefix --no-repeat-command-on-empty-line
Twisted not available, please install it if you want to use pyterm's JSON capabilities
Connect to serial port /dev/ttyACM0
Welcome to pyterm!
Type '/exit' to exit.

> 
 
> test_last
 
>  test_last

Context before hardfault:
   r0: 0x0003ff00
   r1: 0x20000aac
   r2: 0x00000040
   r3: 0x00000000
  r12: 0x200009e1
   lr: 0x00001607
   pc: 0x00002286
  psr: 0x21000000

Misc
EXC_RET: 0xfffffffd
Attempting to reconstruct state for debugging...
In GDB:
  set $pc=0x2286
  frame 0
  bt
master:
BUILD_IN_DOCKER=1 make BOARD=samr34-xpro -C tests/periph_flashpage/ flash test
make: Entering directory '/work/riot/RIOT/tests/periph_flashpage'
Launching build container using image "riot/riotbuild:latest".
docker run --rm --tty --user $(id -u) -v '/usr/share/zoneinfo/Europe/Paris:/etc/localtime:ro' -v '/work/riot/RIOT:/data/riotbuild/riotbase:delegated' -e 'RIOTBASE=/data/riotbuild/riotbase' -e 'CCACHE_BASEDIR=/data/riotbuild/riotbase' -e 'BUILD_DIR=/data/riotbuild/riotbase/build' -e 'RIOTPROJECT=/data/riotbuild/riotbase' -e 'RIOTCPU=/data/riotbuild/riotbase/cpu' -e 'RIOTBOARD=/data/riotbuild/riotbase/boards' -e 'RIOTMAKE=/data/riotbuild/riotbase/makefiles'      -e 'BOARD=samr34-xpro'  -w '/data/riotbuild/riotbase/tests/periph_flashpage/' 'riot/riotbuild:latest' make 'BOARD=samr34-xpro'    
Building application "tests_periph_flashpage" for "samr34-xpro" with MCU "saml21".

"make" -C /data/riotbuild/riotbase/boards/samr34-xpro
"make" -C /data/riotbuild/riotbase/core
"make" -C /data/riotbuild/riotbase/cpu/saml21
"make" -C /data/riotbuild/riotbase/cpu/cortexm_common
"make" -C /data/riotbuild/riotbase/cpu/cortexm_common/periph
"make" -C /data/riotbuild/riotbase/cpu/sam0_common
"make" -C /data/riotbuild/riotbase/cpu/sam0_common/periph
"make" -C /data/riotbuild/riotbase/cpu/saml21/periph
"make" -C /data/riotbuild/riotbase/drivers
"make" -C /data/riotbuild/riotbase/drivers/periph_common
"make" -C /data/riotbuild/riotbase/sys
"make" -C /data/riotbuild/riotbase/sys/auto_init
"make" -C /data/riotbuild/riotbase/sys/isrpipe
"make" -C /data/riotbuild/riotbase/sys/newlib_syscalls_default
"make" -C /data/riotbuild/riotbase/sys/pm_layered
"make" -C /data/riotbuild/riotbase/sys/shell
"make" -C /data/riotbuild/riotbase/sys/stdio_uart
"make" -C /data/riotbuild/riotbase/sys/test_utils/interactive_sync
"make" -C /data/riotbuild/riotbase/sys/tsrb
   text	   data	    bss	    dec	    hex	filename
  16108	    136	   2936	  19180	   4aec	/data/riotbuild/riotbase/tests/periph_flashpage/bin/samr34-xpro/tests_periph_flashpage.elf
[INFO] edbg binary not found - building it from source now
CC= CFLAGS= make -C /work/riot/RIOT/dist/tools/edbg
[INFO] updating edbg /work/riot/RIOT/dist/tools/edbg/bin/.pkg-state.git-downloaded
echo 99d15460fcff723f73b16c29c8ca14bff4b33b20 > /work/riot/RIOT/dist/tools/edbg/bin/.pkg-state.git-downloaded
[INFO] patch edbg
[INFO] edbg binary successfully built!
/work/riot/RIOT/dist/tools/edbg/edbg  --target samr34 --verbose --file /work/riot/RIOT/tests/periph_flashpage/bin/samr34-xpro/tests_periph_flashpage.bin --verify || /work/riot/RIOT/dist/tools/edbg/edbg  --target samr34 --verbose --file /work/riot/RIOT/tests/periph_flashpage/bin/samr34-xpro/tests_periph_flashpage.bin --verify --program
Debugger: ATMEL EDBG CMSIS-DAP ATML3167051800004264 03.25.01B6 (S)
Clock frequency: 16.0 MHz
Target: SAM R34J18B (Rev C)
Verification...
at address 0x60 expected 0xed, read 0xe5
Error: verification failed
Debugger: ATMEL EDBG CMSIS-DAP ATML3167051800004264 03.25.01B6 (S)
Clock frequency: 16.0 MHz
Target: SAM R34J18B (Rev C)
Programming................................................................... done.
Verification................................................................... done.


/work/riot/RIOT/dist/tools/pyterm/pyterm -p "/dev/ttyACM0" -b "115200" --no-reconnect --noprefix --no-repeat-command-on-empty-line
Twisted not available, please install it if you want to use pyterm's JSON capabilities
Connect to serial port /dev/ttyACM0
Welcome to pyterm!
Type '/exit' to exit.

>  

> test_last
 
>  test_last
wrote local page buffer to last flash page
> help
 help
Command              Description
---------------------------------------
info                 Show information about pages
dump                 Dump the selected page to STDOUT
dump_local           Dump the local page buffer to STDOUT
read                 Copy the given page to the local page buffer and dump to STDOUT
write                Write the local page buffer to the given page
write_raw            Write (ASCII, max 64B) data to the given address
erase                Erase the given page buffer
edit                 Write bytes to the local page buffer
test                 Write and verify test pattern
test_last            Write and verify test pattern on last page available
test_last_raw        Write and verify raw short write on last page available
test_last_raw
read_rwwee           Copy the given page from RWWEE to the local page buffer and dump to STDOUT
write_rwwee          Write the local page buffer to the given RWWEE page
test_rwwee           Write and verify test pattern to RWWEE
test_last_rwwee      Write and verify test pattern on last RWWEE page available
test_last_rwwee_raw  Write and verify raw short write on last RWWEE page available
>  test_last_raw
wrote raw short buffer to last flash page
> help
 help
Command              Description
---------------------------------------
info                 Show information about pages
dump                 Dump the selected page to STDOUT
dump_local           Dump the local page buffer to STDOUT
read                 Copy the given page to the local page buffer and dump to STDOUT
write                Write the local page buffer to the given page
write_raw            Write (ASCII, max 64B) data to the given address
erase                Erase the given page buffer
edit                 Write bytes to the local page buffer
test                 Write and verify test pattern
test_last            Write and verify test pattern on last page available
test_last_raw        Write and verify raw short write on last page available
read_rwwee           Copy the given page from RWWEE to the local page buffer and dump to STDOUT
write_rwwee          Write the local page buffer to the given RWWEE page
test_rwwee           Write and verify test pattern to RWWEE
test_last_rwwee      Write and verify test pattern on last RWWEE page available
test_last_rwwee
test_last_rwwee_raw  Write and verify raw short write on last RWWEE page available
>  test_last_rwwee
wrote local page buffer to last RWWEE flash page
> 
make: Leaving directory '/work/riot/RIOT/tests/periph_flashpage'

Here is the output of GDB when using the debug target after the crash:

PROGRAMMER=openocd BUILD_IN_DOCKER=1 make BOARD=samr34-xpro -C tests/periph_flashpage/ debug
make: Entering directory '/work/riot/RIOT/tests/periph_flashpage'
/work/riot/RIOT/dist/tools/openocd/openocd.sh debug /work/riot/RIOT/tests/periph_flashpage/bin/samr34-xpro/tests_periph_flashpage.elf
### Starting Debugging ###
Open On-Chip Debugger 0.10.0+dev-01293-g7c88e76a-dirty (2020-07-01-21:36)
Licensed under GNU GPL v2
For bug reports, read
	http://openocd.org/doc/doxygen/bugs.html
Reading symbols from /work/riot/RIOT/tests/periph_flashpage/bin/samr34-xpro/tests_periph_flashpage.elf...
Remote debugging using :3333
hard_fault_handler (sp=0x61 <vector_cpu+32>, corrupted=1090535424, exc_return=536873384, 
    r4_to_r11_stack=0x1a6f <flashpage_write_and_verify+10>) at /data/riotbuild/riotbase/cpu/cortexm_common/vectors_cortexm.c:411
411	/data/riotbuild/riotbase/cpu/cortexm_common/vectors_cortexm.c: No such file or directory.
(gdb) set $pc=0x2286
(gdb) frame 0
#0  0x00002286 in memcpy ()
(gdb) bt
#0  0x00002286 in memcpy ()
#1  0x00001606 in _write_page (cmd_write=<optimized out>, len=64, data=0x20000aac <page_mem>, dst=0x3ff00)
    at /data/riotbuild/riotbase/cpu/sam0_common/periph/flashpage.c:120
#2  _write_row (len=<optimized out>, chunk_size=<optimized out>, cmd_write=<optimized out>, _data=<optimized out>, 
    dst=0x3ff00 '\377' <repeats 200 times>...) at /data/riotbuild/riotbase/cpu/sam0_common/periph/flashpage.c:160
#3  flashpage_write (page=page@entry=1023, data=data@entry=0x20000aac <page_mem>)
    at /data/riotbuild/riotbase/cpu/sam0_common/periph/flashpage.c:177
#4  0x00001a6e in flashpage_write_and_verify (page=page@entry=1023, data=0x20000aac <page_mem>)
    at /data/riotbuild/riotbase/drivers/periph_common/flashpage.c:60
#5  0x00001046 in cmd_test_last (argc=<optimized out>, argv=<optimized out>) at /data/riotbuild/riotbase/tests/periph_flashpage/main.c:338
#6  0x000019c8 in handle_input_line (line=<optimized out>, command_list=<optimized out>) at /data/riotbuild/riotbase/sys/shell/shell.c:311
#7  shell_run_once (shell_commands=0x73616c5f, shell_commands@entry=0x3cd0 <shell_commands>, line_buf=0x300074 "", 
    line_buf@entry=0x200009d8 <main_stack+1336> "test_last", len=1953719668, len@entry=128)
    at /data/riotbuild/riotbase/sys/shell/shell.c:479
#8  0x0000145e in shell_run_forever (len=128, line_buf=0x200009d8 <main_stack+1336> "test_last", commands=0x3cd0 <shell_commands>)
    at /data/riotbuild/riotbase/sys/include/shell.h:153
#9  shell_run (len=128, line_buf=0x200009d8 <main_stack+1336> "test_last", commands=0x3cd0 <shell_commands>)
    at /data/riotbuild/riotbase/sys/include/shell.h:153
#10 main () at /data/riotbuild/riotbase/tests/periph_flashpage/main.c:575
(gdb) 

@benpicco
Copy link
Contributor Author

Arg, just the board I don't have right now.
Just wondering, does the unaligned write patch from #14512 change anything about this?

@aabadie
Copy link
Contributor

aabadie commented Jul 21, 2020

just the board I don't have right now.

There are some samr30-xpro on iot-lab, they are very similar so maybe you can test on them ?

@aabadie
Copy link
Contributor

aabadie commented Jul 21, 2020

does the unaligned write patch from #14512 change anything about this?

Yes it changes something: it works 👍

@aabadie aabadie self-assigned this Jul 21, 2020
@dylad
Copy link
Member

dylad commented Jul 23, 2020

Tested on samr34-xpro (saml21) and it doesn't work (it gets a hardfault)

Same for SAML10. But it works with #14512.

@benpicco
Copy link
Contributor Author

Looks like memcpy is not guaranteed to always to copy whole words even if the addresses are aligned.
I backported that bit from #14512 now, only tested on same54-xpro so far - can you test on saml1x and saml2x?

@fjmolinas
Copy link
Contributor

The test now passes for me on samr34-xpro

BUILD_IN_DOCKER=1 make BOARD=samr34-xpro -C tests/periph_flashpage/ flash test
> 
test_last
 
>  test_last
wrote local page buffer to last flash page
> help
 help
Command              Description
---------------------------------------
info                 Show information about pages
dump                 Dump the selected page to STDOUT
dump_local           Dump the local page buffer to STDOUT
read                 Copy the given page to the local page buffer and dump to STDOUT
write                Write the local page buffer to the given page
write_raw            Write (ASCII, max 64B) data to the given address
erase                Erase the given page buffer
edit                 Write bytes to the local page buffer
test                 Write and verify test pattern
test_last            Write and verify test pattern on last page available
test_last_raw        Write and verify raw short write on last page availabletest_last_raw

read_rwwee           Copy the given page from RWWEE to the local page buffer and dump to STDOUT
write_rwwee          Write the local page buffer to the given RWWEE page
test_rwwee           Write and verify test pattern to RWWEE
test_last_rwwee      Write and verify test pattern on last RWWEE page available
test_last_rwwee_raw  Write and verify raw short write on last RWWEE page available
>  test_last_raw
wrote raw short buffer to last flash page
> help
 help
Command              Description
---------------------------------------
info                 Show information about pages
dump                 Dump the selected page to STDOUT
dump_local           Dump the local page buffer to STDOUT
read                 Copy the given page to the local page buffer and dump to STDOUT
write                Write the local page buffer to the given page
write_raw            Write (ASCII, max 64B) data to the given address
erase                Erase the given page buffer
edit                 Write bytes to the local page buffer
test                 Write and verify test pattern
test_last            Write and verify test pattern on last page available
test_last_raw        Write and verify raw short write on last page available
read_rwwee           Copy the given page from RWWEE to the local page buffer and dump to STDOUT
write_rwwee          Write the local page buffer to the given RWWEE page
test_rwwee           Write and verify test pattern to RWWEE
test_last_rwwee      Write and verify test pattern on last RWWEE page availabletest_last_rwwee

test_last_rwwee_raw  Write and verify raw short write on last RWWEE page available
>  test_last_rwwee
wrote local page buffer to last RWWEE flash page
> 

@benpicco
Copy link
Contributor Author

benpicco commented Aug 4, 2020

Also works on saml10-xpro

2020-08-04 11:58:14,526 # main(): This is RIOT! (Version: 2020.10-devel-22-g9bc28-cpu/sam0_common/flashpage_cleanup)
2020-08-04 11:58:14,536 # ROM flash read write test
2020-08-04 11:58:14,537 # 
2020-08-04 11:58:14,538 # Please refer to the README.md for further information
2020-08-04 11:58:14,538 # 
2020-08-04 11:58:14,539 # Flash start addr:	0x00000000
2020-08-04 11:58:14,540 # Page size:		256
2020-08-04 11:58:14,540 # Number of pages:	256
2020-08-04 11:58:14,543 # RWWEE Flash start addr:	0x00400000
2020-08-04 11:58:14,547 # RWWEE Number of pages:	8
> test_last_raw
2020-08-04 11:58:18,558 #  test_last_raw
2020-08-04 11:58:18,563 # wrote raw short buffer to last flash page
> test_last_rwwee
2020-08-04 11:58:29,221 #  test_last_rwwee
2020-08-04 11:58:29,227 # wrote local page buffer to last RWWEE flash page
test_last
2020-08-04 11:58:36,270 #  test_last
2020-08-04 11:58:36,276 # wrote local page buffer to last flash page

@fjmolinas fjmolinas added the CI: run tests If set, CI server will run tests on hardware for the labeled PR label Aug 4, 2020
@fjmolinas
Copy link
Contributor

Please squash @benpicco!

Move common code into helper functions and extract the commands
that differ between normal and RWWEE page reading / writing.
This cuts down on `#ifdef` use.
@benpicco benpicco force-pushed the cpu/sam0_common/flashpage_cleanup branch from 9bc2824 to e560042 Compare August 4, 2020 10:01
@benpicco
Copy link
Contributor Author

benpicco commented Aug 4, 2020

nrf52dk is again causing trouble

failed:
tests/periph_flashpage/nrf52dk:gnu
tests/mtd_flashpage/nrf52dk:llvm
tests/bench_thread_flags_pingpong/nrf52dk:gnu
tests/bench_mutex_pingpong/nrf52dk:gnu
tests/gnrc_ipv6_fwd_w_sub/nrf52dk:gnu
tests/xtimer_rmutex_lock_timeout/nrf52dk:gnu
tests/pthread_tls/nrf52dk:llvm
tests/test_tools/nrf52dk:llvm
tests/xtimer_reset/nrf52dk:llvm
tests/cpp11_condition_variable/nrf52dk:llvm
tests/cb_mux_bench/nrf52dk:llvm

@fjmolinas
Copy link
Contributor

Hmm.. way are there no samr21-xpro on the tests output?

@kaspar030
Copy link
Contributor

Hmm.. way are there no samr21-xpro on the tests output?

I see these tests passed:

tests/periph_flashpage/samr21-xpro:gnu
tests/periph_flashpage/samr21-xpro:llvm
tests/mtd_flashpage/samr21-xpro:llvm
tests/mtd_flashpage/samr21-xpro:gnu
tests/pkg_relic/samr21-xpro:gnu
tests/pkg_qdsa/samr21-xpro:gnu
tests/suit_manifest/samr21-xpro:gnu
tests/suit_manifest/samr21-xpro:llvm

@kaspar030
Copy link
Contributor

I see these tests passed:

those seem to either always run (relic) or to have been affected by a flashpage change. murdock caches positive results for unchanged tests or binaries...

@fjmolinas
Copy link
Contributor

Hmm.. way are there no samr21-xpro on the tests output?

I see these tests passed:

tests/periph_flashpage/samr21-xpro:gnu
tests/periph_flashpage/samr21-xpro:llvm
tests/mtd_flashpage/samr21-xpro:llvm
tests/mtd_flashpage/samr21-xpro:gnu
tests/pkg_relic/samr21-xpro:gnu
tests/pkg_qdsa/samr21-xpro:gnu
tests/suit_manifest/samr21-xpro:gnu
tests/suit_manifest/samr21-xpro:llvm

I'm sorry I didn't spot them because there where so many more nrf52dk runs, sorry for the noise. Lets re-trigger murdock without the tests, all tests using periph_flashpage passed correctly for samr21-xpro.

@fjmolinas fjmolinas added CI: ready for build If set, CI server will compile all applications for all available boards for the labeled PR and removed CI: run tests If set, CI server will run tests on hardware for the labeled PR CI: ready for build If set, CI server will compile all applications for all available boards for the labeled PR labels Aug 4, 2020
@benpicco benpicco added CI: skip compile test If set, CI server will run only non-compile jobs, but no compile jobs or their dependent jobs CI: ready for build If set, CI server will compile all applications for all available boards for the labeled PR and removed CI: ready for build If set, CI server will compile all applications for all available boards for the labeled PR labels Aug 4, 2020
@benpicco
Copy link
Contributor Author

benpicco commented Aug 4, 2020

I'd say we can also skip the compile tests, everything has been compiled already by Murdock without error.

@benpicco benpicco removed the CI: skip compile test If set, CI server will run only non-compile jobs, but no compile jobs or their dependent jobs label Aug 7, 2020
@benpicco benpicco requested a review from keestux August 7, 2020 16:39
@benpicco
Copy link
Contributor Author

benpicco commented Aug 9, 2020

Ping?

Copy link
Contributor

@fjmolinas fjmolinas left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ACK!

@fjmolinas fjmolinas merged commit 16f47fc into RIOT-OS:master Aug 10, 2020
@benpicco benpicco deleted the cpu/sam0_common/flashpage_cleanup branch August 10, 2020 07:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Area: cpu Area: CPU/MCU ports CI: ready for build If set, CI server will compile all applications for all available boards for the labeled PR Type: cleanup The issue proposes a clean-up / The PR cleans-up parts of the codebase / documentation
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants