Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
S
Software for White Rabbit PTP Core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
32
Issues
32
List
Board
Labels
Milestones
Merge Requests
7
Merge Requests
7
CI / CD
CI / CD
Pipelines
Schedules
Wiki
Wiki
image/svg+xml
Discourse
Discourse
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Projects
Software for White Rabbit PTP Core
Commits
d1bc9129
Commit
d1bc9129
authored
May 04, 2023
by
Tristan Gingold
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
dev: extract console-uart.c from console.c
parent
f9730121
Pipeline
#4500
passed with stage
in 2 minutes and 47 seconds
Changes
5
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
204 additions
and
184 deletions
+204
-184
console-uart.c
dev/console-uart.c
+189
-0
console.c
dev/console.c
+0
-171
dev.mk
dev/dev.mk
+2
-1
console-uart.h
include/dev/console-uart.h
+12
-0
console.h
include/dev/console.h
+1
-12
No files found.
dev/console-uart.c
0 → 100644
View file @
d1bc9129
/*
* This work is part of the White Rabbit project
*
* Copyright (C) 2012-2020 CERN (www.cern.ch)
*
* Released according to the GNU GPL, version 2 or any later version.
*/
#include <stdint.h>
#include <errno.h>
#include <stddef.h>
#include "util.h"
#include "pp-printf.h"
#include "board.h"
#include "dev/simple_uart.h"
#include "dev/console.h"
#include "dev/console-uart.h"
struct
console_uart_priv_data
console_uart_priv
;
struct
console_device
console_uart_dev
;
#define CON_ESCAPE_CODE 0x1b
#define CON_SWITCH_BINARY_CODE 'B'
#define CON_SWITCH_TEXT_CODE 'T'
static
int
con_rx_internal
(
struct
console_device
*
dev
)
{
struct
console_uart_priv_data
*
priv
=
(
struct
console_uart_priv_data
*
)
dev
->
priv
;
if
(
priv
->
state
==
CON_STATE_ESC_FLUSH
)
{
priv
->
state
=
CON_STATE_IDLE
;
return
priv
->
prev_char
;
}
int
rx_char
=
suart_read_byte
(
&
priv
->
uart_dev
);
if
(
rx_char
<
0
)
return
rx_char
;
if
(
priv
->
state
==
CON_STATE_IDLE
)
{
if
(
rx_char
==
CON_ESCAPE_CODE
)
{
priv
->
state
=
CON_STATE_ESC_PENDING
;
return
-
1
;
}
else
{
return
rx_char
;
}
}
else
if
(
priv
->
state
==
CON_STATE_ESC_PENDING
)
{
switch
(
rx_char
)
{
case
CON_ESCAPE_CODE
:
// double escape = actual esc
return
CON_ESCAPE_CODE
;
case
CON_SWITCH_TEXT_CODE
:
// switch to tty mode
dev
->
flags
&=
~
CONSOLE_FLAGS_MODE_BINARY
;
dev
->
flags
|=
CONSOLE_FLAGS_MODE_TTY
;
if
(
priv
->
mode_switch_hook
)
priv
->
mode_switch_hook
(
0
);
return
-
1
;
case
CON_SWITCH_BINARY_CODE
:
// switch to binary mode
dev
->
flags
&=
~
CONSOLE_FLAGS_MODE_TTY
;
dev
->
flags
|=
CONSOLE_FLAGS_MODE_BINARY
;
if
(
priv
->
mode_switch_hook
)
priv
->
mode_switch_hook
(
1
);
return
-
1
;
default:
priv
->
state
=
CON_STATE_ESC_FLUSH
;
priv
->
prev_char
=
rx_char
;
return
-
1
;
}
priv
->
state
=
CON_STATE_IDLE
;
}
return
rx_char
;
}
static
int
con_uart_put_string
(
struct
console_device
*
dev
,
const
char
*
s
)
{
struct
console_uart_priv_data
*
priv
=
(
struct
console_uart_priv_data
*
)
dev
->
priv
;
char
c
;
int
count
=
0
;
// binary mode uses different API
if
(
dev
->
flags
&
CONSOLE_FLAGS_MODE_BINARY
)
return
0
;
while
(
(
c
=
*
s
++
)
!=
0
)
{
if
(
(
dev
->
flags
&
CONSOLE_FLAGS_INSERT_CRLF
)
&&
c
==
'\n'
)
suart_write_byte
(
&
priv
->
uart_dev
,
'\r'
);
suart_write_byte
(
&
priv
->
uart_dev
,
c
);
count
++
;
}
return
count
;
}
static
int
con_uart_getc
(
struct
console_device
*
dev
)
{
if
(
dev
->
flags
&
CONSOLE_FLAGS_MODE_BINARY
)
return
0
;
return
con_rx_internal
(
dev
);
}
void
console_uart_set_crlf_mode
(
int
on
)
{
if
(
on
)
console_uart_dev
.
flags
|=
CONSOLE_FLAGS_INSERT_CRLF
;
else
console_uart_dev
.
flags
&=
~
CONSOLE_FLAGS_INSERT_CRLF
;
}
void
console_set_mode_switch_hook
(
struct
console_device
*
dev
,
void
(
*
callback
)(
int
)
)
{
struct
console_uart_priv_data
*
priv
=
(
struct
console_uart_priv_data
*
)
dev
->
priv
;
priv
->
mode_switch_hook
=
callback
;
}
void
console_uart_init
(
struct
console_device
*
dev
,
struct
console_uart_priv_data
*
priv
,
unsigned
addr
,
unsigned
baudrate
)
{
suart_init
(
&
priv
->
uart_dev
,
addr
,
baudrate
);
dev
->
flags
=
CONSOLE_FLAGS_MODE_TTY
|
CONSOLE_FLAGS_INSERT_CRLF
;
dev
->
priv
=
priv
;
dev
->
get_char
=
con_uart_getc
;
dev
->
put_string
=
con_uart_put_string
;
priv
->
prev_char
=
0
;
priv
->
state
=
CON_STATE_IDLE
;
priv
->
mode_switch_hook
=
NULL
;
console_register_device
(
dev
);
}
void
console_force_mode
(
struct
console_device
*
dev
,
int
mode
)
{
struct
console_uart_priv_data
*
priv
=
(
struct
console_uart_priv_data
*
)
dev
->
priv
;
dev
->
flags
&=
~
(
CONSOLE_FLAGS_MODE_BINARY
|
CONSOLE_FLAGS_MODE_TTY
);
dev
->
flags
|=
mode
;
priv
->
state
=
CON_STATE_IDLE
;
}
int
console_get_mode
(
struct
console_device
*
dev
)
{
return
dev
->
flags
&
(
CONSOLE_FLAGS_MODE_BINARY
|
CONSOLE_FLAGS_MODE_TTY
);
}
int
console_binary_send_byte
(
struct
console_device
*
dev
,
uint8_t
b
)
{
struct
console_uart_priv_data
*
priv
=
(
struct
console_uart_priv_data
*
)
dev
->
priv
;
if
(
dev
->
flags
&
CONSOLE_FLAGS_MODE_TTY
)
return
0
;
int
has_fifo
=
suart_is_fifo_supported
(
&
priv
->
uart_dev
);
if
(
!
has_fifo
)
return
-
ENODEV
;
suart_write_byte
(
&
priv
->
uart_dev
,
b
);
return
0
;
}
int
console_binary_recv_byte
(
struct
console_device
*
dev
)
{
struct
console_uart_priv_data
*
priv
=
(
struct
console_uart_priv_data
*
)
dev
->
priv
;
if
(
dev
->
flags
&
CONSOLE_FLAGS_MODE_TTY
)
return
-
1
;
int
has_fifo
=
suart_is_fifo_supported
(
&
priv
->
uart_dev
);
if
(
!
has_fifo
)
return
-
ENODEV
;
int
rx_byte
=
con_rx_internal
(
dev
);
return
rx_byte
;
}
dev/console.c
View file @
d1bc9129
...
...
@@ -20,106 +20,8 @@
#include "netconsole.h"
#include "lib/syslog.h"
struct
console_uart_priv_data
console_uart_priv
;
struct
console_device
console_uart_dev
;
static
struct
console_device
*
console_devs
[
BOARD_CONSOLE_DEVICES
+
HAS_NETCONSOLE
+
HAS_PUTS_SYSLOG
];
#define CON_ESCAPE_CODE 0x1b
#define CON_SWITCH_BINARY_CODE 'B'
#define CON_SWITCH_TEXT_CODE 'T'
static
int
con_rx_internal
(
struct
console_device
*
dev
)
{
struct
console_uart_priv_data
*
priv
=
(
struct
console_uart_priv_data
*
)
dev
->
priv
;
if
(
priv
->
state
==
CON_STATE_ESC_FLUSH
)
{
priv
->
state
=
CON_STATE_IDLE
;
return
priv
->
prev_char
;
}
int
rx_char
=
suart_read_byte
(
&
priv
->
uart_dev
);
if
(
rx_char
<
0
)
return
rx_char
;
if
(
priv
->
state
==
CON_STATE_IDLE
)
{
if
(
rx_char
==
CON_ESCAPE_CODE
)
{
priv
->
state
=
CON_STATE_ESC_PENDING
;
return
-
1
;
}
else
{
return
rx_char
;
}
}
else
if
(
priv
->
state
==
CON_STATE_ESC_PENDING
)
{
switch
(
rx_char
)
{
case
CON_ESCAPE_CODE
:
// double escape = actual esc
return
CON_ESCAPE_CODE
;
case
CON_SWITCH_TEXT_CODE
:
// switch to tty mode
dev
->
flags
&=
~
CONSOLE_FLAGS_MODE_BINARY
;
dev
->
flags
|=
CONSOLE_FLAGS_MODE_TTY
;
if
(
priv
->
mode_switch_hook
)
priv
->
mode_switch_hook
(
0
);
return
-
1
;
case
CON_SWITCH_BINARY_CODE
:
// switch to binary mode
dev
->
flags
&=
~
CONSOLE_FLAGS_MODE_TTY
;
dev
->
flags
|=
CONSOLE_FLAGS_MODE_BINARY
;
if
(
priv
->
mode_switch_hook
)
priv
->
mode_switch_hook
(
1
);
return
-
1
;
default:
priv
->
state
=
CON_STATE_ESC_FLUSH
;
priv
->
prev_char
=
rx_char
;
return
-
1
;
}
priv
->
state
=
CON_STATE_IDLE
;
}
return
rx_char
;
}
static
int
con_uart_put_string
(
struct
console_device
*
dev
,
const
char
*
s
)
{
struct
console_uart_priv_data
*
priv
=
(
struct
console_uart_priv_data
*
)
dev
->
priv
;
char
c
;
int
count
=
0
;
// binary mode uses different API
if
(
dev
->
flags
&
CONSOLE_FLAGS_MODE_BINARY
)
return
0
;
while
(
(
c
=
*
s
++
)
!=
0
)
{
if
(
(
dev
->
flags
&
CONSOLE_FLAGS_INSERT_CRLF
)
&&
c
==
'\n'
)
suart_write_byte
(
&
priv
->
uart_dev
,
'\r'
);
suart_write_byte
(
&
priv
->
uart_dev
,
c
);
count
++
;
}
return
count
;
}
static
int
con_uart_getc
(
struct
console_device
*
dev
)
{
if
(
dev
->
flags
&
CONSOLE_FLAGS_MODE_BINARY
)
return
0
;
return
con_rx_internal
(
dev
);
}
void
console_uart_set_crlf_mode
(
int
on
)
{
if
(
on
)
console_uart_dev
.
flags
|=
CONSOLE_FLAGS_INSERT_CRLF
;
else
console_uart_dev
.
flags
&=
~
CONSOLE_FLAGS_INSERT_CRLF
;
}
void
console_register_device
(
struct
console_device
*
dev
)
{
int
i
;
...
...
@@ -170,31 +72,6 @@ int console_getc(void)
return
-
1
;
}
void
console_set_mode_switch_hook
(
struct
console_device
*
dev
,
void
(
*
callback
)(
int
)
)
{
struct
console_uart_priv_data
*
priv
=
(
struct
console_uart_priv_data
*
)
dev
->
priv
;
priv
->
mode_switch_hook
=
callback
;
}
void
console_uart_init
(
struct
console_device
*
dev
,
struct
console_uart_priv_data
*
priv
,
unsigned
addr
,
unsigned
baudrate
)
{
suart_init
(
&
priv
->
uart_dev
,
addr
,
baudrate
);
dev
->
flags
=
CONSOLE_FLAGS_MODE_TTY
|
CONSOLE_FLAGS_INSERT_CRLF
;
dev
->
priv
=
priv
;
dev
->
get_char
=
con_uart_getc
;
dev
->
put_string
=
con_uart_put_string
;
priv
->
prev_char
=
0
;
priv
->
state
=
CON_STATE_IDLE
;
priv
->
mode_switch_hook
=
NULL
;
console_register_device
(
dev
);
}
void
console_init
(
void
)
{
console_uart_init
(
&
console_uart_dev
,
&
console_uart_priv
,
...
...
@@ -212,51 +89,3 @@ void console_init(void)
console_syslog_init
();
#endif
}
void
console_force_mode
(
struct
console_device
*
dev
,
int
mode
)
{
struct
console_uart_priv_data
*
priv
=
(
struct
console_uart_priv_data
*
)
dev
->
priv
;
dev
->
flags
&=
~
(
CONSOLE_FLAGS_MODE_BINARY
|
CONSOLE_FLAGS_MODE_TTY
);
dev
->
flags
|=
mode
;
priv
->
state
=
CON_STATE_IDLE
;
}
int
console_get_mode
(
struct
console_device
*
dev
)
{
return
dev
->
flags
&
(
CONSOLE_FLAGS_MODE_BINARY
|
CONSOLE_FLAGS_MODE_TTY
);
}
int
console_binary_send_byte
(
struct
console_device
*
dev
,
uint8_t
b
)
{
struct
console_uart_priv_data
*
priv
=
(
struct
console_uart_priv_data
*
)
dev
->
priv
;
if
(
dev
->
flags
&
CONSOLE_FLAGS_MODE_TTY
)
return
0
;
int
has_fifo
=
suart_is_fifo_supported
(
&
priv
->
uart_dev
);
if
(
!
has_fifo
)
return
-
ENODEV
;
suart_write_byte
(
&
priv
->
uart_dev
,
b
);
return
0
;
}
int
console_binary_recv_byte
(
struct
console_device
*
dev
)
{
struct
console_uart_priv_data
*
priv
=
(
struct
console_uart_priv_data
*
)
dev
->
priv
;
if
(
dev
->
flags
&
CONSOLE_FLAGS_MODE_TTY
)
return
-
1
;
int
has_fifo
=
suart_is_fifo_supported
(
&
priv
->
uart_dev
);
if
(
!
has_fifo
)
return
-
ENODEV
;
int
rx_byte
=
con_rx_internal
(
dev
);
return
rx_byte
;
}
dev/dev.mk
View file @
d1bc9129
obj-y += \
dev/simple_uart.o \
dev/console.o
dev/console.o \
dev/console-uart.o
obj-$(CONFIG_EMBEDDED_NODE) += \
dev/console-net.o \
...
...
include/dev/console-uart.h
View file @
d1bc9129
...
...
@@ -33,5 +33,17 @@ void console_uart_init(struct console_device *dev,
extern
struct
console_uart_priv_data
console_uart_priv
;
extern
struct
console_device
console_uart_dev
;
void
console_uart_set_crlf_mode
(
int
on
);
void
console_force_mode
(
struct
console_device
*
dev
,
int
mode
);
int
console_get_mode
(
struct
console_device
*
dev
);
int
console_binary_send_byte
(
struct
console_device
*
dev
,
uint8_t
b
);
int
console_binary_recv_byte
(
struct
console_device
*
dev
);
void
console_set_mode_switch_hook
(
struct
console_device
*
dev
,
void
(
*
callback
)(
int
)
);
#endif
include/dev/console.h
View file @
d1bc9129
...
...
@@ -23,22 +23,11 @@ struct console_device {
int
flags
;
};
void
console_set_device
(
struct
console_device
*
dev
);
void
console_uart_write_bytes
(
uint8_t
*
buf
,
int
count
);
void
console_uart_set_crlf_mode
(
int
on
);
void
console_init
(
void
);
int
console_getc
(
void
);
void
console_force_mode
(
struct
console_device
*
dev
,
int
mode
);
int
console_get_mode
(
struct
console_device
*
dev
);
int
console_binary_send_byte
(
struct
console_device
*
dev
,
uint8_t
b
);
int
console_binary_recv_byte
(
struct
console_device
*
dev
);
void
console_set_mode_switch_hook
(
struct
console_device
*
dev
,
void
(
*
callback
)(
int
)
);
void
console_register_device
(
struct
console_device
*
dev
);
#ifdef CONFIG_IPMI_CONSOLE
int
console_ipmi_process_request
(
struct
console_device
*
dev
,
uint8_t
*
req
,
int
size
,
uint8_t
*
rsp
,
int
rsp_size
);
void
console_ipmi_init
(
void
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment