16#define HWREG32(addr) (*((volatile uint32_t *)(addr)))
22#define MULT_BASE_ADDR 0x00000500
26#define MULT_INFO_OFFSET 0x0000
30#define MUL1_OFFSET 0x0004
34#define MUL2_OFFSET 0x0008
38#define RESH_OFFSET 0x000C
42#define RESL_OFFSET 0x0010
47#define DIV_BASE_ADDR 0x00000600
51#define DIV_INFO_OFFSET 0x00
55#define DIV_END_OFFSET 0x04
59#define DIV_SOR_OFFSET 0x08
63#define DIV_QUO_OFFSET 0x0C
67#define DIV_REM_OFFSET 0x10
72#define SPI_BASE_ADDR 0x00000700
76#define SPI_CTRL_OFFSET 0x0000
80#define SPI_CLK_OFFSET 0x0004
84#define SPI_STATUS_OFFSET 0x0008
88#define SPI_TX_OFFSET 0x000C
92#define SPI_RX_OFFSET 0x0010
96#define SPI_CS_OFFSET 0x0014
101#define WS_BASE_ADDR 0x00000900
130uint64_t
mult_calc_64(uint32_t multiplicand, uint32_t multiplier);
139uint32_t
mult_calc(uint32_t multiplicand, uint32_t multiplier);
192void spi_cs(uint32_t active);
298int32_t
spi_write_buffer(
const uint8_t *buf, uint32_t length, uint32_t timeout_ms);
317int32_t
spi_read_buffer(uint8_t *buf, uint32_t length, uint32_t timeout_ms);
412extern char _heap_end;
422void *
malloc(uint32_t size);
438void *
realloc(
void *ptr, uint32_t size);
447void *
calloc(uint32_t nmemb, uint32_t size);
463static const uint8_t font5x7[96][5] = {
464 {0x00, 0x00, 0x00, 0x00, 0x00},
465 {0x00, 0x00, 0x5F, 0x00, 0x00},
466 {0x00, 0x07, 0x00, 0x07, 0x00},
467 {0x14, 0x7F, 0x14, 0x7F, 0x14},
468 {0x24, 0x2A, 0x7F, 0x2A, 0x12},
469 {0x23, 0x13, 0x08, 0x64, 0x62},
470 {0x36, 0x49, 0x55, 0x22, 0x50},
471 {0x00, 0x05, 0x03, 0x00, 0x00},
472 {0x00, 0x1C, 0x22, 0x41, 0x00},
473 {0x00, 0x41, 0x22, 0x1C, 0x00},
474 {0x14, 0x08, 0x3E, 0x08, 0x14},
475 {0x08, 0x08, 0x3E, 0x08, 0x08},
476 {0x00, 0x50, 0x30, 0x00, 0x00},
477 {0x08, 0x08, 0x08, 0x08, 0x08},
478 {0x00, 0x60, 0x60, 0x00, 0x00},
479 {0x20, 0x10, 0x08, 0x04, 0x02},
480 {0x3E, 0x51, 0x49, 0x45, 0x3E},
481 {0x00, 0x42, 0x7F, 0x40, 0x00},
482 {0x42, 0x61, 0x51, 0x49, 0x46},
483 {0x21, 0x41, 0x45, 0x4B, 0x31},
484 {0x18, 0x14, 0x12, 0x7F, 0x10},
485 {0x27, 0x45, 0x45, 0x45, 0x39},
486 {0x3C, 0x4A, 0x49, 0x49, 0x30},
487 {0x01, 0x71, 0x09, 0x05, 0x03},
488 {0x36, 0x49, 0x49, 0x49, 0x36},
489 {0x06, 0x49, 0x49, 0x29, 0x1E},
490 {0x00, 0x36, 0x36, 0x00, 0x00},
491 {0x00, 0x56, 0x36, 0x00, 0x00},
492 {0x08, 0x14, 0x22, 0x41, 0x00},
493 {0x14, 0x14, 0x14, 0x14, 0x14},
494 {0x00, 0x41, 0x22, 0x14, 0x08},
495 {0x02, 0x01, 0x51, 0x09, 0x06},
496 {0x32, 0x49, 0x79, 0x41, 0x3E},
497 {0x7E, 0x11, 0x11, 0x11, 0x7E},
498 {0x7F, 0x49, 0x49, 0x49, 0x36},
499 {0x3E, 0x41, 0x41, 0x41, 0x22},
500 {0x7F, 0x41, 0x41, 0x22, 0x1C},
501 {0x7F, 0x49, 0x49, 0x49, 0x41},
502 {0x7F, 0x09, 0x09, 0x09, 0x01},
503 {0x3E, 0x41, 0x49, 0x49, 0x7A},
504 {0x7F, 0x08, 0x08, 0x08, 0x7F},
505 {0x00, 0x41, 0x7F, 0x41, 0x00},
506 {0x20, 0x40, 0x41, 0x3F, 0x01},
507 {0x7F, 0x10, 0x28, 0x44, 0x00},
508 {0x7F, 0x40, 0x40, 0x40, 0x40},
509 {0x7F, 0x02, 0x0C, 0x02, 0x7F},
510 {0x7F, 0x04, 0x08, 0x10, 0x7F},
511 {0x3E, 0x41, 0x41, 0x41, 0x3E},
512 {0x7F, 0x09, 0x09, 0x09, 0x06},
513 {0x3E, 0x41, 0x51, 0x21, 0x5E},
514 {0x7F, 0x09, 0x19, 0x29, 0x46},
515 {0x46, 0x49, 0x49, 0x49, 0x31},
516 {0x01, 0x01, 0x7F, 0x01, 0x01},
517 {0x3F, 0x40, 0x40, 0x40, 0x3F},
518 {0x1F, 0x20, 0x40, 0x20, 0x1F},
519 {0x3F, 0x40, 0x38, 0x40, 0x3F},
520 {0x63, 0x14, 0x08, 0x14, 0x63},
521 {0x07, 0x08, 0x70, 0x08, 0x07},
522 {0x61, 0x51, 0x49, 0x45, 0x43},
523 {0x00, 0x7F, 0x41, 0x41, 0x00},
524 {0x02, 0x04, 0x08, 0x10, 0x20},
525 {0x00, 0x41, 0x41, 0x7F, 0x00},
526 {0x04, 0x02, 0x01, 0x02, 0x04},
527 {0x40, 0x40, 0x40, 0x40, 0x40},
528 {0x00, 0x01, 0x02, 0x04, 0x00},
529 {0x20, 0x54, 0x54, 0x54, 0x78},
530 {0x7F, 0x48, 0x44, 0x44, 0x38},
531 {0x38, 0x44, 0x44, 0x44, 0x20},
532 {0x38, 0x44, 0x44, 0x48, 0x7F},
533 {0x38, 0x54, 0x54, 0x54, 0x18},
534 {0x08, 0x7E, 0x09, 0x01, 0x02},
535 {0x0C, 0x52, 0x52, 0x52, 0x3E},
536 {0x7F, 0x08, 0x04, 0x04, 0x78},
537 {0x00, 0x44, 0x7D, 0x40, 0x00},
538 {0x20, 0x40, 0x44, 0x3D, 0x00},
539 {0x7F, 0x10, 0x28, 0x44, 0x00},
540 {0x00, 0x41, 0x7F, 0x40, 0x00},
541 {0x7C, 0x04, 0x18, 0x04, 0x78},
542 {0x7C, 0x08, 0x04, 0x04, 0x78},
543 {0x38, 0x44, 0x44, 0x44, 0x38},
544 {0x7C, 0x14, 0x14, 0x14, 0x08},
545 {0x08, 0x14, 0x14, 0x18, 0x7C},
546 {0x7C, 0x08, 0x04, 0x04, 0x08},
547 {0x48, 0x54, 0x54, 0x54, 0x20},
548 {0x04, 0x3F, 0x44, 0x40, 0x20},
549 {0x3C, 0x40, 0x40, 0x20, 0x7C},
550 {0x1C, 0x20, 0x40, 0x20, 0x1C},
551 {0x3C, 0x40, 0x30, 0x40, 0x3C},
552 {0x44, 0x28, 0x10, 0x28, 0x44},
553 {0x0C, 0x50, 0x50, 0x50, 0x3C},
554 {0x44, 0x64, 0x54, 0x4C, 0x44},
555 {0x00, 0x08, 0x36, 0x41, 0x00},
556 {0x00, 0x00, 0x7F, 0x00, 0x00},
557 {0x00, 0x41, 0x36, 0x08, 0x00},
558 {0x08, 0x04, 0x08, 0x10, 0x08},
559 {0x00, 0x06, 0x09, 0x09, 0x06}
565#define SSD1351_WIDTH 128
569#define SSD1351_HEIGHT 128
581#define STATUS_BAR_ROWS 1
585#define TOTAL_ROWS (SSD1351_HEIGHT / CHAR_HEIGHT)
589#define TERM_COLS (SSD1351_WIDTH / CHAR_WIDTH)
593#define TERM_ROWS (TOTAL_ROWS)
597#define SSD1351_SPI_TIMEOUT 10
601#define HOUSEKEEPING_MS 250
606#define COLOR_BLACK 0x0000
610#define COLOR_WHITE 0xFFFF
614#define COLOR_RED 0x07E0
618#define COLOR_GREEN 0xF800
622#define COLOR_BLUE 0x001F
626#define COLOR_YELLOW 0xFFE0
630#define COLOR_MAGENTA 0xF81F
634#define COLOR_CYAN 0x07FF
781void terminal_draw_text(uint8_t row, uint8_t col,
const char *str, uint16_t fg_color, uint16_t bg_color);
816void draw_status_bar(
const char *text, uint16_t bg_color, uint16_t fg_color);
Struktur zur Rückgabe eines Divisionsergebnisses.
Struktur zur Darstellung einer RGB-Farbe.
uint32_t spi_is_ready(void)
Prüft, ob die SPI-Schnittstelle bereit ist.
uint32_t div_calc_quotient(uint32_t dividend, uint32_t divisor)
Berechnet den Quotienten einer Division.
void spi_set_clock_offet(uint32_t offset)
Setzt den Takt-Offset der SPI-Schnittstelle.
uint32_t spi_rx_empty(void)
Prüft, ob der SPI-Empfangspuffer leer ist.
void ws2812_clear(void)
Schaltet alle WS2812B LEDs aus.
void terminal_set_bg_color(uint16_t color)
Setzt die Hintergrundfarbe des Terminals.
void terminal_native_scroll(void)
Scrollt das Terminal um eine Zeile.
void clear_terminal_row(uint8_t row)
Löscht eine bestimmte Terminalzeile.
void ssd1351_send_data(const uint8_t *data, size_t len)
Sendet einen Datenpuffer an das SSD1351 Display.
uint32_t spi_rx_full(void)
Prüft, ob der SPI-Empfangspuffer voll ist.
int32_t spi_write_byte(uint8_t data, uint32_t timeout_ms)
Sendet ein Byte über die SPI-Schnittstelle.
void ssd1351_inv(void)
Schaltet den Invertierungsmodus des Displays um.
void housekeeping(void)
Führt periodische Wartungsarbeiten am SSD1351 Display durch (z.B. Cursor-Blinken).
int32_t spi_read_byte(uint8_t *data, uint32_t timeout_ms)
Liest ein Byte von der SPI-Schnittstelle.
const uint8_t note_freq_halfbase[12]
Frequenztabelle für Noten (Halbton-Basis).
void print_error(const char *label)
Gibt ein Label als Fehlernachricht aus.
int32_t ws2812_write_all(const rgb_color_t colors[8])
Schreibt die Farben aller 8 WS2812B LEDs.
void ssd1351_init(void)
Initialisiert das SSD1351 Display.
int32_t ws2812_fill(rgb_color_t color)
Füllt alle WS2812B LEDs mit einer einheitlichen Farbe.
int32_t spi_write_buffer(const uint8_t *buf, uint32_t length, uint32_t timeout_ms)
Sendet einen Datenpuffer über SPI.
void * realloc(void *ptr, uint32_t size)
Ändert die Größe eines allokierten Speicherblocks.
void terminal_init(void)
Initialisiert das Terminal (Display) des SSD1351.
void clear_terminal(void)
Löscht das gesamte Terminal.
note_t
Aufzählung der Noten im Halbtonsystem.
int32_t spi_write_uint32(uint32_t value, uint32_t timeout_ms)
Sendet einen 32-Bit-Wert über SPI.
int32_t ws2812_set_color(uint8_t led, rgb_color_t color)
Setzt die Farbe einer WS2812B LED.
int32_t spi_wait_rx_data(uint32_t timeout_ms)
Wartet darauf, dass Daten im SPI-Empfangspuffer verfügbar sind.
void print_ok(const char *label)
Gibt ein Label als OK-Nachricht aus.
void ssd1351_set_position(uint8_t x, uint8_t y, uint8_t w, uint8_t h)
Setzt die Schreibposition und den Bereich im SSD1351 Display.
void ssd1351_send_commands(const uint8_t *buf, size_t len)
Sendet eine Folge von Befehlen an das SSD1351 Display.
void * malloc(uint32_t size)
Allokiert einen Speicherblock.
void ssd1351_fill_screen(uint16_t color)
Füllt das gesamte Display mit einer Farbe.
void spi_enable(void)
Aktiviert die SPI-Schnittstelle.
void draw_status_bar(const char *text, uint16_t bg_color, uint16_t fg_color)
Zeichnet eine Statusleiste am oberen Displayrand.
uint32_t div_calc_remainder(uint32_t dividend, uint32_t divisor)
Berechnet den Rest einer Division.
void pwm_free_note_buffer(void)
Gibt den für PWM-Noten reservierten Speicher frei.
void pwm_play_note(note_t note, uint32_t octave)
Spielt eine bestimmte Note in einer festgelegten Oktave über den PWM aus.
int32_t div_calc(uint32_t dividend, uint32_t divisor, div_result_t *result)
Führt eine Division durch und liefert Quotient und Rest.
void terminal_print_col(const char *text, uint16_t color)
Gibt einen String im Terminal mit einer bestimmten Textfarbe aus.
uint32_t mult_calc(uint32_t multiplicand, uint32_t multiplier)
Berechnet das 32-Bit-Ergebnis einer Multiplikation.
uint32_t heap_free_space(void)
Ermittelt den aktuell freien Heap-Speicher.
void spi_automatic_cs(bool active)
Aktiviert oder deaktiviert den automatischen Chipselect (CS) der SPI-Schnittstelle.
int pwm_precompute_notes(void)
Berechnet Notenparameter für den PWM-Modus.
void ssd1351_draw_pixel(uint8_t x, uint8_t y, uint16_t color)
Zeichnet einen einzelnen Pixel an einer bestimmten Position.
void print_ok_res(const char *label, int32_t value)
Gibt ein Label und einen numerischen Wert (als String) aus, farblich als OK markiert.
void terminal_print(const char *str)
Gibt einen String im Terminal aus.
void terminal_put_char(char c)
Gibt ein einzelnes Zeichen im Terminal aus und aktualisiert den Cursor.
void spi_disable(void)
Deaktiviert die SPI-Schnittstelle.
rgb_color_t ws2812_get_color(uint8_t led)
Liest die aktuell gesetzte Farbe einer WS2812B LED.
void terminal_set_text_color(uint16_t color)
Setzt die Textfarbe des Terminals.
char _heap_start
Start- und Endadressen des Heaps und Stacks (extern deklariert).
int32_t spi_read_buffer(uint8_t *buf, uint32_t length, uint32_t timeout_ms)
Liest einen Datenpuffer von der SPI-Schnittstelle.
void spi_set_clock_divider(uint32_t divider)
Konfiguriert den Taktteiler der SPI-Schnittstelle.
void ssd1351_send_command(uint8_t cmd)
Sendet einen einzelnen Befehl an das SSD1351 Display.
void terminal_draw_text_default(uint8_t row, uint8_t col, const char *str)
Zeichnet einen Text an einer bestimmten Terminalposition mit Standardfarben.
uint32_t spi_tx_full(void)
Prüft, ob der SPI-Sende-Puffer voll ist.
uint32_t spi_tx_empty(void)
Prüft, ob der SPI-Sende-Puffer leer ist.
uint32_t ssd1351_cursor_x(void)
Gibt die aktuelle X-Position des Cursors im SSD1351 Terminal zurück.
uint32_t spi_is_busy(void)
Prüft, ob die SPI-Schnittstelle beschäftigt ist.
void terminal_draw_text(uint8_t row, uint8_t col, const char *str, uint16_t fg_color, uint16_t bg_color)
Zeichnet einen Text an einer bestimmten Terminalposition mit definierten Vorder- und Hintergrundfarbe...
uint32_t spi_get_status(void)
Liest den aktuellen Status der SPI-Schnittstelle.
void ssd1351_send_command_with_data(uint8_t cmd, const uint8_t *data, size_t len)
Sendet einen Befehl mit zugehörigen Daten an das SSD1351 Display.
void * calloc(uint32_t nmemb, uint32_t size)
Allokiert einen Speicherblock für ein Array und initialisiert diesen mit 0.
void spi_cs(uint32_t active)
Setzt den SPI-Chipselect-Zustand.
void draw_char_cell(uint8_t row, uint8_t col, char c)
Zeichnet ein einzelnes Zeichen in einer Terminalzelle.
void draw_char_cell_custom(uint8_t row, uint8_t col, char c, uint16_t fg, uint16_t bg)
Zeichnet ein einzelnes Zeichen in einer Terminalzelle mit individuellen Farben.
uint64_t mult_calc_64(uint32_t multiplicand, uint32_t multiplier)
Berechnet das 64-Bit-Ergebnis einer Multiplikation.
uint32_t spi_fifo_full(void)
Prüft, ob das SPI-FIFO voll ist.
void free(void *ptr)
Gibt einen zuvor allokierten Speicherblock frei.