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. * amba_ahb_masters, amba_ahb_slaves and amba.
*/ */
extern int scan_uarts(void);
void amba_initialize(void) void amba_initialize(void)
{ {
int icsel; int icsel;
@@ -95,7 +93,4 @@ void amba_initialize(void)
ambapp_freq_init(&ambapp_plb, adev, ambapp_freq_init(&ambapp_plb, adev,
(LEON3_Timer_Regs->scaler_reload + 1) * 1000000); (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 */ /* 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 * 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; port = minor - 1;
while (nwrite < len) { while (nwrite < len) {
apbuart_outbyte_polled((ambapp_apb_uart*)LEON3_Console_Uart[port], *buf++); apbuart_outbyte_polled(apbuarts[port].regs, *buf++);
nwrite++; nwrite++;
} }
return nwrite; return nwrite;
@@ -93,15 +99,44 @@ int console_pollRead(int minor)
else else
port = minor - 1; 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 * 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_driver console_initialize(
rtems_device_major_number major, rtems_device_major_number major,
@@ -115,6 +150,9 @@ rtems_device_driver console_initialize(
rtems_termios_initialize(); rtems_termios_initialize();
/* Find UARTs */
console_scan_uarts();
/* Update syscon_uart_index to index used as /dev/console /* Update syscon_uart_index to index used as /dev/console
* Let user select System console by setting syscon_uart_index. If the * Let user select System console by setting syscon_uart_index. If the
* BSP is to provide the default UART (syscon_uart_index==0): * BSP is to provide the default UART (syscon_uart_index==0):
@@ -190,9 +228,8 @@ rtems_device_driver console_open(
port = minor - 1; port = minor - 1;
/* Initialize UART on opening */ /* Initialize UART on opening */
LEON3_Console_Uart[port]->ctrl |= LEON_REG_UART_CTRL_RE | apbuarts[port]->regs->ctrl |= LEON_REG_UART_CTRL_RE | LEON_REG_UART_CTRL_TE;
LEON_REG_UART_CTRL_TE; apbuarts[port]->regs->status = 0;
LEON3_Console_Uart[port]->status = 0;
return RTEMS_SUCCESSFUL; return RTEMS_SUCCESSFUL;
} }

View File

@@ -23,11 +23,6 @@
#include <assert.h> #include <assert.h>
#include <stdio.h> #include <stdio.h>
/*
* Number of uarts on AMBA bus
*/
extern int uarts;
static int isinit = 0; static int isinit = 0;
/* Let user override which on-chip APBUART will be debug UART /* 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; int debug_uart_index __attribute__((weak)) = 0;
ambapp_apb_uart *dbg_uart = NULL; ambapp_apb_uart *dbg_uart = NULL;
/* /* Initialize the BSP system debug console layer. It will scan AMBA Plu&Play
* Scan for UARTS in configuration * for a debug APBUART and enable RX/TX for that UART.
*/ */
int scan_uarts(void) int bsp_debug_uart_init(void)
{ {
int i; int i;
amba_apb_device apbuarts[LEON3_APBUARTS]; struct ambapp_dev *adev;
struct ambapp_apb_info *apb;
if (isinit == 0) { 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. /* Update debug_uart_index to index used as debug console.
* Let user select Debug console by setting debug_uart_index. If the * Let user select Debug console by setting debug_uart_index. If the
* BSP is to provide the default UART (debug_uart_index==0): * 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 */ debug_uart_index = debug_uart_index - 1; /* User selected dbg-console */
} }
/* initialize debug uart if present for printk */ /* Find APBUART core for System Debug Console */
if (debug_uart_index < uarts) { i = debug_uart_index;
dbg_uart = (ambapp_apb_uart *)LEON3_Console_Uart[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->ctrl |= LEON_REG_UART_CTRL_RE | LEON_REG_UART_CTRL_TE;
dbg_uart->status = 0; dbg_uart->status = 0;
} }
isinit = 1; 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_MASTERS 64
#define LEON3_AHB_SLAVES 64 #define LEON3_AHB_SLAVES 64
#define LEON3_APB_SLAVES 16 #define LEON3_APB_SLAVES 16
#define LEON3_APBUARTS 8
#include <ambapp.h> #include <ambapp.h>

View File

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

View File

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

View File

@@ -31,6 +31,7 @@ int CPU_SPARC_HAS_SNOOPING;
int LEON3_Cpu_Index = 0; int LEON3_Cpu_Index = 0;
extern void amba_initialize(void); extern void amba_initialize(void);
extern void bsp_debug_uart_init(void);
/* /*
* set_snooping * set_snooping
@@ -75,6 +76,12 @@ void bsp_start( void )
*/ */
LEON3_Cpu_Index = (get_asr17() >> 28) & 3; 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(); amba_initialize();
/* find debug UART for printk() */
bsp_debug_uart_init();
} }