-rw-r--r-- | libopie/odevice.cpp | 90 | ||||
-rw-r--r-- | libopie/odevice.h | 10 |
2 files changed, 88 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 diff --git a/libopie/odevice.h b/libopie/odevice.h index 8273761..ee0b0ec 100644 --- a/libopie/odevice.h +++ b/libopie/odevice.h @@ -143,6 +143,13 @@ enum ODirection { Flip = 2, }; +enum OHingeStatus { + CASE_CLOSED = 3, + CASE_PORTRAIT = 2, + CASE_LANDSCAPE = 0, + CASE_UNKNOWN = 1, +}; + /** * A singleton which gives informations about device specefic option * like the Hardware used, LEDs, the Base Distribution and @@ -222,6 +229,9 @@ public: virtual int readLightSensor ( ); virtual int lightSensorResolution ( ) const; + virtual bool hasHingeSensor ( ) const; + virtual OHingeStatus readHingeSensor ( ); + const QStrList &allowedCpuFrequencies() const; bool setCurrentCpuFrequency(uint index); |