Revision 8ba3c06b
| README.md | ||
|---|---|---|
| 46 | 46 |
|
| 47 | 47 |
1. Required Software |
| 48 | 48 |
1. Git |
| 49 |
2. Bootloader & Tools (AMiRi-BLT)
|
|
| 49 |
2. Bootloader & Tools (AMiRo-BLT)
|
|
| 50 | 50 |
3. System Kernel (ChibiOS) |
| 51 | 51 |
4. Low-Level Drivers (AMiRo-LLD) |
| 52 | 52 |
5. OpenOCD |
| 53 | 53 |
2. Recommended Software |
| 54 | 54 |
1. gtkterm and hterm |
| 55 |
2. Plantuml
|
|
| 55 |
2. PlantUML
|
|
| 56 | 56 |
3. Doxygen & Graphviz |
| 57 | 57 |
4. QtCreator IDE |
| 58 | 58 |
3. Building and Flashing |
| ... | ... | |
| 93 | 93 |
|
| 94 | 94 |
from a command line. |
| 95 | 95 |
|
| 96 |
If requried, is is possible to replace the used bootloader by adding an
|
|
| 96 |
If requried, it is possible to replace the used bootloader by adding an
|
|
| 97 | 97 |
according subfolder in the `./bootloader/` directory. Note that you will have to |
| 98 | 98 |
adapt the makefiles and scripts, and probably the operating system as well. |
| 99 | 99 |
|
| ... | ... | |
| 116 | 116 |
`./kernel/` directory and adapt the scripts and operating system source code. |
| 117 | 117 |
|
| 118 | 118 |
|
| 119 |
1.4 Low-Level Drivers |
|
| 120 |
--------------------- |
|
| 119 |
1.4 Low-Level Drivers (AMiRo-LLD)
|
|
| 120 |
---------------------------------
|
|
| 121 | 121 |
|
| 122 | 122 |
Any required low-level drivers for the AMiRo hardware are available in an |
| 123 | 123 |
additional project: AMiRo-LLD. It is included as Git subodule and can be |
| ... | ... | |
| 140 | 140 |
====================== |
| 141 | 141 |
|
| 142 | 142 |
The software tools named in this section are not essential for simply using or |
| 143 |
further development of AMiRo-BLT, but can help for both scenarios.
|
|
| 143 |
further development of AMiRo-BLT, but are useful in both scenarios.
|
|
| 144 | 144 |
|
| 145 | 145 |
|
| 146 | 146 |
2.1 gtkterm and hterm |
| ... | ... | |
| 191 | 191 |
For `hterm` you need to configure the tool analogously. With either tool the |
| 192 | 192 |
robot can be reset by toggling the RTS signal on and off again, and you can |
| 193 | 193 |
access the system shell of AMiRo-OS. |
| 194 |
If you are using an old version of AMiRo-BLT, the `/dev/ttyAMiRo` devices might |
|
| 194 |
If you are using an old version of AMiRo-BLT, the `/dev/ttyAMiRo#` devices might
|
|
| 195 | 195 |
not be available. In order to enable legacy support, replace the port value by |
| 196 | 196 |
`/dev/ttyUSB0`. |
| 197 | 197 |
|
| 198 |
Advanced users can use several connections to multiple modules simultaneously. |
|
| 199 |
Each additional programmer will be available as `/dev/ttyAMiRo<N>` (and |
|
| 200 |
`/dev/ttyUSB<N>` respectively) with `<N>` being an integer starting from 0. |
|
| 201 |
Please note: Those interfaces are ordered by the time when they have been |
|
| 202 |
detected by the operating system, so detaching a cable and plugging it in again |
|
| 203 |
may result in a different port name. |
|
| 198 |
The configurations above use the first matching port (i.e. `/dev/ttyAMiRo0`, |
|
| 199 |
`/dev/ttyUSB0` or `/dev/ttyACM0`). If you have connected multiple devices to |
|
| 200 |
your system, those will be listed with increasing numbers in their identifiers. |
|
| 201 |
Furthermore, other USB devices (also internal components) might be listed as |
|
| 202 |
such as well. In those cases you can either adapt the configuration, or specify |
|
| 203 |
the correct port manually. For gtkterm the according call on the command line |
|
| 204 |
would be: |
|
| 205 |
|
|
| 206 |
>$ gtkterm -c AMiRo -p=/dev/ttyAMiRo# |
|
| 207 |
|
|
| 208 |
where you have to replace the trailing `#` with the according integer. |
|
| 209 |
Note that those interfaces are ordered by the time when they have been detected |
|
| 210 |
by the operating system, so detaching a cable and plugging it in again may |
|
| 211 |
result in a different port name. |
|
| 204 | 212 |
|
| 205 | 213 |
|
| 206 | 214 |
2.2 PlantUML |
| ... | ... | |
| 216 | 224 |
---------------------- |
| 217 | 225 |
|
| 218 | 226 |
In order to generate the documentation from the source code, Doxygen and |
| 219 |
Graphviz are requried. It is recommended to install these tool using the |
|
| 227 |
Graphviz are requried. It is recommended to install these tools using the
|
|
| 220 | 228 |
default versions for your system. Ubuntu users should simply run |
| 221 | 229 |
|
| 222 | 230 |
>$ sudo apt-get install doxygen graphviz |
| ... | ... | |
| 260 | 268 |
operating system. All other modules are powered off after reset so that only |
| 261 | 269 |
these two offer a running bootloader, which is required for flashing. |
| 262 | 270 |
|
| 271 |
As already described for the serial connection via gtkterm or hterm, all scripts |
|
| 272 |
use the first matching port (i.e. `/dev/ttyAMiRo0`, `/dev/ttyUSB0` or |
|
| 273 |
`/dev/ttyACM0`) by default. If you need to specify a custom port, you can do so |
|
| 274 |
by passing an additional argument to the make call: |
|
| 275 |
|
|
| 276 |
>$ make flash FLASH_PORT=/dev/ttyAMiRo# |
|
| 277 |
|
|
| 278 |
where you have to replace the trailing `#` with the according integer. |
|
| 263 | 279 |
|
| 264 | 280 |
|
| 265 | 281 |
4 Developer Guides |
| ... | ... | |
| 290 | 306 |
* alldconf.h |
| 291 | 307 |
Configuration header for the AMiRo-LLD project, which is part of AMiRo-OS. |
| 292 | 308 |
There are probably only very few configurations done here, since most |
| 293 |
setting depend on the content of aosconf.h and are handled module |
|
| 309 |
settings depend on the content of aosconf.h and are handled module
|
|
| 294 | 310 |
unspecifically in the `./modules/aos_alldconf.h` file. |
| 295 | 311 |
* aosconf.h |
| 296 | 312 |
Configuration header for the AMiRo-OS project. Existing cofiguration files |
| 297 | 313 |
are well documented and name all available settings. |
| 298 | 314 |
* board.h & board.c |
| 299 |
Contains definitions of GPIO names and initialization setting of those, as |
|
| 315 |
Contains definitions of GPIO names and initialization settings of those, as
|
|
| 300 | 316 |
well as initialization functions. These configurations highly depend on the |
| 301 |
hardware setup. |
|
| 317 |
hardware setup. For further information, please refer to the ChibiOS |
|
| 318 |
documentation. ChibiOS also provides demo code for various devices. |
|
| 302 | 319 |
* chconf.h |
| 303 | 320 |
Configuration header for the ChibiOS/RT system kernel. There are probably |
| 304 | 321 |
only very few configurations done here, since most settings depend on the |
| ... | ... | |
| 337 | 354 |
be ignored since they are hints that something might be amiss and the program |
| 338 | 355 |
will not act as intended). |
| 339 | 356 |
|
| 340 |
As you will probably notice, for most modules there is an additional 'test/'
|
|
| 357 |
As you will probably notice, for most modules there is an additional `test/`
|
|
| 341 | 358 |
folder. This folder contains module specific wrapper code for tests (e.g. for |
| 342 | 359 |
hardware devices). Since tests are not essential but a more advanced feature, |
| 343 | 360 |
a separate guide describes how to write a test in section 4.5. |
| ... | ... | |
| 364 | 381 |
arbitrary number of channels. Whilst only one of those channels can be selected |
| 365 | 382 |
as input, each and all channels can be configured as output. As a result, if a |
| 366 | 383 |
hardware module features multiple I/O interfaces, according configuration of the |
| 367 |
shell stream and its channels, allows to still use only a single shell instance.
|
|
| 384 |
shell stream and its channels allows to still use only a single shell instance. |
|
| 368 | 385 |
If not disabled in the aosconf.h file, AMiRo-OS already runs a system shell in |
| 369 | 386 |
a thread with minimum priority. |
| 370 | 387 |
|
| 371 | 388 |
Depending on the configuration, several commands are registered to the system |
| 372 | 389 |
shell by default (e.g. `kernel:test`, `module:info`), which are defined in the |
| 373 |
AMiRo-OS core. In order to add additional custom command, those should be |
|
| 390 |
AMiRo-OS core. In order to add additional custom commands, those should be
|
|
| 374 | 391 |
defined in the module.h and module.c files. First you need to _declare_ the |
| 375 | 392 |
shell command - an instance of the memory structure representing a command - in |
| 376 | 393 |
the module.h file. Second, you have to _define_ that structure in the module.c |
| ... | ... | |
| 389 | 406 |
|
| 390 | 407 |
The callback function is typically defined right before the |
| 391 | 408 |
`AOS_SHELL_COMMAND()` macro is called and should be a mere wrapper, calling |
| 392 |
another function. Keep in mind, though, that thos callback are executed within
|
|
| 409 |
another function. Keep in mind, though, that those callbacks are executed within
|
|
| 393 | 410 |
the shell thread and thus inherit its (typically very low) priority and there is |
| 394 |
no way to calling a command in a non-blocking manner. |
|
| 411 |
no way to call a command in a non-blocking manner. If you want to use a shell |
|
| 412 |
command to start/stop other components in your system, those should be |
|
| 413 |
implemented in dedicated threads and the shell command callbacks have to use |
|
| 414 |
inter process communication to manage and interface those components. |
|
| 395 | 415 |
|
| 396 | 416 |
Finally, you have to register the command to a shell. This is very important and |
| 397 |
a common mistake, but naturally, a shell can only access commands, which are
|
|
| 417 |
a common mistake, but naturally a shell can only access commands, which are |
|
| 398 | 418 |
known to it. Registration is done via the `aosShellAddCommand()` function, |
| 399 | 419 |
preferably before the shell thread is started. Since test commands are the most |
| 400 | 420 |
common use case, AMiRo-OS provides the hook `MODULE_INIT_TESTS()`, which is |
| ... | ... | |
| 402 | 422 |
|
| 403 | 423 |
**Summing up, you have to** |
| 404 | 424 |
|
| 405 |
1. decllare and define a command.
|
|
| 425 |
1. declare and define a command. |
|
| 406 | 426 |
2. implement a callback function. |
| 407 | 427 |
3. register the command to a shell. |
| 408 | 428 |
|
| ... | ... | |
| 414 | 434 |
hooks to be used. First of all, you need to configure and enable the interrupt |
| 415 | 435 |
for the according GPIO. This can be done by implementing the |
| 416 | 436 |
`MODULE_INIT_INTERRUPTS()` hook in the module.h file. For information how to use |
| 417 |
this hook, please have a look at existing modules. In the end, the interrupt
|
|
| 418 |
callback functions has to emit an I/O event with the according bit in the flags
|
|
| 419 |
mask set (such as the `_gpioCallback()` function in `./core/src/aos_system.c`).
|
|
| 420 |
As result, whenever a rising or falling edge (depends on configuration) is
|
|
| 421 |
detected on that particular GPIO, the interrupt service routine is executed and
|
|
| 422 |
hence an I/O event is emitted, which can be received by any thread in the
|
|
| 423 |
system. |
|
| 437 |
this hook, please have a look at existing modules. In the end, the according
|
|
| 438 |
interrupt callback function has to emit an I/O event with the according bit in
|
|
| 439 |
the flags mask set (such as the `_gpioCallback()` function in
|
|
| 440 |
`./core/src/aos_system.c`). As result, whenever a rising or falling edge
|
|
| 441 |
(depends on configuration) is detected on that particular GPIO, the interrupt
|
|
| 442 |
service routine is executed and hence an I/O event is emitted, which can be
|
|
| 443 |
received by any thread in the system.
|
|
| 424 | 444 |
|
| 425 | 445 |
Next, you have to explicitely whitelist the event flag for the main thread, |
| 426 |
because by default it ignores all I/O events other than power down and such.
|
|
| 446 |
because it ignores all I/O events other than power down and such by default.
|
|
| 427 | 447 |
This is done via the optional `AMIROOS_CFG_MAIN_LOOP_GPIOEVENT_FLAGSMASK` macro, |
| 428 | 448 |
which should be defined in the module.h file, for example: |
| 429 | 449 |
|
| ... | ... | |
| 464 | 484 |
project AMiRo-LLD, which is included in AMiRo-OS as Git submodule at |
| 465 | 485 |
`./periphery-lld/AMiRo-LLD/` and acts similar to a static library. When adding a |
| 466 | 486 |
new low-level driver to the framework, you first have to implement it of course. |
| 467 |
For details how to do so, please following the instructions givne in the
|
|
| 487 |
For details how to do so, please follow the instructions given in the
|
|
| 468 | 488 |
`README.md` file in the AMiRo-LLD root directory. |
| 469 | 489 |
|
| 470 | 490 |
Now that the new driver is available, it can be enbled by simply including the |
| 471 |
driver's makefile script in the makefile of the module, you are working on. In
|
|
| 472 |
order to make actuale use of the driver, you have to add according memory
|
|
| 473 |
structures to the module.h and module.c files - just have a look at existing
|
|
| 474 |
modules how this is done. In some cases you will have to configure additional
|
|
| 475 |
interrupts and/or alter the configuration of a communication interface
|
|
| 476 |
(e.g. I2C). Once again, you should take a look at existing modules and search
|
|
| 477 |
the module.h for the hooks `MODULE_INIT_INTERRUPTS()`,
|
|
| 478 |
`MODULE_INIT_PERIPHERY_IF()` and `MODULE_SHUTDOWN_PERIPHERY_IF()`.
|
|
| 491 |
driver's make script in the makefile of the module, you are working on. In order
|
|
| 492 |
to make actual use of the driver, you have to add according memory structures to
|
|
| 493 |
the module.h and module.c files - just have a look at existing modules how this
|
|
| 494 |
is done. In some cases you will have to configure additional interrupts and/or
|
|
| 495 |
alter the configuration of a communication interface (e.g. I2C). Once again, you
|
|
| 496 |
should take a look at existing modules and search the module.h for the hooks
|
|
| 497 |
`MODULE_INIT_INTERRUPTS()`, `MODULE_INIT_PERIPHERY_IF()` and
|
|
| 498 |
`MODULE_SHUTDOWN_PERIPHERY_IF()`. |
|
| 479 | 499 |
|
| 480 | 500 |
Finally, you will probably want to validate your implementation via a test. How |
| 481 | 501 |
this can be done is explained in detail in the next guide. |
| ... | ... | |
| 510 | 530 |
* module_test_DEVICE1234.h |
| 511 | 531 |
* module_test_DEVICE1234.c |
| 512 | 532 |
|
| 513 |
The makefile script is not required, but recommended to achieve maintainable
|
|
| 514 |
code. This script file should add the folder to the `MODULE_INC` variable and
|
|
| 515 |
all C source files to `MODULE_CSRC`. The header and source files furthermore
|
|
| 516 |
define module specific data structures and a test function. In order to clearly
|
|
| 517 |
indicate that these files are module specific wrappers, their names should begin
|
|
| 518 |
with the `module_test_` prefix.
|
|
| 533 |
The make script is not required, but recommended to achieve maintainable code.
|
|
| 534 |
This script should add the folder to the `MODULE_INC` variable and all C source
|
|
| 535 |
files to `MODULE_CSRC`. The header and source files furthermore define module
|
|
| 536 |
specific data structures and a test function. In order to clearly indicate that
|
|
| 537 |
these files are module specific wrappers, their names should begin with the
|
|
| 538 |
`module_test_` prefix. |
|
| 519 | 539 |
|
| 520 | 540 |
In order to be able to call such test function as a command via the AMiRo-OS |
| 521 | 541 |
shell, you need to add an according shell command to the module.h and module.c |
| 522 | 542 |
files. Whereas the command itself is typically very simple, just calling the |
| 523 |
callback function defined in the `./test/DEVICE1234/module_test_DEVICE1234.h`/ |
|
| 524 |
`.c` files, you have to add the command to a shell. In order to make the command |
|
| 525 |
available in a shell so a user can run it, it has to be associated with the |
|
| 526 |
shell. AMiRo-OS provides the hook `MODULE_INIT_TESTS()` for this purpose, which |
|
| 527 |
has to be implemented in the module.h file. Once again it is recommended to have |
|
| 528 |
a look at an existing module, how to use this hook. Furthermore, there is more |
|
| 529 |
detailled guide on adding shell commands. |
|
| 543 |
callback function defined in the |
|
| 544 |
`./test/DEVICE1234/module_test_DEVICE1234.h`/`.c` files, you have to add the |
|
| 545 |
command to a shell. In order to make the command available in a shell so a user |
|
| 546 |
can run it, it has to be associated with the shell. AMiRo-OS provides the hook |
|
| 547 |
`MODULE_INIT_TESTS()` for this purpose, which has to be implemented in the |
|
| 548 |
module.h file. Once again it is recommended to have a look at an existing |
|
| 549 |
module, how to use this hook. Furthermore, there is more detailled guide on |
|
| 550 |
adding shell commands. |
|
| 530 | 551 |
|
| 531 | 552 |
**Summing up, you have to** |
| 532 | 553 |
|
Also available in: Unified diff