You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
1.7 KiB
77 lines
1.7 KiB
/* |
|
* ssp-uart.c SPI via SSP |
|
* Copyright (C) 2011, Mark F. Brown <mark.f.brown@intel.com> Intel Corporation. |
|
* |
|
* This program is free software; you can redistribute it and/or modify it |
|
* under the terms and conditions of the GNU General Public License, |
|
* version 2, as published by the Free Software Foundation. |
|
* |
|
* This program is distributed in the hope 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., |
|
* 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. |
|
* |
|
*/ |
|
|
|
#include "ssp-uart.h" |
|
#include "bootstub.h" |
|
|
|
#define SSP_TIMEOUT 0xAFF |
|
#define SSP_SLAVE 0x02 /* Slave select */ |
|
#define SSP_SSCR0 0x00C0008F |
|
#define SSP_SSCR1 0x10000000 |
|
|
|
static int ssp_inited = 0; |
|
static volatile struct ssp_reg *pspi = 0; |
|
|
|
#define WRITE_DATA (2<<14) |
|
|
|
static void ssp_init() |
|
{ |
|
pspi = (struct ssp_reg*)TNG_SSP5_ADDR_BASE; |
|
pspi->SSPx_SSFS = SSP_SLAVE; |
|
pspi->SSPx_SSCR1 = SSP_SSCR1; |
|
pspi->SSPx_SSCR0 = SSP_SSCR0; |
|
|
|
ssp_inited = 1; |
|
} |
|
|
|
static void ssp_max3110_putc(char c) |
|
{ |
|
vu32 SSCR0 = 0; |
|
vu32 i; |
|
|
|
pspi = (struct ssp_reg*)TNG_SSP5_ADDR_BASE; |
|
SSCR0 = (WRITE_DATA | c); |
|
pspi->SSPx_SSDR = SSCR0; |
|
|
|
for (i = 0; i < SSP_TIMEOUT; i++) |
|
{ |
|
SSCR0 = pspi->SSPx_SSSR; |
|
if ((SSCR0 & 0xF00) == 0) break; |
|
} |
|
|
|
SSCR0 = pspi->SSPx_SSDR; |
|
} |
|
|
|
void bs_ssp_printk(const char *str) |
|
{ |
|
if (!str) |
|
return; |
|
|
|
if (!ssp_inited) |
|
{ |
|
ssp_init(); |
|
} |
|
|
|
while (*str) { |
|
if (*str == '\n') |
|
ssp_max3110_putc('\r'); |
|
|
|
ssp_max3110_putc(*str++); |
|
} |
|
}
|
|
|