summaryrefslogtreecommitdiff
path: root/firmware/target/hosted/samsungypr/ypr1/powermgmt-ypr1.c
diff options
context:
space:
mode:
authorLorenzo Miori <memoryS60@gmail.com>2013-09-10 22:48:34 +0200
committerThomas Martitz <kugel@rockbox.org>2014-02-05 09:56:21 +0100
commite876f4df6d240bd2e319b1e63be95a625f049a97 (patch)
treece2fe1b24650e3be7a6cd2d346d29090a5422a8c /firmware/target/hosted/samsungypr/ypr1/powermgmt-ypr1.c
parentb828b9d99bff2acc0e1f543f3176fd4b632cba68 (diff)
downloadrockbox-e876f4df6d240bd2e319b1e63be95a625f049a97.tar.gz
rockbox-e876f4df6d240bd2e319b1e63be95a625f049a97.zip
Samsung YP-R1 target port
This is the basic port to the new target Samsung YP-R1, which runs on a similar platform as YP-R0. Port is usable, although there are still some optimizations that have to be done. Change-Id: If83a8e386369e413581753780c159026d9e41f04
Diffstat (limited to 'firmware/target/hosted/samsungypr/ypr1/powermgmt-ypr1.c')
-rw-r--r--firmware/target/hosted/samsungypr/ypr1/powermgmt-ypr1.c153
1 files changed, 153 insertions, 0 deletions
diff --git a/firmware/target/hosted/samsungypr/ypr1/powermgmt-ypr1.c b/firmware/target/hosted/samsungypr/ypr1/powermgmt-ypr1.c
new file mode 100644
index 0000000000..9a8f9747ae
--- /dev/null
+++ b/firmware/target/hosted/samsungypr/ypr1/powermgmt-ypr1.c
@@ -0,0 +1,153 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 *
9 * Copyright (C) 2013 Lorenzo Miori
10 *
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation; either version 2
14 * of the License, or (at your option) any later version.
15 *
16 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
17 * KIND, either express or implied.
18 *
19 ****************************************************************************/
20
21#include "config.h"
22#include <sys/ioctl.h>
23#include "kernel.h"
24#include "powermgmt.h"
25#include "power.h"
26#include "file.h"
27#include "adc.h"
28#include "radio-ypr.h"
29#include "pmu-ypr1.h"
30#include "ioctl-ypr1.h"
31#include "stdio.h"
32#include "unistd.h"
33#include "fcntl.h"
34#include "system.h"
35
36#define MAX17040_VCELL 0x02
37#define MAX17040_SOC 0x04
38#define MAX17040_MODE 0x06
39#define MAX17040_VERSION 0x08
40#define MAX17040_RCOMP 0x0C
41#define MAX17040_COMMAND 0xFE
42
43static int max17040_dev = -1;
44
45void max17040_init(void)
46{
47 max17040_dev = open("/dev/r1Batt", O_RDONLY);
48 if (max17040_dev < 0)
49 printf("/dev/r1Batt open error!");
50}
51
52void max17040_close(void)
53{
54 if (max17040_dev >= 0)
55 close(max17040_dev);
56}
57
58#if (CONFIG_BATTERY_MEASURE & VOLTAGE_MEASURE) == VOLTAGE_MEASURE
59const unsigned short battery_level_dangerous[BATTERY_TYPES_COUNT] =
60{
61 3470
62};
63
64/* the OF shuts down at this voltage */
65const unsigned short battery_level_shutoff[BATTERY_TYPES_COUNT] =
66{
67 3450
68};
69
70/* voltages (millivolt) of 0%, 10%, ... 100% when charging disabled */
71const unsigned short percent_to_volt_discharge[BATTERY_TYPES_COUNT][11] =
72{
73 { 3450, 3502, 3550, 3587, 3623, 3669, 3742, 3836, 3926, 4026, 4200 }
74};
75#endif
76
77#if CONFIG_CHARGING
78/* voltages (millivolt) of 0%, 10%, ... 100% when charging enabled */
79const unsigned short const percent_to_volt_charge[11] =
80{
81 3450, 3670, 3721, 3751, 3782, 3821, 3876, 3941, 4034, 4125, 4200
82};
83
84unsigned int power_input_status(void)
85{
86 unsigned status = POWER_INPUT_NONE;
87 if (pmu_ioctl(MAX8819_IOCTL_IS_EXT_PWR, NULL) > 0)
88 status = POWER_INPUT_MAIN_CHARGER;
89 return status;
90}
91
92#endif /* CONFIG_CHARGING */
93
94/* Returns battery voltage from MAX17040 VCELL ADC [millivolts steps],
95 * adc returns voltage in 1.25mV steps */
96/*
97 * TODO this would be interesting to be mixed with battery percentage, for information
98 * and completition purpouses
99 */
100#if (CONFIG_BATTERY_MEASURE & VOLTAGE_MEASURE) == VOLTAGE_MEASURE
101int _battery_voltage(void)
102{
103 int level = 4000;
104 max17040_request ret = { .addr = 2, .reg1 = 0, .reg2 = 0 };
105 if (ioctl(max17040_dev, MAX17040_READ_REG, &ret) >= 0)
106 {
107 int step = (ret.reg1 << 4) | (ret.reg2 >> 4);
108 level = step + (step >> 2);
109 }
110 return level;
111}
112#elif (CONFIG_BATTERY_MEASURE & PERCENTAGE_MEASURE) == PERCENTAGE_MEASURE
113int _battery_level(void)
114{
115 int level = 100;
116 max17040_request ret = { .addr = 4, .reg1 = 0, .reg2 = 0 };
117 if (ioctl(max17040_dev, MAX17040_READ_REG, &ret) >= 0)
118 level = MIN(ret.reg1, 100);
119 return level;
120}
121#endif
122
123bool charging_state(void)
124{
125 int ret = pmu_ioctl(MAX8819_IOCTL_GET_CHG_STATUS, NULL);
126 if (ret == PMU_FULLY_CHARGED)
127 return true;
128 return false;
129}
130
131#if CONFIG_TUNER
132static bool tuner_on = false;
133
134bool tuner_power(bool status)
135{
136 if (status != tuner_on)
137 {
138 tuner_on = status;
139 status = !status;
140 if (tuner_on)
141 radiodev_open();
142 else
143 radiodev_close();
144 }
145
146 return status;
147}
148
149bool tuner_powered(void)
150{
151 return tuner_on;
152}
153#endif /* #if CONFIG_TUNER */