summaryrefslogtreecommitdiff
path: root/libopie/odevice.cpp
authorsandman <sandman>2002-09-05 21:23:09 (UTC)
committer sandman <sandman>2002-09-05 21:23:09 (UTC)
commitbaea6aaf4f0c9672a4383470a9389bca1a20bdba (patch) (side-by-side diff)
treedef42730d45a0aa47eeb4f637cf140633b8d2c7c /libopie/odevice.cpp
parent930e178bf07eb5685852f56a3ecb05b8b823f42c (diff)
downloadopie-baea6aaf4f0c9672a4383470a9389bca1a20bdba.zip
opie-baea6aaf4f0c9672a4383470a9389bca1a20bdba.tar.gz
opie-baea6aaf4f0c9672a4383470a9389bca1a20bdba.tar.bz2
- added a setPowerButtonHandler() for iPAQs and Zs
(-> disableAPM() in launcher can be removed) - another try to fix the OZ suspend code
Diffstat (limited to 'libopie/odevice.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie/odevice.cpp70
1 files changed, 65 insertions, 5 deletions
diff --git a/libopie/odevice.cpp b/libopie/odevice.cpp
index 2f40731..95fd6bd 100644
--- a/libopie/odevice.cpp
+++ b/libopie/odevice.cpp
@@ -50,36 +50,40 @@ public:
OSystem m_system;
QString m_sysverstr;
OLedState m_leds [4]; // just for convenience ...
};
class ODeviceIPAQ : public ODevice {
protected:
virtual void init ( );
public:
+ virtual bool setPowerButtonHandler ( PowerButtonHandler h );
+
virtual void alarmSound ( );
virtual uint hasLeds ( ) const;
virtual OLedState led ( uint which ) const;
virtual bool setLed ( uint which, OLedState st );
};
class ODeviceZaurus : public ODevice {
protected:
virtual void init ( );
public:
+ virtual bool setPowerButtonHandler ( PowerButtonHandler h );
+
virtual void alarmSound ( );
virtual void keySound ( );
virtual void touchSound ( );
virtual uint hasLeds ( ) const;
virtual OLedState led ( uint which ) const;
virtual bool setLed ( uint which, OLedState st );
protected:
virtual void buzzer ( int snd );
};
@@ -122,42 +126,47 @@ void ODevice::init ( )
ODevice::~ODevice ( )
{
delete d;
}
//#include <linux/apm_bios.h>
//#define APM_IOC_SUSPEND _IO('A',2)
#define APM_IOC_SUSPEND (( 0<<30 ) | ( 'A'<<8 ) | ( 2 ) | ( 0<<16 ))
+bool ODevice::setPowerButtonHandler ( ODevice::PowerButtonHandler )
+{
+ return false;
+}
+
bool ODevice::suspend ( )
{
if ( d-> m_model == OMODEL_Unknown ) // better don't suspend in qvfb / on unkown devices
return false;
int fd;
bool res = false;
if ((( fd = ::open ( "/dev/apm_bios", O_RDWR )) >= 0 ) ||
(( fd = ::open ( "/dev/misc/apm_bios",O_RDWR )) >= 0 )) {
struct timeval tvs, tvn;
::signal ( SIGTSTP, SIG_IGN ); // we don't want to be stopped
::gettimeofday ( &tvs, 0 );
::sync ( ); // flush fs caches
- res = ( ::ioctl ( fd, APM_IOC_SUSPEND ) == 0 ); // tell the kernel to "start" suspending
+ res = ( ::ioctl ( fd, APM_IOC_SUSPEND, 0 ) == 0 ); // tell the kernel to "start" suspending
if ( res ) {
::kill ( -::getpid ( ), SIGTSTP ); // stop everthing in our process group
do { // wait at most 1.5 sec: either suspend didn't work or the device resumed
::usleep ( 200 * 1000 );
::gettimeofday ( &tvn, 0 );
} while ((( tvn. tv_sec - tvs. tv_sec ) * 1000 + ( tvn. tv_usec - tvs. tv_usec ) / 1000 ) < 1500 );
::kill ( -::getpid ( ), SIGCONT ); // continue everything in our process group
}
@@ -395,32 +404,47 @@ bool ODeviceIPAQ::setLed ( uint which, OLedState st )
case OLED_BlinkFast: leds. OnTime = 5; leds. OffTime = 5; break;
}
if ( ::ioctl ( fd, LED_ON, &leds ) >= 0 ) {
d-> m_leds [0] = st;
return true;
}
}
}
return false;
}
-
-//#endif
+bool ODeviceIPAQ::setPowerButtonHandler ( ODevice::PowerButtonHandler p )
+{
+ bool res = false;
+ int fd;
+
+ if (( fd = ::open ( "/proc/sys/ts/suspend_button_mode", O_WRONLY )) >= 0 ) {
+ if ( ::write ( fd, p == KERNEL ? "0" : "1", 1 ) == 1 )
+ res = true;
+ else
+ ::perror ( "write to /proc/sys/ts/suspend_button_mode" );
+
+ ::close ( fd );
+ }
+ else
+ ::perror ( "/proc/sys/ts/suspend_button_mode" );
+
+ return res;
+}
-//#if defined( QT_QWS_EBX ) // Zaurus
void ODeviceZaurus::init ( )
{
d-> m_modelstr = "Zaurus SL5000";
d-> m_model = OMODEL_Zaurus_SL5000;
d-> m_vendorstr = "Sharp";
d-> m_vendor = OVENDOR_Sharp;
QFile f ( "/proc/filesystems" );
if ( f. open ( IO_ReadOnly ) && ( QTextStream ( &f ). read ( ). find ( "\tjffs2\n" ) >= 0 )) {
d-> m_systemstr = "OpenZaurus";
@@ -485,24 +509,30 @@ void ODeviceZaurus::init ( )
typedef struct sharp_led_status {
int which; /* select which LED status is wanted. */
int status; /* set new led status if you call SHARP_LED_SETSTATUS */
} sharp_led_status;
#define SHARP_LED_MAIL_EXISTS 9 /* mail status (exists or not) */
#define LED_MAIL_NO_UNREAD_MAIL 0 /* for SHARP_LED_MAIL_EXISTS */
#define LED_MAIL_NEWMAIL_EXISTS 1 /* for SHARP_LED_MAIL_EXISTS */
#define LED_MAIL_UNREAD_MAIL_EX 2 /* for SHARP_LED_MAIL_EXISTS */
+// #include <asm/sharp_apm.h> // including kernel headers is evil ...
+
+#define APM_IOCGEVTSRC (( 2 ) | ( 'A'<<8 ) | ( 203 ) | ( sizeof(int) ))
+#define APM_IOCSEVTSRC (( 3 ) | ( 'A'<<8 ) | ( 204 ) | ( sizeof(int) ))
+#define APM_EVT_POWER_BUTTON (1 << 0)
+
void ODeviceZaurus::buzzer ( int sound )
{
static int fd = ::open ( "/dev/sharp_buz", O_RDWR|O_NONBLOCK );
if ( fd >= 0 )
::ioctl ( fd, SHARP_BUZZER_MAKESOUND, sound );
}
void ODeviceZaurus::alarmSound ( )
@@ -551,13 +581,43 @@ bool ODeviceZaurus::setLed ( uint which, OLedState st )
case OLED_BlinkFast: leds. status = LED_MAIL_UNREAD_MAIL_EX; break;
}
if ( ::ioctl ( fd, SHARP_LED_SETSTATUS, &leds ) >= 0 ) {
d-> m_leds [0] = st;
return true;
}
}
}
return false;
}
-//#endif
+bool ODeviceZaurus::setPowerButtonHandler ( ODevice::PowerButtonHandler p )
+{
+ bool res = false;
+ int fd;
+
+ if ((( fd = ::open ( "/dev/apm_bios", O_RDWR )) >= 0 ) ||
+ (( fd = ::open ( "/dev/misc/apm_bios",O_RDWR )) >= 0 )) {
+
+ int sources = ::ioctl ( fd, APM_IOCGEVTSRC, 0 ); // get current event sources
+
+ if ( sources >= 0 ) {
+ if ( p == KERNEL )
+ sources |= APM_EVT_POWER_BUTTON;
+ else
+ sources &= ~APM_EVT_POWER_BUTTON;
+
+ if ( ::ioctl ( fd, APM_IOCSEVTSRC, sources & ~APM_EVT_POWER_BUTTON ) >= 0 ) // set new event sources
+ res = true;
+ else
+ perror ( "APM_IOCGEVTSRC" );
+ }
+ else
+ perror ( "APM_IOCGEVTSRC" );
+
+ ::close ( fd );
+ }
+ else
+ perror ( "/dev/apm_bios or /dev/misc/apm_bios" );
+
+ return res;
+}