WiringPi: Add cmpKernelVersion and update the kernelVerion structure

Signed-off-by: Deokgyu Yang <secugyu@gmail.com>
Change-Id: Ia8431e26578f007fd98d152c4915ce3caba07fb9
This commit is contained in:
Deokgyu Yang
2020-08-24 12:23:50 +09:00
parent 6f11fefcff
commit 912e3d952b
3 changed files with 73 additions and 8 deletions

View File

@@ -202,15 +202,25 @@ static void doI2Cdetect (UNU int argc, char *argv [])
piBoardId(&model, &rev, &mem, &maker, &overVolted);
switch (model) {
case MODEL_ODROID_C1: case MODEL_ODROID_C2:
case MODEL_ODROID_XU3:
case MODEL_ODROID_C1:
case MODEL_ODROID_C2:
port = 1;
break;
case MODEL_ODROID_XU3:
if (cmpKernelVersion(KERN_NUM_TO_REVISION, 5, 4, 0))
port = 0;
else
port = 1;
break;
case MODEL_ODROID_N1:
port = 4;
break;
case MODEL_ODROID_N2:
port = 3;
case MODEL_ODROID_C4:
if (cmpKernelVersion(KERN_NUM_TO_REVISION, 4, 9, 230))
port = 0;
else
port = 2;
break;
default:
break;
@@ -833,7 +843,7 @@ static void doVersion (char *argv [])
piMakerNames [maker]);
// Show current kernel version
printf(" * Current devices' kernel version: %d.%d.%d-%d\n",
printf(" * Current devices' kernel version: %d.%d.%d-%s\n",
kernelVersion->major,
kernelVersion->minor,
kernelVersion->revision,

View File

@@ -140,7 +140,7 @@ struct kernelVersionStruct *kernelVersion = &(struct kernelVersionStruct) {
.major = 0,
.minor = 0,
.revision = 0,
.patch = 0
.patch = ""
};
/*----------------------------------------------------------------------------*/
@@ -272,7 +272,10 @@ void setKernelVersion() {
char* buf;
char* delimiter[] = { ".", "-" };
int i, kernelNumbers[4] = { 0, };
int i;
int kernelNumbers[3] = { 0, };
char patchStringBuf[64];
uname(&uname_buf);
@@ -281,6 +284,8 @@ void setKernelVersion() {
if (i < 1) {
kernelNumbers[i] = atoi(buf);
buf = strtok(NULL, delimiter[0]);
} else if (i == 3) {
memcpy(patchStringBuf, buf, strlen(buf));
} else {
kernelNumbers[i] = atoi(buf);
buf = strtok(NULL, delimiter[1]);
@@ -290,7 +295,52 @@ void setKernelVersion() {
kernelVersion->major = kernelNumbers[0];
kernelVersion->minor = kernelNumbers[1];
kernelVersion->revision = kernelNumbers[2];
kernelVersion->patch = kernelNumbers[3];
memcpy(kernelVersion->patch, patchStringBuf, 64);
}
/*----------------------------------------------------------------------------*/
/*
* cmpKernelVersion:
* It compares kernel version between the current one and the passed in
* numbers. If the current one is bigger than the arguments, it returns
* true, or it returns false.
*/
/*----------------------------------------------------------------------------*/
char cmpKernelVersion(int num, ...) {
va_list valist;
int versionCompareTo[3] = { 0, };
int i;
char ret = FALSE;
va_start(valist, num);
for (i = 0; i < num; i++) {
versionCompareTo[i] = va_arg(valist, int);
}
switch (num) {
case KERN_NUM_TO_MAJOR:
if (kernelVersion->major >= versionCompareTo[0])
ret = TRUE;
break;
case KERN_NUM_TO_MINOR:
if (kernelVersion->major > versionCompareTo[0] ||
kernelVersion->minor >= versionCompareTo[1])
ret = TRUE;
break;
case KERN_NUM_TO_REVISION:
if (kernelVersion->major > versionCompareTo[0] ||
kernelVersion->minor > versionCompareTo[1] ||
kernelVersion->revision >= versionCompareTo[2])
ret = TRUE;
break;
default:
msg(MSG_ERR, "%s: Unknown fixed argument %d. \n", __func__, num);
break;
}
va_end(valist);
return ret;
}
/*----------------------------------------------------------------------------*/

View File

@@ -48,6 +48,10 @@
#define ENV_CODES "WIRINGPI_CODES"
#define ENV_GPIOMEM "WIRINGPI_GPIOMEM"
#define KERN_NUM_TO_MAJOR 1
#define KERN_NUM_TO_MINOR 2
#define KERN_NUM_TO_REVISION 3
#define MODEL_UNKNOWN 0
#define MODEL_ODROID_C1 1
#define MODEL_ODROID_C2 2
@@ -250,7 +254,7 @@ struct kernelVersionStruct
int major;
int minor;
int revision;
int patch;
char patch[64];
};
extern struct kernelVersionStruct *kernelVersion;
@@ -276,6 +280,7 @@ extern void setupCheck (const char *fName);
extern void usingGpiomemCheck (const char *what);
extern void setUsingGpiomem (const unsigned int value);
extern void setKernelVersion (void);
extern char cmpKernelVersion (int num, ...);
// Core WiringPi functions
extern void wiringPiVersion (int *major, char **minor);