Private
Public Access
2
0
Files
mraa/src/arm/arm.c
2023-11-08 14:40:24 -08:00

184 lines
7.4 KiB
C

/*
* Author: Thomas Ingleby <thomas.c.ingleby@intel.com>
* Author: Michael Ring <mail@michael-ring.org>
* Copyright (c) 2014 Intel Corporation.
*
* SPDX-License-Identifier: MIT
*/
#include <stdlib.h>
#include <string.h>
#include "arm/96boards.h"
#include "arm/radxa_cm3.h"
#include "arm/radxa_rock_3b.h"
#include "arm/radxa_rock_3c.h"
#include "arm/radxa_rock_5a.h"
#include "arm/radxa_rock_5b.h"
#include "arm/radxa_cm5_io.h"
#include "arm/rockpi4.h"
#include "arm/de_nano_soc.h"
#include "arm/banana.h"
#include "arm/beaglebone.h"
#include "arm/phyboard.h"
#include "arm/raspberry_pi.h"
#include "arm/adlink_ipi.h"
#include "arm/siemens/iot2050.h"
#include "arm/orange_pi_prime.h"
#include "mraa_internal.h"
mraa_platform_t
mraa_arm_platform()
{
mraa_platform_t platform_type = MRAA_UNKNOWN_PLATFORM;
size_t len = 100;
char* line = malloc(len);
FILE* fh = fopen("/proc/cpuinfo", "r");
if (fh != NULL) {
while (getline(&line, &len, fh) != -1) {
if (strncmp(line, "Hardware", 8) == 0) {
if (strstr(line, "BCM2708")) {
platform_type = MRAA_RASPBERRY_PI;
} else if (strstr(line, "BCM2709")) {
platform_type = MRAA_RASPBERRY_PI;
} else if (strstr(line, "BCM2835")) {
platform_type = MRAA_RASPBERRY_PI;
} else if (strstr(line, "Generic AM33XX")) {
if(mraa_file_contains("/proc/device-tree/model", "phyBOARD-WEGA")) {
platform_type = MRAA_PHYBOARD_WEGA;
} else {
platform_type = MRAA_BEAGLEBONE;
}
} else if (strstr(line, "HiKey Development Board")) {
platform_type = MRAA_96BOARDS;
} else if (strstr(line, "s900")) {
platform_type = MRAA_96BOARDS;
} else if (strstr(line, "sun7i")) {
if (mraa_file_contains("/proc/device-tree/model", "Banana Pro")) {
platform_type = MRAA_BANANA;
} else if (mraa_file_contains("/proc/device-tree/model",
"Banana Pi")) {
platform_type = MRAA_BANANA;
}
// For old kernels
else if (mraa_file_exist("/sys/class/leds/green:ph24:led1")) {
platform_type = MRAA_BANANA;
}
} else if (strstr(line, "DE0/DE10-Nano-SoC")) {
platform_type = MRAA_DE_NANO_SOC;
// For different kernel version(s) of DE10-Nano
} else if (strstr(line, "Altera SOCFPGA")) {
platform_type = MRAA_DE_NANO_SOC;
}
}
}
fclose(fh);
}
free(line);
/* Get compatible string from Device tree for boards that dont have enough info in /proc/cpuinfo
*/
if (platform_type == MRAA_UNKNOWN_PLATFORM) {
if (mraa_file_contains("/proc/device-tree/model", "s900"))
platform_type = MRAA_96BOARDS;
else if (mraa_file_contains("/proc/device-tree/compatible", "qcom,apq8016-sbc"))
platform_type = MRAA_96BOARDS;
else if (mraa_file_contains("/proc/device-tree/compatible", "arrow,apq8096-db820c"))
platform_type = MRAA_96BOARDS;
else if (mraa_file_contains("/proc/device-tree/model",
"HiKey Development Board"))
platform_type = MRAA_96BOARDS;
else if (mraa_file_contains("/proc/device-tree/model", "HiKey960"))
platform_type = MRAA_96BOARDS;
else if (mraa_file_contains("/proc/device-tree/model", "ROCK960"))
platform_type = MRAA_96BOARDS;
else if (mraa_file_contains("/proc/device-tree/model", "ZynqMP ZCU100 RevC"))
platform_type = MRAA_96BOARDS;
else if (mraa_file_contains("/proc/device-tree/model", "Avnet Ultra96 Rev1"))
platform_type = MRAA_96BOARDS;
else if (mraa_file_contains("/proc/device-tree/model", PLATFORM_NAME_RADXA_CM3_IO) ||
mraa_file_contains("/proc/device-tree/model", PLATFORM_NAME_RADXA_CM3_IO_2) ||
mraa_file_contains("/proc/device-tree/model", PLATFORM_NAME_RADXA_CM3_RPI_CM4_IO))
platform_type = MRAA_RADXA_CM3;
else if (mraa_file_contains("/proc/device-tree/model", PLATFORM_NAME_RADXA_ROCK_3B))
platform_type = MRAA_RADXA_ROCK_3B;
else if (mraa_file_contains("/proc/device-tree/model", PLATFORM_NAME_RADXA_ROCK_3C))
platform_type = MRAA_RADXA_ROCK_3C;
else if (mraa_file_contains("/proc/device-tree/model", PLATFORM_NAME_RADXA_ROCK_5A))
platform_type = MRAA_RADXA_ROCK_5A;
else if (mraa_file_contains("/proc/device-tree/model", PLATFORM_NAME_RADXA_ROCK_5B))
platform_type = MRAA_RADXA_ROCK_5B;
else if (mraa_file_contains("/proc/device-tree/model", PLATFORM_NAME_RADXA_CM5_IO))
platform_type = MRAA_RADXA_CM5_IO;
else if (mraa_file_contains("/proc/device-tree/model", "ROCK Pi 4") ||
mraa_file_contains("/proc/device-tree/model", "ROCK PI 4") ||
mraa_file_contains("/proc/device-tree/model", "ROCK 4")
)
platform_type = MRAA_ROCKPI4;
else if (mraa_file_contains("/proc/device-tree/compatible", "raspberrypi,"))
platform_type = MRAA_RASPBERRY_PI;
else if (mraa_file_contains("/proc/device-tree/model", "ADLINK ARM, LEC-PX30"))
platform_type = MRAA_ADLINK_IPI;
else if (mraa_file_contains("/proc/device-tree/model", "SIMATIC IOT2050"))
platform_type = MRAA_SIEMENS_IOT2050;
else if (mraa_file_contains("/proc/device-tree/model", "Xunlong Orange Pi Prime"))
platform_type = MRAA_ORANGE_PI_PRIME;
}
switch (platform_type) {
case MRAA_RASPBERRY_PI:
plat = mraa_raspberry_pi();
break;
case MRAA_BEAGLEBONE:
plat = mraa_beaglebone();
break;
case MRAA_PHYBOARD_WEGA:
plat = mraa_phyboard();
break;
case MRAA_BANANA:
plat = mraa_banana();
break;
case MRAA_96BOARDS:
plat = mraa_96boards();
break;
case MRAA_RADXA_CM3:
plat = mraa_radxa_cm3();
break;
case MRAA_RADXA_ROCK_3B:
plat = mraa_radxa_rock_3b();
break;
case MRAA_RADXA_ROCK_3C:
plat = mraa_radxa_rock_3c();
break;
case MRAA_RADXA_ROCK_5A:
plat = mraa_radxa_rock_5a();
break;
case MRAA_RADXA_ROCK_5B:
plat = mraa_radxa_rock_5b();
break;
case MRAA_RADXA_CM5_IO:
plat = mraa_radxa_cm5_io();
break;
case MRAA_ROCKPI4:
plat = mraa_rockpi4();
break;
case MRAA_DE_NANO_SOC:
plat = mraa_de_nano_soc();
break;
case MRAA_ADLINK_IPI:
plat = mraa_adlink_ipi();
case MRAA_SIEMENS_IOT2050:
plat = mraa_siemens_iot2050();
break;
case MRAA_ORANGE_PI_PRIME:
plat = mraa_orange_pi_prime();
break;
default:
plat = NULL;
syslog(LOG_ERR, "Unknown Platform, currently not supported by MRAA");
}
return platform_type;
}