Rev 2787 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2787 | Rev 4377 | ||
---|---|---|---|
Line 37... | Line 37... | ||
37 | 37 | ||
38 | #include <arch/types.h> |
38 | #include <arch/types.h> |
39 | #include <synch/waitq.h> |
39 | #include <synch/waitq.h> |
40 | #include <synch/spinlock.h> |
40 | #include <synch/spinlock.h> |
41 | 41 | ||
42 | #define CHARDEV_BUFLEN 512 |
42 | #define INDEV_BUFLEN 512 |
43 | 43 | ||
44 | struct chardev; |
44 | struct indev; |
45 | 45 | ||
46 | /* Character device operations interface. */ |
46 | /* Input character device operations interface. */ |
47 | typedef struct { |
47 | typedef struct { |
48 | /** Suspend pushing characters. */ |
- | |
49 | void (* suspend)(struct chardev *); |
- | |
50 | /** Resume pushing characters. */ |
- | |
51 | void (* resume)(struct chardev *); |
- | |
52 | /** Write character to stream. */ |
- | |
53 | void (* write)(struct chardev *, char c); |
- | |
54 | /** Read character directly from device, assume interrupts disabled. */ |
48 | /** Read character directly from device, assume interrupts disabled. */ |
55 | char (* read)(struct chardev *); |
49 | wchar_t (* poll)(struct indev *); |
56 | } chardev_operations_t; |
50 | } indev_operations_t; |
57 | 51 | ||
58 | /** Character input device. */ |
52 | /** Character input device. */ |
59 | typedef struct chardev { |
53 | typedef struct indev { |
60 | char *name; |
54 | char *name; |
61 | - | ||
62 | waitq_t wq; |
55 | waitq_t wq; |
- | 56 | ||
63 | /** Protects everything below. */ |
57 | /** Protects everything below. */ |
64 | SPINLOCK_DECLARE(lock); |
58 | SPINLOCK_DECLARE(lock); |
65 | uint8_t buffer[CHARDEV_BUFLEN]; |
59 | wchar_t buffer[INDEV_BUFLEN]; |
66 | count_t counter; |
60 | count_t counter; |
- | 61 | ||
67 | /** Implementation of chardev operations. */ |
62 | /** Implementation of indev operations. */ |
68 | chardev_operations_t *op; |
63 | indev_operations_t *op; |
69 | index_t index; |
64 | index_t index; |
70 | void *data; |
65 | void *data; |
- | 66 | } indev_t; |
|
- | 67 | ||
- | 68 | ||
- | 69 | struct outdev; |
|
- | 70 | ||
- | 71 | /* Output character device operations interface. */ |
|
- | 72 | typedef struct { |
|
- | 73 | /** Write character to output. */ |
|
- | 74 | void (* write)(struct outdev *, wchar_t, bool); |
|
- | 75 | } outdev_operations_t; |
|
- | 76 | ||
- | 77 | /** Character input device. */ |
|
- | 78 | typedef struct outdev { |
|
- | 79 | char *name; |
|
- | 80 | ||
- | 81 | /** Protects everything below. */ |
|
- | 82 | SPINLOCK_DECLARE(lock); |
|
- | 83 | ||
- | 84 | /** Implementation of outdev operations. */ |
|
- | 85 | outdev_operations_t *op; |
|
- | 86 | void *data; |
|
71 | } chardev_t; |
87 | } outdev_t; |
- | 88 | ||
- | 89 | extern void indev_initialize(char *name, indev_t *indev, |
|
- | 90 | indev_operations_t *op); |
|
- | 91 | extern void indev_push_character(indev_t *indev, wchar_t ch); |
|
- | 92 | extern wchar_t indev_pop_character(indev_t *indev); |
|
- | 93 | ||
- | 94 | extern void outdev_initialize(char *name, outdev_t *outdev, |
|
- | 95 | outdev_operations_t *op); |
|
72 | 96 | ||
73 | extern void chardev_initialize(char *name, chardev_t *chardev, |
97 | extern bool check_poll(indev_t *indev); |
74 | chardev_operations_t *op); |
- | |
75 | extern void chardev_push_character(chardev_t *chardev, uint8_t ch); |
- | |
76 | 98 | ||
77 | #endif /* KERN_CHARDEV_H_ */ |
99 | #endif /* KERN_CHARDEV_H_ */ |
78 | 100 | ||
79 | /** @} |
101 | /** @} |
80 | */ |
102 | */ |