mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
doc/advanced-build-system-tricks: handle multiple boards
This commit is contained in:
parent
418d00d0ea
commit
4770b3c36b
@ -40,6 +40,138 @@ You can configure your own files that will be parsed by the build system main
|
||||
* Override default targets
|
||||
|
||||
|
||||
Handling multiple boards with udev-rules {#multiple-boards-udev}
|
||||
========================================
|
||||
|
||||
When developing and working with multiple boards the default `PORT` configuration
|
||||
for a particular board might not apply anymore so `PORT` will need to be specified
|
||||
whenever calling `make term/test`. This can also happen if multiple `DEBUGGERS/PROGRAMMERS`
|
||||
are present so `DEBUG_ADAPTER_ID` will also need to be passed. Keeping track of
|
||||
this will become annoying.
|
||||
|
||||
One way of handling this is to use `udev` rules to define `SYMLINKS` between the
|
||||
boards serial port (`riot/tty-<board-name>`) and the actual serial port
|
||||
(dev/ttyACM* or other). With this we can query the rest of the boards serial
|
||||
`dev` information (`DEBUG_ADAPTER_ID`, `PORT`, etc.) to always flash and open a
|
||||
terminal on the correct port.
|
||||
|
||||
Procedure:
|
||||
|
||||
- use `udevadm info /dev/ttyACM0` to query the udev database for information on
|
||||
device on port `/dev/ttyACM0`.
|
||||
|
||||
or use `udevadm info --attribute-walk --name /dev/ttyACM0` for more detailed
|
||||
output when the first level of information isn't enough
|
||||
|
||||
- create a udev rule with information of the device and one parent to create a
|
||||
matching rule in `/etc/udev/rules.d/70-riotboards.rules`.
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
# samr21-xpro
|
||||
SUBSYSTEM=="tty", SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", \
|
||||
ATTRS{idProduct}=="2111", ATTRS{manufacturer}=="Atmel Corp.", \
|
||||
ATTRS{serial}=="ATML2127031800004957", SYMLINK+="riot/tty-samr21-xpro"
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- reload rules: `udevadm control --reload-rules`
|
||||
|
||||
- Boards `PORT` are symlinked to /dev/riot/tty-`board-name`.
|
||||
|
||||
- Create a `makefile.pre` that will query the real `PORT` and the `DEBUG_ADAPTER_ID`
|
||||
from the `SYMLINK` info
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
PORT = /dev/riot/tty-$(BOARD)
|
||||
DEBUG_ADAPTER_ID = $(\
|
||||
shell udevadm info -q property $(PORT) |\
|
||||
sed -n ’/ID_SERIAL_SHORT/ {s/ID_SERIAL_SHORT=//p}’)
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- You can now add `makefile.pre` to `RIOT_MAKEFILES_GLOBAL_PRE` as an environment
|
||||
variable or on each `make` call:
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
$ RIOT_MAKEFILES_GLOBAL_PRE=/path/to/makefile.pre make -C examples/hello-world flash term
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
_note_: if set as an environment variable it would be a good idea to add a variable
|
||||
to enable/disable it, e.g:
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
ifeq (1,$(ENABLE_LOCAL_BOARDS))
|
||||
PORT = /dev/riot/tty-$(BOARD)
|
||||
DEBUG_ADAPTER_ID = $(\
|
||||
shell udevadm info -q property $(PORT) |\
|
||||
sed -n ’/ID_SERIAL_SHORT/ {s/ID_SERIAL_SHORT=//p}’)
|
||||
endif
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Handling multiple versions of the same BOARD
|
||||
-------------------------------------------
|
||||
|
||||
The above procedure works fine when handling different boards, but not
|
||||
multiple times the same board, e.g: multiple `samr21-xpro`.
|
||||
|
||||
An option for this would be to add an identifier of that board to the mapped
|
||||
`riot/tty-*`, there are multiple ways of handling this but in the end it means
|
||||
having a way to identify every copy.
|
||||
|
||||
Another way would be to map the `DEBUG_ADAPTER_ID` in the name:
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
SYMLINK+="riot/node-$attr{serial}
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
But it will require to know in advance the serial number of each board you want
|
||||
to use. Another option would be to add some kind of numbering and defining
|
||||
multiple symlinks for each board. e.g. for `samr21-xpro` number `n`:
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
# samr21-xpro
|
||||
SUBSYSTEM=="tty", SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", \
|
||||
ATTRS{idProduct}=="2111", ATTRS{manufacturer}=="Atmel Corp.", \
|
||||
ATTRS{serial}=="ATML2127031800004957", SYMLINK+="riot/tty-samr21-xpro", \
|
||||
SYMLINK+="riot/tty-samr21-xpro-n"
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Then, when flashing, the number can be specified and the parsing adapted:
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
ifneq(,$(BOARD_NUM))
|
||||
PORT = /dev/riot/tty-$(BOARD)-$(BOARD_NUM)
|
||||
else
|
||||
PORT = /dev/riot/tty-$(BOARD)
|
||||
endif
|
||||
DEBUG_ADAPTER_ID = $(\
|
||||
shell udevadm info -q property $(PORT) |\
|
||||
sed -n ’/ID_SERIAL_SHORT/ {s/ID_SERIAL_SHORT=//p}’)
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
BOARD=samr21-xpro BOARD_NUM=n make flash term
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
In the end, this would be the same as using the serial, but a simple number might
|
||||
be easier to handle.
|
||||
|
||||
Notes
|
||||
-----
|
||||
Udev only parses SUBSYSTEM and one parent. For others, we will rely on ENV
|
||||
variables defined by 60-serial.rules
|
||||
|
||||
So the current filename should be higher than 60-serial.rules
|
||||
|
||||
If for some reason re-writing the serial is needed there is a windows tool:
|
||||
https://remoteqth.com/wiki/index.php?page=How+to+set+usb+device+SerialNumber
|
||||
|
||||
Documentation:
|
||||
--------------
|
||||
* The whole documentation
|
||||
http://reactivated.net/writing_udev_rules.html#udevinfo
|
||||
* Udev manpage
|
||||
http://manpages.ubuntu.com/manpages/eoan/en/man7/udev.7.html
|
||||
|
||||
|
||||
Analyze dependency resolution {#analyze-depedency-resolution}
|
||||
=============================
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user