From 7cdabc49ca3828c9aeeb6beca4a0beeb71bf23f1 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Sun, 14 Dec 2014 16:27:06 -0600 Subject: pc386: Add Edison base support The current support for the Edison supports a single polled UART for input and output plus a simulated clock tick. The activities forward for supporting the Edison have been posted on the RTEMS mailing lists and at: http://rtemsramblings.blogspot.com/2014/12/intel-edison-and-rtems-road-forward.html --- c/src/lib/libbsp/i386/pc386/Makefile.am | 11 ++- c/src/lib/libbsp/i386/pc386/configure.ac | 10 +++ c/src/lib/libbsp/i386/pc386/console/conscfg.c | 25 ++++++ .../lib/libbsp/i386/pc386/console/console_edison.c | 94 ++++++++++++++++++++++ .../lib/libbsp/i386/pc386/console/printk_support.c | 10 +++ c/src/lib/libbsp/i386/pc386/include/bsp.h | 27 ++++++- c/src/lib/libbsp/i386/pc386/make/custom/edison.cfg | 5 ++ c/src/lib/libbsp/i386/pc386/preinstall.am | 8 +- .../lib/libbsp/i386/pc386/startup/bspgetworkarea.c | 4 + c/src/lib/libbsp/i386/pc386/startup/bspreset.c | 6 +- c/src/lib/libbsp/i386/pc386/startup/bspstart.c | 34 ++++++-- c/src/lib/libbsp/i386/pc386/startup/ldsegs.S | 3 + 12 files changed, 220 insertions(+), 17 deletions(-) create mode 100644 c/src/lib/libbsp/i386/pc386/console/console_edison.c create mode 100644 c/src/lib/libbsp/i386/pc386/make/custom/edison.cfg diff --git a/c/src/lib/libbsp/i386/pc386/Makefile.am b/c/src/lib/libbsp/i386/pc386/Makefile.am index 78d0c69e02..1da40f2e32 100644 --- a/c/src/lib/libbsp/i386/pc386/Makefile.am +++ b/c/src/lib/libbsp/i386/pc386/Makefile.am @@ -68,10 +68,14 @@ noinst_LIBRARIES += libbsp.a libbsp_a_SOURCES = # clock +if RTEMS_EDISON +libbsp_a_SOURCES += ../../shared/clock_driver_simidle.c +else libbsp_a_SOURCES += clock/ckinit.c +endif +libbsp_a_SOURCES += ../../shared/clockdrv_shell.h libbsp_a_SOURCES += clock/todcfg.c libbsp_a_SOURCES += ../../shared/tod.c -libbsp_a_SOURCES += ../../shared/clockdrv_shell.h include_rtemsdir = $(includedir)/rtems include_rtems_HEADERS = @@ -80,7 +84,6 @@ if RTEMS_VGA include_rtems_HEADERS += console/keyboard.h include_rtems_HEADERS += console/kd.h include_rtems_HEADERS += console/ps2_drv.h -include_rtems_HEADERS += ../../shared/console_private.h include_rtems_HEADERS += console/vgacons.h libbsp_a_SOURCES += console/inch.c libbsp_a_SOURCES += console/outch.c @@ -108,7 +111,11 @@ endif endif # console (non-graphics support) +if RTEMS_EDISON +libbsp_a_SOURCES += console/console_edison.c +endif include_HEADERS += ../../i386/shared/comm/i386_io.h +include_rtems_HEADERS += ../../shared/console_private.h libbsp_a_SOURCES += console/serial_mouse_config.c libbsp_a_SOURCES += ../../i386/shared/comm/uart.c libbsp_a_SOURCES += ../../i386/shared/comm/tty_drv.c diff --git a/c/src/lib/libbsp/i386/pc386/configure.ac b/c/src/lib/libbsp/i386/pc386/configure.ac index 9c039c927c..f8855eece9 100644 --- a/c/src/lib/libbsp/i386/pc386/configure.ac +++ b/c/src/lib/libbsp/i386/pc386/configure.ac @@ -17,6 +17,15 @@ RTEMS_PROG_CCAS RTEMS_CHECK_NETWORKING RTEMS_CHECK_SMP +# Is this an Intel Edison? +# NOTE: As we learn more, this could be trimmed if more issues +# turn out fo lack of legacy peripherals +RTEMS_BSPOPTS_SET([BSP_IS_EDISON],[edison],[1]) +RTEMS_BSPOPTS_SET([BSP_IS_EDISON],[*],[0]) +RTEMS_BSPOPTS_HELP([BSP_IS_EDISON],[Set if the BSP variant is Intel Edison.]) +AM_CONDITIONAL(RTEMS_EDISON,[test "$BSP_IS_EDISON" = "1"]) + +RTEMS_BSPOPTS_SET([BSP_ENABLE_VGA],[edison],[0]) RTEMS_BSPOPTS_SET([BSP_ENABLE_VGA],[*],[1]) RTEMS_BSPOPTS_HELP([BSP_ENABLE_VGA], [Set if the VGA and keyboard console support is enabled.]) @@ -27,6 +36,7 @@ RTEMS_BSPOPTS_HELP([BSP_ENABLE_COM1_COM4], [Set if COM1..COM4 support is enabled.]) AM_CONDITIONAL(RTEMS_VGA,[test "$BSP_ENABLE_COM1_COM4" = "1"]) +RTEMS_BSPOPTS_SET([BSP_ENABLE_IDE],[edison],[0]) RTEMS_BSPOPTS_SET([BSP_ENABLE_IDE],[*],[1]) RTEMS_BSPOPTS_HELP([BSP_ENABLE_IDE], [Set if IDE support is enabled.]) diff --git a/c/src/lib/libbsp/i386/pc386/console/conscfg.c b/c/src/lib/libbsp/i386/pc386/console/conscfg.c index a34f0e5217..d5586d74db 100644 --- a/c/src/lib/libbsp/i386/pc386/console/conscfg.c +++ b/c/src/lib/libbsp/i386/pc386/console/conscfg.c @@ -60,7 +60,32 @@ } #endif +#if (BSP_IS_EDISON == 1 ) + extern const console_fns edison_fns; +#endif + console_tbl Console_Configuration_Ports[] = { +#if (BSP_IS_EDISON == 1) + { + "/dev/vgacons", /* sDeviceName */ + -1, /* deviceType */ + &edison_fns, /* pDeviceFns */ + NULL, /* deviceProbe */ + NULL, /* pDeviceFlow */ + 16, /* ulMargin */ + 8, /* ulHysteresis */ + (void *) NULL, /* NULL */ /* pDeviceParams */ + 0x00000000, /* ulCtrlPort1 */ + 0x00000000, /* ulCtrlPort2 */ + 0x00000000, /* ulDataPort */ + NULL, /* getRegister */ + NULL, /* setRegister */ + NULL,/* unused */ /* getData */ + NULL,/* unused */ /* setData */ + 0X0, /* ulClock */ + 0x0 /* ulIntVector -- base for port */ + }, +#endif #if BSP_ENABLE_VGA { "/dev/vgacons", /* sDeviceName */ diff --git a/c/src/lib/libbsp/i386/pc386/console/console_edison.c b/c/src/lib/libbsp/i386/pc386/console/console_edison.c new file mode 100644 index 0000000000..d5e44aed86 --- /dev/null +++ b/c/src/lib/libbsp/i386/pc386/console/console_edison.c @@ -0,0 +1,94 @@ + +#include +#include + +/* XXX hack until real support is available, code copied from libchip */ +#define NS16550_RECEIVE_BUFFER 0 +#define NS16550_TRANSMIT_BUFFER 0 +#define NS16550_INTERRUPT_ENABLE 1 +#define NS16550_INTERRUPT_ID 2 +#define NS16550_FIFO_CONTROL 2 +#define NS16550_LINE_CONTROL 3 +#define NS16550_MODEM_CONTROL 4 +#define NS16550_LINE_STATUS 5 +#define NS16550_MODEM_STATUS 6 +#define NS16550_SCRATCH_PAD 7 +#define NS16550_FRACTIONAL_DIVIDER 10 + +/* status bits we use in line status */ + +#define SP_LSR_TX 0x40 +#define SP_LSR_THOLD 0x20 +#define SP_LSR_RDY 0x01 +static volatile uint8_t *edison_com = (volatile uint8_t *)0xff010180; + +void edison_write_polled(int minor, char cChar); +int edison_inbyte_nonblocking_polled(int minor); + +static int edison_open(int major, int minor, void *arg) +{ + return 0; +} + +static int edison_close(int major, int minor, void *arg) +{ + return 0; +} + +int edison_inbyte_nonblocking_polled(int minor) +{ + if ( edison_com[NS16550_LINE_STATUS] & 0x01 ) + return (int) edison_com[NS16550_RECEIVE_BUFFER]; + return -1; +} + +static ssize_t edison_write_support_polled(int minor, const char *buf, size_t len) +{ + ssize_t i; + + for ( i=0 ; i /* - * External routines + * Helper to initialize the PCI Bus */ -void Clock_driver_install_handler(void); +static void bsp_pci_initialize_helper(void) +{ +#if (BSP_IS_EDISON == 0) + int pci_init_retval; + + pci_init_retval = pci_initialize(); + if (pci_init_retval != PCIB_ERR_SUCCESS) { + printk("PCI bus: could not initialize PCI BIOS interface\n"); + } +#endif +} /*-------------------------------------------------------------------------+ | Function: bsp_start @@ -47,17 +57,26 @@ void Clock_driver_install_handler(void); +--------------------------------------------------------------------------*/ static void bsp_start_default( void ) { - int pci_init_retval; - /* * We need to determine how much memory there is in the system. */ bsp_size_memory(); + /* + * Turn off watchdog + */ +#if (BSP_IS_EDISON == 1) + volatile uint32_t *edison_wd = (volatile uint32_t *)0xff009000; + *edison_wd = 0x11f8; +#endif + + /* * Calibrate variable for 1ms-loop (see timer.c) */ +#if (BSP_IS_EDISON == 0) Calibrate_loop_1ms(); +#endif /* * Init rtems interrupt management @@ -72,12 +91,11 @@ static void bsp_start_default( void ) /* * init PCI Bios interface... */ - pci_init_retval = pci_initialize(); - if (pci_init_retval != PCIB_ERR_SUCCESS) { - printk("PCI bus: could not initialize PCI BIOS interface\n"); - } + bsp_pci_initialize_helper(); +#if (BSP_IS_EDISON == 0) Clock_driver_install_handler(); +#endif #if BSP_ENABLE_IDE bsp_ide_cmdline_init(); diff --git a/c/src/lib/libbsp/i386/pc386/startup/ldsegs.S b/c/src/lib/libbsp/i386/pc386/startup/ldsegs.S index 14cbb9599b..f527ff9ebd 100644 --- a/c/src/lib/libbsp/i386/pc386/startup/ldsegs.S +++ b/c/src/lib/libbsp/i386/pc386/startup/ldsegs.S @@ -35,6 +35,7 @@ #include #include /* contains sizes of GDT and IDT */ +#include /*----------------------------------------------------------------------------+ | CODE section @@ -109,6 +110,7 @@ next_step: movw ax, fs movw ax, gs +#if (BSP_IS_EDISON == 0) /*---------------------------------------------------------------------+ | Now we have to reprogram the interrupts :-(. We put them right after | the intel-reserved hardware interrupts, at int 0x20-0x2F. There they @@ -154,6 +156,7 @@ next_step: movw $0xFFFB, SYM(i8259s_cache) /* set up same values in cache */ + #endif jmp SYM (_establish_stack) # return to the bsp entry code /*-------------------------------------------------------------------------+ -- cgit v1.2.3