author | mickeyl <mickeyl> | 2003-12-29 16:51:07 (UTC) |
---|---|---|
committer | mickeyl <mickeyl> | 2003-12-29 16:51:07 (UTC) |
commit | 8224dfc07a698d4c40cb240d315dc81b67512015 (patch) (side-by-side diff) | |
tree | 0cdbb05aab54948421c873ccd25881caf1e474c5 | |
parent | dae677b6e29e2a0efb7128bcc4b0d87bf2b535dd (diff) | |
download | opie-8224dfc07a698d4c40cb240d315dc81b67512015.zip opie-8224dfc07a698d4c40cb240d315dc81b67512015.tar.gz opie-8224dfc07a698d4c40cb240d315dc81b67512015.tar.bz2 |
- add fine granular backlight support for devices with the corgi backlight interface
- add hinge sensor framework for devices with hinge sensors
-rw-r--r-- | libopie/odevice.cpp | 136 | ||||
-rw-r--r-- | libopie/odevice.h | 14 |
2 files changed, 113 insertions, 37 deletions
diff --git a/libopie/odevice.cpp b/libopie/odevice.cpp index e24e043..bc09e92 100644 --- a/libopie/odevice.cpp +++ b/libopie/odevice.cpp @@ -139,11 +139,14 @@ public: virtual QValueList <OLedState> ledStateList ( OLed led ) const; 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? + + // Does this break BC? virtual bool suspend ( ); virtual Transformation rotation ( ) const; virtual ODirection direction ( ) const; @@ -532,9 +535,9 @@ void ODevice::initButtons ( ) } ODevice::~ODevice ( ) { -// we leak m_devicebuttons and m_cpu_frequency +// we leak m_devicebuttons and m_cpu_frequency // but it's a singleton and it is not so importantant // -zecke delete d; } @@ -822,24 +825,40 @@ bool ODevice::hasLightSensor ( ) const return false; } /** - * @return a value from the light senso + * @return a value from the light sensor */ int ODevice::readLightSensor ( ) { return -1; } /** - * @return the light sensor resolution whatever that is ;) + * @return the light sensor resolution */ int ODevice::lightSensorResolution ( ) const { return 0; } /** + * @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 { @@ -848,9 +867,9 @@ const QStrList &ODevice::allowedCpuFrequencies ( ) const /** * Set desired CPU frequency - * + * * @param index index into d->m_cpu_frequencies of the frequency to be set */ bool ODevice::setCurrentCpuFrequency(uint index) { @@ -1781,9 +1800,9 @@ void Zaurus::buzzer ( int sound ) soundname = "keysound"; break; default: soundname = "alarm"; - + } } // If a soundname is defined, we expect that this device has @@ -1944,35 +1963,51 @@ 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 (m_embedix) { - if (( fd = ::open ( "/dev/fl", O_WRONLY )) >= 0 ) { - int bl = ( bright * 4 + 127 ) / 255; // only 4 steps on zaurus - if ( bright && !bl ) - bl = 1; - res = ( ::ioctl ( fd, FL_IOCTL_STEP_CONTRAST, bl ) == 0 ); - ::close ( fd ); - } - } else { -#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 ); - ::close ( fd ); - } - } - return res; + bool res = false; + int fd; + + if ( bright > 255 ) bright = 255; + if ( bright < 0 ) bright = 0; + + 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 ) + bl = 1; + res = ( ::ioctl ( fd, FL_IOCTL_STEP_CONTRAST, bl ) == 0 ); + ::close ( fd ); + } + } + } + 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 ); + ::close ( fd ); + } + } + return res; } bool Zaurus::suspend ( ) { @@ -2072,13 +2107,44 @@ 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 @@ -142,8 +142,15 @@ enum ODirection { CCW = 1, 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 * hardware key mappings. @@ -206,10 +213,10 @@ public: // and in your subclass do do overwrite // protected virtual int virtual_hook(int, void *) // which is defined below -// input / output - //FIXME playAlarmSound and al might be better -zecke + // input / output + //FIXME playAlarmSound and al might be better -zecke virtual void alarmSound ( ); virtual void keySound ( ); virtual void touchSound ( ); @@ -221,8 +228,11 @@ public: virtual bool hasLightSensor ( ) const; virtual int readLightSensor ( ); virtual int lightSensorResolution ( ) const; + virtual bool hasHingeSensor ( ) const; + virtual OHingeStatus readHingeSensor ( ); + const QStrList &allowedCpuFrequencies() const; bool setCurrentCpuFrequency(uint index); /** |