2 * Copyright (C) 2011-2013 Team XBMC
5 * This Program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2, or (at your option)
10 * This Program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with XBMC; see the file COPYING. If not, see
17 * <http://www.gnu.org/licenses/>.
28 #include "utils/CPUInfo.h"
29 #include "utils/log.h"
30 #include "utils/StringUtils.h"
32 int aml_set_sysfs_str(const char *path, const char *val)
34 int fd = open(path, O_CREAT | O_RDWR | O_TRUNC, 0644);
37 write(fd, val, strlen(val));
44 int aml_get_sysfs_str(const char *path, char *valstr, const int size)
46 int fd = open(path, O_RDONLY);
49 read(fd, valstr, size - 1);
50 valstr[strlen(valstr)] = '\0';
55 sprintf(valstr, "%s", "fail");
59 int aml_set_sysfs_int(const char *path, const int val)
61 int fd = open(path, O_CREAT | O_RDWR | O_TRUNC, 0644);
65 sprintf(bcmd, "%d", val);
66 write(fd, bcmd, strlen(bcmd));
73 int aml_get_sysfs_int(const char *path)
76 int fd = open(path, O_RDONLY);
80 read(fd, bcmd, sizeof(bcmd));
81 val = strtol(bcmd, NULL, 16);
89 static int has_aml = -1;
92 int rtn = aml_get_sysfs_int("/sys/class/audiodsp/digital_raw");
98 CLog::Log(LOGNOTICE, "aml_present, rtn(%d)", rtn);
103 int aml_get_cputype()
105 static int aml_cputype = -1;
106 if (aml_cputype == -1)
108 std::string cpu_hardware = g_cpuInfo.getCPUHardware();
110 // default to AMLogic M1
112 if (cpu_hardware.find("MESON-M3") != std::string::npos)
114 else if (cpu_hardware.find("MESON3") != std::string::npos)
116 else if (cpu_hardware.find("Meson6") != std::string::npos)
123 void aml_cpufreq_limit(bool limit)
125 int cpufreq = 300000;
129 aml_set_sysfs_int("/sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq", cpufreq);
132 void aml_set_audio_passthrough(bool passthrough)
136 int raw = aml_get_cputype() < 3 ? 1:2;
137 aml_set_sysfs_int("/sys/class/audiodsp/digital_raw", passthrough ? raw:0);
141 void aml_probe_hdmi_audio()
143 std::vector<CStdString> audio_formats;
144 // Audio {format, channel, freq, cce}
152 int fd = open("/sys/class/amhdmitx/amhdmitx0/edid", O_RDONLY);
155 char valstr[1024] = {0};
157 read(fd, valstr, sizeof(valstr) - 1);
158 valstr[strlen(valstr)] = '\0';
161 std::vector<CStdString> probe_str;
162 StringUtils::SplitString(valstr, "\n", probe_str);
164 for (size_t i = 0; i < probe_str.size(); i++)
166 if (probe_str[i].find("Audio") == std::string::npos)
168 for (size_t j = i+1; j < probe_str.size(); j++)
170 if (probe_str[i].find("{1,") != std::string::npos)
171 printf(" PCM found {1,\n");
172 else if (probe_str[i].find("{2,") != std::string::npos)
173 printf(" AC3 found {2,\n");
174 else if (probe_str[i].find("{3,") != std::string::npos)
175 printf(" MPEG1 found {3,\n");
176 else if (probe_str[i].find("{4,") != std::string::npos)
177 printf(" MP3 found {4,\n");
178 else if (probe_str[i].find("{5,") != std::string::npos)
179 printf(" MPEG2 found {5,\n");
180 else if (probe_str[i].find("{6,") != std::string::npos)
181 printf(" AAC found {6,\n");
182 else if (probe_str[i].find("{7,") != std::string::npos)
183 printf(" DTS found {7,\n");
184 else if (probe_str[i].find("{8,") != std::string::npos)
185 printf(" ATRAC found {8,\n");
186 else if (probe_str[i].find("{9,") != std::string::npos)
187 printf(" One_Bit_Audio found {9,\n");
188 else if (probe_str[i].find("{10,") != std::string::npos)
189 printf(" Dolby found {10,\n");
190 else if (probe_str[i].find("{11,") != std::string::npos)
191 printf(" DTS_HD found {11,\n");
192 else if (probe_str[i].find("{12,") != std::string::npos)
193 printf(" MAT found {12,\n");
194 else if (probe_str[i].find("{13,") != std::string::npos)
195 printf(" ATRAC found {13,\n");
196 else if (probe_str[i].find("{14,") != std::string::npos)
197 printf(" WMA found {14,\n");