178 lines
4.3 KiB
C
178 lines
4.3 KiB
C
#include "co-proc-lib.h"
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
|
|
//-------------------------------------------------------------------------
|
|
/// To findout SoC family type
|
|
/// @param[out] CPU_TYPE: choose between soc family i.e PXA or tegra
|
|
DWORD GetSoCType()
|
|
{
|
|
DWORD CPUtype = CPU_UNKNOWN;
|
|
if((getPROCID() == TYPE_PXA320)|
|
|
(getPROCID() == TYPE_PXA300)|
|
|
(getPROCID() == TYPE_PXA310)|
|
|
(getPROCID() == TYPE_PXA270)){
|
|
CPUtype = PXA;
|
|
}
|
|
else if((getPROCID() == TYPE_TEGRA2)|
|
|
(getPROCID() == TYPE_TEGRA3)){
|
|
CPUtype = TEG;
|
|
}
|
|
else if (getPROCID() == TYPE_VYBRID){
|
|
CPUtype = VF;
|
|
}
|
|
return CPUtype;
|
|
}
|
|
|
|
DWORD getCPUID(){
|
|
static unsigned int cpu_id = 0; /* this will stay for as long as the programm is executing */
|
|
|
|
if(cpu_id == 0){ /* first time this gets calculated */
|
|
char buf[256];
|
|
char *numStr;
|
|
FILE *file;
|
|
unsigned int res;
|
|
|
|
/* CPU type */
|
|
/*
|
|
012345678901234567890123456789
|
|
CPU implementer : 0x41
|
|
CPU architecture: 7
|
|
CPU variant : 0x1
|
|
CPU part : 0xc09
|
|
CPU revision : 0
|
|
*/
|
|
file = fopen(CPU_INFO, "r");
|
|
if (file){
|
|
while (fgets(buf, 255, file)) {
|
|
if (strstr(buf, "CPU implementer")){
|
|
numStr = strstr(&buf[14], ": ");
|
|
(void)sscanf(&numStr[4], "%x", &res);
|
|
cpu_id = (res & 0xff) << 24;
|
|
}
|
|
else if (strstr(buf, "CPU variant")){
|
|
numStr = strstr(&buf[10], ": ");
|
|
(void)sscanf(&numStr[4], "%x", &res);
|
|
cpu_id |= (((res <<4) & 0xf0) | 0xf) << 16;
|
|
}
|
|
else if (strstr(buf, "CPU part")){
|
|
numStr = strstr(&buf[8], ": ");
|
|
(void)sscanf(&numStr[4], "%x", &res);
|
|
cpu_id |= (res & 0xfff) << 4;
|
|
}
|
|
else if (strstr(buf, "CPU revision")){
|
|
numStr = strstr(&buf[11], ": ");
|
|
(void)sscanf(&numStr[2], "%u", &res);
|
|
cpu_id |= (res & 0xf) ;
|
|
}
|
|
}
|
|
fclose(file);
|
|
}
|
|
else{
|
|
printf("CPU info not available!");
|
|
exit(-1);
|
|
}
|
|
cpu_id >>= 4;
|
|
|
|
file = fopen(SOC_ID, "r");
|
|
if(file){
|
|
while(fgets(buf, 255, file)){
|
|
if(strstr(buf, "i.MX6")){ /* Check for the id */
|
|
cpu_id += MAGIC_NO; /* If ID matches to i.MX6xx we are adding constant to cpuID inorder to make it unique:FIXME */
|
|
}
|
|
}
|
|
fclose(file);
|
|
}
|
|
}
|
|
return cpu_id; /* subsequent calls just return the pre-calculated value */
|
|
}
|
|
|
|
DWORD getPROCID(){
|
|
DWORD procID;
|
|
procID = getCPUID();
|
|
|
|
//procID = procID>>4; //Remove Stepping
|
|
if((((procID >> 4) >> 12) & 0x0f) == 5){ //PXA
|
|
return (procID & 0x03F); // Return only Product ID
|
|
}
|
|
else{
|
|
return procID; //return processor ID
|
|
}
|
|
}
|
|
|
|
void CPLGetLibVersion(DWORD *pVerMaj, DWORD *pVerMin, DWORD *pBuild){
|
|
if(pVerMaj)
|
|
*pVerMaj = CPL_VER_MAJ;
|
|
if(pVerMin)
|
|
*pVerMin = CPL_VER_MIN;
|
|
if(pBuild)
|
|
*pBuild = CPL_VER_BUILD;
|
|
}
|
|
|
|
DWORD getModuleFamily(char *moduleName){
|
|
#if 0
|
|
uname(&uNameData);
|
|
if(strstr(uNameData.nodename, "colibri")){
|
|
return MODULE_FAMILY_COLIBRI;
|
|
}
|
|
else if(strstr(uNameData.nodename, "apalis")){
|
|
return MODULE_FAMILY_APALIS;
|
|
}
|
|
#endif
|
|
|
|
char buf[256], hardware[128] = {0};
|
|
FILE *file = NULL;
|
|
char *start = NULL, *numStr = NULL, *end = NULL;
|
|
size_t len = 0;
|
|
|
|
file = fopen(CPU_INFO, "r"); /* Used for non-dt kernels */
|
|
if (file){
|
|
while (fgets(buf, 255, file)) {
|
|
if(strstr(buf, "Hardware")){
|
|
numStr = strstr(&buf[7], ":");
|
|
sprintf(hardware, "%s", numStr);
|
|
}
|
|
}
|
|
fclose(file);
|
|
start = strstr(hardware, "Toradex");
|
|
if (start != NULL) {
|
|
start += 8;
|
|
end = strstr(start, "Module");
|
|
if(end) len = end - start - 1;
|
|
else len = strcspn(start, "\n");
|
|
} else {
|
|
file = fopen("/sys/firmware/devicetree/base/model", "r"); /* e.g: Toradex Colibri VF61 on Colibri Evaluation Board */
|
|
if (file == NULL) {
|
|
file = fopen("/sys/bus/soc/devices/soc0/machine", "r"); /* e.g: Toradex Apalis iMX6Q on Apalis Evaluation Board */
|
|
}
|
|
|
|
if (file) {
|
|
while(fgets(buf, 255, file)){
|
|
start = strstr(buf, "Toradex");
|
|
if (start == NULL) {
|
|
printf("Invalid Machine!");
|
|
exit(-1);
|
|
}
|
|
start += 8;
|
|
end = strstr(start, "on");
|
|
if (end) len = end - start - 1;
|
|
else len = strlen(start);
|
|
}
|
|
fclose(file);
|
|
}
|
|
}
|
|
} else {
|
|
printf("CPU info not available!");
|
|
exit(-1);
|
|
}
|
|
|
|
strncpy(moduleName, start, len); /* for showing the module name on window title */
|
|
if (strstr(moduleName, "Colibri")) {
|
|
return MODULE_FAMILY_COLIBRI;
|
|
} else if (strstr(moduleName, "Apalis")) {
|
|
return MODULE_FAMILY_APALIS;
|
|
}
|
|
|
|
return -1;
|
|
}
|