summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiecore/device/odevice_zaurus.cpp17
1 files changed, 15 insertions, 2 deletions
diff --git a/libopie2/opiecore/device/odevice_zaurus.cpp b/libopie2/opiecore/device/odevice_zaurus.cpp
index a59e799..7377965 100644
--- a/libopie2/opiecore/device/odevice_zaurus.cpp
+++ b/libopie2/opiecore/device/odevice_zaurus.cpp
@@ -327,282 +327,295 @@ void Zaurus::playAlarmSound()
327 327
328void Zaurus::playTouchSound() 328void Zaurus::playTouchSound()
329{ 329{
330 buzzer( SHARP_BUZ_TOUCHSOUND ); 330 buzzer( SHARP_BUZ_TOUCHSOUND );
331} 331}
332 332
333void Zaurus::playKeySound() 333void Zaurus::playKeySound()
334{ 334{
335 buzzer( SHARP_BUZ_KEYSOUND ); 335 buzzer( SHARP_BUZ_KEYSOUND );
336} 336}
337 337
338 338
339QValueList <OLed> Zaurus::ledList() const 339QValueList <OLed> Zaurus::ledList() const
340{ 340{
341 QValueList <OLed> vl; 341 QValueList <OLed> vl;
342 vl << Led_Mail; 342 vl << Led_Mail;
343 return vl; 343 return vl;
344} 344}
345 345
346QValueList <OLedState> Zaurus::ledStateList( OLed l ) const 346QValueList <OLedState> Zaurus::ledStateList( OLed l ) const
347{ 347{
348 QValueList <OLedState> vl; 348 QValueList <OLedState> vl;
349 349
350 if ( l == Led_Mail ) 350 if ( l == Led_Mail )
351 vl << Led_Off << Led_On << Led_BlinkSlow; 351 vl << Led_Off << Led_On << Led_BlinkSlow;
352 return vl; 352 return vl;
353} 353}
354 354
355OLedState Zaurus::ledState( OLed which ) const 355OLedState Zaurus::ledState( OLed which ) const
356{ 356{
357 if ( which == Led_Mail ) 357 if ( which == Led_Mail )
358 return m_leds [0]; 358 return m_leds [0];
359 else 359 else
360 return Led_Off; 360 return Led_Off;
361} 361}
362 362
363bool Zaurus::setLedState( OLed which, OLedState st ) 363bool Zaurus::setLedState( OLed which, OLedState st )
364{ 364{
365 // Currently not supported on non_embedix kernels 365 // Currently not supported on non_embedix kernels
366 if (!m_embedix) 366 if (!m_embedix)
367 { 367 {
368 qDebug( "Zaurus::setLedState: ODevice handling for non-embedix kernels not yet implemented" ); 368 qDebug( "Zaurus::setLedState: ODevice handling for non-embedix kernels not yet implemented" );
369 return false; 369 return false;
370 } 370 }
371 371
372 static int fd = ::open ( "/dev/sharp_led", O_RDWR|O_NONBLOCK ); 372 static int fd = ::open ( "/dev/sharp_led", O_RDWR|O_NONBLOCK );
373 373
374 if ( which == Led_Mail ) { 374 if ( which == Led_Mail ) {
375 if ( fd >= 0 ) { 375 if ( fd >= 0 ) {
376 struct sharp_led_status leds; 376 struct sharp_led_status leds;
377 ::memset ( &leds, 0, sizeof( leds )); 377 ::memset ( &leds, 0, sizeof( leds ));
378 leds. which = SHARP_LED_MAIL_EXISTS; 378 leds. which = SHARP_LED_MAIL_EXISTS;
379 bool ok = true; 379 bool ok = true;
380 380
381 switch ( st ) { 381 switch ( st ) {
382 case Led_Off : leds. status = LED_MAIL_NO_UNREAD_MAIL; break; 382 case Led_Off : leds. status = LED_MAIL_NO_UNREAD_MAIL; break;
383 case Led_On : leds. status = LED_MAIL_NEWMAIL_EXISTS; break; 383 case Led_On : leds. status = LED_MAIL_NEWMAIL_EXISTS; break;
384 case Led_BlinkSlow: leds. status = LED_MAIL_UNREAD_MAIL_EX; break; 384 case Led_BlinkSlow: leds. status = LED_MAIL_UNREAD_MAIL_EX; break;
385 default : ok = false; 385 default : ok = false;
386 } 386 }
387 387
388 if ( ok && ( ::ioctl ( fd, SHARP_LED_SETSTATUS, &leds ) >= 0 )) { 388 if ( ok && ( ::ioctl ( fd, SHARP_LED_SETSTATUS, &leds ) >= 0 )) {
389 m_leds [0] = st; 389 m_leds [0] = st;
390 return true; 390 return true;
391 } 391 }
392 } 392 }
393 } 393 }
394 return false; 394 return false;
395} 395}
396 396
397int Zaurus::displayBrightnessResolution() const 397int Zaurus::displayBrightnessResolution() const
398{ 398{
399 int res = 1; 399 int res = 1;
400 if (m_embedix) 400 if (m_embedix)
401 { 401 {
402 int fd = ::open( SHARP_FL_IOCTL_DEVICE, O_RDWR|O_NONBLOCK ); 402 int fd = ::open( SHARP_FL_IOCTL_DEVICE, O_RDWR|O_NONBLOCK );
403 if ( fd ) 403 if ( fd )
404 { 404 {
405 int value = ::ioctl( fd, SHARP_FL_IOCTL_GET_STEP, 0 ); 405 int value = ::ioctl( fd, SHARP_FL_IOCTL_GET_STEP, 0 );
406 ::close( fd ); 406 ::close( fd );
407 return value ? value : res; 407 return value ? value : res;
408 } 408 }
409 } 409 }
410 else 410 else
411 { 411 {
412 int fd = ::open( "/sys/class/backlight/corgi-bl/max_brightness", O_RDONLY|O_NONBLOCK ); 412 int fd = ::open( "/sys/class/backlight/corgi-bl/max_brightness", O_RDONLY|O_NONBLOCK );
413 if ( fd ) 413 if ( fd )
414 { 414 {
415 char buf[100]; 415 char buf[100];
416 if ( ::read( fd, &buf[0], sizeof buf ) ) ::sscanf( &buf[0], "%d", &res ); 416 if ( ::read( fd, &buf[0], sizeof buf ) ) ::sscanf( &buf[0], "%d", &res );
417 ::close( fd ); 417 ::close( fd );
418 } 418 }
419 } 419 }
420 return res; 420 return res;
421} 421}
422 422
423bool Zaurus::setDisplayBrightness( int bright ) 423bool Zaurus::setDisplayBrightness( int bright )
424{ 424{
425 //qDebug( "Zaurus::setDisplayBrightness( %d )", bright ); 425 //qDebug( "Zaurus::setDisplayBrightness( %d )", bright );
426 bool res = false; 426 bool res = false;
427 427
428 if ( bright > 255 ) bright = 255; 428 if ( bright > 255 ) bright = 255;
429 if ( bright < 0 ) bright = 0; 429 if ( bright < 0 ) bright = 0;
430 430
431 int numberOfSteps = displayBrightnessResolution(); 431 int numberOfSteps = displayBrightnessResolution();
432 int val = ( bright == 1 ) ? 1 : ( bright * numberOfSteps ) / 255; 432 int val = ( bright == 1 ) ? 1 : ( bright * numberOfSteps ) / 255;
433 433
434 if ( m_embedix ) 434 if ( m_embedix )
435 { 435 {
436 int fd = ::open( SHARP_FL_IOCTL_DEVICE, O_WRONLY|O_NONBLOCK ); 436 int fd = ::open( SHARP_FL_IOCTL_DEVICE, O_WRONLY|O_NONBLOCK );
437 if ( fd ) 437 if ( fd )
438 { 438 {
439 res = ( ::ioctl( fd, SHARP_FL_IOCTL_STEP_CONTRAST, val ) == 0 ); 439 res = ( ::ioctl( fd, SHARP_FL_IOCTL_STEP_CONTRAST, val ) == 0 );
440 ::close( fd ); 440 ::close( fd );
441 } 441 }
442 } 442 }
443 else 443 else
444 { 444 {
445 int fd = ::open( "/sys/class/backlight/corgi-bl/brightness", O_WRONLY|O_NONBLOCK ); 445 int fd = ::open( "/sys/class/backlight/corgi-bl/brightness", O_WRONLY|O_NONBLOCK );
446 if ( fd ) 446 if ( fd )
447 { 447 {
448 char buf[100]; 448 char buf[100];
449 int len = ::snprintf( &buf[0], sizeof buf, "%d", val ); 449 int len = ::snprintf( &buf[0], sizeof buf, "%d", val );
450 res = ( ::write( fd, &buf[0], len ) == 0 ); 450 res = ( ::write( fd, &buf[0], len ) == 0 );
451 ::close( fd ); 451 ::close( fd );
452 } 452 }
453 } 453 }
454 return res; 454 return res;
455} 455}
456 456
457bool Zaurus::setDisplayStatus( bool on ) 457bool Zaurus::setDisplayStatus( bool on )
458{ 458{
459 bool res = false; 459 bool res = false;
460 if ( m_embedix ) 460 if ( m_embedix )
461 { 461 {
462 int fd = ::open( SHARP_FL_IOCTL_DEVICE, O_WRONLY|O_NONBLOCK ); 462 int fd = ::open( SHARP_FL_IOCTL_DEVICE, O_WRONLY|O_NONBLOCK );
463 if ( fd ) 463 if ( fd )
464 { 464 {
465 int ioctlnum = on ? SHARP_FL_IOCTL_ON : SHARP_FL_IOCTL_OFF; 465 int ioctlnum = on ? SHARP_FL_IOCTL_ON : SHARP_FL_IOCTL_OFF;
466 res = ( ::ioctl ( fd, ioctlnum, 0 ) == 0 ); 466 res = ( ::ioctl ( fd, ioctlnum, 0 ) == 0 );
467 ::close ( fd ); 467 ::close ( fd );
468 } 468 }
469 } 469 }
470 else 470 else
471 { 471 {
472 int fd = ::open( "/sys/class/backlight/corgi-bl/power", O_WRONLY|O_NONBLOCK ); 472 int fd = ::open( "/sys/class/backlight/corgi-bl/power", O_WRONLY|O_NONBLOCK );
473 if ( fd ) 473 if ( fd )
474 { 474 {
475 char buf[10]; 475 char buf[10];
476 buf[0] = on ? FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN; 476 buf[0] = on ? FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN;
477 buf[1] = '\0'; 477 buf[1] = '\0';
478 res = ( ::write( fd, &buf[0], 2 ) == 0 ); 478 res = ( ::write( fd, &buf[0], 2 ) == 0 );
479 ::close( fd ); 479 ::close( fd );
480 } 480 }
481 } 481 }
482 return res; 482 return res;
483} 483}
484 484
485bool Zaurus::suspend() 485bool Zaurus::suspend()
486{ 486{
487 qDebug("ODevice::suspend"); 487 qDebug("ODevice::suspend");
488 if ( !isQWS( ) ) // only qwsserver is allowed to suspend 488 if ( !isQWS( ) ) // only qwsserver is allowed to suspend
489 return false; 489 return false;
490 490
491 if ( d->m_model == Model_Unknown ) // better don't suspend in qvfb / on unkown devices 491 if ( d->m_model == Model_Unknown ) // better don't suspend in qvfb / on unkown devices
492 return false; 492 return false;
493 493
494 bool res = false; 494 bool res = false;
495 ODevice::sendSuspendmsg(); 495 ODevice::sendSuspendmsg();
496 496
497 struct timeval tvs, tvn; 497 struct timeval tvs, tvn;
498 ::gettimeofday ( &tvs, 0 ); 498 ::gettimeofday ( &tvs, 0 );
499 499
500 ::sync(); // flush fs caches 500 ::sync(); // flush fs caches
501 res = ( ::system ( "apm --suspend" ) == 0 ); 501 res = ( ::system ( "apm --suspend" ) == 0 );
502 502
503 // This is needed because the apm implementation is asynchronous and we 503 // This is needed because the apm implementation is asynchronous and we
504 // can not be sure when exactly the device is really suspended 504 // can not be sure when exactly the device is really suspended
505 if ( res ) { 505 if ( res ) {
506 do { // Yes, wait 15 seconds. This APM sucks big time. 506 do { // Yes, wait 15 seconds. This APM sucks big time.
507 ::usleep ( 200 * 1000 ); 507 ::usleep ( 200 * 1000 );
508 ::gettimeofday ( &tvn, 0 ); 508 ::gettimeofday ( &tvn, 0 );
509 } while ((( tvn. tv_sec - tvs. tv_sec ) * 1000 + ( tvn. tv_usec - tvs. tv_usec ) / 1000 ) < 15000 ); 509 } while ((( tvn. tv_sec - tvs. tv_sec ) * 1000 + ( tvn. tv_usec - tvs. tv_usec ) / 1000 ) < 15000 );
510 } 510 }
511 511
512 QCopEnvelope ( "QPE/Rotation", "rotateDefault()" ); 512 QCopEnvelope ( "QPE/Rotation", "rotateDefault()" );
513 return res; 513 return res;
514} 514}
515 515
516 516
517Transformation Zaurus::rotation() const 517Transformation Zaurus::rotation() const
518{ 518{
519 qDebug( "Zaurus::rotation()" );
519 Transformation rot; 520 Transformation rot;
520 521
521 switch ( d->m_model ) { 522 switch ( d->m_model ) {
522 case Model_Zaurus_SLC3000: // fallthrough 523 case Model_Zaurus_SLC3000: // fallthrough
523 case Model_Zaurus_SLC7x0: { 524 case Model_Zaurus_SLC7x0:
524 OHingeStatus hs = readHingeSensor(); 525 {
526 OHingeStatus hs = readHingeSensor();
527 qDebug( "Zaurus::rotation() - hinge sensor = %d", (int) hs );
528
529 if ( m_embedix )
530 {
525 if ( hs == CASE_PORTRAIT ) rot = Rot0; 531 if ( hs == CASE_PORTRAIT ) rot = Rot0;
526 else if ( hs == CASE_UNKNOWN ) rot = Rot0; 532 else if ( hs == CASE_UNKNOWN ) rot = Rot0;
527 else rot = Rot270; 533 else rot = Rot270;
528 } 534 }
535 else
536 {
537 if ( hs == CASE_PORTRAIT ) rot = Rot270;
538 else if ( hs == CASE_UNKNOWN ) rot = Rot0;
539 else rot = Rot0;
540 }
541 }
529 break; 542 break;
530 case Model_Zaurus_SL6000: 543 case Model_Zaurus_SL6000:
531 case Model_Zaurus_SLB600: 544 case Model_Zaurus_SLB600:
532 case Model_Zaurus_SLA300: 545 case Model_Zaurus_SLA300:
533 case Model_Zaurus_SL5500: 546 case Model_Zaurus_SL5500:
534 case Model_Zaurus_SL5000: 547 case Model_Zaurus_SL5000:
535 default: 548 default:
536 rot = d->m_rotation; 549 rot = d->m_rotation;
537 break; 550 break;
538 } 551 }
539 552
540 return rot; 553 return rot;
541} 554}
542ODirection Zaurus::direction() const 555ODirection Zaurus::direction() const
543{ 556{
544 ODirection dir; 557 ODirection dir;
545 558
546 switch ( d->m_model ) { 559 switch ( d->m_model ) {
547 case Model_Zaurus_SLC3000: // fallthrough 560 case Model_Zaurus_SLC3000: // fallthrough
548 case Model_Zaurus_SLC7x0: { 561 case Model_Zaurus_SLC7x0: {
549 OHingeStatus hs = readHingeSensor(); 562 OHingeStatus hs = readHingeSensor();
550 if ( hs == CASE_PORTRAIT ) dir = CCW; 563 if ( hs == CASE_PORTRAIT ) dir = CCW;
551 else if ( hs == CASE_UNKNOWN ) dir = CCW; 564 else if ( hs == CASE_UNKNOWN ) dir = CCW;
552 else dir = CW; 565 else dir = CW;
553 } 566 }
554 break; 567 break;
555 case Model_Zaurus_SL6000: 568 case Model_Zaurus_SL6000:
556 case Model_Zaurus_SLA300: 569 case Model_Zaurus_SLA300:
557 case Model_Zaurus_SLB600: 570 case Model_Zaurus_SLB600:
558 case Model_Zaurus_SL5500: 571 case Model_Zaurus_SL5500:
559 case Model_Zaurus_SL5000: 572 case Model_Zaurus_SL5000:
560 default: dir = d->m_direction; 573 default: dir = d->m_direction;
561 break; 574 break;
562 } 575 }
563 return dir; 576 return dir;
564 577
565} 578}
566 579
567bool Zaurus::hasHingeSensor() const 580bool Zaurus::hasHingeSensor() const
568{ 581{
569 return d->m_model == Model_Zaurus_SLC7x0 || d->m_model == Model_Zaurus_SLC3000; 582 return d->m_model == Model_Zaurus_SLC7x0 || d->m_model == Model_Zaurus_SLC3000;
570} 583}
571 584
572OHingeStatus Zaurus::readHingeSensor() const 585OHingeStatus Zaurus::readHingeSensor() const
573{ 586{
574 if (m_embedix) 587 if (m_embedix)
575 { 588 {
576 int handle = ::open("/dev/apm_bios", O_RDWR|O_NONBLOCK); 589 int handle = ::open("/dev/apm_bios", O_RDWR|O_NONBLOCK);
577 if (handle == -1) 590 if (handle == -1)
578 { 591 {
579 qWarning("Zaurus::readHingeSensor() - failed (%s)", "unknown reason" ); //FIXME: use strerror 592 qWarning("Zaurus::readHingeSensor() - failed (%s)", "unknown reason" ); //FIXME: use strerror
580 return CASE_UNKNOWN; 593 return CASE_UNKNOWN;
581 } 594 }
582 else 595 else
583 { 596 {
584 int retval = ::ioctl(handle, SHARP_IOCTL_GET_ROTATION); 597 int retval = ::ioctl(handle, SHARP_IOCTL_GET_ROTATION);
585 ::close (handle); 598 ::close (handle);
586 if ( retval == CASE_CLOSED || retval == CASE_PORTRAIT || retval == CASE_LANDSCAPE ) 599 if ( retval == CASE_CLOSED || retval == CASE_PORTRAIT || retval == CASE_LANDSCAPE )
587 { 600 {
588 qDebug( "Zaurus::readHingeSensor() - result = %d", retval ); 601 qDebug( "Zaurus::readHingeSensor() - result = %d", retval );
589 return static_cast<OHingeStatus>( retval ); 602 return static_cast<OHingeStatus>( retval );
590 } 603 }
591 else 604 else
592 { 605 {
593 qWarning("Zaurus::readHingeSensor() - couldn't compute hinge status!" ); 606 qWarning("Zaurus::readHingeSensor() - couldn't compute hinge status!" );
594 return CASE_UNKNOWN; 607 return CASE_UNKNOWN;
595 } 608 }
596 } 609 }
597 } 610 }
598 else 611 else
599 { 612 {
600 // corgi keyboard is event source 0 in OZ kernel 2.6 613 // corgi keyboard is event source 0 in OZ kernel 2.6
601 OInputDevice* keyboard = OInputSystem::instance()->device( "event0" ); 614 OInputDevice* keyboard = OInputSystem::instance()->device( "event0" );
602 if ( keyboard && keyboard->isHeld( OInputDevice::Key_KP0 ) ) return CASE_LANDSCAPE; 615 if ( keyboard && keyboard->isHeld( OInputDevice::Key_KP0 ) ) return CASE_LANDSCAPE;
603 else if ( keyboard && keyboard->isHeld( OInputDevice::Key_KP1 ) ) return CASE_PORTRAIT; 616 else if ( keyboard && keyboard->isHeld( OInputDevice::Key_KP1 ) ) return CASE_PORTRAIT;
604 else if ( keyboard && keyboard->isHeld( OInputDevice::Key_KP2 ) ) return CASE_CLOSED; 617 else if ( keyboard && keyboard->isHeld( OInputDevice::Key_KP2 ) ) return CASE_CLOSED;
605 qWarning("Zaurus::readHingeSensor() - couldn't compute hinge status!" ); 618 qWarning("Zaurus::readHingeSensor() - couldn't compute hinge status!" );
606 return CASE_UNKNOWN; 619 return CASE_UNKNOWN;
607 } 620 }
608} 621}