summaryrefslogtreecommitdiff
path: root/libopie/odevice.cpp
Unidiff
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
@@ -54,28 +54,32 @@ public:
54 OLedState m_leds [4]; // just for convenience ... 54 OLedState m_leds [4]; // just for convenience ...
55}; 55};
56 56
57class ODeviceIPAQ : public ODevice { 57class ODeviceIPAQ : public ODevice {
58protected: 58protected:
59 virtual void init ( ); 59 virtual void init ( );
60 60
61public: 61public:
62 virtual bool setPowerButtonHandler ( PowerButtonHandler h );
63
62 virtual void alarmSound ( ); 64 virtual void alarmSound ( );
63 65
64 virtual uint hasLeds ( ) const; 66 virtual uint hasLeds ( ) const;
65 virtual OLedState led ( uint which ) const; 67 virtual OLedState led ( uint which ) const;
66 virtual bool setLed ( uint which, OLedState st ); 68 virtual bool setLed ( uint which, OLedState st );
67}; 69};
68 70
69class ODeviceZaurus : public ODevice { 71class ODeviceZaurus : public ODevice {
70protected: 72protected:
71 virtual void init ( ); 73 virtual void init ( );
72 74
73 public: 75 public:
76 virtual bool setPowerButtonHandler ( PowerButtonHandler h );
77
74 virtual void alarmSound ( ); 78 virtual void alarmSound ( );
75 virtual void keySound ( ); 79 virtual void keySound ( );
76 virtual void touchSound ( ); 80 virtual void touchSound ( );
77 81
78 virtual uint hasLeds ( ) const; 82 virtual uint hasLeds ( ) const;
79 virtual OLedState led ( uint which ) const; 83 virtual OLedState led ( uint which ) const;
80 virtual bool setLed ( uint which, OLedState st ); 84 virtual bool setLed ( uint which, OLedState st );
81 85
@@ -126,16 +130,21 @@ ODevice::~ODevice ( )
126} 130}
127 131
128//#include <linux/apm_bios.h> 132//#include <linux/apm_bios.h>
129 133
130//#define APM_IOC_SUSPEND _IO('A',2) 134//#define APM_IOC_SUSPEND _IO('A',2)
131 135
132#define APM_IOC_SUSPEND (( 0<<30 ) | ( 'A'<<8 ) | ( 2 ) | ( 0<<16 )) 136#define APM_IOC_SUSPEND (( 0<<30 ) | ( 'A'<<8 ) | ( 2 ) | ( 0<<16 ))
133 137
138bool ODevice::setPowerButtonHandler ( ODevice::PowerButtonHandler )
139{
140 return false;
141}
142
134bool ODevice::suspend ( ) 143bool ODevice::suspend ( )
135{ 144{
136 if ( d-> m_model == OMODEL_Unknown ) // better don't suspend in qvfb / on unkown devices 145 if ( d-> m_model == OMODEL_Unknown ) // better don't suspend in qvfb / on unkown devices
137 return false; 146 return false;
138 147
139 int fd; 148 int fd;
140 bool res = false; 149 bool res = false;
141 150
@@ -143,17 +152,17 @@ bool ODevice::suspend ( )
143 (( fd = ::open ( "/dev/misc/apm_bios",O_RDWR )) >= 0 )) { 152 (( fd = ::open ( "/dev/misc/apm_bios",O_RDWR )) >= 0 )) {
144 struct timeval tvs, tvn; 153 struct timeval tvs, tvn;
145 154
146 ::signal ( SIGTSTP, SIG_IGN );// we don't want to be stopped 155 ::signal ( SIGTSTP, SIG_IGN );// we don't want to be stopped
147 ::gettimeofday ( &tvs, 0 ); 156 ::gettimeofday ( &tvs, 0 );
148 157
149 ::sync ( ); // flush fs caches 158 ::sync ( ); // flush fs caches
150 159
151 res = ( ::ioctl ( fd, APM_IOC_SUSPEND ) == 0 ); // tell the kernel to "start" suspending 160 res = ( ::ioctl ( fd, APM_IOC_SUSPEND, 0 ) == 0 ); // tell the kernel to "start" suspending
152 161
153 if ( res ) { 162 if ( res ) {
154 ::kill ( -::getpid ( ), SIGTSTP ); // stop everthing in our process group 163 ::kill ( -::getpid ( ), SIGTSTP ); // stop everthing in our process group
155 164
156 do { // wait at most 1.5 sec: either suspend didn't work or the device resumed 165 do { // wait at most 1.5 sec: either suspend didn't work or the device resumed
157 ::usleep ( 200 * 1000 ); 166 ::usleep ( 200 * 1000 );
158 ::gettimeofday ( &tvn, 0 ); 167 ::gettimeofday ( &tvn, 0 );
159 } while ((( tvn. tv_sec - tvs. tv_sec ) * 1000 + ( tvn. tv_usec - tvs. tv_usec ) / 1000 ) < 1500 ); 168 } while ((( tvn. tv_sec - tvs. tv_sec ) * 1000 + ( tvn. tv_usec - tvs. tv_usec ) / 1000 ) < 1500 );
@@ -399,24 +408,39 @@ bool ODeviceIPAQ::setLed ( uint which, OLedState st )
399 d-> m_leds [0] = st; 408 d-> m_leds [0] = st;
400 return true; 409 return true;
401 } 410 }
402 } 411 }
403 } 412 }
404 return false; 413 return false;
405} 414}
406 415
407 416bool ODeviceIPAQ::setPowerButtonHandler ( ODevice::PowerButtonHandler p )
408//#endif 417{
418 bool res = false;
419 int fd;
420
421 if (( fd = ::open ( "/proc/sys/ts/suspend_button_mode", O_WRONLY )) >= 0 ) {
422 if ( ::write ( fd, p == KERNEL ? "0" : "1", 1 ) == 1 )
423 res = true;
424 else
425 ::perror ( "write to /proc/sys/ts/suspend_button_mode" );
426
427 ::close ( fd );
428 }
429 else
430 ::perror ( "/proc/sys/ts/suspend_button_mode" );
431
432 return res;
433}
409 434
410 435
411 436
412 437
413 438
414//#if defined( QT_QWS_EBX ) // Zaurus
415 439
416void ODeviceZaurus::init ( ) 440void ODeviceZaurus::init ( )
417{ 441{
418 d-> m_modelstr = "Zaurus SL5000"; 442 d-> m_modelstr = "Zaurus SL5000";
419 d-> m_model = OMODEL_Zaurus_SL5000; 443 d-> m_model = OMODEL_Zaurus_SL5000;
420 d-> m_vendorstr = "Sharp"; 444 d-> m_vendorstr = "Sharp";
421 d-> m_vendor = OVENDOR_Sharp; 445 d-> m_vendor = OVENDOR_Sharp;
422 446
@@ -489,16 +513,22 @@ typedef struct sharp_led_status {
489} sharp_led_status; 513} sharp_led_status;
490 514
491#define SHARP_LED_MAIL_EXISTS 9 /* mail status (exists or not) */ 515#define SHARP_LED_MAIL_EXISTS 9 /* mail status (exists or not) */
492 516
493#define LED_MAIL_NO_UNREAD_MAIL 0 /* for SHARP_LED_MAIL_EXISTS */ 517#define LED_MAIL_NO_UNREAD_MAIL 0 /* for SHARP_LED_MAIL_EXISTS */
494#define LED_MAIL_NEWMAIL_EXISTS 1 /* for SHARP_LED_MAIL_EXISTS */ 518#define LED_MAIL_NEWMAIL_EXISTS 1 /* for SHARP_LED_MAIL_EXISTS */
495#define LED_MAIL_UNREAD_MAIL_EX 2 /* for SHARP_LED_MAIL_EXISTS */ 519#define LED_MAIL_UNREAD_MAIL_EX 2 /* for SHARP_LED_MAIL_EXISTS */
496 520
521// #include <asm/sharp_apm.h> // including kernel headers is evil ...
522
523#define APM_IOCGEVTSRC (( 2 ) | ( 'A'<<8 ) | ( 203 ) | ( sizeof(int) ))
524#define APM_IOCSEVTSRC (( 3 ) | ( 'A'<<8 ) | ( 204 ) | ( sizeof(int) ))
525#define APM_EVT_POWER_BUTTON (1 << 0)
526
497 527
498 528
499void ODeviceZaurus::buzzer ( int sound ) 529void ODeviceZaurus::buzzer ( int sound )
500{ 530{
501 static int fd = ::open ( "/dev/sharp_buz", O_RDWR|O_NONBLOCK ); 531 static int fd = ::open ( "/dev/sharp_buz", O_RDWR|O_NONBLOCK );
502 532
503 if ( fd >= 0 ) 533 if ( fd >= 0 )
504 ::ioctl ( fd, SHARP_BUZZER_MAKESOUND, sound ); 534 ::ioctl ( fd, SHARP_BUZZER_MAKESOUND, sound );
@@ -555,9 +585,39 @@ bool ODeviceZaurus::setLed ( uint which, OLedState st )
555 d-> m_leds [0] = st; 585 d-> m_leds [0] = st;
556 return true; 586 return true;
557 } 587 }
558 } 588 }
559 } 589 }
560 return false; 590 return false;
561} 591}
562 592
563//#endif 593bool ODeviceZaurus::setPowerButtonHandler ( ODevice::PowerButtonHandler p )
594{
595 bool res = false;
596 int fd;
597
598 if ((( fd = ::open ( "/dev/apm_bios", O_RDWR )) >= 0 ) ||
599 (( fd = ::open ( "/dev/misc/apm_bios",O_RDWR )) >= 0 )) {
600
601 int sources = ::ioctl ( fd, APM_IOCGEVTSRC, 0 ); // get current event sources
602
603 if ( sources >= 0 ) {
604 if ( p == KERNEL )
605 sources |= APM_EVT_POWER_BUTTON;
606 else
607 sources &= ~APM_EVT_POWER_BUTTON;
608
609 if ( ::ioctl ( fd, APM_IOCSEVTSRC, sources & ~APM_EVT_POWER_BUTTON ) >= 0 ) // set new event sources
610 res = true;
611 else
612 perror ( "APM_IOCGEVTSRC" );
613 }
614 else
615 perror ( "APM_IOCGEVTSRC" );
616
617 ::close ( fd );
618 }
619 else
620 perror ( "/dev/apm_bios or /dev/misc/apm_bios" );
621
622 return res;
623}