Danke für den Hinweis!
Ich habe mir die newlib-lpc angeschaut. Für jemanden, der die newlib
noch nie verwendet hat, ist das erst einmal ein ganz schöner Brocken.
Ich habe auch einiges an Dokumentation gefunden, nur die geht meist
davon aus, dass man schon weiß, wo man hin will.
Ich habe mal die newlib-lpc angehängt. Ich habe mich am Beispiel test3.c
orientiert.
1 | /**** Device table. List of device drivers for newlib. ****/
|
2 | const struct device_table_entry *device_table[] = {
|
3 | &com1, /* stdin */
|
4 | &com1, /* stdout */
|
5 | &com1, /* stderr */
|
6 | 0 }; /* end of list */
|
Es wird ein Array (Array aus Pointern) *device_table mit 4 Einträgen vom
Typ device_table_entry erzeugt. "com1" ist in der uart0_int.c definiert.
Dort sind die einzelnen Funktionen hinterlegt. device_table_entry ist in
dev_cntrl.h hinterlegt. Soweit habe ich auch verstanden, wie die
einzelnen Codeteile zusammenhängen.
Ein paar Dinge sind mir aber noch unklar:
1. Wo klinkt sich die newlib ein? Erwartet newlib, dass es ein Array mit
dem Namen *device_table gibt?
2. Der Eintrag in die Tabelle für den uart sieht in uart0_int.c so aus:
1 | /************************** com1_int ************************************/
|
2 | /* Device table entry used to add this device. */
|
3 | const struct device_table_entry com1_int = {
|
4 | "com1", /* Device name. */
|
5 | uart0_open, /* Open method. */
|
6 | uart0_close, /* Close method. */
|
7 | uart0_read, /* Read method. */
|
8 | uart0_write, /* Write method. */
|
9 | uart0_ioctl, /* Ioctl method. */
|
10 | 0 }; /* No per-instance data. */
|
1 | static _ssize_t uart0_write (
|
2 | struct _reent *r, /* Re-entrancy structure, used to make */
|
3 | /* thread safe. */
|
4 | int file, /* File handle. Used to distinguish */
|
5 | /* multiple instances. */
|
6 | const void *ptr, /* Pointer to data to write. */
|
7 | size_t len, /* Amount of data to write. */
|
8 | SUB_DEVICE_INFO *info) /* Per instance information, only one */
|
9 | /* instance so not used. */
|
10 | {
|
11 | [...]
|
In den Kommentaren zu dieser Funktion ist als Datentyp immer von "Byte"
die Rede. Wo ist das festgelegt? Könnte als Datentyp nicht auch short
oder long von der newlib verwendet werden?
3. In diesem Beispiel wird stdin, stdout und stderr auf "com1" gelegt.
Gehen wir davon aus, ich will zusätzlich ein Device per SPI ansprechen:
1 | /**** Device table. List of device drivers for newlib. ****/
|
2 | const struct device_table_entry *device_table[] = {
|
3 | &com1, /* stdin */
|
4 | &com1, /* stdout */
|
5 | &com1, /* stderr */
|
6 | &spi1,
|
7 | 0 }; /* end of list */
|
Wie kann die Ausgabe von newlib von stdout auf spi1 umgebogen werden?
Vielen Dank,
Tilo