blob: 7219cc4ec96eb977cf285f8c6da2ae03f0409046 [file] [log] [blame]
..
#
# Copyright 2020 Casper Meijn <casper@meijn.net>
#
# 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.
#
SGM4056 Charger
===============
The SGM4056 charger is able to report its status via two output pins. If
these pins are connected to GPIO inputs, then the ``sgm4056`` driver can
derive the charger status.
Initialization
--------------
Initialization of the ``sgm4056`` driver is normally done in the BSP. This is
done by creating a OS device using ``os_dev_create``.
.. code-block:: c
#include "sgm4056/sgm4056.h"
...
static struct sgm4056_dev os_bsp_charger;
static struct sgm4056_dev_config os_bsp_charger_config = {
.power_presence_pin = CHARGER_POWER_PRESENCE_PIN,
.charge_indicator_pin = CHARGER_CHARGE_PIN,
};
void
hal_bsp_init(void)
{
int rc;
...
/* Create charge controller */
rc = os_dev_create(&os_bsp_charger.dev, "charger",
OS_DEV_INIT_KERNEL, OS_DEV_INIT_PRIO_DEFAULT,
sgm4056_dev_init, &os_bsp_charger_config);
assert(rc == 0);
}
First we create a instance of ``struct sgm4056_dev``, this will be initialised
later. Then we create a instance of ``struct sgm4056_dev_config``, which contains
the pin numbers of the gpio connected to the charger. Then we call ``os_dev_create``
with a pointer to the device, a device name, some defaults, the ``sgm4056_dev_init``
initializor and a pointer to config.
Usage
-----
There a two ways to use the driver: directly or via :doc:`charge-control <chg_ctrl>`.
When using the driver directly, you need to open the OS device and then use the driver functions.
.. code-block:: c
#include "sgm4056/sgm4056.h"
...
int
main(int argc, char **argv)
{
struct sgm4056_dev *charger;
charger = (struct sgm4056_dev *) os_dev_open("charger", 0, 0);
assert(charger);
while (1) {
rc = sgm4056_get_charger_status(charger, &charger_status);
assert(rc == 0);
console_printf("Charger state = %i\n", charger_status);
console_flush();
}
}
When using ``charge-control`` interface, you need to enable it in syscfg and
then follow the general instructions at :doc:`chg_ctrl`.
.. code-block:: yaml
syscfg.vals:
# Enable charge control integration
SGM4056_USE_CHARGE_CONTROL: 1