WiringPi: Add cmpKernelVersion and update the kernelVerion structure
Signed-off-by: Deokgyu Yang <secugyu@gmail.com> Change-Id: Ia8431e26578f007fd98d152c4915ce3caba07fb9
This commit is contained in:
18
gpio/gpio.c
18
gpio/gpio.c
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user