From 5f037ac015e6d76d030a163753db5ff58cdff49b Mon Sep 17 00:00:00 2001 From: Thomas Jarosch Date: Tue, 8 Feb 2011 20:05:25 +0000 Subject: Initial maemo platform support Adds Nokia N900, N810 and N800 support. Features: - Introduce maemo specific platform defines - Play audio in silent mode - Stop playback on incoming calls - Battery level readout - Bluetooth headset support - Save CPU by disabling screen updates if the display is off or the app doesn't have input focus - N900: GStreamer audio backend Kudos to kugel for the code review. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29248 a1c6a512-1295-4272-9138-f99709370657 --- firmware/target/hosted/maemo/maemo-thread.c | 220 ++++++++++++++++++++++++++++ 1 file changed, 220 insertions(+) create mode 100644 firmware/target/hosted/maemo/maemo-thread.c (limited to 'firmware/target/hosted/maemo/maemo-thread.c') diff --git a/firmware/target/hosted/maemo/maemo-thread.c b/firmware/target/hosted/maemo/maemo-thread.c new file mode 100644 index 0000000000..f655ed597e --- /dev/null +++ b/firmware/target/hosted/maemo/maemo-thread.c @@ -0,0 +1,220 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2010 by Thomas Jarosch + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + + +#include +#include +#include + +#include "config.h" +#include "system.h" +#include "kernel.h" +#include "thread.h" +#include "power.h" +#include "debug.h" +#include "button.h" + +/* Battery status information */ +#define BME_UDI "/org/freedesktop/Hal/devices/bme" +#define BATTERY_PERCENTAGE "battery.charge_level.percentage" +#define BATTER_REMAINING_TIME "battery.remaining_time" + +/* Bluetooth headset support */ +#define BT_HEADSET_UDI "/org/freedesktop/Hal/devices/computer_logicaldev_input_1" + +GMainLoop *maemo_main_loop = NULL; +osso_context_t *maemo_osso_ctx = NULL; + +volatile int maemo_display_on = 1; +volatile int maemo_battery_level = 0; +volatile int maemo_remaining_time_sec = 0; + +extern void send_battery_level_event(void); +extern int last_sent_battery_level; +extern int battery_percent; + +void display_status_callback(osso_display_state_t state, gpointer data) +{ + (void)data; + + if (state == OSSO_DISPLAY_OFF) + maemo_display_on = 0; + else + maemo_display_on = 1; +} + + +void get_battery_values(LibHalContext *ctx) +{ + /* Get initial battery percentage and remaining time */ + maemo_battery_level = libhal_device_get_property_int( + ctx, BME_UDI, + BATTERY_PERCENTAGE, NULL); + + maemo_remaining_time_sec = libhal_device_get_property_int( + ctx, BME_UDI, + BATTER_REMAINING_TIME, NULL); + + DEBUGF("[maemo] Battery percentage: %d, remaining_time_sec: %d\n", maemo_battery_level, maemo_remaining_time_sec); +} + +static void on_battery_changed (LibHalContext *ctx, + const char *udi, + const char *key, + dbus_bool_t is_removed, + dbus_bool_t is_added) +{ + (void)is_removed; + (void)is_added; + + if (!g_str_equal (udi, BME_UDI)) + return; + + if (!g_str_equal (key, BATTERY_PERCENTAGE) && !g_str_equal (key, BATTER_REMAINING_TIME)) + return; + + get_battery_values(ctx); +} + +static void on_bt_button_pressed(LibHalContext *ctx, + const char *udi, + const char *condition_name, + const char *condition_detail) +{ + (void)ctx; + + if (!g_str_equal (udi, BT_HEADSET_UDI) || !g_str_equal(condition_name, "ButtonPressed")) + return; + + sim_enter_irq_handler(); + + if (g_str_equal(condition_detail, "play-cd") || g_str_equal(condition_detail, "pause-cd")) + queue_post(&button_queue, BUTTON_MULTIMEDIA_PLAYPAUSE, 0); + else if (g_str_equal(condition_detail, "stop-cd")) + queue_post(&button_queue, BUTTON_MULTIMEDIA_STOP, 0); + else if (g_str_equal(condition_detail, "next-song")) + queue_post(&button_queue, BUTTON_MULTIMEDIA_NEXT, 0); + else if (g_str_equal(condition_detail, "previous-song")) + queue_post(&button_queue, BUTTON_MULTIMEDIA_PREV, 0); + else if (g_str_equal(condition_detail, "fast-forward")) + queue_post(&button_queue, BUTTON_MULTIMEDIA_FFWD, 0); + else if (g_str_equal(condition_detail, "rewind")) + queue_post(&button_queue, BUTTON_MULTIMEDIA_REW, 0); + + sim_exit_irq_handler(); +} + +int maemo_thread_func (void *wait_for_osso_startup) +{ + maemo_main_loop = g_main_loop_new (NULL, FALSE); + + /* Register display callback */ + maemo_osso_ctx = osso_initialize ("rockbox", "666", FALSE, NULL); + osso_hw_set_display_event_cb(maemo_osso_ctx, display_status_callback, NULL); + + /* Register battery status callback */ + LibHalContext *hal_ctx; + hal_ctx = libhal_ctx_new(); + + DBusConnection *system_bus = (DBusConnection*)osso_get_sys_dbus_connection(maemo_osso_ctx); + libhal_ctx_set_dbus_connection(hal_ctx, system_bus); + + libhal_ctx_init(hal_ctx, NULL); + libhal_ctx_set_device_property_modified (hal_ctx, on_battery_changed); + libhal_device_add_property_watch (hal_ctx, BME_UDI, NULL); + + /* Work around libhal API issue: We need to add a property watch + to get the condition change callback working */ + libhal_device_add_property_watch (hal_ctx, BT_HEADSET_UDI, NULL); + libhal_ctx_set_device_condition(hal_ctx, on_bt_button_pressed); + + get_battery_values(hal_ctx); + + /* let system_init proceed */ + SDL_SemPost((SDL_sem *)wait_for_osso_startup); + + g_main_loop_run (maemo_main_loop); + + /* Cleanup */ + osso_deinitialize (maemo_osso_ctx); + libhal_device_remove_property_watch (hal_ctx, BT_HEADSET_UDI, NULL); + libhal_device_remove_property_watch (hal_ctx, BME_UDI, NULL); + libhal_ctx_shutdown (hal_ctx, NULL); + libhal_ctx_free(hal_ctx); + + return 0; +} + +/** Rockbox battery related functions */ +void battery_status_update(void) +{ + battery_percent = maemo_battery_level; + send_battery_level_event(); +} + +/* Returns true if any power input is connected - charging-capable + * or not. */ +bool power_input_present(void) +{ + return false; +} + +unsigned battery_voltage(void) +{ + return 0; +} + +/* Returns battery level in percent */ +int battery_level(void) +{ + battery_status_update(); + return maemo_battery_level; +} + +/* Return remaining battery time in minutes */ +int battery_time(void) +{ + battery_status_update(); + return maemo_remaining_time_sec / 60; +} + +bool battery_level_safe(void) +{ + return battery_level() >= 5; +} + +/** Rockbox stubs */ +void set_poweroff_timeout(int timeout) +{ + (void)timeout; +} + +void reset_poweroff_timer(void) +{ +} + +void shutdown_hw(void) +{ +} + +void cancel_shutdown(void) +{ +} -- cgit v1.2.3