From 912e3d952b783563cf7041998bffd082c37bdc08 Mon Sep 17 00:00:00 2001 From: Deokgyu Yang Date: Mon, 24 Aug 2020 12:23:50 +0900 Subject: [PATCH] WiringPi: Add cmpKernelVersion and update the kernelVerion structure Signed-off-by: Deokgyu Yang Change-Id: Ia8431e26578f007fd98d152c4915ce3caba07fb9 --- gpio/gpio.c | 18 +++++++++++---- wiringPi/wiringPi.c | 56 ++++++++++++++++++++++++++++++++++++++++++--- wiringPi/wiringPi.h | 7 +++++- 3 files changed, 73 insertions(+), 8 deletions(-) diff --git a/gpio/gpio.c b/gpio/gpio.c index 3e042d1..55107b8 100644 --- a/gpio/gpio.c +++ b/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, diff --git a/wiringPi/wiringPi.c b/wiringPi/wiringPi.c index 1701c9d..977b2b8 100644 --- a/wiringPi/wiringPi.c +++ b/wiringPi/wiringPi.c @@ -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; } /*----------------------------------------------------------------------------*/ diff --git a/wiringPi/wiringPi.h b/wiringPi/wiringPi.h index 05adf8f..cc0dd0f 100644 --- a/wiringPi/wiringPi.h +++ b/wiringPi/wiringPi.h @@ -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);