summaryrefslogtreecommitdiff
path: root/glcddrivers/noritake800.c
diff options
context:
space:
mode:
Diffstat (limited to 'glcddrivers/noritake800.c')
-rw-r--r--glcddrivers/noritake800.c155
1 files changed, 100 insertions, 55 deletions
diff --git a/glcddrivers/noritake800.c b/glcddrivers/noritake800.c
index 89ae898..05eed6e 100644
--- a/glcddrivers/noritake800.c
+++ b/glcddrivers/noritake800.c
@@ -27,7 +27,9 @@
* This file is released under the GNU General Public License. Refer
* to the COPYING file distributed with this package.
*
- * (c) 2004 - 2011 Lucian Muresan <lucianm AT users.sourceforge.net>
+ * (c) 2004-2011 Lucian Muresan <lucianm AT users.sourceforge.net>
+ * (c) 2005-2010 Andreas Regel <andreas.regel AT powarman.de>
+ * (c) 2011 Wolfgang Astleitner <mrwastl AT users.sourceforge.net>
*/
#include <errno.h>
@@ -89,7 +91,7 @@ static const std::string kWiringMZ = "MZ";
#define SETPOSITION 0xff
-cDriverNoritake800::cDriverNoritake800(cDriverConfig * config)
+cDriverNoritake800::cDriverNoritake800(cDriverConfig * config) : cDriver(config)
{
int x = 0;
m_bGraphScreen0_On = true;
@@ -97,18 +99,15 @@ cDriverNoritake800::cDriverNoritake800(cDriverConfig * config)
// default initilaization for the wiring
m_nWiring = WIRING_LIQUIDMP3;
- m_Config = config;
- m_oldConfig = new cDriverConfig(* config);
-
m_pport = new cParallelPort();
m_nTimingAdjustCmd = 0;
m_nRefreshCounter = 0;
- width = m_Config->width; // 128
+ width = config->width; // 128
if (width <= 0)
width = 128;
- height = m_Config->height; // 64
+ height = config->height; // 64
if (height <= 0)
height = 64;
m_iSizeYb = (height + 7)/8; // 8
@@ -116,15 +115,15 @@ cDriverNoritake800::cDriverNoritake800(cDriverConfig * config)
//
// initialize wiring
//
- for (unsigned int i = 0; i < m_Config->options.size(); i++)
+ for (unsigned int i = 0; i < config->options.size(); i++)
{
- if (m_Config->options[i].name == "Wiring")
+ if (config->options[i].name == "Wiring")
{
- if (m_Config->options[i].value == kWiringLiquidmp3)
+ if (config->options[i].value == kWiringLiquidmp3)
{
m_nWiring = WIRING_LIQUIDMP3;
}
- else if (m_Config->options[i].value == kWiringMZ)
+ else if (config->options[i].value == kWiringMZ)
{
m_nWiring = WIRING_MZ;
}
@@ -182,7 +181,6 @@ cDriverNoritake800::~cDriverNoritake800()
}
delete[] m_pDrawMem;
delete[] m_pWiringMaskCache;
- delete m_oldConfig;
delete m_pport;
}
@@ -211,27 +209,27 @@ int cDriverNoritake800::DeInit()
int cDriverNoritake800::CheckSetup()
{
- if (m_Config->device != m_oldConfig->device ||
- m_Config->port != m_oldConfig->port ||
- m_Config->width != m_oldConfig->width ||
- m_Config->height != m_oldConfig->height)
+ if (config->device != oldConfig->device ||
+ config->port != oldConfig->port ||
+ config->width != oldConfig->width ||
+ config->height != oldConfig->height)
{
DeInit();
Init();
return 0;
}
- if (m_Config->brightness != m_oldConfig->brightness)
+ if (config->brightness != oldConfig->brightness)
{
- m_oldConfig->brightness = m_Config->brightness;
- SetBrightness(m_Config->brightness);
+ oldConfig->brightness = config->brightness;
+ SetBrightness(config->brightness);
}
- if (m_Config->upsideDown != m_oldConfig->upsideDown ||
- m_Config->invert != m_oldConfig->invert)
+ if (config->upsideDown != oldConfig->upsideDown ||
+ config->invert != oldConfig->invert)
{
- m_oldConfig->upsideDown = m_Config->upsideDown;
- m_oldConfig->invert = m_Config->invert;
+ oldConfig->upsideDown = config->upsideDown;
+ oldConfig->invert = config->invert;
return 1;
}
return 0;
@@ -242,23 +240,31 @@ int cDriverNoritake800::Init()
int x;
struct timeval tv1, tv2;
- if (m_Config->device == "")
+ if (config->device == "" && m_pport->IsDirectIO())
{
// use DirectIO
- if (m_pport->Open(m_Config->port) != 0)
+ syslog(LOG_INFO, "INFO (cDriverNoritake800::Init): using Direct IO port access\n");
+ if (m_pport->Open(config->port) != 0)
+ {
+ syslog(LOG_ERR, "ERROR (cDriverNoritake800::Init): cannot open configured port %x, Err: %s\n", config->port, strerror(errno));
return -1;
+ }
uSleep(10);
}
else
{
// use ppdev
- if (m_pport->Open(m_Config->device.c_str()) != 0)
+ syslog(LOG_INFO, "INFO (cDriverNoritake800::Init): using PPDEV port access\n");
+ if (m_pport->Open(config->device.c_str()) != 0)
+ {
+ syslog(LOG_ERR, "ERROR (cDriverNoritake800::Init): cannot open configured device %s, Err: %s\n", config->device.c_str(), strerror(errno));
return -1;
+ }
}
if (nSleepInit() != 0)
{
- syslog(LOG_ERR, "%s: INFO: cannot change wait parameters Err: %s (cDriver::Init)\n", m_Config->name.c_str(), strerror(errno));
+ syslog(LOG_INFO, "INFO (cDriverNoritake800::Init): cannot change wait parameters Err: %s\n", strerror(errno));
m_bSleepIsInit = false;
}
else
@@ -266,9 +272,14 @@ int cDriverNoritake800::Init()
m_bSleepIsInit = true;
}
+ // claim port if not already done
+ if (!m_pport->Claim())
+ {
+ syslog(LOG_ERR, "ERROR (cDriverNoritake800::Init): cannot claim port Err: %s\n", strerror(errno));
+ return -1;
+ }
// benchmark port access
- m_pport->Claim();
- syslog(LOG_DEBUG, "%s: benchmark started.\n", m_Config->name.c_str());
+ syslog(LOG_DEBUG, "%s: benchmark started.\n", config->name.c_str());
gettimeofday(&tv1, 0);
int nBenchIterations = 10000;
for (x = 0; x < nBenchIterations; x++)
@@ -279,7 +290,8 @@ int cDriverNoritake800::Init()
nSleepDeInit();
// calculate port command duration in nanoseconds
m_nTimingAdjustCmd = long(double((tv2.tv_sec - tv1.tv_sec) * 1000000000 + (tv2.tv_usec - tv1.tv_usec) * 1000) / double(nBenchIterations));
- syslog(LOG_DEBUG, "%s: benchmark stopped. Time for Port Command: %ldns\n", m_Config->name.c_str(), m_nTimingAdjustCmd);
+ syslog(LOG_DEBUG, "%s: benchmark stopped. Time for Port Command: %ldns\n", config->name.c_str(), m_nTimingAdjustCmd);
+
m_pport->Release();
// initialize display
@@ -289,13 +301,13 @@ int cDriverNoritake800::Init()
for (n=0; n < 15; n++)
{
N800Cmd(0x62);
- nSleep(100 + (100 * m_Config->adjustTiming) - m_nTimingAdjustCmd);
+ nSleep(100 + (100 * config->adjustTiming) - m_nTimingAdjustCmd);
N800Cmd(n);
- nSleep(100 + (100 * m_Config->adjustTiming) - m_nTimingAdjustCmd);
+ nSleep(100 + (100 * config->adjustTiming) - m_nTimingAdjustCmd);
N800Data(0xff);
- nSleep(100 + (100 * m_Config->adjustTiming) - m_nTimingAdjustCmd);
+ nSleep(100 + (100 * config->adjustTiming) - m_nTimingAdjustCmd);
}
- nSleep(100 + (100 * m_Config->adjustTiming) - m_nTimingAdjustCmd);
+ nSleep(100 + (100 * config->adjustTiming) - m_nTimingAdjustCmd);
N800Cmd(LAYERSOFF | LAYER0ON); // layer 0 of the graphic RAM on
@@ -311,15 +323,15 @@ int cDriverNoritake800::Init()
m_pport->Release();
- *m_oldConfig = *m_Config;
+ //*oldConfig = *config;
// Set Display SetBrightness
- SetBrightness(m_Config->brightness);
+ SetBrightness(config->brightness);
// clear display
ClearVFDMem();
Refresh(true);
- syslog(LOG_INFO, "%s: initialization done.\n", m_Config->name.c_str());
+ syslog(LOG_INFO, "INFO (cDriverNoritake800::Init): initialization done.\n");
return 0;
}
@@ -333,14 +345,19 @@ void cDriverNoritake800::Refresh(bool refreshAll)
if (!m_pVFDMem || !m_pDrawMem)
return;
- if (m_Config->refreshDisplay > 0)
+ if (config->refreshDisplay > 0)
{
- m_nRefreshCounter = (m_nRefreshCounter + 1) % m_Config->refreshDisplay;
+ m_nRefreshCounter = (m_nRefreshCounter + 1) % config->refreshDisplay;
if (m_nRefreshCounter == 0)
refreshAll = true;
}
- m_pport->Claim();
+ if (!m_pport->Claim())
+ {
+ syslog(LOG_ERR, "ERROR (cDriverNoritake800::Refresh): cannot claim port Err: %s\n", strerror(errno));
+ return;
+ }
+
for (xb = 0; xb < width; ++xb)
{
for (yb = 0; yb < m_iSizeYb; ++yb)
@@ -355,57 +372,74 @@ void cDriverNoritake800::Refresh(bool refreshAll)
m_nRefreshCounter = 0;
// actually write to display
N800WriteByte(
- (m_pVFDMem[xb][yb]) ^ ((m_Config->invert != 0) ? 0xff : 0x00),
+ (m_pVFDMem[xb][yb]) ^ ((config->invert != 0) ? 0xff : 0x00),
xb,
yb,
0);
}
}
}
+
m_pport->Release();
}
void cDriverNoritake800::N800Cmd(unsigned char data)
{
+ if (!m_pport->Claim())
+ {
+ syslog(LOG_ERR, "ERROR (cDriverNoritake800::N800Cmd): cannot claim port Err: %s\n", strerror(errno));
+ return;
+ }
+
if (m_bSleepIsInit)
nSleepInit();
// set direction to "port_output" & C/D to C
- m_pport->WriteControl(m_pWiringMaskCache[0x00]);
+ m_pport->SetDirection(kForward);
// write to data port
m_pport->WriteData(data);
- nSleep(100 + (100 * m_Config->adjustTiming) - m_nTimingAdjustCmd);
+ nSleep(100 + (100 * config->adjustTiming) - m_nTimingAdjustCmd);
// set /WR on the control port
m_pport->WriteControl(m_pWiringMaskCache[VFDSGN_WR]);
- nSleep(100 + (100 * m_Config->adjustTiming) - m_nTimingAdjustCmd);
+ nSleep(100 + (100 * config->adjustTiming) - m_nTimingAdjustCmd);
// reset /WR on the control port
m_pport->WriteControl(m_pWiringMaskCache[0x00]);
- nSleep(100 + (100 * m_Config->adjustTiming) - m_nTimingAdjustCmd);
+ nSleep(100 + (100 * config->adjustTiming) - m_nTimingAdjustCmd);
// set direction to "port_input"
- m_pport->WriteControl(LPT_CTL_HI_DIR | m_pWiringMaskCache[0x00]);
+ m_pport->SetDirection(kReverse);
+
+ m_pport->Release();
}
void cDriverNoritake800::N800Data(unsigned char data)
{
+ if (!m_pport->Claim())
+ {
+ syslog(LOG_ERR, "ERROR (cDriverNoritake800::N800Data): cannot claim port Err: %s\n", strerror(errno));
+ return;
+ }
+
if (m_bSleepIsInit)
nSleepInit();
// set direction to "port_output" & C/D to C
- m_pport->WriteControl(m_pWiringMaskCache[VFDSGN_CD]);
+ m_pport->SetDirection(kForward);
// write to data port
m_pport->WriteData(data);
- nSleep(100 + (100 * m_Config->adjustTiming) - m_nTimingAdjustCmd);
+ nSleep(100 + (100 * config->adjustTiming) - m_nTimingAdjustCmd);
// set /WR on the control port
m_pport->WriteControl(m_pWiringMaskCache[VFDSGN_CD | VFDSGN_WR]);
- nSleep(100 + (100 * m_Config->adjustTiming) - m_nTimingAdjustCmd);
+ nSleep(100 + (100 * config->adjustTiming) - m_nTimingAdjustCmd);
// reset /WR on the control port
m_pport->WriteControl(m_pWiringMaskCache[VFDSGN_CD]);
- nSleep(100 + (100 * m_Config->adjustTiming) - m_nTimingAdjustCmd);
+ nSleep(100 + (100 * config->adjustTiming) - m_nTimingAdjustCmd);
// set direction to "port_input"
- m_pport->WriteControl(LPT_CTL_HI_DIR | m_pWiringMaskCache[0x00]);
+ m_pport->SetDirection(kReverse);
+
+ m_pport->Release();
}
-void cDriverNoritake800::SetPixel(int x, int y)
+void cDriverNoritake800::SetPixel(int x, int y, uint32_t data)
{
unsigned char c;
@@ -417,7 +451,7 @@ void cDriverNoritake800::SetPixel(int x, int y)
if (y >= height || y < 0)
return;
- if (m_Config->upsideDown)
+ if (config->upsideDown)
{
x = width - 1 - x;
y = height - 1 - y;
@@ -425,9 +459,13 @@ void cDriverNoritake800::SetPixel(int x, int y)
c = 0x80 >> (y % 8);
- m_pDrawMem[x][y/8] |= c;
+ if (data == GRAPHLCD_White)
+ m_pDrawMem[x][y/8] |= c;
+ else
+ m_pDrawMem[x][y/8] &= ( 0xFF ^ c);
}
+#if 0
void cDriverNoritake800::Set8Pixels(int x, int y, unsigned char data)
{
int n;
@@ -441,9 +479,16 @@ void cDriverNoritake800::Set8Pixels(int x, int y, unsigned char data)
SetPixel(x + n, y);
}
}
+#endif
void cDriverNoritake800::SetBrightness(unsigned int percent)
{
+ if (!m_pport->Claim())
+ {
+ syslog(LOG_ERR, "ERROR (cDriverNoritake800::SetBrightness): cannot claim port Err: %s\n", strerror(errno));
+ return;
+ }
+
// display can do 16 brightness levels,
// 0 = light
// 15 = dark
@@ -455,8 +500,8 @@ void cDriverNoritake800::SetBrightness(unsigned int percent)
}
unsigned int darkness = 16 - (unsigned int)((double)percent * 16.0 / 100.0);
- m_pport->Claim();
N800Cmd(0x40 + (darkness & 0xf));
+
m_pport->Release();
}