Changeset a7efdec in mainline
- Timestamp:
- 2009-03-12T17:49:42Z (16 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- b6f2ebc
- Parents:
- 099aa78
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/console/chardev.c
r099aa78 ra7efdec 38 38 #include <synch/spinlock.h> 39 39 40 /** Initialize character device.40 /** Initialize input character device. 41 41 * 42 * @param chardev Character device. 43 * @param op Implementation of character device operations. 42 * @param indev Input character device. 43 * @param op Implementation of input character device operations. 44 * 44 45 */ 45 void chardev_initialize(char *name, chardev_t *chardev,46 chardev_operations_t *op)46 void indev_initialize(char *name, indev_t *indev, 47 indev_operations_t *op) 47 48 { 48 chardev->name = name; 49 50 waitq_initialize(&chardev->wq); 51 spinlock_initialize(&chardev->lock, "chardev"); 52 chardev->counter = 0; 53 chardev->index = 0; 54 chardev->op = op; 49 indev->name = name; 50 waitq_initialize(&indev->wq); 51 spinlock_initialize(&indev->lock, "indev"); 52 indev->counter = 0; 53 indev->index = 0; 54 indev->op = op; 55 55 } 56 56 57 57 /** Push character read from input character device. 58 58 * 59 * @param chardev Character device. 60 * @param ch Character being pushed. 59 * @param indev Input character device. 60 * @param ch Character being pushed. 61 * 61 62 */ 62 void chardev_push_character(chardev_t *chardev, uint8_t ch)63 void indev_push_character(indev_t *indev, uint8_t ch) 63 64 { 64 spinlock_lock(&chardev->lock); 65 chardev->counter++; 66 if (chardev->counter == CHARDEV_BUFLEN - 1) { 67 /* buffer full => disable device interrupt */ 68 chardev->op->suspend(chardev); 65 ASSERT(indev); 66 67 spinlock_lock(&indev->lock); 68 if (indev->counter == INDEV_BUFLEN - 1) { 69 /* Buffer full */ 70 spinlock_unlock(&indev->lock); 71 return; 69 72 } 70 73 71 chardev->buffer[chardev->index++] = ch; 72 chardev->index = chardev->index % CHARDEV_BUFLEN; /* index modulo size of buffer */ 73 waitq_wakeup(&chardev->wq, WAKEUP_FIRST); 74 spinlock_unlock(&chardev->lock); 74 indev->counter++; 75 indev->buffer[indev->index++] = ch; 76 77 /* Index modulo size of buffer */ 78 indev->index = indev->index % INDEV_BUFLEN; 79 waitq_wakeup(&indev->wq, WAKEUP_FIRST); 80 spinlock_unlock(&indev->lock); 81 } 82 83 /** Initialize output character device. 84 * 85 * @param outdev Output character device. 86 * @param op Implementation of output character device operations. 87 * 88 */ 89 void outdev_initialize(char *name, outdev_t *outdev, 90 outdev_operations_t *op) 91 { 92 outdev->name = name; 93 spinlock_initialize(&outdev->lock, "outdev"); 94 outdev->op = op; 75 95 } 76 96
Note:
See TracChangeset
for help on using the changeset viewer.