LEON3: updated console driver for new AMBAPP layer

Signed-off-by: Daniel Hellstrom <daniel@gaisler.com>
This commit is contained in:
Daniel Hellstrom
2012-04-17 16:25:40 +02:00
committed by Gedare Bloom
parent 1f7cfbe351
commit ddf0d60758
7 changed files with 75 additions and 43 deletions

View File

@@ -39,8 +39,6 @@ volatile LEON3_IrqCtrl_Regs_Map *LEON3_IrqCtrl_Regs;
* amba_ahb_masters, amba_ahb_slaves and amba.
*/
extern int scan_uarts(void);
void amba_initialize(void)
{
int icsel;
@@ -95,7 +93,4 @@ void amba_initialize(void)
ambapp_freq_init(&ambapp_plb, adev,
(LEON3_Timer_Regs->scaler_reload + 1) * 1000000);
}
/* find UARTS */
scan_uarts();
}

View File

@@ -62,6 +62,12 @@ extern int apbuart_inbyte_nonblocking(ambapp_apb_uart *regs);
/* body is in debugputs.c */
struct apbuart_priv {
ambapp_apb_uart *regs;
unsigned int freq_hz;
};
static struct apbuart_priv apbuarts[BSP_NUMBER_OF_TERMIOS_PORTS];
static int uarts = 0;
/*
* Console Termios Support Entry Points
@@ -78,7 +84,7 @@ ssize_t console_write_support (int minor, const char *buf, size_t len)
port = minor - 1;
while (nwrite < len) {
apbuart_outbyte_polled((ambapp_apb_uart*)LEON3_Console_Uart[port], *buf++);
apbuart_outbyte_polled(apbuarts[port].regs, *buf++);
nwrite++;
}
return nwrite;
@@ -93,15 +99,44 @@ int console_pollRead(int minor)
else
port = minor - 1;
return apbuart_inbyte_nonblocking((ambapp_apb_uart*)LEON3_Console_Uart[port]);
return apbuart_inbyte_nonblocking(apbuarts[port].regs);
}
/* AMBA PP find routine. Extract AMBA PnP information into data structure. */
int find_matching_apbuart(struct ambapp_dev *dev, int index, void *arg)
{
struct ambapp_apb_info *apb = (struct ambapp_apb_info *)dev->devinfo;
/* Extract needed information of one APBUART */
apbuarts[uarts].regs = (ambapp_apb_uart *)apb->start;
/* Get APBUART core frequency, it is assumed that it is the same
* as Bus frequency where the UART is situated
*/
apbuarts[uarts].freq_hz = ambapp_freq_get(&ambapp_plb, dev);
uarts++;
if (uarts >= BSP_NUMBER_OF_TERMIOS_PORTS)
return 1; /* Satisfied number of UARTs, stop search */
else
return 0; /* Continue searching for more UARTs */
}
/* Find all UARTs */
int console_scan_uarts(void)
{
memset(apbuarts, 0, sizeof(apbuarts));
/* Find APBUART cores */
ambapp_for_each(&ambapp_plb, (OPTIONS_ALL|OPTIONS_APB_SLVS), VENDOR_GAISLER,
GAISLER_APBUART, find_matching_apbuart, NULL);
return uarts;
}
/*
* Console Device Driver Entry Points
*
*/
int uarts = 0;
volatile LEON3_UART_Regs_Map *LEON3_Console_Uart[LEON3_APBUARTS];
rtems_device_driver console_initialize(
rtems_device_major_number major,
@@ -115,6 +150,9 @@ rtems_device_driver console_initialize(
rtems_termios_initialize();
/* Find UARTs */
console_scan_uarts();
/* Update syscon_uart_index to index used as /dev/console
* Let user select System console by setting syscon_uart_index. If the
* BSP is to provide the default UART (syscon_uart_index==0):
@@ -190,9 +228,8 @@ rtems_device_driver console_open(
port = minor - 1;
/* Initialize UART on opening */
LEON3_Console_Uart[port]->ctrl |= LEON_REG_UART_CTRL_RE |
LEON_REG_UART_CTRL_TE;
LEON3_Console_Uart[port]->status = 0;
apbuarts[port]->regs->ctrl |= LEON_REG_UART_CTRL_RE | LEON_REG_UART_CTRL_TE;
apbuarts[port]->regs->status = 0;
return RTEMS_SUCCESSFUL;
}

View File

@@ -23,11 +23,6 @@
#include <assert.h>
#include <stdio.h>
/*
* Number of uarts on AMBA bus
*/
extern int uarts;
static int isinit = 0;
/* Let user override which on-chip APBUART will be debug UART
@@ -40,24 +35,16 @@ static int isinit = 0;
int debug_uart_index __attribute__((weak)) = 0;
ambapp_apb_uart *dbg_uart = NULL;
/*
* Scan for UARTS in configuration
/* Initialize the BSP system debug console layer. It will scan AMBA Plu&Play
* for a debug APBUART and enable RX/TX for that UART.
*/
int scan_uarts(void)
int bsp_debug_uart_init(void)
{
int i;
amba_apb_device apbuarts[LEON3_APBUARTS];
struct ambapp_dev *adev;
struct ambapp_apb_info *apb;
if (isinit == 0) {
i = 0;
uarts = 0;
uarts = amba_find_apbslvs(
&amba_conf, VENDOR_GAISLER, GAISLER_APBUART, apbuarts, LEON3_APBUARTS);
for(i=0; i<uarts; i++) {
LEON3_Console_Uart[i] = (volatile LEON3_UART_Regs_Map *)apbuarts[i].start;
}
/* Update debug_uart_index to index used as debug console.
* Let user select Debug console by setting debug_uart_index. If the
* BSP is to provide the default UART (debug_uart_index==0):
@@ -74,16 +61,27 @@ int scan_uarts(void)
debug_uart_index = debug_uart_index - 1; /* User selected dbg-console */
}
/* initialize debug uart if present for printk */
if (debug_uart_index < uarts) {
dbg_uart = (ambapp_apb_uart *)LEON3_Console_Uart[debug_uart_index];
/* Find APBUART core for System Debug Console */
i = debug_uart_index;
adev = (void *)ambapp_for_each(&ambapp_plb, (OPTIONS_ALL|OPTIONS_APB_SLVS),
VENDOR_GAISLER, GAISLER_APBUART,
ambapp_find_by_idx, (void *)&i);
if (adev) {
/* Found a matching debug console, initialize debug uart if present
* for printk
*/
apb = (struct ambapp_apb_info *)adev->devinfo;
dbg_uart = (ambapp_apb_uart *)apb->start;
dbg_uart->ctrl |= LEON_REG_UART_CTRL_RE | LEON_REG_UART_CTRL_TE;
dbg_uart->status = 0;
}
isinit = 1;
}
return uarts;
if (dbg_uart == NULL)
return 0;
else
return 1;
}
/*

View File

@@ -25,7 +25,6 @@
#define LEON3_AHB_MASTERS 64
#define LEON3_AHB_SLAVES 64
#define LEON3_APB_SLAVES 16
#define LEON3_APBUARTS 8
#include <ambapp.h>

View File

@@ -41,6 +41,9 @@ extern "C" {
void *bsp_idle_thread( uintptr_t ignored );
#define BSP_IDLE_TASK_BODY bsp_idle_thread
/* Maximum supported APBUARTs by BSP */
#define BSP_NUMBER_OF_TERMIOS_PORTS 8
/*
* Network driver configuration
*/

View File

@@ -46,12 +46,6 @@ extern "C" {
( (_trap) >= 0x11 && \
(_trap) <= 0x1F )
typedef struct {
volatile unsigned int data;
volatile unsigned int status;
volatile unsigned int ctrl;
} LEON3_UART_Regs_Map;
typedef struct {
volatile unsigned int value;
volatile unsigned int reload;
@@ -147,7 +141,6 @@ typedef struct {
extern volatile LEON3_IrqCtrl_Regs_Map *LEON3_IrqCtrl_Regs; /* LEON3 Interrupt Controller */
extern volatile LEON3_Timer_Regs_Map *LEON3_Timer_Regs; /* LEON3 GP Timer */
extern volatile LEON3_UART_Regs_Map *LEON3_Console_Uart[LEON3_APBUARTS];
/* LEON3 CPU Index of boot CPU */
extern int LEON3_Cpu_Index;

View File

@@ -31,6 +31,7 @@ int CPU_SPARC_HAS_SNOOPING;
int LEON3_Cpu_Index = 0;
extern void amba_initialize(void);
extern void bsp_debug_uart_init(void);
/*
* set_snooping
@@ -75,6 +76,12 @@ void bsp_start( void )
*/
LEON3_Cpu_Index = (get_asr17() >> 28) & 3;
/* Find UARTs */
/* Scan AMBA Plug&Play and parse it into a RAM description (ambapp_plb),
* find GPTIMER for bus frequency, find IRQ Controller and initialize
* interrupt support
*/
amba_initialize();
/* find debug UART for printk() */
bsp_debug_uart_init();
}