summaryrefslogtreecommitdiff
path: root/libopie2
authorerik <erik>2007-02-08 01:15:31 (UTC)
committer erik <erik>2007-02-08 01:15:31 (UTC)
commitc36a2e25a8875a31957968482ba8a0831a8b0aba (patch) (unidiff)
tree73c5f9231d3fe7157d814d8a948f27e31eb87c81 /libopie2
parentc4aaefcbe64cecb35f1f1bfa10337e95d8ae439c (diff)
downloadopie-c36a2e25a8875a31957968482ba8a0831a8b0aba.zip
opie-c36a2e25a8875a31957968482ba8a0831a8b0aba.tar.gz
opie-c36a2e25a8875a31957968482ba8a0831a8b0aba.tar.bz2
This commit provides support for any iPAQ handheld that runs a 2.6 kernel
and follows the backlight class in sysfs. This patch was originally done by an unknown poster and maintained by Paul S. Thanks all who contributed.
Diffstat (limited to 'libopie2') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiecore/device/odevice_ipaq.cpp101
1 files changed, 44 insertions, 57 deletions
diff --git a/libopie2/opiecore/device/odevice_ipaq.cpp b/libopie2/opiecore/device/odevice_ipaq.cpp
index 16ecc27..02b685a 100644
--- a/libopie2/opiecore/device/odevice_ipaq.cpp
+++ b/libopie2/opiecore/device/odevice_ipaq.cpp
@@ -399,41 +399,15 @@ bool iPAQ::setDisplayBrightness ( int bright )
399 399
400 QString cmdline; 400 QDir sysClass( "/sys/class/backlight/" );
401 401 sysClass.setFilter(QDir::Dirs);
402 switch ( model()) { 402 if ( sysClass.exists() && sysClass.count() > 2 ) {
403 case Model_iPAQ_H191x: 403 QString sysClassPath = sysClass.absFilePath( sysClass[2] + "/brightness" );
404 case Model_iPAQ_H4xxx: 404 int fd = ::open( sysClassPath, O_WRONLY|O_NONBLOCK );
405 { 405 if ( fd ) {
406 QDir sysClass( "/sys/class/backlight/pxafb/" ); 406 char buf[100];
407 sysClass.setFilter(QDir::Dirs); 407 int val = bright * displayBrightnessResolution() / 255;
408 int fd; 408 int len = ::snprintf( &buf[0], sizeof buf, "%d", val );
409 if ( sysClass.exists() ) { 409 res = ( ::write( fd, &buf[0], len ) == 0 );
410 QString sysClassPath = sysClass.absFilePath( "/sys/class/backlight/pxafb/power" ); 410 ::close( fd );
411 fd = ::open( sysClassPath, O_WRONLY | O_NONBLOCK ); 411 }
412 if ( fd ) { 412 } else {
413 char buf[10];
414 buf[0] = bright ? 0 : 4;
415 buf[1] = '\0';
416 res = ( ::write( fd, &buf[0], 2 ) == 0 );
417 ::close( fd );
418 }
419 sysClassPath = sysClass.absFilePath( "/sys/class/backlight/pxafb/brightness" );
420 fd = ::open( sysClassPath, O_WRONLY | O_NONBLOCK );
421 if ( fd ) {
422 char buf[100];
423 int len = ::snprintf( &buf[0], sizeof buf, "%d", bright );
424 res = ( ::write( fd, &buf[0], len ) == 0 );
425 ::close( fd );
426 }
427 }
428 }
429 break;
430
431 case Model_iPAQ_HX4700:
432 cmdline = QString::fromLatin1( "echo %1 > /sys/class/backlight/w100fb/brightness" ).arg( bright );
433 // No Global::shellQuote as we gurantee it to be sane
434 res = ( ::system( QFile::encodeName(cmdline) ) == 0 );
435 break;
436
437
438 default:
439 if (( fd = ::open ( "/dev/touchscreen/0", O_WRONLY )) >= 0 ) { 413 if (( fd = ::open ( "/dev/touchscreen/0", O_WRONLY )) >= 0 ) {
@@ -447,2 +421,3 @@ bool iPAQ::setDisplayBrightness ( int bright )
447 } 421 }
422
448 return res; 423 return res;
@@ -452,2 +427,18 @@ int iPAQ::displayBrightnessResolution() const
452{ 427{
428 int res = 16;
429
430 QDir sysClass( "/sys/class/backlight/" );
431 sysClass.setFilter(QDir::Dirs);
432 if ( sysClass.exists() && sysClass.count() > 2 ) {
433 QString sysClassPath = sysClass.absFilePath( sysClass[2] + "/max_brightness" );
434 int fd = ::open( sysClassPath, O_RDONLY|O_NONBLOCK );
435 if ( fd ) {
436 char buf[100];
437 if ( ::read( fd, &buf[0], sizeof buf ) )
438 ::sscanf( &buf[0], "%d", &res );
439 ::close( fd );
440 }
441 return res;
442 }
443
453 switch ( model()) { 444 switch ( model()) {
@@ -480,23 +471,18 @@ bool iPAQ::setDisplayStatus ( bool on )
480 471
481 if ( model() == Model_iPAQ_H191x ) { 472 QDir sysClass( "/sys/class/lcd/" );
482 QDir sysClass( "/sys/class/lcd/pxafb/" ); 473 sysClass.setFilter(QDir::Dirs);
483 sysClass.setFilter(QDir::Dirs); 474 if ( sysClass.exists() && sysClass.count() > 2 ) {
484 if ( sysClass.exists() ) { 475 QString sysClassPath = sysClass.absFilePath( sysClass[2] + "/power" );
485 QString sysClassPath = sysClass.absFilePath( "/sys/class/lcd/pxafb/power" ); 476 int fd = ::open( sysClassPath, O_WRONLY|O_NONBLOCK );
486 int fd = ::open( sysClassPath, O_WRONLY | O_NONBLOCK ); 477 if ( fd ) {
487 if ( fd ) { 478 char buf[10];
488 char buf[10]; 479 buf[0] = on ? 0 : 4;
489 buf[0] = on ? 0 : 4; 480 buf[1] = '\0';
490 buf[1] = '\0'; 481 res = ( ::write( fd, &buf[0], 2 ) == 0 );
491 res = ( ::write( fd, &buf[0], 2 ) == 0 ); 482 ::close( fd );
492 ::close( fd ); 483 }
493 }
494 }
495 return res;
496 } else { 484 } else {
497 return OAbstractMobileDevice::setDisplayStatus(on); 485 res = OAbstractMobileDevice::setDisplayStatus(on);
498 } 486 }
499 487
500 res = ( ::system( QFile::encodeName(cmdline) ) == 0 );
501
502 return res; 488 return res;
@@ -508,2 +494,3 @@ bool iPAQ::hasLightSensor() const
508 case Model_iPAQ_H191x: 494 case Model_iPAQ_H191x:
495 case Model_iPAQ_H22xx:
509 case Model_iPAQ_H4xxx: 496 case Model_iPAQ_H4xxx: