From 33c3ee1908012e83c8349436c5c59e0d66c29998 Mon Sep 17 00:00:00 2001 From: Simon Busch Date: Sun, 14 Oct 2012 19:18:35 +0200 Subject: [PATCH 1/2] charger: split out common module functionality With splitting out common module functionality we're now able to add different implementations for the charger module. For target emulator machines this is still the same dummy implementation as before. Open-webOS-DCO-1.0-Signed-off-by: Simon Busch --- src/rockhopper/charger/CMakeLists.txt | 4 +- .../charger/{emulator => }/chargerlib.c | 38 +++------- src/rockhopper/charger/chargerlib.h | 28 +++++++ src/rockhopper/charger/emulator/charger.c | 74 +++++++++++++++++++ 4 files changed, 116 insertions(+), 28 deletions(-) rename src/rockhopper/charger/{emulator => }/chargerlib.c (82%) create mode 100644 src/rockhopper/charger/chargerlib.h create mode 100644 src/rockhopper/charger/emulator/charger.c diff --git a/src/rockhopper/charger/CMakeLists.txt b/src/rockhopper/charger/CMakeLists.txt index 5b48c93..1c6327f 100644 --- a/src/rockhopper/charger/CMakeLists.txt +++ b/src/rockhopper/charger/CMakeLists.txt @@ -16,5 +16,7 @@ # # LICENSE@@@ -nyx_create_module(ChargerMain emulator/chargerlib.c) +if(${WEBOS_TARGET_MACHINE_IMPL} STREQUAL emulator) + nyx_create_module(ChargerMain chargerlib.c emulator/charger.c) +endif() diff --git a/src/rockhopper/charger/emulator/chargerlib.c b/src/rockhopper/charger/chargerlib.c similarity index 82% rename from src/rockhopper/charger/emulator/chargerlib.c rename to src/rockhopper/charger/chargerlib.c index d17f809..bb5ee91 100644 --- a/src/rockhopper/charger/emulator/chargerlib.c +++ b/src/rockhopper/charger/chargerlib.c @@ -32,18 +32,13 @@ #include #include -static nyx_device_t *nyxDev=NULL; -static void *charger_status_callback_context = NULL, *state_change_callback_context = NULL; -static nyx_device_callback_function_t charger_status_callback, state_change_callback; -static nyx_charger_event_t current_event = NYX_NO_NEW_EVENT; +#include "chargerlib.h" -nyx_charger_status_t gChargerStatus = -{ - .charger_max_current = 0, - .connected = 0, - .powered = 0, - .dock_serial_number = {0}, -}; +nyx_device_t *nyxDev=NULL; +void *charger_status_callback_context = NULL; +void *state_change_callback_context = NULL; +nyx_device_callback_function_t charger_status_callback; +nyx_device_callback_function_t state_change_callback; NYX_DECLARE_MODULE(NYX_DEVICE_CHARGER, "Charger"); @@ -77,10 +72,9 @@ nyx_error_t nyx_module_open (nyx_instance_t i, nyx_device_t** d) nyx_module_register_method(i, (nyx_device_t*)nyxDev, NYX_CHARGER_QUERY_CHARGER_EVENT_MODULE_METHOD, "charger_query_charger_event"); - *d = (nyx_device_t*)nyxDev; - return NYX_ERROR_NONE; + return _charger_init(); } nyx_error_t nyx_module_close (nyx_device_t* d) @@ -98,12 +92,9 @@ nyx_error_t charger_query_charger_status(nyx_device_handle_t handle, nyx_charger return NYX_ERROR_INVALID_VALUE; } - memcpy(status,&gChargerStatus,sizeof(nyx_charger_status_t)); - return NYX_ERROR_NONE; - + return _charger_read_status(status); } - nyx_error_t charger_register_charger_status_callback (nyx_device_handle_t handle, nyx_device_callback_function_t callback_func, void *context) { if (handle != nyxDev) { @@ -129,8 +120,7 @@ nyx_error_t charger_enable_charging(nyx_device_handle_t handle, nyx_charger_stat return NYX_ERROR_INVALID_VALUE; } - memcpy(status,&gChargerStatus,sizeof(nyx_charger_status_t)); - return NYX_ERROR_NONE; + return _charger_enable_charging(status); } nyx_error_t charger_disable_charging(nyx_device_handle_t handle, nyx_charger_status_t *status) @@ -143,8 +133,7 @@ nyx_error_t charger_disable_charging(nyx_device_handle_t handle, nyx_charger_sta return NYX_ERROR_INVALID_VALUE; } - memcpy(status,&gChargerStatus,sizeof(nyx_charger_status_t)); - return NYX_ERROR_NONE; + return _charger_disable_charging(status); } nyx_error_t charger_register_state_change_callback(nyx_device_handle_t handle, nyx_device_callback_function_t callback_func, void *context) @@ -168,10 +157,5 @@ nyx_error_t charger_query_charger_event(nyx_device_handle_t handle, nyx_charger_ return NYX_ERROR_INVALID_HANDLE; } - *event = current_event; - - current_event = NYX_NO_NEW_EVENT; - - return NYX_ERROR_NONE; + return _charger_query_charger_event(event); } - diff --git a/src/rockhopper/charger/chargerlib.h b/src/rockhopper/charger/chargerlib.h new file mode 100644 index 0000000..7c3e28a --- /dev/null +++ b/src/rockhopper/charger/chargerlib.h @@ -0,0 +1,28 @@ +/* @@@LICENSE +* +* Copyright (c) 2010-2012 Hewlett-Packard Development Company, L.P. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +* LICENSE@@@ */ + +#ifndef CHARGER_H_ +#define CHARGER_H_ + +nyx_error_t _charger_init(void); +nyx_error_t _charger_read_status(nyx_charger_status_t *status); +nyx_error_t _charger_enable_charging(nyx_charger_status_t *status); +nyx_error_t _charger_disable_charging(nyx_charger_status_t *status); +nyx_error_t _charger_query_charger_event(nyx_charger_event_t *event); + +#endif diff --git a/src/rockhopper/charger/emulator/charger.c b/src/rockhopper/charger/emulator/charger.c new file mode 100644 index 0000000..00f9e7e --- /dev/null +++ b/src/rockhopper/charger/emulator/charger.c @@ -0,0 +1,74 @@ +/* @@@LICENSE +* +* Copyright (c) 2010-2012 Hewlett-Packard Development Company, L.P. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +* LICENSE@@@ */ + +/** + * @file charger.c + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +nyx_charger_status_t gChargerStatus = +{ + .charger_max_current = 0, + .connected = 0, + .powered = 0, + .dock_serial_number = {0}, +}; + +static nyx_charger_event_t current_event = NYX_NO_NEW_EVENT; + +nyx_error_t _charger_init(void) +{ + return NYX_ERROR_NONE; +} + +nyx_error_t _charger_read_status(nyx_charger_status_t *status) +{ + memcpy(status, &gChargerStatus, sizeof(nyx_charger_status_t)); + return NYX_ERROR_NONE; +} + +nyx_error_t _charger_enable_charging(nyx_charger_status_t *status) +{ + memcpy(status, &gChargerStatus, sizeof(nyx_charger_status_t)); + return NYX_ERROR_NONE; +} + +nyx_error_t _charger_disable_charging(nyx_charger_status_t *status) +{ + memcpy(status, &gChargerStatus, sizeof(nyx_charger_status_t)); + return NYX_ERROR_NONE; +} + +nyx_error_t _charger_query_charger_event(nyx_charger_event_t *event) +{ + *event = current_event; + + current_event = NYX_NO_NEW_EVENT; + + return NYX_ERROR_NONE; +} From 9f26f39b5550c3ebef794b6b1cc035804aba418d Mon Sep 17 00:00:00 2001 From: Simon Busch Date: Sun, 14 Oct 2012 20:14:40 +0200 Subject: [PATCH 2/2] charger: add a device implementation for charger status detection The device implementation is based on the common linux power supply interface and is per default enabled to detect changes for AC and USB chargers. It's using libudev to detect a changed charger status. Open-webOS-DCO-1.0-Signed-off-by: Simon Busch --- src/rockhopper/charger/CMakeLists.txt | 2 + src/rockhopper/charger/device/charger.c | 142 ++++++++++++++++++++++++ 2 files changed, 144 insertions(+) create mode 100644 src/rockhopper/charger/device/charger.c diff --git a/src/rockhopper/charger/CMakeLists.txt b/src/rockhopper/charger/CMakeLists.txt index 1c6327f..0fd44e7 100644 --- a/src/rockhopper/charger/CMakeLists.txt +++ b/src/rockhopper/charger/CMakeLists.txt @@ -18,5 +18,7 @@ if(${WEBOS_TARGET_MACHINE_IMPL} STREQUAL emulator) nyx_create_module(ChargerMain chargerlib.c emulator/charger.c) +elseif(${WEBOS_TARGET_MACHINE_IMPL} STREQUAL device) + nyx_create_module(ChargerMain chargerlib.c device/charger.c) endif() diff --git a/src/rockhopper/charger/device/charger.c b/src/rockhopper/charger/device/charger.c new file mode 100644 index 0000000..80ff512 --- /dev/null +++ b/src/rockhopper/charger/device/charger.c @@ -0,0 +1,142 @@ +/* @@@LICENSE +* +* Copyright (c) 2010-2012 Hewlett-Packard Development Company, L.P. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +* LICENSE@@@ */ + +/** + * @file charger.c + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +GIOChannel *channel; + +struct udev *udev; +struct udev_monitor *mon; + +extern nyx_device_t *nyxDev; +extern void *charger_status_callback_context; +extern nyx_device_callback_function_t charger_status_callback; + +#define CHARGER_USB_SYSFS_PATH "/sys/class/power_supply/usb/" +#define CHARGER_AC_SYSFS_PATH "/sys/class/power_supply/ac/" + +nyx_charger_status_t gChargerStatus = +{ + .charger_max_current = 0, + .connected = 0, + .powered = 0, + .dock_serial_number = {0}, +}; + +static nyx_charger_event_t current_event = NYX_NO_NEW_EVENT; + +gboolean _handle_power_supply_event(GIOChannel *channel, GIOCondition condition, gpointer data) +{ + struct udev_device *dev; + + if ((condition & G_IO_IN) == G_IO_IN) { + dev = udev_monitor_receive_device(mon); + if (dev) { + /* something related to power supply has changed; notify connected clients so + * they can query the new status */ + charger_status_callback(nyxDev, NYX_CALLBACK_STATUS_DONE, charger_status_callback_context); + } + } + + return TRUE; +} + +nyx_error_t _charger_init(void) +{ + int fd; + + udev = udev_new(); + if (!udev) { + nyx_error("Could not initialize udev component; battery status updates will not be available"); + return; + } + + mon = udev_monitor_new_from_netlink(udev, "kernel"); + udev_monitor_filter_add_match_subsystem_devtype(mon, "power_supply", NULL); + udev_monitor_enable_receiving(mon); + fd = udev_monitor_get_fd(mon); + + channel = g_io_channel_unix_new(fd); + g_io_add_watch(channel, G_IO_IN | G_IO_HUP | G_IO_NVAL, _handle_power_supply_event, NULL); + + return NYX_ERROR_NONE; +} + +nyx_error_t _charger_read_status(nyx_charger_status_t *status) +{ + int32_t online; + + /* before we start to update the charger status we reset it completely */ + memset(&gChargerStatus, 0, sizeof(nyx_charger_status_t)); + + if (nyx_utils_read_value(CHARGER_USB_SYSFS_PATH "online")) { + gChargerStatus.connected |= NYX_CHARGER_PC_CONNECTED; + gChargerStatus.powered |= NYX_CHARGER_USB_POWERED; + gChargerStatus.is_charging = 1; + } + + if (nyx_utils_read_value(CHARGER_AC_SYSFS_PATH "online")) { + gChargerStatus.connected |= NYX_CHARGER_WALL_CONNECTED; + gChargerStatus.powered |= NYX_CHARGER_DIRECT_POWERED; + gChargerStatus.is_charging = 1; + } + + memcpy(status, &gChargerStatus, sizeof(nyx_charger_status_t)); + + return NYX_ERROR_NONE; +} + +nyx_error_t _charger_enable_charging(nyx_charger_status_t *status) +{ + memcpy(status, &gChargerStatus, sizeof(nyx_charger_status_t)); + + return NYX_ERROR_NONE; +} + +nyx_error_t _charger_disable_charging(nyx_charger_status_t *status) +{ + memcpy(status, &gChargerStatus, sizeof(nyx_charger_status_t)); + + return NYX_ERROR_NONE; +} + +nyx_error_t _charger_query_charger_event(nyx_charger_event_t *event) +{ + *event = current_event; + + current_event = NYX_NO_NEW_EVENT; + + return NYX_ERROR_NONE; +}