////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
//
|
//
|
// Filename: display.c
|
// Filename: display.c
|
//
|
//
|
// Project: CMod S6 System on a Chip, ZipCPU demonstration project
|
// Project: CMod S6 System on a Chip, ZipCPU demonstration project
|
//
|
//
|
// Purpose: A device driver for the SPI controlled display. The primary
|
// Purpose: A device driver for the SPI controlled display. The primary
|
// purpose of this "device" is to output SPI instructions, though,
|
// purpose of this "device" is to output SPI instructions, though,
|
// not to handle screen position or to optimize data set to the display.
|
// not to handle screen position or to optimize data set to the display.
|
//
|
//
|
// Creator: Dan Gisselquist, Ph.D.
|
// Creator: Dan Gisselquist, Ph.D.
|
// Gisselquist Technology, LLC
|
// Gisselquist Technology, LLC
|
//
|
//
|
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
//
|
//
|
// Copyright (C) 2015-2016, Gisselquist Technology, LLC
|
// Copyright (C) 2015-2017, Gisselquist Technology, LLC
|
//
|
//
|
// This program is free software (firmware): you can redistribute it and/or
|
// This program is free software (firmware): you can redistribute it and/or
|
// modify it under the terms of the GNU General Public License as published
|
// modify it under the terms of the GNU General Public License as published
|
// by the Free Software Foundation, either version 3 of the License, or (at
|
// by the Free Software Foundation, either version 3 of the License, or (at
|
// your option) any later version.
|
// your option) any later version.
|
//
|
//
|
// This program is distributed in the hope that it will be useful, but WITHOUT
|
// This program is distributed in the hope that it will be useful, but WITHOUT
|
// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
|
// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
|
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
// for more details.
|
// for more details.
|
//
|
//
|
// You should have received a copy of the GNU General Public License along
|
// You should have received a copy of the GNU General Public License along
|
// with this program. (It's in the $(ROOT)/doc directory, run make with no
|
// with this program. (It's in the $(ROOT)/doc directory, run make with no
|
// target there if the PDF file isn't present.) If not, see
|
// target there if the PDF file isn't present.) If not, see
|
// <http://www.gnu.org/licenses/> for a copy.
|
// <http://www.gnu.org/licenses/> for a copy.
|
//
|
//
|
// License: GPL, v3, as defined and found on www.gnu.org,
|
// License: GPL, v3, as defined and found on www.gnu.org,
|
// http://www.gnu.org/licenses/gpl.html
|
// http://www.gnu.org/licenses/gpl.html
|
//
|
//
|
//
|
//
|
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
//
|
//
|
//
|
//
|
#include "board.h"
|
#include "board.h"
|
#include "display.h"
|
#include "display.h"
|
|
|
static void dispwait(void) {
|
static void dispwait(void) {
|
// Slow us down to the speed the display can handle
|
// Slow us down to the speed the display can handle
|
// We want to delay about 0x800 clocks.
|
// We want to delay about 0x800 clocks.
|
// Three instructions per loop,
|
// Three instructions per loop,
|
// LBL:
|
// LBL:
|
// NOOP
|
// NOOP
|
// ADD -1,CTR
|
// ADD -1,CTR
|
// BNZ LBL
|
// BNZ LBL
|
// 40 clocks per instruction, as required by the SPI flash memory
|
// 40 clocks per instruction, as required by the SPI flash memory
|
int i = 18;
|
int i = 18;
|
do {
|
do {
|
asm("noop");
|
asm("noop");
|
} while(i-->0);
|
} while(i-->0);
|
}
|
}
|
|
|
void dispchar(int ch) {
|
void dispchar(char ch) {
|
if (!ch) // Don't display null characters
|
if (!ch) // Don't display null characters
|
return;
|
return;
|
if (ch&(~0x0ff)) { // Multiple characters to display
|
int ich = ch;
|
int v = (ch>>24)&0x0ff;
|
|
if (v) {
|
|
dispchar(v);
|
|
v = (ch>>16)&0x0ff;
|
|
if (v) {
|
|
dispchar(v);
|
|
v = (ch>> 8)&0x0ff;
|
|
if (v) {
|
|
dispchar(v);
|
|
dispchar(ch&0x0ff);
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
IOSPACE *sys = (IOSPACE *)IOADDR;
|
|
// Send the character
|
// Send the character
|
for(int i=0; i<8; i++) {
|
for(int i=0; i<8; i++) {
|
int gpiov = GPOCLRV(GPO_MOSI|GPO_SCK|GPO_SS);
|
int gpiov = GPOCLRV(GPO_MOSI|GPO_SCK|GPO_SS);
|
if (ch&0x80)
|
if (ich&0x80)
|
gpiov |= GPOSETV(GPO_MOSI);
|
gpiov |= GPOSETV(GPO_MOSI);
|
sys->io_gpio = gpiov;
|
_sys->io_gpio = gpiov;
|
dispwait();
|
dispwait();
|
sys->io_gpio = GPOSETV(GPO_SCK);
|
_sys->io_gpio = GPOSETV(GPO_SCK);
|
dispwait();
|
dispwait();
|
ch<<=1;
|
ich<<=1;
|
}
|
}
|
|
|
// Turn off the clock
|
// Turn off the clock
|
sys->io_gpio = GPOCLRV(GPO_SCK);
|
_sys->io_gpio = GPOCLRV(GPO_SCK);
|
dispwait();
|
dispwait();
|
// Then the port
|
// Then the port
|
sys->io_gpio = GPOSETV(GPO_SS);
|
_sys->io_gpio = GPOSETV(GPO_SS);
|
dispwait();
|
dispwait();
|
}
|
}
|
}
|
|
|
|
#ifdef ZIPOS
|
#ifdef ZIPOS
|
#include "../zipos/ktraps.h"
|
#include "../zipos/ktraps.h"
|
#include "../zipos/kfildes.h"
|
#include "../zipos/kfildes.h"
|
void display_task(void) {
|
void display_task(void) {
|
while(1) {
|
while(1) {
|
int ch;
|
char ch;
|
read(FILENO_STDIN, &ch, 1);
|
read(FILENO_STDIN, &ch, 1);
|
dispchar(ch);
|
dispchar(ch);
|
}
|
}
|
}
|
}
|
#endif
|
#endif
|
|
|