summaryrefslogtreecommitdiff
path: root/libopie/odevice.cpp
Side-by-side diff
Diffstat (limited to 'libopie/odevice.cpp') (more/less context) (show whitespace changes)
-rw-r--r--libopie/odevice.cpp90
1 files changed, 78 insertions, 12 deletions
diff --git a/libopie/odevice.cpp b/libopie/odevice.cpp
index e24e043..bc09e92 100644
--- a/libopie/odevice.cpp
+++ b/libopie/odevice.cpp
@@ -140,6 +140,9 @@ public:
virtual OLedState ledState ( OLed led ) const;
virtual bool setLedState ( OLed led, OLedState st );
+ virtual bool hasHingeSensor() const;
+ virtual OHingeStatus readHingeSensor();
+
static bool isZaurus();
// Does this break BC?
@@ -823,7 +826,7 @@ bool ODevice::hasLightSensor ( ) const
}
/**
- * @return a value from the light senso
+ * @return a value from the light sensor
*/
int ODevice::readLightSensor ( )
{
@@ -831,7 +834,7 @@ int ODevice::readLightSensor ( )
}
/**
- * @return the light sensor resolution whatever that is ;)
+ * @return the light sensor resolution
*/
int ODevice::lightSensorResolution ( ) const
{
@@ -839,6 +842,22 @@ int ODevice::lightSensorResolution ( ) const
}
/**
+ * @return if the device has a hinge sensor
+ */
+bool ODevice::hasHingeSensor ( ) const
+{
+ return false;
+}
+
+/**
+ * @return a value from the hinge sensor
+ */
+OHingeStatus ODevice::readHingeSensor ( )
+{
+ return CASE_UNKNOWN;
+}
+
+/**
* @return a list with CPU frequencies supported by the hardware
*/
const QStrList &ODevice::allowedCpuFrequencies ( ) const
@@ -1945,18 +1964,30 @@ bool Zaurus::setSoftSuspend ( bool soft )
bool Zaurus::setDisplayBrightness ( int bright )
{
-// FIXME The C7x0 have a proc-interface (/proc/drivers/corgi-bl) which
-// is nice to use. Currently it exposes 16+1 levels. Implement this!
-// (or wait for kergoth unifying the interfaces in the OpenZaurus kernel.)
bool res = false;
int fd;
- if ( bright > 255 )
- bright = 255;
- if ( bright < 0 )
- bright = 0;
+ if ( bright > 255 ) bright = 255;
+ if ( bright < 0 ) bright = 0;
- if (m_embedix) {
+ if ( m_embedix )
+ {
+ if ( d->m_model == Model_Zaurus_SLC7x0 )
+ {
+ // special treatment for devices with the corgi backlight interface
+ if (( fd = ::open ( "/proc/driver/fl/corgi-bl", O_WRONLY )) >= 0 )
+ {
+ if ( bright > 0x11 ) bright = 0x11;
+ char writeCommand[100];
+ const int count = sprintf( writeCommand, "0x%x\n", bright );
+ res = ( ::write ( fd, writeCommand, count ) != -1 );
+ ::close ( fd );
+ }
+ return res;
+ }
+ else
+ {
+ // standard treatment for devices with the dumb embedix frontlight interface
if (( fd = ::open ( "/dev/fl", O_WRONLY )) >= 0 ) {
int bl = ( bright * 4 + 127 ) / 255; // only 4 steps on zaurus
if ( bright && !bl )
@@ -1964,7 +1995,11 @@ bool Zaurus::setDisplayBrightness ( int bright )
res = ( ::ioctl ( fd, FL_IOCTL_STEP_CONTRAST, bl ) == 0 );
::close ( fd );
}
- } else {
+ }
+ }
+ else
+ {
+ // special treatment for the OpenZaurus unified interface
#define FB_BACKLIGHT_SET_BRIGHTNESS _IOW('F', 1, u_int) /* set brightness */
if (( fd = ::open ( "/dev/fb0", O_WRONLY )) >= 0 ) {
res = ( ::ioctl ( fd , FB_BACKLIGHT_SET_BRIGHTNESS, bright ) == 0 );
@@ -2073,11 +2108,42 @@ ODirection Zaurus::direction ( ) const
int Zaurus::displayBrightnessResolution ( ) const
{
if (m_embedix)
- return 5;
+ return d->m_model == Model_Zaurus_SLC7x0 ? 18 : 5;
else
return 256;
}
+bool Zaurus::hasHingeSensor() const
+{
+ return d->m_model == Model_Zaurus_SLC7x0;
+}
+
+OHingeStatus Zaurus::readHingeSensor()
+{
+ int handle = ::open("/dev/apm_bios", O_RDWR|O_NONBLOCK);
+ if (handle == -1)
+ {
+ qWarning("Zaurus::readHingeSensor() - failed (%s)", "unknown reason" ); //FIXME: use strerror
+ return CASE_UNKNOWN;
+ }
+ else
+ {
+ int retval = ::ioctl(handle, SHARP_IOCTL_GET_ROTATION);
+ ::close (handle);
+ if ( retval == CASE_CLOSED || retval == CASE_PORTRAIT || retval == CASE_LANDSCAPE )
+ {
+ qDebug( "Zaurus::readHingeSensor() - result = %d", retval );
+ return static_cast<OHingeStatus>( retval );
+ }
+ else
+ {
+ qWarning("Zaurus::readHingeSensor() - couldn't compute hinge status!" );
+ return CASE_UNKNOWN;
+ }
+ }
+}
+
+
/**************************************************
*
* SIMpad