summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp
diff options
context:
space:
mode:
authorThomas Doerfler <Thomas.Doerfler@embedded-brains.de>2010-01-19 09:11:34 +0000
committerThomas Doerfler <Thomas.Doerfler@embedded-brains.de>2010-01-19 09:11:34 +0000
commitde592aa6f1a466df53a687173918f2e24a54a925 (patch)
treead5a0d3da8d59ba0ab2a2ce34a14ac041b46e43a /c/src/lib/libbsp
parentUpdate for block device API change. (diff)
downloadrtems-de592aa6f1a466df53a687173918f2e24a54a925.tar.bz2
tqm8xx BSP fixes
Diffstat (limited to 'c/src/lib/libbsp')
-rw-r--r--c/src/lib/libbsp/powerpc/tqm8xx/ChangeLog5
-rw-r--r--c/src/lib/libbsp/powerpc/tqm8xx/configure.ac20
-rw-r--r--c/src/lib/libbsp/powerpc/tqm8xx/console/console.c8
-rw-r--r--c/src/lib/libbsp/powerpc/tqm8xx/include/bsp.h15
-rw-r--r--c/src/lib/libbsp/powerpc/tqm8xx/irq/irq.c12
-rw-r--r--c/src/lib/libbsp/powerpc/tqm8xx/spi/spi.c268
6 files changed, 235 insertions, 93 deletions
diff --git a/c/src/lib/libbsp/powerpc/tqm8xx/ChangeLog b/c/src/lib/libbsp/powerpc/tqm8xx/ChangeLog
index 226ad27d6a..45f4d160f3 100644
--- a/c/src/lib/libbsp/powerpc/tqm8xx/ChangeLog
+++ b/c/src/lib/libbsp/powerpc/tqm8xx/ChangeLog
@@ -1,3 +1,8 @@
+2010-01-18 Thomas Doerfler <Thomas.Doerfler@embedded-brains.de>
+
+ * configure.ac, console/console.c, include/bsp.h, irq/irq.c,
+ spi/spi.c: various fixes
+
2009-12-16 Thomas Doerfler <Thomas.Doerfler@embedded-brains.de>
* console/console.c: adapted to new prototype for *_write
diff --git a/c/src/lib/libbsp/powerpc/tqm8xx/configure.ac b/c/src/lib/libbsp/powerpc/tqm8xx/configure.ac
index d989356eb6..a72893cffc 100644
--- a/c/src/lib/libbsp/powerpc/tqm8xx/configure.ac
+++ b/c/src/lib/libbsp/powerpc/tqm8xx/configure.ac
@@ -51,7 +51,7 @@ RTEMS_BSPOPTS_HELP([PRINTK_CHN],
each other.])
RTEMS_BSPOPTS_SET([CONS_SMC1_MODE],[tqm8xx_stk8xx],[CONS_MODE_POLLED])
-RTEMS_BSPOPTS_SET([CONS_SMC1_MODE],[pghplus],[CONS_MODE_POLLED])
+RTEMS_BSPOPTS_SET([CONS_SMC1_MODE],[pghplus],[CONS_MODE_IRQ])
RTEMS_BSPOPTS_SET([CONS_SMC1_MODE],[*],[CONS_MODE_UNUSED])
RTEMS_BSPOPTS_HELP([CONS_SMC1_MODE],
[(BSP--SMC1 UART IF mode) Must be defined if SMC1 is used as a tty (UART)
@@ -89,6 +89,24 @@ RTEMS_BSPOPTS_HELP([CONS_SCC4_MODE],
channel. Set it to CONS_MODE_POLLED for polled operation, CONS_MODE_IRQ for
interrupt driven (spooled) operation. Set it to CONS_MODE_UNUSED, if not used])
+RTEMS_BSPOPTS_SET([SPI_BOARD_INIT_FNC],[pghplus],[bsp_pghplus_spi_init])
+RTEMS_BSPOPTS_SET([SPI_BOARD_INIT_FNC],[*],[bsp_dummy_spi_init])
+RTEMS_BSPOPTS_HELP([SPI_BOARD_INIT_FNC],
+[(BSP--SPI board init function) Specify the function that inits the board
+ port lines and further devices.])
+
+RTEMS_BSPOPTS_SET([SPI_SEND_STOP_FNC],[pghplus],[bsp_pghplus_spi_send_stop])
+RTEMS_BSPOPTS_SET([SPI_SEND_STOP_FNC],[*],[bsp_dummy_spi_send_stop])
+RTEMS_BSPOPTS_HELP([SPI_SEND_STOP_FNC],
+[(BSP--SPI send stop function) Specify the function that deaddresses SPI
+ devices. Set to bsp_dummy_spi_send_stop for dummy implementation])
+
+RTEMS_BSPOPTS_SET([SPI_SEND_ADDR_FNC],[pghplus],[bsp_pghplus_spi_sel_addr])
+RTEMS_BSPOPTS_SET([SPI_SEND_ADDR_FNC],[*],[bsp_dummy_spi_sel_addr])
+RTEMS_BSPOPTS_HELP([SPI_SEND_ADDR_FNC],
+[(BSP--SPI send address function) Specify the function that addresses SPI
+ devices. Set to bsp_dummy_spi_sel_addr for dummy implementation])
+
# add selection of primary network interface
RTEMS_BSPOPTS_SET([BSP_USE_NETWORK_FEC],[pghplus],[1])
RTEMS_BSPOPTS_SET([BSP_USE_NETWORK_FEC],[*],[0])
diff --git a/c/src/lib/libbsp/powerpc/tqm8xx/console/console.c b/c/src/lib/libbsp/powerpc/tqm8xx/console/console.c
index 80f1cbd412..a4cda15d34 100644
--- a/c/src/lib/libbsp/powerpc/tqm8xx/console/console.c
+++ b/c/src/lib/libbsp/powerpc/tqm8xx/console/console.c
@@ -499,19 +499,21 @@ sccInterruptHandler (void *arg)
static void
mpc8xx_console_irq_on(const rtems_irq_connect_data *irq)
{
- CHN_MASK_SET(irq->name,3); /* Enable TX and RX interrupts */
+ CHN_MASK_SET(irq->name - BSP_CPM_IRQ_LOWEST_OFFSET,
+ 3); /* Enable TX and RX interrupts */
}
static void
mpc8xx_console_irq_off(const rtems_irq_connect_data *irq)
{
- CHN_MASK_SET(irq->name,0); /* Disable TX and RX interrupts */
+ CHN_MASK_SET(irq->name - BSP_CPM_IRQ_LOWEST_OFFSET,
+ 0); /* Disable TX and RX interrupts */
}
static int
mpc8xx_console_irq_isOn(const rtems_irq_connect_data *irq)
{
- return (0 != CHN_MASK_GET(irq->name)); /* Check TX and RX interrupts */
+ return (0 != CHN_MASK_GET(irq->name - BSP_CPM_IRQ_LOWEST_OFFSET)); /* Check TX and RX interrupts */
}
static void
diff --git a/c/src/lib/libbsp/powerpc/tqm8xx/include/bsp.h b/c/src/lib/libbsp/powerpc/tqm8xx/include/bsp.h
index 8544390f05..548d5a91db 100644
--- a/c/src/lib/libbsp/powerpc/tqm8xx/include/bsp.h
+++ b/c/src/lib/libbsp/powerpc/tqm8xx/include/bsp.h
@@ -132,6 +132,21 @@ extern int rtems_scc_enet_driver_attach (struct rtems_bsdnet_ifconfig *config,
#undef RTEMS_BSP_HAS_IDE_DRIVER
/*
+ * SPI driver configuration
+ */
+
+ /* select values for SPI addressing */
+#define PGHPLUS_SPI_ADDR_EEPROM 0
+#define PGHPLUS_SPI_ADDR_DISP4 1
+ /* NOTE: DISP4 occupies two consecutive addresses for data and control port */
+#define PGHPLUS_SPI_ADDR_DISP4_DATA (PGHPLUS_SPI_ADDR_DISP4)
+#define PGHPLUS_SPI_ADDR_DISP4_CTRL (PGHPLUS_SPI_ADDR_DISP4_DATA+1)
+
+ /* bit masks for Port B lines */
+#define PGHPLUS_PB_SPI_EEP_CE_MSK (1<< 0)
+#define PGHPLUS_PB_SPI_DISP4_RS_MSK (1<<15)
+#define PGHPLUS_PB_SPI_DISP4_CE_MSK (1<<14)
+/*
* our (internal) bus frequency
*/
extern uint32_t BSP_bus_frequency;
diff --git a/c/src/lib/libbsp/powerpc/tqm8xx/irq/irq.c b/c/src/lib/libbsp/powerpc/tqm8xx/irq/irq.c
index 1e87902566..2991636392 100644
--- a/c/src/lib/libbsp/powerpc/tqm8xx/irq/irq.c
+++ b/c/src/lib/libbsp/powerpc/tqm8xx/irq/irq.c
@@ -52,14 +52,14 @@ rtems_status_code bsp_irq_enable_at_SIU(rtems_vector_number irqnum)
rtems_status_code bsp_irq_disable_at_CPM(rtems_vector_number irqnum)
{
rtems_vector_number vecnum = irqnum - BSP_CPM_IRQ_LOWEST_OFFSET;
- m8xx.cimr &= ~(1 << (31 - vecnum));
+ m8xx.cimr &= ~(1 << (vecnum));
return RTEMS_SUCCESSFUL;
}
rtems_status_code bsp_irq_enable_at_CPM(rtems_vector_number irqnum)
{
rtems_vector_number vecnum = irqnum - BSP_CPM_IRQ_LOWEST_OFFSET;
- m8xx.cimr |= (1 << (31 - vecnum));
+ m8xx.cimr |= (1 << (vecnum));
return RTEMS_SUCCESSFUL;
}
@@ -193,10 +193,12 @@ rtems_status_code mpc8xx_cpic_initialize( void)
/*
* make sure CPIC request proper level at SIU interrupt controller
*/
- m8xx.cicr = (0x00e41f00 |
+ m8xx.cicr = (0x00e41f80 |
((BSP_CPM_INTERRUPT/2) << 13));
-
- return RTEMS_SUCCESSFUL;
+ /*
+ * enable CPIC interrupt in SIU interrupt controller
+ */
+ return bsp_irq_enable_at_SIU(BSP_CPM_INTERRUPT);
}
/*
diff --git a/c/src/lib/libbsp/powerpc/tqm8xx/spi/spi.c b/c/src/lib/libbsp/powerpc/tqm8xx/spi/spi.c
index 134dd536d0..4c5d2ffe86 100644
--- a/c/src/lib/libbsp/powerpc/tqm8xx/spi/spi.c
+++ b/c/src/lib/libbsp/powerpc/tqm8xx/spi/spi.c
@@ -19,7 +19,8 @@
#include <stdlib.h>
#include <bsp.h>
#include <mpc8xx.h>
-#include "spi.h"
+#include <bsp/spi.h>
+#include <libchip/disp_hcms29xx.h>
#include <rtems/error.h>
#include <rtems/bspIo.h>
#include <errno.h>
@@ -625,7 +626,7 @@ int m8xx_spi_ioctl
/*=========================================================================*\
| Function: |
\*-------------------------------------------------------------------------*/
-static rtems_status_code bsp_spi_sel_addr
+static rtems_status_code bsp_dummy_spi_sel_addr
(
/*-------------------------------------------------------------------------*\
| Purpose: |
@@ -639,48 +640,111 @@ static rtems_status_code bsp_spi_sel_addr
)
/*-------------------------------------------------------------------------*\
| Return Value: |
+| rtems_status_code |
+\*=========================================================================*/
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*=========================================================================*\
+| Function: |
+\*-------------------------------------------------------------------------*/
+static rtems_status_code bsp_dummy_spi_send_start
+(
+/*-------------------------------------------------------------------------*\
+| Purpose: |
+| dummy function, SPI has no start condition |
++---------------------------------------------------------------------------+
+| Input Parameters: |
+\*-------------------------------------------------------------------------*/
+ rtems_libi2c_bus_t *bh /* bus specifier structure */
+)
+/*-------------------------------------------------------------------------*\
+| Return Value: |
+| o = ok or error code |
+\*=========================================================================*/
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*=========================================================================*\
+| Function: |
+\*-------------------------------------------------------------------------*/
+static rtems_status_code bsp_dummy_spi_send_stop
+(
+/*-------------------------------------------------------------------------*\
+| Purpose: |
+| deselect SPI |
++---------------------------------------------------------------------------+
+| Input Parameters: |
+\*-------------------------------------------------------------------------*/
+ rtems_libi2c_bus_t *bh /* bus specifier structure */
+)
+/*-------------------------------------------------------------------------*\
+| Return Value: |
| o = ok or error code |
\*=========================================================================*/
{
-#if defined(PGH360)
+ return RTEMS_SUCCESSFUL;
+}
+
+/*=========================================================================*\
+| Function: |
+\*-------------------------------------------------------------------------*/
+static rtems_status_code bsp_pghplus_spi_sel_addr
+(
+/*-------------------------------------------------------------------------*\
+| Purpose: |
+| address a slave device on the bus |
++---------------------------------------------------------------------------+
+| Input Parameters: |
+\*-------------------------------------------------------------------------*/
+ rtems_libi2c_bus_t *bh, /* bus specifier structure */
+ uint32_t addr, /* address to send on bus */
+ int rw /* 0=write,1=read */
+)
+/*-------------------------------------------------------------------------*\
+| Return Value: |
+| rtems_status_code |
+\*=========================================================================*/
+{
+#if defined(PGHPLUS)
+ pbdat_val = m8xx.pbdat | (PGHPLUS_SPI_PB_DISP4_RS_MSK |
+ PGHPLUS_SPI_PB_DISP4_CE_MSK |
+ PGHPLUS_SPI_PB_EEP_CE_MSK);
/*
* select given device
*/
- /*
- * GPIO1[24] is SPI_A0
- * GPIO1[25] is SPI_A1
- * GPIO1[26] is SPI_A2
- * set pins to address
- */
switch(addr) {
- case PGH360_SPI_ADDR_EEPROM:
- m8xx.pbdat &= ~PGH360_PB_SPI_EEP_CE_MSK;
+ case PGHPLUS_SPI_ADDR_EEPROM:
+ pbdat_val &= ~PGHPLUS_SPI_PB_EEP_CE_MSK;
break;
- case PGH360_SPI_ADDR_DISP4_DATA:
- m8xx.pbdat = (m8xx.pbdat
- & ~(PGH360_PB_SPI_DISP4_CE_MSK |
- PGH360_PB_SPI_DISP4_RS_MSK));
+ case PGHPLUS_SPI_ADDR_DISP4_DATA:
+ pbdat_val = (m8xx.pbdat
+ & ~(PGHPLUS_PB_SPI_DISP4_CE_MSK |
+ PGHPLUS_PB_SPI_DISP4_RS_MSK));
break;
- case PGH360_SPI_ADDR_DISP4_CTRL:
- m8xx.pbdat = (m8xx.pbdat
- & ~(PGH360_PB_SPI_DISP4_CE_MSK)
- | PGH360_PB_SPI_DISP4_RS_MSK);
+ case PGHPLUS_SPI_ADDR_DISP4_CTRL:
+ pbdat_val = (m8xx.pbdat
+ & ~(PGHPLUS_PB_SPI_DISP4_CE_MSK)
+ | PGHPLUS_PB_SPI_DISP4_RS_MSK);
break;
default:
return RTEMS_INVALID_NUMBER;
}
-#endif /* PGH360 */
+ m8xx_pbdat = pbdat_val
+#endif /* PGHPLUS */
return RTEMS_SUCCESSFUL;
}
/*=========================================================================*\
| Function: |
\*-------------------------------------------------------------------------*/
-static rtems_status_code bsp_spi_send_start_dummy
+static rtems_status_code bsp_pghplus_spi_send_stop
(
/*-------------------------------------------------------------------------*\
| Purpose: |
-| dummy function, SPI has no start condition |
+| deselect SPI |
+---------------------------------------------------------------------------+
| Input Parameters: |
\*-------------------------------------------------------------------------*/
@@ -691,39 +755,121 @@ static rtems_status_code bsp_spi_send_start_dummy
| o = ok or error code |
\*=========================================================================*/
{
- return 0;
+#if defined(DEBUG)
+ printk("bsp_pghplus_spi_send_stop called... ");
+#endif
+ m8xx.pbdat = (m8xx.pbdat
+ | PGHPLUS_PB_SPI_DISP4_CE_MSK
+ | PGHPLUS_PB_SPI_EEP_CE_MSK);
+#if defined(DEBUG)
+ printk("... exit OK\r\n");
+#endif
+ return RTEMS_SUCCESSFUL;
}
/*=========================================================================*\
| Function: |
\*-------------------------------------------------------------------------*/
-static rtems_status_code bsp_spi_send_stop
+static rtems_status_code bsp_pghplus_spi_init
(
/*-------------------------------------------------------------------------*\
| Purpose: |
-| deselect SPI |
+| do board specific init: |
+| - initialize pins for addressing |
+| - register further drivers |
+---------------------------------------------------------------------------+
| Input Parameters: |
\*-------------------------------------------------------------------------*/
- rtems_libi2c_bus_t *bh /* bus specifier structure */
+ int spi_busno
)
/*-------------------------------------------------------------------------*\
| Return Value: |
| o = ok or error code |
\*=========================================================================*/
{
+ int ret_code;
+
#if defined(DEBUG)
- printk("bsp_spi_send_stop called... ");
+ printk("bsp_pghplus_spi_init called... ");
#endif
-#if defined(PGH360)
- m8xx.pbdat = (m8xx.pbdat
- | PGH360_PB_SPI_DISP4_CE_MSK
- | PGH360_PB_SPI_EEP_CE_MSK);
+
+ /*
+ * init port pins used to address/select SPI devices
+ */
+
+ /*
+ * set up ports
+ * LINE PAR DIR DAT
+ * -----------------------
+ * EEP_CE 0 1 act-high
+ * DISP4_CS 0 1 act-high
+ * DISP4_RS 0 1 active
+ */
+
+ /* set Port B Pin Assignment Register... */
+ m8xx.pbpar =
+ (m8xx.pbpar
+ & ~(PGHPLUS_PB_SPI_EEP_CE_MSK
+ | PGHPLUS_PB_SPI_DISP4_CE_MSK
+ | PGHPLUS_PB_SPI_DISP4_RS_MSK));
+
+ /* set Port B Data Direction Register... */
+ m8xx.pbdir =
+ m8xx.pbdir
+ | PGHPLUS_PB_SPI_EEP_CE_MSK
+ | PGHPLUS_PB_SPI_DISP4_CE_MSK
+ | PGHPLUS_PB_SPI_DISP4_RS_MSK;
+
+ /* set Port B Data Register to inactive CE state */
+ m8xx.pbdat =
+ m8xx.pbdat
+ | PGHPLUS_PB_SPI_DISP4_CE_MSK
+ | PGHPLUS_PB_SPI_DISP4_RS_MSK;
+
+ /*
+ * register devices
+ */
+ ret_code = rtems_libi2c_register_drv("disp",
+ disp_hcms29xx_driver_descriptor,
+ spi_busno,PGHPLUS_SPI_ADDR_DISP4);
+ if (ret_code < 0) {
+ return -ret_code;
+ }
+
+#if defined(DEBUG)
+ printk("... exit OK\r\n");
+#endif
+ return RTEMS_SUCCESSFUL;
+}
+
+/*=========================================================================*\
+| Function: |
+\*-------------------------------------------------------------------------*/
+static rtems_status_code bsp_dummy_spi_init
+(
+/*-------------------------------------------------------------------------*\
+| Purpose: |
+| do board specific init: |
+| - initialize pins for addressing |
+| - register further drivers |
++---------------------------------------------------------------------------+
+| Input Parameters: |
+\*-------------------------------------------------------------------------*/
+ int spi_busno
+)
+/*-------------------------------------------------------------------------*\
+| Return Value: |
+| o = ok or error code |
+\*=========================================================================*/
+{
+#if defined(DEBUG)
+ printk("bsp_dummy_spi_init called... ");
#endif
+
#if defined(DEBUG)
printk("... exit OK\r\n");
#endif
- return 0;
+ return RTEMS_SUCCESSFUL;
}
/*=========================================================================*\
@@ -732,9 +878,9 @@ static rtems_status_code bsp_spi_send_stop
rtems_libi2c_bus_ops_t bsp_spi_ops = {
init: m8xx_spi_init,
- send_start: bsp_spi_send_start_dummy,
- send_stop: bsp_spi_send_stop,
- send_addr: bsp_spi_sel_addr,
+ send_start: bsp_dummy_spi_send_start,
+ send_stop: SPI_SEND_STOP_FNC,
+ send_addr: SPI_SEND_ADDR_FNC,
read_bytes: m8xx_spi_read_bytes,
write_bytes: m8xx_spi_write_bytes,
ioctl: m8xx_spi_ioctl
@@ -780,41 +926,6 @@ rtems_status_code bsp_register_spi
*/
rtems_libi2c_initialize ();
- /*
- * init port pins used to address/select SPI devices
- */
-
-#if defined(PGH360)
-
- /*
- * set up ports
- * LINE PAR DIR DAT
- * -----------------------
- * EEP_CE 0 1 act-high
- * DISP4_CS 0 1 act-high
- * DISP4_RS 0 1 active
- */
-
- /* set Port B Pin Assignment Register... */
- m8xx.pbpar =
- (m8xx.pbpar
- & ~(PGH360_PB_SPI_EEP_CE_MSK
- | PGH360_PB_SPI_DISP4_CE_MSK
- | PGH360_PB_SPI_DISP4_RS_MSK));
-
- /* set Port B Data Direction Register... */
- m8xx.pbdir =
- m8xx.pbdir
- | PGH360_PB_SPI_EEP_CE_MSK
- | PGH360_PB_SPI_DISP4_CE_MSK
- | PGH360_PB_SPI_DISP4_RS_MSK;
-
- /* set Port B Data Register to inactive CE state */
- m8xx.pbdat =
- m8xx.pbdat
- | PGH360_PB_SPI_DISP4_CE_MSK
- | PGH360_PB_SPI_DISP4_RS_MSK;
-#endif
/*
* register SPI bus
@@ -825,23 +936,12 @@ rtems_status_code bsp_register_spi
return -ret_code;
}
spi_busno = ret_code;
-#if defined(PGH360)
- /*
- * register devices
- */
-#if 0
- ret_code = rtems_libi2c_register_drv(RTEMS_BSP_SPI_FLASH_DEVICE_NAME,
- spi_flash_m25p40_rw_driver_descriptor,
- spi_busno,0x00);
- if (ret_code < 0) {
- return -ret_code;
- }
-#endif
-#endif /* defined(PGH360) */
+
+ SPI_BOARD_INIT_FNC(spi_busno);
/*
* FIXME: further drivers, when available
*/
- return 0;
+ return RTEMS_SUCCESSFUL;
}