summaryrefslogtreecommitdiff
authormickeyl <mickeyl>2003-12-29 16:51:07 (UTC)
committer mickeyl <mickeyl>2003-12-29 16:51:07 (UTC)
commit8224dfc07a698d4c40cb240d315dc81b67512015 (patch) (side-by-side diff)
tree0cdbb05aab54948421c873ccd25881caf1e474c5
parentdae677b6e29e2a0efb7128bcc4b0d87bf2b535dd (diff)
downloadopie-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
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie/odevice.cpp136
-rw-r--r--libopie/odevice.h14
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);
/**