[U-Boot] [PATCH 1/3] mpc52xx: Add SPI driver.

Signed-off-by: Grzegorz Bernacki gjb@semihalf.com --- drivers/spi/Makefile | 1 + drivers/spi/mpc52xx_spi.c | 108 +++++++++++++++++++++++++++++++++++++++++++++ include/mpc5xxx.h | 18 +++++++ 3 files changed, 127 insertions(+), 0 deletions(-) create mode 100644 drivers/spi/mpc52xx_spi.c
diff --git a/drivers/spi/Makefile b/drivers/spi/Makefile index 1350f3e..1272c17 100644 --- a/drivers/spi/Makefile +++ b/drivers/spi/Makefile @@ -28,6 +28,7 @@ LIB := $(obj)libspi.a COBJS-$(CONFIG_ATMEL_DATAFLASH_SPI) += atmel_dataflash_spi.o COBJS-$(CONFIG_ATMEL_SPI) += atmel_spi.o COBJS-$(CONFIG_BFIN_SPI) += bfin_spi.o +COBJS-$(CONFIG_MPC52XX_SPI) += mpc52xx_spi.o COBJS-$(CONFIG_MPC8XXX_SPI) += mpc8xxx_spi.o COBJS-$(CONFIG_MXC_SPI) += mxc_spi.o COBJS-$(CONFIG_SOFT_SPI) += soft_spi.o diff --git a/drivers/spi/mpc52xx_spi.c b/drivers/spi/mpc52xx_spi.c new file mode 100644 index 0000000..6dae7ad --- /dev/null +++ b/drivers/spi/mpc52xx_spi.c @@ -0,0 +1,108 @@ +/* + * (C) Copyright 2009 + * Frank Bodammer frank.bodammer@gcd-solutions.de + * (C) Copyright 2009 Semihalf, Grzegorz Bernacki + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <common.h> +#include <malloc.h> +#include <spi.h> +#include <mpc5xxx.h> + +void spi_init(void) +{ + struct mpc5xxx_spi *spi = (struct mpc5xxx_spi *)MPC5XXX_SPI; + /* + * Its important to use the correct order when initializing the + * registers + */ + spi->ddr = 0x0F; /* set all SPI pins as output */ + spi->pdr = 0x00; /* set SS low */ + /* SPI is master, SS is general purpose output */ + spi->cr1 = SPI_CR_MSTR | SPI_CR_SPE; + spi->cr2 = 0x00; /* normal operation */ + spi->brr = 0x77; /* baud rate: IPB clock / 2048 */ +} + +struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs, + unsigned int max_hz, unsigned int mode) +{ + struct spi_slave *slave; + + slave = malloc(sizeof(struct spi_slave)); + if (!slave) + return NULL; + + slave->bus = bus; + slave->cs = cs; + + return slave; +} + +void spi_free_slave(struct spi_slave *slave) +{ + free(slave); +} + +int spi_claim_bus(struct spi_slave *slave) +{ + return 0; +} + +void spi_release_bus(struct spi_slave *slave) +{ + return; +} + +int spi_xfer(struct spi_slave *slave, unsigned int bitlen, const void *dout, + void *din, unsigned long flags) +{ + struct mpc5xxx_spi *spi = (struct mpc5xxx_spi *)MPC5XXX_SPI; + int i, iter = bitlen >> 3; + const uchar *txp = dout; + uchar *rxp = din; + + debug("spi_xfer: slave %u:%u dout %08X din %08X bitlen %u\n", + slave->bus, slave->cs, *(uint *) dout, *(uint *) din, bitlen); + + if (flags & SPI_XFER_BEGIN) + spi->pdr |= SPI_PDR_SS; + + for (i = 0; i < iter; i++) { + udelay(1000); + debug("spi_xfer: sending %x\n", txp[i]); + spi->dr = txp[i]; + while (!(spi->sr & SPI_SR_SPIF)) { + udelay(1000); + if (spi->sr & SPI_SR_WCOL) { + rxp[i] = spi->dr; + puts("spi_xfer: write collision\n"); + return -1; + } + } + rxp[i] = spi->dr; + debug("spi_xfer: received %x\n", rxp[i]); + } + if (flags & SPI_XFER_END) + spi->pdr &= ~SPI_PDR_SS; + + return 0; +} diff --git a/include/mpc5xxx.h b/include/mpc5xxx.h index 463d5ae..476d149 100644 --- a/include/mpc5xxx.h +++ b/include/mpc5xxx.h @@ -392,6 +392,24 @@ #define I2C_IF 0x02 #define I2C_RXAK 0x01
+/* SPI control register 1 bits */ +#define SPI_CR_LSBFE 0x01 +#define SPI_CR_SSOE 0x02 +#define SPI_CR_CPHA 0x04 +#define SPI_CR_CPOL 0x08 +#define SPI_CR_MSTR 0x10 +#define SPI_CR_SWOM 0x20 +#define SPI_CR_SPE 0x40 +#define SPI_CR_SPIE 0x80 + +/* SPI status register bits */ +#define SPI_SR_MODF 0x10 +#define SPI_SR_WCOL 0x40 +#define SPI_SR_SPIF 0x80 + +/* SPI port data register bits */ +#define SPI_PDR_SS 0x08 + /* Programmable Serial Controller (PSC) status register bits */ #define PSC_SR_CDE 0x0080 #define PSC_SR_RXRDY 0x0100

Signed-off-by: Grzegorz Bernacki gjb@semihalf.com --- board/digsy_mtc/digsy_mtc.c | 14 ++++++++++++++ include/configs/digsy_mtc.h | 7 +++++++ 2 files changed, 21 insertions(+), 0 deletions(-)
diff --git a/board/digsy_mtc/digsy_mtc.c b/board/digsy_mtc/digsy_mtc.c index 83d5864..36bbbc5 100644 --- a/board/digsy_mtc/digsy_mtc.c +++ b/board/digsy_mtc/digsy_mtc.c @@ -186,6 +186,10 @@ int checkboard(void)
int board_early_init_r(void) { +#ifdef CONFIG_MPC52XX_SPI + struct mpc5xxx_gpio *gpio = (struct mpc5xxx_gpio*)MPC5XXX_GPIO; + struct mpc5xxx_gpt *gpt = (struct mpc5xxx_gpt*)MPC5XXX_GPT; +#endif /* * Now, when we are in RAM, enable flash write access for detection * process. Note that CS_BOOT cannot be cleared when executing in @@ -202,6 +206,16 @@ int board_early_init_r(void) /* Low level USB init, required for proper kernel operation */ usb_cpu_init(); #endif +#ifdef CONFIG_MPC52XX_SPI + /* SPI on Tmr2/3/4/5 pins */ + gpio->port_config |= 0x20000000; + + /* GPT 6 Output Enable */ + gpt[6].emsr = 0x00000034 ; + /* GPT 7 Output Enable */ + gpt[7].emsr = 0x00000034 ; +#endif + return (0); }
diff --git a/include/configs/digsy_mtc.h b/include/configs/digsy_mtc.h index 66badd7..0cc2a8d 100644 --- a/include/configs/digsy_mtc.h +++ b/include/configs/digsy_mtc.h @@ -100,6 +100,7 @@ #define CONFIG_CMD_PING #define CONFIG_CMD_REGINFO #define CONFIG_CMD_SAVES +#define CONFIG_CMD_SPI #define CONFIG_CMD_USB
#if (TEXT_BASE == 0xFF000000) @@ -137,6 +138,12 @@ ""
/* + * SPI configuration + */ +#define CONFIG_HARD_SPI 1 +#define CONFIG_MPC52XX_SPI 1 + +/* * I2C configuration */ #define CONFIG_HARD_I2C 1

Hi Grzegorz,
Signed-off-by: Grzegorz Bernacki gjb@semihalf.com
board/digsy_mtc/digsy_mtc.c | 14 ++++++++++++++ include/configs/digsy_mtc.h | 7 +++++++ 2 files changed, 21 insertions(+), 0 deletions(-)
diff --git a/board/digsy_mtc/digsy_mtc.c b/board/digsy_mtc/digsy_mtc.c index 83d5864..36bbbc5 100644 --- a/board/digsy_mtc/digsy_mtc.c +++ b/board/digsy_mtc/digsy_mtc.c @@ -186,6 +186,10 @@ int checkboard(void)
int board_early_init_r(void) { +#ifdef CONFIG_MPC52XX_SPI
- struct mpc5xxx_gpio *gpio = (struct mpc5xxx_gpio*)MPC5XXX_GPIO;
- struct mpc5xxx_gpt *gpt = (struct mpc5xxx_gpt*)MPC5XXX_GPT;
+#endif /* * Now, when we are in RAM, enable flash write access for detection * process. Note that CS_BOOT cannot be cleared when executing in @@ -202,6 +206,16 @@ int board_early_init_r(void) /* Low level USB init, required for proper kernel operation */ usb_cpu_init(); #endif +#ifdef CONFIG_MPC52XX_SPI
- /* SPI on Tmr2/3/4/5 pins */
- gpio->port_config |= 0x20000000;
- /* GPT 6 Output Enable */
- gpt[6].emsr = 0x00000034 ;
- /* GPT 7 Output Enable */
- gpt[7].emsr = 0x00000034 ;
+#endif
You want to use accessor macros here.
Cheers Detlev

New command allows to: o check FW version o set LED status o set digital output status o get digital input status
Signed-off-by: Grzegorz Bernacki gjb@semihalf.com --- board/digsy_mtc/Makefile | 2 +- board/digsy_mtc/cmd_mtc.c | 287 +++++++++++++++++++++++++++++++++++++++++++++ board/digsy_mtc/cmd_mtc.h | 60 ++++++++++ 3 files changed, 348 insertions(+), 1 deletions(-) create mode 100644 board/digsy_mtc/cmd_mtc.c create mode 100644 board/digsy_mtc/cmd_mtc.h
diff --git a/board/digsy_mtc/Makefile b/board/digsy_mtc/Makefile index 7d659e5..0bededc 100644 --- a/board/digsy_mtc/Makefile +++ b/board/digsy_mtc/Makefile @@ -7,7 +7,7 @@ include $(TOPDIR)/config.mk
LIB = $(obj)lib$(BOARD).a
-COBJS := $(BOARD).o +COBJS := $(BOARD).o cmd_mtc.o
SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) OBJS := $(addprefix $(obj),$(COBJS)) diff --git a/board/digsy_mtc/cmd_mtc.c b/board/digsy_mtc/cmd_mtc.c new file mode 100644 index 0000000..c05d5da --- /dev/null +++ b/board/digsy_mtc/cmd_mtc.c @@ -0,0 +1,287 @@ +/* + * (C) Copyright 2009 + * Werner Pfister Pfister_Werner@intercontrol.de + * + * (C) Copyright 2009 Semihalf, Grzegorz Bernacki + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <common.h> +#include <command.h> +#include <mpc5xxx.h> +#include "spi.h" +#include "cmd_mtc.h" + +static const char *led_names[] = { + "diag", + "can1", + "can2", + "can3", + "can4", + "usbpwr", + "usbbusy", + "user1", + "user2", + "" +}; + +static void mtc_calculate_checksum(tx_msp_cmd *packet) +{ + int i; + uchar *buff; + + buff = (uchar *) packet; + + for (i = 0; i < 6; i++) + packet->cks += buff[i]; +} + +static int subcmd_led(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +{ + tx_msp_cmd pcmd; + rx_msp_cmd prx; + int err = 0; + int i; + + if (argc <= 2) { + printf("Usage:\n%s\n", cmdtp->help); + return -1; + } + + memset(&pcmd, 0, sizeof(pcmd)); + memset(&prx, 0, sizeof(prx)); + + pcmd.cmd = CMD_SET_LED; + + pcmd.cmd_val0 = 0xff; + for (i = 0; strlen(led_names[i]) != 0; i++) { + if (strncmp(argv[2], led_names[i], strlen(led_names[i])) == 0) { + pcmd.cmd_val0 = i; + break; + } + } + + if (pcmd.cmd_val0 == 0xff) { + printf("Usage:\n%s\n", cmdtp->help); + return -1; + } + + if (argc >= 4) { + if (strncmp(argv[3], "red", 3) == 0) + pcmd.cmd_val1 = 1; + else if (strncmp(argv[3], "green", 5) == 0) + pcmd.cmd_val1 = 2; + else if (strncmp(argv[3], "orange", 6) == 0) + pcmd.cmd_val1 = 3; + else + pcmd.cmd_val1 = 0; + } + + if (argc >= 5) + pcmd.cmd_val2 = simple_strtol(argv[4], NULL, 10); + else + pcmd.cmd_val2 = 0; + + mtc_calculate_checksum(&pcmd); + err = spi_xfer(NULL, MTC_TRANSFER_SIZE, &pcmd, &prx, + SPI_XFER_BEGIN | SPI_XFER_END); + + return err; +} + +static int subcmd_key(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +{ + tx_msp_cmd pcmd; + rx_msp_cmd prx; + int err = 0; + + memset(&pcmd, 0, sizeof(pcmd)); + memset(&prx, 0, sizeof(prx)); + + pcmd.cmd = CMD_GET_VIM; + + mtc_calculate_checksum(&pcmd); + err = spi_xfer(NULL, MTC_TRANSFER_SIZE, &pcmd, &prx, + SPI_XFER_BEGIN | SPI_XFER_END); + + if (!err) { + /* function returns '0' if key is pressed */ + err = (prx.input & 0x80) ? 0 : 1; + } + + return err; +} + +static int subcmd_digout(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +{ + tx_msp_cmd pcmd; + rx_msp_cmd prx; + int err = 0; + uchar channel_mask = 0; + + if (argc < 4) { + printf("Usage:\n%s\n", cmdtp->help); + return -1; + } + + if (strncmp(argv[2], "on", 2) == 0) + channel_mask |= 1; + if (strncmp(argv[3], "on", 2) == 0) + channel_mask |= 2; + + memset(&pcmd, 0, sizeof(pcmd)); + memset(&prx, 0, sizeof(prx)); + + pcmd.cmd = CMD_GET_VIM; + pcmd.user_out = channel_mask; + + mtc_calculate_checksum(&pcmd); + err = spi_xfer(NULL, MTC_TRANSFER_SIZE, &pcmd, &prx, + SPI_XFER_BEGIN | SPI_XFER_END); + + return err; +} + +static int subcmd_digin(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +{ + tx_msp_cmd pcmd; + rx_msp_cmd prx; + int err = 0; + uchar channel_num = 0; + + if (argc < 3) { + printf("Usage:\n%s\n", cmdtp->help); + return -1; + } + + channel_num = simple_strtol(argv[2], NULL, 10); + if ((channel_num != 1) && (channel_num != 2)) { + printf("invalid parameter\n"); + return -1; + } + + memset(&pcmd, 0, sizeof(pcmd)); + memset(&prx, 0, sizeof(prx)); + + pcmd.cmd = CMD_GET_VIM; + + mtc_calculate_checksum(&pcmd); + err = spi_xfer(NULL, MTC_TRANSFER_SIZE, &pcmd, &prx, + SPI_XFER_BEGIN | SPI_XFER_END); + + if (!err) { + /* function returns '0' when digin is on */ + err = (prx.input & channel_num) ? 0 : 1; + } + + return err; +} + +static int subcmd_appreg(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +{ + tx_msp_cmd pcmd; + rx_msp_cmd prx; + int err; + char buf[5]; + + /* read appreg */ + memset(&pcmd, 0, sizeof(pcmd)); + memset(&prx, 0, sizeof(prx)); + + pcmd.cmd = CMD_WD_PARA; + pcmd.cmd_val0 = 5; /* max. Count */ + pcmd.cmd_val1 = 5; /* max. Time */ + pcmd.cmd_val2 = 0; /* =0 means read appreg */ + + mtc_calculate_checksum(&pcmd); + err = spi_xfer(NULL, MTC_TRANSFER_SIZE, &pcmd, &prx, + SPI_XFER_BEGIN | SPI_XFER_END); + if (!err) { + sprintf(buf, "%d", prx.ack2); + setenv("appreg", buf); + } + + return err; +} + +static int subcmd_version(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +{ + tx_msp_cmd pcmd; + rx_msp_cmd prx; + int err = 0; + + memset(&pcmd, 0, sizeof(pcmd)); + memset(&prx, 0, sizeof(prx)); + + pcmd.cmd = CMD_FW_VERSION; + + mtc_calculate_checksum(&pcmd); + err = spi_xfer(NULL, MTC_TRANSFER_SIZE, &pcmd, &prx, + SPI_XFER_BEGIN | SPI_XFER_END); + + if (!err) { + printf("FW V%d.%d.%d / HW %d\n", + prx.ack0, prx.ack1, prx.ack3, prx.ack2); + } + + return err; +} + +int cmd_mtc(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +{ + int err = 0; + + if (argc > 1) { + if (strncmp(argv[1], "led", 3) == 0) + err = subcmd_led(cmdtp, flag, argc, argv); + else if (strncmp(argv[1], "key", 3) == 0) + err = subcmd_key(cmdtp, flag, argc, argv); + else if (strncmp(argv[1], "version", 7) == 0) + err = subcmd_version(cmdtp, flag, argc, argv); + else if (strncmp(argv[1], "appreg", 6) == 0) + err = subcmd_appreg(cmdtp, flag, argc, argv); + else if (strncmp(argv[1], "digin", 5) == 0) + err = subcmd_digin(cmdtp, flag, argc, argv); + else if (strncmp(argv[1], "digout", 6) == 0) + err = subcmd_digout(cmdtp, flag, argc, argv); + else { + printf("Usage:\n%s\n", cmdtp->help); + err = 1; + } + } else { + printf("Usage:\n%s\n", cmdtp->help); + err = 1; + } + + return err; +} + +U_BOOT_CMD(mtc, 5, 1, cmd_mtc, + "mtc - special commands for digsyMTC\n", + "mtc led [ledname] [state] [blink] - set state of leds\n" + " - lednames: diag can1 can2 can3 can4 usbpwr usbbusy user1 user2\n" + " - state: off red green orange\n" + " - blink: blink interval in 100ms steps (1 - 10; 0 = static)\n" + "mtc key - returns state of user key\n" + "mtc version - returns firmware version of supervisor uC\n" + "mtc appreg - reads appreg value and stores in environment variable" + "'appreg'\n" + "mtc digin channel - returns state of digital input (1 or 2)\n" + "mtc digout ch1 ch2 - sets digital outputs ('on' or 'off')\n"); diff --git a/board/digsy_mtc/cmd_mtc.h b/board/digsy_mtc/cmd_mtc.h new file mode 100644 index 0000000..db3aeed --- /dev/null +++ b/board/digsy_mtc/cmd_mtc.h @@ -0,0 +1,60 @@ +/* + * (C) Copyright 2009 + * Werner Pfister Pfister_Werner@intercontrol.de + * + * (C) Copyright 2009 Semihalf, Grzegorz Bernacki + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#ifndef CMD_MTC_H +#define CMD_MTC_H + +#define CMD_WD_PARA 0x02 +#define CMD_FW_VERSION 0x10 +#define CMD_GET_VIM 0x30 +#define CMD_SET_LED 0x40 + +typedef struct { + u8 cmd; + u8 sys_in; + u8 cmd_val0; + u8 cmd_val1; + u8 cmd_val2; + u8 user_out; + u8 cks; + u8 dummy1; + u8 dummy2; +} tx_msp_cmd; + +typedef struct { + u8 input; + u8 state; + u8 ack2; + u8 ack3; + u8 ack0; + u8 ack1; + u8 ack; + u8 dummy; + u8 cks; +} rx_msp_cmd; + +#define MTC_TRANSFER_SIZE (sizeof(tx_msp_cmd) * 8) + +#endif

Hi Grzegorz,
New command allows to: o check FW version o set LED status o set digital output status o get digital input status
Signed-off-by: Grzegorz Bernacki gjb@semihalf.com
board/digsy_mtc/Makefile | 2 +- board/digsy_mtc/cmd_mtc.c | 287 +++++++++++++++++++++++++++++++++++++++++++++ board/digsy_mtc/cmd_mtc.h | 60 ++++++++++ 3 files changed, 348 insertions(+), 1 deletions(-) create mode 100644 board/digsy_mtc/cmd_mtc.c create mode 100644 board/digsy_mtc/cmd_mtc.h
[...]
+int cmd_mtc(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +{
- int err = 0;
- if (argc > 1) {
if (strncmp(argv[1], "led", 3) == 0)
err = subcmd_led(cmdtp, flag, argc, argv);
else if (strncmp(argv[1], "key", 3) == 0)
err = subcmd_key(cmdtp, flag, argc, argv);
else if (strncmp(argv[1], "version", 7) == 0)
err = subcmd_version(cmdtp, flag, argc, argv);
else if (strncmp(argv[1], "appreg", 6) == 0)
err = subcmd_appreg(cmdtp, flag, argc, argv);
else if (strncmp(argv[1], "digin", 5) == 0)
err = subcmd_digin(cmdtp, flag, argc, argv);
else if (strncmp(argv[1], "digout", 6) == 0)
err = subcmd_digout(cmdtp, flag, argc, argv);
else {
printf("Usage:\n%s\n", cmdtp->help);
err = 1;
}
- } else {
printf("Usage:\n%s\n", cmdtp->help);
err = 1;
- }
- return err;
+}
Please use your own cmd_tblt_t to implement sub-commands re-using existing infrastructure. Check board/inka4x0/inkadiag.c for an example.
Cheers Detlev

Hi Grzegorz,
Signed-off-by: Grzegorz Bernacki gjb@semihalf.com
drivers/spi/Makefile | 1 + drivers/spi/mpc52xx_spi.c | 108 +++++++++++++++++++++++++++++++++++++++++++++ include/mpc5xxx.h | 18 +++++++ 3 files changed, 127 insertions(+), 0 deletions(-) create mode 100644 drivers/spi/mpc52xx_spi.c
diff --git a/drivers/spi/Makefile b/drivers/spi/Makefile index 1350f3e..1272c17 100644 --- a/drivers/spi/Makefile +++ b/drivers/spi/Makefile @@ -28,6 +28,7 @@ LIB := $(obj)libspi.a COBJS-$(CONFIG_ATMEL_DATAFLASH_SPI) += atmel_dataflash_spi.o COBJS-$(CONFIG_ATMEL_SPI) += atmel_spi.o COBJS-$(CONFIG_BFIN_SPI) += bfin_spi.o +COBJS-$(CONFIG_MPC52XX_SPI) += mpc52xx_spi.o COBJS-$(CONFIG_MPC8XXX_SPI) += mpc8xxx_spi.o COBJS-$(CONFIG_MXC_SPI) += mxc_spi.o COBJS-$(CONFIG_SOFT_SPI) += soft_spi.o diff --git a/drivers/spi/mpc52xx_spi.c b/drivers/spi/mpc52xx_spi.c new file mode 100644 index 0000000..6dae7ad --- /dev/null +++ b/drivers/spi/mpc52xx_spi.c @@ -0,0 +1,108 @@ +/*
- (C) Copyright 2009
- Frank Bodammer frank.bodammer@gcd-solutions.de
- (C) Copyright 2009 Semihalf, Grzegorz Bernacki
- See file CREDITS for list of people who contributed to this
- project.
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License as
- published by the Free Software Foundation; either version 2 of
- the License, or (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston,
- MA 02111-1307 USA
- */
+#include <common.h> +#include <malloc.h> +#include <spi.h> +#include <mpc5xxx.h>
+void spi_init(void) +{
- struct mpc5xxx_spi *spi = (struct mpc5xxx_spi *)MPC5XXX_SPI;
- /*
* Its important to use the correct order when initializing the
* registers
*/
- spi->ddr = 0x0F; /* set all SPI pins as output */
Here and below you want to use accessor macros - please check the whole patch.
Cheers Detlev
participants (2)
-
Detlev Zundel
-
Grzegorz Bernacki