summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/bfin/bf537Stamp/console/console.c
blob: 24d5c4be4d06de1f1db686f80c2d1a9c9d1d6bc6 (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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/*  Console driver for bf537Stamp
 *
 *  Copyright (c) 2008 Kallisti Labs, Los Gatos, CA, USA
 *             written by Allan Hessenflow <allanh@kallisti.com>
 *
 *  The license and distribution terms for this file may be
 *  found in the file LICENSE in this distribution or at
 *  http://www.rtems.com/license/LICENSE.
 *
 *  $Id$
 */


#include <rtems.h>
#include <rtems/libio.h>
#include <bsp.h>
#include <rtems/bspIo.h>

#include <libcpu/bf537.h>
#include <libcpu/interrupt.h>
#include <libcpu/uart.h>

/*
#undef CONSOLE_USE_INTERRUPTS
#define CONSOLE_USE_INTERRUPTS 1
*/

static bfin_uart_channel_t channels[] = {
    {"/dev/console",
     UART0_BASE_ADDRESS,
     0,
     0,
     CONSOLE_USE_INTERRUPTS,
     0,
  #ifdef CONSOLE_FORCE_BAUD
     CONSOLE_FORCE_BAUD,
  #else
     0,
  #endif
     NULL,
     0,
     0}

#if (!BFIN_ON_SKYEYE)
,
  {"/dev/tty1",
   (char *) UART1_BASE_ADDRESS,
   CONSOLE_USE_INTERRUPTS,
   0,
   NULL,
   0}
#endif
};

static bfin_uart_config_t config = {
  SCLK,
  sizeof(channels) / sizeof(channels[0]),
  channels
};

#if CONSOLE_USE_INTERRUPTS
static bfin_isr_t bfinUARTISRs[] = {
  {SIC_DMA8_UART0_RX_VECTOR, bfinUart_rxIsr, 0, 0, NULL},
  {SIC_DMA10_UART1_RX_VECTOR, bfinUart_rxIsr, 0, 0, NULL},
  {SIC_DMA9_UART0_TX_VECTOR, bfinUart_txIsr, 0, 0, NULL},
  {SIC_DMA11_UART1_TX_VECTOR, bfinUart_txIsr, 0, 0, NULL}
};
#endif


static void bf537Stamp_BSP_output_char(char c) {

  bfin_uart_poll_write(0, c);
}

static int bf537Stamp_BSP_poll_char(void) {

  return bfin_uart_poll_read(0);
}

BSP_output_char_function_type BSP_output_char = bf537Stamp_BSP_output_char;
BSP_polling_getchar_function_type BSP_poll_char = bf537Stamp_BSP_poll_char;

rtems_device_driver console_initialize(rtems_device_major_number major,
                                       rtems_device_minor_number minor,
                                       void *arg) {
  rtems_status_code status;
#if CONSOLE_USE_INTERRUPTS
  int i;
#endif

  status = bfin_uart_initialize(major, &config);
#if CONSOLE_USE_INTERRUPTS
  for (i = 0; i < sizeof(bfinUARTISRs) / sizeof(bfinUARTISRs[0]); i++) {
    bfin_interrupt_register(&bfinUARTISRs[i]);
    bfin_interrupt_enable(&bfinUARTISRs[i], TRUE);
  }
#endif

  if (status != RTEMS_SUCCESSFUL)
    rtems_fatal_error_occurred(status);

  return RTEMS_SUCCESSFUL;
}

rtems_device_driver console_open(rtems_device_major_number major,
                                 rtems_device_minor_number minor,
                                 void *arg) {

  return bfin_uart_open(major, minor, arg);
}

rtems_device_driver console_close(rtems_device_major_number major,
                                  rtems_device_minor_number minor,
                                  void *arg) {

  return rtems_termios_close(arg);
}

rtems_device_driver console_read(rtems_device_major_number major,
                                 rtems_device_minor_number minor,
                                 void *arg) {

  return rtems_termios_read(arg);
}

rtems_device_driver console_write(rtems_device_major_number major,
                                  rtems_device_minor_number minor,
                                  void *arg) {

  return rtems_termios_write(arg);
}

rtems_device_driver console_control(rtems_device_major_number major,
                                    rtems_device_minor_number minor,
                                    void *arg) {

  return rtems_termios_ioctl(arg);
}