Rev 2071 | Rev 2106 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2071 | Rev 2089 | ||
|---|---|---|---|
| Line 33... | Line 33... | ||
| 33 | */ |
33 | */ |
| 34 | 34 | ||
| 35 | #ifndef KERN_CHARDEV_H_ |
35 | #ifndef KERN_CHARDEV_H_ |
| 36 | #define KERN_CHARDEV_H_ |
36 | #define KERN_CHARDEV_H_ |
| 37 | 37 | ||
| 38 | #include <typedefs.h> |
- | |
| 39 | #include <arch/types.h> |
38 | #include <arch/types.h> |
| 40 | #include <synch/waitq.h> |
39 | #include <synch/waitq.h> |
| 41 | #include <synch/spinlock.h> |
40 | #include <synch/spinlock.h> |
| 42 | 41 | ||
| 43 | #define CHARDEV_BUFLEN 512 |
42 | #define CHARDEV_BUFLEN 512 |
| 44 | 43 | ||
| - | 44 | struct chardev; |
|
| - | 45 | ||
| 45 | /* Character device operations interface. */ |
46 | /* Character device operations interface. */ |
| 46 | struct chardev_operations { |
47 | typedef struct { |
| 47 | void (* suspend)(chardev_t *); /**< Suspend pushing characters. */ |
48 | void (* suspend)(struct chardev *); /**< Suspend pushing characters. */ |
| 48 | void (* resume)(chardev_t *); /**< Resume pushing characters. */ |
49 | void (* resume)(struct chardev *); /**< Resume pushing characters. */ |
| 49 | void (* write)(chardev_t *, char c); /**< Write character to stream. */ |
50 | void (* write)(struct chardev *, char c); /**< Write character to stream. */ |
| 50 | /** Read character directly from device, assume interrupts disabled */ |
51 | /** Read character directly from device, assume interrupts disabled */ |
| 51 | char (* read)(chardev_t *); |
52 | char (* read)(struct chardev *); |
| 52 | }; |
- | |
| 53 | - | ||
| 54 | typedef struct chardev_operations chardev_operations_t; |
53 | } chardev_operations_t; |
| 55 | 54 | ||
| 56 | /** Character input device. */ |
55 | /** Character input device. */ |
| 57 | struct chardev { |
56 | typedef struct chardev { |
| 58 | char *name; |
57 | char *name; |
| 59 | 58 | ||
| 60 | waitq_t wq; |
59 | waitq_t wq; |
| 61 | SPINLOCK_DECLARE(lock); /**< Protects everything below. */ |
60 | SPINLOCK_DECLARE(lock); /**< Protects everything below. */ |
| 62 | uint8_t buffer[CHARDEV_BUFLEN]; |
61 | uint8_t buffer[CHARDEV_BUFLEN]; |
| 63 | count_t counter; |
62 | count_t counter; |
| 64 | chardev_operations_t *op; /**< Implementation of chardev operations. */ |
63 | chardev_operations_t *op; /**< Implementation of chardev operations. */ |
| 65 | index_t index; |
64 | index_t index; |
| 66 | void *data; |
65 | void *data; |
| 67 | }; |
66 | } chardev_t; |
| 68 | 67 | ||
| 69 | extern void chardev_initialize(char *name, |
68 | extern void chardev_initialize(char *name, |
| 70 | chardev_t *chardev, |
69 | chardev_t *chardev, |
| 71 | chardev_operations_t *op); |
70 | chardev_operations_t *op); |
| 72 | extern void chardev_push_character(chardev_t *chardev, uint8_t ch); |
71 | extern void chardev_push_character(chardev_t *chardev, uint8_t ch); |