source: rtems/c/src/lib/libbsp/lm32/shared/milkymist_ir/ir.c @ 9c91520

5
Last change on this file since 9c91520 was 9c91520, checked in by Chris Johns <chrisj@…>, on 01/04/18 at 07:41:45

bsps/lm32: Use public include path

Update #3254.

  • Property mode set to 100644
File size: 2.1 KB
Line 
1/*  ir.c
2 *
3 *  Milkymist RC5 IR driver for RTEMS
4 *
5 *  The license and distribution terms for this file may be
6 *  found in the file LICENSE in this distribution or at
7 *  http://www.rtems.org/license/LICENSE.
8 *
9 *  COPYRIGHT (c) 2010, 2011 Sebastien Bourdeauducq
10 */
11
12#define RTEMS_STATUS_CHECKS_USE_PRINTK
13
14#include <stdlib.h>
15#include <sys/types.h>
16#include <rtems.h>
17#include <rtems/status-checks.h>
18#include <bsp.h>
19#include <bsp/irq-generic.h>
20#include <rtems/libio.h>
21#include "../include/system_conf.h"
22#include <bsp/milkymist_ir.h>
23
24#define DEVICE_NAME "/dev/ir"
25
26static rtems_id ir_q;
27
28static rtems_isr interrupt_handler(rtems_vector_number n)
29{
30  unsigned short int msg;
31
32  lm32_interrupt_ack(1 << MM_IRQ_IR);
33  msg = MM_READ(MM_IR_RX);
34  rtems_message_queue_send(ir_q, &msg, 2);
35}
36
37rtems_device_driver ir_initialize(
38  rtems_device_major_number major,
39  rtems_device_minor_number minor,
40  void *arg
41)
42{
43  rtems_status_code sc;
44  rtems_isr_entry dummy;
45
46  sc = rtems_io_register_name(DEVICE_NAME, major, 0);
47  RTEMS_CHECK_SC(sc, "create IR input device");
48
49 sc = rtems_message_queue_create(
50    rtems_build_name('R', 'C', '5', 'Q'),
51    64,
52    2,
53    0,
54    &ir_q
55  );
56  RTEMS_CHECK_SC(sc, "create IR queue");
57
58  rtems_interrupt_catch(interrupt_handler, MM_IRQ_IR, &dummy);
59  bsp_interrupt_vector_enable(MM_IRQ_IR);
60
61  return RTEMS_SUCCESSFUL;
62}
63
64rtems_device_driver ir_open(
65  rtems_device_major_number major,
66  rtems_device_minor_number minor,
67  void *arg
68)
69{
70  uint32_t count;
71
72  rtems_message_queue_flush(ir_q, &count);
73  return RTEMS_SUCCESSFUL;
74}
75
76rtems_device_driver ir_read(
77  rtems_device_major_number major,
78  rtems_device_minor_number minor,
79  void *arg
80)
81{
82  rtems_libio_rw_args_t *rw_args = (rtems_libio_rw_args_t *)arg;
83  rtems_status_code sc;
84
85  if (rw_args->count < 2) {
86    rw_args->bytes_moved = 0;
87    return RTEMS_UNSATISFIED;
88  }
89
90  sc = rtems_message_queue_receive(
91    ir_q,
92    rw_args->buffer,
93    (size_t *)&rw_args->bytes_moved,
94    RTEMS_WAIT,
95    RTEMS_NO_TIMEOUT
96  );
97
98  if(sc == RTEMS_SUCCESSFUL)
99    return RTEMS_SUCCESSFUL;
100  else {
101    rw_args->bytes_moved = 0;
102    return RTEMS_UNSATISFIED;
103  }
104}
Note: See TracBrowser for help on using the repository browser.