Witam.
Telefon Samsung GT-I8160 wyposażony jest w chipset ST-Ericsson NovaThor U8500.
Procesor według specyfikacji może pracować z częstotliwością 1GHz i tak też jest w innych telefonach jak np. GT-I8190 czy GT-I9070.
Model, który mnie interesuje (GT-I8160) został ograniczony przez Samsunga do 800MHz.
Zwracam się do was o pomoc z rozwiązaniem kwestii czy jest to ograniczenie sprzętowe czy jedynie programowe.
Co udało mi się ustalić:
W źródłach Samsunga dla wszystkich trzech modeli, które wymieniłem znajduje się taka sama tablica częstotliwości
/* /arch/arm/mach-ux500/devices-db8500.c */
static struct cpufreq_frequency_table db8500_freq_table[] = {
[0] = {
.index = 0,
.frequency = 200000,
},
[1] = {
.index = 1,
.frequency = 400000,
},
[2] = {
.index = 2,
.frequency = 800000,
},
#if defined(CONFIG_MACH_GAVINI)
[3] = {
/* Used for MAX_OPP, if available */
.index = 3,
.frequency = 1000000,
},
#else
[3] = {
.index = 3,
.frequency = CPUFREQ_TABLE_END,
},
#endif
[4] = {
.index = 4,
.frequency = CPUFREQ_TABLE_END,
},
};
struct platform_device db8500_prcmu_device = {
.name = "db8500-prcmu",
.dev = {
.platform_data = db8500_freq_table,
},
};
z maksymalną częstotliwością 800MHz (CONFIG_MACH_GAVINI nie jest ustawione).
Ta tablica przekazywana jest do sterownika PRCMU (Power Reset Clock Management Unit), gdzie w funkcji inicjującej jest modyfikowana:
/* /drivers/mfd/db8500-prcmu.c */
static void db8500_prcmu_update_freq(void *pdata)
{
freq_table =
(struct cpufreq_frequency_table *)pdata;
if (!db8500_prcmu_has_arm_maxopp())
return;
switch (fw_info.version.project) {
case PRCMU_FW_PROJECT_U8500:
case PRCMU_FW_PROJECT_U9500:
case PRCMU_FW_PROJECT_U8420:
case PRCMU_FW_PROJECT_U8420_SYSCLK:
case PRCMU_FW_PROJECT_A9420:
case PRCMU_FW_PROJECT_U8500_MBL:
freq_table[3].frequency = 1000000;
break;
case PRCMU_FW_PROJECT_U8500_C2:
case PRCMU_FW_PROJECT_U8520:
freq_table[3].frequency = 1150000;
break;
default:
break;
}
}
Niestety, dla mojego telefonu funkcja db8500_prcmu_has_arm_maxopp(), która wygląda tak:
/* Index of different voltages to be used when accessing AVSData */
#define PRCM_AVS_BASE 0x2FC
#define PRCM_AVS_VARM_MAX_OPP (PRCM_AVS_BASE + 0x4)
static bool db8500_prcmu_has_arm_maxopp(void)
{
return (readb(tcdm_base + PRCM_AVS_VARM_MAX_OPP) &
PRCM_AVS_ISMODEENABLE_MASK) == PRCM_AVS_ISMODEENABLE_MASK;
}
zwraca false (sprawdziłem drogą debuggowania).
Obawiam się, że to oznacza ograniczenie sprzętowe. Czy mam racje?
Źródła lekko zmodyfikowanego kernela GT-I9070: https://github.com/AdiPat/android_kernel_samsung_janice/ (jedyne co udało mi się znaleźć online, źródła oryginalne ściągają się z serwerów Samsunga bardzo wolno).