aboutsummaryrefslogtreecommitdiff
path: root/kernel/serial/include/serial/serial.h
blob: 49ac63c4b983037033aca639122c68d719103625 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#ifndef SERIAL_H
#define SERIAL_H

#include <stddef.h>
#include <stdio.h>

#include "collection/rbuffer.h"
#include "collection/list.h"

#define USARTS 1
#define SERIAL_BUFFER_SIZE 64

struct serial_device_t {
  volatile char __rx_buffer[SERIAL_BUFFER_SIZE];
  volatile char __tx_buffer[SERIAL_BUFFER_SIZE];

  struct rbuffer_t rx_buffer;
  struct rbuffer_t tx_buffer;

  struct list_head rx_q;
  struct list_head tx_q;
};

#define SERIAL_DEVICE_INIT(name) \
  { \
    .rx_buffer = RBUFFER_ARRAY_INIT(name.__rx_buffer, SERIAL_BUFFER_SIZE), \
    .tx_buffer = RBUFFER_ARRAY_INIT(name.__tx_buffer, SERIAL_BUFFER_SIZE), \
    .rx_q = LIST_HEAD_INIT(name.rx_q), \
    .tx_q = LIST_HEAD_INIT(name.tx_q) \
  }

void serial_init(unsigned long baud);

size_t serial_read(char* const data, size_t size);

size_t serial_write(const char* const data, size_t size);

inline void serial_write_str(const char* const str) {
  size_t length = 0;
  for (length = 0; str[length] != 0; ++length){}
  serial_write(str, length);
}

int serial_getc();

int serial_putc(char c);

extern FILE serial_in;
extern FILE serial_out;

#endif