WiringPi: Implement storing current operating board's kernel version
Signed-off-by: Deokgyu Yang <secugyu@gmail.com>
Change-Id: I663d1df07e88ebae4e975afc2ebae6122d5918e9
diff --git a/wiringPi/wiringPi.c b/wiringPi/wiringPi.c
index 609ccd9..1701c9d 100644
--- a/wiringPi/wiringPi.c
+++ b/wiringPi/wiringPi.c
@@ -26,6 +26,7 @@
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/ioctl.h>
+#include <sys/utsname.h>
#include <asm/ioctl.h>
/*----------------------------------------------------------------------------*/
@@ -134,6 +135,14 @@
// ODROID Wiring Library
struct libodroid libwiring;
+// Current kernel version
+struct kernelVersionStruct *kernelVersion = &(struct kernelVersionStruct) {
+ .major = 0,
+ .minor = 0,
+ .revision = 0,
+ .patch = 0
+};
+
/*----------------------------------------------------------------------------*/
//
// Return true/false if the supplied module is loaded
@@ -253,6 +262,38 @@
}
/*----------------------------------------------------------------------------*/
+/*
+ * setKernelVersion:
+ * It sets current operating kernel version to the global struct variable.
+ */
+/*----------------------------------------------------------------------------*/
+void setKernelVersion() {
+ struct utsname uname_buf;
+
+ char* buf;
+ char* delimiter[] = { ".", "-" };
+ int i, kernelNumbers[4] = { 0, };
+
+ uname(&uname_buf);
+
+ buf = strtok(uname_buf.release, delimiter[0]);
+ for (i = 0; i < 4; i++) {
+ if (i < 1) {
+ kernelNumbers[i] = atoi(buf);
+ buf = strtok(NULL, delimiter[0]);
+ } else {
+ kernelNumbers[i] = atoi(buf);
+ buf = strtok(NULL, delimiter[1]);
+ }
+ }
+
+ kernelVersion->major = kernelNumbers[0];
+ kernelVersion->minor = kernelNumbers[1];
+ kernelVersion->revision = kernelNumbers[2];
+ kernelVersion->patch = kernelNumbers[3];
+}
+
+/*----------------------------------------------------------------------------*/
int getModelFromCpuinfo(char *line, FILE *cpuFd) {
char *model;
@@ -396,6 +437,7 @@
if (wiringPiDebug)
printf("BoardRev: Returning revision: %d\n", libwiring.rev);
+ setKernelVersion();
return libwiring.rev;
}
diff --git a/wiringPi/wiringPi.h b/wiringPi/wiringPi.h
index f24b3e8..05adf8f 100644
--- a/wiringPi/wiringPi.h
+++ b/wiringPi/wiringPi.h
@@ -242,6 +242,20 @@
extern struct wiringPiNodeStruct *wiringPiNodes;
/*----------------------------------------------------------------------------*/
+// kernelVersionStruct:
+// Contains the kernel version of the operating board's.
+/*----------------------------------------------------------------------------*/
+struct kernelVersionStruct
+{
+ int major;
+ int minor;
+ int revision;
+ int patch;
+};
+
+extern struct kernelVersionStruct *kernelVersion;
+
+/*----------------------------------------------------------------------------*/
// Function prototypes
// c++ wrappers thanks to a comment by Nick Lott
// (and others on the Raspberry Pi forums)
@@ -261,6 +275,7 @@
extern void setupCheck (const char *fName);
extern void usingGpiomemCheck (const char *what);
extern void setUsingGpiomem (const unsigned int value);
+extern void setKernelVersion (void);
// Core WiringPi functions
extern void wiringPiVersion (int *major, char **minor);